UNPKG

ng-zorro-antd-mobile

Version:

An enterprise-class mobile UI components based on Ant Design and Angular

793 lines 75.7 kB
/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
 */
import { Component, ContentChildren, HostBinding, Input, Output, HostListener, QueryList, EventEmitter, ElementRef, ViewEncapsulation } from '@angular/core';
import { CarouselSlideComponent } from './carousel-slide/carousel-slide.component';
import * as touchEvent from '../core/util/touch-event';
export class CarouselComponent {
    /**
     * @param {?} _ele
     */
    constructor(_ele) {
        this._ele = _ele;
        this.style = {
            height: 'auto',
            width: '100%',
            transform: 'translate3d(0px, 0px, 0px)',
            margin: ''
        };
        this.lastIndex = 0;
        this.currentSelectedIndex = 0;
        this._nodeArr = [];
        this._isMouseDown = false;
        this._rationWidth = 0;
        this._currentSlideWidth = 0;
        this._currentSlideHeight = 0;
        this._transition = '';
        this._spaceWidth = 0;
        this._dragging = true;
        this._selectedIndex = 0;
        this.speed = 500;
        this.dots = true;
        this.vertical = false;
        this.autoplay = false;
        this.autoplayInterval = 3000;
        this.infinite = false;
        this.dotStyle = {};
        this.dotActiveStyle = {};
        this.frameOverflow = 'hidden';
        this.cellSpacing = 0;
        this.slideWidth = 1;
        this.swipeSpeed = 12;
        this.dragging = true;
        this.afterChange = new EventEmitter();
        this.beforeChange = new EventEmitter();
        this.carouselWrapper = true;
        this.carouselwrap = true;
    }
    /**
     * @return {?}
     */
    get selectedIndex() {
        return this._selectedIndex;
    }
    /**
     * @param {?} value
     * @return {?}
     */
    set selectedIndex(value) {
        this._selectedIndex = Math.abs(value);
        if (this._nodeArr.length > 0) {
            this.carousel(1);
        }
    }
    /**
     * @param {?} event
     * @return {?}
     */
    panstart(event) {
        event.stopPropagation();
        if (!this._dragging) {
            return;
        }
        this.stopTimer();
        this._isMouseDown = true;
        this.touchObject = {
            startX: touchEvent.getEventTarget(event).pageX,
            startY: touchEvent.getEventTarget(event).pageY,
            direction: this.touchObject.direction
        };
    }
    /**
     * @param {?} event
     * @return {?}
     */
    panmove(event) {
        event.stopPropagation();
        if (!this._dragging || !this._isMouseDown) {
            return;
        }
        const { direction } = this.swipeDirection(this.touchObject.startX, touchEvent.getEventTarget(event).pageX, this.touchObject.startY, touchEvent.getEventTarget(event).pageY);
        /** @type {?} */
        const length = this.vertical
            ? Math.abs(touchEvent.getEventTarget(event).pageY - this.touchObject.startY)
            : Math.abs(touchEvent.getEventTarget(event).pageX - this.touchObject.startX);
        /** @type {?} */
        const offset = -this.touchObject.direction * length - this.currentSelectedIndex * this._rationWidth;
        this.touchObject = {
            startX: this.touchObject.startX,
            startY: this.touchObject.startY,
            endX: touchEvent.getEventTarget(event).pageX,
            endY: touchEvent.getEventTarget(event).pageY,
            length,
            direction,
            offset
        };
        if (direction !== 0) {
            this.setSlideStyles(this.currentSelectedIndex, this.touchObject.direction);
        }
        this.getListStyles(offset);
    }
    /**
     * @param {?} event
     * @return {?}
     */
    panend(event) {
        event.stopPropagation();
        if (!this._dragging || !this._isMouseDown || !this.touchObject.length || this.touchObject.length === undefined) {
            this._isMouseDown = false;
            return;
        }
        this._isMouseDown = false;
        if (this.touchObject.length > this.swipeSpeed) {
            this.carousel(this.touchObject.direction);
        }
        else {
            this.getListStyles(this.touchObject.direction * this.touchObject.length + this.touchObject.offset);
            this.style['transition'] = this._transition;
        }
        setTimeout((/**
         * @return {?}
         */
        () => {
            this.startTimer();
        }), this.speed);
    }
    /**
     * @return {?}
     */
    cancel() {
        setTimeout((/**
         * @return {?}
         */
        () => {
            this.startTimer();
        }), this.speed);
    }
    /**
     * @return {?}
     */
    resize() {
        if (this._resizeTimer) {
            clearTimeout(this._resizeTimer);
        }
        this._resizeTimer = setTimeout((/**
         * @return {?}
         */
        () => {
            this.ngAfterViewInit();
            clearTimeout(this._resizeTimer);
        }), 200);
    }
    /**
     * @return {?}
     */
    initCarouselSize() {
        /** @type {?} */
        const nativeElement = this._ele.nativeElement;
        this.slideHeight = nativeElement.querySelector('carouselslide').clientHeight;
        this._currentSlideHeight = this.slideHeight * this.slideWidth;
        this._currentSlideWidth = nativeElement.clientWidth;
        this._rationWidth = this.vertical ? this._currentSlideHeight : this._currentSlideWidth * this.slideWidth;
        this._spaceWidth = ((this.vertical ? this.slideHeight : this._currentSlideWidth) - this._rationWidth) / 2;
    }
    /**
     * @param {?} items
     * @return {?}
     */
    carouselInit(items) {
        this.infinite = this.infinite || true;
        this._nodeArr = items['_results'];
        /** @type {?} */
        const shouldDragging = this._nodeArr.length > 1;
        this._dragging = this.dragging && shouldDragging ? true : false;
        if (this._nodeArr.length > 1) {
            this.lastIndex = this._nodeArr.length - 1;
            setTimeout((/**
             * @return {?}
             */
            () => {
                this._nodeArr.forEach((/**
                 * @param {?} v
                 * @param {?} index
                 * @return {?}
                 */
                (v, index) => {
                    v.width = this.vertical ? 'auto' : this._rationWidth - this.cellSpacing;
                    v.left = this.vertical ? 0 : index === this.lastIndex ? -this._rationWidth : index * this._rationWidth;
                    v.top = this.vertical ? (index === this.lastIndex ? -this._rationWidth : index * this._rationWidth) : 0;
                    v.margin = this.vertical ? `${this.cellSpacing / 2}px auto` : `auto ${this.cellSpacing / 2}px`;
                }));
                this.startTimer();
            }), 0);
        }
        else if (this._nodeArr.length === 1) {
            setTimeout((/**
             * @return {?}
             */
            () => {
                this._nodeArr.forEach((/**
                 * @param {?} v
                 * @return {?}
                 */
                v => {
                    v.width = this.vertical ? 'auto' : this._rationWidth - this.cellSpacing;
                    v.left = 0;
                    v.top = 0;
                    v.margin = `auto ${this.cellSpacing / 2}px`;
                }));
            }), 0);
        }
    }
    /**
     * @return {?}
     */
    startTimer() {
        if (!this.autoplay) {
            return;
        }
        this.stopTimer();
        this._timer = this.autoplayInterval
            ? setInterval((/**
             * @return {?}
             */
            () => {
                if (document.getElementsByTagName('carousel').length === 0) {
                    return;
                }
                this.carousel(1);
            }), this.autoplayInterval)
            : 0;
    }
    /**
     * @return {?}
     */
    stopTimer() {
        clearInterval(this._timer);
    }
    /**
     * @param {?} moveDirection
     * @return {?}
     */
    carousel(moveDirection) {
        if (this.vertical) {
            if (moveDirection === 1) {
                this.moveUp();
            }
            else if (moveDirection === -1) {
                this.moveDown();
            }
        }
        else {
            if (moveDirection === 1) {
                this.moveLeft();
            }
            else if (moveDirection === -1) {
                this.moveRight();
            }
        }
        this.style['transition'] = this._transition;
    }
    /**
     * @return {?}
     */
    moveUp() {
        this.gotoCarousel(this.getAfterNode(false));
    }
    /**
     * @return {?}
     */
    moveDown() {
        this.gotoCarousel(this.getAfterNode(true));
    }
    /**
     * @return {?}
     */
    moveLeft() {
        this.gotoCarousel(this.getAfterNode(false));
    }
    /**
     * @return {?}
     */
    moveRight() {
        this.gotoCarousel(this.getAfterNode(true));
    }
    /**
     * @param {?} pre
     * @return {?}
     */
    getAfterNode(pre) {
        /** @type {?} */
        let nextIndex;
        if (pre) {
            if (this.currentSelectedIndex <= 0) {
                this.getListStyles(this._rationWidth);
                setTimeout((/**
                 * @return {?}
                 */
                () => {
                    this._nodeArr.forEach((/**
                     * @param {?} v
                     * @param {?} tempIndex
                     * @return {?}
                     */
                    (v, tempIndex) => {
                        if (tempIndex === 0) {
                            v.left = this.vertical ? 0 : this._nodeArr.length * this._rationWidth;
                            v.top = this.vertical ? this._nodeArr.length * this._rationWidth : 0;
                        }
                        else {
                            v.left = this.vertical ? 0 : tempIndex * this._rationWidth;
                            v.top = this.vertical ? tempIndex * this._rationWidth : 0;
                        }
                    }));
                    this.getListStyles(-this._rationWidth * (this.items.length - 1));
                }), this.speed);
                nextIndex = !this.infinite ? null : this.lastIndex;
                this.beforeChange.emit({ from: this.currentSelectedIndex, to: nextIndex });
                return nextIndex;
            }
            nextIndex = this.currentSelectedIndex - 1;
            this.getListStyles(nextIndex * this._rationWidth * this.touchObject.direction);
            this._nodeArr.forEach((/**
             * @param {?} v
             * @param {?} tempIndex
             * @return {?}
             */
            (v, tempIndex) => {
                if (0 === tempIndex && nextIndex === this._nodeArr.length - 2) {
                    v.left = 0;
                    v.top = 0;
                }
            }));
            this.beforeChange.emit({ from: this.currentSelectedIndex, to: nextIndex });
            return nextIndex;
        }
        else {
            if (this.currentSelectedIndex >= this.lastIndex) {
                this.setSlideStyles(this.currentSelectedIndex, 1);
                this.getListStyles(-(this.lastIndex + 1) * this._rationWidth);
                nextIndex = !this.infinite ? null : 0;
                this.beforeChange.emit({ from: this.currentSelectedIndex, to: nextIndex });
                return nextIndex;
            }
            nextIndex = this.currentSelectedIndex + 1;
            this.setSlideStyles(this.currentSelectedIndex, 1);
            this.getListStyles(-nextIndex * this._rationWidth);
            this.beforeChange.emit({ from: this.currentSelectedIndex, to: nextIndex });
            return nextIndex;
        }
    }
    /**
     * @return {?}
     */
    caculateDirectionLeftCurrentIndex() {
        /** @type {?} */
        const previousIndex = this.currentSelectedIndex;
        this.currentSelectedIndex = (previousIndex + 1) % this.items.length;
    }
    /**
     * @return {?}
     */
    caculateDirectionRightCurrentIndex() {
        if (this.currentSelectedIndex === 0) {
            this.currentSelectedIndex = this.items.length;
        }
        /** @type {?} */
        const previousIndex = this.currentSelectedIndex;
        this.currentSelectedIndex = (previousIndex - 1) % this.items.length;
    }
    /**
     * @param {?} afterIndex
     * @return {?}
     */
    gotoCarousel(afterIndex) {
        if (afterIndex === null) {
            return;
        }
        this.getCurrentIndex();
        if (afterIndex === 0) {
            setTimeout((/**
             * @return {?}
             */
            () => {
                this._nodeArr.forEach((/**
                 * @param {?} v
                 * @param {?} index
                 * @return {?}
                 */
                (v, index) => {
                    if (index === this._nodeArr.length - 1) {
                        v.left = this.vertical ? 0 : -this._rationWidth;
                        v.top = this.vertical ? -this._rationWidth : 0;
                    }
                    else {
                        v.left = this.vertical ? 0 : index * this._rationWidth;
                        v.top = this.vertical ? index * this._rationWidth : 0;
                    }
                }));
                this.startTimer();
                this.getListStyles(0);
            }), this.speed);
        }
        this.currentSelectedIndex = afterIndex;
        this.afterChange.emit(this.currentSelectedIndex);
    }
    /**
     * @return {?}
     */
    getCurrentIndex() {
        if (this.touchObject.direction === 1) {
            this.caculateDirectionLeftCurrentIndex();
        }
        else {
            this.caculateDirectionRightCurrentIndex();
        }
    }
    /**
     * @param {?} index
     * @param {?} direction
     * @param {?=} xDist
     * @return {?}
     */
    setSlideStyles(index, direction, xDist = 0) {
        if (direction === 1) {
            this._nodeArr.forEach((/**
             * @param {?} v
             * @param {?} tempIndex
             * @return {?}
             */
            (v, tempIndex) => {
                if (index < this._nodeArr.length && index - 1 === tempIndex) {
                    if (xDist === 0 || xDist > this._spaceWidth) {
                        v.left = this.vertical ? 0 : (this._nodeArr.length + tempIndex) * this._rationWidth;
                        v.top = this.vertical ? (this._nodeArr.length + tempIndex) * this._rationWidth : 0;
                    }
                }
                else if (this._nodeArr.length - 1 === tempIndex && index !== 2) {
                    if (xDist === 0 || xDist > this._spaceWidth) {
                        v.left = this.vertical ? 0 : (this._nodeArr.length - 1) * this._rationWidth;
                        v.top = this.vertical ? (this._nodeArr.length - 1) * this._rationWidth : 0;
                    }
                }
                else if (index === this._nodeArr.length - 1 && tempIndex === 1 && this.autoplay) {
                    v.left = this.vertical ? 0 : (this._nodeArr.length + tempIndex) * this._rationWidth;
                    v.top = this.vertical ? tempIndex * this._rationWidth : 0;
                }
                else if (index === this._nodeArr.length - 1 && tempIndex === 0 && !this.autoplay) {
                    v.left = this.vertical ? 0 : (this._nodeArr.length + tempIndex) * this._rationWidth;
                    v.top = this.vertical ? tempIndex * this._rationWidth : 0;
                }
            }));
        }
        else if (direction === -1) {
            this._nodeArr.forEach((/**
             * @param {?} v
             * @param {?} tempIndex
             * @return {?}
             */
            (v, tempIndex) => {
                if (index === 0 && this._nodeArr.length - 1 === tempIndex) {
                    v.left = this.vertical ? 0 : direction * this._rationWidth;
                    v.top = this.vertical ? direction * this._rationWidth : 0;
                }
                else if (index === this._nodeArr.length - 2 && index + 1 === tempIndex) {
                    v.left = this.vertical ? 0 : direction * this._rationWidth;
                    v.top = this.vertical ? direction * this._rationWidth : 0;
                }
                else if (index === 1 && 0 === tempIndex) {
                    v.left = this.vertical ? 0 : direction * this._rationWidth * tempIndex;
                    v.top = this.vertical ? direction * this._rationWidth : 0;
                }
                else if (index > 1) {
                    v.left = this.vertical ? 0 : tempIndex * this._rationWidth;
                    v.top = this.vertical ? tempIndex * this._rationWidth : 0;
                }
            }));
        }
    }
    /**
     * @param {?=} offset
     * @return {?}
     */
    getListStyles(offset = 0) {
        /** @type {?} */
        const positionOffset = offset +
            (this.vertical
                ? (this.slideHeight - this._currentSlideHeight) / 2
                : (this._currentSlideWidth - this._rationWidth) / 2) -
            this.cellSpacing;
        this.style = {
            height: this._currentSlideHeight + 'px',
            width: this.vertical ? this._currentSlideWidth + 'px' : this.items.length * this._rationWidth + 'px',
            transform: this.vertical
                ? `translate3d(0px, ${positionOffset}px, 0px)`
                : `translate3d(${positionOffset}px, 0px, 0px)`,
            margin: this.vertical ? `${(this.cellSpacing / 2) * -1}px 0px` : `0px ${(this.cellSpacing / 2) * -1}px`
        };
    }
    /**
     * @param {?} x1
     * @param {?} x2
     * @param {?} y1
     * @param {?} y2
     * @return {?}
     */
    swipeDirection(x1, x2, y1, y2) {
        /** @type {?} */
        const xDist = x1 - x2;
        /** @type {?} */
        const yDist = y1 - y2;
        /** @type {?} */
        const r = Math.atan2(yDist, xDist);
        /** @type {?} */
        let swipeAngle = Math.round((r * 180) / Math.PI);
        if (swipeAngle < 0) {
            swipeAngle = 360 - Math.abs(swipeAngle);
        }
        if (swipeAngle <= 45 && swipeAngle >= 0) {
            return {
                direction: 1,
                xDist: xDist
            };
        }
        if (swipeAngle <= 360 && swipeAngle >= 315) {
            return {
                direction: 1,
                xDist: xDist
            };
        }
        if (swipeAngle >= 135 && swipeAngle <= 225) {
            return {
                direction: -1,
                xDist: xDist
            };
        }
        if (this.vertical === true) {
            if (swipeAngle >= 35 + 33 && swipeAngle <= 135) {
                return {
                    direction: 1,
                    xDist: xDist
                };
            }
            else {
                return {
                    direction: -1,
                    xDist: xDist
                };
            }
        }
        return {
            direction: 0,
            xDist: xDist
        };
    }
    /**
     * @return {?}
     */
    get page() {
        return this.dots ? this.currentSelectedIndex : 0;
    }
    /**
     * @return {?}
     */
    get pageCount() {
        return this.dots ? this.items.length : 0;
    }
    /**
     * @return {?}
     */
    get dotindicatorStatus() {
        return this.dots ? this.items.length > 1 : this.dots;
    }
    /**
     * @return {?}
     */
    ngAfterViewInit() {
        this.touchObject = { direction: 1 };
        this._transition = `transform ${this.speed / 1000}s`;
        this.items.changes.subscribe((/**
         * @param {?} items
         * @return {?}
         */
        items => {
            this.carouselInit(items);
        }));
        this.initCarouselSize();
        this.selectedIndex = this.items.length - 1 < this.selectedIndex ? 0 : this.selectedIndex;
        /** @type {?} */
        const index = this.items.length > 1 ? (this.items.length - 1 === this.selectedIndex ? -1 : this.selectedIndex) : 0;
        setTimeout((/**
         * @return {?}
         */
        () => {
            this.currentSelectedIndex = this.selectedIndex;
        }), 0);
        this.getListStyles(-index * this._rationWidth);
        this.carouselInit(this.items);
        /** @type {?} */
        const nativeElement = this._ele.nativeElement;
        /** @type {?} */
        const targetNode = nativeElement.querySelector('carouselslide');
        /** @type {?} */
        const config = { attributes: true, childList: true, subtree: true };
        /** @type {?} */
        const callback = (/**
         * @param {?} mutationsList
         * @return {?}
         */
        mutationsList => {
            for (const mutation of mutationsList) {
                if (mutation.type == 'attributes') {
                    if (this.slideHeight !== nativeElement.querySelector('carouselslide').clientHeight) {
                        this.initCarouselSize();
                        this.getListStyles(-index * this._rationWidth);
                        this.carouselInit(this.items);
                    }
                }
            }
        });
        this._observer = new MutationObserver(callback);
        this._observer.observe(targetNode, config);
    }
    /**
     * @return {?}
     */
    ngOnDestroy() {
        this._observer.disconnect();
        this._observer = null;
        this.stopTimer();
    }
}
CarouselComponent.decorators = [
    { type: Component, args: [{
                selector: 'Carousel, nzm-carousel',
                encapsulation: ViewEncapsulation.None,
                template: "<div class=\"slider-frame\" [ngStyle]=\"{ overflow: frameOverflow }\">\n  <ul class=\"slider-list\" [ngStyle]=\"style\">\n    <ng-content></ng-content>\n  </ul>\n</div>\n<DotIndicator\n  *ngIf=\"dotindicatorStatus\"\n  class=\"am-carousel-wrap-dot\"\n  [page]=\"page\"\n  [dotStyle]=\"dotStyle\"\n  [pageCount]=\"pageCount\"\n  [dotActiveStyle]=\"dotActiveStyle\"\n></DotIndicator>\n"
            }] }
];
/** @nocollapse */
CarouselComponent.ctorParameters = () => [
    { type: ElementRef }
];
CarouselComponent.propDecorators = {
    items: [{ type: ContentChildren, args: [CarouselSlideComponent,] }],
    speed: [{ type: Input }],
    dots: [{ type: Input }],
    vertical: [{ type: Input }],
    autoplay: [{ type: Input }],
    autoplayInterval: [{ type: Input }],
    infinite: [{ type: Input }],
    dotStyle: [{ type: Input }],
    dotActiveStyle: [{ type: Input }],
    frameOverflow: [{ type: Input }],
    cellSpacing: [{ type: Input }],
    slideWidth: [{ type: Input }],
    swipeSpeed: [{ type: Input }],
    dragging: [{ type: Input }],
    selectedIndex: [{ type: Input }],
    afterChange: [{ type: Output }],
    beforeChange: [{ type: Output }],
    carouselWrapper: [{ type: HostBinding, args: ['class.am-carousel',] }],
    carouselwrap: [{ type: HostBinding, args: ['class.carousel',] }],
    panstart: [{ type: HostListener, args: ['mousedown', ['$event'],] }, { type: HostListener, args: ['touchstart', ['$event'],] }],
    panmove: [{ type: HostListener, args: ['mousemove', ['$event'],] }, { type: HostListener, args: ['touchmove', ['$event'],] }],
    panend: [{ type: HostListener, args: ['mouseleave', ['$event'],] }, { type: HostListener, args: ['mouseup', ['$event'],] }, { type: HostListener, args: ['touchend', ['$event'],] }],
    cancel: [{ type: HostListener, args: ['touchcancel',] }],
    resize: [{ type: HostListener, args: ['window:resize',] }]
};
if (false) {
    /** @type {?} */
    CarouselComponent.prototype.slideHeight;
    /** @type {?} */
    CarouselComponent.prototype.touchObject;
    /** @type {?} */
    CarouselComponent.prototype.style;
    /** @type {?} */
    CarouselComponent.prototype.lastIndex;
    /** @type {?} */
    CarouselComponent.prototype.currentSelectedIndex;
    /**
     * @type {?}
     * @private
     */
    CarouselComponent.prototype._timer;
    /**
     * @type {?}
     * @private
     */
    CarouselComponent.prototype._resizeTimer;
    /**
     * @type {?}
     * @private
     */
    CarouselComponent.prototype._nodeArr;
    /**
     * @type {?}
     * @private
     */
    CarouselComponent.prototype._isMouseDown;
    /**
     * @type {?}
     * @private
     */
    CarouselComponent.prototype._rationWidth;
    /**
     * @type {?}
     * @private
     */
    CarouselComponent.prototype._currentSlideWidth;
    /**
     * @type {?}
     * @private
     */
    CarouselComponent.prototype._currentSlideHeight;
    /**
     * @type {?}
     * @private
     */
    CarouselComponent.prototype._transition;
    /**
     * @type {?}
     * @private
     */
    CarouselComponent.prototype._spaceWidth;
    /**
     * @type {?}
     * @private
     */
    CarouselComponent.prototype._observer;
    /**
     * @type {?}
     * @private
     */
    CarouselComponent.prototype._dragging;
    /**
     * @type {?}
     * @private
     */
    CarouselComponent.prototype._selectedIndex;
    /** @type {?} */
    CarouselComponent.prototype.items;
    /** @type {?} */
    CarouselComponent.prototype.speed;
    /** @type {?} */
    CarouselComponent.prototype.dots;
    /** @type {?} */
    CarouselComponent.prototype.vertical;
    /** @type {?} */
    CarouselComponent.prototype.autoplay;
    /** @type {?} */
    CarouselComponent.prototype.autoplayInterval;
    /** @type {?} */
    CarouselComponent.prototype.infinite;
    /** @type {?} */
    CarouselComponent.prototype.dotStyle;
    /** @type {?} */
    CarouselComponent.prototype.dotActiveStyle;
    /** @type {?} */
    CarouselComponent.prototype.frameOverflow;
    /** @type {?} */
    CarouselComponent.prototype.cellSpacing;
    /** @type {?} */
    CarouselComponent.prototype.slideWidth;
    /** @type {?} */
    CarouselComponent.prototype.swipeSpeed;
    /** @type {?} */
    CarouselComponent.prototype.dragging;
    /** @type {?} */
    CarouselComponent.prototype.afterChange;
    /** @type {?} */
    CarouselComponent.prototype.beforeChange;
    /** @type {?} */
    CarouselComponent.prototype.carouselWrapper;
    /** @type {?} */
    CarouselComponent.prototype.carouselwrap;
    /**
     * @type {?}
     * @private
     */
    CarouselComponent.prototype._ele;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2Fyb3VzZWwuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmctem9ycm8tYW50ZC1tb2JpbGUvIiwic291cmNlcyI6WyJjYXJvdXNlbC9jYXJvdXNlbC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsZUFBZSxFQUNmLFdBQVcsRUFDWCxLQUFLLEVBQ0wsTUFBTSxFQUNOLFlBQVksRUFDWixTQUFTLEVBQ1QsWUFBWSxFQUVaLFVBQVUsRUFFVixpQkFBaUIsRUFDbEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sMkNBQTJDLENBQUM7QUFDbkYsT0FBTyxLQUFLLFVBQVUsTUFBTSwwQkFBMEIsQ0FBQztBQU92RCxNQUFNLE9BQU8saUJBQWlCOzs7O0lBbUs1QixZQUFvQixJQUFnQjtRQUFoQixTQUFJLEdBQUosSUFBSSxDQUFZO1FBaEtwQyxVQUFLLEdBQUc7WUFDTixNQUFNLEVBQUUsTUFBTTtZQUNkLEtBQUssRUFBRSxNQUFNO1lBQ2IsU0FBUyxFQUFFLDRCQUE0QjtZQUN2QyxNQUFNLEVBQUUsRUFBRTtTQUNYLENBQUM7UUFDRixjQUFTLEdBQVcsQ0FBQyxDQUFDO1FBQ3RCLHlCQUFvQixHQUFXLENBQUMsQ0FBQztRQUl6QixhQUFRLEdBQWUsRUFBRSxDQUFDO1FBQzFCLGlCQUFZLEdBQVksS0FBSyxDQUFDO1FBQzlCLGlCQUFZLEdBQVcsQ0FBQyxDQUFDO1FBQ3pCLHVCQUFrQixHQUFXLENBQUMsQ0FBQztRQUMvQix3QkFBbUIsR0FBVyxDQUFDLENBQUM7UUFDaEMsZ0JBQVcsR0FBVyxFQUFFLENBQUM7UUFDekIsZ0JBQVcsR0FBVyxDQUFDLENBQUM7UUFFeEIsY0FBUyxHQUFZLElBQUksQ0FBQztRQUMxQixtQkFBYyxHQUFXLENBQUMsQ0FBQztRQU1uQyxVQUFLLEdBQVcsR0FBRyxDQUFDO1FBRXBCLFNBQUksR0FBWSxJQUFJLENB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LFdBQVcsQ0FBQyxNQUFNO1lBQy9CLE1BQU0sRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU07WUFDL0IsSUFBSSxFQUFFLFVBQVUsQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSztZQUM1QyxJQUFJLEVBQUUsVUFBVSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLO1lBQzVDLE1BQU07WUFDTixTQUFTO1lBQ1QsTUFBTTtTQUNQLENBQUM7UUFDRixJQUFJLFNBQVMsS0FBSyxDQUFDLEVBQUU7WUFDbkIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQztTQUM1RTtRQUVELElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDN0IsQ0FBQzs7Ozs7SUFLRCxNQUFNLENBQUMsS0FBSztRQUNWLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUN4QixJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sS0FBSyxTQUFTLEVBQUU7WUFDOUcsSUFBSSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUM7WUFDMUIsT0FBTztTQUNSO1FBQ0QsSUFBSSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUM7UUFDMUIsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsVUFBVSxFQUFFO1lBQzdDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQztTQUMzQzthQUFNO1lBQ0wsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0s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QUUsU0FBUyxFQUFFLEVBQUU7Z0JBQ3JDLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxJQUFJLEtBQUssR0FBRyxDQUFDLEtBQUssU0FBUyxFQUFFO29CQUMzRCxJQUFJLEtBQUssS0FBSyxDQUFDLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUU7d0JBQzNDLENBQUMsQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLFNBQVMsQ0FBQyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUM7d0JBQ3BGLENBQUMsQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxTQUFTLENBQUMsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7cUJBQ3BGO2lCQUNGO3FCQUFNLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxLQUFLLFNBQVMsSUFBSSxLQUFLLEtBQUssQ0FBQyxFQUFFO29CQUNoRSxJQUFJLEtBQUssS0FBSyxDQUFDLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUU7d0JBQzNDLENBQUMsQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUM7d0JBQzVFLENBQUMsQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7cUJBQzVFO2lCQUNGO3FCQUFNLElBQUksS0FBSyxLQUFLLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxTQUFTLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7b0JBQ2pGLENBQUMsQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLFNBQVMsQ0FBQyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUM7b0JBQ3BGLENBQUMsQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDM0Q7cUJBQU0sSUFBSSxLQUFLLEtBQUssSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLFNBQVMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFO29CQUNsRixDQUFDLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxTQUFTLENBQUMsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDO29CQUNwRixDQUFDLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQzNEO1lBQ0gsQ0FBQyxFQUFDLENBQUM7U0FDSjthQUFNLElBQUksU0FBUyxLQUFLLENBQUMsQ0FBQyxFQUFFO1lBQzNCLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTzs7Ozs7WUFBQyxDQUFDLENBQUMsRUFBRSxTQUFTLEVBQUUsRUFBRTtnQkFDckMsSUFBSSxLQUFLLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsS0FBSyxTQUFTLEVBQUU7b0JBQ3pELENBQUMsQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQztvQkFDM0QsQ0FBQyxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUMzRDtxQkFBTSxJQUFJLEtBQUssS0FBSyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksS0FBSyxHQUFHLENBQUMsS0FBSyxTQUFTLEVBQUU7b0JBQ3hFLENBQUMsQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQztvQkFDM0QsQ0FBQyxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUMzRDtxQkFBTSxJQUFJLEtBQUssS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLFNBQVMsRUFBRTtvQkFDekMsQ0FBQyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsWUFBWSxHQUFHLFNBQVMsQ0FBQztvQkFDdkUsQ0FBQyxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUMzRDtxQkFBTSxJQUFJLEtBQUssR0FBRyxDQUFD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cmVuLFxuICBIb3N0QmluZGluZyxcbiAgSW5wdXQsXG4gIE91dHB1dCxcbiAgSG9zdExpc3RlbmVyLFxuICBRdWVyeUxpc3QsXG4gIEV2ZW50RW1pdHRlcixcbiAgT25EZXN0cm95LFxuICBFbGVtZW50UmVmLFxuICBBZnRlclZpZXdJbml0LFxuICBWaWV3RW5jYXBzdWxhdGlvblxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENhcm91c2VsU2xpZGVDb21wb25lbnQgfSBmcm9tICcuL2Nhcm91c2VsLXNsaWRlL2Nhcm91c2VsLXNsaWRlLmNvbXBvbmVudCc7XG5pbXBvcnQgKiBhcyB0b3VjaEV2ZW50IGZyb20gJy4uL2NvcmUvdXRpbC90b3VjaC1ldmVudCc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ0Nhcm91c2VsLCBuem0tY2Fyb3VzZWwnLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICB0ZW1wbGF0ZVVybDogJy4vY2Fyb3VzZWwuY29tcG9uZW50Lmh0bWwnXG59KVxuZXhwb3J0IGNsYXNzIENhcm91c2VsQ29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcbiAgc2xpZGVIZWlnaHQ6IG51bWJlcjtcbiAgdG91Y2hPYmplY3Q7XG4gIHN0eWxlID0ge1xuICAgIGhlaWdodDogJ2F1dG8nLFxuICAgIHdpZHRoOiAnMTAwJScsXG4gICAgdHJhbnNmb3JtOiAndHJhbnNsYXRlM2QoMHB4LCAwcHgsIDBweCknLFxuICAgIG1hcmdpbjogJydcbiAgfTtcbiAgbGFzdEluZGV4OiBudW1iZXIgPSAwO1xuICBjdXJyZW50U2VsZWN0ZWRJbmRleDogbnVtYmVyID0gMDtcblxuICBwcml2YXRlIF90aW1lcjogYW55O1xuICBwcml2YXRlIF9yZXNpemVUaW1lcjogYW55O1xuICBwcml2YXRlIF9ub2RlQXJyOiBBcnJheTxhbnk+ID0gW107XG4gIHByaXZhdGUgX2lzTW91c2VEb3duOiBib29sZWFuID0gZmFsc2U7XG4gIHByaXZhdGUgX3JhdGlvbldpZHRoOiBudW1iZXIgPSAwO1xuICBwcml2YXRlIF9jdXJyZW50U2xpZGVXaWR0aDogbnVtYmVyID0gMDtcbiAgcHJpdmF0ZSBfY3VycmVudFNsaWRlSGVpZ2h0OiBudW1iZXIgPSAwO1xuICBwcml2YXRlIF90cmFuc2l0aW9uOiBzdHJpbmcgPSAnJztcbiAgcHJpdmF0ZSBfc3BhY2VXaWR0aDogbnVtYmVyID0gMDtcbiAgcHJpdmF0ZSBfb2JzZXJ2ZXI6IE11dGF0aW9uT2JzZXJ2ZXI7XG4gIHByaXZhdGUgX2RyYWdnaW5nOiBib29sZWFuID0gdHJ1ZTtcbiAgcHJpdmF0ZSBfc2VsZWN0ZWRJbmRleDogbnVtYmVyID0gMDtcblxuICBAQ29udGVudENoaWxkcmVuKENhcm91c2VsU2xpZGVDb21wb25lbnQpXG4gIGl0ZW1zOiBRdWVyeUxpc3Q8Q2Fyb3VzZWxTbGlkZUNvbXBvbmVudD47XG5cbiAgQElucHV0KClcbiAgc3BlZWQ6IG51bWJlciA9IDUwMDtcbiAgQElucHV0KClcbiAgZG90czogYm9vbGVhbiA9IHRydWU7XG4gIEBJbnB1dCgpXG4gIHZlcnRpY2FsOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpXG4gIGF1dG9wbGF5OiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpXG4gIGF1dG9wbGF5SW50ZXJ2YWw6IGFueSA9IDMwMDA7XG4gIEBJbnB1dCgpXG4gIGluZmluaXRlOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpXG4gIGRvdFN0eWxlOiBvYmplY3QgPSB7fTtcbiAgQElucHV0KClcbiAgZG90QWN0aXZlU3R5bGU6IG9iamVjdCA9IHt9O1xuICBASW5wdXQoKVxuICBmcmFtZU92ZXJmbG93OiBzdHJpbmcgPSAnaGlkZGVuJztcbiAgQElucHV0KClcbiAgY2VsbFNwYWNpbmc6IG51bWJlciA9IDA7XG4gIEBJbnB1dCgpXG4gIHNsaWRlV2lkdGg6IG51bWJlciA9IDE7XG4gIEBJbnB1dCgpXG4gIHN3aXBlU3BlZWQ6IG51bWJlciA9IDEyO1xuICBASW5wdXQoKVxuICBkcmFnZ2luZzogYm9vbGVhbiA9IHRydWU7XG4gIEBJbnB1dCgpXG4gIGdldCBzZWxlY3RlZEluZGV4KCkge1xuICAgIHJldHVybiB0aGlzLl9zZWxlY3RlZEluZGV4O1xuICB9XG4gIHNldCBzZWxlY3RlZEluZGV4KHZhbHVlKSB7XG4gICAgdGhpcy5fc2VsZWN0ZWRJbmRleCA9IE1hdGguYWJzKHZhbHVlKTtcbiAgICBpZiAodGhpcy5fbm9kZUFyci5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLmNhcm91c2VsKDEpO1xuICAgIH1cbiAgfVxuICBAT3V0cHV0KClcbiAgYWZ0ZXJDaGFuZ2U6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KClcbiAgYmVmb3JlQ2hhbmdlOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmFtLWNhcm91c2VsJylcbiAgY2Fyb3VzZWxXcmFwcGVyOiBib29sZWFuID0gdHJ1ZTtcbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5jYXJvdXNlbCcpXG4gIGNhcm91c2Vsd3JhcDogYm9vbGVhbiA9IHRydWU7XG5cbiAgQEhvc3RMaXN0ZW5lcignbW91c2Vkb3duJywgWyckZXZlbnQnXSlcbiAgQEhvc3RMaXN0ZW5lcigndG91Y2hzdGFydCcsIFsnJGV2ZW50J10pXG4gIHBhbnN0YXJ0KGV2ZW50KSB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgaWYgKCF0aGlzLl9kcmFnZ2luZykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnN0b3BUaW1lcigpO1xuICAgIHRoaXMuX2lzTW91c2VEb3duID0gdHJ1ZTtcbiAgICB0aGlzLnRvdWNoT2JqZWN0ID0ge1xuICAgICAgc3RhcnRYOiB0b3VjaEV2ZW50LmdldEV2ZW50VGFyZ2V0KGV2ZW50KS5wYWdlWCxcbiAgICAgIHN0YXJ0WTogdG91Y2hFdmVudC5nZXRFdmVudFRhcmdldChldmVudCkucGFnZVksXG4gICAgICBkaXJlY3Rpb246IHRoaXMudG91Y2hPYmplY3QuZGlyZWN0aW9uXG4gICAgfTtcbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ21vdXNlbW92ZScsIFsnJGV2ZW50J10pXG4gIEBIb3N0TGlzdGVuZXIoJ3RvdWNobW92ZScsIFsnJGV2ZW50J10pXG4gIHBhbm1vdmUoZXZlbnQpIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBpZiAoIXRoaXMuX2RyYWdnaW5nIHx8ICF0aGlzLl9pc01vdXNlRG93bikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB7IGRpcmVjdGlvbiB9ID0gdGhpcy5zd2lwZURpcmVjdGlvbihcbiAgICAgIHRoaXMudG91Y2hPYmplY3Quc3RhcnRYLFxuICAgICAgdG91Y2hFdmVudC5nZXRFdmVudFRhcmdldChldmVudCkucGFnZVgsXG4gICAgICB0aGlzLnRvdWNoT2JqZWN0LnN0YXJ0WSxcbiAgICAgIHRvdWNoRXZlbnQuZ2V0RXZlbnRUYXJnZXQoZXZlbnQpLnBhZ2VZXG4gICAgKTtcblxuICAgIGNvbnN0IGxlbmd0aCA9IHRoaXMudmVydGljYWxcbiAgICAgID8gTWF0aC5hYnModG91Y2hFdmVudC5nZXRFdmVudFRhcmdldChldmVudCkucGFnZVkgLSB0aGlzLnRvdWNoT2JqZWN0LnN0YXJ0WSlcbiAgICAgIDogTWF0aC5hYnModG91Y2hFdmVudC5nZXRFdmVudFRhcmdldChldmVudCkucGFnZVggLSB0aGlzLnRvdWNoT2JqZWN0LnN0YXJ0WCk7XG4gICAgY29uc3Qgb2Zmc2V0ID0gLXRoaXMudG91Y2hPYmplY3QuZGlyZWN0aW9uICogbGVuZ3RoIC0gdGhpcy5jdXJyZW50U2VsZWN0ZWRJbmRleCAqIHRoaXMuX3JhdGlvbldpZHRoO1xuICAgIHRoaXMudG91Y2hPYmplY3QgPSB7XG4gICAgICBzdGFydFg6IHRoaXMudG91Y2hPYmplY3Quc3RhcnRYLFxuICAgICAgc3RhcnRZOiB0aGlzLnRvdWNoT2JqZWN0LnN0YXJ0WSxcbiAgICAgIGVuZFg6IHRvdWNoRXZlbnQuZ2V0RXZlbnRUYXJnZXQoZXZlbnQpLnBhZ2VYLFxuICAgICAgZW5kWTogdG91Y2hFdmVudC5nZXRFdmVudFRhcmdldChldmVudCkucGFnZVksXG4gICAgICBsZW5ndGgsXG4gICAgICBkaXJlY3Rpb24sXG4gICAgICBvZmZzZXRcbiAgICB9O1xuICAgIGlmIChkaXJlY3Rpb24gIT09IDApIHtcbiAgICAgIHRoaXMuc2V0U2xpZGVTdHlsZXModGhpcy5jdXJyZW50U2VsZWN0ZWRJbmRleCwgdGhpcy50b3VjaE9iamVjdC5kaXJlY3Rpb24pO1xuICAgIH1cblxuICAgIHRoaXMuZ2V0TGlzdFN0eWxlcyhvZmZzZXQpO1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignbW91c2VsZWF2ZScsIFsnJGV2ZW50J10pXG4gIEBIb3N0TGlzdGVuZXIoJ21vdXNldXAnLCBbJyRldmVudCddKVxuICBASG9zdExpc3RlbmVyKCd0b3VjaGVuZCcsIFsnJGV2ZW50J10pXG4gIHBhbmVuZChldmVudCkge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGlmICghdGhpcy5fZHJhZ2dpbmcgfHwgIXRoaXMuX2lzTW91c2VEb3duIHx8ICF0aGlzLnRvdWNoT2JqZWN0Lmxlbmd0aCB8fCB0aGlzLnRvdWNoT2JqZWN0Lmxlbmd0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLl9pc01vdXNlRG93biA9IGZhbHNlO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl9pc01vdXNlRG93biA9IGZhbHNlO1xuICAgIGlmICh0aGlzLnRvdWNoT2JqZWN0Lmxlbmd0aCA+IHRoaXMuc3dpcGVTcGVlZCkge1xuICAgICAgdGhpcy5jYXJvdXNlbCh0aGlzLnRvdWNoT2JqZWN0LmRpcmVjdGlvbik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZ2V0TGlzdFN0eWxlcyh0aGlzLnRvdWNoT2JqZWN0LmRpcmVjdGlvbiAqIHRoaXMudG91Y2hPYmplY3QubGVuZ3RoICsgdGhpcy50b3VjaE9iamVjdC5vZmZzZXQpO1xuICAgICAgdGhpcy5zdHlsZVsndHJhbnNpdGlvbiddID0gdGhpcy5fdHJhbnNpdGlvbjtcbiAgICB9XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLnN0YXJ0VGltZXIoKTtcbiAgICB9LCB0aGlzLnNwZWVkKTtcbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ3RvdWNoY2FuY2VsJylcbiAgY2FuY2VsKCkge1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5zdGFydFRpbWVyKCk7XG4gICAgfSwgdGhpcy5zcGVlZCk7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCd3aW5kb3c6cmVzaXplJylcbiAgcmVzaXplKCkge1xuICAgIGlmICh0aGlzLl9yZXNpemVUaW1lcikge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX3Jlc2l6ZVRpbWVyKTtcbiAgICB9XG4gICAgdGhpcy5fcmVzaXplVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMubmdBZnRlclZpZXdJbml0KCk7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5fcmVzaXplVGltZXIpO1xuICAgIH0sIDIwMCk7XG4gIH1cblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9lbGU6IEVsZW1lbnRSZWYpIHt9XG5cbiAgaW5pdENhcm91c2VsU2l6ZSgpIHtcbiAgICBjb25zdCBuYXRpdmVFbGVtZW50ID0gdGhpcy5fZWxlLm5hdGl2ZUVsZW1lbnQ7XG4gICAgdGhpcy5zbGlkZUhlaWdodCA9IG5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcignY2Fyb3VzZWxzbGlkZScpLmNsaWVudEhlaWdodDtcbiAgICB0aGlzLl9jdXJyZW50U2xpZGVIZWlnaHQgPSB0aGlzLnNsaWRlSGVpZ2h0ICogdGhpcy5zbGlkZVdpZHRoO1xuICAgIHRoaXMuX2N1cnJlbnRTbGlkZVdpZHRoID0gbmF0aXZlRWxlbWVudC5jbGllbnRXaWR0aDtcbiAgICB0aGlzLl9yYXRpb25XaWR0aCA9IHRoaXMudmVydGljYWwgPyB0aGlzLl9jdXJyZW50U2xpZGVIZWlnaHQgOiB0aGlzLl9jdXJyZW50U2xpZGVXaWR0aCAqIHRoaXMuc2xpZGVXaWR0aDtcbiAgICB0aGlzLl9zcGFjZVdpZHRoID0gKCh0aGlzLnZlcnRpY2FsID8gdGhpcy5zbGlkZUhlaWdodCA6IHRoaXMuX2N1cnJlbnRTbGlkZVdpZHRoKSAtIHRoaXMuX3JhdGlvbldpZHRoKSAvIDI7XG4gIH1cblxuICBjYXJvdXNlbEluaXQoaXRlbXMpIHtcbiAgICB0aGlzLmluZmluaXRlID0gdGhpcy5pbmZpbml0ZSB8fCB0cnVlO1xuICAgIHRoaXMuX25vZGVBcnIgPSBpdGVtc1snX3Jlc3VsdHMnXTtcbiAgICBjb25zdCBzaG91bGREcmFnZ2luZyA9IHRoaXMuX25vZGVBcnIubGVuZ3RoID4gMTtcbiAgICB0aGlzLl9kcmFnZ2luZyA9IHRoaXMuZHJhZ2dpbmcgJiYgc2hvdWxkRHJhZ2dpbmcgPyB0cnVlIDogZmFsc2U7XG4gICAgaWYgKHRoaXMuX25vZGVBcnIubGVuZ3RoID4gMSkge1xuICAgICAgdGhpcy5sYXN0SW5kZXggPSB0aGlzLl9ub2RlQXJyLmxlbmd0aCAtIDE7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5fbm9kZUFyci5mb3JFYWNoKCh2LCBpbmRleCkgPT4ge1xuICAgICAgICAgIHYud2lkdGggPSB0aGlzLnZlcnRpY2FsID8gJ2F1dG8nIDogdGhpcy5fcmF0aW9uV2lkdGggLSB0aGlzLmNlbGxTcGFjaW5nO1xuICAgICAgICAgIHYubGVmdCA9IHRoaXMudmVydGljYWwgPyAwIDogaW5kZXggPT09IHRoaXMubGFzdEluZGV4ID8gLXRoaXMuX3JhdGlvbldpZHRoIDogaW5kZXggKiB0aGlzLl9yYXRpb25XaWR0aDtcbiAgICAgICAgICB2LnRvcCA9IHRoaXMudmVydGljYWwgPyAoaW5kZXggPT09IHRoaXMubGFzdEluZGV4ID8gLXRoaXMuX3JhdGlvbldpZHRoIDogaW5kZXggKiB0aGlzLl9yYXRpb25XaWR0aCkgOiAwO1xuICAgICAgICAgIHYubWFyZ2luID0gdGhpcy52ZXJ0aWNhbCA/IGAke3RoaXMuY2VsbFNwYWNpbmcgLyAyfXB4IGF1dG9gIDogYGF1dG8gJHt0aGlzLmNlbGxTcGFjaW5nIC8gMn1weGA7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnN0YXJ0VGltZXIoKTtcbiAgICAgIH0sIDApO1xuICAgIH0gZWxzZSBpZiAodGhpcy5fbm9kZUFyci5sZW5ndGggPT09IDEpIHtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLl9ub2RlQXJyLmZvckVhY2godiA9PiB7XG4gICAgICAgICAgdi53aWR0aCA9IHRoaXMudmVydGljYWwgPyAnYXV0bycgOiB0aGlzLl9yYXRpb25XaWR0aCAtIHRoaXMuY2VsbFNwYWNpbmc7XG4gICAgICAgICAgdi5sZWZ0ID0gMDtcbiAgICAgICAgICB2LnRvcCA9IDA7XG4gICAgICAgICAgdi5tYXJnaW4gPSBgYXV0byAke3RoaXMuY2VsbFNwYWNpbmcgLyAyfXB4YDtcbiAgICAgICAgfSk7XG4gICAgICB9LCAwKTtcbiAgICB9XG4gIH1cblxuICBzdGFydFRpbWVyKCkge1xuICAgIGlmICghdGhpcy5hdXRvcGxheSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnN0b3BUaW1lcigpO1xuICAgIHRoaXMuX3RpbWVyID0gdGhpcy5hdXRvcGxheUludGVydmFsXG4gICAgICA/IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgICAgICBpZiAoZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2Nhcm91c2VsJykubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuY2Fyb3VzZWwoMSk7XG4gICAgICAgIH0sIHRoaXMuYXV0b3BsYXlJbnRlcnZhbClcbiAgICAgIDogMDtcbiAgfVxuXG4gIHN0b3BUaW1lcigpIHtcbiAgICBjbGVhckludGVydmFsKHRoaXMuX3RpbWVyKTtcbiAgfVxuXG4gIGNhcm91c2VsKG1vdmVEaXJlY3Rpb24pIHtcbiAgICBpZiAodGhpcy52ZXJ0aWNhbCkge1xuICAgICAgaWYgKG1vdmVEaXJlY3Rpb24gPT09IDEpIHtcbiAgICAgICAgdGhpcy5tb3ZlVXAoKTtcbiAgICAgIH0gZWxzZSBpZiAobW92ZURpcmVjdGlvbiA9PT0gLTEpIHtcbiAgICAgICAgdGhpcy5tb3ZlRG93bigpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAobW92ZURpcmVjdGlvbiA9PT0gMSkge1xuICAgICAgICB0aGlzLm1vdmVMZWZ0KCk7XG4gICAgICB9IGVsc2UgaWYgKG1vdmVEaXJlY3Rpb24gPT09IC0xKSB7XG4gICAgICAgIHRoaXMubW92ZVJpZ2h0KCk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuc3R5bGVbJ3RyYW5zaXRpb24nXSA9IHRoaXMuX3RyYW5zaXRpb247XG4gIH1cblxuICBtb3ZlVXAoKSB7XG4gICAgdGhpcy5nb3RvQ2Fyb3VzZWwodGhpcy5nZXRBZnRlck5vZGUoZmFsc2UpKTtcbiAgfVxuXG4gIG1vdmVEb3duKCkge1xuICAgIHRoaXMuZ290b0Nhcm91c2VsKHRoaXMuZ2V0QWZ0ZXJOb2RlKHRydWUpKTtcbiAgfVxuXG4gIG1vdmVMZWZ0KCkge1xuICAgIHRoaXMuZ290b0Nhcm91c2VsKHRoaXMuZ2V0QWZ0ZXJOb2RlKGZhbHNlKSk7XG4gIH1cblxuICBtb3ZlUmlnaHQoKSB7XG4gICAgdGhpcy5nb3RvQ2Fyb3VzZWwodGhpcy5nZXRBZnRlck5vZGUodHJ1ZSkpO1xuICB9XG5cbiAgZ2V0QWZ0ZXJOb2RlKHByZSkge1xuICAgIGxldCBuZXh0SW5kZXg7XG4gICAgaWYgKHByZSkge1xuICAgICAgaWYgKHRoaXMuY3VycmVudFNlbGVjdGVkSW5kZXggPD0gMCkge1xuICAgICAgICB0aGlzLmdldExpc3RTdHlsZXModGhpcy5fcmF0aW9uV2lkdGgpO1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICB0aGlzLl9ub2RlQXJyLmZvckVhY2goKHYsIHRlbXBJbmRleCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRlbXBJbmRleCA9PT0gMCkge1xuICAgICAgICAgICAgICB2LmxlZnQgPSB0aGlzLnZlcnRpY2FsID8gMCA6IHRoaXMuX25vZGVBcnIubGVuZ3RoICogdGhpcy5fcmF0aW9uV2lkdGg7XG4gICAgICAgICAgICAgIHYudG9wID0gdGhpcy52ZXJ0aWNhbCA/IHRoaXMuX25vZGVBcnIubGVuZ3RoICogdGhpcy5fcmF0aW9uV2lkdGggOiAwO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdi5sZWZ0ID0gdGhpcy52ZXJ0aWNhbCA/IDAgOiB0ZW1wSW5kZXggKiB0aGlzLl9yYXRpb25XaWR0aDtcbiAgICAgICAgICAgICAgdi50b3AgPSB0aGlzLnZlcnRpY2FsID8gdGVtcEluZGV4ICogdGhpcy5fcmF0aW9uV2lkdGggOiAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHRoaXMuZ2V0TGlzdFN0eWxlcygtdGhpcy5fcmF0aW9uV2lkdGggKiAodGhpcy5pdGVtcy5sZW5ndGggLSAxKSk7XG4gICAgICAgIH0sIHRoaXMuc3BlZWQpO1xuICAgICAgICBuZXh0SW5kZXggPSAhdGhpcy5pbmZpbml0ZSA/IG51bGwgOiB0aGlzLmxhc3RJbmRleDtcbiAgICAgICAgdGhpcy5iZWZvcmVDaGFuZ2UuZW1pdCh7IGZyb206IHRoaXMuY3VycmVudFNlbGVjdGVkSW5kZXgsIHRvOiBuZXh0SW5kZXggfSk7XG4gICAgICAgIHJldHVybiBuZXh0SW5kZXg7XG4gICAgICB9XG4gICAgICBuZXh0SW5kZXggPSB0aGlzLmN1cnJlbnRTZWxlY3RlZEluZGV4IC0gMTtcbiAgICAgIHRoaXMuZ2V0TGlzdFN0eWxlcyhuZXh0SW5kZXggKiB0aGlzLl9yYXRpb25XaWR0aCAqIHRoaXMudG91Y2hPYmplY3QuZGlyZWN0aW9uKTtcbiAgICAgIHRoaXMuX25vZGVBcnIuZm9yRWFjaCgodiwgdGVtcEluZGV4KSA9PiB7XG4gICAgICAgIGlmICgwID09PSB0ZW1wSW5kZXggJiYgbmV4dEluZGV4ID09PSB0aGlzLl9ub2RlQXJyLmxlbmd0aCAtIDIpIHtcbiAgICAgICAgICB2LmxlZnQgPSAwO1xuICAgICAgICAgIHYudG9wID0gMDtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICB0aGlzLmJlZm9yZUNoYW5nZS5lbWl0KHsgZnJvbTogdGhpcy5jdXJyZW50U2VsZWN0ZWRJbmRleCwgdG86IG5leHRJbmRleCB9KTtcbiAgICAgIHJldHVybiBuZXh0SW5kZXg7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0aGlzLmN1cnJlbnRTZWxlY3RlZEluZGV4ID49IHRoaXMubGFzdEluZGV4KSB7XG4gICAgICAgIHRoaXMuc2V0U2xpZGVTdHlsZXModGhpcy5jdXJyZW50U2VsZWN0ZWRJbmRleCwgMSk7XG4gICAgICAgIHRoaXMuZ2V0TGlzdFN0eWxlcygtKHRoaXMubGFzdEluZGV4ICsgMSkgKiB0aGlzLl9yYXRpb25XaWR0aCk7XG4gICAgICAgIG5leHRJbmRleCA9ICF0aGlzLmluZmluaXRlID8gbnVsbCA6IDA7XG4gICAgICAgIHRoaXMuYmVmb3JlQ2hhbmdlLmVtaXQoeyBmcm9tOiB0aGlzLmN1cnJlbnRTZWxlY3RlZEluZGV4LCB0bzogbmV4dEluZGV4IH0pO1xuICAgICAgICByZXR1cm4gbmV4dEluZGV4O1xuICAgICAgfVxuICAgICAgbmV4dEluZGV4ID0gdGhpcy5jdXJyZW50U2VsZWN0ZWRJbmRleCArIDE7XG4gICAgICB0aGlzLnNldFNsaWRlU3R5bGVzKHRoaXMuY3VycmVudFNlbGVjdGVkSW5kZXgsIDEpO1xuICAgICAgdGhpcy5nZXRMaXN0U3R5bGVzKC1uZXh0SW5kZXggKiB0aGlzLl9yYXRpb25XaWR0aCk7XG4gICAgICB0aGlzLmJlZm9yZUNoYW5nZS5lbWl0KHsgZnJvbTogdGhpcy5jdXJyZW50U2VsZWN0ZWRJbmRleCwgdG86IG5leHRJbmRleCB9KTtcbiAgICAgIHJldHVybiBuZXh0SW5kZXg7XG4gICAgfVxuICB9XG5cbiAgY2FjdWxhdGVEaXJlY3Rpb25MZWZ0Q3VycmVudEluZGV4KCkge1xuICAgIGNvbnN0IHByZXZpb3VzSW5kZXggPSB0aGlzLmN1cnJlbnRTZWxlY3RlZEluZGV4O1xuICAgIHRoaXMuY3VycmVudFNlbGVjdGVkSW5kZXggPSAocHJldmlvdXNJbmRleCArIDEpICUgdGhpcy5pdGVtcy5sZW5ndGg7XG4gIH1cblxuICBjYWN1bGF0ZURpcmVjdGlvblJpZ2h0Q3VycmVudEluZGV4KCkge1xuICAgIGlmICh0aGlzLmN1cnJlbnRTZWxlY3RlZEluZGV4ID09PSAwKSB7XG4gICAgICB0aGlzLmN1cnJlbnRTZWxlY3RlZEluZGV4ID0gdGhpcy5pdGVtcy5sZW5ndGg7XG4gICAgfVxuICAgIGNvbnN0IHByZXZpb3VzSW5kZXggPSB0aGlzLmN1cnJlbnRTZWxlY3RlZEluZGV4O1xuICAgIHRoaXMuY3VycmVudFNlbGVjdGVkSW5kZXggPSAocHJldmlvdXNJbmRleCAtIDEpICUgdGhpcy5pdGVtcy5sZW5ndGg7XG4gIH1cblxuICBnb3RvQ2Fyb3VzZWwoYWZ0ZXJJbmRleCkge1xuICAgIGlmIChhZnRlckluZGV4ID09PSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuZ2V0Q3VycmVudEluZGV4KCk7XG5cbiAgICBpZiAoYWZ0ZXJJbmRleCA9PT0gMCkge1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMuX25vZGVBcnIuZm9yRWFjaCgodiwgaW5kZXgpID0+IHtcbiAgICAgICAgICBpZiAoaW5kZXggPT09IHRoaXMuX25vZGVBcnIubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgdi5sZWZ0ID0gdGhpcy52ZXJ0aWNhbCA/IDAgOiAtdGhpcy5fcmF0aW9uV2lkdGg7XG4gICAgICAgICAgICB2LnRvcCA9IHRoaXMudmVydGljYWwgPyAtdGhpcy5fcmF0aW9uV2lkdGggOiAwO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2LmxlZnQgPSB0aGlzLnZlcnRpY2FsID8gMCA6IGluZGV4ICogdGhpcy5fcmF0aW9uV2lkdGg7XG4gICAgICAgICAgICB2LnRvcCA9IHRoaXMudmVydGljYWwgPyBpbmRleCAqIHRoaXMuX3JhdGlvbldpZHRoIDogMDtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnN0YXJ0VGltZXIoKTtcbiAgICAgICAgdGhpcy5nZXRMaXN0U3R5bGVzKDApO1xuICAgICAgfSwgdGhpcy5zcGVlZCk7XG4gICAgfVxuICAgIHRoaXMuY3VycmVudFNlbGVjdGVkSW5kZXggPSBhZnRlckluZGV4O1xuICAgIHRoaXMuYWZ0ZXJDaGFuZ2UuZW1pdCh0aGlzLmN1cnJlbnRTZWxlY3RlZEluZGV4KTtcbiAgfVxuXG4gIGdldEN1cnJlbnRJbmRleCgpIHtcbiAgICBpZiAodGhpcy50b3VjaE9iamVjdC5kaXJlY3Rpb24gPT09IDEpIHtcbiAgICAgIHRoaXMuY2FjdWxhdGVEaXJlY3Rpb25MZWZ0Q3VycmVudEluZGV4KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY2FjdWxhdGVEaXJlY3Rpb25SaWdodEN1cnJlbnRJbmRleCgpO1xuICAgIH1cbiAgfVxuXG4gIHNldFNsaWRlU3R5bGVzKGluZGV4LCBkaXJlY3Rpb24sIHhEaXN0OiBudW1iZXIgPSAwKSB7XG4gICAgaWYgKGRpcmVjdGlvbiA9PT0gMSkge1xuICAgICAgdGhpcy5fbm9kZUFyci5mb3JFYWNoKCh2LCB0ZW1wSW5kZXgpID0+IHtcbiAgICAgICAgaWYgKGluZGV4IDwgdGhpcy5fbm9kZUFyci5sZW5ndGggJiYgaW5kZXggLSAxID09PSB0ZW1wSW5kZXgpIHtcbiAgICAgICAgICBpZiAoeERpc3QgPT09IDAgfHwgeERpc3QgPiB0aGlzLl9zcGFjZVdpZHRoKSB7XG4gICAgICAgICAgICB2LmxlZnQgPSB0aGlzLnZlcnRpY2FsID8gMCA6ICh0aGlzLl9ub2RlQXJyLmxlbmd0aCArIHRlbXBJbmRleCkgKiB0aGlzLl9yYXRpb25XaWR0aDtcbiAgICAgICAgICAgIHYudG9wID0gdGhpcy52ZXJ0aWNhbCA/ICh0aGlzLl9ub2RlQXJyLmxlbmd0aCArIHRlbXBJbmRleCkgKiB0aGlzLl9yYXRpb25XaWR0aCA6IDA7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX25vZGVBcnIubGVuZ3RoIC0gMSA9PT0gdGVtcEluZGV4ICYmIGluZGV4ICE9PSAyKSB7XG4gICAgICAgICAgaWYgKHhEaXN0ID09PSAwIHx8IHhEaXN0ID4gdGhpcy5fc3BhY2VXaWR0aCkge1xuICAgICAgICAgICAgdi5sZWZ0ID0gdGhpcy52ZXJ0aWNhbCA/IDAgOiAodGhpcy5fbm9kZUFyci5sZW5ndGggLSAxKSAqIHRoaXMuX3JhdGlvbldpZHRoO1xuICAgICAgICAgICAgdi50b3AgPSB0aGlzLnZlcnRpY2FsID8gKHRoaXMuX25vZGVBcnIubGVuZ3RoIC0gMSkgKiB0aGlzLl9yYXRpb25XaWR0aCA6IDA7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGluZGV4ID09PSB0aGlzLl9ub2RlQXJyLmxlbmd0aCAtIDEgJiYgdGVtcEluZGV4ID09PSAxICYmIHRoaXMuYXV0b3BsYXkpIHtcbiAgICAgICAgICB2LmxlZnQgPSB0aGlzLnZlcnRpY2FsID8gMCA6ICh0aGlzLl9ub2RlQXJyLmxlbmd0aCArIHRlbXBJbmRleCkgKiB0aGlzLl9yYXRpb25XaWR0aDtcbiAgICAgICAgICB2LnRvcCA9IHRoaXMudmVydGljYWwgPyB0ZW1wSW5kZXggKiB0aGlzLl9yYXRpb25XaWR0aCA6IDA7XG4gICAgICAgIH0gZWxzZSBpZiAoaW5kZXggPT09IHRoaXMuX25vZGVBcnIubGVuZ3RoIC0gMSAmJiB0ZW1wSW5kZXggPT09IDAgJiYgIXRoaXMuYXV0b3BsYXkpIHtcbiAgICAgICAgICB2LmxlZnQgPSB0aGlzLnZlcnRpY2FsID8gMCA6ICh0aGlzLl9ub2RlQXJyLmxlbmd0aCArIHRlbXBJbmRleCkgKiB0aGlzLl9yYXRpb25XaWR0aDtcbiAgICAgICAgICB2LnRvcCA9IHRoaXMudmVydGljYWwgPyB0ZW1wSW5kZXggKiB0aGlzLl9yYXRpb25XaWR0aCA6IDA7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAoZGlyZWN0aW9uID09PSAtMSkge1xuICAgICAgdGhpcy5fbm9kZUFyci5mb3JFYWNoKCh2LCB0ZW1wSW5kZXgpID0+IHtcbiAgICAgICAgaWYgKGluZGV4ID09PSAwICYmIHRoaXMuX25vZGVBcnIubGVuZ3RoIC0gMSA9PT0gdGVtcEluZGV4KSB7XG4gICAgICAgICAgdi5sZWZ0ID0gdGhpcy52ZXJ0aWNhbCA/IDAgOiBkaXJlY3Rpb24gKiB0aGlzLl9yYXRpb25XaWR0aDtcbiAgICAgICAgICB2LnRvcCA9IHRoaXMudmVydGljYWwgPyBkaXJlY3Rpb24gKiB0aGlzLl9yYXRpb25XaWR0aCA6IDA7XG4gICAgICAgIH0gZWxzZSBpZiAoaW5kZXggPT09IHRoaXMuX25vZGVBcnIubGVuZ3RoIC0gMiAmJiBpbmRleCArIDEgPT09IHRlbXBJbmRleCkge1xuICAgICAgICAgIHYubGVmdCA9IHRoaXMudmVydGljYWwgPyAwIDogZGlyZWN0aW9uICogdGhpcy5fcmF0aW9uV2lkdGg7XG4gICAgICAgICAgdi50b3AgPSB0aGlzLnZlcnRpY2FsID8gZGlyZWN0aW9uICogdGhpcy5fcmF0aW9uV2lkdGggOiAwO1xuICAgICAgICB9IGVsc2UgaWYgKGluZGV4ID09PSAxICYmIDAgPT09IHRlbXBJbmRleCkge1xuICAgICAgICAgIHYubGVmdCA9IHRoaXMudmVydGljYWwgPyAwIDogZGlyZWN0aW9uICogdGhpcy5fcmF0aW9uV2lkdGggKiB0ZW1wSW5kZXg7XG4gICAgICAgICAgdi50b3AgPSB0aGlzLnZlcnRpY2FsID8gZGlyZWN0aW9uICogdGhpcy5fcmF0aW9uV2lkdGggOiAwO1xuICAgICAgICB9IGVsc2UgaWYgKGluZGV4ID4gMSkge1xuICAgICAgICAgIHYubGVmdCA9IHRoaXMudmVydGljYWwgPyAwIDogdGVtcEluZGV4ICogdGhpcy5fcmF0aW9uV2lkdGg7XG4gICAgICAgICAgdi50b3AgPSB0aGlzLnZlcnRpY2FsID8gdGVtcEluZGV4ICogdGhpcy5fcmF0aW9uV2lkdGggOiAwO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBnZXRMaXN0U3R5bGVzKG9mZnNldDogbnVtYmVyID0gMCkge1xuICAgIGNvbnN0IHBvc2l0aW9uT2Zmc2V0ID1cbiAgICAgIG9mZnNldCArXG4gICAgICAodGhpcy52ZXJ0aWNhbFxuICAgICAgICA/ICh0aGlzLnNsaWRlSGVpZ2h0IC0gdGhpcy5fY3VycmVudFNsaWRlSGVpZ2h0KSAvIDJcbiAgICAgICAgOiAodGhpcy5fY3VycmVudFNsaWRlV2lkdGggLSB0aGlzLl9yYXRpb25XaWR0aCkgLyAyKSAtXG4gICAgICB0aGlzLmNlbGxTcGFjaW5nO1xuICAgIHRoaXMuc3R5bGUgPSB7XG4gICAgICBoZWlnaHQ6IHRoaXMuX2N1cnJlbnRTbGlkZUhlaWdodCArICdweCcsXG4gICAgICB3aWR0aDogdGhpcy52ZXJ0aWNhbCA/IHRoaXMuX2N1cnJlbnRTbGlkZVdpZHRoICsgJ3B4JyA6IHRoaXMuaXRlbXMubGVuZ3RoICogdGhpcy5fcmF0aW9uV2lkdGggKyAncHgnLFxuICAgICAgdHJhbnNmb3JtOiB0aGlzLnZlcnRpY2FsXG4gICAgICAgID8gYHRyYW5zbGF0ZTNkKDBweCwgJHtwb3NpdGlvbk9mZnNldH1weCwgMHB4KWBcbiAgICAgICAgOiBgdHJhbnNsYXRlM2QoJHtwb3NpdGlvbk9mZnNldH1weCwgMHB4LCAwcHgpYCxcbiAgICAgIG1hcmdpbjogdGhpcy52ZXJ0aWNhbCA/IGAkeyh0aGlzLmNlbGxTcGFjaW5nIC8gMikgKiAtMX1weCAwcHhgIDogYDBweCAkeyh0aGlzLmNlbGxTcGFjaW5nIC8gMikgKiAtMX1weGBcbiAgICB9O1xuICB9XG5cbiAgc3dpcGVEaXJlY3Rpb24oeDEsIHgyLCB5MSwgeTIpIHtcbiAgICBjb25zdCB4RGlzdCA9IHgxIC0geDI7XG4gICAgY29uc3QgeURpc3QgPSB5MSAtIHkyO1xuXG4gICAgY29uc3QgciA9IE1hdGguYXRhbjIoeURpc3QsIHhEaXN0KTtcbiAgICBsZXQgc3dpcGVBbmdsZSA9IE1hdGgucm91bmQoKHIgKiAxODApIC8gTWF0aC5QSSk7XG4gICAgaWYgKHN3aXBlQW5nbGUgPCAwKSB7XG4gICAgICBzd2lwZUFuZ2xlID0gMzYwIC0gTWF0aC5hYnMoc3dpcGVBbmdsZSk7XG4gICAgfVxuICAgIGlmIChzd2lwZUFuZ2xlIDw9IDQ1ICYmIHN3aXBlQW5nbGUgPj0gMCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZGlyZWN0aW9uOiAxLFxuICAgICAgICB4RGlzdDogeERpc3RcbiAgICAgIH07XG4gICAgfVxuICAgIGlmIChzd2lwZUFuZ2xlIDw9IDM2MCAmJiBzd2lwZUFuZ2xlID49IDMxNSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZGlyZWN0aW9uOiAxLFxuICAgICAgICB4RGlzdDogeERpc3RcbiAgICAgIH07XG4gICAgfVxuICAgIGlmIChzd2lwZUFuZ2xlID49IDEzNSAmJiBzd2lwZUFuZ2xlIDw9IDIyNSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZGlyZWN0aW9uOiAtMSxcbiAgICAgICAgeERpc3Q6IHhEaXN0XG4gICAgICB9O1xuICAgIH1cbiAgICBpZiAodGhpcy52ZXJ0aWNhbCA9PT0gdHJ1ZSkge1xuICAgICAgaWYgKHN3aXBlQW5nbGUgPj0gMzUgKyAzMyAmJiBzd2lwZUFuZ2xlIDw9IDEzNSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGRpcmVjdGlvbjogMSxcbiAgICAgICAgICB4RGlzdDogeERpc3RcbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgZGlyZWN0aW9uOiAtMSxcbiAgICAgICAgICB4RGlzdDogeERpc3RcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIGRpcmVjdGlvbjogMCxcbiAgICAgIHhEaXN0OiB4RGlzdFxuICAgIH07XG4gIH1cblxuICBnZXQgcGFnZSgpIHtcbiAgICByZXR1cm4gdGhpcy5kb3RzID8gdGhpcy5jdXJyZW50U2VsZWN0ZWRJbmRleCA6IDA7XG4gIH1cblxuICBnZXQgcGFnZUNvdW50KCkge1xuICAgIHJldHVybiB0aGlzLmRvdHMgPyB0aGlzLml0ZW1zLmxlbmd0aCA6IDA7XG4gIH1cblxuICBnZXQgZG90aW5kaWNhdG9yU3RhdHVzKCkge1xuICAgIHJldHVybiB0aGlzLmRvdHMgPyB0aGlzLml0ZW1zLmxlbmd0aCA+IDEgOiB0aGlzLmRvdHM7XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgdGhpcy50b3VjaE9iamVjdCA9IHsgZGlyZWN0aW9uOiAxIH07XG4gICAgdGhpcy5fdHJhbnNpdGlvbiA9IGB0cmFuc2Zvcm0gJHt0aGlzLnNwZWVkIC8gMTAwMH1zYDtcbiAgICB0aGlzLml0ZW1zLmNoYW5nZXMuc3Vic2NyaWJlKGl0ZW1zID0+IHtcbiAgICAgIHRoaXMuY2Fyb3VzZWxJbml0KGl0ZW1zKTtcbiAgICB9KTtcbiAgICB0aGlzLmluaXRDYXJvdXNlbFNpemUoKTtcbiAgICB0aGlzLnNlbGVjdGVkSW5kZXggPSB0aGlzLml0ZW1zLmxlbmd0aCAtIDEgPCB0aGlzLnNlbGVjdGVkSW5kZXggPyAwIDogdGhpcy5zZWxlY3RlZEluZGV4O1xuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5pdGVtcy5sZW5ndGggPiAxID8gKHRoaXMuaXRlbXMubGVuZ3RoIC0gMSA9PT0gdGhpcy5zZWxlY3RlZEluZGV4ID8gLTEgOiB0aGlzLnNlbGVjdGVkSW5kZXgpIDogMDtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuY3VycmVudFNlbGVjdGVkSW5kZXggPSB0aGlzLnNlbGVjdGVkSW5kZXg7XG4gICAgfSwgMCk7XG4gICAgdGhpcy5nZXRMaXN0U3R5bGVzKC1pbmRleCAqIHRoaXMuX3JhdGlvbldpZHRoKTtcbiAgICB0aGlzLmNhcm91c2VsSW5pdCh0aGlzLml0ZW1zKTtcbiAgICBjb25zdCBuYXRpdmVFbGVtZW50ID0gdGhpcy5fZWxlLm5hdGl2ZUVsZW1lbnQ7XG4gICAgY29uc3QgdGFyZ2V0Tm9kZSA9IG5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcignY2Fyb3VzZWxzbGlkZScpO1xuICAgIGNvbnN0IGNvbmZpZyA9IHsgYXR0cmlidXRlczogdHJ1ZSwgY2hpbGRMaXN0OiB0cnVlLCBzdWJ0cmVlOiB0cnVlIH07XG4gICAgY29uc3QgY2FsbGJhY2sgPSBtdXRhdGlvbnNMaXN0ID0+IHtcbiAgICAgIGZvciAoY29uc3QgbXV0YXRpb24gb2YgbXV0YXRpb25zTGlzdCkge1xuICAgICAgICBpZiAobXV0YXRpb24udHlwZSA9PSAnYXR0cmlidXRlcycpIHtcbiAgICAgICAgICBpZiAodGhpcy5zbGlkZUhlaWdodCAhPT0gbmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCdjYXJvdXNlbHNsaWRlJykuY2xpZW50SGVpZ2h0KSB7XG4gICAgICAgICAgICB0aGlzLmluaXRDYXJvdXNlbFNpemUoKTtcbiAgICAgICAgICAgIHRoaXMuZ2V0TGlzdFN0eWxlcygtaW5kZXggKiB0aGlzLl9yYXRpb25XaWR0aCk7XG4gICAgICAgICAgICB0aGlzLmNhcm91c2VsSW5pdCh0aGlzLml0ZW1zKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgdGhpcy5fb2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcihjYWxsYmFjayk7XG4gICAgdGhpcy5fb2JzZXJ2ZXIub2JzZXJ2ZSh0YXJnZXROb2RlLCBjb25maWcpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy5fb2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuICAgIHRoaXMuX29ic2VydmVyID0gbnVsbDtcbiAgICB0aGlzLnN0b3BUaW1lcigpO1xuICB9XG59XG4iXX0=