UNPKG

ngx-pluto

Version:
779 lines 58.8 kB
/**
 * @fileoverview added by tsickle
 * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
 */
import * as tslib_1 from "tslib";
import { Component, ViewEncapsulation, Input, ContentChild, ContentChildren, QueryList, Output, EventEmitter } from "@angular/core";
import { NpColumnDirective } from "./column.directive";
import { NpEmptyDirective } from "./empty.directive";
import { NpHeaderDirective } from './header.directive';
import { Utils } from "../common/utils";
/**
 * 可分页表格组件 - 支持分页、自定义列名、自定义列内容等。对于多语言,支持通过·\@Input·属性自定义。
 *
 * <example-url>https://stackblitz.com/edit/np-table-sample?embed=1&file=src/app/app.component.html</example-url>
 */
var NpTable = /** @class */ (function () {
    function NpTable() {
        /**
         * 数据总条数
         */
        this.total = 0;
        /**
         * 每页显示条数,默认20条
         */
        this.pageSize = 20; // Default is 20 rows per page
        // Default is 20 rows per page
        /**
         * 是否在表头第一列展示多选框,默认不展示
         */
        this.showCheckbox = false; // Indicate whether show checkbox or not, default is not
        // Indicate whether show checkbox or not, default is not
        /**
         * 是否显示分页组件,默认显示
         */
        this.showPager = true;
        /**
         * 是否服务器端排序,默认false,即客户端排序
         */
        this.serverSideSort = false;
        /**
         * 首页按钮文字
         */
        this.firstBtnText = '首页';
        /**
         * 上一页按钮文字
         */
        this.preBtnText = '上一页';
        /**
         * 下一页按钮文字
         */
        this.nextBtnText = '下一页';
        /**
         * 尾页按钮文字
         */
        this.lastBtnText = '尾页';
        /**
         * 共
         */
        this.totalText = '共';
        /**
         * 条,每页显示条数
         */
        this.itemsPerPageText = '条,每页显示条数';
        /**
         * 没有数据按钮文字
         */
        this.noDataLabel = "没有数据";
        /**
         * 当前页码
         */
        this.pageNumber = 1;
        /**
         * 页码改变事件,即翻页事件 (双向绑定)
         */
        this.pageNumberChange = new EventEmitter();
        /**
         * 页码改变事件,即翻页事件
         */
        this.onPageChanged = new EventEmitter();
        /**
         * 每页显示条数改变事件
         */
        this.onPageSizeChanged = new EventEmitter();
        /**
         * Will be deprecated, use onRows instead
         */
        this.onRowsChecked = new EventEmitter();
        /**
         * Will be deprecated, use onRows instead
         *
         * 为了向后兼容,故没有修改onRowsChecked逻辑,增加此output事件
         *
         * 当前行uncheck时触发此事件
         */
        this.onRowsUnchecked = new EventEmitter();
        /**
         * 当选择服务器端排序(即serverSideSort = true)时,根据当前点击列内容及排序,传给backend api返回服务器端排序数据赋值给datasource及total字段即可
         */
        this.onServerSideSorted = new EventEmitter();
        /**
         * 当前处理的行row/rows,选中/非选中状态
         *
         * 如点击全选按钮,则处理的是当前页的所有行rows
         */
        this.onRows = new EventEmitter();
        this.projectedTemplates = [];
        this.headerTemplates = [];
        this.internalColumns = [];
        /**
         * 此字段后续会废弃 will be deprecated
         */
        this.selectedRows = [];
        this.datasourceSortedByDefault = [];
    }
    /**
     * @return {?}
     */
    NpTable.prototype.ngOnInit = /**
     * @return {?}
     */
    function () {
        var _this = this;
        this.datasourceSortedByDefault = tslib_1.__spread(this.datasource);
        if (this.showCheckbox) {
            this.internalColumns = [];
            this.internalColumns.push({
                headerName: 'chk',
                headerDisplayName: '',
                width: '50px',
                isCheckbox: true
            });
        }
        this.mergeToInternalColumns();
        this.onServerSideSorted.subscribe((/**
         * @param {?} res
         * @return {?}
         */
        function (res) {
            console.log('onServerSideSorted: ', res);
            _this.buildServerSideSort(res.col);
        }));
    };
    /**
     * @param {?} changes
     * @return {?}
     */
    NpTable.prototype.ngOnChanges = /**
     * @param {?} changes
     * @return {?}
     */
    function (changes) {
        if (changes.columns && changes.columns.currentValue &&
            changes.columns.currentValue.length > 0 &&
            changes.columns.previousValue &&
            changes.columns.previousValue.length > 0 &&
            changes.columns.currentValue !== changes.columns.previousValue) {
            this.mergeToInternalColumns();
            this.projectTemplate();
        }
        if (changes.datasource && changes.datasource.currentValue && changes.datasource.currentValue.length > 0) {
            this.datasourceSortedByDefault = tslib_1.__spread(changes.datasource.currentValue);
            this.initUniqueIdForDatasource();
        }
        if (changes.total && changes.total.currentValue) {
            this.total = +changes.total.currentValue;
        }
        if (changes.pageNumber && !changes.pageNumber.firstChange && changes.pageNumber.currentValue) {
            /** @type {?} */
            var pageNumber = +changes.pageNumber.currentValue;
            this.pageNumber = pageNumber;
            this.pageNumberChange.emit(pageNumber);
            this.selectAll(false);
        }
    };
    /**
     * @return {?}
     */
    NpTable.prototype.ngAfterContentInit = /**
     * @return {?}
     */
    function () {
        this.projectTemplate();
    };
    /**
     * @param {?} currentPageNumber
     * @return {?}
     */
    NpTable.prototype.onTablePageChanged = /**
     * @param {?} currentPageNumber
     * @return {?}
     */
    function (currentPageNumber) {
        this.pageNumber = currentPageNumber;
        this.pageNumberChange.emit(this.pageNumber);
        this.onPageChanged.next(currentPageNumber);
        this.selectAll(false);
    };
    /**
     * @param {?} currentPageSize
     * @return {?}
     */
    NpTable.prototype.onTablePageSizeChanged = /**
     * @param {?} currentPageSize
     * @return {?}
     */
    function (currentPageSize) {
        this.pageSize = currentPageSize;
        this.onPageSizeChanged.next(currentPageSize);
        this.selectAll(false);
    };
    /**
     * @param {?} isChecked
     * @return {?}
     */
    NpTable.prototype.onSelectAllChecked = /**
     * @param {?} isChecked
     * @return {?}
     */
    function (isChecked) {
        this.selectAll(isChecked);
        /** @type {?} */
        var rows = [];
        if (this.datasource && this.datasource.length > 0) {
            this.datasource.forEach((/**
             * @param {?} row
             * @return {?}
             */
            function (row) {
                rows.push(row);
            }));
        }
        this.onRows.emit(rows);
    };
    /**
     * @param {?} row
     * @return {?}
     */
    NpTable.prototype.onRowSelectChecked = /**
     * @param {?} row
     * @return {?}
     */
    function (row) {
        /** @type {?} */
        var colChk = this.internalColumns.find((/**
         * @param {?} f
         * @return {?}
         */
        function (f) { return f.headerName === 'chk'; }));
        if (row.checked) {
            if (!this.selectedRows.find((/**
             * @param {?} f
             * @return {?}
             */
            function (f) { return f.dt_id === row.dt_id; }))) {
                this.selectedRows.push(row);
            }
        }
        else {
            this.selectedRows = this.selectedRows.filter((/**
             * @param {?} f
             * @return {?}
             */
            function (f) { return f.dt_id !== row.dt_id; }));
            this.onRowsUnchecked.next(row);
        }
        if (colChk) {
            colChk.checked = this.selectedRows.length === this.pageSize;
        }
        if (this.selectedRows.length === 0) {
            this.selectAll(false);
        }
        this.onRowsChecked.next(this.selectedRows);
        this.onRows.emit(row);
    };
    /**
     * @param {?} item
     * @return {?}
     */
    NpTable.prototype.onSort = /**
     * @param {?} item
     * @return {?}
     */
    function (item) {
        if (!item.sort) {
            return;
        }
        if (this.serverSideSort) {
            this.onServerSideSorted.emit({ col: item, sortedBy: item.sortedBy });
            return;
        }
        this.buildClientSideSort(item);
    };
    //#region Private methods
    //#region Private methods
    /**
     * @private
     * @param {?} item
     * @return {?}
     */
    NpTable.prototype.buildServerSideSort = 
    //#region Private methods
    /**
     * @private
     * @param {?} item
     * @return {?}
     */
    function (item) {
        this.setNextSortedBy(item);
        this.resetOtherSortedColumns(item);
    };
    /**
     * @private
     * @param {?} item
     * @return {?}
     */
    NpTable.prototype.buildClientSideSort = /**
     * @private
     * @param {?} item
     * @return {?}
     */
    function (item) {
        this.setNextSortedBy(item);
        if (item.sortedBy === 'default') {
            this.datasource = tslib_1.__spread(this.datasourceSortedByDefault);
        }
        else {
            this.datasource.sort(Utils.compareValues(item.headerName, item.sortedBy));
        }
        this.resetOtherSortedColumns(item);
    };
    /**
     * @private
     * @param {?} item
     * @return {?}
     */
    NpTable.prototype.setNextSortedBy = /**
     * @private
     * @param {?} item
     * @return {?}
     */
    function (item) {
        switch (item.sortedBy) {
            case 'default':
                item.sortedBy = 'asc';
                break;
            case 'asc':
                item.sortedBy = 'desc';
                break;
            case 'desc':
                item.sortedBy = 'default';
                break;
            default:
                break;
        }
    };
    /**
     * @private
     * @return {?}
     */
    NpTable.prototype.initUniqueIdForDatasource = /**
     * @private
     * @return {?}
     */
    function () {
        var _this = this;
        this.datasource.forEach((/**
         * @param {?} row
         * @return {?}
         */
        function (row) {
            row['dt_id'] = _this.ID();
        }));
    };
    /**
     * @private
     * @return {?}
     */
    NpTable.prototype.projectTemplate = /**
     * @private
     * @return {?}
     */
    function () {
        var _this = this;
        if (this.columnComponents) {
            this.columnComponents.forEach((/**
             * @param {?} item
             * @return {?}
             */
            function (item) {
                if (!_this.projectedTemplates.find((/**
                 * @param {?} f
                 * @return {?}
                 */
                function (f) { return f.name === item.name; }))) {
                    _this.projectedTemplates.push({ name: item.name, template: item.cellTemplate });
                }
            }));
            this.internalColumns.forEach((/**
             * @param {?} column
             * @return {?}
             */
            function (column) {
                /** @type {?} */
                var projectTemplate = _this.projectedTemplates.find((/**
                 * @param {?} f
                 * @return {?}
                 */
                function (f) { return f.name === column.headerName; }));
                if (projectTemplate) {
                    column['template'] = projectTemplate.template;
                }
            }));
        }
        if (this.headerComponents) {
            this.headerComponents.forEach((/**
             * @param {?} item
             * @return {?}
             */
            function (item) {
                if (!_this.headerTemplates.find((/**
                 * @param {?} f
                 * @return {?}
                 */
                function (f) { return f.name === item.name; }))) {
                    _this.headerTemplates.push({ name: item.name, template: item.headerTemplate });
                }
            }));
            this.internalColumns.forEach((/**
             * @param {?} column
             * @return {?}
             */
            function (column) {
                /** @type {?} */
                var projectTemplate = _this.headerTemplates.find((/**
                 * @param {?} f
                 * @return {?}
                 */
                function (f) { return f.name === column.headerName; }));
                if (projectTemplate) {
                    column['headerTemplate'] = projectTemplate.template;
                }
            }));
        }
    };
    /**
     * @private
     * @return {?}
     */
    NpTable.prototype.mergeToInternalColumns = /**
     * @private
     * @return {?}
     */
    function () {
        var _this = this;
        if (this.internalColumns.length === 0) {
            this.internalColumns = tslib_1.__spread(this.columns);
            this.setSortedByToDefault();
            return;
        }
        this.columns.forEach((/**
         * @param {?} replaceColumn
         * @return {?}
         */
        function (replaceColumn) {
            /** @type {?} */
            var existColumn = _this.internalColumns.find((/**
             * @param {?} f
             * @return {?}
             */
            function (f) { return f.headerName === replaceColumn.headerName; }));
            if (existColumn) {
                existColumn = tslib_1.__assign({}, replaceColumn);
            }
            else {
                _this.internalColumns.push(tslib_1.__assign({}, replaceColumn));
            }
        }));
        this.setSortedByToDefault();
    };
    /**
     * @private
     * @return {?}
     */
    NpTable.prototype.setSortedByToDefault = /**
     * @private
     * @return {?}
     */
    function () {
        for (var i = 0; i < this.internalColumns.length; i++) {
            if (this.internalColumns[i].sort) {
                this.internalColumns[i].sortedBy = 'default';
            }
        }
    };
    /**
     * @private
     * @return {?}
     */
    NpTable.prototype.ID = /**
     * @private
     * @return {?}
     */
    function () {
        // Math.random should be unique because of its seeding algorithm.
        // Convert it to base 36 (numbers + letters), and grab the first 9 characters
        // after the decimal.
        return '_' + Math.random().toString(36).substr(2, 9);
    };
    /**
     * @private
     * @param {?} isSelect
     * @return {?}
     */
    NpTable.prototype.selectAll = /**
     * @private
     * @param {?} isSelect
     * @return {?}
     */
    function (isSelect) {
        var _this = this;
        /** @type {?} */
        var colChk = this.internalColumns.find((/**
         * @param {?} f
         * @return {?}
         */
        function (f) { return f.headerName === 'chk'; }));
        if (colChk) {
            colChk.checked = isSelect;
            this.selectedRows = [];
            if (this.datasource && this.datasource.length > 0) {
                this.datasource.forEach((/**
                 * @param {?} row
                 * @return {?}
                 */
                function (row) {
                    row.checked = isSelect;
                    if (isSelect) {
                        _this.selectedRows.push(row);
                    }
                }));
            }
            this.onRowsChecked.next(this.selectedRows);
        }
    };
    /**
     * @private
     * @param {?} item
     * @return {?}
     */
    NpTable.prototype.resetOtherSortedColumns = /**
     * @private
     * @param {?} item
     * @return {?}
     */
    function (item) {
        this.internalColumns.forEach((/**
         * @param {?} col
         * @return {?}
         */
        function (col) {
            if (col.headerName !== item.headerName && col.sort) {
                col.sortedBy = 'default';
            }
        }));
    };
    NpTable.decorators = [
        { type: Component, args: [{
                    selector: "np-table",
                    template: "<div class=\"np-table-wrapper\">\r\n  <div class=\"table-header flex-wrap row-flex\">\r\n    <span *ngFor=\"let item of internalColumns\" [style.flex]=\"'0 1 ' + item.width\">\r\n      <ng-container *ngIf=\"item.isCheckbox\">\r\n        <!-- We need to re-style or re-design the checkbox control, its ugly and not easy to use -->\r\n        <span style=\"width: 100%; height: 34px; display: flex; justify-content: center;\">\r\n          <np-checkbox style=\"width: 5px;\" [(ngModel)]=\"item.checked\"\r\n            (inputModelChange)=\"onSelectAllChecked(item.checked)\"></np-checkbox>\r\n        </span>\r\n      </ng-container>\r\n      <span *ngIf=\"!item.isCheckbox\">\r\n        <ng-container *ngIf=\"!item.headerTemplate\">\r\n          <div class=\"flex-wrap row-flex table-header-text\" [ngStyle]=\"{'cursor': item.sort ? 'pointer': 'inherit'}\"\r\n            (click)=\"onSort(item)\">\r\n            <span>{{ item.headerDisplayName }}</span>\r\n            <i *ngIf=\"['default', 'asc', 'desc'].indexOf(item.sortedBy) > -1\" class=\"fas fa-arrow-up\" [ngClass]=\"{\r\n              'table-header-arrow-default': item.sortedBy === 'default', \r\n              'table-header-arrow-up': item.sortedBy === 'asc', \r\n              'table-header-arrow-down': item.sortedBy === 'desc'}\"></i>\r\n          </div>\r\n        </ng-container>\r\n        <ng-container *ngIf=\"item.headerTemplate\">\r\n          <div class=\"flex-wrap row-flex table-header-text\" [ngStyle]=\"{'cursor': item.sort ? 'pointer': 'inherit'}\"\r\n            (click)=\"onSort(item)\">\r\n            <ng-container *ngTemplateOutlet=\"item.headerTemplate; context: { row: item }\">\r\n            </ng-container>\r\n            <i *ngIf=\"['default', 'asc', 'desc'].indexOf(item.sortedBy) > -1\" class=\"fas fa-arrow-up\" [ngClass]=\"{\r\n              'table-header-arrow-default': item.sortedBy === 'default', \r\n              'table-header-arrow-up': item.sortedBy === 'asc', \r\n              'table-header-arrow-down': item.sortedBy === 'desc'}\"></i>\r\n          </div>\r\n        </ng-container>\r\n      </span>\r\n    </span>\r\n  </div>\r\n  <div class=\"table-body flex-wrap col-flex\">\r\n    <div class=\"table-body-row flex-wrap row-flex\" *ngFor=\"let row of datasource\">\r\n      <ng-container *ngFor=\"let column of internalColumns\">\r\n        <ng-container *ngIf=\"column.isCheckbox\">\r\n          <!-- We need to re-style or re-design the checkbox control, its ugly and not easy to use -->\r\n          <span [style.flex]=\"'0 1 ' + column.width\"\r\n            style=\"width: 100%; height: 34px; display: flex; justify-content: center;\">\r\n            <np-checkbox style=\"width: 5px;\" [(ngModel)]=\"row.checked\" (inputModelChange)=\"onRowSelectChecked(row)\">\r\n            </np-checkbox>\r\n          </span>\r\n        </ng-container>\r\n        <span *ngIf=\"!column.isCheckbox\" [style.flex]=\"'0 1 ' + column.width\">\r\n          <ng-container *ngIf=\"!column.template\">{{ row[column.headerName] }}</ng-container>\r\n          <ng-container *ngIf=\"column.template\">\r\n            <ng-container *ngTemplateOutlet=\"column.template; context: { row: row }\">\r\n            </ng-container>\r\n          </ng-container>\r\n        </span>\r\n      </ng-container>\r\n    </div>\r\n    <div *ngIf=\"!datasource || datasource.length === 0\" class=\"table-body-row flex-wrap row-flex middle-flex\">\r\n      <ng-container *ngIf=\"!emptyContent || !emptyContent.template\">\r\n        <span class=\"no-data\">{{ noDataLabel }}</span>\r\n      </ng-container>\r\n      <ng-container *ngIf=\"emptyContent && emptyContent.template\">\r\n        <ng-container *ngTemplateOutlet=\"emptyContent.template;\">\r\n        </ng-container>\r\n      </ng-container>\r\n    </div>\r\n  </div>\r\n  <div class=\"table-footer flex-wrap row-flex\" *ngIf=\"showPager && datasource && datasource.length > 0\">\r\n    <np-paginator [size]=\"pageSize\" [total]=\"total\" [pageNumber]=\"pageNumber\" [firstBtnText]=\"firstBtnText\"\r\n      [preBtnText]=\"preBtnText\" [nextBtnText]=\"nextBtnText\" [lastBtnText]=\"lastBtnText\" [totalText]=\"totalText\"\r\n      [itemsPerPageText]=\"itemsPerPageText\" (onPageChanged)=\"onTablePageChanged($event)\"\r\n      (onPageSizeChanged)=\"onTablePageSizeChanged($event)\"></np-paginator>\r\n  </div>\r\n</div>\r\n",
                    encapsulation: ViewEncapsulation.None,
                    styles: [".backdrop-transparent{opacity:0}.flex-wrap{display:flex}.wrap{flex-wrap:wrap}.col-flex{flex-direction:column}.row-flex{flex-direction:row}.middle-flex{justify-content:center;align-items:center}.space-between{justify-content:space-between;align-items:center}.align-center{align-items:center}.np-row{display:flex;flex-direction:row;flex-wrap:wrap;width:100%}.np-column{display:flex;flex-direction:column;flex-basis:100%;flex:1}.np-table-wrapper{width:100%;display:block}.np-table-wrapper .table-header{height:34px;line-height:34px;font-weight:700}.np-table-wrapper .table-header>span{flex:1 1 0;text-align:center;-ms-grid-row-align:center;align-self:center}.np-table-wrapper .table-header .table-header-text{align-items:center;justify-content:center}.np-table-wrapper .table-header .table-header-text>.fas.fa-arrow-down,.np-table-wrapper .table-header .table-header-text>.fas.fa-arrow-up{margin-left:6px;transition:.2s ease-in}.np-table-wrapper .table-header .table-header-text>.table-header-arrow-default{opacity:.54}.np-table-wrapper .table-header .table-header-text>.table-header-arrow-down{transform:rotateZ(180deg)}.np-table-wrapper .table-body>.table-body-row{padding:5px 0}.np-table-wrapper .table-body>.table-body-row>span{flex:1 1 0;text-align:center;-ms-grid-row-align:center;align-self:center}.np-table-wrapper .table-footer{justify-content:flex-end;padding:20px 5px 20px 0}"]
                }] }
    ];
    /** @nocollapse */
    NpTable.ctorParameters = function () { return []; };
    NpTable.propDecorators = {
        columns: [{ type: Input }],
        datasource: [{ type: Input }],
        total: [{ type: Input }],
        pageSize: [{ type: Input }],
        showCheckbox: [{ type: Input }],
        showPager: [{ type: Input }],
        serverSideSort: [{ type: Input }],
        firstBtnText: [{ type: Input }],
        preBtnText: [{ type: Input }],
        nextBtnText: [{ type: Input }],
        lastBtnText: [{ type: Input }],
        totalText: [{ type: Input }],
        itemsPerPageText: [{ type: Input }],
        noDataLabel: [{ type: Input }],
        pageNumber: [{ type: Input }],
        pageNumberChange: [{ type: Output }],
        onPageChanged: [{ type: Output }],
        onPageSizeChanged: [{ type: Output }],
        onRowsChecked: [{ type: Output }],
        onRowsUnchecked: [{ type: Output }],
        onServerSideSorted: [{ type: Output }],
        onRows: [{ type: Output }],
        columnComponents: [{ type: ContentChildren, args: [NpColumnDirective,] }],
        headerComponents: [{ type: ContentChildren, args: [NpHeaderDirective,] }],
        emptyContent: [{ type: ContentChild, args: [NpEmptyDirective,] }]
    };
    return NpTable;
}());
export { NpTable };
if (false) {
    /**
     * 定义列名称(即数据源datasource对象属性名称),列显示名称,列宽度(可选,默认每列自适应等宽)
     * @type {?}
     */
    NpTable.prototype.columns;
    /**
     * 表格组件数据源,数据源为一个对象数组,对象的属性名称必须与表格列名称相同,否则不会展示此列
     * @type {?}
     */
    NpTable.prototype.datasource;
    /**
     * 数据总条数
     * @type {?}
     */
    NpTable.prototype.total;
    /**
     * 每页显示条数,默认20条
     * @type {?}
     */
    NpTable.prototype.pageSize;
    /**
     * 是否在表头第一列展示多选框,默认不展示
     * @type {?}
     */
    NpTable.prototype.showCheckbox;
    /**
     * 是否显示分页组件,默认显示
     * @type {?}
     */
    NpTable.prototype.showPager;
    /**
     * 是否服务器端排序,默认false,即客户端排序
     * @type {?}
     */
    NpTable.prototype.serverSideSort;
    /**
     * 首页按钮文字
     * @type {?}
     */
    NpTable.prototype.firstBtnText;
    /**
     * 上一页按钮文字
     * @type {?}
     */
    NpTable.prototype.preBtnText;
    /**
     * 下一页按钮文字
     * @type {?}
     */
    NpTable.prototype.nextBtnText;
    /**
     * 尾页按钮文字
     * @type {?}
     */
    NpTable.prototype.lastBtnText;
    /**
     * 共
     * @type {?}
     */
    NpTable.prototype.totalText;
    /**
     * 条,每页显示条数
     * @type {?}
     */
    NpTable.prototype.itemsPerPageText;
    /**
     * 没有数据按钮文字
     * @type {?}
     */
    NpTable.prototype.noDataLabel;
    /**
     * 当前页码
     * @type {?}
     */
    NpTable.prototype.pageNumber;
    /**
     * 页码改变事件,即翻页事件 (双向绑定)
     * @type {?}
     */
    NpTable.prototype.pageNumberChange;
    /**
     * 页码改变事件,即翻页事件
     * @type {?}
     */
    NpTable.prototype.onPageChanged;
    /**
     * 每页显示条数改变事件
     * @type {?}
     */
    NpTable.prototype.onPageSizeChanged;
    /**
     * Will be deprecated, use onRows instead
     * @type {?}
     */
    NpTable.prototype.onRowsChecked;
    /**
     * Will be deprecated, use onRows instead
     *
     * 为了向后兼容,故没有修改onRowsChecked逻辑,增加此output事件
     *
     * 当前行uncheck时触发此事件
     * @type {?}
     */
    NpTable.prototype.onRowsUnchecked;
    /**
     * 当选择服务器端排序(即serverSideSort = true)时,根据当前点击列内容及排序,传给backend api返回服务器端排序数据赋值给datasource及total字段即可
     * @type {?}
     */
    NpTable.prototype.onServerSideSorted;
    /**
     * 当前处理的行row/rows,选中/非选中状态
     *
     * 如点击全选按钮,则处理的是当前页的所有行rows
     * @type {?}
     */
    NpTable.prototype.onRows;
    /** @type {?} */
    NpTable.prototype.columnComponents;
    /** @type {?} */
    NpTable.prototype.headerComponents;
    /** @type {?} */
    NpTable.prototype.emptyContent;
    /** @type {?} */
    NpTable.prototype.projectedTemplates;
    /** @type {?} */
    NpTable.prototype.headerTemplates;
    /** @type {?} */
    NpTable.prototype.internalColumns;
    /**
     * 此字段后续会废弃 will be deprecated
     * @type {?}
     */
    NpTable.prototype.selectedRows;
    /** @type {?} */
    NpTable.prototype.datasourceSortedByDefault;
}
/**
 * @record
 */
