UNPKG

@edugouvfr/ngx-dsfr

Version:

NgxDsfr est un portage Angular des éléments d'interface du Système de Design de l'État Français (DSFR).

104 lines 24.4 kB
import { CommonModule } from '@angular/common'; import { Component, EventEmitter, Input, Output, ViewEncapsulation } from '@angular/core'; import { RouterModule } from '@angular/router'; import { DsfrI18nPipe } from '../../shared'; import { EduPageLinkComponent } from './page-link.component'; import { calcPages } from './pagination-calc'; import * as i0 from "@angular/core"; export class DsfrPaginationComponent { constructor() { /* Nombre de pages du composant. */ this.pageCount = 0; /* N° de la page active, démarre à : 1 */ this.currentPage = 1; /** * Affiche uniquement l'icône d'accès à la page précédement si vrai. * * @since 1.6 */ this.previousOnly = false; /* Evènement de sélection d'une page, passe le n° de la page en paramètre. L'événement initial n'est pas propagé. */ this.pageSelect = new EventEmitter(); /** @deprecated(since 1.6) utiliser `pageSelect` à la place. */ this.pageSelectEvent = new EventEmitter(); /* Evènement page précédente. L'événement initial n'est pas propagé. */ this.backSelect = new EventEmitter(); /** * @deprecated (since 1.6) utiliser `backSelect` à la place. */ this.backEvent = new EventEmitter(); /** @internal */ this.intervals = []; } get prevNum() { return Math.max(1, this.currentPage - 1); } get nextNum() { return Math.min(this.currentPage + 1, this.pageCount); } ngOnChanges(changes) { if (changes.currentPage || changes.pageCount) { this.intervals = calcPages(this.currentPage, this.pageCount); } } /** @internal */ onBack() { this.backSelect.emit(); this.backEvent.emit(); } /** @internal */ onPage(pageNum) { this.pageSelect.emit(pageNum); this.pageSelectEvent.emit(pageNum); } /** @internal */ previous() { if (!this.isFirstPage()) this.onPage(this.currentPage - 1); return this.currentPage; } next() { if (!this.isLastPage()) this.onPage(this.currentPage + 1); return this.currentPage; } /** @internal */ isFirstPage() { return this.pageCount === 0 || this.currentPage == 1; } /** @internal */ isLastPage() { return this.pageCount === 0 || this.currentPage == this.pageCount; } /** @internal */ pagesFrom(interval) { const firstPage = interval[0]; const lastPage = interval[1]; const count = lastPage - firstPage + 1; return Array(count) .fill(0) .map((e, i) => i + firstPage); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DsfrPaginationComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: DsfrPaginationComponent, isStandalone: true, selector: "dsfr-pagination", inputs: { pageCount: "pageCount", currentPage: "currentPage", previousOnly: "previousOnly", ariaLabel: "ariaLabel" }, outputs: { pageSelect: "pageSelect", pageSelectEvent: "pageSelectEvent", backSelect: "backSelect", backEvent: "backEvent" }, usesOnChanges: true, ngImport: i0, template: "<!-- Page pr\u00E9c\u00E9dente seulement ---------------------------------------------------------------------------------------->\n\n@if (previousOnly) {\n <nav\n class=\"fr-pagination\"\n [attr.role]=\"'pagination.role' | dsfrI18n\"\n [attr.aria-label]=\"ariaLabel ?? ('pagination.ariaLabel' | dsfrI18n)\">\n <ul class=\"fr-pagination__list\">\n <edu-page-link\n customClass=\"fr-pagination__link--prev fr-pagination__link--lg-label\"\n label=\"Page pr\u00E9c\u00E9dente\"\n (pageSelectEvent)=\"onBack()\"></edu-page-link>\n </ul>\n </nav>\n} @else {\n <!-- Pagination ------------------------------------------------------------------------------------------------------->\n <nav class=\"fr-pagination\" [attr.role]=\"'pagination.role' | dsfrI18n\" [attr.aria-label]=\"ariaLabel\">\n <ul class=\"fr-pagination__list\">\n <!-- Premi\u00E8re page -->\n <li>\n <edu-page-link\n customClass=\"fr-pagination__link--first\"\n [label]=\"'pagination.firstPage' | dsfrI18n\"\n labelCustomClass=\"label-sm\"\n [tooltipMessage]=\"'pagination.firstPage' | dsfrI18n\"\n [num]=\"1\"\n [disabled]=\"isFirstPage()\"\n (pageSelectEvent)=\"onPage($event)\"></edu-page-link>\n </li>\n <!-- Lien vers 'Page pr\u00E9c\u00E9dente' -->\n <li>\n <edu-page-link\n customClass=\"fr-pagination__link--prev fr-pagination__link--lg-label\"\n [label]=\"'pagination.previousPage' | dsfrI18n\"\n labelCustomClass=\"label-sm\"\n [tooltipMessage]=\"'pagination.previousPage' | dsfrI18n\"\n [num]=\"prevNum\"\n [disabled]=\"isFirstPage()\"\n (pageSelectEvent)=\"onPage($event)\"></edu-page-link>\n </li>\n <!-- Toutes les pages -->\n @for (interval of intervals; track interval) {\n @if (interval[0] !== 1) {\n <li>\n <span class=\"fr-pagination__link fr-hidden fr-unhidden-lg\"> \u2026 </span>\n </li>\n }\n @for (pageNum of pagesFrom(interval); track pageNum; let index = $index) {\n <li>\n <edu-page-link\n [num]=\"pageNum\"\n [label]=\"pageNum + ''\"\n [tooltipMessage]=\"'Page ' + pageNum\"\n [active]=\"pageNum === currentPage\"\n (pageSelectEvent)=\"onPage($event)\"></edu-page-link>\n </li>\n }\n }\n <!-- Lien vers 'Page suivante' -->\n <li>\n <edu-page-link\n customClass=\"fr-pagination__link--next fr-pagination__link--lg-label\"\n [label]=\"'pagination.nextPage' | dsfrI18n\"\n labelCustomClass=\"label-sm\"\n [tooltipMessage]=\"'pagination.nextPage' | dsfrI18n\"\n [num]=\"nextNum\"\n [disabled]=\"isLastPage()\"\n (pageSelectEvent)=\"onPage($event)\"></edu-page-link>\n </li>\n <!-- Derni\u00E8re page (non affich\u00E9e sur mobile) -->\n <li>\n <edu-page-link\n customClass=\"fr-pagination__link--last\"\n [label]=\"'pagination.lastPage' | dsfrI18n\"\n labelCustomClass=\"label-sm\"\n [tooltipMessage]=\"'pagination.lastPage' | dsfrI18n\"\n [num]=\"pageCount\"\n [disabled]=\"isLastPage()\"\n (pageSelectEvent)=\"onPage($event)\"></edu-page-link>\n </li>\n </ul>\n </nav>\n}\n", styles: ["@media (max-width: 36em){.fr-pagination__list{justify-content:space-between}}\n/*! media sm et xs */\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: RouterModule }, { kind: "pipe", type: DsfrI18nPipe, name: "dsfrI18n" }, { kind: "component", type: EduPageLinkComponent, selector: "edu-page-link", inputs: ["active", "customClass", "disabled", "label", "labelCustomClass", "num", "tooltipMessage"], outputs: ["pageSelectEvent"] }], encapsulation: i0.ViewEncapsulation.None }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DsfrPaginationComponent, decorators: [{ type: Component, args: [{ selector: 'dsfr-pagination', encapsulation: ViewEncapsulation.None, standalone: true, imports: [CommonModule, RouterModule, DsfrI18nPipe, EduPageLinkComponent], template: "<!-- Page pr\u00E9c\u00E9dente seulement ---------------------------------------------------------------------------------------->\n\n@if (previousOnly) {\n <nav\n class=\"fr-pagination\"\n [attr.role]=\"'pagination.role' | dsfrI18n\"\n [attr.aria-label]=\"ariaLabel ?? ('pagination.ariaLabel' | dsfrI18n)\">\n <ul class=\"fr-pagination__list\">\n <edu-page-link\n customClass=\"fr-pagination__link--prev fr-pagination__link--lg-label\"\n label=\"Page pr\u00E9c\u00E9dente\"\n (pageSelectEvent)=\"onBack()\"></edu-page-link>\n </ul>\n </nav>\n} @else {\n <!-- Pagination ------------------------------------------------------------------------------------------------------->\n <nav class=\"fr-pagination\" [attr.role]=\"'pagination.role' | dsfrI18n\" [attr.aria-label]=\"ariaLabel\">\n <ul class=\"fr-pagination__list\">\n <!-- Premi\u00E8re page -->\n <li>\n <edu-page-link\n customClass=\"fr-pagination__link--first\"\n [label]=\"'pagination.firstPage' | dsfrI18n\"\n labelCustomClass=\"label-sm\"\n [tooltipMessage]=\"'pagination.firstPage' | dsfrI18n\"\n [num]=\"1\"\n [disabled]=\"isFirstPage()\"\n (pageSelectEvent)=\"onPage($event)\"></edu-page-link>\n </li>\n <!-- Lien vers 'Page pr\u00E9c\u00E9dente' -->\n <li>\n <edu-page-link\n customClass=\"fr-pagination__link--prev fr-pagination__link--lg-label\"\n [label]=\"'pagination.previousPage' | dsfrI18n\"\n labelCustomClass=\"label-sm\"\n [tooltipMessage]=\"'pagination.previousPage' | dsfrI18n\"\n [num]=\"prevNum\"\n [disabled]=\"isFirstPage()\"\n (pageSelectEvent)=\"onPage($event)\"></edu-page-link>\n </li>\n <!-- Toutes les pages -->\n @for (interval of intervals; track interval) {\n @if (interval[0] !== 1) {\n <li>\n <span class=\"fr-pagination__link fr-hidden fr-unhidden-lg\"> \u2026 </span>\n </li>\n }\n @for (pageNum of pagesFrom(interval); track pageNum; let index = $index) {\n <li>\n <edu-page-link\n [num]=\"pageNum\"\n [label]=\"pageNum + ''\"\n [tooltipMessage]=\"'Page ' + pageNum\"\n [active]=\"pageNum === currentPage\"\n (pageSelectEvent)=\"onPage($event)\"></edu-page-link>\n </li>\n }\n }\n <!-- Lien vers 'Page suivante' -->\n <li>\n <edu-page-link\n customClass=\"fr-pagination__link--next fr-pagination__link--lg-label\"\n [label]=\"'pagination.nextPage' | dsfrI18n\"\n labelCustomClass=\"label-sm\"\n [tooltipMessage]=\"'pagination.nextPage' | dsfrI18n\"\n [num]=\"nextNum\"\n [disabled]=\"isLastPage()\"\n (pageSelectEvent)=\"onPage($event)\"></edu-page-link>\n </li>\n <!-- Derni\u00E8re page (non affich\u00E9e sur mobile) -->\n <li>\n <edu-page-link\n customClass=\"fr-pagination__link--last\"\n [label]=\"'pagination.lastPage' | dsfrI18n\"\n labelCustomClass=\"label-sm\"\n [tooltipMessage]=\"'pagination.lastPage' | dsfrI18n\"\n [num]=\"pageCount\"\n [disabled]=\"isLastPage()\"\n (pageSelectEvent)=\"onPage($event)\"></edu-page-link>\n </li>\n </ul>\n </nav>\n}\n", styles: ["@media (max-width: 36em){.fr-pagination__list{justify-content:space-between}}\n/*! media sm et xs */\n"] }] }], propDecorators: { pageCount: [{ type: Input }], currentPage: [{ type: Input }], previousOnly: [{ type: Input }], ariaLabel: [{ type: Input }], pageSelect: [{ type: Output }], pageSelectEvent: [{ type: Output }], backSelect: [{ type: Output }], backEvent: [{ type: Output }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFnaW5hdGlvbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtZHNmci1jb21wb25lbnRzL3NyYy9saWIvY29tcG9uZW50cy9wYWdpbmF0aW9uL3BhZ2luYXRpb24uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWRzZnItY29tcG9uZW50cy9zcmMvbGliL2NvbXBvbmVudHMvcGFnaW5hdGlvbi9wYWdpbmF0aW9uLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQWEsTUFBTSxFQUFpQixpQkFBaUIsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNwSCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUM1QyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUM3RCxPQUFPLEVBQVksU0FBUyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7O0FBVXhELE1BQU0sT0FBTyx1QkFBdUI7SUFScEM7UUFTRSxtQ0FBbUM7UUFDMUIsY0FBUyxHQUFHLENBQUMsQ0FBQztRQUV2Qix5Q0FBeUM7UUFDaEMsZ0JBQVcsR0FBRyxDQUFDLENBQUM7UUFFekI7Ozs7V0FJRztRQUNNLGlCQUFZLEdBQUcsS0FBSyxDQUFDO1FBSzlCLG9IQUFvSDtRQUMxRyxlQUFVLEdBQUcsSUFBSSxZQUFZLEVBQVUsQ0FBQztRQUVsRCwrREFBK0Q7UUFDckQsb0JBQWUsR0FBRyxJQUFJLFlBQVksRUFBVSxDQUFDO1FBRXZELHVFQUF1RTtRQUM3RCxlQUFVLEdBQUcsSUFBSSxZQUFZLEVBQVEsQ0FBQztRQUVoRDs7V0FFRztRQUNPLGNBQVMsR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDO1FBRS9DLGdCQUFnQixDQUFDLGNBQVMsR0FBZSxFQUFFLENBQUM7S0EwRDdDO0lBeERDLElBQUksT0FBTztRQUNULE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLFdBQVcsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUMzQyxDQUFDO0lBRUQsSUFBSSxPQUFPO1FBQ1QsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxXQUFXLEdBQUcsQ0FBQyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUN4RCxDQUFDO0lBRUQsV0FBVyxDQUFDLE9BQXNCO1FBQ2hDLElBQUksT0FBTyxDQUFDLFdBQVcsSUFBSSxPQUFPLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDN0MsSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDL0QsQ0FBQztJQUNILENBQUM7SUFFRCxnQkFBZ0I7SUFDaEIsTUFBTTtRQUNKLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDdkIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUN4QixDQUFDO0lBRUQsZ0JBQWdCO0lBQ2hCLE1BQU0sQ0FBQyxPQUFlO1FBQ3BCLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzlCLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3JDLENBQUM7SUFFRCxnQkFBZ0I7SUFDaEIsUUFBUTtRQUNOLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFO1lBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQzNELE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQztJQUMxQixDQUFDO0lBRUQsSUFBSTtRQUNGLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFO1lBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQzFELE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQztJQUMxQixDQUFDO0lBRUQsZ0JBQWdCO0lBQ2hCLFdBQVc7UUFDVCxPQUFPLElBQUksQ0FBQyxTQUFTLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxXQUFXLElBQUksQ0FBQyxDQUFDO0lBQ3ZELENBQUM7SUFFRCxnQkFBZ0I7SUFDaEIsVUFBVTtRQUNSLE9BQU8sSUFBSSxDQUFDLFNBQVMsS0FBSyxDQUFDLElBQUksSUFBSSxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDO0lBQ3BFLENBQUM7SUFFRCxnQkFBZ0I7SUFDaEIsU0FBUyxDQUFDLFFBQWtCO1FBQzFCLE1BQU0sU0FBUyxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM5QixNQUFNLFFBQVEsR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDN0IsTUFBTSxLQUFLLEdBQUcsUUFBUSxHQUFHLFNBQVMsR0FBRyxDQUFDLENBQUM7UUFDdkMsT0FBTyxLQUFLLENBQUMsS0FBSyxDQUFDO2FBQ2hCLElBQUksQ0FBQyxDQUFDLENBQUM7YUFDUCxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsU0FBUyxDQUFDLENBQUM7SUFDbEMsQ0FBQzsrR0F4RlUsdUJBQXVCO21HQUF2Qix1QkFBdUIsbVZDZnBDLDQxR0FtRkEsK0pEdEVZLFlBQVksOEJBQUUsWUFBWSwwQkFBRSxZQUFZLGlEQUFFLG9CQUFvQjs7NEZBRTdELHVCQUF1QjtrQkFSbkMsU0FBUzsrQkFDRSxpQkFBaUIsaUJBR1osaUJBQWlCLENBQUMsSUFBSSxjQUN6QixJQUFJLFdBQ1AsQ0FBQyxZQUFZLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSxvQkFBb0IsQ0FBQzs4QkFJaEUsU0FBUztzQkFBakIsS0FBSztnQkFHRyxXQUFXO3NCQUFuQixLQUFLO2dCQU9HLFlBQVk7c0JBQXBCLEtBQUs7Z0JBR0csU0FBUztzQkFBakIsS0FBSztnQkFHSSxVQUFVO3NCQUFuQixNQUFNO2dCQUdHLGVBQWU7c0JBQXhCLE1BQU07Z0JBR0csVUFBVTtzQkFBbkIsTUFBTTtnQkFLRyxTQUFTO3NCQUFsQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25DaGFuZ2VzLCBPdXRwdXQsIFNpbXBsZUNoYW5nZXMsIFZpZXdFbmNhcHN1bGF0aW9uIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBSb3V0ZXJNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgRHNmckkxOG5QaXBlIH0gZnJvbSAnLi4vLi4vc2hhcmVkJztcbmltcG9ydCB7IEVkdVBhZ2VMaW5rQ29tcG9uZW50IH0gZnJvbSAnLi9wYWdlLWxpbmsuY29tcG9uZW50JztcbmltcG9ydCB7IEludGVydmFsLCBjYWxjUGFnZXMgfSBmcm9tICcuL3BhZ2luYXRpb24tY2FsYyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2RzZnItcGFnaW5hdGlvbicsXG4gIHRlbXBsYXRlVXJsOiAnLi9wYWdpbmF0aW9uLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vcGFnaW5hdGlvbi5jb21wb25lbnQuc2NzcyddLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBSb3V0ZXJNb2R1bGUsIERzZnJJMThuUGlwZSwgRWR1UGFnZUxpbmtDb21wb25lbnRdLFxufSlcbmV4cG9ydCBjbGFzcyBEc2ZyUGFnaW5hdGlvbkNvbXBvbmVudCBpbXBsZW1lbnRzIE9uQ2hhbmdlcyB7XG4gIC8qIE5vbWJyZSBkZSBwYWdlcyBkdSBjb21wb3NhbnQuICovXG4gIEBJbnB1dCgpIHBhZ2VDb3VudCA9IDA7XG5cbiAgLyogTsKwIGRlIGxhIHBhZ2UgYWN0aXZlLCBkw6ltYXJyZSDDoCA6IDEgKi9cbiAgQElucHV0KCkgY3VycmVudFBhZ2UgPSAxO1xuXG4gIC8qKlxuICAgKiBBZmZpY2hlIHVuaXF1ZW1lbnQgbCdpY8O0bmUgZCdhY2PDqHMgw6AgbGEgcGFnZSBwcsOpY8OpZGVtZW50IHNpIHZyYWkuXG4gICAqXG4gICAqIEBzaW5jZSAxLjZcbiAgICovXG4gIEBJbnB1dCgpIHByZXZpb3VzT25seSA9IGZhbHNlO1xuXG4gIC8qKiBBdHRyaWJ1dCBhcmlhTGFiZWwgcGVybWV0dGFudCBkZSBjb250ZXh0dWFsaXNlciBsYSBwYWdpbmF0aW9uICovXG4gIEBJbnB1dCgpIGFyaWFMYWJlbDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIC8qIEV2w6huZW1lbnQgZGUgc8OpbGVjdGlvbiBkJ3VuZSBwYWdlLCBwYXNzZSBsZSBuwrAgZGUgbGEgcGFnZSBlbiBwYXJhbcOodHJlLiBMJ8OpdsOpbmVtZW50IGluaXRpYWwgbidlc3QgcGFzIHByb3BhZ8OpLiAqL1xuICBAT3V0cHV0KCkgcGFnZVNlbGVjdCA9IG5ldyBFdmVudEVtaXR0ZXI8bnVtYmVyPigpO1xuXG4gIC8qKiBAZGVwcmVjYXRlZChzaW5jZSAxLjYpIHV0aWxpc2VyIGBwYWdlU2VsZWN0YCDDoCBsYSBwbGFjZS4gKi9cbiAgQE91dHB1dCgpIHBhZ2VTZWxlY3RFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXI8bnVtYmVyPigpO1xuXG4gIC8qIEV2w6huZW1lbnQgcGFnZSBwcsOpY8OpZGVudGUuIEwnw6l2w6luZW1lbnQgaW5pdGlhbCBuJ2VzdCBwYXMgcHJvcGFnw6kuICovXG4gIEBPdXRwdXQoKSBiYWNrU2VsZWN0ID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCAoc2luY2UgMS42KSB1dGlsaXNlciBgYmFja1NlbGVjdGAgw6AgbGEgcGxhY2UuXG4gICAqL1xuICBAT3V0cHV0KCkgYmFja0V2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuXG4gIC8qKiBAaW50ZXJuYWwgKi8gaW50ZXJ2YWxzOiBJbnRlcnZhbFtdID0gW107XG5cbiAgZ2V0IHByZXZOdW0oKTogbnVtYmVyIHtcbiAgICByZXR1cm4gTWF0aC5tYXgoMSwgdGhpcy5jdXJyZW50UGFnZSAtIDEpO1xuICB9XG5cbiAgZ2V0IG5leHROdW0oKTogbnVtYmVyIHtcbiAgICByZXR1cm4gTWF0aC5taW4odGhpcy5jdXJyZW50UGFnZSArIDEsIHRoaXMucGFnZUNvdW50KTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcbiAgICBpZiAoY2hhbmdlcy5jdXJyZW50UGFnZSB8fCBjaGFuZ2VzLnBhZ2VDb3VudCkge1xuICAgICAgdGhpcy5pbnRlcnZhbHMgPSBjYWxjUGFnZXModGhpcy5jdXJyZW50UGFnZSwgdGhpcy5wYWdlQ291bnQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgb25CYWNrKCkge1xuICAgIHRoaXMuYmFja1NlbGVjdC5lbWl0KCk7XG4gICAgdGhpcy5iYWNrRXZlbnQuZW1pdCgpO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBvblBhZ2UocGFnZU51bTogbnVtYmVyKSB7XG4gICAgdGhpcy5wYWdlU2VsZWN0LmVtaXQocGFnZU51bSk7XG4gICAgdGhpcy5wYWdlU2VsZWN0RXZlbnQuZW1pdChwYWdlTnVtKTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgcHJldmlvdXMoKTogbnVtYmVyIHtcbiAgICBpZiAoIXRoaXMuaXNGaXJzdFBhZ2UoKSkgdGhpcy5vblBhZ2UodGhpcy5jdXJyZW50UGFnZSAtIDEpO1xuICAgIHJldHVybiB0aGlzLmN1cnJlbnRQYWdlO1xuICB9XG5cbiAgbmV4dCgpOiBudW1iZXIge1xuICAgIGlmICghdGhpcy5pc0xhc3RQYWdlKCkpIHRoaXMub25QYWdlKHRoaXMuY3VycmVudFBhZ2UgKyAxKTtcbiAgICByZXR1cm4gdGhpcy5jdXJyZW50UGFnZTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgaXNGaXJzdFBhZ2UoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucGFnZUNvdW50ID09PSAwIHx8IHRoaXMuY3VycmVudFBhZ2UgPT0gMTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgaXNMYXN0UGFnZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5wYWdlQ291bnQgPT09IDAgfHwgdGhpcy5jdXJyZW50UGFnZSA9PSB0aGlzLnBhZ2VDb3VudDtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgcGFnZXNGcm9tKGludGVydmFsOiBJbnRlcnZhbCk6IG51bWJlcltdIHtcbiAgICBjb25zdCBmaXJzdFBhZ2UgPSBpbnRlcnZhbFswXTtcbiAgICBjb25zdCBsYXN0UGFnZSA9IGludGVydmFsWzFdO1xuICAgIGNvbnN0IGNvdW50ID0gbGFzdFBhZ2UgLSBmaXJzdFBhZ2UgKyAxO1xuICAgIHJldHVybiBBcnJheShjb3VudClcbiAgICAgIC5maWxsKDApXG4gICAgICAubWFwKChlLCBpKSA9PiBpICsgZmlyc3RQYWdlKTtcbiAgfVxufVxuIiwiPCEtLSBQYWdlIHByw6ljw6lkZW50ZSBzZXVsZW1lbnQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT5cblxuQGlmIChwcmV2aW91c09ubHkpIHtcbiAgPG5hdlxuICAgIGNsYXNzPVwiZnItcGFnaW5hdGlvblwiXG4gICAgW2F0dHIucm9sZV09XCIncGFnaW5hdGlvbi5yb2xlJyB8IGRzZnJJMThuXCJcbiAgICBbYXR0ci5hcmlhLWxhYmVsXT1cImFyaWFMYWJlbCA/PyAoJ3BhZ2luYXRpb24uYXJpYUxhYmVsJyB8IGRzZnJJMThuKVwiPlxuICAgIDx1bCBjbGFzcz1cImZyLXBhZ2luYXRpb25fX2xpc3RcIj5cbiAgICAgIDxlZHUtcGFnZS1saW5rXG4gICAgICAgIGN1c3RvbUNsYXNzPVwiZnItcGFnaW5hdGlvbl9fbGluay0tcHJldiBmci1wYWdpbmF0aW9uX19saW5rLS1sZy1sYWJlbFwiXG4gICAgICAgIGxhYmVsPVwiUGFnZSBwcsOpY8OpZGVudGVcIlxuICAgICAgICAocGFnZVNlbGVjdEV2ZW50KT1cIm9uQmFjaygpXCI+PC9lZHUtcGFnZS1saW5rPlxuICAgIDwvdWw+XG4gIDwvbmF2PlxufSBAZWxzZSB7XG4gIDwhLS0gUGFnaW5hdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPlxuICA8bmF2IGNsYXNzPVwiZnItcGFnaW5hdGlvblwiIFthdHRyLnJvbGVdPVwiJ3BhZ2luYXRpb24ucm9sZScgfCBkc2ZySTE4blwiIFthdHRyLmFyaWEtbGFiZWxdPVwiYXJpYUxhYmVsXCI+XG4gICAgPHVsIGNsYXNzPVwiZnItcGFnaW5hdGlvbl9fbGlzdFwiPlxuICAgICAgPCEtLSBQcmVtacOocmUgcGFnZSAtLT5cbiAgICAgIDxsaT5cbiAgICAgICAgPGVkdS1wYWdlLWxpbmtcbiAgICAgICAgICBjdXN0b21DbGFzcz1cImZyLXBhZ2luYXRpb25fX2xpbmstLWZpcnN0XCJcbiAgICAgICAgICBbbGFiZWxdPVwiJ3BhZ2luYXRpb24uZmlyc3RQYWdlJyB8IGRzZnJJMThuXCJcbiAgICAgICAgICBsYWJlbEN1c3RvbUNsYXNzPVwibGFiZWwtc21cIlxuICAgICAgICAgIFt0b29sdGlwTWVzc2FnZV09XCIncGFnaW5hdGlvbi5maXJzdFBhZ2UnIHwgZHNmckkxOG5cIlxuICAgICAgICAgIFtudW1dPVwiMVwiXG4gICAgICAgICAgW2Rpc2FibGVkXT1cImlzRmlyc3RQYWdlKClcIlxuICAgICAgICAgIChwYWdlU2VsZWN0RXZlbnQpPVwib25QYWdlKCRldmVudClcIj48L2VkdS1wYWdlLWxpbms+XG4gICAgICA8L2xpPlxuICAgICAgPCEtLSBMaWVuIHZlcnMgJ1BhZ2UgcHLDqWPDqWRlbnRlJyAtLT5cbiAgICAgIDxsaT5cbiAgICAgICAgPGVkdS1wYWdlLWxpbmtcbiAgICAgICAgICBjdXN0b21DbGFzcz1cImZyLXBhZ2luYXRpb25fX2xpbmstLXByZXYgZnItcGFnaW5hdGlvbl9fbGluay0tbGctbGFiZWxcIlxuICAgICAgICAgIFtsYWJlbF09XCIncGFnaW5hdGlvbi5wcmV2aW91c1BhZ2UnIHwgZHNmckkxOG5cIlxuICAgICAgICAgIGxhYmVsQ3VzdG9tQ2xhc3M9XCJsYWJlbC1zbVwiXG4gICAgICAgICAgW3Rvb2x0aXBNZXNzYWdlXT1cIidwYWdpbmF0aW9uLnByZXZpb3VzUGFnZScgfCBkc2ZySTE4blwiXG4gICAgICAgICAgW251bV09XCJwcmV2TnVtXCJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwiaXNGaXJzdFBhZ2UoKVwiXG4gICAgICAgICAgKHBhZ2VTZWxlY3RFdmVudCk9XCJvblBhZ2UoJGV2ZW50KVwiPjwvZWR1LXBhZ2UtbGluaz5cbiAgICAgIDwvbGk+XG4gICAgICA8IS0tIFRvdXRlcyBsZXMgcGFnZXMgLS0+XG4gICAgICBAZm9yIChpbnRlcnZhbCBvZiBpbnRlcnZhbHM7IHRyYWNrIGludGVydmFsKSB7XG4gICAgICAgIEBpZiAoaW50ZXJ2YWxbMF0gIT09IDEpIHtcbiAgICAgICAgICA8bGk+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZyLXBhZ2luYXRpb25fX2xpbmsgZnItaGlkZGVuIGZyLXVuaGlkZGVuLWxnXCI+IOKApiA8L3NwYW4+XG4gICAgICAgICAgPC9saT5cbiAgICAgICAgfVxuICAgICAgICBAZm9yIChwYWdlTnVtIG9mIHBhZ2VzRnJvbShpbnRlcnZhbCk7IHRyYWNrIHBhZ2VOdW07IGxldCBpbmRleCA9ICRpbmRleCkge1xuICAgICAgICAgIDxsaT5cbiAgICAgICAgICAgIDxlZHUtcGFnZS1saW5rXG4gICAgICAgICAgICAgIFtudW1dPVwicGFnZU51bVwiXG4gICAgICAgICAgICAgIFtsYWJlbF09XCJwYWdlTnVtICsgJydcIlxuICAgICAgICAgICAgICBbdG9vbHRpcE1lc3NhZ2VdPVwiJ1BhZ2UgJyArIHBhZ2VOdW1cIlxuICAgICAgICAgICAgICBbYWN0aXZlXT1cInBhZ2VOdW0gPT09IGN1cnJlbnRQYWdlXCJcbiAgICAgICAgICAgICAgKHBhZ2VTZWxlY3RFdmVudCk9XCJvblBhZ2UoJGV2ZW50KVwiPjwvZWR1LXBhZ2UtbGluaz5cbiAgICAgICAgICA8L2xpPlxuICAgICAgICB9XG4gICAgICB9XG4gICAgICA8IS0tIExpZW4gdmVycyAnUGFnZSBzdWl2YW50ZScgLS0+XG4gICAgICA8bGk+XG4gICAgICAgIDxlZHUtcGFnZS1saW5rXG4gICAgICAgICAgY3VzdG9tQ2xhc3M9XCJmci1wYWdpbmF0aW9uX19saW5rLS1uZXh0IGZyLXBhZ2luYXRpb25fX2xpbmstLWxnLWxhYmVsXCJcbiAgICAgICAgICBbbGFiZWxdPVwiJ3BhZ2luYXRpb24ubmV4dFBhZ2UnIHwgZHNmckkxOG5cIlxuICAgICAgICAgIGxhYmVsQ3VzdG9tQ2xhc3M9XCJsYWJlbC1zbVwiXG4gICAgICAgICAgW3Rvb2x0aXBNZXNzYWdlXT1cIidwYWdpbmF0aW9uLm5leHRQYWdlJyB8IGRzZnJJMThuXCJcbiAgICAgICAgICBbbnVtXT1cIm5leHROdW1cIlxuICAgICAgICAgIFtkaXNhYmxlZF09XCJpc0xhc3RQYWdlKClcIlxuICAgICAgICAgIChwYWdlU2VsZWN0RXZlbnQpPVwib25QYWdlKCRldmVudClcIj48L2VkdS1wYWdlLWxpbms+XG4gICAgICA8L2xpPlxuICAgICAgPCEtLSBEZXJuacOocmUgcGFnZSAobm9uIGFmZmljaMOpZSBzdXIgbW9iaWxlKSAtLT5cbiAgICAgIDxsaT5cbiAgICAgICAgPGVkdS1wYWdlLWxpbmtcbiAgICAgICAgICBjdXN0b21DbGFzcz1cImZyLXBhZ2luYXRpb25fX2xpbmstLWxhc3RcIlxuICAgICAgICAgIFtsYWJlbF09XCIncGFnaW5hdGlvbi5sYXN0UGFnZScgfCBkc2ZySTE4blwiXG4gICAgICAgICAgbGFiZWxDdXN0b21DbGFzcz1cImxhYmVsLXNtXCJcbiAgICAgICAgICBbdG9vbHRpcE1lc3NhZ2VdPVwiJ3BhZ2luYXRpb24ubGFzdFBhZ2UnIHwgZHNmckkxOG5cIlxuICAgICAgICAgIFtudW1dPVwicGFnZUNvdW50XCJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwiaXNMYXN0UGFnZSgpXCJcbiAgICAgICAgICAocGFnZVNlbGVjdEV2ZW50KT1cIm9uUGFnZSgkZXZlbnQpXCI+PC9lZHUtcGFnZS1saW5rPlxuICAgICAgPC9saT5cbiAgICA8L3VsPlxuICA8L25hdj5cbn1cbiJdfQ==