UNPKG

@dicdikshaorg/video-player-mobile-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

492 lines 49.7 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 '@dicdikshaorg/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); } })); })); } /** * @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; 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); }; /** * @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); // capturing this event from app code itself // 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'\">\n <sb-player-side-menu-icon class=\"sb-player-side-menu-icon notVisible\" tabindex=\"0\" (sidebarMenuEvent)=\"sideBarEvents($event)\"\n\n *ngIf=\"viewState ==='player'\" [ngClass]=\"{'isVisible': showControls}\"></sb-player-side-menu-icon>\n <video-player *ngIf=\"viewState === 'player'\" (questionSetData)=\"questionSetData($event)\" (playerInstance)=\"playerInstance($event)\" [config]=\"playerConfig.config\" [action]=\"playerAction\" [playVideoFromTimestamp]=\"playVideoFromTimestamp\">\n </video-player>\n <sb-player-sidebar *ngIf=\"viewState ==='player'\"\n [title]=\"viewerService.contentName\"\n (sidebarEvent)=\"sideBarEvents($event)\" [config]=\"sideMenuConfig\"></sb-player-sidebar>\n <sb-player-end-page \n [contentName]=\"viewerService.contentName\" \n [outcomeLabel]=\"viewerService.showScore ? 'Score: ': ''\" \n [outcome]=\"viewerService.showScore ? viewerService.scoreObtained + ((viewerService.maxScore && viewerService.maxScore > 0) ? '/' + viewerService.maxScore : '') : ''\"\n [nextContent]=\"nextContent\" [userName]=\"viewerService.userName\" \n [showExit]=\"sideMenuConfig.showExit\"\n [timeSpentLabel]=\"viewerService.timeSpent\" tabindex=\"0\" (playNextContent)=\"playContent($event)\" \n (exitContent)=\"exitContent($event)\" (replayContent)=\"replayContent($event)\"\n *ngIf=\"viewState === 'end'\"></sb-player-end-page>\n <sb-player-contenterror *ngIf=\"showContentError\"></sb-player-contenterror>\n</div>\n\n<div class=\"sunbird-video-player-container\" *ngIf=\"showQumlPlayer\" #qumlPlayer>\n <quml-main-player [playerConfig]=\"QumlPlayerConfig\" (playerEvent)=\"qumlPlayerEvents($event)\"></quml-main-player>\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 }], action: [{ type: Input }], playerEvent: [{ type: Output }], telemetryEvent: [{ type: Output }], videoPlayerRef: [{ type: ViewChild, args: ['videoPlayer', { static: true },] }], playVideoFromTimestamp: [{ type: Input }], 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.action; /** @type {?} */ SunbirdVideoPlayerComponent.prototype.playerEvent; /** @type {?} */ SunbirdVideoPlayerComponent.prototype.telemetryEvent; /** @type {?} */ SunbirdVideoPlayerComponent.prototype.videoPlayerRef; /** @type {?} */ SunbirdVideoPlayerComponent.prototype.playVideoFromTimestamp; /** @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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3VuYmlyZC12aWRlby1wbGF5ZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGRpY2Rpa3NoYW9yZy92aWRlby1wbGF5ZXItbW9iaWxlLXY5LyIsInNvdXJjZXMiOlsibGliL3N1bmJpcmQtdmlkZW8tcGxheWVyLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFDQSxPQUFPLEVBQ0wsaUJBQWlCLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQVUsTUFBTSxFQUNqRSxZQUFZLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBaUIsU0FBUyxFQUM5RCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsWUFBWSxFQUFHLFNBQVMsRUFBRyxZQUFZLEVBQWlCLE1BQU0sNkJBQTZCLENBQUM7QUFJckcsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQzFELE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQzNFO0lBbUNFLHFDQUNTLGtCQUE2QyxFQUM3QyxhQUE0QixFQUM1QixHQUFzQixFQUNyQixTQUFvQixFQUNyQixZQUEwQjtRQUxuQyxpQkErQ0M7UUE5Q1EsdUJBQWtCLEdBQWxCLGtCQUFrQixDQUEyQjtRQUM3QyxrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQUM1QixRQUFHLEdBQUgsR0FBRyxDQUFtQjtRQUNyQixjQUFTLEdBQVQsU0FBUyxDQUFXO1FBQ3JCLGlCQUFZLEdBQVosWUFBWSxDQUFjO1FBOUJ6QixtQkFBYyxHQUFzQixJQUFJLFlBQVksRUFBTyxDQUFDO1FBR3RFLGNBQVMsR0FBRyxRQUFRLENBQUM7UUFJckIsaUJBQVksR0FBRyxJQUFJLENBQUM7UUFDcEIsbUJBQWMsR0FBRztZQUNmLFNBQVMsRUFBRSxJQUFJO1lBQ2YsWUFBWSxFQUFFLElBQUk7WUFDbEIsVUFBVSxFQUFFLElBQUk7WUFDaEIsUUFBUSxFQUFFLElBQUk7U0FDZixDQUFDO1FB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Q04sTUFBTTtpQ0FDTixTQUFTLFNBQUMsYUFBYSxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTt5Q0FDekMsS0FBSzttQ0F3RUwsWUFBWSxTQUFDLHlCQUF5QixFQUFFLENBQUMsUUFBUSxDQUFDOzhCQThLbEQsWUFBWSxTQUFDLHFCQUFxQjs7SUFRckMsa0NBQUM7Q0FBQSxBQTFRRCxJQTBRQztTQXJRWSwyQkFBMkI7OztJQUV0QyxtREFBb0M7O0lBQ3BDLDZDQUEwQjs7SUFDMUIsa0RBQTRDOztJQUM1QyxxREFBc0U7O0lBQ3RFLHFEQUF1RTs7SUFDdkUsNkRBQTRDOztJQUM1QyxnREFBcUI7O0lBQ3JCLDhDQUF1Qjs7SUFDdkIsa0RBQXdCOztJQUN4Qix1REFBMEI7O0lBQzFCLG1EQUFvQjs7SUFDcEIscURBS0U7Ozs7O0lBQ0YseURBQXVDOzs7OztJQUN2Qyx3REFBc0M7O0lBQ3RDLCtDQUFpQjs7SUFDakIscURBQXVCOztJQUN2Qix1REFBMkI7O0lBQzNCLG9EQUFtQjs7SUFDbkIsOERBQXdCOztJQUN4Qiw4REFBd0I7O0lBQ3hCLG1EQUFxQjs7SUFDckIsbURBQXNCOztJQTRGdEIsc0VBS0M7O0lBOUZDLHlEQUFvRDs7SUFDcEQsb0RBQW1DOztJQUNuQywwQ0FBNkI7Ozs7O0lBQzdCLGdEQUE0Qjs7SUFDNUIsbURBQWlDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVGhyb3dTdG10IH0gZnJvbSAnQGFuZ3VsYXIvY29tcGlsZXInO1xuaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25Jbml0LCBPdXRwdXQsIE9uQ2hhbmdlcywgU2ltcGxlQ2hhbmdlcyxcbiAgSG9zdExpc3RlbmVyLCBFbGVtZW50UmVmLCBWaWV3Q2hpbGQsIEFmdGVyVmlld0luaXQsIFJlbmRlcmVyMiwgT25EZXN0cm95XG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRXJyb3JTZXJ2aWNlICwgZXJyb3JDb2RlICwgZXJyb3JNZXNzYWdlLCBJU2lkZUJhckV2ZW50IH0gZnJvbSAnQGRpY2Rpa3NoYW9yZy9wbGF5ZXItc2RrLXY5JztcblxuaW1wb3J0IHsgUGxheWVyQ29uZmlnIH0gZnJvbSAnLi9wbGF5ZXJJbnRlcmZhY2VzJztcbmltcG9ydCB7IElBY3Rpb24gfSBmcm9tICcuL3BsYXllckludGVyZmFjZXMnO1xuaW1wb3J0IHsgVmlld2VyU2VydmljZSB9IGZyb20gJy4vc2VydmljZXMvdmlld2VyLnNlcnZpY2UnO1xuaW1wb3J0IHsgU3VuYmlyZFZpZGVvUGxheWVyU2VydmljZSB9IGZyb20gJy4vc3VuYmlyZC12aWRlby1wbGF5ZXIuc2VydmljZSc7XG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdzdW5iaXJkLXZpZGVvLXBsYXllcicsXG4gIHRlbXBsYXRlVXJsOiAnLi9zdW5iaXJkLXZpZGVvLXBsYXllci5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3N1bmJpcmQtdmlkZW8tcGxheWVyLmNvbXBvbmVudC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgU3VuYmlyZFZpZGVvUGxheWVyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3ksIE9uQ2hhbmdlcyB7XG5cbiAgQElucHV0KCkgcGxheWVyQ29uZmlnOiBQbGF5ZXJDb25maWc7XG4gIEBJbnB1dCgpIGFjdGlvbj86IElBY3Rpb247XG4gIEBPdXRwdXQoKSBwbGF5ZXJFdmVudDogRXZlbnRFbWl0dGVyPG9iamVjdD47XG4gIEBPdXRwdXQoKSB0ZWxlbWV0cnlFdmVudDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgQFZpZXdDaGlsZCgndmlkZW9QbGF5ZXInLCB7IHN0YXRpYzogdHJ1ZSB9KSB2aWRlb1BsYXllclJlZjogRWxlbWVudFJlZjsgXG4gIEBJbnB1dCgpIHB1YmxpYyBwbGF5VmlkZW9Gcm9tVGltZXN0YW1wOiBhbnk7XG4gIHZpZXdTdGF0ZSA9ICdwbGF5ZXInO1xuICBwdWJsaWMgdHJhY2VJZDogc3RyaW5nO1xuICBwdWJsaWMgbmV4dENvbnRlbnQ6IGFueTtcbiAgc2hvd0NvbnRlbnRFcnJvcjogYm9vbGVhbjtcbiAgc2hvd0NvbnRyb2xzID0gdHJ1ZTtcbiAgc2lkZU1lbnVDb25maWcgPSB7XG4gICAgc2hvd1NoYXJlOiB0cnVlLFxuICAgIHNob3dEb3dubG9hZDogdHJ1ZSxcbiAgICBzaG93UmVwbGF5OiB0cnVlLFxuICAgIHNob3dFeGl0OiB0cnVlXG4gIH07XG4gIHByaXZhdGUgdW5saXN0ZW5Ub3VjaFN0YXJ0OiAoKSA9PiB2b2lkO1xuICBwcml2YXRlIHVubGlzdGVuTW91c2VNb3ZlOiAoKSA9PiB2b2lkO1xuICBpc1BhdXNlZCA9IGZhbHNlO1xuICBzaG93UXVtbFBsYXllciA9IGZhbHNlO1xuICBRdW1sUGxheWVyQ29uZmlnOiBhbnkgPSB7fTtcbiAgdmlkZW9JbnN0YW5jZTogYW55O1xuICBjdXJyZW50SW50ZXJjZXB0aW9uVGltZTtcbiAgY3VycmVudEludGVyY2VwdGlvblVJSWQ7XG4gIGlzRnVsbFNjcmVlbiA9IGZhbHNlO1xuICBwbGF5ZXJBY3Rpb246IElBY3Rpb247XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIHZpZGVvUGxheWVyU2VydmljZTogU3VuYmlyZFZpZGVvUGxheWVyU2VydmljZSxcbiAgICBwdWJsaWMgdmlld2VyU2VydmljZTogVmlld2VyU2VydmljZSxcbiAgICBwdWJsaWMgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBwcml2YXRlIHJlbmRlcmVyMjogUmVuZGVyZXIyLFxuICAgIHB1YmxpYyBlcnJvclNlcnZpY2U6IEVycm9yU2VydmljZVxuICApIHtcbiAgICB0aGlzLnBsYXllckV2ZW50ID0gdGhpcy52aWV3ZXJTZXJ2aWNlLnBsYXllckV2ZW50O1xuICAgIHRoaXMudmlld2VyU2VydmljZS5wbGF5ZXJFdmVudC5zdWJzY3JpYmUoZXZlbnQgPT4ge1xuICAgICAgaWYgKGV2ZW50LnR5cGUgPT09ICdwYXVzZScpIHtcbiAgICAgICAgdGhpcy5pc1BhdXNlZCA9IHRydWU7XG4gICAgICAgIHRoaXMuc2hvd0NvbnRyb2xzID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGlmIChldmVudC50eXBlID09PSAncGxheScpIHtcbiAgICAgICAgdGhpcy5pc1BhdXNlZCA9IGZhbHNlO1xuICAgICAgfVxuICAgICAgaWYgKGV2ZW50LnR5cGUgPT09ICdsb2Fkc3RhcnQnKSB7XG4gICAgICAgIHRoaXMudmlld2VyU2VydmljZS5yYWlzZVN0YXJ0RXZlbnQoZXZlbnQpO1xuICAgICAgfVxuICAgICAgaWYgKGV2ZW50LnR5cGUgPT09ICdlbmRlZCcpIHtcbiAgICAgICAgdGhpcy52aWV3ZXJTZXJ2aWNlLmVuZFBhZ2VTZWVuID0gdHJ1ZTtcbiAgICAgICAgdGhpcy52aWV3ZXJTZXJ2aWNlLnJhaXNlRW5kRXZlbnQoKTtcbiAgICAgICAgdGhpcy52aWV3U3RhdGUgPSAnZW5kJztcbiAgICAgIH1cbiAgICAgIGlmIChldmVudC50eXBlID09PSAnZXJyb3InKSB7XG4gICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpvbmUtdmFyaWFibGUtcGVyLWRlY2xhcmF0aW9uXG4gICAgICAgIGxldCBjb2RlID0gZXJyb3JDb2RlLmNvbnRlbnRMb2FkRmFpbHMsXG4gICAgICAgICAgbWVzc2FnZSA9IGVycm9yTWVzc2FnZS5jb250ZW50TG9hZEZhaWxzO1xuICAgICAgICBpZiAodGhpcy52aWV3ZXJTZXJ2aWNlLmlzQXZhaWxhYmxlTG9jYWxseSkge1xuICAgICAgICAgICAgY29kZSA9IGVycm9yQ29kZS5jb250ZW50TG9hZEZhaWxzO1xuICAgICAgICAgICAgbWVzc2FnZSA9IGVycm9yTWVzc2FnZS5jb250ZW50TG9hZEZhaWxzO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb2RlID09PSBlcnJvckNvZGUuY29udGVudExvYWRGYWlscykge1xuICAgICAgICAgIHRoaXMuc2hvd0NvbnRlbnRFcnJvciA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy52aWV3ZXJTZXJ2aWNlLnJhaXNlRXhjZXB0aW9uTG9nKGNvZGUsIG1lc3NhZ2UsIGV2ZW50LCB0aGlzLnRyYWNlSWQpO1xuXG4gICAgICB9XG4gICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bWF4LWxpbmUtbGVuZ3RoXG4gICAgICBjb25zdCBldmVudHMgPSBbeyB0eXBlOiAndm9sdW1lY2hhbmdlJywgdGVsZW1ldHJ5RXZlbnQ6ICdWT0xVTUVfQ0hBTkdFJyB9LCB7IHR5cGU6ICdzZWVraW5nJywgdGVsZW1ldHJ5RXZlbnQ6ICdEUkFHJyB9LCB7IHR5cGU6ICdmdWxsc2NyZWVuJywgdGVsZW1ldHJ5RXZlbnQ6ICdGVUxMU0NSRUVOJyB9LFxuICAgICAgeyB0eXBlOiAncmF0ZWNoYW5nZScsIHRlbGVtZXRyeUV2ZW50OiAnUkFURV9DSEFOR0UnIH1dO1xuICAgICAgZXZlbnRzLmZvckVhY2goZGF0YSA9PiB7XG4gICAgICAgIGlmIChldmVudC50eXBlID09PSBkYXRhLnR5cGUpIHtcbiAgICAgICAgICB0aGlzLnZpZXdlclNlcnZpY2UucmFpc2VIZWFydEJlYXRFdmVudChkYXRhLnRlbGVtZXRyeUV2ZW50KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDpUZWxlbWV0cnlFdmVudCcsIFsnJGV2ZW50J10pXG4gIG9uVGVsZW1ldHJ5RXZlbnQoZXZlbnQpIHtcbiAgICB0aGlzLnRlbGVtZXRyeUV2ZW50LmVtaXQoZXZlbnQuZGV0YWlsKTtcbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIGlmICh0eXBlb2YgdGhpcy5wbGF5ZXJDb25maWcgPT09ICdzdHJpbmcnKSB7XG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLnBsYXllckNvbmZpZyA9IEpTT04ucGFyc2UodGhpcy5wbGF5ZXJDb25maWcpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignSW52YWxpZCBwbGF5ZXJDb25maWc6ICcsIGVycm9yKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICBpZiAoIXRoaXMuaXNQYXVzZWQpIHtcbiAgICAgICAgdGhpcy5zaG93Q29udHJvbHMgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9LCA1MDAwKTtcblxuICAgIC8qIHRzbGludDpkaXNhYmxlOm5vLXN0cmluZy1saXRlcmFsICovXG4gICAgdGhpcy5uZXh0Q29udGVudCA9IHRoaXMucGxheWVyQ29uZmlnLmNvbmZpZy5uZXh0Q29udGVudDtcbiAgICB0aGlzLnRyYWNlSWQgPSB0aGlzLnBsYXllckNvbmZpZy5jb25maWdbJ3RyYWNlSWQnXTtcbiAgICB0aGlzLnNpZGVNZW51Q29uZmlnID0geyAuLi50aGlzLnNpZGVNZW51Q29uZmlnLCAuLi50aGlzLnBsYXllckNvbmZpZy5jb25maWcuc2lkZU1lbnUgfTtcbiAgICB0aGlzLnZpZGVvUGxheWVyU2VydmljZS5pbml0aWFsaXplKHRoaXMucGxheWVyQ29uZmlnKTtcbiAgICB0aGlzLnZpZXdlclNlcnZpY2UuaW5pdGlhbGl6ZSh0aGlzLnBsYXllckNvbmZpZyk7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ29mZmxpbmUnLCB0aGlzLnJhaXNlSW50ZXJuZXREaXNjb25uZWN0aW9uRXJyb3IgLCB0cnVlKTtcbiAgICB0aGlzLlF1bWxQbGF5ZXJDb25maWcuY29uZmlnID0gdGhpcy5wbGF5ZXJDb25maWcuY29uZmlnO1xuICAgIHRoaXMuUXVtbFBsYXllckNvbmZpZy5jb25maWcuc2lkZU1lbnUuZW5hYmxlID0gZmFsc2U7XG4gICAgdGhpcy5RdW1sUGxheWVyQ29uZmlnLmNvbnRleHQgPSB0aGlzLnBsYXllckNvbmZpZy5jb250ZXh0O1xuICAgIHRoaXMuc2V0VGVsZW1ldHJ5T2JqZWN0Um9sbHVwKHRoaXMucGxheWVyQ29uZmlnLm1ldGFkYXRhLmlkZW50aWZpZXIpO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzLmFjdGlvbikge1xuICAgICAgaWYgKCF0aGlzLnNob3dRdW1sUGxheWVyKSB7XG4gICAgICAgIHRoaXMucGxheWVyQWN0aW9uID0gdGhpcy5hY3Rpb247XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmFpc2VJbnRlcm5ldERpc2Nvbm5lY3Rpb25FcnJvciA9ICgpID0+IHtcbiAgICBjb25zdCBjb2RlID0gZXJyb3JDb2RlLmludGVybmV0Q29ubmVjdGl2aXR5O1xuICAgIGNvbnN0IG1lc3NhZ2UgPSBlcnJvck1lc3NhZ2UuaW50ZXJuZXRDb25uZWN0aXZpdHk7XG4gICAgY29uc3Qgc3RhY2t0cmFjZSA9IGAke2NvZGV9OiAke21lc3NhZ2V9YDtcbiAgICB0aGlzLnZpZXdlclNlcnZpY2UucmFpc2VFeGNlcHRpb25Mb2coY29kZSwgbWVzc2FnZSwgc3RhY2t0cmFjZSwgdGhpcy50cmFjZUlkKTtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICBjb25zdCB2aWRlb1BsYXllckVsZW1lbnQgPSB0aGlzLnZpZGVvUGxheWVyUmVmLm5hdGl2ZUVsZW1lbnQ7XG4gICAgdGhpcy51bmxpc3Rlbk1vdXNlTW92ZSA9IHRoaXMucmVuZGVyZXIyLmxpc3Rlbih2aWRlb1BsYXllckVsZW1lbnQsICdtb3VzZW1vdmUnLCAoKSA9PiB7XG4gICAgICB0aGlzLnNob3dDb250cm9scyA9IHRydWU7XG4gICAgfSk7XG5cbiAgICB0aGlzLnVubGlzdGVuVG91Y2hTdGFydCA9IHRoaXMucmVuZGVyZXIyLmxpc3Rlbih2aWRlb1BsYXllckVsZW1lbnQsICd0b3VjaHN0YXJ0JywgKCkgPT4ge1xuICAgICAgdGhpcy5zaG93Q29udHJvbHMgPSB0cnVlO1xuICAgIH0pO1xuXG4gICAgY29uc3QgY29udGVudENvbXBhYmlsaXR5TGV2ZWwgPSB0aGlzLnBsYXllckNvbmZpZy5tZXRhZGF0YVsnY29tcGF0aWJpbGl0eUxldmVsJ107XG4gICAgaWYgKGNvbnRlbnRDb21wYWJpbGl0eUxldmVsKSB7XG4gICAgICBjb25zdCBjaGVja0NvbnRlbnRDb21wYXRpYmxlID0gdGhpcy5lcnJvclNlcnZpY2UuY2hlY2tDb250ZW50Q29tcGF0aWJpbGl0eShjb250ZW50Q29tcGFiaWxpdHlMZXZlbCk7XG4gICAgICBpZiAoIWNoZWNrQ29udGVudENvbXBhdGlibGVbJ2lzQ29tcGl0YWJsZSddKSB7XG4gICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTptYXgtbGluZS1sZW5ndGhcbiAgICAgICAgdGhpcy52aWV3ZXJTZXJ2aWNlLnJhaXNlRXhjZXB0aW9uTG9nKGVycm9yQ29kZS5jb250ZW50Q29tcGF0aWJpbGl0eSwgZXJyb3JNZXNzYWdlLmNvbnRlbnRDb21wYXRpYmlsaXR5LCBjaGVja0NvbnRlbnRDb21wYXRpYmxlWydlcnJvciddWydtZXNzYWdlJ10sIHRoaXMudHJhY2VJZCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgc2lkZUJhckV2ZW50cyhldmVudDogSVNpZGVCYXJFdmVudCkge1xuICAgIHRoaXMucGxheWVyRXZlbnQuZW1pdChldmVudCk7XG4gICAgLy8gY2FwdHVyaW5nIHRoaXMgZXZlbnQgZnJvbSBhcHAgY29kZSBpdHNlbGZcbiAgICAvLyBpZiAoZXZlbnQudHlwZSA9PT0gJ0RPV05MT0FEJykge1xuICAgIC8vICAgdGhpcy5kb3dubG9hZFZpZGVvKCk7XG4gICAgLy8gfVxuICAgIGNvbnN0IGV2ZW50cyA9IFsnU0hBUkUnLCAnRE9XTkxPQURfTUVOVScsICdFWElUJywgJ0NMT1NFX01FTlUnLCAnT1BFTl9NRU5VJywgJ0RPV05MT0FEX1BPUFVQX0NBTkNFTCcsICdET1dOTE9BRF9QT1BVUF9DTE9TRSddO1xuICAgIGV2ZW50cy5mb3JFYWNoKGRhdGEgPT4ge1xuICAgICAgaWYgKGV2ZW50LnR5cGUgPT09IGRhdGEpIHtcbiAgICAgICAgdGhpcy52aWV3ZXJTZXJ2aWNlLnJhaXNlSGVhcnRCZWF0RXZlbnQoZGF0YSk7XG4gICAgICB9XG4gICAgICBpZiAoZXZlbnQudHlwZSA9PT0gJ0VYSVQnKSB7XG4gICAgICAgIHRoaXMudmlld2VyU2VydmljZS5zaWRlYmFyTWVudUV2ZW50LmVtaXQoJ0NMT1NFX01FTlUnKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHNldFRlbGVtZXRyeU9iamVjdFJvbGx1cChpZCkge1xuICAgIGlmICh0aGlzLlF1bWxQbGF5ZXJDb25maWcuY29udGV4dCkge1xuICAgICAgY29uc3QgaGFzT2JqZWN0Um9sbHVwID0gdGhpcy5RdW1sUGxheWVyQ29uZmlnICYmIHRoaXMuUXVtbFBsYXllckNvbmZpZy5jb250ZXh0ICYmIHRoaXMuUXVtbFBsYXllckNvbmZpZy5jb250ZXh0Lm9iamVjdFJvbGx1cDtcbiAgICAgIGlmICghaGFzT2JqZWN0Um9sbHVwKSB7XG4gICAgICAgIHRoaXMuUXVtbFBsYXllckNvbmZpZy5jb250ZXh0Lm9iamVjdFJvbGx1cCA9IHt9O1xuICAgICAgfVxuICAgICAgY29uc3QgbGV2ZWxzID0gT2JqZWN0LmtleXModGhpcy5RdW1sUGxheWVyQ29uZmlnLmNvbnRleHQub2JqZWN0Um9sbHVwKTtcbiAgICAgIHRoaXMuUXVtbFBsYXllckNvbmZpZy5jb250ZXh0Lm9iamVjdFJvbGx1cFtgbCR7bGV2ZWxzLmxlbmd0aCArICAxfWBdID0gaWQ7XG4gICAgfVxuICB9XG5cbiAgcGxheUNvbnRlbnQoZXZlbnQpIHtcbiAgICB0aGlzLnZpZXdlclNlcnZpY2UucmFpc2VIZWFydEJlYXRFdmVudChldmVudC50eXBlKTtcbiAgfVxuXG4gIHJlcGxheUNvbnRlbnQoZXZlbnQpIHtcbiAgICB0aGlzLnBsYXllckV2ZW50LmVtaXQoZXZlbnQpO1xuICAgIHRoaXMudmlld1N0YXRlID0gJ3BsYXllcic7XG4gICAgdGhpcy52aWV3ZXJTZXJ2aWNlLmlzRW5kRXZlbnRSYWlzZWQgPSBmYWxzZTtcbiAgICB0aGlzLnZpZXdlclNlcnZpY2UucmFpc2VIZWFydEJlYXRFdmVudCgnUkVQTEFZJyk7XG4gIH1cblxuICBleGl0Q29udGVudChldmVudCkge1xuICAgIHRoaXMucGxheWVyRXZlbnQuZW1pdChldmVudCk7XG4gICAgdGhpcy52aWV3ZXJTZXJ2aWNlLnJhaXNlSGVhcnRCZWF0RXZlbnQoJ0VYSVQnKTtcbiAgfVxuXG4gIGRvd25sb2FkVmlkZW8oKSB7XG4gICAgY29uc3QgYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcbiAgICBhLmhyZWYgPSB0aGlzLnZpZXdlclNlcnZpY2UuYXJ0aWZhY3RVcmw7XG4gICAgYS5kb3dubG9hZCA9IHRoaXMudmlld2VyU2VydmljZS5jb250ZW50TmFtZTtcbiAgICBhLnRhcmdldCA9ICdfYmxhbmsnO1xuICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSk7XG4gICAgYS5jbGljaygpO1xuICAgIGEucmVtb3ZlKCk7XG4gICAgdGhpcy52aWV3ZXJTZXJ2aWNlLnJhaXNlSGVhcnRCZWF0RXZlbnQoJ0RPV05MT0FEJyk7XG4gIH1cblxuICBxdW1sUGxheWVyRXZlbnRzKGV2ZW50KSB7XG4gICAgaWYgKGV2ZW50LmVpZCA9PT0gJ1FVTUxfU1VNTUFSWScpIHtcbiAgICAgIHRoaXMuc2hvd1F1bWxQbGF5ZXIgPSBmYWxzZTtcbiAgICAgIGNvbnN0IHNjb3JlID0gcGFyc2VJbnQoZXZlbnQuZWRhdGEuZXh0cmEuZmluZChwID0+IHAuaWQgPT09ICdzY29yZScpWyd2YWx1ZSddLCAxMCk7XG4gICAgICB0aGlzLnZpZXdlclNlcnZpY2UuaW50ZXJjZXB0aW9uUmVzcG9uc2VzW3RoaXMuY3VycmVudEludGVyY2VwdGlvblRpbWVdID0ge1xuICAgICAgICBzY29yZSxcbiAgICAgICAgaXNTa2lwcGVkOiBmYWxzZVxuICAgICAgfTtcbiAgICAgIGNvbnN0IGludGVyY2VwdFBvaW50RWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYFtkYXRhLW1hcmtlci10aW1lPVwiJHt0aGlzLmN1cnJlbnRJbnRlcmNlcHRpb25UaW1lfVwiXWApO1xuICAgICAgaWYgKGludGVyY2VwdFBvaW50RWxlbWVudCkge1xuICAgICAgICBpbnRlcmNlcHRQb2ludEVsZW1lbnRbJ3N0eWxlJ10uYmFja2dyb3VuZCA9ICdncmVlbic7XG4gICAgICB9XG4gICAgICB0aGlzLnZpZGVvSW5zdGFuY2UucGxheSgpO1xuICAgICAgdGhpcy52aWRlb0luc3RhbmNlLmNvbnRyb2xzKHRydWUpO1xuICAgICAgdGhpcy52aWV3ZXJTZXJ2aWNlLnJhaXNlSW1wcmVzc2lvbkV2ZW50KCd2aWRlbycpO1xuICAgICAgLy8gaWYgY3VycmVudGx5IHZpZGVvIGlzIG5vdCBpbiBmdWxsIHNjcmVlbiBhbmQgd2FzIHByZXZpb3VzbHkgZnVsbCBzY3JlZW4gdGhlbiBzZXQgaXQgYmFjayB0byBmdWxsIHNjcmVlbiBhZ2FpblxuICAgICAgaWYgKCFkb2N1bWVudC5mdWxsc2NyZWVuRWxlbWVudCAmJiB0aGlzLmlzRnVsbFNjcmVlbikge1xuICAgICAgICBpZiAoZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgndmlkZW8tanMnKVswXSkge1xuICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3ZpZGVvLWpzJylbMF0ucmVxdWVzdEZ1bGxzY3JlZW4oKVxuICAgICAgICAgIC5jYXRjaCgoZXJyKSA9PiBjb25zb2xlLmVycm9yKGVycikpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcXVlc3Rpb25TZXREYXRhKHtyZXNwb25zZSwgdGltZSwgaWRlbnRpZmllcn0pIHtcbiAgICB0aGlzLlF1bWxQbGF5ZXJDb25maWcubWV0YWRhdGEgPSByZXNwb25zZTtcbiAgICB0aGlzLlF1bWxQbGF5ZXJDb25maWcubWV0YWRhdGFbJ3Nob3dTdGFydFBhZ2UnXSA9ICdObyc7XG4gICAgdGhpcy5RdW1sUGxheWVyQ29uZmlnLm1ldGFkYXRhWydzaG93RW5kUGFnZSddID0gJ05vJztcbiAgICB0aGlzLmN1cnJlbnRJbnRlcmNlcHRpb25UaW1lID0gdGltZTtcbiAgICB0aGlzLmN1cnJlbnRJbnRlcmNlcHRpb25VSUlkID0gaWRlbnRpZmllcjtcbiAgICBpZiAoZG9jdW1lbnQuZnVsbHNjcmVlbkVsZW1lbnQpIHtcbiAgICAgIHRoaXMuaXNGdWxsU2NyZWVuID0gdHJ1ZTtcbiAgICAgIGRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKClcbiAgICAgIC5jYXRjaCgoZXJyKSA9PiBjb25zb2xlLmVycm9yKGVycikpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmlzRnVsbFNjcmVlbiA9IGZhbHNlO1xuICAgIH1cbiAgICB0aGlzLnNob3dRdW1sUGxheWVyID0gdHJ1ZTtcbiAgICB0aGlzLnZpZXdlclNlcnZpY2UucmFpc2VJbXByZXNzaW9uRXZlbnQoJ2ludGVyYWN0aXZlLXF1ZXN0aW9uLXNldCcsIHsgaWQ6IGlkZW50aWZpZXIsIHR5cGU6ICdRdWVzdGlvblNldCcgfSk7XG4gICAgdGhpcy52aWV3ZXJTZXJ2aWNlLnJhaXNlSGVhcnRCZWF0RXZlbnQoJ1ZJREVPX01BUktFUl9TRUxFQ1RFRCcsIHtcbiAgICAgIGlkZW50aWZpZXIsIC8vIFF1ZXN0aW9uIHNldCBpZCxcbiAgICAgIHR5cGU6ICdRdWVzdGlvblNldCcsIC8vIFR5cGUgb2YgaW50ZXJhY3Rpb25cbiAgICAgIGludGVyY2VwdGVkQXQ6IHRpbWUgLy8gVGltZSB3aGVuIHRoZSBpbnRlcmNlcHRpb24gaGFwcGVuZWRcbiAgICB9KTtcbiAgfVxuXG4gIHBsYXllckluc3RhbmNlKGV2ZW50KSB7XG4gICAgdGhpcy52aWRlb0luc3RhbmNlID0gZXZlbnQ7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCd3aW5kb3c6YmVmb3JldW5sb2FkJylcbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy52aWV3ZXJTZXJ2aWNlLnJhaXNlRW5kRXZlbnQoKTtcbiAgICB0aGlzLnVubGlzdGVuVG91Y2hTdGFydCgpO1xuICAgIHRoaXMudW5saXN0ZW5Nb3VzZU1vdmUoKTtcbiAgICB0aGlzLnZpZXdlclNlcnZpY2UuaXNFbmRFdmVudFJhaXNlZCA9IGZhbHNlO1xuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdvZmZsaW5lJywgdGhpcy5yYWlzZUludGVybmV0RGlzY29ubmVjdGlvbkVycm9yICwgdHJ1ZSk7XG4gIH1cbn1cbiJdfQ==