UNPKG

ngx-pluto

Version:
799 lines 63.3 kB
/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
 */
import * as tslib_1 from "tslib";
import { Component, Input, ViewContainerRef, Output, EventEmitter, ContentChild, forwardRef, ChangeDetectorRef, ChangeDetectionStrategy, Renderer2, ViewChild } from '@angular/core';
// import { OverlayService } from '../common';
import { NpDropdownItemDirective } from './dropdown-item.directive';
import { NG_VALUE_ACCESSOR } from '@angular/forms';
import { OverlayService } from '../common/overlay.service';
import { CdkVirtualScrollViewport } from '@angular/cdk/scrolling';
/**
 * 下拉选择组件 - 支持单选和多选功能
 *
 * <example-url>https://stackblitz.com/edit/np-dropdown-sample?embed=1&file=src/app/app.component.html</example-url>
 *
 */
var NpDropdown = /** @class */ (function () {
    //#endregion
    function NpDropdown(viewContainerRef, overlayService, cdf, renderer2) {
        this.viewContainerRef = viewContainerRef;
        this.overlayService = overlayService;
        this.cdf = cdf;
        this.renderer2 = renderer2;
        this.emitChange = (/**
         * @param {?} _
         * @return {?}
         */
        function (_) { });
        /**
         * 是否禁用状态
         */
        this.disabled = false;
        /**
         * 全部下拉选项
         */
        this.items = [];
        /**
         * 选择时触发
         */
        this.onSelected = new EventEmitter();
        /**
         * 取消选择时触发
         */
        this.onDeselected = new EventEmitter();
        /**
         * 全选时触发
         */
        this.onSelectedAll = new EventEmitter();
        /**
         * 取消全选时触发
         */
        this.onDeselectedAll = new EventEmitter();
        this.originItems = [];
        /**
         * 多选下拉框
         */
        this.selectedItems = [];
        this.selectedBadgeItems = [];
        this.noneBadgeCount = 0;
        this._isCheckedAll = false;
    }
    Object.defineProperty(NpDropdown.prototype, "selectedLabel", {
        //#region Getter
        /**单选下拉框 */
        get: 
        //#region Getter
        /**
         * 单选下拉框
         * @return {?}
         */
        function () {
            this.checkItemExists();
            if (this.settings.single) {
                return this.selectedItem ? ((/** @type {?} */ (this.selectedItem))).label : this.settings.placeHolder;
            }
            return this.settings.placeHolder;
        },
        enumerable: true,
        configurable: true
    });
    /**
     * @private
     * @return {?}
     */
    NpDropdown.prototype.buildMultipleSelect = /**
     * @private
     * @return {?}
     */
    function () {
        if (this.settings.single) {
            return;
        }
        //#region selectedItems
        this.checkItemExists();
        /** @type {?} */
        var selectedItems = (/** @type {?} */ (this.selectedItem));
        if (selectedItems && selectedItems.length > 0) {
            this.selectedItems = tslib_1.__spread(selectedItems);
        }
        else {
            this.selectedItems = [{ id: -1, label: this.settings.placeHolder }];
        }
        //#endregion
        //#region selectedBadgeItems
        /** @type {?} */
        var items = tslib_1.__spread(this.selectedItems);
        items.splice(this.settings.badge);
        this.selectedBadgeItems = items;
        //#endregion
        this.noneBadgeCount = this.selectedItems.length - this.settings.badge;
        this.cdf.detectChanges();
    };
    Object.defineProperty(NpDropdown.prototype, "isDropdownOpen", {
        get: /**
         * @return {?}
         */
        function () {
            return this.overlayService.isAttached();
        },
        enumerable: true,
        configurable: true
    });
    Object.defineProperty(NpDropdown.prototype, "isItemSelected", {
        get: /**
         * @return {?}
         */
        function () {
            if (this.settings.single) {
                return this.selectedLabel !== this.settings.placeHolder;
            }
            // Multiple dropdown
            if (this.selectedItems && this.selectedItems.length > 0) {
                return this.selectedItems[0].label !== this.settings.placeHolder;
            }
            return false;
        },
        enumerable: true,
        configurable: true
    });
    Object.defineProperty(NpDropdown.prototype, "isCheckedAll", {
        get: /**
         * @return {?}
         */
        function () {
            return this.items.length === this.selectedItem.length;
        },
        set: /**
         * @param {?} val
         * @return {?}
         */
        function (val) {
            this._isCheckedAll = val;
        },
        enumerable: true,
        configurable: true
    });
    /**
     * @return {?}
     */
    NpDropdown.prototype.ngOnInit = /**
     * @return {?}
     */
    function () {
        this.init();
    };
    /**
     * @param {?} changes
     * @return {?}
     */
    NpDropdown.prototype.ngOnChanges = /**
     * @param {?} changes
     * @return {?}
     */
    function (changes) {
        /** @type {?} */
        var items = changes['items'];
        if (items && items.currentValue && items.currentValue.length >= 0) {
            this.originItems = tslib_1.__spread(items.currentValue);
        }
    };
    /**
     * @param {?} checked
     * @return {?}
     */
    NpDropdown.prototype.onSelectAll = /**
     * @param {?} checked
     * @return {?}
     */
    function (checked) {
        this.items.forEach((/**
         * @param {?} item
         * @return {?}
         */
        function (item) {
            item.checked = checked;
        }));
        this.selectedItem = checked ? tslib_1.__spread(this.items) : [];
        this.buildMultipleSelect();
        this.onSelectedAll.emit(this.selectedItem);
        this.emitChange(this.selectedItem);
    };
    /**
     * @param {?} item
     * @return {?}
     */
    NpDropdown.prototype.onSelect = /**
     * @param {?} item
     * @return {?}
     */
    function (item) {
        if (this.settings.single) {
            this.selectedItem = item;
            this.onSelected.emit(item);
            this.emitChange(item);
            this.cdf.detectChanges();
            this.overlayService.close({ item: item });
            return;
        }
        //#region Multiple dropdown
        if (!this.selectedItem || !this.selectedItem.length) {
            this.selectedItem = [];
        }
        if (item.checked) {
            this.selectedItem.push(item);
        }
        else {
            this.selectedItem = this.selectedItem.filter((/**
             * @param {?} f
             * @return {?}
             */
            function (f) { return f.id !== item.id; }));
        }
        this.buildMultipleSelect();
        this.onSelected.emit(item);
        this.emitChange(this.selectedItem);
        //#endregion
    };
    /**
     * @param {?} val
     * @return {?}
     */
    NpDropdown.prototype.onSearch = /**
     * @param {?} val
     * @return {?}
     */
    function (val) {
        if (!val) {
            this.clearSearch();
            return;
        }
        this.items = this.originItems.filter((/**
         * @param {?} f
         * @return {?}
         */
        function (f) { return f.label.indexOf(val) > -1; }));
    };
    /**
     * @param {?} item
     * @return {?}
     */
    NpDropdown.prototype.isActive = /**
     * @param {?} item
     * @return {?}
     */
    function (item) {
        if (!this.selectedItem) {
            return false;
        }
        if (this.settings.single) {
            return item.id === ((/** @type {?} */ (this.selectedItem))).id;
        }
        // Multiple dropdown
        return this.selectedItem.find((/**
         * @param {?} f
         * @return {?}
         */
        function (f) { return f.id === item.id; }));
    };
    /**
     * @param {?} $event
     * @param {?} dropdownTpl
     * @param {?} origin
     * @return {?}
     */
    NpDropdown.prototype.onOpenDropdown = /**
     * @param {?} $event
     * @param {?} dropdownTpl
     * @param {?} origin
     * @return {?}
     */
    function ($event, dropdownTpl, origin) {
        var _this = this;
        $event.stopPropagation();
        if (this.disabled) {
            return;
        }
        if (this.isDropdownOpen) {
            this.overlayService.close(null);
            return;
        }
        this.overlayService.openDropdown(origin, dropdownTpl, this.viewContainerRef, null).subscribe((/**
         * @return {?}
         */
        function () {
            // close
        }));
        this.buildItemsCheckedStatus();
        setTimeout((/**
         * @return {?}
         */
        function () {
            _this.scrollToSelectedItem();
        }), 100);
        // Tricky... Can't get inner element in np-input control, so we need set
        // style async after open dropdown
        setTimeout((/**
         * @return {?}
         */
        function () {
            if (!_this.overlayService.overlayRef || !_this.overlayService.overlayRef.overlayElement) {
                return;
            }
            /** @type {?} */
            var npInputWrapper = _this.overlayService.overlayRef.overlayElement.getElementsByClassName('np-input-wrapper');
            /** @type {?} */
            var inputContainer = _this.overlayService.overlayRef.overlayElement.getElementsByClassName('input-container');
            /** @type {?} */
            var npInput = _this.overlayService.overlayRef.overlayElement.getElementsByClassName('np-input');
            if (npInputWrapper && npInputWrapper.length > 0) {
                _this.renderer2.setStyle(npInputWrapper[0], 'width', '100%');
            }
            if (inputContainer && inputContainer.length > 0) {
                _this.renderer2.setStyle(inputContainer[0], 'width', '100%');
            }
            if (npInput && npInput.length > 0) {
                _this.renderer2.setStyle(npInput[0], 'width', _this.settings.width + 'px');
                _this.renderer2.setStyle(npInput[0], 'padding-left', '30px');
                _this.renderer2.setStyle(npInput[0], 'border-top', 'none');
                _this.renderer2.setStyle(npInput[0], 'border-left', 'none');
                _this.renderer2.setStyle(npInput[0], 'border-right', 'none');
                _this.renderer2.setStyle(npInput[0], 'box-shadow', 'none');
            }
        }), 0);
    };
    /**
     * @param {?} $event
     * @return {?}
     */
    NpDropdown.prototype.onRemoveItems = /**
     * @param {?} $event
     * @return {?}
     */
    function ($event) {
        if (this.disabled) {
            return;
        }
        this.selectedItem = this.settings.single ? null : [];
        this.clearSearch();
        this.items.forEach((/**
         * @param {?} item
         * @return {?}
         */
        function (item) {
            item.checked = false;
        }));
        this.buildMultipleSelect();
        this.onDeselectedAll.emit(this.items);
        this.emitChange(this.selectedItem);
        $event.stopPropagation();
    };
    /**
     * @param {?} $event
     * @param {?} item
     * @return {?}
     */
    NpDropdown.prototype.onRemoveItem = /**
     * @param {?} $event
     * @param {?} item
     * @return {?}
     */
    function ($event, item) {
        if (this.disabled) {
            return;
        }
        this.selectedItem = this.selectedItem.filter((/**
         * @param {?} f
         * @return {?}
         */
        function (f) { return f.id !== item.id; }));
        this.clearSearch();
        item.checked = false;
        this.buildMultipleSelect();
        this.onDeselected.emit(item);
        this.emitChange(this.selectedItem);
        $event.stopPropagation();
    };
    //#region Implementation for ControlValueAccessor
    //#region Implementation for ControlValueAccessor
    /**
     * @param {?} obj
     * @return {?}
     */
    NpDropdown.prototype.writeValue = 
    //#region Implementation for ControlValueAccessor
    /**
     * @param {?} obj
     * @return {?}
     */
    function (obj) {
        // 如果是多选下拉框,传入的selectedItem是null,为了防止报错直接return,必须传入空数组[]
        if (obj === null && !this.settings.single) {
            return;
        }
        this.selectedItem = obj;
        if (this.settings.single) {
            this.cdf.detectChanges();
        }
        else {
            this.selectedItem.forEach((/**
             * @param {?} item
             * @return {?}
             */
            function (item) {
                if (item.checked === undefined) {
                    item.checked = true;
                }
            }));
            this.buildMultipleSelect();
        }
    };
    /**
     * @param {?} fn
     * @return {?}
     */
    NpDropdown.prototype.registerOnChange = /**
     * @param {?} fn
     * @return {?}
     */
    function (fn) {
        this.emitChange = fn;
    };
    /**
     * @param {?} fn
     * @return {?}
     */
    NpDropdown.prototype.registerOnTouched = /**
     * @param {?} fn
     * @return {?}
     */
    function (fn) { };
    //#endregion
    //#region Private methods
    //#endregion
    //#region Private methods
    /**
     * @private
     * @return {?}
     */
    NpDropdown.prototype.init = 
    //#endregion
    //#region Private methods
    /**
     * @private
     * @return {?}
     */
    function () {
        this.originItems = tslib_1.__spread(this.items);
        /** @type {?} */
        var initSettings = {
            single: true,
            placeHolder: '请选择',
            width: 220,
            badge: 99999,
            isShowSearchBox: true,
            noData: '没有数据!',
            autoScrollTo: true
        };
        this.settings = Object.assign(initSettings, this.settings);
    };
    /**
     * @private
     * @return {?}
     */
    NpDropdown.prototype.checkItemExists = /**
     * @private
     * @return {?}
     */
    function () {
        var _this = this;
        if (this.settings.single) {
            if (this.selectedItem && !this.originItems.find((/**
             * @param {?} f
             * @return {?}
             */
            function (f) { return f.id === ((/** @type {?} */ (_this.selectedItem))).id; }))) {
                this.selectedItem = null;
            }
        }
        else {
            // Multiple dropdown
            if (this.selectedItem && this.selectedItem.length > 0) {
                /** @type {?} */
                var selectedItems_1 = [];
                this.selectedItem.forEach((/**
                 * @param {?} item
                 * @return {?}
                 */
                function (item) {
                    if (_this.originItems.find((/**
                     * @param {?} f
                     * @return {?}
                     */
                    function (f) { return f.id === item.id; }))) {
                        selectedItems_1.push(item);
                    }
                }));
                this.selectedItem = [];
                this.selectedItem = selectedItems_1;
            }
        }
    };
    /**
     * 清除查询并展示所有符合条件的items
     */
    /**
     * 清除查询并展示所有符合条件的items
     * @private
     * @return {?}
     */
    NpDropdown.prototype.clearSearch = /**
     * 清除查询并展示所有符合条件的items
     * @private
     * @return {?}
     */
    function () {
        this.searchToken = '';
        this.items = tslib_1.__spread(this.originItems);
        this.buildItemsCheckedStatus();
    };
    /**
     * @private
     * @return {?}
     */
    NpDropdown.prototype.buildItemsCheckedStatus = /**
     * @private
     * @return {?}
     */
    function () {
        var _this = this;
        if (this.settings.single) {
            return;
        }
        this.items.forEach((/**
         * @param {?} item
         * @return {?}
         */
        function (item) {
            /** @type {?} */
            var selectedItem = _this.selectedItem.find((/**
             * @param {?} f
             * @return {?}
             */
            function (f) { return f.id === item.id; }));
            item.checked = selectedItem ? true : false;
        }));
    };
    /**
     * @private
     * @return {?}
     */
    NpDropdown.prototype.scrollToSelectedItem = /**
     * @private
     * @return {?}
     */
    function () {
        if (!this.settings.autoScrollTo) {
            return;
        }
        /** @type {?} */
        var item = this.settings.single ? ((/** @type {?} */ (this.selectedItem))) : (this.selectedItem && this.selectedItem[0]);
        if (item) {
            /** @type {?} */
            var selectedIndex = this.originItems.findIndex((/**
             * @param {?} f
             * @return {?}
             */
            function (f) { return f.id === item.id; }));
            this.viewPort.scrollToIndex(selectedIndex, 'smooth');
        }
    };
    NpDropdown.decorators = [
        { type: Component, args: [{
                    selector: "np-dropdown",
                    template: "<div class=\"np-dropdown-wrapper flex-wrap row-flex\">\r\n  <label class=\"select-lbl\" *ngIf=\"settings.lblName\">{{ settings.lblName }}</label>\r\n  <div class=\"selected-item-wrapper\" [style.width.px]=\"settings.width\" [ngClass]=\"{'disabled': disabled}\"\r\n    (click)=\"onOpenDropdown($event, dropdown, origin)\" #origin tabindex=\"-1\">\r\n    <!-- Single select -->\r\n    <ng-container *ngIf=\"settings.single\">\r\n      <span [ngClass]=\"{'placeholder': !isItemSelected}\">{{ selectedLabel }}</span>\r\n    </ng-container>\r\n\r\n    <!-- Multiple select -->\r\n    <ng-container *ngIf=\"!settings.single\">\r\n      <div class=\"mul-item-container\">\r\n        <ng-container *ngIf=\"!isItemSelected && selectedItems[0]\"><span\r\n            class=\"placeholder\">{{ selectedItems[0].label }}</span>\r\n        </ng-container>\r\n        <ng-container *ngIf=\"isItemSelected\">\r\n          <span class=\"mul-item\" *ngFor=\"let selectedItem of selectedBadgeItems; let i=index;\">\r\n            <ng-container>\r\n              <span>{{ selectedItem.label }}</span>&nbsp;&nbsp;\r\n              <i class=\"fas fa-times\" *ngIf=\"isItemSelected\" (click)=\"onRemoveItem($event, selectedItem)\"></i>\r\n            </ng-container>\r\n          </span>\r\n        </ng-container>\r\n      </div>\r\n    </ng-container>\r\n    <span class=\"none-badge-count\" *ngIf=\"noneBadgeCount > 0\">{{ '+' + noneBadgeCount }}</span>\r\n    <i class=\"fas fa-times\" *ngIf=\"!settings.isRequired && isItemSelected\" (click)=\"onRemoveItems($event)\"></i>\r\n    <i class=\"fas fa-caret-down\" *ngIf=\"!isDropdownOpen\"></i>\r\n    <i class=\"fas fa-caret-up\" *ngIf=\"isDropdownOpen\"></i>\r\n  </div>\r\n\r\n  <ng-template #dropdown>\r\n    <div class=\"np-dropdown-viewport flex-wrap col-flex\">\r\n      <div class=\"search-container\" *ngIf=\"settings.isShowSearchBox\">\r\n        <np-input class=\"search-input\" placeholder=\"\u67E5\u8BE2\" [(ngModel)]=\"searchToken\" (ngModelChange)=\"onSearch($event)\">\r\n        </np-input>\r\n        <i class=\"fas fa-search\"></i>\r\n      </div>\r\n      <np-checkbox class=\"select-all\" *ngIf=\"settings.isShowCheckedAll && !settings.single\" [(ngModel)]=\"isCheckedAll\"\r\n        (inputModelChange)=\"onSelectAll($event)\">\u5168\u9009\r\n      </np-checkbox>\r\n      <cdk-virtual-scroll-viewport itemSize=\"35\" [style.width.px]=\"settings.width\" #virtualScrollViewport>\r\n        <div *ngIf=\"!items || !items.length || items.length === 0\">{{ settings.noData }}</div>\r\n\r\n        <!-- Single select -->\r\n        <ng-container *ngIf=\"settings.single\">\r\n          <div *cdkVirtualFor=\"let item of items\" [class.active]=\"isActive(item)\" class=\"select-item\"\r\n            (click)=\"onSelect(item)\">\r\n            <ng-container *ngIf=\"!selectItemRef || !selectItemRef.template\">{{ item.label }}</ng-container>\r\n            <ng-container *ngIf=\"selectItemRef && selectItemRef.template\">\r\n              <ng-container *ngTemplateOutlet=\"selectItemRef.template; context: { item: item }\">\r\n              </ng-container>\r\n            </ng-container>\r\n          </div>\r\n        </ng-container>\r\n\r\n        <!-- Multiple select -->\r\n        <ng-container *ngIf=\"!settings.single\">\r\n          <div *cdkVirtualFor=\"let item of items\" [class.active]=\"isActive(item)\"\r\n            class=\"select-item flex-wrap row-flex\">\r\n            <np-checkbox [(ngModel)]=\"item.checked\" (inputModelChange)=\"onSelect(item)\">\r\n              <div style=\"width: 100%;\">\r\n                <ng-container *ngIf=\"!selectItemRef || !selectItemRef.template\">\r\n                  {{ item.label }}\r\n                </ng-container>\r\n                <ng-container *ngIf=\"selectItemRef && selectItemRef.template\">\r\n                  <ng-container *ngTemplateOutlet=\"selectItemRef.template; context: { item: item }\">\r\n                  </ng-container>\r\n                </ng-container>\r\n              </div>\r\n            </np-checkbox>\r\n          </div>\r\n        </ng-container>\r\n      </cdk-virtual-scroll-viewport>\r\n    </div>\r\n  </ng-template>\r\n</div>\r\n",
                    changeDetection: ChangeDetectionStrategy.OnPush,
                    host: {
                        '[class.disabled]': 'disabled === "true" || disabled === true'
                    },
                    providers: [
                        {
                            provide: NG_VALUE_ACCESSOR,
                            useExisting: forwardRef((/**
                             * @return {?}
                             */
                            function () { return NpDropdown; })),
                            multi: true,
                        }
                    ],
                    styles: [".np-dropdown-wrapper{position:relative;align-items:baseline;display:inline-block}.np-dropdown-wrapper .select-lbl{margin-right:20px;font-size:13px;font-weight:700}.np-dropdown-wrapper .selected-item-wrapper{box-sizing:content-box;display:inline-block;min-width:80px;padding:7.5px 6px;cursor:pointer;border-radius:3px;border-width:1px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;outline:0;font-size:13px}.np-dropdown-wrapper .selected-item-wrapper>.fas.fa-caret-down,.np-dropdown-wrapper .selected-item-wrapper>.fas.fa-caret-up{position:absolute;right:8px;line-height:20px}.np-dropdown-wrapper .selected-item-wrapper>.fas.fa-times{position:absolute;right:23px;line-height:20px;font-size:13px;padding:0 5px}.np-dropdown-wrapper .selected-item-wrapper>.none-badge-count{position:absolute;right:38px;line-height:20px;padding:0 5px}.np-dropdown-wrapper .selected-item-wrapper .mul-item-container{display:inline-block}.np-dropdown-wrapper .selected-item-wrapper .mul-item-container .mul-item{padding:2px 5px;margin-right:2px}.np-dropdown-wrapper .selected-item-wrapper .mul-item-container .mul-item .fas.fa-times{font-size:10px}.np-dropdown-viewport{min-width:80px;padding:0 6px;height:300px;border-radius:3px}.np-dropdown-viewport .search-container{display:flex;position:relative}.np-dropdown-viewport .search-container .fas.fa-search{position:absolute;left:12px;top:0;line-height:50px;font-size:14px}.np-dropdown-viewport .search-input{width:100%;margin-bottom:5px;margin-top:8px}.np-dropdown-viewport .search-input .input-container,.np-dropdown-viewport .search-input .np-input-wrapper,.np-dropdown-viewport .search-input input{width:100%!important}.np-dropdown-viewport .select-all{margin:6px}.np-dropdown-viewport>cdk-virtual-scroll-viewport{height:100%;margin-top:8px}.np-dropdown-viewport>cdk-virtual-scroll-viewport .select-item{height:28px;line-height:28px;padding:3px 6px;font-size:13px;cursor:pointer;align-items:center;margin-bottom:1px;box-sizing:content-box;white-space:nowrap}.np-dropdown-viewport>cdk-virtual-scroll-viewport .select-item>np-checkbox{margin-right:3px}.np-dropdown-viewport>cdk-virtual-scroll-viewport .select-item .np-checkbox-button-wrapper{margin:0!important}.np-dropdown-viewport>cdk-virtual-scroll-viewport .select-item .np-checkbox-button-wrapper span.input-helper{top:6px}"]
                }] }
    ];
    /** @nocollapse */
    NpDropdown.ctorParameters = function () { return [
        { type: ViewContainerRef },
        { type: OverlayService },
        { type: ChangeDetectorRef },
        { type: Renderer2 }
    ]; };
    NpDropdown.propDecorators = {
        disabled: [{ type: Input }],
        settings: [{ type: Input }],
        items: [{ type: Input }],
        selectedItem: [{ type: Input }],
        onSelected: [{ type: Output }],
        onDeselected: [{ type: Output }],
        onSelectedAll: [{ type: Output }],
        onDeselectedAll: [{ type: Output }],
        selectItemRef: [{ type: ContentChild, args: [NpDropdownItemDirective,] }],
        viewPort: [{ type: ViewChild, args: ['virtualScrollViewport',] }]
    };
    return NpDropdown;
}());
export { NpDropdown };
if (false) {
    /**
     * @type {?}
     * @private
     */
    NpDropdown.prototype.emitChange;
    /**
     * 是否禁用状态
     * @type {?}
     */
    NpDropdown.prototype.disabled;
    /**
     * 下拉组件的基础设置,如是否单选等
     * @type {?}
     */
    NpDropdown.prototype.settings;
    /**
     * 全部下拉选项
     * @type {?}
     */
    NpDropdown.prototype.items;
    /**
     * 已选项 - 单选为一个对象, 多选则为一组数组
     * @type {?}
     */
    NpDropdown.prototype.selectedItem;
    /**
     * 选择时触发
     * @type {?}
     */
    NpDropdown.prototype.onSelected;
    /**
     * 取消选择时触发
     * @type {?}
     */
    NpDropdown.prototype.onDeselected;
    /**
     * 全选时触发
     * @type {?}
     */
    NpDropdown.prototype.onSelectedAll;
    /**
     * 取消全选时触发
     * @type {?}
     */
    NpDropdown.prototype.onDeselectedAll;
    /** @type {?} */
    NpDropdown.prototype.selectItemRef;
    /** @type {?} */
    NpDropdown.prototype.viewPort;
    /**
     * @type {?}
     * @private
     */
    NpDropdown.prototype.originItems;
    /**
     * 查询Token
     * @type {?}
     */
    NpDropdown.prototype.searchToken;
    /**
     * 多选下拉框
     * @type {?}
     */
    NpDropdown.prototype.selectedItems;
    /** @type {?} */
    NpDropdown.prototype.selectedBadgeItems;
    /** @type {?} */
    NpDropdown.prototype.noneBadgeCount;
    /** @type {?} */
    NpDropdown.prototype._isCheckedAll;
    /**
     * @type {?}
     * @private
     */
    NpDropdown.prototype.viewContainerRef;
    /**
     * @type {?}
     * @private
     */
    NpDropdown.prototype.overlayService;
    /**
     * @type {?}
     * @private
     */
    NpDropdown.prototype.cdf;
    /**
     * @type {?}
     * @private
     */
    NpDropdown.prototype.renderer2;
}
/**
 * @record
 */
