UNPKG

cb-tour-guide

Version:
367 lines 36.8 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { debounceTime } from 'rxjs/operators'; import { ErrorHandler, Inject, Injectable } from '@angular/core'; import { Subject, fromEvent } from 'rxjs'; import { Orientation } from './guided-tour.constants'; import { cloneDeep } from 'lodash'; import { DOCUMENT } from "@angular/common"; import { WindowRefService } from "./windowref.service"; export class GuidedTourService { /** * @param {?} errorHandler * @param {?} windowRef * @param {?} dom */ constructor(errorHandler, windowRef, dom) { this.errorHandler = errorHandler; this.windowRef = windowRef; this.dom = dom; this._guidedTourCurrentStepSubject = new Subject(); this._guidedTourOrbShowingSubject = new Subject(); this._currentTourStepIndex = 0; this._currentTour = null; this._onFirstStep = true; this._onLastStep = true; this._onResizeMessage = false; this.guidedTourCurrentStepStream = this._guidedTourCurrentStepSubject.asObservable(); this.guidedTourOrbShowingStream = this._guidedTourOrbShowingSubject.asObservable(); fromEvent(this.windowRef.nativeWindow, 'resize').pipe(debounceTime(200)).subscribe((/** * @return {?} */ () => { if (this._currentTour && this._currentTourStepIndex > -1) { if (this._currentTour.minimumScreenSize && this._currentTour.minimumScreenSize >= this.windowRef.nativeWindow.innerWidth) { this._onResizeMessage = true; /** @type {?} */ const dialog = this._currentTour.resizeDialog || { title: 'Please resize', content: 'You have resized the tour to a size that is too small to continue. Please resize the browser to a larger size to continue the tour or close the tour.' }; this._guidedTourCurrentStepSubject.next(dialog); } else { this._onResizeMessage = false; this._guidedTourCurrentStepSubject.next(this.getPreparedTourStep(this._currentTourStepIndex)); } } })); } /** * @return {?} */ nextStep() { if (this._currentTour.steps[this._currentTourStepIndex].closeAction) { this._currentTour.steps[this._currentTourStepIndex].closeAction(); } if (this._currentTour.steps[this._currentTourStepIndex + 1]) { this._currentTourStepIndex++; this._setFirstAndLast(); if (this._currentTour.steps[this._currentTourStepIndex].action) { this._currentTour.steps[this._currentTourStepIndex].action(); // Usually an action is opening something so we need to give it time to render. setTimeout((/** * @return {?} */ () => { if (this._checkSelectorValidity()) { this._guidedTourCurrentStepSubject.next(this.getPreparedTourStep(this._currentTourStepIndex)); } else { this.nextStep(); } })); } else { if (this._checkSelectorValidity()) { this._guidedTourCurrentStepSubject.next(this.getPreparedTourStep(this._currentTourStepIndex)); } else { this.nextStep(); } } if (this._currentTour.nextCallback) { this._currentTour.nextCallback(this._currentTourStepIndex, this._currentTour.steps[this._currentTourStepIndex]); } } else { if (this._currentTour.completeCallback) { this._currentTour.completeCallback(); } this.resetTour(); } } /** * @return {?} */ backStep() { if (this._currentTour.steps[this._currentTourStepIndex].closeAction) { this._currentTour.steps[this._currentTourStepIndex].closeAction(); } if (this._currentTour.steps[this._currentTourStepIndex - 1]) { this._currentTourStepIndex--; this._setFirstAndLast(); if (this._currentTour.steps[this._currentTourStepIndex].action) { this._currentTour.steps[this._currentTourStepIndex].action(); setTimeout((/** * @return {?} */ () => { if (this._checkSelectorValidity()) { this._guidedTourCurrentStepSubject.next(this.getPreparedTourStep(this._currentTourStepIndex)); } else { this.backStep(); } })); } else { if (this._checkSelectorValidity()) { this._guidedTourCurrentStepSubject.next(this.getPreparedTourStep(this._currentTourStepIndex)); } else { this.backStep(); } } if (this._currentTour.nextCallback) { this._currentTour.prevCallback(this._currentTourStepIndex, this._currentTour.steps[this._currentTourStepIndex]); } } else { this.resetTour(); } } /** * @return {?} */ skipTour() { if (this._currentTour.skipCallback) { this._currentTour.skipCallback(this._currentTourStepIndex); } if (this._currentTour.closeModalCallback) { this._currentTour.closeModalCallback(); } this.resetTour(); } /** * @return {?} */ resetTour() { this.dom.body.classList.remove('tour-open'); this._currentTour = null; this._currentTourStepIndex = 0; this._guidedTourCurrentStepSubject.next(null); } /** * @param {?} tour * @return {?} */ startTour(tour) { this._currentTour = cloneDeep(tour); this._currentTour.steps = this._currentTour.steps.filter((/** * @param {?} step * @return {?} */ step => !step.skipStep)); this._currentTourStepIndex = 0; this._setFirstAndLast(); this._guidedTourOrbShowingSubject.next(this._currentTour.useOrb); if (this._currentTour.steps.length > 0 && (!this._currentTour.minimumScreenSize || (this.windowRef.nativeWindow.innerWidth >= this._currentTour.minimumScreenSize))) { if (!this._currentTour.useOrb) { this.dom.body.classList.add('tour-open'); } if (this._currentTour.steps[this._currentTourStepIndex].action) { this._currentTour.steps[this._currentTourStepIndex].action(); } if (this._checkSelectorValidity()) { this._guidedTourCurrentStepSubject.next(this.getPreparedTourStep(this._currentTourStepIndex)); } else { this.nextStep(); } } } /** * @return {?} */ activateOrb() { this._guidedTourOrbShowingSubject.next(false); this.dom.body.classList.add('tour-open'); } /** * @private * @return {?} */ _setFirstAndLast() { this._onLastStep = (this._currentTour.steps.length - 1) === this._currentTourStepIndex; this._onFirstStep = this._currentTourStepIndex === 0; } /** * @private * @return {?} */ _checkSelectorValidity() { if (this._currentTour.steps[this._currentTourStepIndex].selector) { /** @type {?} */ const selectedElement = this.dom.querySelector(this._currentTour.steps[this._currentTourStepIndex].selector); if (!selectedElement) { this.errorHandler.handleError( // If error handler is configured this should not block the browser. new Error(`Error finding selector ${this._currentTour.steps[this._currentTourStepIndex].selector} on step ${this._currentTourStepIndex + 1} during guided tour: ${this._currentTour.tourId}`)); return false; } } return true; } /** * @return {?} */ get onLastStep() { return this._onLastStep; } /** * @return {?} */ get onFirstStep() { return this._onFirstStep; } /** * @return {?} */ get onResizeMessage() { return this._onResizeMessage; } /** * @return {?} */ get currentTourStepDisplay() { return this._currentTourStepIndex + 1; } /** * @return {?} */ get currentTourStepCount() { return this._currentTour && this._currentTour.steps ? this._currentTour.steps.length : 0; } /** * @return {?} */ get preventBackdropFromAdvancing() { return this._currentTour && this._currentTour.preventBackdropFromAdvancing; } /** * @private * @param {?} index * @return {?} */ getPreparedTourStep(index) { return this.setTourOrientation(this._currentTour.steps[index]); } /** * @private * @param {?} step * @return {?} */ setTourOrientation(step) { /** @type {?} */ const convertedStep = cloneDeep(step); if (convertedStep.orientation && !(typeof convertedStep.orientation === 'string') && ((/** @type {?} */ (convertedStep.orientation))).length) { ((/** @type {?} */ (convertedStep.orientation))).sort((/** * @param {?} a * @param {?} b * @return {?} */ (a, b) => { if (!b.maximumSize) { return 1; } if (!a.maximumSize) { return -1; } return b.maximumSize - a.maximumSize; })); /** @type {?} */ let currentOrientation = Orientation.Top; ((/** @type {?} */ (convertedStep.orientation))).forEach((/** * @param {?} orientationConfig * @return {?} */ (orientationConfig) => { if (!orientationConfig.maximumSize || this.windowRef.nativeWindow.innerWidth <= orientationConfig.maximumSize) { currentOrientation = orientationConfig.orientationDirection; } })); convertedStep.orientation = currentOrientation; } return convertedStep; } } GuidedTourService.decorators = [ { type: Injectable } ]; /** @nocollapse */ GuidedTourService.ctorParameters = () => [ { type: ErrorHandler }, { type: WindowRefService }, { type: undefined, decorators: [{ type: Inject, args: [DOCUMENT,] }] } ]; if (false) { /** @type {?} */ GuidedTourService.prototype.guidedTourCurrentStepStream; /** @type {?} */ GuidedTourService.prototype.guidedTourOrbShowingStream; /** * @type {?} * @private */ GuidedTourService.prototype._guidedTourCurrentStepSubject; /** * @type {?} * @private */ GuidedTourService.prototype._guidedTourOrbShowingSubject; /** * @type {?} * @private */ GuidedTourService.prototype._currentTourStepIndex; /** * @type {?} * @private */ GuidedTourService.prototype._currentTour; /** * @type {?} * @private */ GuidedTourService.prototype._onFirstStep; /** * @type {?} * @private */ GuidedTourService.prototype._onLastStep; /** * @type {?} * @private */ GuidedTourService.prototype._onResizeMessage; /** @type {?} */ GuidedTourService.prototype.errorHandler; /** * @type {?} * @private */ GuidedTourService.prototype.windowRef; /** * @type {?} * @private */ GuidedTourService.prototype.dom; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3VpZGVkLXRvdXIuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2NiLXRvdXItZ3VpZGUvIiwic291cmNlcyI6WyJsaWIvZ3VpZGVkLXRvdXIuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNqRSxPQUFPLEVBQWMsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN0RCxPQUFPLEVBQXdCLFdBQVcsRUFBNEIsTUFBTSx5QkFBeUIsQ0FBQztBQUN0RyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBQ25DLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMzQyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUd2RCxNQUFNLE9BQU8saUJBQWlCOzs7Ozs7SUFZMUIsWUFDVyxZQUEwQixFQUN6QixTQUEyQixFQUNULEdBQUc7UUFGdEIsaUJBQVksR0FBWixZQUFZLENBQWM7UUFDekIsY0FBUyxHQUFULFNBQVMsQ0FBa0I7UUFDVCxRQUFHLEdBQUgsR0FBRyxDQUFBO1FBWHpCLGtDQUE2QixHQUFHLElBQUksT0FBTyxFQUFZLENBQUM7UUFDeEQsaUNBQTRCLEdBQUcsSUFBSSxPQUFPLEVBQVcsQ0FBQztRQUN0RCwwQkFBcUIsR0FBRyxDQUFDLENBQUM7UUFDMUIsaUJBQVksR0FBZSxJQUFJLENBQUM7UUFDaEMsaUJBQVksR0FBRyxJQUFJLENBQUM7UUFDcEIsZ0JBQVcsR0FBRyxJQUFJLENBQUM7UUFDbkIscUJBQWdCLEdBQUcsS0FBSyxDQUFDO1FBTzdCLElBQUksQ0FBQywyQkFBMkIsR0FBRyxJQUFJLENBQUMsNkJBQTZCLENBQUMsWUFBWSxFQUFFLENBQUM7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c0NBQW1DOzs7OztJQUNuQyxnQ0FBNkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBkZWJvdW5jZVRpbWUgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBFcnJvckhhbmRsZXIsIEluamVjdCwgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3ViamVjdCwgZnJvbUV2ZW50IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBHdWlkZWRUb3VyLCBUb3VyU3RlcCwgT3JpZW50YXRpb24sIE9yaWVudGF0aW9uQ29uZmlndXJhdGlvbiB9IGZyb20gJy4vZ3VpZGVkLXRvdXIuY29uc3RhbnRzJztcbmltcG9ydCB7IGNsb25lRGVlcCB9IGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyBET0NVTUVOVCB9IGZyb20gXCJAYW5ndWxhci9jb21tb25cIjtcbmltcG9ydCB7IFdpbmRvd1JlZlNlcnZpY2UgfSBmcm9tIFwiLi93aW5kb3dyZWYuc2VydmljZVwiO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgR3VpZGVkVG91clNlcnZpY2Uge1xuICAgIHB1YmxpYyBndWlkZWRUb3VyQ3VycmVudFN0ZXBTdHJlYW06IE9ic2VydmFibGU8VG91clN0ZXA+O1xuICAgIHB1YmxpYyBndWlkZWRUb3VyT3JiU2hvd2luZ1N0cmVhbTogT2JzZXJ2YWJsZTxib29sZWFuPjtcblxuICAgIHByaXZhdGUgX2d1aWRlZFRvdXJDdXJyZW50U3RlcFN1YmplY3QgPSBuZXcgU3ViamVjdDxUb3VyU3RlcD4oKTtcbiAgICBwcml2YXRlIF9ndWlkZWRUb3VyT3JiU2hvd2luZ1N1YmplY3QgPSBuZXcgU3ViamVjdDxib29sZWFuPigpO1xuICAgIHByaXZhdGUgX2N1cnJlbnRUb3VyU3RlcEluZGV4ID0gMDtcbiAgICBwcml2YXRlIF9jdXJyZW50VG91cjogR3VpZGVkVG91ciA9IG51bGw7XG4gICAgcHJpdmF0ZSBfb25GaXJzdFN0ZXAgPSB0cnVlO1xuICAgIHByaXZhdGUgX29uTGFzdFN0ZXAgPSB0cnVlO1xuICAgIHByaXZhdGUgX29uUmVzaXplTWVzc2FnZSA9IGZhbHNlO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHB1YmxpYyBlcnJvckhhbmRsZXI6IEVycm9ySGFuZGxlcixcbiAgICAgICAgcHJpdmF0ZSB3aW5kb3dSZWY6IFdpbmRvd1JlZlNlcnZpY2UsXG4gICAgICAgIEBJbmplY3QoRE9DVU1FTlQpIHByaXZhdGUgZG9tXG4gICAgKSB7XG4gICAgICAgIHRoaXMuZ3VpZGVkVG91ckN1cnJlbnRTdGVwU3RyZWFtID0gdGhpcy5fZ3VpZGVkVG91ckN1cnJlbnRTdGVwU3ViamVjdC5hc09ic2VydmFibGUoKTtcbiAgICAgICAgdGhpcy5ndWlkZWRUb3VyT3JiU2hvd2luZ1N0cmVhbSA9IHRoaXMuX2d1aWRlZFRvdXJPcmJTaG93aW5nU3ViamVjdC5hc09ic2VydmFibGUoKTtcblxuICAgICAgICBmcm9tRXZlbnQodGhpcy53aW5kb3dSZWYubmF0aXZlV2luZG93LCAncmVzaXplJykucGlwZShkZWJvdW5jZVRpbWUoMjAwKSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9jdXJyZW50VG91ciAmJiB0aGlzLl9jdXJyZW50VG91clN0ZXBJbmRleCA+IC0xKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX2N1cnJlbnRUb3VyLm1pbmltdW1TY3JlZW5TaXplICYmIHRoaXMuX2N1cnJlbnRUb3VyLm1pbmltdW1TY3JlZW5TaXplID49IHRoaXMud2luZG93UmVmLm5hdGl2ZVdpbmRvdy5pbm5lcldpZHRoKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX29uUmVzaXplTWVzc2FnZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRpYWxvZyA9IHRoaXMuX2N1cnJlbnRUb3VyLnJlc2l6ZURpYWxvZyB8fCB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogJ1BsZWFzZSByZXNpemUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudDogJ1lvdSBoYXZlIHJlc2l6ZWQgdGhlIHRvdXIgdG8gYSBzaXplIHRoYXQgaXMgdG9vIHNtYWxsIHRvIGNvbnRpbnVlLiBQbGVhc2UgcmVzaXplIHRoZSBicm93c2VyIHRvIGEgbGFyZ2VyIHNpemUgdG8gY29udGludWUgdGhlIHRvdXIgb3IgY2xvc2UgdGhlIHRvdXIuJ1xuICAgICAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2d1aWRlZFRvdXJDdXJyZW50U3RlcFN1YmplY3QubmV4dChkaWFsb2cpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX29uUmVzaXplTWVzc2FnZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9ndWlkZWRUb3VyQ3VycmVudFN0ZXBTdWJqZWN0Lm5leHQodGhpcy5nZXRQcmVwYXJlZFRvdXJTdGVwKHRoaXMuX2N1cnJlbnRUb3VyU3RlcEluZGV4KSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgbmV4dFN0ZXAoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLl9jdXJyZW50VG91ci5zdGVwc1t0aGlzLl9jdXJyZW50VG91clN0ZXBJbmRleF0uY2xvc2VBY3Rpb24pIHtcbiAgICAgICAgICAgIHRoaXMuX2N1cnJlbnRUb3VyLnN0ZXBzW3RoaXMuX2N1cnJlbnRUb3VyU3RlcEluZGV4XS5jbG9zZUFjdGlvbigpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9jdXJyZW50VG91ci5zdGVwc1t0aGlzLl9jdXJyZW50VG91clN0ZXBJbmRleCArIDFdKSB7XG4gICAgICAgICAgICB0aGlzLl9jdXJyZW50VG91clN0ZXBJbmRleCsrO1xuICAgICAgICAgICAgdGhpcy5fc2V0Rmlyc3RBbmRMYXN0KCk7XG4gICAgICAgICAgICBpZiAodGhpcy5fY3VycmVudFRvdXIuc3RlcHNbdGhpcy5fY3VycmVudFRvdXJTdGVwSW5kZXhdLmFjdGlvbikge1xuICAgICAgICAgICAgICAgIHRoaXMuX2N1cnJlbnRUb3VyLnN0ZXBzW3RoaXMuX2N1cnJlbnRUb3VyU3RlcEluZGV4XS5hY3Rpb24oKTtcbiAgICAgICAgICAgICAgICAvLyBVc3VhbGx5IGFuIGFjdGlvbiBpcyBvcGVuaW5nIHNvbWV0aGluZyBzbyB3ZSBuZWVkIHRvIGdpdmUgaXQgdGltZSB0byByZW5kZXIuXG4gICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9jaGVja1NlbGVjdG9yVmFsaWRpdHkoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZ3VpZGVkVG91ckN1cnJlbnRTdGVwU3ViamVjdC5uZXh0KHRoaXMuZ2V0UHJlcGFyZWRUb3VyU3RlcCh0aGlzLl9jdXJyZW50VG91clN0ZXBJbmRleCkpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5uZXh0U3RlcCgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9jaGVja1NlbGVjdG9yVmFsaWRpdHkoKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9ndWlkZWRUb3VyQ3VycmVudFN0ZXBTdWJqZWN0Lm5leHQodGhpcy5nZXRQcmVwYXJlZFRvdXJTdGVwKHRoaXMuX2N1cnJlbnRUb3VyU3RlcEluZGV4KSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5uZXh0U3RlcCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLl9jdXJyZW50VG91ci5uZXh0Q2FsbGJhY2spIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9jdXJyZW50VG91ci5uZXh0Q2FsbGJhY2sodGhpcy5fY3VycmVudFRvdXJTdGVwSW5kZXgsIHRoaXMuX2N1cnJlbnRUb3VyLnN0ZXBzW3RoaXMuX2N1cnJlbnRUb3VyU3RlcEluZGV4XSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fY3VycmVudFRvdXIuY29tcGxldGVDYWxsYmFjaykge1xuICAgICAgICAgICAgICAgIHRoaXMuX2N1cnJlbnRUb3VyLmNvbXBsZXRlQ2FsbGJhY2soKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMucmVzZXRUb3VyKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgYmFja1N0ZXAoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLl9jdXJyZW50VG91ci5zdGVwc1t0aGlzLl9jdXJyZW50VG91clN0ZXBJbmRleF0uY2xvc2VBY3Rpb24pIHtcbiAgICAgICAgICAgIHRoaXMuX2N1cnJlbnRUb3VyLnN0ZXBzW3RoaXMuX2N1cnJlbnRUb3VyU3RlcEluZGV4XS5jbG9zZUFjdGlvbigpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9jdXJyZW50VG91ci5zdGVwc1t0aGlzLl9jdXJyZW50VG91clN0ZXBJbmRleCAtIDFdKSB7XG4gICAgICAgICAgICB0aGlzLl9jdXJyZW50VG91clN0ZXBJbmRleC0tO1xuICAgICAgICAgICAgdGhpcy5fc2V0Rmlyc3RBbmRMYXN0KCk7XG4gICAgICAgICAgICBpZiAodGhpcy5fY3VycmVudFRvdXIuc3RlcHNbdGhpcy5fY3VycmVudFRvdXJTdGVwSW5kZXhdLmFjdGlvbikge1xuICAgICAgICAgICAgICAgIHRoaXMuX2N1cnJlbnRUb3VyLnN0ZXBzW3RoaXMuX2N1cnJlbnRUb3VyU3RlcEluZGV4XS5hY3Rpb24oKTtcbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX2NoZWNrU2VsZWN0b3JWYWxpZGl0eSgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9ndWlkZWRUb3VyQ3VycmVudFN0ZXBTdWJqZWN0Lm5leHQodGhpcy5nZXRQcmVwYXJlZFRvdXJTdGVwKHRoaXMuX2N1cnJlbnRUb3VyU3RlcEluZGV4KSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJhY2tTdGVwKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX2NoZWNrU2VsZWN0b3JWYWxpZGl0eSgpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2d1aWRlZFRvdXJDdXJyZW50U3RlcFN1YmplY3QubmV4dCh0aGlzLmdldFByZXBhcmVkVG91clN0ZXAodGhpcy5fY3VycmVudFRvdXJTdGVwSW5kZXgpKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmJhY2tTdGVwKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuX2N1cnJlbnRUb3VyLm5leHRDYWxsYmFjaykge1xuICAgICAgICAgICAgICAgIHRoaXMuX2N1cnJlbnRUb3VyLnByZXZDYWxsYmFjayh0aGlzLl9jdXJyZW50VG91clN0ZXBJbmRleCwgdGhpcy5fY3VycmVudFRvdXIuc3RlcHNbdGhpcy5fY3VycmVudFRvdXJTdGVwSW5kZXhdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucmVzZXRUb3VyKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgc2tpcFRvdXIoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLl9jdXJyZW50VG91ci5za2lwQ2FsbGJhY2spIHtcbiAgICAgICAgICAgIHRoaXMuX2N1cnJlbnRUb3VyLnNraXBDYWxsYmFjayh0aGlzLl9jdXJyZW50VG91clN0ZXBJbmRleCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX2N1cnJlbnRUb3VyLmNsb3NlTW9kYWxDYWxsYmFjaykge1xuICAgICAgICAgICAgdGhpcy5fY3VycmVudFRvdXIuY2xvc2VNb2RhbENhbGxiYWNrKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yZXNldFRvdXIoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVzZXRUb3VyKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmRvbS5ib2R5LmNsYXNzTGlzdC5yZW1vdmUoJ3RvdXItb3BlbicpO1xuICAgICAgICB0aGlzLl9jdXJyZW50VG91ciA9IG51bGw7XG4gICAgICAgIHRoaXMuX2N1cnJlbnRUb3VyU3RlcEluZGV4ID0gMDtcbiAgICAgICAgdGhpcy5fZ3VpZGVkVG91ckN1cnJlbnRTdGVwU3ViamVjdC5uZXh0KG51bGwpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGFydFRvdXIodG91cjogR3VpZGVkVG91cik6IHZvaWQge1xuICAgICAgICB0aGlzLl9jdXJyZW50VG91ciA9IGNsb25lRGVlcCh0b3VyKTtcbiAgICAgICAgdGhpcy5fY3VycmVudFRvdXIuc3RlcHMgPSB0aGlzLl9jdXJyZW50VG91ci5zdGVwcy5maWx0ZXIoc3RlcCA9PiAhc3RlcC5za2lwU3RlcCk7XG4gICAgICAgIHRoaXMuX2N1cnJlbnRUb3VyU3RlcEluZGV4ID0gMDtcbiAgICAgICAgdGhpcy5fc2V0Rmlyc3RBbmRMYXN0KCk7XG4gICAgICAgIHRoaXMuX2d1aWRlZFRvdXJPcmJTaG93aW5nU3ViamVjdC5uZXh0KHRoaXMuX2N1cnJlbnRUb3VyLnVzZU9yYik7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHRoaXMuX2N1cnJlbnRUb3VyLnN0ZXBzLmxlbmd0aCA+IDBcbiAgICAgICAgICAgICYmICghdGhpcy5fY3VycmVudFRvdXIubWluaW11bVNjcmVlblNpemVcbiAgICAgICAgICAgICAgICB8fCAodGhpcy53aW5kb3dSZWYubmF0aXZlV2luZG93LmlubmVyV2lkdGggPj0gdGhpcy5fY3VycmVudFRvdXIubWluaW11bVNjcmVlblNpemUpKVxuICAgICAgICApIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5fY3VycmVudFRvdXIudXNlT3JiKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kb20uYm9keS5jbGFzc0xpc3QuYWRkKCd0b3VyLW9wZW4nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLl9jdXJyZW50VG91ci5zdGVwc1t0aGlzLl9jdXJyZW50VG91clN0ZXBJbmRleF0uYWN0aW9uKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fY3VycmVudFRvdXIuc3RlcHNbdGhpcy5fY3VycmVudFRvdXJTdGVwSW5kZXhdLmFjdGlvbigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuX2NoZWNrU2VsZWN0b3JWYWxpZGl0eSgpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZ3VpZGVkVG91ckN1cnJlbnRTdGVwU3ViamVjdC5uZXh0KHRoaXMuZ2V0UHJlcGFyZWRUb3VyU3RlcCh0aGlzLl9jdXJyZW50VG91clN0ZXBJbmRleCkpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLm5leHRTdGVwKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgYWN0aXZhdGVPcmIoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX2d1aWRlZFRvdXJPcmJTaG93aW5nU3ViamVjdC5uZXh0KGZhbHNlKTtcbiAgICAgICAgdGhpcy5kb20uYm9keS5jbGFzc0xpc3QuYWRkKCd0b3VyLW9wZW4nKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9zZXRGaXJzdEFuZExhc3QoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX29uTGFzdFN0ZXAgPSAodGhpcy5fY3VycmVudFRvdXIuc3RlcHMubGVuZ3RoIC0gMSkgPT09IHRoaXMuX2N1cnJlbnRUb3VyU3RlcEluZGV4O1xuICAgICAgICB0aGlzLl9vbkZpcnN0U3RlcCA9IHRoaXMuX2N1cnJlbnRUb3VyU3RlcEluZGV4ID09PSAwO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2NoZWNrU2VsZWN0b3JWYWxpZGl0eSgpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKHRoaXMuX2N1cnJlbnRUb3VyLnN0ZXBzW3RoaXMuX2N1cnJlbnRUb3VyU3RlcEluZGV4XS5zZWxlY3Rvcikge1xuICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWRFbGVtZW50ID0gdGhpcy5kb20ucXVlcnlTZWxlY3Rvcih0aGlzLl9jdXJyZW50VG91ci5zdGVwc1t0aGlzLl9jdXJyZW50VG91clN0ZXBJbmRleF0uc2VsZWN0b3IpO1xuICAgICAgICAgICAgaWYgKCFzZWxlY3RlZEVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmVycm9ySGFuZGxlci5oYW5kbGVFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgLy8gSWYgZXJyb3IgaGFuZGxlciBpcyBjb25maWd1cmVkIHRoaXMgc2hvdWxkIG5vdCBibG9jayB0aGUgYnJvd3Nlci5cbiAgICAgICAgICAgICAgICAgICAgbmV3IEVycm9yKGBFcnJvciBmaW5kaW5nIHNlbGVjdG9yICR7dGhpcy5fY3VycmVudFRvdXIuc3RlcHNbdGhpcy5fY3VycmVudFRvdXJTdGVwSW5kZXhdLnNlbGVjdG9yfSBvbiBzdGVwICR7dGhpcy5fY3VycmVudFRvdXJTdGVwSW5kZXggKyAxfSBkdXJpbmcgZ3VpZGVkIHRvdXI6ICR7dGhpcy5fY3VycmVudFRvdXIudG91cklkfWApXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBvbkxhc3RTdGVwKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fb25MYXN0U3RlcDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IG9uRmlyc3RTdGVwKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fb25GaXJzdFN0ZXA7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBvblJlc2l6ZU1lc3NhZ2UoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9vblJlc2l6ZU1lc3NhZ2U7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBjdXJyZW50VG91clN0ZXBEaXNwbGF5KCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jdXJyZW50VG91clN0ZXBJbmRleCArIDE7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBjdXJyZW50VG91clN0ZXBDb3VudCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5fY3VycmVudFRvdXIgJiYgdGhpcy5fY3VycmVudFRvdXIuc3RlcHMgPyB0aGlzLl9jdXJyZW50VG91ci5zdGVwcy5sZW5ndGggOiAwO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgcHJldmVudEJhY2tkcm9wRnJvbUFkdmFuY2luZygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2N1cnJlbnRUb3VyICYmIHRoaXMuX2N1cnJlbnRUb3VyLnByZXZlbnRCYWNrZHJvcEZyb21BZHZhbmNpbmc7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRQcmVwYXJlZFRvdXJTdGVwKGluZGV4OiBudW1iZXIpOiBUb3VyU3RlcCB7XG4gICAgICAgIHJldHVybiB0aGlzLnNldFRvdXJPcmllbnRhdGlvbih0aGlzLl9jdXJyZW50VG91ci5zdGVwc1tpbmRleF0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgc2V0VG91ck9yaWVudGF0aW9uKHN0ZXA6IFRvdXJTdGVwKTogVG91clN0ZXAge1xuICAgICAgICBjb25zdCBjb252ZXJ0ZWRTdGVwID0gY2xvbmVEZWVwKHN0ZXApO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICBjb252ZXJ0ZWRTdGVwLm9yaWVudGF0aW9uXG4gICAgICAgICAgICAmJiAhKHR5cGVvZiBjb252ZXJ0ZWRTdGVwLm9yaWVudGF0aW9uID09PSAnc3RyaW5nJylcbiAgICAgICAgICAgICYmIChjb252ZXJ0ZWRTdGVwLm9yaWVudGF0aW9uIGFzIE9yaWVudGF0aW9uQ29uZmlndXJhdGlvbltdKS5sZW5ndGhcbiAgICAgICAgKSB7XG4gICAgICAgICAgICAoY29udmVydGVkU3RlcC5vcmllbnRhdGlvbiBhcyBPcmllbnRhdGlvbkNvbmZpZ3VyYXRpb25bXSkuc29ydCgoYTogT3JpZW50YXRpb25Db25maWd1cmF0aW9uLCBiOiBPcmllbnRhdGlvbkNvbmZpZ3VyYXRpb24pID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIWIubWF4aW11bVNpemUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghYS5tYXhpbXVtU2l6ZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBiLm1heGltdW1TaXplIC0gYS5tYXhpbXVtU2l6ZTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBsZXQgY3VycmVudE9yaWVudGF0aW9uOiBPcmllbnRhdGlvbiA9IE9yaWVudGF0aW9uLlRvcDtcbiAgICAgICAgICAgIChjb252ZXJ0ZWRTdGVwLm9yaWVudGF0aW9uIGFzIE9yaWVudGF0aW9uQ29uZmlndXJhdGlvbltdKS5mb3JFYWNoKFxuICAgICAgICAgICAgICAgIChvcmllbnRhdGlvbkNvbmZpZzogT3JpZW50YXRpb25Db25maWd1cmF0aW9uKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghb3JpZW50YXRpb25Db25maWcubWF4aW11bVNpemUgfHwgdGhpcy53aW5kb3dSZWYubmF0aXZlV2luZG93LmlubmVyV2lkdGggPD0gb3JpZW50YXRpb25Db25maWcubWF4aW11bVNpemUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRPcmllbnRhdGlvbiA9IG9yaWVudGF0aW9uQ29uZmlnLm9yaWVudGF0aW9uRGlyZWN0aW9uO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgY29udmVydGVkU3RlcC5vcmllbnRhdGlvbiA9IGN1cnJlbnRPcmllbnRhdGlvbjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29udmVydGVkU3RlcDtcbiAgICB9XG59XG4iXX0=