UNPKG

@stratio/egeo

Version:
380 lines 30.9 kB
/** * @fileoverview added by tsickle * Generated from: lib/st-pagination/st-pagination.component.ts * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ /* * © 2017 Stratio Big Data Inc., Sucursal en España. * * This software is licensed under the Apache License, Version 2.0. * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the terms of the License for more details. * * SPDX-License-Identifier: Apache-2.0. */ import { ChangeDetectionStrategy, ChangeDetectorRef, Component, EventEmitter, Input, Output, ElementRef } from '@angular/core'; /** * \@description {Component} [Table] * * The pagination component has been designed to allow content to be displayed per pages. This informs user about the * number of the current page, the items displayed per page and the total of items. Moreover, when there are a lot of * items, it allows user to customize the number of items displayed per page. * * It is made by two sub-components: * - A range selector, that allows the user provides a dropdown to set how many items he wants to be displayed per page. * - A page navigation control, in order to let the user where he is and where he can go to. * * \@example * * {html} * * ``` * <div class="pagination"> * <st-pagination [total]="items.length" [perPage]="perPage" [currentPage]="page" [id]="'pagination-demo'" * (change)="onChangePage($event)"> * </st-pagination> * </div> * ``` * */ var StPaginationComponent = /** @class */ (function () { function StPaginationComponent(_cd, _paginationElement) { this._cd = _cd; this._paginationElement = _paginationElement; /** * \@Input {number} [perPage=20] The maximum number of items displayed per page */ this.perPage = 20; /** * \@Input {PaginateTexts} [label={element: 'Rows', perPage: 'per page', of: 'of'}] Translated texts displayed at the pagination */ this.label = { element: 'Rows', perPage: 'per page', of: 'of' }; /** * \@Input {PaginateOptions[]} * [perPageOptions=Array( Object( value: 20, showFrom: 0 ),Object( value: 50, showFrom: 50 ), Object( value: 200, showFrom: 200 ))] * List of options displayed at a selector where user can change the number of items displayed per page */ this.perPageOptions = [ { value: 20, showFrom: 0 }, { value: 50, showFrom: 50 }, { value: 200, showFrom: 200 } ]; /** * \@Output {Paginate} [change=''] Event emitted when user interacts with some of the elements in the pagination. * This sends the new pagination status (current page and items per page) */ this.change = new EventEmitter(); /** * \@Output {PaginateOptions} [changePerPage=''] Event emitted when user interacts with some of the elements in the selector of items displayed per page. * This sends the current items per page. */ this.changePerPage = new EventEmitter(); this.disableNextButton = false; this.disablePrevButton = true; this.items = []; this._currentPage = 1; } Object.defineProperty(StPaginationComponent.prototype, "currentPage", { /** @Input {number} [currentPage=1] Number of the current page */ get: /** * \@Input {number} [currentPage=1] Number of the current page * @return {?} */ function () { return this._currentPage; }, set: /** * @param {?} currentPage * @return {?} */ function (currentPage) { this._currentPage = currentPage; }, enumerable: true, configurable: true }); Object.defineProperty(StPaginationComponent.prototype, "hasOptions", { get: /** * @return {?} */ function () { return this.items && this.items.length > 1; }, enumerable: true, configurable: true }); Object.defineProperty(StPaginationComponent.prototype, "paginationId", { get: /** * @return {?} */ function () { /** @type {?} */ var pagination = this._paginationElement.nativeElement; return pagination.getAttribute('id') !== null ? pagination.id : null; }, enumerable: true, configurable: true }); Object.defineProperty(StPaginationComponent.prototype, "selectId", { get: /** * @return {?} */ function () { return this.paginationId !== null ? this.paginationId + "-select" : null; }, enumerable: true, configurable: true }); Object.defineProperty(StPaginationComponent.prototype, "buttonPrevId", { get: /** * @return {?} */ function () { return this.paginationId !== null ? this.paginationId + "-prev" : null; }, enumerable: true, configurable: true }); Object.defineProperty(StPaginationComponent.prototype, "buttonNextId", { get: /** * @return {?} */ function () { return this.paginationId !== null ? this.paginationId + "-next" : null; }, enumerable: true, configurable: true }); /** * @return {?} */ StPaginationComponent.prototype.ngOnInit = /** * @return {?} */ function () { this.updatePages(false); this.generateItems(); }; /** * @param {?} changes * @return {?} */ StPaginationComponent.prototype.ngOnChanges = /** * @param {?} changes * @return {?} */ function (changes) { if (changes.total && changes.total.previousValue !== changes.total.currentValue && !changes.total.firstChange) { this.generateItems(); this.updatePages(false); } if (changes.currentPage && changes.currentPage.previousValue !== changes.currentPage.currentValue && !changes.currentPage.firstChange) { this._currentPage = changes.currentPage.currentValue; this.updatePages(false); } if (changes.perPage && changes.perPage.previousValue !== changes.perPage.currentValue && !changes.perPage.firstChange) { this.onChangePerPage(changes.perPage.currentValue); } }; /** * @return {?} */ StPaginationComponent.prototype.generateItems = /** * @return {?} */ function () { var _this = this; this.items = []; this.perPageOptions.forEach(this.addPageOption.bind(this)); if (this.items.length) { this.selectedItem = this.items.find((/** * @param {?} item * @return {?} */ function (item) { return item.value === _this.perPage; })) || this.items[0]; } this._cd.markForCheck(); }; /** * @return {?} */ StPaginationComponent.prototype.nextPage = /** * @return {?} */ function () { this.currentPage++; this.updatePages(); }; /** * @return {?} */ StPaginationComponent.prototype.prevPage = /** * @return {?} */ function () { this.currentPage--; this.updatePages(); }; /** * @param {?} perPage * @return {?} */ StPaginationComponent.prototype.onChangePerPage = /** * @param {?} perPage * @return {?} */ function (perPage) { var _this = this; this.currentPage = 1; this.perPage = perPage; this.updatePages(); this.selectedItem = this.items.find((/** * @param {?} item * @return {?} */ function (item) { return item.value === _this.perPage; })); this.changePerPage.emit(this.perPage); }; /** * @private * @param {?} option * @return {?} */ StPaginationComponent.prototype.addPageOption = /** * @private * @param {?} option * @return {?} */ function (option) { if (this.total && (!option.showFrom || option.showFrom <= this.total)) { this.items.push({ label: "" + option.value, value: option.value }); } }; /** * @private * @param {?=} emit * @return {?} */ StPaginationComponent.prototype.updatePages = /** * @private * @param {?=} emit * @return {?} */ function (emit) { if (emit === void 0) { emit = true; } this.lastItem = this.perPage * this._currentPage; if (this.currentPage === 1) { this.firstItem = this._currentPage; this.disablePrevButton = true; } else { this.firstItem = this.perPage * (this._currentPage - 1) + 1; this.disablePrevButton = false; } if (this.lastItem >= this.total) { this.lastItem = this.total; this.disableNextButton = true; } else { this.disableNextButton = false; } if (emit) { this.change.emit({ currentPage: this._currentPage, perPage: this.perPage }); } }; StPaginationComponent.decorators = [ { type: Component, args: [{ selector: 'st-pagination', template: "<!--\n\n \u00A9 2017 Stratio Big Data Inc., Sucursal en Espa\u00F1a.\n\n This software is licensed under the Apache License, Version 2.0.\n This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;\n without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n See the terms of the License for more details.\n\n SPDX-License-Identifier: Apache-2.0.\n\n-->\n<div class=\"st-pagination pagination\">\n <div *ngIf=\"hasOptions\" class=\"label st-pagination__per-page\">\n <p class=\"st-pagination__label\">{{label.element}} {{label.perPage}}</p>\n <st-select class=\"st-pagination__selector\" [options]=\"items\" [selected]=\"selectedItem\" (select)=\"onChangePerPage($event)\" [attr.id]=\"selectId\"></st-select>\n </div>\n\n <div class=\"label current-page-info\">\n <p class=\"st-pagination__label\">{{firstItem}}-{{lastItem}} {{label.of || 'of'}} {{total}}</p>\n\n <div class=\"buttons\">\n <button class=\"button button-toolbar\" [attr.id]=\"buttonPrevId\" [disabled]=\"disablePrevButton\" type=\"button\" (click)=\"prevPage()\">\n <i class=\"icon-arrow2_left\"></i>\n </button>\n <button class=\"button button-toolbar\" [attr.id]=\"buttonNextId\" [disabled]=\"disableNextButton\" type=\"button\" (click)=\"nextPage()\">\n <i class=\"icon-arrow2_right\"></i>\n </button>\n </div>\n </div>\n</div>\n", changeDetection: ChangeDetectionStrategy.OnPush, styles: ["@charset \"UTF-8\";.pagination{display:flex;align-items:center;height:42px}.pagination .label{display:flex;align-items:center}.pagination .label p{margin:0;padding-right:15px}.pagination .current-page-info{flex:1;justify-content:flex-end}.pagination .st-pagination__selector{max-width:93px}.pagination button:first-child{margin:0 5px}"] }] } ]; /** @nocollapse */ StPaginationComponent.ctorParameters = function () { return [ { type: ChangeDetectorRef }, { type: ElementRef } ]; }; StPaginationComponent.propDecorators = { perPage: [{ type: Input }], total: [{ type: Input }], label: [{ type: Input }], perPageOptions: [{ type: Input }], change: [{ type: Output }], changePerPage: [{ type: Output }], currentPage: [{ type: Input }] }; return StPaginationComponent; }()); export { StPaginationComponent }; if (false) { /** * \@Input {number} [perPage=20] The maximum number of items displayed per page * @type {?} */ StPaginationComponent.prototype.perPage; /** * \@Input {number} [total=''] Total of items * @type {?} */ StPaginationComponent.prototype.total; /** * \@Input {PaginateTexts} [label={element: 'Rows', perPage: 'per page', of: 'of'}] Translated texts displayed at the pagination * @type {?} */ StPaginationComponent.prototype.label; /** * \@Input {PaginateOptions[]} * [perPageOptions=Array( Object( value: 20, showFrom: 0 ),Object( value: 50, showFrom: 50 ), Object( value: 200, showFrom: 200 ))] * List of options displayed at a selector where user can change the number of items displayed per page * @type {?} */ StPaginationComponent.prototype.perPageOptions; /** * \@Output {Paginate} [change=''] Event emitted when user interacts with some of the elements in the pagination. * This sends the new pagination status (current page and items per page) * @type {?} */ StPaginationComponent.prototype.change; /** * \@Output {PaginateOptions} [changePerPage=''] Event emitted when user interacts with some of the elements in the selector of items displayed per page. * This sends the current items per page. * @type {?} */ StPaginationComponent.prototype.changePerPage; /** @type {?} */ StPaginationComponent.prototype.disableNextButton; /** @type {?} */ StPaginationComponent.prototype.disablePrevButton; /** @type {?} */ StPaginationComponent.prototype.firstItem; /** @type {?} */ StPaginationComponent.prototype.lastItem; /** @type {?} */ StPaginationComponent.prototype.items; /** @type {?} */ StPaginationComponent.prototype.selectedItem; /** * @type {?} * @private */ StPaginationComponent.prototype._currentPage; /** * @type {?} * @private */ StPaginationComponent.prototype._cd; /** * @type {?} * @private */ StPaginationComponent.prototype._paginationElement; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3QtcGFnaW5hdGlvbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9Ac3RyYXRpby9lZ2VvLyIsInNvdXJjZXMiOlsibGliL3N0LXBhZ2luYXRpb24vc3QtcGFnaW5hdGlvbi5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7O0FBVUEsT0FBTyxFQUNKLHVCQUF1QixFQUN2QixpQkFBaUIsRUFDakIsU0FBUyxFQUNULFlBQVksRUFDWixLQUFLLEVBR0wsTUFBTSxFQUVOLFVBQVUsRUFDWixNQUFNLGVBQWUsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQTRCdkI7SUF1REcsK0JBQW9CLEdBQXNCLEVBQ3RCLGtCQUE4QjtRQUQ5QixRQUFHLEdBQUgsR0FBRyxDQUFtQjtRQUN0Qix1QkFBa0IsR0FBbEIsa0JBQWtCLENBQVk7Ozs7UUFoRHpDLFlBQU8sR0FBVyxFQUFFLENBQUM7Ozs7UUFNckIsVUFBSyxHQUFrQjtZQUM3QixPQUFPLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsRUFBRSxFQUFFLElBQUk7U0FDaEQsQ0FBQzs7Ozs7O1FBTU8sbUJBQWMsR0FBc0I7WUFDMUMsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsR0FBRyxFQUFFO1NBQ3hGLENBQUM7Ozs7O1FBS1EsV0FBTSxHQUEyQixJQUFJLFlBQVksRUFBWSxDQUFDOzs7OztRQUs5RCxrQkFBYSxHQUF5QixJQUFJLFlBQVksRUFBVSxDQUFDO1FBWXBFLHNCQUFpQixHQUFZLEtBQUssQ0FBQztRQUNuQyxzQkFBaUIsR0FBWSxJQUFJLENBQUM7UUFHbEMsVUFBSyxHQUF5QixFQUFFLENBQUM7UUFHaEMsaUJBQVksR0FBVyxDQUFD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RUFBRSxJQUFJLENBQUMsT0FBTzthQUN2QixDQUFDLENBQUM7U0FDTDtJQUNKLENBQUM7O2dCQWpLSCxTQUFTLFNBQUM7b0JBQ1IsUUFBUSxFQUFFLGVBQWU7b0JBQ3pCLHc4Q0FBNkM7b0JBRTdDLGVBQWUsRUFBRSx1QkFBdUIsQ0FBQyxNQUFNOztpQkFDakQ7Ozs7Z0JBMUNFLGlCQUFpQjtnQkFRakIsVUFBVTs7OzBCQXFDVCxLQUFLO3dCQUdMLEtBQUs7d0JBR0wsS0FBSztpQ0FRTCxLQUFLO3lCQU9MLE1BQU07Z0NBS04sTUFBTTs4QkFHTixLQUFLOztJQTZIVCw0QkFBQztDQUFBLEFBbEtELElBa0tDO1NBNUpZLHFCQUFxQjs7Ozs7O0lBRS9CLHdDQUE4Qjs7Ozs7SUFHOUIsc0NBQXVCOzs7OztJQUd2QixzQ0FFRTs7Ozs7OztJQU1GLCtDQUVFOzs7Ozs7SUFLRix1Q0FBd0U7Ozs7OztJQUt4RSw4Q0FBMkU7O0lBWTNFLGtEQUEwQzs7SUFDMUMsa0RBQXlDOztJQUN6QywwQ0FBeUI7O0lBQ3pCLHlDQUF3Qjs7SUFDeEIsc0NBQXdDOztJQUN4Qyw2Q0FBd0M7Ozs7O0lBRXhDLDZDQUFpQzs7Ozs7SUFFckIsb0NBQThCOzs7OztJQUM5QixtREFBc0MiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogwqkgMjAxNyBTdHJhdGlvIEJpZyBEYXRhIEluYy4sIFN1Y3Vyc2FsIGVuIEVzcGHDsWEuXG4gKlxuICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wLlxuICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTtcbiAqIHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuXG4gKiBTZWUgdGhlIHRlcm1zIG9mIHRoZSBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjAuXG4gKi9cbmltcG9ydCB7XG4gICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgIENoYW5nZURldGVjdG9yUmVmLFxuICAgQ29tcG9uZW50LFxuICAgRXZlbnRFbWl0dGVyLFxuICAgSW5wdXQsXG4gICBPbkNoYW5nZXMsXG4gICBPbkluaXQsXG4gICBPdXRwdXQsXG4gICBTaW1wbGVDaGFuZ2VzLFxuICAgRWxlbWVudFJlZlxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFN0RHJvcERvd25NZW51SXRlbSB9IGZyb20gJy4uL3N0LWRyb3Bkb3duLW1lbnUvc3QtZHJvcGRvd24tbWVudS5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgUGFnaW5hdGUsIFBhZ2luYXRlT3B0aW9ucywgUGFnaW5hdGVUZXh0cyB9IGZyb20gJy4vc3QtcGFnaW5hdGlvbi5pbnRlcmZhY2UnO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiB7Q29tcG9uZW50fSBbVGFibGVdXG4gKlxuICogVGhlIHBhZ2luYXRpb24gY29tcG9uZW50IGhhcyBiZWVuIGRlc2lnbmVkIHRvIGFsbG93IGNvbnRlbnQgdG8gYmUgZGlzcGxheWVkIHBlciBwYWdlcy4gVGhpcyBpbmZvcm1zIHVzZXIgYWJvdXQgdGhlXG4gKiBudW1iZXIgb2YgdGhlIGN1cnJlbnQgcGFnZSwgdGhlIGl0ZW1zIGRpc3BsYXllZCBwZXIgcGFnZSBhbmQgdGhlIHRvdGFsIG9mIGl0ZW1zLiBNb3Jlb3Zlciwgd2hlbiB0aGVyZSBhcmUgYSBsb3Qgb2ZcbiAqIGl0ZW1zLCBpdCBhbGxvd3MgdXNlciB0byBjdXN0b21pemUgdGhlIG51bWJlciBvZiBpdGVtcyBkaXNwbGF5ZWQgcGVyIHBhZ2UuXG4gKlxuICogSXQgaXMgbWFkZSBieSB0d28gc3ViLWNvbXBvbmVudHM6XG4gKiAtIEEgcmFuZ2Ugc2VsZWN0b3IsIHRoYXQgYWxsb3dzIHRoZSB1c2VyIHByb3ZpZGVzIGEgZHJvcGRvd24gdG8gc2V0IGhvdyBtYW55IGl0ZW1zIGhlIHdhbnRzIHRvIGJlIGRpc3BsYXllZCBwZXIgcGFnZS5cbiAqIC0gQSBwYWdlIG5hdmlnYXRpb24gY29udHJvbCwgaW4gb3JkZXIgdG8gbGV0IHRoZSB1c2VyIHdoZXJlIGhlIGlzIGFuZCB3aGVyZSBoZSBjYW4gZ28gdG8uXG4gKlxuICogQGV4YW1wbGVcbiAqXG4gKiB7aHRtbH1cbiAqXG4gKiBgYGBcbiAqIDxkaXYgY2xhc3M9XCJwYWdpbmF0aW9uXCI+XG4gKiAgICAgPHN0LXBhZ2luYXRpb24gW3RvdGFsXT1cIml0ZW1zLmxlbmd0aFwiIFtwZXJQYWdlXT1cInBlclBhZ2VcIiBbY3VycmVudFBhZ2VdPVwicGFnZVwiIFtpZF09XCIncGFnaW5hdGlvbi1kZW1vJ1wiXG4gKiAgICAgKGNoYW5nZSk9XCJvbkNoYW5nZVBhZ2UoJGV2ZW50KVwiPlxuICogICAgIDwvc3QtcGFnaW5hdGlvbj5cbiAqICAgICA8L2Rpdj5cbiAqIGBgYFxuICpcbiAqL1xuQENvbXBvbmVudCh7XG4gICBzZWxlY3RvcjogJ3N0LXBhZ2luYXRpb24nLFxuICAgdGVtcGxhdGVVcmw6ICcuL3N0LXBhZ2luYXRpb24uY29tcG9uZW50Lmh0bWwnLFxuICAgc3R5bGVVcmxzOiBbJy4vc3QtcGFnaW5hdGlvbi5jb21wb25lbnQuc2NzcyddLFxuICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2hcbn0pXG5leHBvcnQgY2xhc3MgU3RQYWdpbmF0aW9uQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMge1xuICAgLyoqIEBJbnB1dCB7bnVtYmVyfSBbcGVyUGFnZT0yMF0gVGhlIG1heGltdW0gbnVtYmVyIG9mIGl0ZW1zIGRpc3BsYXllZCBwZXIgcGFnZSAqL1xuICAgQElucHV0KCkgcGVyUGFnZTogbnVtYmVyID0gMjA7XG5cbiAgIC8qKiBASW5wdXQge251bWJlcn0gW3RvdGFsPScnXSBUb3RhbCBvZiBpdGVtcyAqL1xuICAgQElucHV0KCkgdG90YWw6IG51bWJlcjtcblxuICAgLyoqIEBJbnB1dCB7UGFnaW5hdGVUZXh0c30gW2xhYmVsPXtlbGVtZW50OiAnUm93cycsIHBlclBhZ2U6ICdwZXIgcGFnZScsIG9mOiAnb2YnfV0gVHJhbnNsYXRlZCB0ZXh0cyBkaXNwbGF5ZWQgYXQgdGhlIHBhZ2luYXRpb24gKi9cbiAgIEBJbnB1dCgpIGxhYmVsOiBQYWdpbmF0ZVRleHRzID0ge1xuICAgICAgZWxlbWVudDogJ1Jvd3MnLCBwZXJQYWdlOiAncGVyIHBhZ2UnLCBvZjogJ29mJ1xuICAgfTtcblxuICAgLyoqIEBJbnB1dCB7UGFnaW5hdGVPcHRpb25zW119XG4gICAgKiBbcGVyUGFnZU9wdGlvbnM9QXJyYXkoIE9iamVjdCggdmFsdWU6IDIwLCBzaG93RnJvbTogMCApLE9iamVjdCggdmFsdWU6IDUwLCBzaG93RnJvbTogNTAgKSwgT2JqZWN0KCB2YWx1ZTogMjAwLCBzaG93RnJvbTogMjAwICkpXVxuICAgICogIExpc3Qgb2Ygb3B0aW9ucyBkaXNwbGF5ZWQgYXQgYSBzZWxlY3RvciB3aGVyZSB1c2VyIGNhbiBjaGFuZ2UgdGhlIG51bWJlciBvZiBpdGVtcyBkaXNwbGF5ZWQgcGVyIHBhZ2VcbiAgICAqL1xuICAgQElucHV0KCkgcGVyUGFnZU9wdGlvbnM6IFBhZ2luYXRlT3B0aW9uc1tdID0gW1xuICAgICAgeyB2YWx1ZTogMjAsIHNob3dGcm9tOiAwIH0sIHsgdmFsdWU6IDUwLCBzaG93RnJvbTogNTAgfSwgeyB2YWx1ZTogMjAwLCBzaG93RnJvbTogMjAwIH1cbiAgIF07XG5cbiAgIC8qKiBAT3V0cHV0IHtQYWdpbmF0ZX0gW2NoYW5nZT0nJ10gRXZlbnQgZW1pdHRlZCB3aGVuIHVzZXIgaW50ZXJhY3RzIHdpdGggc29tZSBvZiB0aGUgZWxlbWVudHMgaW4gdGhlIHBhZ2luYXRpb24uXG4gICAgKiAgVGhpcyBzZW5kcyB0aGUgbmV3IHBhZ2luYXRpb24gc3RhdHVzIChjdXJyZW50IHBhZ2UgYW5kIGl0ZW1zIHBlciBwYWdlKVxuICAgICovXG4gICBAT3V0cHV0KCkgY2hhbmdlOiBFdmVudEVtaXR0ZXI8UGFnaW5hdGU+ID0gbmV3IEV2ZW50RW1pdHRlcjxQYWdpbmF0ZT4oKTtcblxuICAgLyoqIEBPdXRwdXQge1BhZ2luYXRlT3B0aW9uc30gW2NoYW5nZVBlclBhZ2U9JyddICBFdmVudCBlbWl0dGVkIHdoZW4gdXNlciBpbnRlcmFjdHMgd2l0aCBzb21lIG9mIHRoZSBlbGVtZW50cyBpbiB0aGUgc2VsZWN0b3Igb2YgaXRlbXMgZGlzcGxheWVkIHBlciBwYWdlLlxuICAgICogVGhpcyBzZW5kcyB0aGUgY3VycmVudCBpdGVtcyBwZXIgcGFnZS5cbiAgICAqL1xuICAgQE91dHB1dCgpIGNoYW5nZVBlclBhZ2U6IEV2ZW50RW1pdHRlcjxudW1iZXI+ID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KCk7XG5cbiAgIC8qKiBASW5wdXQge251bWJlcn0gW2N1cnJlbnRQYWdlPTFdIE51bWJlciBvZiB0aGUgY3VycmVudCBwYWdlICovXG4gICBASW5wdXQoKVxuICAgZ2V0IGN1cnJlbnRQYWdlKCk6IG51bWJlciB7XG4gICAgICByZXR1cm4gdGhpcy5fY3VycmVudFBhZ2U7XG4gICB9XG5cbiAgIHNldCBjdXJyZW50UGFnZShjdXJyZW50UGFnZTogbnVtYmVyKSB7XG4gICAgICB0aGlzLl9jdXJyZW50UGFnZSA9IGN1cnJlbnRQYWdlO1xuICAgfVxuXG4gICBwdWJsaWMgZGlzYWJsZU5leHRCdXR0b246IGJvb2xlYW4gPSBmYWxzZTtcbiAgIHB1YmxpYyBkaXNhYmxlUHJldkJ1dHRvbjogYm9vbGVhbiA9IHRydWU7XG4gICBwdWJsaWMgZmlyc3RJdGVtOiBudW1iZXI7XG4gICBwdWJsaWMgbGFzdEl0ZW06IG51bWJlcjtcbiAgIHB1YmxpYyBpdGVtczogU3REcm9wRG93bk1lbnVJdGVtW10gPSBbXTtcbiAgIHB1YmxpYyBzZWxlY3RlZEl0ZW06IFN0RHJvcERvd25NZW51SXRlbTtcblxuICAgcHJpdmF0ZSBfY3VycmVudFBhZ2U6IG51bWJlciA9IDE7XG5cbiAgIGNvbnN0cnVjdG9yKHByaXZhdGUgX2NkOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICAgICAgICAgICAgIHByaXZhdGUgX3BhZ2luYXRpb25FbGVtZW50OiBFbGVtZW50UmVmKSB7XG4gICB9XG5cbiAgIGdldCBoYXNPcHRpb25zKCk6IGJvb2xlYW4ge1xuICAgICAgcmV0dXJuIHRoaXMuaXRlbXMgJiYgdGhpcy5pdGVtcy5sZW5ndGggPiAxO1xuICAgfVxuXG4gICBnZXQgcGFnaW5hdGlvbklkKCk6IHN0cmluZyB8IG51bGwge1xuICAgICAgY29uc3QgcGFnaW5hdGlvbjogSFRNTEVsZW1lbnQgPSB0aGlzLl9wYWdpbmF0aW9uRWxlbWVudC5uYXRpdmVFbGVtZW50O1xuICAgICAgcmV0dXJuIHBhZ2luYXRpb24uZ2V0QXR0cmlidXRlKCdpZCcpICE9PSBudWxsID8gcGFnaW5hdGlvbi5pZCA6IG51bGw7XG4gICB9XG5cbiAgIGdldCBzZWxlY3RJZCgpOiBzdHJpbmcge1xuICAgICAgcmV0dXJuIHRoaXMucGFnaW5hdGlvbklkICE9PSBudWxsID8gYCR7dGhpcy5wYWdpbmF0aW9uSWR9LXNlbGVjdGAgOiBudWxsO1xuICAgfVxuXG4gICBnZXQgYnV0dG9uUHJldklkKCk6IHN0cmluZyB7XG4gICAgICByZXR1cm4gdGhpcy5wYWdpbmF0aW9uSWQgIT09IG51bGwgPyBgJHt0aGlzLnBhZ2luYXRpb25JZH0tcHJldmAgOiBudWxsO1xuICAgfVxuXG4gICBnZXQgYnV0dG9uTmV4dElkKCk6IHN0cmluZyB7XG4gICAgICByZXR1cm4gdGhpcy5wYWdpbmF0aW9uSWQgIT09IG51bGwgPyBgJHt0aGlzLnBhZ2luYXRpb25JZH0tbmV4dGAgOiBudWxsO1xuICAgfVxuXG4gICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAgIHRoaXMudXBkYXRlUGFnZXMoZmFsc2UpO1xuICAgICAgdGhpcy5nZW5lcmF0ZUl0ZW1zKCk7XG4gICB9XG5cbiAgIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICAgIGlmIChjaGFuZ2VzLnRvdGFsICYmIGNoYW5nZXMudG90YWwucHJldmlvdXNWYWx1ZSAhPT0gY2hhbmdlcy50b3RhbC5jdXJyZW50VmFsdWUgJiYgIWNoYW5nZXMudG90YWwuZmlyc3RDaGFuZ2UpIHtcbiAgICAgICAgIHRoaXMuZ2VuZXJhdGVJdGVtcygpO1xuICAgICAgICAgdGhpcy51cGRhdGVQYWdlcyhmYWxzZSk7XG4gICAgICB9XG4gICAgICBpZiAoY2hhbmdlcy5jdXJyZW50UGFnZSAmJiBjaGFuZ2VzLmN1cnJlbnRQYWdlLnByZXZpb3VzVmFsdWUgIT09IGNoYW5nZXMuY3VycmVudFBhZ2UuY3VycmVudFZhbHVlICYmICFjaGFuZ2VzLmN1cnJlbnRQYWdlLmZpcnN0Q2hhbmdlKSB7XG4gICAgICAgICB0aGlzLl9jdXJyZW50UGFnZSA9IGNoYW5nZXMuY3VycmVudFBhZ2UuY3VycmVudFZhbHVlO1xuICAgICAgICAgdGhpcy51cGRhdGVQYWdlcyhmYWxzZSk7XG4gICAgICB9XG4gICAgICBpZiAoY2hhbmdlcy5wZXJQYWdlICYmIGNoYW5nZXMucGVyUGFnZS5wcmV2aW91c1ZhbHVlICE9PSBjaGFuZ2VzLnBlclBhZ2UuY3VycmVudFZhbHVlICYmICFjaGFuZ2VzLnBlclBhZ2UuZmlyc3RDaGFuZ2UpIHtcbiAgICAgICAgIHRoaXMub25DaGFuZ2VQZXJQYWdlKGNoYW5nZXMucGVyUGFnZS5jdXJyZW50VmFsdWUpO1xuICAgICAgfVxuICAgfVxuXG4gICBnZW5lcmF0ZUl0ZW1zKCk6IHZvaWQge1xuICAgICAgdGhpcy5pdGVtcyA9IFtdO1xuICAgICAgdGhpcy5wZXJQYWdlT3B0aW9ucy5mb3JFYWNoKHRoaXMuYWRkUGFnZU9wdGlvbi5iaW5kKHRoaXMpKTtcblxuICAgICAgaWYgKHRoaXMuaXRlbXMubGVuZ3RoKSB7XG4gICAgICAgICB0aGlzLnNlbGVjdGVkSXRlbSA9IHRoaXMuaXRlbXMuZmluZChpdGVtID0+IGl0ZW0udmFsdWUgPT09IHRoaXMucGVyUGFnZSkgfHwgdGhpcy5pdGVtc1swXTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5fY2QubWFya0ZvckNoZWNrKCk7XG4gICB9XG5cbiAgIG5leHRQYWdlKCk6IHZvaWQge1xuICAgICAgdGhpcy5jdXJyZW50UGFnZSsrO1xuICAgICAgdGhpcy51cGRhdGVQYWdlcygpO1xuICAgfVxuXG4gICBwcmV2UGFnZSgpOiB2b2lkIHtcbiAgICAgIHRoaXMuY3VycmVudFBhZ2UtLTtcbiAgICAgIHRoaXMudXBkYXRlUGFnZXMoKTtcbiAgIH1cblxuICAgb25DaGFuZ2VQZXJQYWdlKHBlclBhZ2U6IG51bWJlcik6IHZvaWQge1xuICAgICAgdGhpcy5jdXJyZW50UGFnZSA9IDE7XG4gICAgICB0aGlzLnBlclBhZ2UgPSBwZXJQYWdlO1xuICAgICAgdGhpcy51cGRhdGVQYWdlcygpO1xuICAgICAgdGhpcy5zZWxlY3RlZEl0ZW0gPSB0aGlzLml0ZW1zLmZpbmQoaXRlbSA9PiBpdGVtLnZhbHVlID09PSB0aGlzLnBlclBhZ2UpO1xuICAgICAgdGhpcy5jaGFuZ2VQZXJQYWdlLmVtaXQodGhpcy5wZXJQYWdlKTtcbiAgIH1cblxuICAgcHJpdmF0ZSBhZGRQYWdlT3B0aW9uKG9wdGlvbjogUGFnaW5hdGVPcHRpb25zKTogdm9pZCB7XG4gICAgICBpZiAodGhpcy50b3RhbCAmJiAoIW9wdGlvbi5zaG93RnJvbSB8fCBvcHRpb24uc2hvd0Zyb20gPD0gdGhpcy50b3RhbCkpIHtcbiAgICAgICAgIHRoaXMuaXRlbXMucHVzaCh7XG4gICAgICAgICAgICBsYWJlbDogYCR7b3B0aW9uLnZhbHVlfWAsXG4gICAgICAgICAgICB2YWx1ZTogb3B0aW9uLnZhbHVlXG4gICAgICAgICB9KTtcbiAgICAgIH1cbiAgIH1cblxuICAgcHJpdmF0ZSB1cGRhdGVQYWdlcyhlbWl0OiBib29sZWFuID0gdHJ1ZSk6IHZvaWQge1xuICAgICAgdGhpcy5sYXN0SXRlbSA9IHRoaXMucGVyUGFnZSAqIHRoaXMuX2N1cnJlbnRQYWdlO1xuXG4gICAgICBpZiAodGhpcy5jdXJyZW50UGFnZSA9PT0gMSkge1xuICAgICAgICAgdGhpcy5maXJzdEl0ZW0gPSB0aGlzLl9jdXJyZW50UGFnZTtcbiAgICAgICAgIHRoaXMuZGlzYWJsZVByZXZCdXR0b24gPSB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgIHRoaXMuZmlyc3RJdGVtID0gdGhpcy5wZXJQYWdlICogKHRoaXMuX2N1cnJlbnRQYWdlIC0gMSkgKyAxO1xuICAgICAgICAgdGhpcy5kaXNhYmxlUHJldkJ1dHRvbiA9IGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5sYXN0SXRlbSA+PSB0aGlzLnRvdGFsKSB7XG4gICAgICAgICB0aGlzLmxhc3RJdGVtID0gdGhpcy50b3RhbDtcbiAgICAgICAgIHRoaXMuZGlzYWJsZU5leHRCdXR0b24gPSB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgIHRoaXMuZGlzYWJsZU5leHRCdXR0b24gPSBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGVtaXQpIHtcbiAgICAgICAgIHRoaXMuY2hhbmdlLmVtaXQoe1xuICAgICAgICAgICAgY3VycmVudFBhZ2U6IHRoaXMuX2N1cnJlbnRQYWdlLFxuICAgICAgICAgICAgcGVyUGFnZTogdGhpcy5wZXJQYWdlXG4gICAgICAgICB9KTtcbiAgICAgIH1cbiAgIH1cbn1cbiJdfQ==