@paddls/ngx-easy-table
Version:
Angular easy table
68 lines • 23.3 kB
JavaScript
import { ChangeDetectionStrategy, Component, EventEmitter, HostListener, Input, Output, ViewChild, } from '@angular/core';
import * as i0 from "@angular/core";
import * as i1 from "@angular/common";
import * as i2 from "../../features/pagination/pagination-controls.directive";
export class PaginationComponent {
constructor() {
this.updateRange = new EventEmitter();
this.ranges = [5, 10, 25, 50, 100];
this.showRange = false;
this.screenReaderPaginationLabel = 'Pagination';
this.screenReaderPageLabel = 'page';
this.screenReaderCurrentLabel = 'You are on page';
this.previousLabel = '';
this.nextLabel = '';
this.directionLinks = true;
}
onClick(targetElement) {
if (this.paginationRange && !this.paginationRange.nativeElement.contains(targetElement)) {
this.showRange = false;
}
}
ngOnChanges(changes) {
const { config } = changes;
if (config && config.currentValue) {
this.selectedLimit = this.config.rows;
}
}
onPageChange(page) {
this.updateRange.emit({
page,
limit: this.selectedLimit,
});
}
changeLimit(limit, callFromAPI) {
if (!callFromAPI) {
this.showRange = !this.showRange;
}
this.selectedLimit = limit;
this.updateRange.emit({
page: 1,
limit,
});
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: PaginationComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: PaginationComponent, selector: "lib-pagination", inputs: { pagination: "pagination", config: "config", id: "id" }, outputs: { updateRange: "updateRange" }, host: { listeners: { "document:click": "onClick($event.target)" } }, viewQueries: [{ propertyName: "paginationDirective", first: true, predicate: ["paginationDirective"], descendants: true, static: true }, { propertyName: "paginationRange", first: true, predicate: ["paginationRange"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div [class.ngx-table__table--dark-pagination-wrapper]=\"config.tableLayout.theme === 'dark'\"\n [style.display]=\"config.paginationEnabled ? '' : 'none'\"\n class=\"ngx-pagination-wrapper\">\n <div class=\"ngx-pagination-steps\">\n <pagination-template #paginationDirective=\"paginationApi\"\n (pageChange)=\"onPageChange($event)\"\n [class.ngx-table__table--dark-pagination]=\"config.tableLayout.theme === 'dark'\"\n [id]=\"id\"\n [maxSize]=\"config.paginationMaxSize || 5\"\n id=\"pagination-controls\">\n <ul [attr.aria-label]=\"screenReaderPaginationLabel\"\n [class.responsive]=\"true\"\n class=\"ngx-pagination\"\n role=\"navigation\">\n <li *ngIf=\"directionLinks\"\n [class.disabled]=\"paginationDirective.isFirstPage()\"\n class=\"pagination-previous\">\n <a (click)=\"paginationDirective.previous()\"\n (keyup.enter)=\"paginationDirective.previous()\"\n *ngIf=\"1 < paginationDirective.getCurrent()\"\n [attr.aria-label]=\"previousLabel + ' ' + screenReaderPageLabel\"\n tabindex=\"0\">\n {{ previousLabel }} <span class=\"show-for-sr\">{{ screenReaderPageLabel }}</span>\n </a>\n <span *ngIf=\"paginationDirective.isFirstPage()\">\n {{ previousLabel }} <span class=\"show-for-sr\">{{ screenReaderPageLabel }}</span>\n </span>\n </li>\n <li class=\"small-screen\">\n {{ paginationDirective.getCurrent() }} / {{ paginationDirective.getLastPage() }}\n </li>\n <li *ngFor=\"let page of paginationDirective.pages\"\n [class.current]=\"paginationDirective.getCurrent() === page.value\"\n [class.ellipsis]=\"page.label === '...'\">\n <a (click)=\"paginationDirective.setCurrent(page.value)\"\n (keyup.enter)=\"paginationDirective.setCurrent(page.value)\"\n *ngIf=\"paginationDirective.getCurrent() !== page.value\"\n tabindex=\"0\">\n <span class=\"show-for-sr\">{{ screenReaderPageLabel }} </span>\n <span>{{ page.label }}</span>\n </a>\n <ng-container *ngIf=\"paginationDirective.getCurrent() === page.value\">\n <span class=\"show-for-sr\">{{ screenReaderCurrentLabel }} </span>\n <span>{{ page.label }}</span>\n </ng-container>\n </li>\n <li *ngIf=\"directionLinks\"\n [class.disabled]=\"paginationDirective.isLastPage()\"\n class=\"pagination-next\">\n <a (click)=\"paginationDirective.next()\"\n (keyup.enter)=\"paginationDirective.next()\"\n *ngIf=\"!paginationDirective.isLastPage()\"\n [attr.aria-label]=\"nextLabel + ' ' + screenReaderPageLabel\"\n tabindex=\"0\">\n {{ nextLabel }} <span class=\"show-for-sr\">{{ screenReaderPageLabel }}</span>\n </a>\n <span *ngIf=\"paginationDirective.isLastPage()\">\n {{ nextLabel }} <span class=\"show-for-sr\">{{ screenReaderPageLabel }}</span>\n </span>\n </li>\n </ul>\n </pagination-template>\n </div>\n <div #paginationRange\n *ngIf=\"config.paginationRangeEnabled\"\n [class.ngx-table__table--dark-pagination-range]=\"config.tableLayout.theme === 'dark'\"\n class=\"ngx-pagination-range\">\n <div class=\"ngx-dropdown ngx-pagination-range-dropdown\"\n id=\"rowAmount\">\n <div class=\"ngx-btn-group\">\n <div (click)=\"showRange = !showRange\"\n class=\"ngx-pagination-range-dropdown-button\">\n {{selectedLimit}} <i class=\"ngx-icon ngx-icon-arrow-down\"></i>\n </div>\n <ul *ngIf=\"showRange\"\n class=\"ngx-menu\">\n <li (click)=\"changeLimit(limit, false)\"\n *ngFor=\"let limit of ranges\"\n [class.ngx-pagination-range--selected]=\"limit === selectedLimit\"\n class=\"ngx-pagination-range-dropdown-button-item\">\n <span>{{limit}}</span>\n </li>\n </ul>\n </div>\n </div>\n </div>\n</div>\n", dependencies: [{ 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: i2.PaginationControlsDirective, selector: "pagination-template,[pagination-template]", inputs: ["id", "maxSize"], outputs: ["pageChange", "pageBoundsCorrection"], exportAs: ["paginationApi"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: PaginationComponent, decorators: [{
type: Component,
args: [{ selector: 'lib-pagination', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div [class.ngx-table__table--dark-pagination-wrapper]=\"config.tableLayout.theme === 'dark'\"\n [style.display]=\"config.paginationEnabled ? '' : 'none'\"\n class=\"ngx-pagination-wrapper\">\n <div class=\"ngx-pagination-steps\">\n <pagination-template #paginationDirective=\"paginationApi\"\n (pageChange)=\"onPageChange($event)\"\n [class.ngx-table__table--dark-pagination]=\"config.tableLayout.theme === 'dark'\"\n [id]=\"id\"\n [maxSize]=\"config.paginationMaxSize || 5\"\n id=\"pagination-controls\">\n <ul [attr.aria-label]=\"screenReaderPaginationLabel\"\n [class.responsive]=\"true\"\n class=\"ngx-pagination\"\n role=\"navigation\">\n <li *ngIf=\"directionLinks\"\n [class.disabled]=\"paginationDirective.isFirstPage()\"\n class=\"pagination-previous\">\n <a (click)=\"paginationDirective.previous()\"\n (keyup.enter)=\"paginationDirective.previous()\"\n *ngIf=\"1 < paginationDirective.getCurrent()\"\n [attr.aria-label]=\"previousLabel + ' ' + screenReaderPageLabel\"\n tabindex=\"0\">\n {{ previousLabel }} <span class=\"show-for-sr\">{{ screenReaderPageLabel }}</span>\n </a>\n <span *ngIf=\"paginationDirective.isFirstPage()\">\n {{ previousLabel }} <span class=\"show-for-sr\">{{ screenReaderPageLabel }}</span>\n </span>\n </li>\n <li class=\"small-screen\">\n {{ paginationDirective.getCurrent() }} / {{ paginationDirective.getLastPage() }}\n </li>\n <li *ngFor=\"let page of paginationDirective.pages\"\n [class.current]=\"paginationDirective.getCurrent() === page.value\"\n [class.ellipsis]=\"page.label === '...'\">\n <a (click)=\"paginationDirective.setCurrent(page.value)\"\n (keyup.enter)=\"paginationDirective.setCurrent(page.value)\"\n *ngIf=\"paginationDirective.getCurrent() !== page.value\"\n tabindex=\"0\">\n <span class=\"show-for-sr\">{{ screenReaderPageLabel }} </span>\n <span>{{ page.label }}</span>\n </a>\n <ng-container *ngIf=\"paginationDirective.getCurrent() === page.value\">\n <span class=\"show-for-sr\">{{ screenReaderCurrentLabel }} </span>\n <span>{{ page.label }}</span>\n </ng-container>\n </li>\n <li *ngIf=\"directionLinks\"\n [class.disabled]=\"paginationDirective.isLastPage()\"\n class=\"pagination-next\">\n <a (click)=\"paginationDirective.next()\"\n (keyup.enter)=\"paginationDirective.next()\"\n *ngIf=\"!paginationDirective.isLastPage()\"\n [attr.aria-label]=\"nextLabel + ' ' + screenReaderPageLabel\"\n tabindex=\"0\">\n {{ nextLabel }} <span class=\"show-for-sr\">{{ screenReaderPageLabel }}</span>\n </a>\n <span *ngIf=\"paginationDirective.isLastPage()\">\n {{ nextLabel }} <span class=\"show-for-sr\">{{ screenReaderPageLabel }}</span>\n </span>\n </li>\n </ul>\n </pagination-template>\n </div>\n <div #paginationRange\n *ngIf=\"config.paginationRangeEnabled\"\n [class.ngx-table__table--dark-pagination-range]=\"config.tableLayout.theme === 'dark'\"\n class=\"ngx-pagination-range\">\n <div class=\"ngx-dropdown ngx-pagination-range-dropdown\"\n id=\"rowAmount\">\n <div class=\"ngx-btn-group\">\n <div (click)=\"showRange = !showRange\"\n class=\"ngx-pagination-range-dropdown-button\">\n {{selectedLimit}} <i class=\"ngx-icon ngx-icon-arrow-down\"></i>\n </div>\n <ul *ngIf=\"showRange\"\n class=\"ngx-menu\">\n <li (click)=\"changeLimit(limit, false)\"\n *ngFor=\"let limit of ranges\"\n [class.ngx-pagination-range--selected]=\"limit === selectedLimit\"\n class=\"ngx-pagination-range-dropdown-button-item\">\n <span>{{limit}}</span>\n </li>\n </ul>\n </div>\n </div>\n </div>\n</div>\n" }]
}], propDecorators: { pagination: [{
type: Input
}], config: [{
type: Input
}], id: [{
type: Input
}], updateRange: [{
type: Output
}], paginationDirective: [{
type: ViewChild,
args: ['paginationDirective', { static: true }]
}], paginationRange: [{
type: ViewChild,
args: ['paginationRange']
}], onClick: [{
type: HostListener,
args: ['document:click', ['$event.target']]
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFnaW5hdGlvbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtZWFzeS10YWJsZS9zcmMvbGliL2NvbXBvbmVudHMvcGFnaW5hdGlvbi9wYWdpbmF0aW9uLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1lYXN5LXRhYmxlL3NyYy9saWIvY29tcG9uZW50cy9wYWdpbmF0aW9uL3BhZ2luYXRpb24uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsWUFBWSxFQUNaLFlBQVksRUFDWixLQUFLLEVBRUwsTUFBTSxFQUVOLFNBQVMsR0FDVixNQUFNLGVBQWUsQ0FBQzs7OztBQWdCdkIsTUFBTSxPQUFPLG1CQUFtQjtJQUxoQztRQWlCa0IsZ0JBQVcsR0FBa0MsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQVF6RSxXQUFNLEdBQWEsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFJeEMsY0FBUyxHQUFHLEtBQUssQ0FBQztRQUVsQixnQ0FBMkIsR0FBRyxZQUFZLENBQUM7UUFFM0MsMEJBQXFCLEdBQUcsTUFBTSxDQUFDO1FBRS9CLDZCQUF3QixHQUFHLGlCQUFpQixDQUFDO1FBRTdDLGtCQUFhLEdBQUcsRUFBRSxDQUFDO1FBRW5CLGNBQVMsR0FBRyxFQUFFLENBQUM7UUFFZixtQkFBYyxHQUFHLElBQUksQ0FBQztLQWlDOUI7SUE5QlEsT0FBTyxDQUFDLGFBQWtCO1FBQy9CLElBQUksSUFBSSxDQUFDLGVBQWUsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsRUFBRTtZQUN2RixJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztTQUN4QjtJQUNILENBQUM7SUFFTSxXQUFXLENBQUMsT0FBc0I7UUFDdkMsTUFBTSxFQUFDLE1BQU0sRUFBQyxHQUFHLE9BQU8sQ0FBQztRQUN6QixJQUFJLE1BQU0sSUFBSSxNQUFNLENBQUMsWUFBWSxFQUFFO1lBQ2pDLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUM7U0FDdkM7SUFDSCxDQUFDO0lBRU0sWUFBWSxDQUFDLElBQVk7UUFDOUIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUM7WUFDcEIsSUFBSTtZQUNKLEtBQUssRUFBRSxJQUFJLENBQUMsYUFBYTtTQUMxQixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU0sV0FBVyxDQUFDLEtBQWEsRUFBRSxXQUFvQjtRQUNwRCxJQUFJLENBQUMsV0FBVyxFQUFFO1lBQ2hCLElBQUksQ0FBQyxTQUFTLEdBQUcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDO1NBQ2xDO1FBQ0QsSUFBSSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUM7UUFDM0IsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUM7WUFDcEIsSUFBSSxFQUFFLENBQUM7WUFDUCxLQUFLO1NBQ04sQ0FBQyxDQUFDO0lBQ0wsQ0FBQzs4R0FwRVUsbUJBQW1CO2tHQUFuQixtQkFBbUIsMGVDMUJoQyx1cUlBdUZBOzsyRkQ3RGEsbUJBQW1CO2tCQUwvQixTQUFTOytCQUNFLGdCQUFnQixtQkFFVCx1QkFBdUIsQ0FBQyxNQUFNOzhCQUt4QyxVQUFVO3NCQURoQixLQUFLO2dCQUlDLE1BQU07c0JBRFosS0FBSztnQkFJQyxFQUFFO3NCQURSLEtBQUs7Z0JBSVUsV0FBVztzQkFEMUIsTUFBTTtnQkFJQSxtQkFBbUI7c0JBRHpCLFNBQVM7dUJBQUMscUJBQXFCLEVBQUUsRUFBQyxNQUFNLEVBQUUsSUFBSSxFQUFDO2dCQUl6QyxlQUFlO3NCQURyQixTQUFTO3VCQUFDLGlCQUFpQjtnQkFzQnJCLE9BQU87c0JBRGIsWUFBWTt1QkFBQyxnQkFBZ0IsRUFBRSxDQUFDLGVBQWUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIEV2ZW50RW1pdHRlcixcbiAgSG9zdExpc3RlbmVyLFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBPdXRwdXQsXG4gIFNpbXBsZUNoYW5nZXMsXG4gIFZpZXdDaGlsZCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb25maWcgfSBmcm9tICcuLi8uLic7XG5pbXBvcnQge1BhZ2luYXRpb25Db250cm9sc0RpcmVjdGl2ZX0gZnJvbSBcIi4uLy4uL2ZlYXR1cmVzL3BhZ2luYXRpb25cIjtcblxuZXhwb3J0IGludGVyZmFjZSBQYWdpbmF0aW9uUmFuZ2Uge1xuXG4gIHBhZ2U6IG51bWJlcjtcblxuICBsaW1pdDogbnVtYmVyO1xufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdsaWItcGFnaW5hdGlvbicsXG4gIHRlbXBsYXRlVXJsOiAnLi9wYWdpbmF0aW9uLmNvbXBvbmVudC5odG1sJyxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIFBhZ2luYXRpb25Db21wb25lbnQgaW1wbGVtZW50cyBPbkNoYW5nZXMge1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBwYWdpbmF0aW9uO1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBjb25maWc6IENvbmZpZztcblxuICBASW5wdXQoKVxuICBwdWJsaWMgaWQ7XG5cbiAgQE91dHB1dCgpXG4gIHB1YmxpYyByZWFkb25seSB1cGRhdGVSYW5nZTogRXZlbnRFbWl0dGVyPFBhZ2luYXRpb25SYW5nZT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgQFZpZXdDaGlsZCgncGFnaW5hdGlvbkRpcmVjdGl2ZScsIHtzdGF0aWM6IHRydWV9KVxuICBwdWJsaWMgcGFnaW5hdGlvbkRpcmVjdGl2ZTogUGFnaW5hdGlvbkNvbnRyb2xzRGlyZWN0aXZlO1xuXG4gIEBWaWV3Q2hpbGQoJ3BhZ2luYXRpb25SYW5nZScpXG4gIHB1YmxpYyBwYWdpbmF0aW9uUmFuZ2U6IHsgbmF0aXZlRWxlbWVudDogeyBjb250YWluczogKGFyZzA6IGFueSkgPT4gYW55OyB9OyB9O1xuXG4gIHB1YmxpYyByYW5nZXM6IG51bWJlcltdID0gWzUsIDEwLCAyNSwgNTAsIDEwMF07XG5cbiAgcHVibGljIHNlbGVjdGVkTGltaXQ6IG51bWJlcjtcblxuICBwdWJsaWMgc2hvd1JhbmdlID0gZmFsc2U7XG5cbiAgcHVibGljIHNjcmVlblJlYWRlclBhZ2luYXRpb25MYWJlbCA9ICdQYWdpbmF0aW9uJztcblxuICBwdWJsaWMgc2NyZWVuUmVhZGVyUGFnZUxhYmVsID0gJ3BhZ2UnO1xuXG4gIHB1YmxpYyBzY3JlZW5SZWFkZXJDdXJyZW50TGFiZWwgPSAnWW91IGFyZSBvbiBwYWdlJztcblxuICBwdWJsaWMgcHJldmlvdXNMYWJlbCA9ICcnO1xuXG4gIHB1YmxpYyBuZXh0TGFiZWwgPSAnJztcblxuICBwdWJsaWMgZGlyZWN0aW9uTGlua3MgPSB0cnVlO1xuXG4gIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OmNsaWNrJywgWyckZXZlbnQudGFyZ2V0J10pXG4gIHB1YmxpYyBvbkNsaWNrKHRhcmdldEVsZW1lbnQ6IGFueSk6IHZvaWQge1xuICAgIGlmICh0aGlzLnBhZ2luYXRpb25SYW5nZSAmJiAhdGhpcy5wYWdpbmF0aW9uUmFuZ2UubmF0aXZlRWxlbWVudC5jb250YWlucyh0YXJnZXRFbGVtZW50KSkge1xuICAgICAgdGhpcy5zaG93UmFuZ2UgPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGNvbnN0IHtjb25maWd9ID0gY2hhbmdlcztcbiAgICBpZiAoY29uZmlnICYmIGNvbmZpZy5jdXJyZW50VmFsdWUpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRMaW1pdCA9IHRoaXMuY29uZmlnLnJvd3M7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIG9uUGFnZUNoYW5nZShwYWdlOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLnVwZGF0ZVJhbmdlLmVtaXQoe1xuICAgICAgcGFnZSxcbiAgICAgIGxpbWl0OiB0aGlzLnNlbGVjdGVkTGltaXQsXG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgY2hhbmdlTGltaXQobGltaXQ6IG51bWJlciwgY2FsbEZyb21BUEk6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBpZiAoIWNhbGxGcm9tQVBJKSB7XG4gICAgICB0aGlzLnNob3dSYW5nZSA9ICF0aGlzLnNob3dSYW5nZTtcbiAgICB9XG4gICAgdGhpcy5zZWxlY3RlZExpbWl0ID0gbGltaXQ7XG4gICAgdGhpcy51cGRhdGVSYW5nZS5lbWl0KHtcbiAgICAgIHBhZ2U6IDEsXG4gICAgICBsaW1pdCxcbiAgICB9KTtcbiAgfVxufVxuIiwiPGRpdiBbY2xhc3Mubmd4LXRhYmxlX190YWJsZS0tZGFyay1wYWdpbmF0aW9uLXdyYXBwZXJdPVwiY29uZmlnLnRhYmxlTGF5b3V0LnRoZW1lID09PSAnZGFyaydcIlxuICAgICBbc3R5bGUuZGlzcGxheV09XCJjb25maWcucGFnaW5hdGlvbkVuYWJsZWQgPyAnJyA6ICdub25lJ1wiXG4gICAgIGNsYXNzPVwibmd4LXBhZ2luYXRpb24td3JhcHBlclwiPlxuICA8ZGl2IGNsYXNzPVwibmd4LXBhZ2luYXRpb24tc3RlcHNcIj5cbiAgICA8cGFnaW5hdGlvbi10ZW1wbGF0ZSAjcGFnaW5hdGlvbkRpcmVjdGl2ZT1cInBhZ2luYXRpb25BcGlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgIChwYWdlQ2hhbmdlKT1cIm9uUGFnZUNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3Mubmd4LXRhYmxlX190YWJsZS0tZGFyay1wYWdpbmF0aW9uXT1cImNvbmZpZy50YWJsZUxheW91dC50aGVtZSA9PT0gJ2RhcmsnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICBbaWRdPVwiaWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgIFttYXhTaXplXT1cImNvbmZpZy5wYWdpbmF0aW9uTWF4U2l6ZSB8fCA1XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICBpZD1cInBhZ2luYXRpb24tY29udHJvbHNcIj5cbiAgICAgIDx1bCBbYXR0ci5hcmlhLWxhYmVsXT1cInNjcmVlblJlYWRlclBhZ2luYXRpb25MYWJlbFwiXG4gICAgICAgICAgW2NsYXNzLnJlc3BvbnNpdmVdPVwidHJ1ZVwiXG4gICAgICAgICAgY2xhc3M9XCJuZ3gtcGFnaW5hdGlvblwiXG4gICAgICAgICAgcm9sZT1cIm5hdmlnYXRpb25cIj5cbiAgICAgICAgPGxpICpuZ0lmPVwiZGlyZWN0aW9uTGlua3NcIlxuICAgICAgICAgICAgW2NsYXNzLmRpc2FibGVkXT1cInBhZ2luYXRpb25EaXJlY3RpdmUuaXNGaXJzdFBhZ2UoKVwiXG4gICAgICAgICAgICBjbGFzcz1cInBhZ2luYXRpb24tcHJldmlvdXNcIj5cbiAgICAgICAgICA8YSAoY2xpY2spPVwicGFnaW5hdGlvbkRpcmVjdGl2ZS5wcmV2aW91cygpXCJcbiAgICAgICAgICAgICAoa2V5dXAuZW50ZXIpPVwicGFnaW5hdGlvbkRpcmVjdGl2ZS5wcmV2aW91cygpXCJcbiAgICAgICAgICAgICAqbmdJZj1cIjEgPCBwYWdpbmF0aW9uRGlyZWN0aXZlLmdldEN1cnJlbnQoKVwiXG4gICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJwcmV2aW91c0xhYmVsICsgJyAnICsgc2NyZWVuUmVhZGVyUGFnZUxhYmVsXCJcbiAgICAgICAgICAgICB0YWJpbmRleD1cIjBcIj5cbiAgICAgICAgICAgIHt7IHByZXZpb3VzTGFiZWwgfX0gPHNwYW4gY2xhc3M9XCJzaG93LWZvci1zclwiPnt7IHNjcmVlblJlYWRlclBhZ2VMYWJlbCB9fTwvc3Bhbj5cbiAgICAgICAgICA8L2E+XG4gICAgICAgICAgPHNwYW4gKm5nSWY9XCJwYWdpbmF0aW9uRGlyZWN0aXZlLmlzRmlyc3RQYWdlKClcIj5cbiAgICAgICAgICAgIHt7IHByZXZpb3VzTGFiZWwgfX0gPHNwYW4gY2xhc3M9XCJzaG93LWZvci1zclwiPnt7IHNjcmVlblJlYWRlclBhZ2VMYWJlbCB9fTwvc3Bhbj5cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgIDwvbGk+XG4gICAgICAgIDxsaSBjbGFzcz1cInNtYWxsLXNjcmVlblwiPlxuICAgICAgICAgIHt7IHBhZ2luYXRpb25EaXJlY3RpdmUuZ2V0Q3VycmVudCgpIH19IC8ge3sgcGFnaW5hdGlvbkRpcmVjdGl2ZS5nZXRMYXN0UGFnZSgpIH19XG4gICAgICAgIDwvbGk+XG4gICAgICAgIDxsaSAqbmdGb3I9XCJsZXQgcGFnZSBvZiBwYWdpbmF0aW9uRGlyZWN0aXZlLnBhZ2VzXCJcbiAgICAgICAgICAgIFtjbGFzcy5jdXJyZW50XT1cInBhZ2luYXRpb25EaXJlY3RpdmUuZ2V0Q3VycmVudCgpID09PSBwYWdlLnZhbHVlXCJcbiAgICAgICAgICAgIFtjbGFzcy5lbGxpcHNpc109XCJwYWdlLmxhYmVsID09PSAnLi4uJ1wiPlxuICAgICAgICAgIDxhIChjbGljayk9XCJwYWdpbmF0aW9uRGlyZWN0aXZlLnNldEN1cnJlbnQocGFnZS52YWx1ZSlcIlxuICAgICAgICAgICAgIChrZXl1cC5lbnRlcik9XCJwYWdpbmF0aW9uRGlyZWN0aXZlLnNldEN1cnJlbnQocGFnZS52YWx1ZSlcIlxuICAgICAgICAgICAgICpuZ0lmPVwicGFnaW5hdGlvbkRpcmVjdGl2ZS5nZXRDdXJyZW50KCkgIT09IHBhZ2UudmFsdWVcIlxuICAgICAgICAgICAgIHRhYmluZGV4PVwiMFwiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzaG93LWZvci1zclwiPnt7IHNjcmVlblJlYWRlclBhZ2VMYWJlbCB9fSA8L3NwYW4+XG4gICAgICAgICAgICA8c3Bhbj57eyBwYWdlLmxhYmVsIH19PC9zcGFuPlxuICAgICAgICAgIDwvYT5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwicGFnaW5hdGlvbkRpcmVjdGl2ZS5nZXRDdXJyZW50KCkgPT09IHBhZ2UudmFsdWVcIj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2hvdy1mb3Itc3JcIj57eyBzY3JlZW5SZWFkZXJDdXJyZW50TGFiZWwgfX0gPC9zcGFuPlxuICAgICAgICAgICAgPHNwYW4+e3sgcGFnZS5sYWJlbCB9fTwvc3Bhbj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9saT5cbiAgICAgICAgPGxpICpuZ0lmPVwiZGlyZWN0aW9uTGlua3NcIlxuICAgICAgICAgICAgW2NsYXNzLmRpc2FibGVkXT1cInBhZ2luYXRpb25EaXJlY3RpdmUuaXNMYXN0UGFnZSgpXCJcbiAgICAgICAgICAgIGNsYXNzPVwicGFnaW5hdGlvbi1uZXh0XCI+XG4gICAgICAgICAgPGEgKGNsaWNrKT1cInBhZ2luYXRpb25EaXJlY3RpdmUubmV4dCgpXCJcbiAgICAgICAgICAgICAoa2V5dXAuZW50ZXIpPVwicGFnaW5hdGlvbkRpcmVjdGl2ZS5uZXh0KClcIlxuICAgICAgICAgICAgICpuZ0lmPVwiIXBhZ2luYXRpb25EaXJlY3RpdmUuaXNMYXN0UGFnZSgpXCJcbiAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIm5leHRMYWJlbCArICcgJyArIHNjcmVlblJlYWRlclBhZ2VMYWJlbFwiXG4gICAgICAgICAgICAgdGFiaW5kZXg9XCIwXCI+XG4gICAgICAgICAgICB7eyBuZXh0TGFiZWwgfX0gPHNwYW4gY2xhc3M9XCJzaG93LWZvci1zclwiPnt7IHNjcmVlblJlYWRlclBhZ2VMYWJlbCB9fTwvc3Bhbj5cbiAgICAgICAgICA8L2E+XG4gICAgICAgICAgPHNwYW4gKm5nSWY9XCJwYWdpbmF0aW9uRGlyZWN0aXZlLmlzTGFzdFBhZ2UoKVwiPlxuICAgICAgICAgICAge3sgbmV4dExhYmVsIH19IDxzcGFuIGNsYXNzPVwic2hvdy1mb3Itc3JcIj57eyBzY3JlZW5SZWFkZXJQYWdlTGFiZWwgfX08L3NwYW4+XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICA8L2xpPlxuICAgICAgPC91bD5cbiAgICA8L3BhZ2luYXRpb24tdGVtcGxhdGU+XG4gIDwvZGl2PlxuICA8ZGl2ICNwYWdpbmF0aW9uUmFuZ2VcbiAgICAgICAqbmdJZj1cImNvbmZpZy5wYWdpbmF0aW9uUmFuZ2VFbmFibGVkXCJcbiAgICAgICBbY2xhc3Mubmd4LXRhYmxlX190YWJsZS0tZGFyay1wYWdpbmF0aW9uLXJhbmdlXT1cImNvbmZpZy50YWJsZUxheW91dC50aGVtZSA9PT0gJ2RhcmsnXCJcbiAgICAgICBjbGFzcz1cIm5neC1wYWdpbmF0aW9uLXJhbmdlXCI+XG4gICAgPGRpdiBjbGFzcz1cIm5neC1kcm9wZG93biBuZ3gtcGFnaW5hdGlvbi1yYW5nZS1kcm9wZG93blwiXG4gICAgICAgICBpZD1cInJvd0Ftb3VudFwiPlxuICAgICAgPGRpdiBjbGFzcz1cIm5neC1idG4tZ3JvdXBcIj5cbiAgICAgICAgPGRpdiAoY2xpY2spPVwic2hvd1JhbmdlID0gIXNob3dSYW5nZVwiXG4gICAgICAgICAgICAgY2xhc3M9XCJuZ3gtcGFnaW5hdGlvbi1yYW5nZS1kcm9wZG93bi1idXR0b25cIj5cbiAgICAgICAgICB7e3NlbGVjdGVkTGltaXR9fSA8aSBjbGFzcz1cIm5neC1pY29uIG5neC1pY29uLWFycm93LWRvd25cIj48L2k+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8dWwgKm5nSWY9XCJzaG93UmFuZ2VcIlxuICAgICAgICAgICAgY2xhc3M9XCJuZ3gtbWVudVwiPlxuICAgICAgICAgIDxsaSAoY2xpY2spPVwiY2hhbmdlTGltaXQobGltaXQsIGZhbHNlKVwiXG4gICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBsaW1pdCBvZiByYW5nZXNcIlxuICAgICAgICAgICAgICBbY2xhc3Mubmd4LXBhZ2luYXRpb24tcmFuZ2UtLXNlbGVjdGVkXT1cImxpbWl0ID09PSBzZWxlY3RlZExpbWl0XCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJuZ3gtcGFnaW5hdGlvbi1yYW5nZS1kcm9wZG93bi1idXR0b24taXRlbVwiPlxuICAgICAgICAgICAgPHNwYW4+e3tsaW1pdH19PC9zcGFuPlxuICAgICAgICAgIDwvbGk+XG4gICAgICAgIDwvdWw+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==