export function NpDropdownSettings() { }
if (false) {
    /**
     * Left side label name
     * @type {?|undefined}
     */
    NpDropdownSettings.prototype.lblName;
    /**
     * Set if it is single dropdown, default is true - single dropdown
     * @type {?|undefined}
     */
    NpDropdownSettings.prototype.single;
    /**
     * Check if it is required. if not, show remove icon, otherwise hide the remove icon
     * @type {?|undefined}
     */
    NpDropdownSettings.prototype.isRequired;
    /**
     * Placeholder for dropdown
     * @type {?|undefined}
     */
    NpDropdownSettings.prototype.placeHolder;
    /**
     * Set the width of dropdown, default is 220, unit px
     * @type {?|undefined}
     */
    NpDropdownSettings.prototype.width;
    /**
     * Display badge count, default is 99999
     * @type {?|undefined}
     */
    NpDropdownSettings.prototype.badge;
    /**
     * 是否展示全选按钮
     * @type {?|undefined}
     */
    NpDropdownSettings.prototype.isShowCheckedAll;
    /**
     * 是否默认全选
     * @type {?|undefined}
     */
    NpDropdownSettings.prototype.isCheckedAll;
    /**
     * 没有数据时展示的文案,默认为‘没有数据!’
     * @type {?|undefined}
     */
    NpDropdownSettings.prototype.noData;
    /**
     * 是否显示搜索框,默认展示
     * @type {?|undefined}
     */
    NpDropdownSettings.prototype.isShowSearchBox;
    /**
     * 当下拉框有已选项,单选时,打开下拉框会自动滚动到已选项;当为多选时,打开下拉框会自动滚动到已选项的第一项;默认打开为true
     * @type {?|undefined}
     */
    NpDropdownSettings.prototype.autoScrollTo;
}
/**
 * @record
 */
