@catull/igniteui-angular
Version:
Ignite UI for Angular is a dependency-free Angular toolkit for building modern web apps
338 lines • 31 kB
JavaScript
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> of </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