UNPKG

@catull/igniteui-angular

Version:

Ignite UI for Angular is a dependency-free Angular toolkit for building modern web apps

338 lines 31 kB
import { __decorate, __extends, __metadata, __param, __read, __spread } from "tslib"; import { CommonModule } from '@angular/common'; import { FormsModule } from '@angular/forms'; import { Component, Input, Output, NgModule, Optional, Inject, EventEmitter, HostBinding } from '@angular/core'; import { CurrentResourceStrings } from '../core/i18n/resources'; import { DisplayDensityToken, DisplayDensityBase, DisplayDensity } from '../core/displayDensity'; import { IgxSelectModule } from '../select/index'; import { IgxIconModule } from '../icon/index'; import { IgxButtonModule } from '../directives/button/button.directive'; import { IgxRippleModule } from '../directives/ripple/ripple.directive'; var IgxPaginatorComponent = /** @class */ (function (_super) { __extends(IgxPaginatorComponent, _super); function IgxPaginatorComponent(_displayDensityOptions) { var _this = _super.call(this, _displayDensityOptions) || this; _this._displayDensityOptions = _displayDensityOptions; _this._page = 0; _this.defaultSelectValues = [5, 10, 15, 25, 50, 100, 500]; _this._perPage = 15; /** * An @Input property that sets if the pager in the paginator should be enabled. * ```html * <igx-paginator [pagerEnabled]="true"></igx-paginator> * ``` * @memberof IgxPaginatorComponent */ _this.pagerEnabled = true; /** * An @Input property that sets if the pager in the paginator should be hidden. * ```html * <igx-paginator [pagerHidden]="true"></igx-paginator> * ``` * @memberof IgxPaginatorComponent */ _this.pagerHidden = false; /** * An @Input property that sets if the dropdown in the paginator should be enabled. * ```html * <igx-paginator [dropdownEnabled]="true"></igx-paginator> * ``` * @memberof IgxPaginatorComponent */ _this.dropdownEnabled = true; /** * An @Input property that sets if the dropdown in the paginator should be hidden. * ```html * <igx-paginator [dropdownHidden]="true"></igx-paginator> * ``` * @memberof IgxPaginatorComponent */ _this.dropdownHidden = false; /** * An @Input property, sets number of label of the select. * The default is 'Items per page' localized string. * ```html * <igx-paginator label="My custom label"></igx-paginator> * ``` * @memberof IgxPaginatorComponent */ _this.selectLabel = CurrentResourceStrings.PaginatorResStrings.igx_paginator_label; /** *An event that is emitted when the select in the `IgxPaginatorComponent` changes its value. */ _this.perPageChange = new EventEmitter(); /** *An event that is emitted when the paginating is used. */ _this.pageChange = new EventEmitter(); return _this; } Object.defineProperty(IgxPaginatorComponent.prototype, "classCosy", { /** * Sets the class of the IgxPaginatorComponent based * on the provided displayDensity. */ get: function () { return this.displayDensity === DisplayDensity.cosy; }, enumerable: true, configurable: true }); Object.defineProperty(IgxPaginatorComponent.prototype, "classCompact", { get: function () { return this.displayDensity === DisplayDensity.compact; }, enumerable: true, configurable: true }); Object.defineProperty(IgxPaginatorComponent.prototype, "classComfortable", { get: function () { return this.displayDensity === DisplayDensity.comfortable; }, enumerable: true, configurable: true }); Object.defineProperty(IgxPaginatorComponent.prototype, "page", { /** * An @Input property, sets current page of the `IgxPaginatorComponent`. * The default is 0. * ```typescript * let page = this.paginator.page; * ``` * @memberof IgxPaginatorComponent */ get: function () { return this._page; }, set: function (value) { this._page = value; this.pageChange.emit(this._page); }, enumerable: true, configurable: true }); Object.defineProperty(IgxPaginatorComponent.prototype, "perPage", { /** * An @Input property, sets number of visible items per page in the `IgxPaginatorComponent`. * The default is 15. * ```typescript * let itemsPerPage = this.paginator.perPage; * ``` * @memberof IgxPaginatorComponent */ get: function () { return this._perPage; }, set: function (value) { this._perPage = Number(value); this.perPageChange.emit(this._perPage); this._selectOptions = this.sortUniqueOptions(this.defaultSelectValues, this._perPage); this.totalPages = Math.ceil(this.totalRecords / this._perPage); }, enumerable: true, configurable: true }); Object.defineProperty(IgxPaginatorComponent.prototype, "totalRecords", { /** * An @Input property that sets the total records. * ```typescript * let totalRecords = this.paginator.totalRecords; * ``` * @memberof IgxPaginatorComponent */ get: function () { return this._totalRecords; }, set: function (value) { this._totalRecords = value; this.totalPages = Math.ceil(this.totalRecords / this.perPage); }, enumerable: true, configurable: true }); Object.defineProperty(IgxPaginatorComponent.prototype, "selectOptions", { /** * An @Input property that sets custom options in the select of the paginator * ```typescript * let options = this.paginator.selectOptions; * ``` * @memberof IgxPaginatorComponent */ get: function () { return this._selectOptions; }, set: function (value) { this._selectOptions = this.sortUniqueOptions(value, this._perPage); this.defaultSelectValues = __spread(this._selectOptions); }, enumerable: true, configurable: true }); Object.defineProperty(IgxPaginatorComponent.prototype, "isLastPage", { /** * Returns if the current page is the last page. * ```typescript * const lastPage = this.paginator.isLastPage; * ``` */ get: function () { return this.page + 1 >= this.totalPages; }, enumerable: true, configurable: true }); Object.defineProperty(IgxPaginatorComponent.prototype, "isFirstPage", { /** * Returns if the current page is the first page. * ```typescript * const lastPage = this.paginator.isFirstPage; * ``` */ get: function () { return this.page === 0; }, enumerable: true, configurable: true }); IgxPaginatorComponent.prototype.sortUniqueOptions = function (values, newOption) { return Array.from(new Set(__spread(values, [newOption]))).sort(function (a, b) { return a - b; }); }; /** * Sets DisplayDensity for the <select> inside the paginator * @hidden */ IgxPaginatorComponent.prototype.paginatorSelectDisplayDensity = function () { if (this.displayDensity === DisplayDensity.comfortable) { return DisplayDensity.cosy; } return DisplayDensity.compact; }; /** * Goes to the next page of the `IgxPaginatorComponent`, if the paginator is not already at the last page. * ```typescript * this.paginator.nextPage(); * ``` * @memberof IgxPaginatorComponent */ IgxPaginatorComponent.prototype.nextPage = function () { if (!this.isLastPage) { this.page += 1; } }; /** * Goes to the previous page of the `IgxPaginatorComponent`, if the paginator is not already at the first page. * ```typescript * this.paginator.previousPage(); * ``` * @memberof IgxPaginatorComponent */ IgxPaginatorComponent.prototype.previousPage = function () { if (!this.isFirstPage) { this.page -= 1; } }; /** * Goes to the desired page index. * ```typescript * this.pagiantor.paginate(1); * ``` * @param val * @memberof IgxPaginatorComponent */ IgxPaginatorComponent.prototype.paginate = function (val) { if (val < 0 || val > this.totalPages - 1) { return; } this.page = val; }; IgxPaginatorComponent.ctorParameters = function () { return [ { type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [DisplayDensityToken,] }] } ]; }; __decorate([ HostBinding('class.igx-paginator--cosy'), __metadata("design:type", Boolean), __metadata("design:paramtypes", []) ], IgxPaginatorComponent.prototype, "classCosy", null); __decorate([ HostBinding('class.igx-paginator--compact'), __metadata("design:type", Boolean), __metadata("design:paramtypes", []) ], IgxPaginatorComponent.prototype, "classCompact", null); __decorate([ HostBinding('class.igx-paginator'), __metadata("design:type", Boolean), __metadata("design:paramtypes", []) ], IgxPaginatorComponent.prototype, "classComfortable", null); __decorate([ Input(), __metadata("design:type", Number), __metadata("design:paramtypes", [Number]) ], IgxPaginatorComponent.prototype, "page", null); __decorate([ Input(), __metadata("design:type", Number), __metadata("design:paramtypes", [Number]) ], IgxPaginatorComponent.prototype, "perPage", null); __decorate([ Input(), __metadata("design:type", Number), __metadata("design:paramtypes", [Number]) ], IgxPaginatorComponent.prototype, "totalRecords", null); __decorate([ Input(), __metadata("design:type", Array), __metadata("design:paramtypes", [Array]) ], IgxPaginatorComponent.prototype, "selectOptions", null); __decorate([ Input(), __metadata("design:type", Object) ], IgxPaginatorComponent.prototype, "pagerEnabled", void 0); __decorate([ Input(), __metadata("design:type", Object) ], IgxPaginatorComponent.prototype, "pagerHidden", void 0); __decorate([ Input(), __metadata("design:type", Object) ], IgxPaginatorComponent.prototype, "dropdownEnabled", void 0); __decorate([ Input(), __metadata("design:type", Object) ], IgxPaginatorComponent.prototype, "dropdownHidden", void 0); __decorate([ Input(), __metadata("design:type", Object) ], IgxPaginatorComponent.prototype, "selectLabel", void 0); __decorate([ Output(), __metadata("design:type", Object) ], IgxPaginatorComponent.prototype, "perPageChange", void 0); __decorate([ Output(), __metadata("design:type", Object) ], IgxPaginatorComponent.prototype, "pageChange", void 0); IgxPaginatorComponent = __decorate([ Component({ selector: 'igx-paginator', template: "<div class=\"igx-paginator__select\" [hidden]=\"dropdownHidden\">\n <label class=\"igx-paginator__label\">{{ selectLabel }}</label>\n <div class=\"igx-paginator__select-input\">\n <igx-select [(ngModel)]=\"perPage\" [displayDensity]=\"paginatorSelectDisplayDensity()\" type=\"border\"\n [disabled]=\"!dropdownEnabled\">\n <igx-select-item [value]=\"val\" *ngFor=\"let val of selectOptions\">\n {{val}}\n </igx-select-item>\n </igx-select>\n </div>\n</div>\n<div class=\"igx-paginator__pager\" [hidden]=\"pagerHidden\">\n <button [disabled]=\"isFirstPage || !pagerEnabled ? true: false\" (click)=\"paginate(0)\" igxButton=\"icon\" igxRipple igxRippleCentered=\"true\">\n <igx-icon fontSet=\"material\">first_page</igx-icon>\n </button>\n <button [disabled]=\"isFirstPage || !pagerEnabled ? true: false\" (click)=\"previousPage()\" igxButton=\"icon\" igxRipple igxRippleCentered=\"true\">\n <igx-icon fontSet=\"material\">chevron_left</igx-icon>\n </button>\n <div class='igx-paginator__pager-text'>\n <span>{{ page + 1 }}</span>\n <span>&nbsp;of&nbsp;</span>\n <span>{{ totalPages }}</span>\n </div>\n <button [disabled]=\"isLastPage || !pagerEnabled ? true: false\" (click)=\"nextPage()\" igxRipple igxRippleCentered=\"true\" igxButton=\"icon\">\n <igx-icon fontSet=\"material\">chevron_right</igx-icon>\n </button>\n <button [disabled]=\"isLastPage || !pagerEnabled ? true: false\" (click)=\"paginate(totalPages - 1)\" igxButton=\"icon\" igxRipple\n igxRippleCentered=\"true\">\n <igx-icon fontSet=\"material\">last_page</igx-icon>\n </button>\n</div>\n" }), __param(0, Optional()), __param(0, Inject(DisplayDensityToken)), __metadata("design:paramtypes", [Object]) ], IgxPaginatorComponent); return IgxPaginatorComponent; }(DisplayDensityBase)); export { IgxPaginatorComponent }; var IgxPaginatorModule = /** @class */ (function () { function IgxPaginatorModule() { } IgxPaginatorModule = __decorate([ NgModule({ declarations: [IgxPaginatorComponent], exports: [IgxPaginatorComponent], imports: [CommonModule, IgxSelectModule, FormsModule, IgxIconModule, IgxButtonModule, IgxRippleModule] }) ], IgxPaginatorModule); return IgxPaginatorModule; }()); export { IgxPaginatorModule }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFnaW5hdG9yLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2lnbml0ZXVpLWFuZ3VsYXIvIiwic291cmNlcyI6WyJsaWIvcGFnaW5hdG9yL3BhZ2luYXRvci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxXQUFXLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDaEgsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDaEUsT0FBTyxFQUEwQixtQkFBbUIsRUFBRSxrQkFBa0IsRUFBRSxjQUFjLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN6SCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDbEQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM5QyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFDeEUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBTXhFO0lBQTJDLHlDQUFrQjtJQW9LekQsK0JBQStELHNCQUE4QztRQUE3RyxZQUVJLGtCQUFNLHNCQUFzQixDQUFDLFNBQ2hDO1FBSDhELDRCQUFzQixHQUF0QixzQkFBc0IsQ0FBd0I7UUE5Sm5HLFdBQUssR0FBRyxDQUFDLENBQUM7UUFHWix5QkFBbUIsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ2xELGNBQVEsR0FBRyxFQUFFLENBQUM7UUE0RnhC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LEVBQUUsYUFBYSxFQUFFLGVBQWUsRUFBRSxlQUFlLENBQUM7U0FDekcsQ0FBQztPQUNXLGtCQUFrQixDQUFJO0lBQUQseUJBQUM7Q0FBQSxBQUFuQyxJQUFtQztTQUF0QixrQkFBa0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPdXRwdXQsIE5nTW9kdWxlLCBPcHRpb25hbCwgSW5qZWN0LCBFdmVudEVtaXR0ZXIsIEhvc3RCaW5kaW5nIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDdXJyZW50UmVzb3VyY2VTdHJpbmdzIH0gZnJvbSAnLi4vY29yZS9pMThuL3Jlc291cmNlcyc7XG5pbXBvcnQgeyBJRGlzcGxheURlbnNpdHlPcHRpb25zLCBEaXNwbGF5RGVuc2l0eVRva2VuLCBEaXNwbGF5RGVuc2l0eUJhc2UsIERpc3BsYXlEZW5zaXR5IH0gZnJvbSAnLi4vY29yZS9kaXNwbGF5RGVuc2l0eSc7XG5pbXBvcnQgeyBJZ3hTZWxlY3RNb2R1bGUgfSBmcm9tICcuLi9zZWxlY3QvaW5kZXgnO1xuaW1wb3J0IHsgSWd4SWNvbk1vZHVsZSB9IGZyb20gJy4uL2ljb24vaW5kZXgnO1xuaW1wb3J0IHsgSWd4QnV0dG9uTW9kdWxlIH0gZnJvbSAnLi4vZGlyZWN0aXZlcy9idXR0b24vYnV0dG9uLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBJZ3hSaXBwbGVNb2R1bGUgfSBmcm9tICcuLi9kaXJlY3RpdmVzL3JpcHBsZS9yaXBwbGUuZGlyZWN0aXZlJztcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdpZ3gtcGFnaW5hdG9yJyxcbiAgICB0ZW1wbGF0ZVVybDogJ3BhZ2luYXRvci5jb21wb25lbnQuaHRtbCcsXG59KVxuZXhwb3J0IGNsYXNzIElneFBhZ2luYXRvckNvbXBvbmVudCBleHRlbmRzIERpc3BsYXlEZW5zaXR5QmFzZSB7XG5cbiAgICAvKipcbiAgICAgKiBUb3RhbCBwYWdlcyBjYWxjdWxhdGVkIGZyb20gdG90YWxSZWNvcmRzIGFuZCBwZXJQYWdlXG4gICAgICovXG4gICAgcHVibGljIHRvdGFsUGFnZXM6IG51bWJlcjtcbiAgICBwcm90ZWN0ZWQgX3BhZ2UgPSAwO1xuICAgIHByb3RlY3RlZCBfdG90YWxSZWNvcmRzOiBudW1iZXI7XG4gICAgcHJvdGVjdGVkIF9zZWxlY3RPcHRpb25zO1xuICAgIHByaXZhdGUgZGVmYXVsdFNlbGVjdFZhbHVlcyA9IFs1LCAxMCwgMTUsIDI1LCA1MCwgMTAwLCA1MDBdO1xuICAgIHByb3RlY3RlZCBfcGVyUGFnZSA9IDE1O1xuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgY2xhc3Mgb2YgdGhlIElneFBhZ2luYXRvckNvbXBvbmVudCBiYXNlZFxuICAgICAqIG9uIHRoZSBwcm92aWRlZCBkaXNwbGF5RGVuc2l0eS5cbiAgICAgKi9cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLmlneC1wYWdpbmF0b3ItLWNvc3knKVxuICAgIHB1YmxpYyBnZXQgY2xhc3NDb3N5KCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5kaXNwbGF5RGVuc2l0eSA9PT0gRGlzcGxheURlbnNpdHkuY29zeTtcbiAgICB9XG5cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLmlneC1wYWdpbmF0b3ItLWNvbXBhY3QnKVxuICAgIHB1YmxpYyBnZXQgY2xhc3NDb21wYWN0KCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5kaXNwbGF5RGVuc2l0eSA9PT0gRGlzcGxheURlbnNpdHkuY29tcGFjdDtcbiAgICB9XG5cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLmlneC1wYWdpbmF0b3InKVxuICAgIHB1YmxpYyBnZXQgY2xhc3NDb21mb3J0YWJsZSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGlzcGxheURlbnNpdHkgPT09IERpc3BsYXlEZW5zaXR5LmNvbWZvcnRhYmxlO1xuICAgIH1cblxuICAgIC8qKlxuICAgKiBBbiBASW5wdXQgcHJvcGVydHksIHNldHMgY3VycmVudCBwYWdlIG9mIHRoZSBgSWd4UGFnaW5hdG9yQ29tcG9uZW50YC5cbiAgICogVGhlIGRlZmF1bHQgaXMgMC5cbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBsZXQgcGFnZSA9IHRoaXMucGFnaW5hdG9yLnBhZ2U7XG4gICAqIGBgYFxuICAgKiBAbWVtYmVyb2YgSWd4UGFnaW5hdG9yQ29tcG9uZW50XG4gICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCBwYWdlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcGFnZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IHBhZ2UodmFsdWU6IG51bWJlcikge1xuICAgICAgICB0aGlzLl9wYWdlID0gdmFsdWU7XG4gICAgICAgIHRoaXMucGFnZUNoYW5nZS5lbWl0KHRoaXMuX3BhZ2UpO1xuICAgIH1cblxuICAgIC8qKlxuICAgKiBBbiBASW5wdXQgcHJvcGVydHksIHNldHMgbnVtYmVyIG9mIHZpc2libGUgaXRlbXMgcGVyIHBhZ2UgaW4gdGhlIGBJZ3hQYWdpbmF0b3JDb21wb25lbnRgLlxuICAgKiBUaGUgZGVmYXVsdCBpcyAxNS5cbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBsZXQgaXRlbXNQZXJQYWdlID0gdGhpcy5wYWdpbmF0b3IucGVyUGFnZTtcbiAgICogYGBgXG4gICAqIEBtZW1iZXJvZiBJZ3hQYWdpbmF0b3JDb21wb25lbnRcbiAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IHBlclBhZ2UoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wZXJQYWdlO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgcGVyUGFnZSh2YWx1ZTogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMuX3BlclBhZ2UgPSBOdW1iZXIodmFsdWUpO1xuICAgICAgICB0aGlzLnBlclBhZ2VDaGFuZ2UuZW1pdCh0aGlzLl9wZXJQYWdlKTtcbiAgICAgICAgdGhpcy5fc2VsZWN0T3B0aW9ucyA9IHRoaXMuc29ydFVuaXF1ZU9wdGlvbnModGhpcy5kZWZhdWx0U2VsZWN0VmFsdWVzLCB0aGlzLl9wZXJQYWdlKTtcbiAgICAgICAgdGhpcy50b3RhbFBhZ2VzID0gTWF0aC5jZWlsKHRoaXMudG90YWxSZWNvcmRzIC8gdGhpcy5fcGVyUGFnZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBBbiBASW5wdXQgcHJvcGVydHkgdGhhdCBzZXRzIHRoZSB0b3RhbCByZWNvcmRzLlxuICAgICogYGBgdHlwZXNjcmlwdFxuICAgICogbGV0IHRvdGFsUmVjb3JkcyA9IHRoaXMucGFnaW5hdG9yLnRvdGFsUmVjb3JkcztcbiAgICAqIGBgYFxuICAgICogQG1lbWJlcm9mIElneFBhZ2luYXRvckNvbXBvbmVudFxuICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IHRvdGFsUmVjb3JkcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3RvdGFsUmVjb3JkcztcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IHRvdGFsUmVjb3Jkcyh2YWx1ZTogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMuX3RvdGFsUmVjb3JkcyA9IHZhbHVlO1xuICAgICAgICB0aGlzLnRvdGFsUGFnZXMgPSBNYXRoLmNlaWwodGhpcy50b3RhbFJlY29yZHMgLyB0aGlzLnBlclBhZ2UpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICogQW4gQElucHV0IHByb3BlcnR5IHRoYXQgc2V0cyBjdXN0b20gb3B0aW9ucyBpbiB0aGUgc2VsZWN0IG9mIHRoZSBwYWdpbmF0b3JcbiAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAqIGxldCBvcHRpb25zID0gdGhpcy5wYWdpbmF0b3Iuc2VsZWN0T3B0aW9ucztcbiAgICAqIGBgYFxuICAgICogQG1lbWJlcm9mIElneFBhZ2luYXRvckNvbXBvbmVudFxuICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IHNlbGVjdE9wdGlvbnMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zZWxlY3RPcHRpb25zO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgc2VsZWN0T3B0aW9ucyh2YWx1ZTogQXJyYXk8bnVtYmVyPikge1xuICAgICAgICB0aGlzLl9zZWxlY3RPcHRpb25zID0gdGhpcy5zb3J0VW5pcXVlT3B0aW9ucyh2YWx1ZSwgdGhpcy5fcGVyUGFnZSk7XG4gICAgICAgIHRoaXMuZGVmYXVsdFNlbGVjdFZhbHVlcyA9IFsuLi50aGlzLl9zZWxlY3RPcHRpb25zXTtcbiAgICB9XG4gICAgLyoqXG4gICAgKiBBbiBASW5wdXQgcHJvcGVydHkgdGhhdCBzZXRzIGlmIHRoZSBwYWdlciBpbiB0aGUgcGFnaW5hdG9yIHNob3VsZCBiZSBlbmFibGVkLlxuICAgICogYGBgaHRtbFxuICAgICogPGlneC1wYWdpbmF0b3IgW3BhZ2VyRW5hYmxlZF09XCJ0cnVlXCI+PC9pZ3gtcGFnaW5hdG9yPlxuICAgICogYGBgXG4gICAgKiBAbWVtYmVyb2YgSWd4UGFnaW5hdG9yQ29tcG9uZW50XG4gICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBwYWdlckVuYWJsZWQgPSB0cnVlO1xuXG4gICAgLyoqXG4gICAgKiBBbiBASW5wdXQgcHJvcGVydHkgdGhhdCBzZXRzIGlmIHRoZSBwYWdlciBpbiB0aGUgcGFnaW5hdG9yIHNob3VsZCBiZSBoaWRkZW4uXG4gICAgKiBgYGBodG1sXG4gICAgKiA8aWd4LXBhZ2luYXRvciBbcGFnZXJIaWRkZW5dPVwidHJ1ZVwiPjwvaWd4LXBhZ2luYXRvcj5cbiAgICAqIGBgYFxuICAgICogQG1lbWJlcm9mIElneFBhZ2luYXRvckNvbXBvbmVudFxuICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgcGFnZXJIaWRkZW4gPSBmYWxzZTtcblxuICAgIC8qKlxuICAgICogQW4gQElucHV0IHByb3BlcnR5IHRoYXQgc2V0cyBpZiB0aGUgZHJvcGRvd24gaW4gdGhlIHBhZ2luYXRvciBzaG91bGQgYmUgZW5hYmxlZC5cbiAgICAqIGBgYGh0bWxcbiAgICAqIDxpZ3gtcGFnaW5hdG9yIFtkcm9wZG93bkVuYWJsZWRdPVwidHJ1ZVwiPjwvaWd4LXBhZ2luYXRvcj5cbiAgICAqIGBgYFxuICAgICogQG1lbWJlcm9mIElneFBhZ2luYXRvckNvbXBvbmVudFxuICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZHJvcGRvd25FbmFibGVkID0gdHJ1ZTtcblxuICAgIC8qKlxuICAgICogQW4gQElucHV0IHByb3BlcnR5IHRoYXQgc2V0cyBpZiB0aGUgZHJvcGRvd24gaW4gdGhlIHBhZ2luYXRvciBzaG91bGQgYmUgaGlkZGVuLlxuICAgICogYGBgaHRtbFxuICAgICogPGlneC1wYWdpbmF0b3IgW2Ryb3Bkb3duSGlkZGVuXT1cInRydWVcIj48L2lneC1wYWdpbmF0b3I+XG4gICAgKiBgYGBcbiAgICAqIEBtZW1iZXJvZiBJZ3hQYWdpbmF0b3JDb21wb25lbnRcbiAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGRyb3Bkb3duSGlkZGVuID0gZmFsc2U7XG5cbiAgICAvKipcbiAgICAqIEFuIEBJbnB1dCBwcm9wZXJ0eSwgc2V0cyBudW1iZXIgb2YgbGFiZWwgb2YgdGhlIHNlbGVjdC5cbiAgICAqIFRoZSBkZWZhdWx0IGlzICdJdGVtcyBwZXIgcGFnZScgbG9jYWxpemVkIHN0cmluZy5cbiAgICAqIGBgYGh0bWxcbiAgICAqIDxpZ3gtcGFnaW5hdG9yIGxhYmVsPVwiTXkgY3VzdG9tIGxhYmVsXCI+PC9pZ3gtcGFnaW5hdG9yPlxuICAgICogYGBgXG4gICAgKiBAbWVtYmVyb2YgSWd4UGFnaW5hdG9yQ29tcG9uZW50XG4gICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBzZWxlY3RMYWJlbCA9IEN1cnJlbnRSZXNvdXJjZVN0cmluZ3MuUGFnaW5hdG9yUmVzU3RyaW5ncy5pZ3hfcGFnaW5hdG9yX2xhYmVsO1xuXG4gICAgLyoqXG4gICAgICpBbiBldmVudCB0aGF0IGlzIGVtaXR0ZWQgd2hlbiB0aGUgc2VsZWN0IGluIHRoZSBgSWd4UGFnaW5hdG9yQ29tcG9uZW50YCBjaGFuZ2VzIGl0cyB2YWx1ZS5cbiAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBwZXJQYWdlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KCk7XG4gICAgLyoqXG4gICAgICpBbiBldmVudCB0aGF0IGlzIGVtaXR0ZWQgd2hlbiB0aGUgcGFnaW5hdGluZyBpcyB1c2VkLlxuICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIHBhZ2VDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlcj4oKTtcblxuICAgIGNvbnN0cnVjdG9yKEBPcHRpb25hbCgpIEBJbmplY3QoRGlzcGxheURlbnNpdHlUb2tlbikgcHJvdGVjdGVkIF9kaXNwbGF5RGVuc2l0eU9wdGlvbnM6IElEaXNwbGF5RGVuc2l0eU9wdGlvbnNcbiAgICApIHtcbiAgICAgICAgc3VwZXIoX2Rpc3BsYXlEZW5zaXR5T3B0aW9ucyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBpZiB0aGUgY3VycmVudCBwYWdlIGlzIHRoZSBsYXN0IHBhZ2UuXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGNvbnN0IGxhc3RQYWdlID0gdGhpcy5wYWdpbmF0b3IuaXNMYXN0UGFnZTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBnZXQgaXNMYXN0UGFnZSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGFnZSArIDEgPj0gdGhpcy50b3RhbFBhZ2VzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgaWYgdGhlIGN1cnJlbnQgcGFnZSBpcyB0aGUgZmlyc3QgcGFnZS5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogY29uc3QgbGFzdFBhZ2UgPSB0aGlzLnBhZ2luYXRvci5pc0ZpcnN0UGFnZTtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBnZXQgaXNGaXJzdFBhZ2UoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnBhZ2UgPT09IDA7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzb3J0VW5pcXVlT3B0aW9ucyh2YWx1ZXM6IEFycmF5PG51bWJlcj4sIG5ld09wdGlvbjogbnVtYmVyKTogbnVtYmVyW10ge1xuICAgICAgICByZXR1cm4gQXJyYXkuZnJvbShuZXcgU2V0KFsuLi52YWx1ZXMsIG5ld09wdGlvbl0pKS5zb3J0KChhLCBiKSA9PiBhIC0gYik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyBEaXNwbGF5RGVuc2l0eSBmb3IgdGhlIDxzZWxlY3Q+IGluc2lkZSB0aGUgcGFnaW5hdG9yXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHB1YmxpYyBwYWdpbmF0b3JTZWxlY3REaXNwbGF5RGVuc2l0eSgpOiBzdHJpbmcge1xuICAgICAgICBpZiAodGhpcy5kaXNwbGF5RGVuc2l0eSA9PT0gRGlzcGxheURlbnNpdHkuY29tZm9ydGFibGUpIHtcbiAgICAgICAgICAgIHJldHVybiBEaXNwbGF5RGVuc2l0eS5jb3N5O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBEaXNwbGF5RGVuc2l0eS5jb21wYWN0O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHb2VzIHRvIHRoZSBuZXh0IHBhZ2Ugb2YgdGhlIGBJZ3hQYWdpbmF0b3JDb21wb25lbnRgLCBpZiB0aGUgcGFnaW5hdG9yIGlzIG5vdCBhbHJlYWR5IGF0IHRoZSBsYXN0IHBhZ2UuXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIHRoaXMucGFnaW5hdG9yLm5leHRQYWdlKCk7XG4gICAgICogYGBgXG5cdCAqIEBtZW1iZXJvZiBJZ3hQYWdpbmF0b3JDb21wb25lbnRcbiAgICAgKi9cbiAgICBwdWJsaWMgbmV4dFBhZ2UoKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5pc0xhc3RQYWdlKSB7XG4gICAgICAgICAgICB0aGlzLnBhZ2UgKz0gMTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBHb2VzIHRvIHRoZSBwcmV2aW91cyBwYWdlIG9mIHRoZSBgSWd4UGFnaW5hdG9yQ29tcG9uZW50YCwgaWYgdGhlIHBhZ2luYXRvciBpcyBub3QgYWxyZWFkeSBhdCB0aGUgZmlyc3QgcGFnZS5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogdGhpcy5wYWdpbmF0b3IucHJldmlvdXNQYWdlKCk7XG4gICAgICogYGBgXG5cdCAqIEBtZW1iZXJvZiBJZ3hQYWdpbmF0b3JDb21wb25lbnRcbiAgICAgKi9cbiAgICBwdWJsaWMgcHJldmlvdXNQYWdlKCk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuaXNGaXJzdFBhZ2UpIHtcbiAgICAgICAgICAgIHRoaXMucGFnZSAtPSAxO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdvZXMgdG8gdGhlIGRlc2lyZWQgcGFnZSBpbmRleC5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogdGhpcy5wYWdpYW50b3IucGFnaW5hdGUoMSk7XG4gICAgICogYGBgXG4gICAgICogQHBhcmFtIHZhbFxuICAgICAqIEBtZW1iZXJvZiBJZ3hQYWdpbmF0b3JDb21wb25lbnRcbiAgICAgKi9cbiAgICBwdWJsaWMgcGFnaW5hdGUodmFsOiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgaWYgKHZhbCA8IDAgfHwgdmFsID4gdGhpcy50b3RhbFBhZ2VzIC0gMSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucGFnZSA9IHZhbDtcbiAgICB9XG59XG5cbkBOZ01vZHVsZSh7XG4gICAgZGVjbGFyYXRpb25zOiBbSWd4UGFnaW5hdG9yQ29tcG9uZW50XSxcbiAgICBleHBvcnRzOiBbSWd4UGFnaW5hdG9yQ29tcG9uZW50XSxcbiAgICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBJZ3hTZWxlY3RNb2R1bGUsIEZvcm1zTW9kdWxlLCBJZ3hJY29uTW9kdWxlLCBJZ3hCdXR0b25Nb2R1bGUsIElneFJpcHBsZU1vZHVsZV1cbn0pXG5leHBvcnQgY2xhc3MgSWd4UGFnaW5hdG9yTW9kdWxlIHsgfVxuIl19