export function ColumnDef() { }
if (false) {
    /**
     * 列名称
     * @type {?}
     */
    ColumnDef.prototype.headerName;
    /**
     * 列显示名称
     * @type {?}
     */
    ColumnDef.prototype.headerDisplayName;
    /**
     * 列宽度
     * @type {?|undefined}
     */
    ColumnDef.prototype.width;
    /** @type {?|undefined} */
    ColumnDef.prototype.sort;
}
/**
 * @ignore
 * @record
 */
function InternalColumnDef() { }
if (false) {
    /** @type {?|undefined} */
    InternalColumnDef.prototype.isCheckbox;
    /** @type {?|undefined} */
    InternalColumnDef.prototype.checked;
    /** @type {?|undefined} */
    InternalColumnDef.prototype.sortedBy;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmd4LXBsdXRvLyIsInNvdXJjZXMiOlsibGliL3RhYmxlL3RhYmxlLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsaUJBQWlCLEVBQVUsS0FBSyxFQUFFLFlBQVksRUFBRSxlQUFlLEVBQUUsU0FBUyxFQUE0QixNQUFNLEVBQUUsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3RLLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQzs7Ozs7O0FBT3hDO0lBZ0ZFOzs7O1FBbEVTLFVBQUssR0FBVyxDQUFDLENBQUM7Ozs7UUFFbEIsYUFBUSxHQUFXLEVBQUUsQ0FBQyxDQUFhLDhCQUE4Qjs7Ozs7UUFFakUsaUJBQVksR0FBWSxLQUFLLENBQUMsQ0FBSyx3REFBd0Q7Ozs7O1FBRTNGLGNBQVMsR0FBWSxJQUFJLENBQUM7Ozs7UUFHMUIsbUJBQWMsR0FBWSxLQUFLLENBQUM7Ozs7UUFHaEMsaUJBQVksR0FBVyxJQUFJLENBQUM7Ozs7UUFFNUIsZUFBVSxHQUFXLEtBQUssQ0FBQzs7OztRQUUzQixnQkFBVyxHQUFXLEtBQUssQ0FBQzs7OztRQUU1QixnQkFBVyxHQUFXLElBQUksQ0FBQzs7OztRQUUzQixjQUFTLEdBQVcsR0FBRyxDQUFDOzs7O1FBRXhCLHFCQUFnQixHQUFXLFVBQVUsQ0FBQzs7OztRQUV0QyxnQkFBVyxHQUFXLE1BQU0sQ0FBQzs7OztRQUU3QixlQUFVLEdBQVcsQ0FBQyxDQUFDOzs7O1FBRXRCLHFCQUFnQixHQUFHLElBQUksWUFBWSxFQUFVLENB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OztJQUUxQiwwQkFBZTs7SUFDZix5QkFBZTs7Ozs7O0FBTWpCLGdDQUlDOzs7SUFIQyx1Q0FBcUI7O0lBQ3JCLG9DQUFrQjs7SUFDbEIscUNBQXNDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBWaWV3RW5jYXBzdWxhdGlvbiwgT25Jbml0LCBJbnB1dCwgQ29udGVudENoaWxkLCBDb250ZW50Q2hpbGRyZW4sIFF1ZXJ5TGlzdCwgT25DaGFuZ2VzLCBTaW1wbGVDaGFuZ2VzLCBPdXRwdXQsIEV2ZW50RW1pdHRlciB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7IE5wQ29sdW1uRGlyZWN0aXZlIH0gZnJvbSBcIi4vY29sdW1uLmRpcmVjdGl2ZVwiO1xyXG5pbXBvcnQgeyBOcEVtcHR5RGlyZWN0aXZlIH0gZnJvbSBcIi4vZW1wdHkuZGlyZWN0aXZlXCI7XHJcbmltcG9ydCB7IE5wSGVhZGVyRGlyZWN0aXZlIH0gZnJvbSAnLi9oZWFkZXIuZGlyZWN0aXZlJztcclxuaW1wb3J0IHsgVXRpbHMgfSBmcm9tIFwiLi4vY29tbW9uL3V0aWxzXCI7XHJcblxyXG4vKipcclxuICog5Y+v5YiG6aG16KGo5qC857uE5Lu2IC0g5pSv5oyB5YiG6aG144CB6Ieq5a6a5LmJ5YiX5ZCN44CB6Ieq5a6a5LmJ5YiX5YaF5a65562J44CC5a+55LqO5aSa6K+t6KiA77yM5pSv5oyB6YCa6L+HwrdASW5wdXTCt+WxnuaAp+iHquWumuS5ieOAglxyXG4gKlxyXG4gKiA8ZXhhbXBsZS11cmw+aHR0cHM6Ly9zdGFja2JsaXR6LmNvbS9lZGl0L25wLXRhYmxlLXNhbXBsZT9lbWJlZD0xJmZpbGU9c3JjL2FwcC9hcHAuY29tcG9uZW50Lmh0bWw8L2V4YW1wbGUtdXJsPlxyXG4gKi9cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6IGBucC10YWJsZWAsXHJcbiAgdGVtcGxhdGVVcmw6ICd0YWJsZS5odG1sJyxcclxuICBzdHlsZVVybHM6IFsndGFibGUuc2NzcyddLFxyXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmVcclxufSlcclxuXHJcbmV4cG9ydCBjbGFzcyBOcFRhYmxlIGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMge1xyXG5cclxuICAvKirlrprkuYnliJflkI3np7DvvIjljbPmlbDmja7mupBkYXRhc291cmNl5a+56LGh5bGe5oCn5ZCN56ew77yJ77yM5YiX5pi+56S65ZCN56ew77yM5YiX5a695bqm77yI5Y+v6YCJ77yM6buY6K6k5q+P5YiX6Ieq6YCC5bqU562J5a6977yJICovXHJcbiAgQElucHV0KCkgY29sdW1uczogQXJyYXk8Q29sdW1uRGVmPjtcclxuICAvKirooajmoLznu4Tku7bmlbDmja7mupDvvIzmlbDmja7mupDkuLrkuIDkuKrlr7nosaHmlbDnu4TvvIzlr7nosaHnmoTlsZ7mgKflkI3np7Dlv4XpobvkuI7ooajmoLzliJflkI3np7Dnm7jlkIzvvIzlkKbliJnkuI3kvJrlsZXnpLrmraTliJcgKi9cclxuICBASW5wdXQoKSBkYXRhc291cmNlOiBBcnJheTxhbnk+O1xyXG4gIC8qKuaVsOaNruaAu+adoeaVsCAqL1xyXG4gIEBJbnB1dCgpIHRvdGFsOiBudW1iZXIgPSAwO1xyXG4gIC8qKuavj+mhteaYvuekuuadoeaVsO+8jOm7mOiupDIw5p2hICovXHJcbiAgQElucHV0KCkgcGFnZVNpemU6IG51bWJlciA9IDIwOyAgICAgICAgICAgICAvLyBEZWZhdWx0IGlzIDIwIHJvd3MgcGVyIHBhZ2VcclxuICAvKirmmK/lkKblnKjooajlpLTnrKzkuIDliJflsZXnpLrlpJrpgInmoYbvvIzpu5jorqTkuI3lsZXnpLogKi9cclxuICBASW5wdXQoKSBzaG93Q2hlY2tib3g6IGJvb2xlYW4gPSBmYWxzZTsgICAgIC8vIEluZGljYXRlIHdoZXRoZXIgc2hvdyBjaGVja2JveCBvciBub3QsIGRlZmF1bHQgaXMgbm90XHJcbiAgLyoq5piv5ZCm5pi+56S65YiG6aG157uE5Lu277yM6buY6K6k5pi+56S6ICovXHJcbiAgQElucHV0KCkgc2hvd1BhZ2VyOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgLyoq5piv5ZCm5pyN5Yqh5Zmo56uv5o6S5bqP77yM6buY6K6kZmFsc2XvvIzljbPlrqLmiLfnq6/mjpLluo8gKi9cclxuICBASW5wdXQoKSBzZXJ2ZXJTaWRlU29ydDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAvKirpppbpobXmjInpkq7mloflrZcgKi9cclxuICBASW5wdXQoKSBmaXJzdEJ0blRleHQ6IHN0cmluZyA9ICfpppbpobUnO1xyXG4gIC8qKuS4iuS4gOmhteaMiemSruaWh+WtlyAqL1xyXG4gIEBJbnB1dCgpIHByZUJ0blRleHQ6IHN0cmluZyA9ICfkuIrkuIDpobUnO1xyXG4gIC8qKuS4i+S4gOmhteaMiemSruaWh+WtlyAqL1xyXG4gIEBJbnB1dCgpIG5leHRCdG5UZXh0OiBzdHJpbmcgPSAn5LiL5LiA6aG1JztcclxuICAvKirlsL7pobXmjInpkq7mloflrZcgKi9cclxuICBASW5wdXQoKSBsYXN0QnRuVGV4dDogc3RyaW5nID0gJ+WwvumhtSc7XHJcbiAgLyoq5YWxICovXHJcbiAgQElucHV0KCkgdG90YWxUZXh0OiBzdHJpbmcgPSAn5YWxJztcclxuICAvKirmnaHvvIzmr4/pobXmmL7npLrmnaHmlbAgKi9cclxuICBASW5wdXQoKSBpdGVtc1BlclBhZ2VUZXh0OiBzdHJpbmcgPSAn5p2h77yM5q+P6aG15pi+56S65p2h5pWwJztcclxuICAvKirmsqHmnInmlbDmja7mjInpkq7mloflrZcgKi9cclxuICBASW5wdXQoKSBub0RhdGFMYWJlbDogc3RyaW5nID0gXCLmsqHmnInmlbDmja5cIjtcclxuICAvKirlvZPliY3pobXnoIEgKi9cclxuICBASW5wdXQoKSBwYWdlTnVtYmVyOiBudW1iZXIgPSAxO1xyXG4gIC8qKumhteeggeaUueWPmOS6i+S7tu+8jOWNs+e/u+mhteS6i+S7tiDvvIjlj4zlkJHnu5HlrprvvIkgKi9cclxuICBAT3V0cHV0KCkgcGFnZU51bWJlckNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8bnVtYmVyPigpO1xyXG5cclxuICAvKirpobXnoIHmlLnlj5jkuovku7bvvIzljbPnv7vpobXkuovku7YgKi9cclxuICBAT3V0cHV0KCkgb25QYWdlQ2hhbmdlZCA9IG5ldyBFdmVudEVtaXR0ZXI8bnVtYmVyPigpO1xyXG4gIC8qKuavj+mhteaYvuekuuadoeaVsOaUueWPmOS6i+S7tiAqL1xyXG4gIEBPdXRwdXQoKSBvblBhZ2VTaXplQ2hhbmdlZCA9IG5ldyBFdmVudEVtaXR0ZXI8bnVtYmVyPigpO1xyXG4gIC8qKlxyXG4gICAqIFdpbGwgYmUgZGVwcmVjYXRlZCwgdXNlIG9uUm93cyBpbnN0ZWFkXHJcbiAgICovXHJcbiAgQE91dHB1dCgpIG9uUm93c0NoZWNrZWQgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICAvKipcclxuICAgKiBXaWxsIGJlIGRlcHJlY2F0ZWQsIHVzZSBvblJvd3MgaW5zdGVhZFxyXG4gICAqIFxyXG4gICAqIOS4uuS6huWQkeWQjuWFvOWuue+8jOaVheayoeacieS/ruaUuW9uUm93c0NoZWNrZWTpgLvovpHvvIzlop7liqDmraRvdXRwdXTkuovku7ZcclxuICAgKiBcclxuICAgKiDlvZPliY3ooYx1bmNoZWNr5pe26Kem5Y+R5q2k5LqL5Lu2XHJcbiAgICovXHJcbiAgQE91dHB1dCgpIG9uUm93c1VuY2hlY2tlZCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gIC8qKuW9k+mAieaLqeacjeWKoeWZqOerr+aOkuW6j++8iOWNs3NlcnZlclNpZGVTb3J0ID0gdHJ1Ze+8ieaXtu+8jOagueaNruW9k+WJjeeCueWHu+WIl+WGheWuueWPiuaOkuW6j++8jOS8oOe7mWJhY2tlbmQgYXBp6L+U5Zue5pyN5Yqh5Zmo56uv5o6S5bqP5pWw5o2u6LWL5YC857uZZGF0YXNvdXJjZeWPinRvdGFs5a2X5q615Y2z5Y+vICovXHJcbiAgQE91dHB1dCgpIG9uU2VydmVyU2lkZVNvcnRlZCA9IG5ldyBFdmVudEVtaXR0ZXI8eyBjb2w6IENvbHVtbkRlZiwgc29ydGVkQnk6ICdkZWZhdWx0JyB8ICdhc2MnIHwgJ2Rlc2MnIH0+KCk7XHJcbiAgLyoqXHJcbiAgICog5b2T5YmN5aSE55CG55qE6KGMcm93L3Jvd3PvvIzpgInkuK0v6Z2e6YCJ5Lit54q25oCBXHJcbiAgICogXHJcbiAgICog5aaC54K55Ye75YWo6YCJ5oyJ6ZKu77yM5YiZ5aSE55CG55qE5piv5b2T5YmN6aG155qE5omA5pyJ6KGMcm93c1xyXG4gICAqL1xyXG4gIEBPdXRwdXQoKSBvblJvd3MgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuXHJcbiAgQENvbnRlbnRDaGlsZHJlbihOcENvbHVtbkRpcmVjdGl2ZSkgY29sdW1uQ29tcG9uZW50czogUXVlcnlMaXN0PE5wQ29sdW1uRGlyZWN0aXZlPjtcclxuICBAQ29udGVudENoaWxkcmVuKE5wSGVhZGVyRGlyZWN0aXZlKSBoZWFkZXJDb21wb25lbnRzOiBRdWVyeUxpc3Q8TnBIZWFkZXJEaXJlY3RpdmU+O1xyXG4gIEBDb250ZW50Q2hpbGQoTnBFbXB0eURpcmVjdGl2ZSkgZW1wdHlDb250ZW50OiBOcEVtcHR5RGlyZWN0aXZlO1xyXG5cclxuICBwcm9qZWN0ZWRUZW1wbGF0ZXM6IEFycmF5PHsgbmFtZTogc3RyaW5nLCB0ZW1wbGF0ZTogYW55IH0+ID0gW107XHJcbiAgaGVhZGVyVGVtcGxhdGVzOiBBcnJheTx7IG5hbWU6IHN0cmluZywgdGVtcGxhdGU6IGFueSB9PiA9IFtdO1xyXG4gIGludGVybmFsQ29sdW1uczogQXJyYXk8SW50ZXJuYWxDb2x1bW5EZWY+ID0gW107XHJcbiAgLyoq5q2k5a2X5q615ZCO57ut5Lya5bqf5byDIHdpbGwgYmUgZGVwcmVjYXRlZCAqL1xyXG4gIHNlbGVjdGVkUm93czogQXJyYXk8YW55PiA9IFtdO1xyXG4gIGRhdGFzb3VyY2VTb3J0ZWRCeURlZmF1bHQ6IEFycmF5PGFueT4gPSBbXTtcclxuXHJcbiAgY29uc3RydWN0b3IoKSB7IH1cclxuXHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgICB0aGlzLmRhdGFzb3VyY2VTb3J0ZWRCeURlZmF1bHQgPSBbLi4udGhpcy5kYXRhc291cmNlXTtcclxuXHJcbiAgICBpZiAodGhpcy5zaG93Q2hlY2tib3gpIHtcclxuICAgICAgdGhpcy5pbnRlcm5hbENvbHVtbnMgPSBbXTtcclxuICAgICAgdGhpcy5pbnRlcm5hbENvbHVtbnMucHVzaCh7XHJcbiAgICAgICAgaGVhZGVyTmFtZTogJ2NoaycsXHJcbiAgICAgICAgaGVhZGVyRGlzcGxheU5hbWU6ICcnLFxyXG4gICAgICAgIHdpZHRoOiAnNTBweCcsXHJcbiAgICAgICAgaXNDaGVja2JveDogdHJ1ZVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLm1lcmdlVG9JbnRlcm5hbENvbHVtbnMoKTtcclxuXHJcbiAgICB0aGlzLm9uU2VydmVyU2lkZVNvcnRlZC5zdWJzY3JpYmUocmVzID0+IHtcclxuICAgICAgY29uc29sZS5sb2coJ29uU2VydmVyU2lkZVNvcnRlZDogJywgcmVzKTtcclxuICAgICAgdGhpcy5idWlsZFNlcnZlclNpZGVTb3J0KHJlcy5jb2wpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XHJcbiAgICBpZiAoY2hhbmdlcy5jb2x1bW5zICYmIGNoYW5nZXMuY29sdW1ucy5jdXJyZW50VmFsdWUgJiZcclxuICAgICAgY2hhbmdlcy5jb2x1bW5zLmN1cnJlbnRWYWx1ZS5sZW5ndGggPiAwICYmXHJcbiAgICAgIGNoYW5nZXMuY29sdW1ucy5wcmV2aW91c1ZhbHVlICYmXHJcbiAgICAgIGNoYW5nZXMuY29sdW1ucy5wcmV2aW91c1ZhbHVlLmxlbmd0aCA+IDAgJiZcclxuICAgICAgY2hhbmdlcy5jb2x1bW5zLmN1cnJlbnRWYWx1ZSAhPT0gY2hhbmdlcy5jb2x1bW5zLnByZXZpb3VzVmFsdWUpIHtcclxuICAgICAgdGhpcy5tZXJnZVRvSW50ZXJuYWxDb2x1bW5zKCk7XHJcbiAgICAgIHRoaXMucHJvamVjdFRlbXBsYXRlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGNoYW5nZXMuZGF0YXNvdXJjZSAmJiBjaGFuZ2VzLmRhdGFzb3VyY2UuY3VycmVudFZhbHVlICYmIGNoYW5nZXMuZGF0YXNvdXJjZS5jdXJyZW50VmFsdWUubGVuZ3RoID4gMCkge1xyXG4gICAgICB0aGlzLmRhdGFzb3VyY2VTb3J0ZWRCeURlZmF1bHQgPSBbLi4uY2hhbmdlcy5kYXRhc291cmNlLmN1cnJlbnRWYWx1ZV07XHJcbiAgICAgIHRoaXMuaW5pdFVuaXF1ZUlkRm9yRGF0YXNvdXJjZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChjaGFuZ2VzLnRvdGFsICYmIGNoYW5nZXMudG90YWwuY3VycmVudFZhbHVlKSB7XHJcbiAgICAgIHRoaXMudG90YWwgPSArY2hhbmdlcy50b3RhbC5jdXJyZW50VmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGNoYW5nZXMucGFnZU51bWJlciAmJiAhY2hhbmdlcy5wYWdlTnVtYmVyLmZpcnN0Q2hhbmdlICYmIGNoYW5nZXMucGFnZU51bWJlci5jdXJyZW50VmFsdWUpIHtcclxuICAgICAgY29uc3QgcGFnZU51bWJlciA9ICtjaGFuZ2VzLnBhZ2VOdW1iZXIuY3VycmVudFZhbHVlO1xyXG4gICAgICB0aGlzLnBhZ2VOdW1iZXIgPSBwYWdlTnVtYmVyO1xyXG4gICAgICB0aGlzLnBhZ2VOdW1iZXJDaGFuZ2UuZW1pdChwYWdlTnVtYmVyKTtcclxuXHJcbiAgICAgIHRoaXMuc2VsZWN0QWxsKGZhbHNlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG5nQWZ0ZXJDb250ZW50SW5pdCgpIHtcclxuICAgIHRoaXMucHJvamVjdFRlbXBsYXRlKCk7XHJcbiAgfVxyXG5cclxuICBvblRhYmxlUGFnZUNoYW5nZWQoY3VycmVudFBhZ2VOdW1iZXI6IG51bWJlcikge1xyXG4gICAgdGhpcy5wYWdlTnVtYmVyID0gY3VycmVudFBhZ2VOdW1iZXI7XHJcbiAgICB0aGlzLnBhZ2VOdW1iZXJDaGFuZ2UuZW1pdCh0aGlzLnBhZ2VOdW1iZXIpO1xyXG5cclxuICAgIHRoaXMub25QYWdlQ2hhbmdlZC5uZXh0KGN1cnJlbnRQYWdlTnVtYmVyKTtcclxuXHJcbiAgICB0aGlzLnNlbGVjdEFsbChmYWxzZSk7XHJcbiAgfVxyXG5cclxuICBvblRhYmxlUGFnZVNpemVDaGFuZ2VkKGN1cnJlbnRQYWdlU2l6ZTogbnVtYmVyKSB7XHJcbiAgICB0aGlzLnBhZ2VTaXplID0gY3VycmVudFBhZ2VTaXplO1xyXG4gICAgdGhpcy5vblBhZ2VTaXplQ2hhbmdlZC5uZXh0KGN1cnJlbnRQYWdlU2l6ZSk7XHJcblxyXG4gICAgdGhpcy5zZWxlY3RBbGwoZmFsc2UpO1xyXG4gIH1cclxuXHJcbiAgb25TZWxlY3RBbGxDaGVja2VkKGlzQ2hlY2tlZDogYm9vbGVhbikge1xyXG4gICAgdGhpcy5zZWxlY3RBbGwoaXNDaGVja2VkKTtcclxuXHJcbiAgICBsZXQgcm93cyA9IFtdO1xyXG4gICAgaWYgKHRoaXMuZGF0YXNvdXJjZSAmJiB0aGlzLmRhdGFzb3VyY2UubGVuZ3RoID4gMCkge1xyXG4gICAgICB0aGlzLmRhdGFzb3VyY2UuZm9yRWFjaChyb3cgPT4ge1xyXG4gICAgICAgIHJvd3MucHVzaChyb3cpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLm9uUm93cy5lbWl0KHJvd3MpO1xyXG4gIH1cclxuXHJcbiAgb25Sb3dTZWxlY3RDaGVja2VkKHJvdzogYW55KSB7XHJcbiAgICBjb25zdCBjb2xDaGsgPSB0aGlzLmludGVybmFsQ29sdW1ucy5maW5kKGYgPT4gZi5oZWFkZXJOYW1lID09PSAnY2hrJyk7XHJcbiAgICBpZiAocm93LmNoZWNrZWQpIHtcclxuICAgICAgaWYgKCF0aGlzLnNlbGVjdGVkUm93cy5maW5kKGYgPT4gZi5kdF9pZCA9PT0gcm93LmR0X2lkKSkge1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRSb3dzLnB1c2gocm93KTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5zZWxlY3RlZFJvd3MgPSB0aGlzLnNlbGVjdGVkUm93cy5maWx0ZXIoZiA9PiBmLmR0X2lkICE9PSByb3cuZHRfaWQpO1xyXG4gICAgICB0aGlzLm9uUm93c1VuY2hlY2tlZC5uZXh0KHJvdyk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGNvbENoaykge1xyXG4gICAgICBjb2xDaGsuY2hlY2tlZCA9IHRoaXMuc2VsZWN0ZWRSb3dzLmxlbmd0aCA9PT0gdGhpcy5wYWdlU2l6ZTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5zZWxlY3RlZFJvd3MubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0QWxsKGZhbHNlKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLm9uUm93c0NoZWNrZWQubmV4dCh0aGlzLnNlbGVjdGVkUm93cyk7XHJcblxyXG4gICAgdGhpcy5vblJvd3MuZW1pdChyb3cpO1xyXG4gIH1cclxuXHJcbiAgb25Tb3J0KGl0ZW06IEludGVybmFsQ29sdW1uRGVmKSB7XHJcbiAgICBpZiAoIWl0ZW0uc29ydCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuc2VydmVyU2lkZVNvcnQpIHtcclxuICAgICAgdGhpcy5vblNlcnZlclNpZGVTb3J0ZWQuZW1pdCh7IGNvbDogaXRlbSwgc29ydGVkQnk6IGl0ZW0uc29ydGVkQnkgfSk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmJ1aWxkQ2xpZW50U2lkZVNvcnQoaXRlbSk7XHJcbiAgfVxyXG5cclxuICAvLyNyZWdpb24gUHJpdmF0ZSBtZXRob2RzXHJcbiAgcHJpdmF0ZSBidWlsZFNlcnZlclNpZGVTb3J0KGl0ZW06IEludGVybmFsQ29sdW1uRGVmKSB7XHJcbiAgICB0aGlzLnNldE5leHRTb3J0ZWRCeShpdGVtKTtcclxuICAgIHRoaXMucmVzZXRPdGhlclNvcnRlZENvbHVtbnMoaXRlbSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGJ1aWxkQ2xpZW50U2lkZVNvcnQoaXRlbTogSW50ZXJuYWxDb2x1bW5EZWYpIHtcclxuICAgIHRoaXMuc2V0TmV4dFNvcnRlZEJ5KGl0ZW0pO1xyXG4gICAgaWYgKGl0ZW0uc29ydGVkQnkgPT09ICdkZWZhdWx0Jykge1xyXG4gICAgICB0aGlzLmRhdGFzb3VyY2UgPSBbLi4udGhpcy5kYXRhc291cmNlU29ydGVkQnlEZWZhdWx0XTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuZGF0YXNvdXJjZS5zb3J0KFV0aWxzLmNvbXBhcmVWYWx1ZXMoaXRlbS5oZWFkZXJOYW1lLCBpdGVtLnNvcnRlZEJ5KSk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5yZXNldE90aGVyU29ydGVkQ29sdW1ucyhpdGVtKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2V0TmV4dFNvcnRlZEJ5KGl0ZW06IEludGVybmFsQ29sdW1uRGVmKSB7XHJcbiAgICBzd2l0Y2ggKGl0ZW0uc29ydGVkQnkpIHtcclxuICAgICAgY2FzZSAnZGVmYXVsdCc6XHJcbiAgICAgICAgaXRlbS5zb3J0ZWRCeSA9ICdhc2MnO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlICdhc2MnOlxyXG4gICAgICAgIGl0ZW0uc29ydGVkQnkgPSAnZGVzYyc7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgJ2Rlc2MnOlxyXG4gICAgICAgIGl0ZW0uc29ydGVkQnkgPSAnZGVmYXVsdCc7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGluaXRVbmlxdWVJZEZvckRhdGFzb3VyY2UoKSB7XHJcbiAgICB0aGlzLmRhdGFzb3VyY2UuZm9yRWFjaChyb3cgPT4ge1xyXG4gICAgICByb3dbJ2R0X2lkJ10gPSB0aGlzLklEKCk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcHJvamVjdFRlbXBsYXRlKCkge1xyXG4gICAgaWYgKHRoaXMuY29sdW1uQ29tcG9uZW50cykge1xyXG4gICAgICB0aGlzLmNvbHVtbkNvbXBvbmVudHMuZm9yRWFjaChpdGVtID0+IHtcclxuICAgICAgICBpZiAoIXRoaXMucHJvamVjdGVkVGVtcGxhdGVzLmZpbmQoZiA9PiBmLm5hbWUgPT09IGl0ZW0ubmFtZSkpIHtcclxuICAgICAgICAgIHRoaXMucHJvamVjdGVkVGVtcGxhdGVzLnB1c2goeyBuYW1lOiBpdGVtLm5hbWUsIHRlbXBsYXRlOiBpdGVtLmNlbGxUZW1wbGF0ZSB9KTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgdGhpcy5pbnRlcm5hbENvbHVtbnMuZm9yRWFjaChjb2x1bW4gPT4ge1xyXG4gICAgICAgIGNvbnN0IHByb2plY3RUZW1wbGF0ZSA9IHRoaXMucHJvamVjdGVkVGVtcGxhdGVzLmZpbmQoZiA9PiBmLm5hbWUgPT09IGNvbHVtbi5oZWFkZXJOYW1lKTtcclxuICAgICAgICBpZiAocHJvamVjdFRlbXBsYXRlKSB7XHJcbiAgICAgICAgICBjb2x1bW5bJ3RlbXBsYXRlJ10gPSBwcm9qZWN0VGVtcGxhdGUudGVtcGxhdGU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmhlYWRlckNvbXBvbmVudHMpIHtcclxuICAgICAgdGhpcy5oZWFkZXJDb21wb25lbnRzLmZvckVhY2goaXRlbSA9PiB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmhlYWRlclRlbXBsYXRlcy5maW5kKGYgPT4gZi5uYW1lID09PSBpdGVtLm5hbWUpKSB7XHJcbiAgICAgICAgICB0aGlzLmhlYWRlclRlbXBsYXRlcy5wdXNoKHsgbmFtZTogaXRlbS5uYW1lLCB0ZW1wbGF0ZTogaXRlbS5oZWFkZXJUZW1wbGF0ZSB9KTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgdGhpcy5pbnRlcm5hbENvbHVtbnMuZm9yRWFjaChjb2x1bW4gPT4ge1xyXG4gICAgICAgIGNvbnN0IHByb2plY3RUZW1wbGF0ZSA9IHRoaXMuaGVhZGVyVGVtcGxhdGVzLmZpbmQoZiA9PiBmLm5hbWUgPT09IGNvbHVtbi5oZWFkZXJOYW1lKTtcclxuICAgICAgICBpZiAocHJvamVjdFRlbXBsYXRlKSB7XHJcbiAgICAgICAgICBjb2x1bW5bJ2hlYWRlclRlbXBsYXRlJ10gPSBwcm9qZWN0VGVtcGxhdGUudGVtcGxhdGU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgbWVyZ2VUb0ludGVybmFsQ29sdW1ucygpIHtcclxuICAgIGlmICh0aGlzLmludGVybmFsQ29sdW1ucy5sZW5ndGggPT09IDApIHtcclxuICAgICAgdGhpcy5pbnRlcm5hbENvbHVtbnMgPSBbLi4udGhpcy5jb2x1bW5zXTtcclxuICAgICAgdGhpcy5zZXRTb3J0ZWRCeVRvRGVmYXVsdCgpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5jb2x1bW5zLmZvckVhY2gocmVwbGFjZUNvbHVtbiA9PiB7XHJcbiAgICAgIGxldCBleGlzdENvbHVtbiA9IHRoaXMuaW50ZXJuYWxDb2x1bW5zLmZpbmQoZiA9PiBmLmhlYWRlck5hbWUgPT09IHJlcGxhY2VDb2x1bW4uaGVhZGVyTmFtZSk7XHJcbiAgICAgIGlmIChleGlzdENvbHVtbikge1xyXG4gICAgICAgIGV4aXN0Q29sdW1uID0geyAuLi5yZXBsYWNlQ29sdW1uIH07XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5pbnRlcm5hbENvbHVtbnMucHVzaCh7IC4uLnJlcGxhY2VDb2x1bW4gfSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuc2V0U29ydGVkQnlUb0RlZmF1bHQoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2V0U29ydGVkQnlUb0RlZmF1bHQoKSB7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuaW50ZXJuYWxDb2x1bW5zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGlmICh0aGlzLmludGVybmFsQ29sdW1uc1tpXS5zb3J0KSB7XHJcbiAgICAgICAgdGhpcy5pbnRlcm5hbENvbHVtbnNbaV0uc29ydGVkQnkgPSAnZGVmYXVsdCc7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgSUQoKSB7XHJcbiAgICAvLyBNYXRoLnJhbmRvbSBzaG91bGQgYmUgdW5pcXVlIGJlY2F1c2Ugb2YgaXRzIHNlZWRpbmcgYWxnb3JpdGhtLlxyXG4gICAgLy8gQ29udmVydCBpdCB0byBiYXNlIDM2IChudW1iZXJzICsgbGV0dGVycyksIGFuZCBncmFiIHRoZSBmaXJzdCA5IGNoYXJhY3RlcnNcclxuICAgIC8vIGFmdGVyIHRoZSBkZWNpbWFsLlxyXG4gICAgcmV0dXJuICdfJyArIE1hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnN1YnN0cigyLCA5KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2VsZWN0QWxsKGlzU2VsZWN0OiBib29sZWFuKSB7XHJcbiAgICBjb25zdCBjb2xDaGsgPSB0aGlzLmludGVybmFsQ29sdW1ucy5maW5kKGYgPT4gZi5oZWFkZXJOYW1lID09PSAnY2hrJyk7XHJcbiAgICBpZiAoY29sQ2hrKSB7XHJcbiAgICAgIGNvbENoay5jaGVja2VkID0gaXNTZWxlY3Q7XHJcblxyXG4gICAgICB0aGlzLnNlbGVjdGVkUm93cyA9IFtdO1xyXG4gICAgICBpZiAodGhpcy5kYXRhc291cmNlICYmIHRoaXMuZGF0YXNvdXJjZS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgdGhpcy5kYXRhc291cmNlLmZvckVhY2gocm93ID0+IHtcclxuICAgICAgICAgIHJvdy5jaGVja2VkID0gaXNTZWxlY3Q7XHJcbiAgICAgICAgICBpZiAoaXNTZWxlY3QpIHtcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFJvd3MucHVzaChyb3cpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLm9uUm93c0NoZWNrZWQubmV4dCh0aGlzLnNlbGVjdGVkUm93cyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlc2V0T3RoZXJTb3J0ZWRDb2x1bW5zKGl0ZW06IEludGVybmFsQ29sdW1uRGVmKSB7XHJcbiAgICB0aGlzLmludGVybmFsQ29sdW1ucy5mb3JFYWNoKGNvbCA9PiB7XHJcbiAgICAgIGlmIChjb2wuaGVhZGVyTmFtZSAhPT0gaXRlbS5oZWFkZXJOYW1lICYmIGNvbC5zb3J0KSB7XHJcbiAgICAgICAgY29sLnNvcnRlZEJ5ID0gJ2RlZmF1bHQnO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcbiAgLy8jZW5kcmVnaW9uXHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgQ29sdW1uRGVmIHtcclxuICAvKirliJflkI3np7AgKi9cclxuICBoZWFkZXJOYW1lOiBzdHJpbmc7XHJcbiAgLyoq5YiX5pi+56S65ZCN56ewICovXHJcbiAgaGVhZGVyRGlzcGxheU5hbWU6IHN0cmluZztcclxuICAvKirliJflrr3luqYgKi9cclxuICB3aWR0aD86IHN0cmluZztcclxuICBzb3J0PzogYm9vbGVhbjtcclxufVxyXG5cclxuLyoqXHJcbiAqIEBpZ25vcmVcclxuICovXHJcbmludGVyZmFjZSBJbnRlcm5hbENvbHVtbkRlZiBleHRlbmRzIENvbHVtbkRlZiB7XHJcbiAgaXNDaGVja2JveD86IGJvb2xlYW47XHJcbiAgY2hlY2tlZD86IGJvb2xlYW47XHJcbiAgc29ydGVkQnk/OiAnZGVmYXVsdCcgfCAnYXNjJyB8ICdkZXNjJztcclxufVxyXG5cclxuIl19