export function NpDropdownItem() { }
if (false) {
    /** @type {?} */
    NpDropdownItem.prototype.id;
    /** @type {?} */
    NpDropdownItem.prototype.label;
    /* Skipping unhandled member: [key: string]: any;*/
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJvcGRvd24uanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZ3gtcGx1dG8vIiwic291cmNlcyI6WyJsaWIvZHJvcGRvd24vZHJvcGRvd24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFVLEtBQUssRUFBZSxnQkFBZ0IsRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSxVQUFVLEVBQWlCLGlCQUFpQixFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7O0FBRXpOLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3BFLE9BQU8sRUFBRSxpQkFBaUIsRUFBd0IsTUFBTSxnQkFBZ0IsQ0FBQztBQUN6RSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDM0QsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sd0JBQXdCLENBQUM7Ozs7Ozs7QUFRbEU7SUFtSEUsWUFBWTtJQUVaLG9CQUFvQixnQkFBa0MsRUFDNUMsY0FBOEIsRUFDOUIsR0FBc0IsRUFDdEIsU0FBb0I7UUFIVixxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO1FBQzVDLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQUM5QixRQUFHLEdBQUgsR0FBRyxDQUFtQjtRQUN0QixjQUFTLEdBQVQsU0FBUyxDQUFXO1FBeEd0QixlQUFVOzs7O1FBQUcsVUFBQyxDQUFNLElBQU8sQ0FBQyxFQUFDOzs7O1FBRzVCLGFBQVEsR0FBUSxLQUFLLENBQUM7Ozs7UUFNdEIsVUFBSyxHQUEwQixFQUFFLENBQUM7Ozs7UUFNakMsZUFBVSxHQUFHLElBQUksWUFBWSxFQUEwQyxDQUFDOzs7O1FBRXhFLGlCQUFZLEdBQUcsSUFBSSxZQUFZLEVBQTBDLENBQUM7Ozs7UUFFMUUsa0JBQWEsR0FBRyxJQUFJLFlBQVksRUFBMEMsQ0FBQzs7OztRQUUzRSxvQkFBZSxHQUFHLElBQUksWUFBWSxFQUEwQyxDQUFDO1FBTS9FLGdCQUFXLEdBQTBCLEVBQUUsQ0FBQzs7OztRQWlCaEQsa0JBQWEsR0FBMEIsRUFBRSxDQUFDO1FBQzFDLHVCQUFrQixHQUEwQixFQUFFLENBQUM7UUFDL0MsbUJBQWMsR0FBVyxDQUFDLENBQUM7UUE2QzNCLGtCQUFhLEdBQVksS0FBSyxDQUFDO0lBYUcsQ0FBQztJQXZFbkMsc0JBQUkscUNBQWE7UUFGakIsZ0JBQWdCO1FBQ2hCLFdBQVc7Ozs7Ozs7UUFDWDtZQUNFLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUV2QixJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFO2dCQUN4QixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsbUJBQUEsSUFBSSxDQUFDLFlBQVksRUFBa0IsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUM7YUFDcEc7WUFFRCxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDO1FBQ25DLENBQUM7OztPQUFBOzs7OztJQU9PLHdDQUFtQjs7OztJQUEzQjtRQUNFLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUU7WUFDeEIsT0FBTztTQUNSO1FBRUQsdUJBQXVCO1FBQ3ZCLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQzs7WUFDbkIsYUFBYSxHQUFHLG1CQUFBLElBQUksQ0FBQyxZQUFZLEVBQXlCO1FBQzlELElBQUksYUFBYSxJQUFJLGFBQWEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQzdDLElBQUksQ0FBQyxhQUFhLG9CQUFPLGFBQWEsQ0FBQyxDQUFDO1NBQ3pDO2FBQU07WUFDTCxJQUFJLENBQUMsYUFBYSxHQUFHLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztTQUNyRTs7OztZQUlHLEtBQUssb0JBQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQztRQUNuQyxLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDbEMsSUFBSSxDQUFDLGtCQUFrQixHQUFHLEtBQUssQ0FBQztRQUNoQyxZQUFZO1FBRVosSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztRQUV0RSxJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQzNCLENBQUM7SUFFRCxzQkFBSSxzQ0FBYzs7OztRQUFsQjtZQUNFLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUMxQyxDQUFDOzs7T0FBQTtJQUVELHNCQUFJLHNDQUFjOzs7O1FBQWxCO1lBQ0UsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRTtnQkFDeEIsT0FBTyxJQUFJLENBQUMsYUFBYSxLQUFLLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDO2FBQ3pEO1lBRUQsb0JBQW9CO1lBQ3BCLElBQUksSUFBSSxDQUFDLGFBQWEsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7Z0JBQ3ZELE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEtBQUssSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUM7YUFDbEU7WUFFRCxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7OztPQUFBO0lBR0Qsc0JBQUksb0NBQVk7Ozs7UUFBaEI7WUFDRSxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxLQUFLLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDO1FBQ3hELENBQUM7Ozs7O1FBRUQsVUFBaUIsR0FBWTtZQUMzQixJQUFJLENBQUMsYUFBYSxHQUFHLEdBQUcsQ0FBQztRQUMzQixDQUFDOzs7T0FKQTs7OztJQVlELDZCQUFROzs7SUFBUjtRQUNFLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUNkLENBQUM7Ozs7O0lBRUQsZ0NBQVc7Ozs7SUFBWCxVQUFZLE9BQXNCOztZQUM1QixLQUFLLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQztRQUM1QixJQUFJLEtBQUssSUFBSSxLQUFLLENBQUMsWUFBWSxJQUFJLEtBQUssQ0FBQyxZQUFZLENBQUMsTUFBTSxJQUFJLENBQUMsRUFBRTtZQUNqRSxJQUFJLENBQUMsV0FBVyxvQkFBTyxLQUFLLENBQUMsWUFBWSxDQUFDLENBQUM7U0FDNUM7SUFDSCxDQUFDOzs7OztJQUVELGdDQUFXOzs7O0lBQVgsVUFBWSxPQUFnQjtRQUMxQixJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU87Ozs7UUFBQyxVQUFBLElBQUk7WUFDckIsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7UUFDekIsQ0FBQyxFQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsWUFBWSxHQUFHLE9BQU8sQ0FBQyxDQUFDLGtCQUFLLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNuRCxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztRQUMzQixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDM0MsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDckMsQ0FBQzs7Ozs7SUFFRCw2QkFBUTs7OztJQUFSLFVBQVMsSUFBb0I7UUFDM0IsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRTtZQUN4QixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQztZQUN6QixJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUMzQixJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3RCLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUM7WUFFekIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztZQUMxQyxPQUFPO1NBQ1I7UUFFRCwyQkFBMkI7UUFDM0IsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRTtZQUNuRCxJQUFJLENBQUMsWUFBWSxHQUFHLEVBQUUsQ0FBQztTQUN4QjtRQUVELElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRTtZQUNoQixJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUM5QjthQUFNO1lBQ0wsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU07Ozs7WUFBQyxVQUFDLENBQWlCLElBQUssT0FBQSxDQUFDLENBQUMsRUFBRSxLQUFLLElBQUksQ0FBQyxFQUFFLEVBQWhCLENBQWdCLEVBQUMsQ0FBQztTQUN2RjtRQUVELElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1FBQzNCLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzNCLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ25DLFlBQVk7SUFDZCxDQUFDOzs7OztJQUVELDZCQUFROzs7O0lBQVIsVUFBUyxHQUFRO1FBQ2YsSUFBSSxDQUFDLEdBQUcsRUFBRTtZQUNSLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNuQixPQUFPO1NBQ1I7UUFFRCxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTTs7OztRQUFDLFVBQUEsQ0FBQyxJQUFJLE9BQUEsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQXpCLENBQXlCLEVBQUMsQ0FBQztJQUN2RSxDQUFDOzs7OztJQUVELDZCQUFROzs7O0lBQVIsVUFBUyxJQUFvQjtRQUMzQixJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRTtZQUN0QixPQUFPLEtBQUssQ0FBQztTQUNkO1FBRUQsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRTtZQUN4QixPQUFPLElBQUksQ0FBQyxFQUFFLEtBQUssQ0FBQyxtQkFBQSxJQUFJLENBQUMsWUFBWSxFQUFrQixDQUFDLENBQUMsRUFBRSxDQUFDO1NBQzdEO1FBRUQsb0JBQW9CO1FBQ3BCLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJOzs7O1FBQUMsVUFBQSxDQUFDLElBQUksT0FBQSxDQUFDLENBQUMsRUFBRSxLQUFLLElBQUksQ0FBQyxFQUFFLEVBQWhCLENBQWdCLEVBQUMsQ0FBQztJQUN2RCxDQUFDOzs7Ozs7O0lBRUQsbUNBQWM7Ozs7OztJQUFkLFVBQWUsTUFBa0IsRUFBRSxXQUE2QixFQUFFLE1BQW1CO1FBQXJGLGlCQWdEQztRQS9DQyxNQUFNLENBQUMsZUFBZSxFQUFFLENBQUM7UUFFekIsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ2pCLE9BQU87U0FDUjtRQUVELElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRTtZQUN2QixJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNoQyxPQUFPO1NBQ1I7UUFFRCxJQUFJLENBQUMsY0FBYyxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsV0FBVyxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsQ0FBQyxTQUFTOzs7UUFBQztZQUMzRixRQUFRO1FBQ1YsQ0FBQyxFQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztRQUMvQixVQUFVOzs7UUFBQztZQUNULEtBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1FBQzlCLENBQUMsR0FBRSxHQUFHLENBQUMsQ0FBQztRQUVSLHdFQUF3RTtRQUN4RSxrQ0FBa0M7UUFDbEMsVUFBVTs7O1FBQUM7WUFDVCxJQUFJLENBQUMsS0FBSSxDQUFDLGNBQWMsQ0FBQyxVQUFVLElBQUksQ0FBQyxLQUFJLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxjQUFjLEVBQUU7Z0JBQ3JGLE9BQU87YUFDUjs7Z0JBRUcsY0FBYyxHQUFHLEtBQUksQ0FBQyxjQUFjLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxzQkFBc0IsQ0FBQyxrQkFBa0IsQ0FBQzs7Z0JBQ3pHLGNBQWMsR0FBRyxLQUFJLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsc0JBQXNCLENBQUMsaUJBQWlCLENBQUM7O2dCQUN4RyxPQUFPLEdBQUcsS0FBSSxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLHNCQUFzQixDQUFDLFVBQVUsQ0FBQztZQUM5RixJQUFJLGNBQWMsSUFBSSxjQUFjLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtnQkFDL0MsS0FBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQzthQUM3RDtZQUVELElBQUksY0FBYyxJQUFJLGNBQWMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO2dCQUMvQyxLQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDO2FBQzdEO1lBRUQsSUFBSSxPQUFPLElBQUksT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7Z0JBQ2pDLEtBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLEVBQUUsS0FBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLENBQUM7Z0JBQ3pFLEtBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxjQUFjLEVBQUUsTUFBTSxDQUFDLENBQUM7Z0JBQzVELEtBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxZQUFZLEVBQUUsTUFBTSxDQUFDLENBQUM7Z0JBQzFELEtBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxhQUFhLEVBQUUsTUFBTSxDQUFDLENBQUM7Z0JBQzNELEtBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxjQUFjLEVBQUUsTUFBTSxDQUFDLENBQUM7Z0JBQzVELEtBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxZQUFZLEVBQUUsTUFBTSxDQUFDLENBQUM7YUFDM0Q7UUFDSCxDQUFDLEdBQUUsQ0FBQyxDQUFDLENBQUM7SUFDUixDQUFDOzs7OztJQUVELGtDQUFhOzs7O0lBQWIsVUFBYyxNQUFrQjtRQUM5QixJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDakIsT0FBTztTQUNSO1FBRUQsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDckQsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ25CLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTzs7OztRQUFDLFVBQUEsSUFBSTtZQUNyQixJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztRQUN2QixDQUFDLEVBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1FBQzNCLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN0QyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUNuQyxNQUFNLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDM0IsQ0FBQzs7Ozs7O0lBRUQsaUNBQVk7Ozs7O0lBQVosVUFBYSxNQUFrQixFQUFFLElBQW9CO1FBQ25ELElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUNqQixPQUFPO1NBQ1I7UUFFRCxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTTs7OztRQUFDLFVBQUMsQ0FBaUIsSUFBSyxPQUFBLENBQUMsQ0FBQyxFQUFFLEtBQUssSUFBSSxDQUFDLEVBQUUsRUFBaEIsQ0FBZ0IsRUFBQyxDQUFDO1FBQ3RGLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUVuQixJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztRQUVyQixJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztRQUMzQixJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM3QixJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUNuQyxNQUFNLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDM0IsQ0FBQztJQUVELGlEQUFpRDs7Ozs7O0lBQ2pELCtCQUFVOzs7Ozs7SUFBVixVQUFXLEdBQVE7UUFDakIseURBQXlEO1FBQ3pELElBQUksR0FBRyxLQUFLLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFO1lBQ3pDLE9BQU87U0FDUjtRQUVELElBQUksQ0FBQyxZQUFZLEdBQUcsR0FBRyxDQUFDO1FBQ3hCLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUU7WUFDeEIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsQ0FBQztTQUMxQjthQUFNO1lBQ0wsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPOzs7O1lBQUMsVUFBQSxJQUFJO2dCQUM1QixJQUFJLElBQUksQ0FBQyxPQUFPLEtBQUssU0FBUyxFQUFFO29CQUM5QixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztpQkFDckI7WUFDSCxDQUFDLEVBQUMsQ0FBQztZQUNILElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1NBQzVCO0lBQ0gsQ0FBQzs7Ozs7SUFFRCxxQ0FBZ0I7Ozs7SUFBaEIsVUFBaUIsRUFBTztRQUN0QixJQUFJLENBQUMsVUFBVSxHQUFHLEVBQUUsQ0FBQztJQUN2QixDQUFDOzs7OztJQUVELHNDQUFpQjs7OztJQUFqQixVQUFrQixFQUFPLElBQVUsQ0FBQztJQUNwQyxZQUFZO0lBRVoseUJBQXlCOzs7Ozs7O0lBQ2pCLHlCQUFJOzs7Ozs7O0lBQVo7UUFDRSxJQUFJLENBQUMsV0FBVyxvQkFBTyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7O1lBQy9CLFlBQVksR0FBdUI7WUFDckMsTUFBTSxFQUFFLElBQUk7WUFDWixXQUFXLEVBQUUsS0FBSztZQUNsQixLQUFLLEVBQUUsR0FBRztZQUNWLEtBQUssRUFBRSxLQUFLO1lBQ1osZUFBZSxFQUFFLElBQUk7WUFDckIsTUFBTSxFQUFFLE9BQU87WUFDZixZQUFZLEVBQUUsSUFBSTtTQUNuQjtRQUVELElBQUksQ0FBQyxRQUFRLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQzdELENBQUM7Ozs7O0lBRU8sb0NBQWU7Ozs7SUFBdkI7UUFBQSxpQkFtQkM7UUFsQkMsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRTtZQUN4QixJQUFJLElBQUksQ0FBQyxZQUFZLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUk7Ozs7WUFBQyxVQUFBLENBQUMsSUFBSSxPQUFBLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxtQkFBQSxLQUFJLENBQUMsWUFBWSxFQUFrQixDQUFDLENBQUMsRUFBRSxFQUFqRCxDQUFpRCxFQUFDLEVBQUU7Z0JBQ3ZHLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDO2FBQzFCO1NBQ0Y7YUFBTTtZQUNMLG9CQUFvQjtZQUNwQixJQUFJLElBQUksQ0FBQyxZQUFZLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFOztvQkFDakQsZUFBYSxHQUFHLEVBQUU7Z0JBQ3RCLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTzs7OztnQkFBQyxVQUFDLElBQW9CO29CQUM3QyxJQUFJLEtBQUksQ0FBQyxXQUFXLENBQUMsSUFBSTs7OztvQkFBQyxVQUFBLENBQUMsSUFBSSxPQUFBLENBQUMsQ0FBQyxFQUFFLEtBQUssSUFBSSxDQUFDLEVBQUUsRUFBaEIsQ0FBZ0IsRUFBQyxFQUFFO3dCQUNoRCxlQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO3FCQUMxQjtnQkFDSCxDQUFDLEVBQUMsQ0FBQztnQkFFSCxJQUFJLENBQUMsWUFBWSxHQUFHLEVBQUUsQ0FBQztnQkFDdkIsSUFBSSxDQUFDLFlBQVksR0FBRyxlQUFhLENBQUM7YUFDbkM7U0FDRjtJQUNILENBQUM7SUFFRDs7T0FFRzs7Ozs7O0lBQ0ssZ0NBQVc7Ozs7O0lBQW5CO1FBQ0UsSUFBSSxDQUFDLFdBQVcsR0FBRyxFQUFFLENBQUM7UUFDdEIsSUFBSSxDQUFDLEtBQUssb0JBQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBRW5DLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO0lBQ2pDLENBQUM7Ozs7O0lBRU8sNENBQXVCOzs7O0lBQS9CO1FBQUEsaUJBU0M7UUFSQyxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFO1lBQ3hCLE9BQU87U0FDUjtRQUVELElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTzs7OztRQUFDLFVBQUEsSUFBSTs7Z0JBQ2pCLFlBQVksR0FBRyxLQUFJLENBQUMsWUFBWSxDQUFDLElBQUk7Ozs7WUFBQyxVQUFBLENBQUMsSUFBSSxPQUFBLENBQUMsQ0FBQyxFQUFFLEtBQUssSUFBSSxDQUFDLEVBQUUsRUFBaEIsQ0FBZ0IsRUFBQztZQUNoRSxJQUFJLENBQUMsT0FBTyxHQUFHLFlBQVksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7UUFDN0MsQ0FBQyxFQUFDLENBQUM7SUFDTCxDQUFDOzs7OztJQUVPLHlDQUFvQjs7OztJQUE1QjtRQUNFLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFlBQVksRUFBRTtZQUMvQixPQUFPO1NBQ1I7O1lBRUcsSUFBSSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLG1CQUFBLElBQUksQ0FBQyxZQUFZLEVBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDckgsSUFBSSxJQUFJLEVBQUU7O2dCQUNGLGFBQWEsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVM7Ozs7WUFBQyxVQUFBLENBQUMsSUFBSSxPQUFBLENBQUMsQ0FBQyxFQUFFLEtBQUssSUFBSSxDQUFDLEVBQUUsRUFBaEIsQ0FBZ0IsRUFBQztZQUN2RSxJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxhQUFhLEVBQUUsUUFBUSxDQUFDLENBQUM7U0FDdEQ7SUFDSCxDQUFDOztnQkFwWEYsU0FBUyxTQUFDO29CQUNULFFBQVEsRUFBRSxhQUFhO29CQUN2QixxbElBQTRCO29CQUU1QixlQUFlLEVBQUUsdUJBQXVCLENBQUMsTUFBTTtvQkFDL0MsSUFBSSxFQUFFO3dCQUNKLGtCQUFrQixFQUFFLDBDQUEwQztxQkFDL0Q7b0JBQ0QsU0FBUyxFQUFFO3dCQUNUOzRCQUNFLE9BQU8sRUFBRSxpQkFBaUI7NEJBQzFCLFdBQVcsRUFBRSxVQUFVOzs7NEJBQUMsY0FBTSxPQUFBLFVBQVUsRUFBVixDQUFVLEVBQUM7NEJBQ3pDLEtBQUssRUFBRSxJQUFJO3lCQUNaO3FCQUFDOztpQkFDTDs7OztnQkEzQitDLGdCQUFnQjtnQkFJdkQsY0FBYztnQkFKMEcsaUJBQWlCO2dCQUEyQixTQUFTOzs7MkJBZ0NuTCxLQUFLOzJCQUdMLEtBQUs7d0JBR0wsS0FBSzsrQkFHTCxLQUFLOzZCQUdMLE1BQU07K0JBRU4sTUFBTTtnQ0FFTixNQUFNO2tDQUVOLE1BQU07Z0NBRU4sWUFBWSxTQUFDLHVCQUF1QjsyQkFFcEMsU0FBUyxTQUFDLHVCQUF1Qjs7SUE2VXBDLGlCQUFDO0NBQUEsQUF0WEQsSUFzWEM7U0F2V1ksVUFBVTs7Ozs7O0lBQ3JCLGdDQUFxQzs7Ozs7SUFHckMsOEJBQStCOzs7OztJQUcvQiw4QkFBc0M7Ozs7O0lBR3RDLDJCQUEyQzs7Ozs7SUFHM0Msa0NBQThEOzs7OztJQUc5RCxnQ0FBa0Y7Ozs7O0lBRWxGLGtDQUFvRjs7Ozs7SUFFcEYsbUNBQXFGOzs7OztJQUVyRixxQ0FBdUY7O0lBRXZGLG1DQUE4RTs7SUFFOUUsOEJBQXVFOzs7OztJQUV2RSxpQ0FBZ0Q7Ozs7O0lBRWhELGlDQUFvQjs7Ozs7SUFlcEIsbUNBQTBDOztJQUMxQyx3Q0FBK0M7O0lBQy9DLG9DQUEyQjs7SUE2QzNCLG1DQUErQjs7Ozs7SUFVbkIsc0NBQTBDOzs7OztJQUNwRCxvQ0FBc0M7Ozs7O0lBQ3RDLHlCQUE4Qjs7Ozs7SUFDOUIsK0JBQTRCOzs7OztBQWdRaEMsd0NBaUNDOzs7Ozs7SUEvQkMscUNBQWlCOzs7OztJQUdqQixvQ0FBaUI7Ozs7O0lBR2pCLHdDQUFxQjs7Ozs7SUFHckIseUNBQXFCOzs7OztJQUdyQixtQ0FBZTs7Ozs7SUFHZixtQ0FBZTs7Ozs7SUFHZiw4Q0FBMkI7Ozs7O0lBRzNCLDBDQUF1Qjs7Ozs7SUFHdkIsb0NBQWdCOzs7OztJQUdoQiw2Q0FBMEI7Ozs7O0lBRzFCLDBDQUF1Qjs7Ozs7QUFHekIsb0NBSUM7OztJQUhDLDRCQUFvQjs7SUFDcEIsK0JBQWMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgSW5wdXQsIFRlbXBsYXRlUmVmLCBWaWV3Q29udGFpbmVyUmVmLCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgQ29udGVudENoaWxkLCBmb3J3YXJkUmVmLCBTaW1wbGVDaGFuZ2VzLCBDaGFuZ2VEZXRlY3RvclJlZiwgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIFJlbmRlcmVyMiwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbi8vIGltcG9ydCB7IE92ZXJsYXlTZXJ2aWNlIH0gZnJvbSAnLi4vY29tbW9uJztcclxuaW1wb3J0IHsgTnBEcm9wZG93bkl0ZW1EaXJlY3RpdmUgfSBmcm9tICcuL2Ryb3Bkb3duLWl0ZW0uZGlyZWN0aXZlJztcclxuaW1wb3J0IHsgTkdfVkFMVUVfQUNDRVNTT1IsIENvbnRyb2xWYWx1ZUFjY2Vzc29yIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBPdmVybGF5U2VydmljZSB9IGZyb20gJy4uL2NvbW1vbi9vdmVybGF5LnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBDZGtWaXJ0dWFsU2Nyb2xsVmlld3BvcnQgfSBmcm9tICdAYW5ndWxhci9jZGsvc2Nyb2xsaW5nJztcclxuXHJcbi8qKlxyXG4gKiDkuIvmi4npgInmi6nnu4Tku7YgLSDmlK/mjIHljZXpgInlkozlpJrpgInlip/og71cclxuICogXHJcbiAqIDxleGFtcGxlLXVybD5odHRwczovL3N0YWNrYmxpdHouY29tL2VkaXQvbnAtZHJvcGRvd24tc2FtcGxlP2VtYmVkPTEmZmlsZT1zcmMvYXBwL2FwcC5jb21wb25lbnQuaHRtbDwvZXhhbXBsZS11cmw+XHJcbiAqIFxyXG4gKi9cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6IGBucC1kcm9wZG93bmAsXHJcbiAgdGVtcGxhdGVVcmw6ICdkcm9wZG93bi5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnZHJvcGRvd24uc2NzcyddLFxyXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxyXG4gIGhvc3Q6IHtcclxuICAgICdbY2xhc3MuZGlzYWJsZWRdJzogJ2Rpc2FibGVkID09PSBcInRydWVcIiB8fCBkaXNhYmxlZCA9PT0gdHJ1ZSdcclxuICB9LFxyXG4gIHByb3ZpZGVyczogW1xyXG4gICAge1xyXG4gICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcclxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gTnBEcm9wZG93biksXHJcbiAgICAgIG11bHRpOiB0cnVlLFxyXG4gICAgfV1cclxufSlcclxuZXhwb3J0IGNsYXNzIE5wRHJvcGRvd24gaW1wbGVtZW50cyBPbkluaXQsIENvbnRyb2xWYWx1ZUFjY2Vzc29yIHtcclxuICBwcml2YXRlIGVtaXRDaGFuZ2UgPSAoXzogYW55KSA9PiB7IH07XHJcblxyXG4gIC8qKuaYr+WQpuemgeeUqOeKtuaAgSAqL1xyXG4gIEBJbnB1dCgpIGRpc2FibGVkOiBhbnkgPSBmYWxzZTtcclxuXHJcbiAgLyoq5LiL5ouJ57uE5Lu255qE5Z+656GA6K6+572u77yM5aaC5piv5ZCm5Y2V6YCJ562JICovXHJcbiAgQElucHV0KCkgc2V0dGluZ3M6IE5wRHJvcGRvd25TZXR0aW5ncztcclxuXHJcbiAgLyoq5YWo6YOo5LiL5ouJ6YCJ6aG5ICovXHJcbiAgQElucHV0KCkgaXRlbXM6IEFycmF5PE5wRHJvcGRvd25JdGVtPiA9IFtdO1xyXG5cclxuICAvKirlt7LpgInpobkgLSDljZXpgInkuLrkuIDkuKrlr7nosaHvvIwg5aSa6YCJ5YiZ5Li65LiA57uE5pWw57uEICovXHJcbiAgQElucHV0KCkgc2VsZWN0ZWRJdGVtOiBOcERyb3Bkb3duSXRlbSB8IEFycmF5PE5wRHJvcGRvd25JdGVtPjtcclxuXHJcbiAgLyoq6YCJ5oup5pe26Kem5Y+RICovXHJcbiAgQE91dHB1dCgpIG9uU2VsZWN0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPE5wRHJvcGRvd25JdGVtIHwgQXJyYXk8TnBEcm9wZG93bkl0ZW0+PigpO1xyXG4gIC8qKuWPlua2iOmAieaLqeaXtuinpuWPkSAqL1xyXG4gIEBPdXRwdXQoKSBvbkRlc2VsZWN0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPE5wRHJvcGRvd25JdGVtIHwgQXJyYXk8TnBEcm9wZG93bkl0ZW0+PigpO1xyXG4gIC8qKuWFqOmAieaXtuinpuWPkSAqL1xyXG4gIEBPdXRwdXQoKSBvblNlbGVjdGVkQWxsID0gbmV3IEV2ZW50RW1pdHRlcjxOcERyb3Bkb3duSXRlbSB8IEFycmF5PE5wRHJvcGRvd25JdGVtPj4oKTtcclxuICAvKirlj5bmtojlhajpgInml7bop6blj5EgKi9cclxuICBAT3V0cHV0KCkgb25EZXNlbGVjdGVkQWxsID0gbmV3IEV2ZW50RW1pdHRlcjxOcERyb3Bkb3duSXRlbSB8IEFycmF5PE5wRHJvcGRvd25JdGVtPj4oKTtcclxuXHJcbiAgQENvbnRlbnRDaGlsZChOcERyb3Bkb3duSXRlbURpcmVjdGl2ZSkgc2VsZWN0SXRlbVJlZjogTnBEcm9wZG93bkl0ZW1EaXJlY3RpdmU7XHJcblxyXG4gIEBWaWV3Q2hpbGQoJ3ZpcnR1YWxTY3JvbGxWaWV3cG9ydCcpIHZpZXdQb3J0OiBDZGtWaXJ0dWFsU2Nyb2xsVmlld3BvcnQ7XHJcblxyXG4gIHByaXZhdGUgb3JpZ2luSXRlbXM6IEFycmF5PE5wRHJvcGRvd25JdGVtPiA9IFtdO1xyXG4gIC8qKuafpeivolRva2VuICovXHJcbiAgc2VhcmNoVG9rZW46IHN0cmluZztcclxuXHJcbiAgLy8jcmVnaW9uIEdldHRlclxyXG4gIC8qKuWNlemAieS4i+aLieahhiAqL1xyXG4gIGdldCBzZWxlY3RlZExhYmVsKCkge1xyXG4gICAgdGhpcy5jaGVja0l0ZW1FeGlzdHMoKTtcclxuXHJcbiAgICBpZiAodGhpcy5zZXR0aW5ncy5zaW5nbGUpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRJdGVtID8gKHRoaXMuc2VsZWN0ZWRJdGVtIGFzIE5wRHJvcGRvd25JdGVtKS5sYWJlbCA6IHRoaXMuc2V0dGluZ3MucGxhY2VIb2xkZXI7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuc2V0dGluZ3MucGxhY2VIb2xkZXI7XHJcbiAgfVxyXG5cclxuICAvKirlpJrpgInkuIvmi4nmoYYgKi9cclxuICBzZWxlY3RlZEl0ZW1zOiBBcnJheTxOcERyb3Bkb3duSXRlbT4gPSBbXTtcclxuICBzZWxlY3RlZEJhZGdlSXRlbXM6IEFycmF5PE5wRHJvcGRvd25JdGVtPiA9IFtdO1xyXG4gIG5vbmVCYWRnZUNvdW50OiBudW1iZXIgPSAwO1xyXG5cclxuICBwcml2YXRlIGJ1aWxkTXVsdGlwbGVTZWxlY3QoKSB7XHJcbiAgICBpZiAodGhpcy5zZXR0aW5ncy5zaW5nbGUpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIC8vI3JlZ2lvbiBzZWxlY3RlZEl0ZW1zXHJcbiAgICB0aGlzLmNoZWNrSXRlbUV4aXN0cygpO1xyXG4gICAgbGV0IHNlbGVjdGVkSXRlbXMgPSB0aGlzLnNlbGVjdGVkSXRlbSBhcyBBcnJheTxOcERyb3Bkb3duSXRlbT47XHJcbiAgICBpZiAoc2VsZWN0ZWRJdGVtcyAmJiBzZWxlY3RlZEl0ZW1zLmxlbmd0aCA+IDApIHtcclxuICAgICAgdGhpcy5zZWxlY3RlZEl0ZW1zID0gWy4uLnNlbGVjdGVkSXRlbXNdO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5zZWxlY3RlZEl0ZW1zID0gW3sgaWQ6IC0xLCBsYWJlbDogdGhpcy5zZXR0aW5ncy5wbGFjZUhvbGRlciB9XTtcclxuICAgIH1cclxuICAgIC8vI2VuZHJlZ2lvblxyXG5cclxuICAgIC8vI3JlZ2lvbiBzZWxlY3RlZEJhZGdlSXRlbXNcclxuICAgIGxldCBpdGVtcyA9IFsuLi50aGlzLnNlbGVjdGVkSXRlbXNdO1xyXG4gICAgaXRlbXMuc3BsaWNlKHRoaXMuc2V0dGluZ3MuYmFkZ2UpO1xyXG4gICAgdGhpcy5zZWxlY3RlZEJhZGdlSXRlbXMgPSBpdGVtcztcclxuICAgIC8vI2VuZHJlZ2lvblxyXG5cclxuICAgIHRoaXMubm9uZUJhZGdlQ291bnQgPSB0aGlzLnNlbGVjdGVkSXRlbXMubGVuZ3RoIC0gdGhpcy5zZXR0aW5ncy5iYWRnZTtcclxuXHJcbiAgICB0aGlzLmNkZi5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgfVxyXG5cclxuICBnZXQgaXNEcm9wZG93bk9wZW4oKSB7XHJcbiAgICByZXR1cm4gdGhpcy5vdmVybGF5U2VydmljZS5pc0F0dGFjaGVkKCk7XHJcbiAgfVxyXG5cclxuICBnZXQgaXNJdGVtU2VsZWN0ZWQoKSB7XHJcbiAgICBpZiAodGhpcy5zZXR0aW5ncy5zaW5nbGUpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRMYWJlbCAhPT0gdGhpcy5zZXR0aW5ncy5wbGFjZUhvbGRlcjtcclxuICAgIH1cclxuXHJcbiAgICAvLyBNdWx0aXBsZSBkcm9wZG93blxyXG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRJdGVtcyAmJiB0aGlzLnNlbGVjdGVkSXRlbXMubGVuZ3RoID4gMCkge1xyXG4gICAgICByZXR1cm4gdGhpcy5zZWxlY3RlZEl0ZW1zWzBdLmxhYmVsICE9PSB0aGlzLnNldHRpbmdzLnBsYWNlSG9sZGVyO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIF9pc0NoZWNrZWRBbGw6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBnZXQgaXNDaGVja2VkQWxsKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuaXRlbXMubGVuZ3RoID09PSB0aGlzLnNlbGVjdGVkSXRlbS5sZW5ndGg7XHJcbiAgfVxyXG5cclxuICBzZXQgaXNDaGVja2VkQWxsKHZhbDogYm9vbGVhbikge1xyXG4gICAgdGhpcy5faXNDaGVja2VkQWxsID0gdmFsO1xyXG4gIH1cclxuICAvLyNlbmRyZWdpb25cclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSB2aWV3Q29udGFpbmVyUmVmOiBWaWV3Q29udGFpbmVyUmVmLFxyXG4gICAgcHJpdmF0ZSBvdmVybGF5U2VydmljZTogT3ZlcmxheVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGNkZjogQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgICBwcml2YXRlIHJlbmRlcmVyMjogUmVuZGVyZXIyKSB7IH1cclxuXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLmluaXQoKTtcclxuICB9XHJcblxyXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcclxuICAgIGxldCBpdGVtcyA9IGNoYW5nZXNbJ2l0ZW1zJ107XHJcbiAgICBpZiAoaXRlbXMgJiYgaXRlbXMuY3VycmVudFZhbHVlICYmIGl0ZW1zLmN1cnJlbnRWYWx1ZS5sZW5ndGggPj0gMCkge1xyXG4gICAgICB0aGlzLm9yaWdpbkl0ZW1zID0gWy4uLml0ZW1zLmN1cnJlbnRWYWx1ZV07XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBvblNlbGVjdEFsbChjaGVja2VkOiBib29sZWFuKSB7XHJcbiAgICB0aGlzLml0ZW1zLmZvckVhY2goaXRlbSA9PiB7XHJcbiAgICAgIGl0ZW0uY2hlY2tlZCA9IGNoZWNrZWQ7XHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLnNlbGVjdGVkSXRlbSA9IGNoZWNrZWQgPyBbLi4udGhpcy5pdGVtc10gOiBbXTtcclxuICAgIHRoaXMuYnVpbGRNdWx0aXBsZVNlbGVjdCgpO1xyXG4gICAgdGhpcy5vblNlbGVjdGVkQWxsLmVtaXQodGhpcy5zZWxlY3RlZEl0ZW0pO1xyXG4gICAgdGhpcy5lbWl0Q2hhbmdlKHRoaXMuc2VsZWN0ZWRJdGVtKTtcclxuICB9XHJcblxyXG4gIG9uU2VsZWN0KGl0ZW06IE5wRHJvcGRvd25JdGVtKSB7XHJcbiAgICBpZiAodGhpcy5zZXR0aW5ncy5zaW5nbGUpIHtcclxuICAgICAgdGhpcy5zZWxlY3RlZEl0ZW0gPSBpdGVtO1xyXG4gICAgICB0aGlzLm9uU2VsZWN0ZWQuZW1pdChpdGVtKTtcclxuICAgICAgdGhpcy5lbWl0Q2hhbmdlKGl0ZW0pO1xyXG4gICAgICB0aGlzLmNkZi5kZXRlY3RDaGFuZ2VzKCk7XHJcblxyXG4gICAgICB0aGlzLm92ZXJsYXlTZXJ2aWNlLmNsb3NlKHsgaXRlbTogaXRlbSB9KTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIC8vI3JlZ2lvbiBNdWx0aXBsZSBkcm9wZG93blxyXG4gICAgaWYgKCF0aGlzLnNlbGVjdGVkSXRlbSB8fCAhdGhpcy5zZWxlY3RlZEl0ZW0ubGVuZ3RoKSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRJdGVtID0gW107XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGl0ZW0uY2hlY2tlZCkge1xyXG4gICAgICB0aGlzLnNlbGVjdGVkSXRlbS5wdXNoKGl0ZW0pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5zZWxlY3RlZEl0ZW0gPSB0aGlzLnNlbGVjdGVkSXRlbS5maWx0ZXIoKGY6IE5wRHJvcGRvd25JdGVtKSA9PiBmLmlkICE9PSBpdGVtLmlkKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmJ1aWxkTXVsdGlwbGVTZWxlY3QoKTtcclxuICAgIHRoaXMub25TZWxlY3RlZC5lbWl0KGl0ZW0pO1xyXG4gICAgdGhpcy5lbWl0Q2hhbmdlKHRoaXMuc2VsZWN0ZWRJdGVtKTtcclxuICAgIC8vI2VuZHJlZ2lvblxyXG4gIH1cclxuXHJcbiAgb25TZWFyY2godmFsOiBhbnkpIHtcclxuICAgIGlmICghdmFsKSB7XHJcbiAgICAgIHRoaXMuY2xlYXJTZWFyY2goKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuaXRlbXMgPSB0aGlzLm9yaWdpbkl0ZW1zLmZpbHRlcihmID0+IGYubGFiZWwuaW5kZXhPZih2YWwpID4gLTEpO1xyXG4gIH1cclxuXHJcbiAgaXNBY3RpdmUoaXRlbTogTnBEcm9wZG93bkl0ZW0pIHtcclxuICAgIGlmICghdGhpcy5zZWxlY3RlZEl0ZW0pIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLnNldHRpbmdzLnNpbmdsZSkge1xyXG4gICAgICByZXR1cm4gaXRlbS5pZCA9PT0gKHRoaXMuc2VsZWN0ZWRJdGVtIGFzIE5wRHJvcGRvd25JdGVtKS5pZDtcclxuICAgIH1cclxuXHJcbiAgICAvLyBNdWx0aXBsZSBkcm9wZG93blxyXG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRJdGVtLmZpbmQoZiA9PiBmLmlkID09PSBpdGVtLmlkKTtcclxuICB9XHJcblxyXG4gIG9uT3BlbkRyb3Bkb3duKCRldmVudDogTW91c2VFdmVudCwgZHJvcGRvd25UcGw6IFRlbXBsYXRlUmVmPGFueT4sIG9yaWdpbjogSFRNTEVsZW1lbnQpIHtcclxuICAgICRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuXHJcbiAgICBpZiAodGhpcy5kaXNhYmxlZCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuaXNEcm9wZG93bk9wZW4pIHtcclxuICAgICAgdGhpcy5vdmVybGF5U2VydmljZS5jbG9zZShudWxsKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMub3ZlcmxheVNlcnZpY2Uub3BlbkRyb3Bkb3duKG9yaWdpbiwgZHJvcGRvd25UcGwsIHRoaXMudmlld0NvbnRhaW5lclJlZiwgbnVsbCkuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgLy8gY2xvc2VcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuYnVpbGRJdGVtc0NoZWNrZWRTdGF0dXMoKTtcclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICB0aGlzLnNjcm9sbFRvU2VsZWN0ZWRJdGVtKCk7XHJcbiAgICB9LCAxMDApO1xyXG5cclxuICAgIC8vIFRyaWNreS4uLiBDYW4ndCBnZXQgaW5uZXIgZWxlbWVudCBpbiBucC1pbnB1dCBjb250cm9sLCBzbyB3ZSBuZWVkIHNldFxyXG4gICAgLy8gc3R5bGUgYXN5bmMgYWZ0ZXIgb3BlbiBkcm9wZG93blxyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIGlmICghdGhpcy5vdmVybGF5U2VydmljZS5vdmVybGF5UmVmIHx8ICF0aGlzLm92ZXJsYXlTZXJ2aWNlLm92ZXJsYXlSZWYub3ZlcmxheUVsZW1lbnQpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGxldCBucElucHV0V3JhcHBlciA9IHRoaXMub3ZlcmxheVNlcnZpY2Uub3ZlcmxheVJlZi5vdmVybGF5RWxlbWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCducC1pbnB1dC13cmFwcGVyJyk7XHJcbiAgICAgIGxldCBpbnB1dENvbnRhaW5lciA9IHRoaXMub3ZlcmxheVNlcnZpY2Uub3ZlcmxheVJlZi5vdmVybGF5RWxlbWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdpbnB1dC1jb250YWluZXInKTtcclxuICAgICAgbGV0IG5wSW5wdXQgPSB0aGlzLm92ZXJsYXlTZXJ2aWNlLm92ZXJsYXlSZWYub3ZlcmxheUVsZW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnbnAtaW5wdXQnKTtcclxuICAgICAgaWYgKG5wSW5wdXRXcmFwcGVyICYmIG5wSW5wdXRXcmFwcGVyLmxlbmd0aCA+IDApIHtcclxuICAgICAgICB0aGlzLnJlbmRlcmVyMi5zZXRTdHlsZShucElucHV0V3JhcHBlclswXSwgJ3dpZHRoJywgJzEwMCUnKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKGlucHV0Q29udGFpbmVyICYmIGlucHV0Q29udGFpbmVyLmxlbmd0aCA+IDApIHtcclxuICAgICAgICB0aGlzLnJlbmRlcmVyMi5zZXRTdHlsZShpbnB1dENvbnRhaW5lclswXSwgJ3dpZHRoJywgJzEwMCUnKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKG5wSW5wdXQgJiYgbnBJbnB1dC5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgdGhpcy5yZW5kZXJlcjIuc2V0U3R5bGUobnBJbnB1dFswXSwgJ3dpZHRoJywgdGhpcy5zZXR0aW5ncy53aWR0aCArICdweCcpO1xyXG4gICAgICAgIHRoaXMucmVuZGVyZXIyLnNldFN0eWxlKG5wSW5wdXRbMF0sICdwYWRkaW5nLWxlZnQnLCAnMzBweCcpO1xyXG4gICAgICAgIHRoaXMucmVuZGVyZXIyLnNldFN0eWxlKG5wSW5wdXRbMF0sICdib3JkZXItdG9wJywgJ25vbmUnKTtcclxuICAgICAgICB0aGlzLnJlbmRlcmVyMi5zZXRTdHlsZShucElucHV0WzBdLCAnYm9yZGVyLWxlZnQnLCAnbm9uZScpO1xyXG4gICAgICAgIHRoaXMucmVuZGVyZXIyLnNldFN0eWxlKG5wSW5wdXRbMF0sICdib3JkZXItcmlnaHQnLCAnbm9uZScpO1xyXG4gICAgICAgIHRoaXMucmVuZGVyZXIyLnNldFN0eWxlKG5wSW5wdXRbMF0sICdib3gtc2hhZG93JywgJ25vbmUnKTtcclxuICAgICAgfVxyXG4gICAgfSwgMCk7XHJcbiAgfVxyXG5cclxuICBvblJlbW92ZUl0ZW1zKCRldmVudDogTW91c2VFdmVudCkge1xyXG4gICAgaWYgKHRoaXMuZGlzYWJsZWQpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuc2VsZWN0ZWRJdGVtID0gdGhpcy5zZXR0aW5ncy5zaW5nbGUgPyBudWxsIDogW107XHJcbiAgICB0aGlzLmNsZWFyU2VhcmNoKCk7XHJcbiAgICB0aGlzLml0ZW1zLmZvckVhY2goaXRlbSA9PiB7XHJcbiAgICAgIGl0ZW0uY2hlY2tlZCA9IGZhbHNlO1xyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5idWlsZE11bHRpcGxlU2VsZWN0KCk7XHJcbiAgICB0aGlzLm9uRGVzZWxlY3RlZEFsbC5lbWl0KHRoaXMuaXRlbXMpO1xyXG4gICAgdGhpcy5lbWl0Q2hhbmdlKHRoaXMuc2VsZWN0ZWRJdGVtKTtcclxuICAgICRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICB9XHJcblxyXG4gIG9uUmVtb3ZlSXRlbSgkZXZlbnQ6IE1vdXNlRXZlbnQsIGl0ZW06IE5wRHJvcGRvd25JdGVtKSB7XHJcbiAgICBpZiAodGhpcy5kaXNhYmxlZCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5zZWxlY3RlZEl0ZW0gPSB0aGlzLnNlbGVjdGVkSXRlbS5maWx0ZXIoKGY6IE5wRHJvcGRvd25JdGVtKSA9PiBmLmlkICE9PSBpdGVtLmlkKTtcclxuICAgIHRoaXMuY2xlYXJTZWFyY2goKTtcclxuXHJcbiAgICBpdGVtLmNoZWNrZWQgPSBmYWxzZTtcclxuXHJcbiAgICB0aGlzLmJ1aWxkTXVsdGlwbGVTZWxlY3QoKTtcclxuICAgIHRoaXMub25EZXNlbGVjdGVkLmVtaXQoaXRlbSk7XHJcbiAgICB0aGlzLmVtaXRDaGFuZ2UodGhpcy5zZWxlY3RlZEl0ZW0pO1xyXG4gICAgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gIH1cclxuXHJcbiAgLy8jcmVnaW9uIEltcGxlbWVudGF0aW9uIGZvciBDb250cm9sVmFsdWVBY2Nlc3NvclxyXG4gIHdyaXRlVmFsdWUob2JqOiBhbnkpOiB2b2lkIHtcclxuICAgIC8vIOWmguaenOaYr+WkmumAieS4i+aLieahhu+8jOS8oOWFpeeahHNlbGVjdGVkSXRlbeaYr251bGzvvIzkuLrkuobpmLLmraLmiqXplJnnm7TmjqVyZXR1cm7vvIzlv4XpobvkvKDlhaXnqbrmlbDnu4RbXVxyXG4gICAgaWYgKG9iaiA9PT0gbnVsbCAmJiAhdGhpcy5zZXR0aW5ncy5zaW5nbGUpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuc2VsZWN0ZWRJdGVtID0gb2JqO1xyXG4gICAgaWYgKHRoaXMuc2V0dGluZ3Muc2luZ2xlKSB7XHJcbiAgICAgIHRoaXMuY2RmLmRldGVjdENoYW5nZXMoKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRJdGVtLmZvckVhY2goaXRlbSA9PiB7XHJcbiAgICAgICAgaWYgKGl0ZW0uY2hlY2tlZCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICBpdGVtLmNoZWNrZWQgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICAgIHRoaXMuYnVpbGRNdWx0aXBsZVNlbGVjdCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmVnaXN0ZXJPbkNoYW5nZShmbjogYW55KTogdm9pZCB7XHJcbiAgICB0aGlzLmVtaXRDaGFuZ2UgPSBmbjtcclxuICB9XHJcblxyXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBhbnkpOiB2b2lkIHsgfVxyXG4gIC8vI2VuZHJlZ2lvblxyXG5cclxuICAvLyNyZWdpb24gUHJpdmF0ZSBtZXRob2RzXHJcbiAgcHJpdmF0ZSBpbml0KCkge1xyXG4gICAgdGhpcy5vcmlnaW5JdGVtcyA9IFsuLi50aGlzLml0ZW1zXTtcclxuICAgIGxldCBpbml0U2V0dGluZ3M6IE5wRHJvcGRvd25TZXR0aW5ncyA9IHtcclxuICAgICAgc2luZ2xlOiB0cnVlLFxyXG4gICAgICBwbGFjZUhvbGRlcjogJ+ivt+mAieaLqScsXHJcbiAgICAgIHdpZHRoOiAyMjAsXHJcbiAgICAgIGJhZGdlOiA5OTk5OSxcclxuICAgICAgaXNTaG93U2VhcmNoQm94OiB0cnVlLFxyXG4gICAgICBub0RhdGE6ICfmsqHmnInmlbDmja7vvIEnLFxyXG4gICAgICBhdXRvU2Nyb2xsVG86IHRydWVcclxuICAgIH07XHJcblxyXG4gICAgdGhpcy5zZXR0aW5ncyA9IE9iamVjdC5hc3NpZ24oaW5pdFNldHRpbmdzLCB0aGlzLnNldHRpbmdzKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY2hlY2tJdGVtRXhpc3RzKCkge1xyXG4gICAgaWYgKHRoaXMuc2V0dGluZ3Muc2luZ2xlKSB7XHJcbiAgICAgIGlmICh0aGlzLnNlbGVjdGVkSXRlbSAmJiAhdGhpcy5vcmlnaW5JdGVtcy5maW5kKGYgPT4gZi5pZCA9PT0gKHRoaXMuc2VsZWN0ZWRJdGVtIGFzIE5wRHJvcGRvd25JdGVtKS5pZCkpIHtcclxuICAgICAgICB0aGlzLnNlbGVjdGVkSXRlbSA9IG51bGw7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIC8vIE11bHRpcGxlIGRyb3Bkb3duXHJcbiAgICAgIGlmICh0aGlzLnNlbGVjdGVkSXRlbSAmJiB0aGlzLnNlbGVjdGVkSXRlbS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgbGV0IHNlbGVjdGVkSXRlbXMgPSBbXTtcclxuICAgICAgICB0aGlzLnNlbGVjdGVkSXRlbS5mb3JFYWNoKChpdGVtOiBOcERyb3Bkb3duSXRlbSkgPT4ge1xyXG4gICAgICAgICAgaWYgKHRoaXMub3JpZ2luSXRlbXMuZmluZChmID0+IGYuaWQgPT09IGl0ZW0uaWQpKSB7XHJcbiAgICAgICAgICAgIHNlbGVjdGVkSXRlbXMucHVzaChpdGVtKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZEl0ZW0gPSBbXTtcclxuICAgICAgICB0aGlzLnNlbGVjdGVkSXRlbSA9IHNlbGVjdGVkSXRlbXM7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIOa4hemZpOafpeivouW5tuWxleekuuaJgOacieespuWQiOadoeS7tueahGl0ZW1zXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBjbGVhclNlYXJjaCgpIHtcclxuICAgIHRoaXMuc2VhcmNoVG9rZW4gPSAnJztcclxuICAgIHRoaXMuaXRlbXMgPSBbLi4udGhpcy5vcmlnaW5JdGVtc107XHJcblxyXG4gICAgdGhpcy5idWlsZEl0ZW1zQ2hlY2tlZFN0YXR1cygpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBidWlsZEl0ZW1zQ2hlY2tlZFN0YXR1cygpIHtcclxuICAgIGlmICh0aGlzLnNldHRpbmdzLnNpbmdsZSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5pdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICBsZXQgc2VsZWN0ZWRJdGVtID0gdGhpcy5zZWxlY3RlZEl0ZW0uZmluZChmID0+IGYuaWQgPT09IGl0ZW0uaWQpO1xyXG4gICAgICBpdGVtLmNoZWNrZWQgPSBzZWxlY3RlZEl0ZW0gPyB0cnVlIDogZmFsc2U7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2Nyb2xsVG9TZWxlY3RlZEl0ZW0oKSB7XHJcbiAgICBpZiAoIXRoaXMuc2V0dGluZ3MuYXV0b1Njcm9sbFRvKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgaXRlbSA9IHRoaXMuc2V0dGluZ3Muc2luZ2xlID8gKHRoaXMuc2VsZWN0ZWRJdGVtIGFzIE5wRHJvcGRvd25JdGVtKSA6ICh0aGlzLnNlbGVjdGVkSXRlbSAmJiB0aGlzLnNlbGVjdGVkSXRlbVswXSk7XHJcbiAgICBpZiAoaXRlbSkge1xyXG4gICAgICBjb25zdCBzZWxlY3RlZEluZGV4ID0gdGhpcy5vcmlnaW5JdGVtcy5maW5kSW5kZXgoZiA9PiBmLmlkID09PSBpdGVtLmlkKTtcclxuICAgICAgdGhpcy52aWV3UG9ydC5zY3JvbGxUb0luZGV4KHNlbGVjdGVkSW5kZXgsICdzbW9vdGgnKTtcclxuICAgIH1cclxuICB9XHJcbiAgLy8jZW5kcmVnaW9uXHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgTnBEcm9wZG93blNldHRpbmdzIHtcclxuICAvKipMZWZ0IHNpZGUgbGFiZWwgbmFtZSAqL1xyXG4gIGxibE5hbWU/OiBzdHJpbmc7XHJcblxyXG4gIC8qKlNldCBpZiBpdCBpcyBzaW5nbGUgZHJvcGRvd24sIGRlZmF1bHQgaXMgdHJ1ZSAtIHNpbmdsZSBkcm9wZG93biAqL1xyXG4gIHNpbmdsZT86IGJvb2xlYW47XHJcblxyXG4gIC8qKkNoZWNrIGlmIGl0IGlzIHJlcXVpcmVkLiBpZiBub3QsIHNob3cgcmVtb3ZlIGljb24sIG90aGVyd2lzZSBoaWRlIHRoZSByZW1vdmUgaWNvbiAqL1xyXG4gIGlzUmVxdWlyZWQ/OiBib29sZWFuO1xyXG5cclxuICAvKipQbGFjZWhvbGRlciBmb3IgZHJvcGRvd24gKi9cclxuICBwbGFjZUhvbGRlcj86IHN0cmluZztcclxuXHJcbiAgLyoqU2V0IHRoZSB3aWR0aCBvZiBkcm9wZG93biwgZGVmYXVsdCBpcyAyMjAsIHVuaXQgcHggKi9cclxuICB3aWR0aD86IG51bWJlcjtcclxuXHJcbiAgLyoqRGlzcGxheSBiYWRnZSBjb3VudCwgZGVmYXVsdCBpcyA5OTk5OSAqL1xyXG4gIGJhZGdlPzogbnVtYmVyO1xyXG5cclxuICAvKirmmK/lkKblsZXnpLrlhajpgInmjInpkq4gKi9cclxuICBpc1Nob3dDaGVja2VkQWxsPzogYm9vbGVhbjtcclxuXHJcbiAgLyoq5piv5ZCm6buY6K6k5YWo6YCJICovXHJcbiAgaXNDaGVja2VkQWxsPzogYm9vbGVhbjtcclxuXHJcbiAgLyoq5rKh5pyJ5pWw5o2u5pe25bGV56S655qE5paH5qGI77yM6buY6K6k5Li64oCY5rKh5pyJ5pWw5o2u77yB4oCZICovXHJcbiAgbm9EYXRhPzogc3RyaW5nO1xyXG5cclxuICAvKirmmK/lkKbmmL7npLrmkJzntKLmoYbvvIzpu5jorqTlsZXnpLogKi9cclxuICBpc1Nob3dTZWFyY2hCb3g/OiBib29sZWFuO1xyXG5cclxuICAvKirlvZPkuIvmi4nmoYbmnInlt7LpgInpobnvvIzljZXpgInml7bvvIzmiZPlvIDkuIvmi4nmoYbkvJroh6rliqjmu5rliqjliLDlt7LpgInpobnvvJvlvZPkuLrlpJrpgInml7bvvIzmiZPlvIDkuIvmi4nmoYbkvJroh6rliqjmu5rliqjliLDlt7LpgInpobnnmoTnrKzkuIDpobnvvJvpu5jorqTmiZPlvIDkuLp0cnVlICovXHJcbiAgYXV0b1Njcm9sbFRvPzogYm9vbGVhbjtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBOcERyb3Bkb3duSXRlbSB7XHJcbiAgaWQ6IHN0cmluZyB8IG51bWJlcjtcclxuICBsYWJlbDogc3RyaW5nO1xyXG4gIFtrZXk6IHN0cmluZ106IGFueTtcclxufVxyXG5cclxuXHJcbiJdfQ==