UNPKG

@doku-dev/doku-fragment

Version:

A new Angular UI library that moving away from Bootstrap and built from scratch.

158 lines 26.8 kB
import { CommonModule } from '@angular/common'; import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output, ViewEncapsulation, } from '@angular/core'; import * as i0 from "@angular/core"; import * as i1 from "@angular/common"; export class DokuPagination { constructor(cdr) { this.cdr = cdr; /** * Total data items. * @default 0 */ this.totalData = 0; /** * Active page of the pagination. * * The value will be normalized to first or last page if out of total pages range. * * @default 0 */ this.activePage = 0; /** * Total items displayed per page. * @default 5 */ this.itemsPerPage = 5; /** * Listen for page change. */ this.pageChange = new EventEmitter(); /** * Use internally to inform other component for changes. * @internal */ this.triggerChange = new EventEmitter(); this.pages = []; this.firstPage = 0; this.lastPage = 0; this.totalPages = 0; this.totalPagesToShow = 7; } ngOnChanges(changes) { const totalDataChange = changes['totalData']?.previousValue !== changes['totalData']?.currentValue; const activePageChange = changes['activePage']?.previousValue !== changes['activePage']?.currentValue; const itemsPerPageChange = changes['itemsPerPage']?.previousValue !== changes['itemsPerPage']?.currentValue; if (totalDataChange || activePageChange || itemsPerPageChange) { this.calculateAll(); } } /** * Navigate to the specific page. * * If page value is out of total pages range, the action will be ignored. */ navigateToPage(page) { if (page < this.firstPage || page > this.lastPage || this.activePage === page) return; this.activePage = page; this.calculateAll(); this.emitPageChange(); } /** * Go to previous page. * * The action will be ignored if already on the first page. */ goToPreviousPage() { if (this.activePage <= this.firstPage) return; this.activePage -= 1; this.calculateAll(); this.emitPageChange(); } /** * Go to next page. * * The action will be ignored if already on the last page. */ goToNextPage() { if (this.activePage >= this.lastPage) return; this.activePage += 1; this.calculateAll(); this.emitPageChange(); } /** * @internal */ changeItemsPerPage(value) { this.itemsPerPage = value; this.cdr.markForCheck(); this.calculateAll(); this.emitPageChange(); } calculateAll() { this.calculateValues(); this.calculatePages(); this.triggerChange.emit(); } calculateValues() { this.totalPages = Math.ceil(this.totalData / this.itemsPerPage); this.firstPage = this.totalPages >= 1 ? 1 : 0; this.lastPage = this.totalPages >= 1 ? this.totalPages : 0; if (this.totalPages && this.activePage < 1) this.activePage = 1; if (this.totalPages && this.activePage > this.totalPages) this.activePage = this.totalPages; } calculatePages() { const totalPagesToShowInMiddle = this.totalPagesToShow - 4; const offsetPagesToShow = totalPagesToShowInMiddle + 1; const totalPagesToShowOnSide = offsetPagesToShow + 1; // Handle pages if `totalPages` is less than or equal to `totalPagesToShow`, then no need ellipsis. if (this.totalPages <= this.totalPagesToShow) { this.pages = Array.from(Array(this.totalPages)).map((_, idx) => idx + 1); return; } // Handle pages with ellipsis before the last page. if (this.activePage <= offsetPagesToShow) { const numbers = Array.from(Array(totalPagesToShowOnSide)).map((_, idx) => idx + 1); this.pages = [...numbers, '...', this.lastPage]; return; } // Handle pages with ellipsis after the first page. if (this.totalPages - this.activePage < offsetPagesToShow) { const numbers = Array.from(Array(totalPagesToShowOnSide)) .map((_, idx) => this.totalPages - idx) .reverse(); this.pages = [this.firstPage, '...', ...numbers]; return; } // Handle pages with ellipsis after the first page and before the last page. const startNumber = this.activePage - (totalPagesToShowInMiddle - 2); // const endNumber = this.activePage + (totalPagesToShowInMiddle - 2); const numbers = Array.from(Array(totalPagesToShowInMiddle)).map((_, idx) => startNumber + idx); this.pages = [this.firstPage, '...', ...numbers, '...', this.lastPage]; } emitPageChange() { this.pageChange.emit({ activePage: this.activePage, itemsPerPage: this.itemsPerPage, }); } } DokuPagination.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: DokuPagination, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); DokuPagination.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.9", type: DokuPagination, isStandalone: true, selector: "doku-pagination", inputs: { totalData: "totalData", activePage: "activePage", itemsPerPage: "itemsPerPage" }, outputs: { pageChange: "pageChange" }, exportAs: ["dokuPagination"], usesOnChanges: true, ngImport: i0, template: "<div *ngIf=\"totalData\" class=\"d-pagination\">\n <div\n class=\"d-pagination-prev\"\n [class.disabled]=\"activePage <= firstPage\"\n (click)=\"goToPreviousPage()\"\n >\n <ng-template *ngTemplateOutlet=\"iconPrevious\"></ng-template>\n </div>\n\n <div *ngFor=\"let page of pages\">\n <div *ngIf=\"page === '...'; else pageNumber\" class=\"d-pagination-page-ellipsis\">...</div>\n <ng-template #pageNumber>\n <div\n class=\"d-pagination-page-number\"\n [class.active]=\"page === activePage\"\n (click)=\"navigateToPage($any(page))\"\n >\n {{ page }}\n </div>\n </ng-template>\n </div>\n\n <div class=\"d-pagination-next\" [class.disabled]=\"activePage >= lastPage\" (click)=\"goToNextPage()\">\n <ng-template *ngTemplateOutlet=\"iconNext\"></ng-template>\n </div>\n</div>\n\n<ng-template #iconPrevious>\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"42\" height=\"46\" viewBox=\"0 0 42 46\" fill=\"none\">\n <path\n d=\"M23.5252 27.6092L18.8851 22.2096L23.5252 16.81C23.9916 16.2673 23.9916 15.3905 23.5252 14.8478C23.3018 14.5872 22.9984 14.4408 22.6821 14.4408C22.3658 14.4408 22.0624 14.5872 21.839 14.8478L16.3498 21.2354C15.8834 21.7782 15.8834 22.6549 16.3498 23.1977L21.839 29.5853C22.3054 30.128 23.0588 30.128 23.5252 29.5853C23.9796 29.0426 23.9916 28.1519 23.5252 27.6092Z\"\n fill=\"currentColor\"\n />\n </svg>\n</ng-template>\n\n<ng-template #iconNext>\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"42\" height=\"46\" viewBox=\"0 0 42 46\" fill=\"none\">\n <path\n d=\"M18.4748 27.6092L23.1149 22.2096L18.4748 16.81C18.0084 16.2673 18.0084 15.3905 18.4748 14.8478C18.6982 14.5872 19.0016 14.4408 19.3179 14.4408C19.6342 14.4408 19.9376 14.5872 20.161 14.8478L25.6502 21.2354C26.1166 21.7782 26.1166 22.6549 25.6502 23.1977L20.161 29.5853C19.6946 30.128 18.9412 30.128 18.4748 29.5853C18.0204 29.0426 18.0084 28.1519 18.4748 27.6092Z\"\n fill=\"currentColor\"\n />\n </svg>\n</ng-template>\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: DokuPagination, decorators: [{ type: Component, args: [{ selector: 'doku-pagination', exportAs: 'dokuPagination', standalone: true, imports: [CommonModule], encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, template: "<div *ngIf=\"totalData\" class=\"d-pagination\">\n <div\n class=\"d-pagination-prev\"\n [class.disabled]=\"activePage <= firstPage\"\n (click)=\"goToPreviousPage()\"\n >\n <ng-template *ngTemplateOutlet=\"iconPrevious\"></ng-template>\n </div>\n\n <div *ngFor=\"let page of pages\">\n <div *ngIf=\"page === '...'; else pageNumber\" class=\"d-pagination-page-ellipsis\">...</div>\n <ng-template #pageNumber>\n <div\n class=\"d-pagination-page-number\"\n [class.active]=\"page === activePage\"\n (click)=\"navigateToPage($any(page))\"\n >\n {{ page }}\n </div>\n </ng-template>\n </div>\n\n <div class=\"d-pagination-next\" [class.disabled]=\"activePage >= lastPage\" (click)=\"goToNextPage()\">\n <ng-template *ngTemplateOutlet=\"iconNext\"></ng-template>\n </div>\n</div>\n\n<ng-template #iconPrevious>\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"42\" height=\"46\" viewBox=\"0 0 42 46\" fill=\"none\">\n <path\n d=\"M23.5252 27.6092L18.8851 22.2096L23.5252 16.81C23.9916 16.2673 23.9916 15.3905 23.5252 14.8478C23.3018 14.5872 22.9984 14.4408 22.6821 14.4408C22.3658 14.4408 22.0624 14.5872 21.839 14.8478L16.3498 21.2354C15.8834 21.7782 15.8834 22.6549 16.3498 23.1977L21.839 29.5853C22.3054 30.128 23.0588 30.128 23.5252 29.5853C23.9796 29.0426 23.9916 28.1519 23.5252 27.6092Z\"\n fill=\"currentColor\"\n />\n </svg>\n</ng-template>\n\n<ng-template #iconNext>\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"42\" height=\"46\" viewBox=\"0 0 42 46\" fill=\"none\">\n <path\n d=\"M18.4748 27.6092L23.1149 22.2096L18.4748 16.81C18.0084 16.2673 18.0084 15.3905 18.4748 14.8478C18.6982 14.5872 19.0016 14.4408 19.3179 14.4408C19.6342 14.4408 19.9376 14.5872 20.161 14.8478L25.6502 21.2354C26.1166 21.7782 26.1166 22.6549 25.6502 23.1977L20.161 29.5853C19.6946 30.128 18.9412 30.128 18.4748 29.5853C18.0204 29.0426 18.0084 28.1519 18.4748 27.6092Z\"\n fill=\"currentColor\"\n />\n </svg>\n</ng-template>\n" }] }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; }, propDecorators: { totalData: [{ type: Input }], activePage: [{ type: Input }], itemsPerPage: [{ type: Input }], pageChange: [{ type: Output }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFnaW5hdGlvbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kb2t1LWZyYWdtZW50L3NyYy9saWIvcGFnaW5hdGlvbi9wYWdpbmF0aW9uLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Rva3UtZnJhZ21lbnQvc3JjL2xpYi9wYWdpbmF0aW9uL3BhZ2luYXRpb24uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFDTCx1QkFBdUIsRUFFdkIsU0FBUyxFQUNULFlBQVksRUFDWixLQUFLLEVBRUwsTUFBTSxFQUVOLGlCQUFpQixHQUNsQixNQUFNLGVBQWUsQ0FBQzs7O0FBWXZCLE1BQU0sT0FBTyxjQUFjO0lBdUN6QixZQUFvQixHQUFzQjtRQUF0QixRQUFHLEdBQUgsR0FBRyxDQUFtQjtRQXRDMUM7OztXQUdHO1FBQ00sY0FBUyxHQUFHLENBQUMsQ0FBQztRQUV2Qjs7Ozs7O1dBTUc7UUFDTSxlQUFVLEdBQUcsQ0FBQyxDQUFDO1FBRXhCOzs7V0FHRztRQUNNLGlCQUFZLEdBQUcsQ0FBQyxDQUFDO1FBRTFCOztXQUVHO1FBQ08sZUFBVSxHQUFHLElBQUksWUFBWSxFQUF1QixDQUFDO1FBRS9EOzs7V0FHRztRQUNPLGtCQUFhLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUVuQyxVQUFLLEdBQXdCLEVBQUUsQ0FBQztRQUNoQyxjQUFTLEdBQUcsQ0FBQyxDQUFDO1FBQ2QsYUFBUSxHQUFHLENBQUMsQ0FBQztRQUNmLGVBQVUsR0FBRyxDQUFDLENBQUM7UUFDTixxQkFBZ0IsR0FBRyxDQUFDLENBQUM7SUFFTyxDQUFDO0lBRTlDLFdBQVcsQ0FBQyxPQUFzQjtRQUNoQyxNQUFNLGVBQWUsR0FDbkIsT0FBTyxDQUFDLFdBQVcsQ0FBQyxF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dCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBPdXRwdXQsXG4gIFNpbXBsZUNoYW5nZXMsXG4gIFZpZXdFbmNhcHN1bGF0aW9uLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IERva3VQYWdlQ2hhbmdlUHJvcHMgfSBmcm9tICcuL3BhZ2luYXRpb24uaW50ZXJmYWNlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnZG9rdS1wYWdpbmF0aW9uJyxcbiAgZXhwb3J0QXM6ICdkb2t1UGFnaW5hdGlvbicsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGVdLFxuICB0ZW1wbGF0ZVVybDogJy4vcGFnaW5hdGlvbi5jb21wb25lbnQuaHRtbCcsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBEb2t1UGFnaW5hdGlvbiBpbXBsZW1lbnRzIE9uQ2hhbmdlcyB7XG4gIC8qKlxuICAgKiBUb3RhbCBkYXRhIGl0ZW1zLlxuICAgKiBAZGVmYXVsdCAwXG4gICAqL1xuICBASW5wdXQoKSB0b3RhbERhdGEgPSAwO1xuXG4gIC8qKlxuICAgKiBBY3RpdmUgcGFnZSBvZiB0aGUgcGFnaW5hdGlvbi5cbiAgICpcbiAgICogVGhlIHZhbHVlIHdpbGwgYmUgbm9ybWFsaXplZCB0byBmaXJzdCBvciBsYXN0IHBhZ2UgaWYgb3V0IG9mIHRvdGFsIHBhZ2VzIHJhbmdlLlxuICAgKlxuICAgKiBAZGVmYXVsdCAwXG4gICAqL1xuICBASW5wdXQoKSBhY3RpdmVQYWdlID0gMDtcblxuICAvKipcbiAgICogVG90YWwgaXRlbXMgZGlzcGxheWVkIHBlciBwYWdlLlxuICAgKiBAZGVmYXVsdCA1XG4gICAqL1xuICBASW5wdXQoKSBpdGVtc1BlclBhZ2UgPSA1O1xuXG4gIC8qKlxuICAgKiBMaXN0ZW4gZm9yIHBhZ2UgY2hhbmdlLlxuICAgKi9cbiAgQE91dHB1dCgpIHBhZ2VDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPERva3VQYWdlQ2hhbmdlUHJvcHM+KCk7XG5cbiAgLyoqXG4gICAqIFVzZSBpbnRlcm5hbGx5IHRvIGluZm9ybSBvdGhlciBjb21wb25lbnQgZm9yIGNoYW5nZXMuXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHJvdGVjdGVkIHRyaWdnZXJDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgcHJvdGVjdGVkIHBhZ2VzOiAobnVtYmVyIHwgc3RyaW5nKVtdID0gW107XG4gIHByb3RlY3RlZCBmaXJzdFBhZ2UgPSAwO1xuICBwcm90ZWN0ZWQgbGFzdFBhZ2UgPSAwO1xuICBwcml2YXRlIHRvdGFsUGFnZXMgPSAwO1xuICBwcml2YXRlIHJlYWRvbmx5IHRvdGFsUGFnZXNUb1Nob3cgPSA3O1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZikge31cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgY29uc3QgdG90YWxEYXRhQ2hhbmdlID1cbiAgICAgIGNoYW5nZXNbJ3RvdGFsRGF0YSddPy5wcmV2aW91c1ZhbHVlICE9PSBjaGFuZ2VzWyd0b3RhbERhdGEnXT8uY3VycmVudFZhbHVlO1xuICAgIGNvbnN0IGFjdGl2ZVBhZ2VDaGFuZ2UgPVxuICAgICAgY2hhbmdlc1snYWN0aXZlUGFnZSddPy5wcmV2aW91c1ZhbHVlICE9PSBjaGFuZ2VzWydhY3RpdmVQYWdlJ10/LmN1cnJlbnRWYWx1ZTtcbiAgICBjb25zdCBpdGVtc1BlclBhZ2VDaGFuZ2UgPVxuICAgICAgY2hhbmdlc1snaXRlbXNQZXJQYWdlJ10/LnByZXZpb3VzVmFsdWUgIT09IGNoYW5nZXNbJ2l0ZW1zUGVyUGFnZSddPy5jdXJyZW50VmFsdWU7XG5cbiAgICBpZiAodG90YWxEYXRhQ2hhbmdlIHx8IGFjdGl2ZVBhZ2VDaGFuZ2UgfHwgaXRlbXNQZXJQYWdlQ2hhbmdlKSB7XG4gICAgICB0aGlzLmNhbGN1bGF0ZUFsbCgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBOYXZpZ2F0ZSB0byB0aGUgc3BlY2lmaWMgcGFnZS5cbiAgICpcbiAgICogSWYgcGFnZSB2YWx1ZSBpcyBvdXQgb2YgdG90YWwgcGFnZXMgcmFuZ2UsIHRoZSBhY3Rpb24gd2lsbCBiZSBpZ25vcmVkLlxuICAgKi9cbiAgbmF2aWdhdGVUb1BhZ2UocGFnZTogbnVtYmVyKSB7XG4gICAgaWYgKHBhZ2UgPCB0aGlzLmZpcnN0UGFnZSB8fCBwYWdlID4gdGhpcy5sYXN0UGFnZSB8fCB0aGlzLmFjdGl2ZVBhZ2UgPT09IHBhZ2UpIHJldHVybjtcbiAgICB0aGlzLmFjdGl2ZVBhZ2UgPSBwYWdlO1xuICAgIHRoaXMuY2FsY3VsYXRlQWxsKCk7XG4gICAgdGhpcy5lbWl0UGFnZUNoYW5nZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdvIHRvIHByZXZpb3VzIHBhZ2UuXG4gICAqXG4gICAqIFRoZSBhY3Rpb24gd2lsbCBiZSBpZ25vcmVkIGlmIGFscmVhZHkgb24gdGhlIGZpcnN0IHBhZ2UuXG4gICAqL1xuICBnb1RvUHJldmlvdXNQYWdlKCkge1xuICAgIGlmICh0aGlzLmFjdGl2ZVBhZ2UgPD0gdGhpcy5maXJzdFBhZ2UpIHJldHVybjtcbiAgICB0aGlzLmFjdGl2ZVBhZ2UgLT0gMTtcbiAgICB0aGlzLmNhbGN1bGF0ZUFsbCgpO1xuICAgIHRoaXMuZW1pdFBhZ2VDaGFuZ2UoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHbyB0byBuZXh0IHBhZ2UuXG4gICAqXG4gICAqIFRoZSBhY3Rpb24gd2lsbCBiZSBpZ25vcmVkIGlmIGFscmVhZHkgb24gdGhlIGxhc3QgcGFnZS5cbiAgICovXG4gIGdvVG9OZXh0UGFnZSgpIHtcbiAgICBpZiAodGhpcy5hY3RpdmVQYWdlID49IHRoaXMubGFzdFBhZ2UpIHJldHVybjtcbiAgICB0aGlzLmFjdGl2ZVBhZ2UgKz0gMTtcbiAgICB0aGlzLmNhbGN1bGF0ZUFsbCgpO1xuICAgIHRoaXMuZW1pdFBhZ2VDaGFuZ2UoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHByb3RlY3RlZCBjaGFuZ2VJdGVtc1BlclBhZ2UodmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMuaXRlbXNQZXJQYWdlID0gdmFsdWU7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgdGhpcy5jYWxjdWxhdGVBbGwoKTtcbiAgICB0aGlzLmVtaXRQYWdlQ2hhbmdlKCk7XG4gIH1cblxuICBwcml2YXRlIGNhbGN1bGF0ZUFsbCgpIHtcbiAgICB0aGlzLmNhbGN1bGF0ZVZhbHVlcygpO1xuICAgIHRoaXMuY2FsY3VsYXRlUGFnZXMoKTtcbiAgICB0aGlzLnRyaWdnZXJDaGFuZ2UuZW1pdCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBjYWxjdWxhdGVWYWx1ZXMoKSB7XG4gICAgdGhpcy50b3RhbFBhZ2VzID0gTWF0aC5jZWlsKHRoaXMudG90YWxEYXRhIC8gdGhpcy5pdGVtc1BlclBhZ2UpO1xuICAgIHRoaXMuZmlyc3RQYWdlID0gdGhpcy50b3RhbFBhZ2VzID49IDEgPyAxIDogMDtcbiAgICB0aGlzLmxhc3RQYWdlID0gdGhpcy50b3RhbFBhZ2VzID49IDEgPyB0aGlzLnRvdGFsUGFnZXMgOiAwO1xuICAgIGlmICh0aGlzLnRvdGFsUGFnZXMgJiYgdGhpcy5hY3RpdmVQYWdlIDwgMSkgdGhpcy5hY3RpdmVQYWdlID0gMTtcbiAgICBpZiAodGhpcy50b3RhbFBhZ2VzICYmIHRoaXMuYWN0aXZlUGFnZSA+IHRoaXMudG90YWxQYWdlcykgdGhpcy5hY3RpdmVQYWdlID0gdGhpcy50b3RhbFBhZ2VzO1xuICB9XG5cbiAgcHJpdmF0ZSBjYWxjdWxhdGVQYWdlcygpIHtcbiAgICBjb25zdCB0b3RhbFBhZ2VzVG9TaG93SW5NaWRkbGUgPSB0aGlzLnRvdGFsUGFnZXNUb1Nob3cgLSA0O1xuICAgIGNvbnN0IG9mZnNldFBhZ2VzVG9TaG93ID0gdG90YWxQYWdlc1RvU2hvd0luTWlkZGxlICsgMTtcbiAgICBjb25zdCB0b3RhbFBhZ2VzVG9TaG93T25TaWRlID0gb2Zmc2V0UGFnZXNUb1Nob3cgKyAxO1xuXG4gICAgLy8gSGFuZGxlIHBhZ2VzIGlmIGB0b3RhbFBhZ2VzYCBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gYHRvdGFsUGFnZXNUb1Nob3dgLCB0aGVuIG5vIG5lZWQgZWxsaXBzaXMuXG4gICAgaWYgKHRoaXMudG90YWxQYWdlcyA8PSB0aGlzLnRvdGFsUGFnZXNUb1Nob3cpIHtcbiAgICAgIHRoaXMucGFnZXMgPSBBcnJheS5mcm9tKEFycmF5KHRoaXMudG90YWxQYWdlcykpLm1hcCgoXywgaWR4KSA9PiBpZHggKyAxKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgcGFnZXMgd2l0aCBlbGxpcHNpcyBiZWZvcmUgdGhlIGxhc3QgcGFnZS5cbiAgICBpZiAodGhpcy5hY3RpdmVQYWdlIDw9IG9mZnNldFBhZ2VzVG9TaG93KSB7XG4gICAgICBjb25zdCBudW1iZXJzID0gQXJyYXkuZnJvbShBcnJheSh0b3RhbFBhZ2VzVG9TaG93T25TaWRlKSkubWFwKChfLCBpZHgpID0+IGlkeCArIDEpO1xuICAgICAgdGhpcy5wYWdlcyA9IFsuLi5udW1iZXJzLCAnLi4uJywgdGhpcy5sYXN0UGFnZV07XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIHBhZ2VzIHdpdGggZWxsaXBzaXMgYWZ0ZXIgdGhlIGZpcnN0IHBhZ2UuXG4gICAgaWYgKHRoaXMudG90YWxQYWdlcyAtIHRoaXMuYWN0aXZlUGFnZSA8IG9mZnNldFBhZ2VzVG9TaG93KSB7XG4gICAgICBjb25zdCBudW1iZXJzID0gQXJyYXkuZnJvbShBcnJheSh0b3RhbFBhZ2VzVG9TaG93T25TaWRlKSlcbiAgICAgICAgLm1hcCgoXywgaWR4KSA9PiB0aGlzLnRvdGFsUGFnZXMgLSBpZHgpXG4gICAgICAgIC5yZXZlcnNlKCk7XG4gICAgICB0aGlzLnBhZ2VzID0gW3RoaXMuZmlyc3RQYWdlLCAnLi4uJywgLi4ubnVtYmVyc107XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIHBhZ2VzIHdpdGggZWxsaXBzaXMgYWZ0ZXIgdGhlIGZpcnN0IHBhZ2UgYW5kIGJlZm9yZSB0aGUgbGFzdCBwYWdlLlxuICAgIGNvbnN0IHN0YXJ0TnVtYmVyID0gdGhpcy5hY3RpdmVQYWdlIC0gKHRvdGFsUGFnZXNUb1Nob3dJbk1pZGRsZSAtIDIpO1xuICAgIC8vIGNvbnN0IGVuZE51bWJlciA9IHRoaXMuYWN0aXZlUGFnZSArICh0b3RhbFBhZ2VzVG9TaG93SW5NaWRkbGUgLSAyKTtcbiAgICBjb25zdCBudW1iZXJzID0gQXJyYXkuZnJvbShBcnJheSh0b3RhbFBhZ2VzVG9TaG93SW5NaWRkbGUpKS5tYXAoKF8sIGlkeCkgPT4gc3RhcnROdW1iZXIgKyBpZHgpO1xuICAgIHRoaXMucGFnZXMgPSBbdGhpcy5maXJzdFBhZ2UsICcuLi4nLCAuLi5udW1iZXJzLCAnLi4uJywgdGhpcy5sYXN0UGFnZV07XG4gIH1cblxuICBwcml2YXRlIGVtaXRQYWdlQ2hhbmdlKCkge1xuICAgIHRoaXMucGFnZUNoYW5nZS5lbWl0KHtcbiAgICAgIGFjdGl2ZVBhZ2U6IHRoaXMuYWN0aXZlUGFnZSxcbiAgICAgIGl0ZW1zUGVyUGFnZTogdGhpcy5pdGVtc1BlclBhZ2UsXG4gICAgfSk7XG4gIH1cbn1cbiIsIjxkaXYgKm5nSWY9XCJ0b3RhbERhdGFcIiBjbGFzcz1cImQtcGFnaW5hdGlvblwiPlxuICA8ZGl2XG4gICAgY2xhc3M9XCJkLXBhZ2luYXRpb24tcHJldlwiXG4gICAgW2NsYXNzLmRpc2FibGVkXT1cImFjdGl2ZVBhZ2UgPD0gZmlyc3RQYWdlXCJcbiAgICAoY2xpY2spPVwiZ29Ub1ByZXZpb3VzUGFnZSgpXCJcbiAgPlxuICAgIDxuZy10ZW1wbGF0ZSAqbmdUZW1wbGF0ZU91dGxldD1cImljb25QcmV2aW91c1wiPjwvbmctdGVtcGxhdGU+XG4gIDwvZGl2PlxuXG4gIDxkaXYgKm5nRm9yPVwibGV0IHBhZ2Ugb2YgcGFnZXNcIj5cbiAgICA8ZGl2ICpuZ0lmPVwicGFnZSA9PT0gJy4uLic7IGVsc2UgcGFnZU51bWJlclwiIGNsYXNzPVwiZC1wYWdpbmF0aW9uLXBhZ2UtZWxsaXBzaXNcIj4uLi48L2Rpdj5cbiAgICA8bmctdGVtcGxhdGUgI3BhZ2VOdW1iZXI+XG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwiZC1wYWdpbmF0aW9uLXBhZ2UtbnVtYmVyXCJcbiAgICAgICAgW2NsYXNzLmFjdGl2ZV09XCJwYWdlID09PSBhY3RpdmVQYWdlXCJcbiAgICAgICAgKGNsaWNrKT1cIm5hdmlnYXRlVG9QYWdlKCRhbnkocGFnZSkpXCJcbiAgICAgID5cbiAgICAgICAge3sgcGFnZSB9fVxuICAgICAgPC9kaXY+XG4gICAgPC9uZy10ZW1wbGF0ZT5cbiAgPC9kaXY+XG5cbiAgPGRpdiBjbGFzcz1cImQtcGFnaW5hdGlvbi1uZXh0XCIgW2NsYXNzLmRpc2FibGVkXT1cImFjdGl2ZVBhZ2UgPj0gbGFzdFBhZ2VcIiAoY2xpY2spPVwiZ29Ub05leHRQYWdlKClcIj5cbiAgICA8bmctdGVtcGxhdGUgKm5nVGVtcGxhdGVPdXRsZXQ9XCJpY29uTmV4dFwiPjwvbmctdGVtcGxhdGU+XG4gIDwvZGl2PlxuPC9kaXY+XG5cbjxuZy10ZW1wbGF0ZSAjaWNvblByZXZpb3VzPlxuICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjQyXCIgaGVpZ2h0PVwiNDZcIiB2aWV3Qm94PVwiMCAwIDQyIDQ2XCIgZmlsbD1cIm5vbmVcIj5cbiAgICA8cGF0aFxuICAgICAgZD1cIk0yMy41MjUyIDI3LjYwOTJMMTguODg1MSAyMi4yMDk2TDIzLjUyNTIgMTYuODFDMjMuOTkxNiAxNi4yNjczIDIzLjk5MTYgMTUuMzkwNSAyMy41MjUyIDE0Ljg0NzhDMjMuMzAxOCAxNC41ODcyIDIyLjk5ODQgMTQuNDQwOCAyMi42ODIxIDE0LjQ0MDhDMjIuMzY1OCAxNC40NDA4IDIyLjA2MjQgMTQuNTg3MiAyMS44MzkgMTQuODQ3OEwxNi4zNDk4IDIxLjIzNTRDMTUuODgzNCAyMS43NzgyIDE1Ljg4MzQgMjIuNjU0OSAxNi4zNDk4IDIzLjE5NzdMMjEuODM5IDI5LjU4NTNDMjIuMzA1NCAzMC4xMjggMjMuMDU4OCAzMC4xMjggMjMuNTI1MiAyOS41ODUzQzIzLjk3OTYgMjkuMDQyNiAyMy45OTE2IDI4LjE1MTkgMjMuNTI1MiAyNy42MDkyWlwiXG4gICAgICBmaWxsPVwiY3VycmVudENvbG9yXCJcbiAgICAvPlxuICA8L3N2Zz5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjaWNvbk5leHQ+XG4gIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiNDJcIiBoZWlnaHQ9XCI0NlwiIHZpZXdCb3g9XCIwIDAgNDIgNDZcIiBmaWxsPVwibm9uZVwiPlxuICAgIDxwYXRoXG4gICAgICBkPVwiTTE4LjQ3NDggMjcuNjA5MkwyMy4xMTQ5IDIyLjIwOTZMMTguNDc0OCAxNi44MUMxOC4wMDg0IDE2LjI2NzMgMTguMDA4NCAxNS4zOTA1IDE4LjQ3NDggMTQuODQ3OEMxOC42OTgyIDE0LjU4NzIgMTkuMDAxNiAxNC40NDA4IDE5LjMxNzkgMTQuNDQwOEMxOS42MzQyIDE0LjQ0MDggMTkuOTM3NiAxNC41ODcyIDIwLjE2MSAxNC44NDc4TDI1LjY1MDIgMjEuMjM1NEMyNi4xMTY2IDIxLjc3ODIgMjYuMTE2NiAyMi42NTQ5IDI1LjY1MDIgMjMuMTk3N0wyMC4xNjEgMjkuNTg1M0MxOS42OTQ2IDMwLjEyOCAxOC45NDEyIDMwLjEyOCAxOC40NzQ4IDI5LjU4NTNDMTguMDIwNCAyOS4wNDI2IDE4LjAwODQgMjguMTUxOSAxOC40NzQ4IDI3LjYwOTJaXCJcbiAgICAgIGZpbGw9XCJjdXJyZW50Q29sb3JcIlxuICAgIC8+XG4gIDwvc3ZnPlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==