UNPKG

@taiga-ui/addon-table

Version:

A library to display tabled data with filters, search, group actions, etc.

99 lines 24.6 kB
import { AsyncPipe, NgForOf, NgIf } from '@angular/common'; import { ChangeDetectionStrategy, Component, EventEmitter, inject, Input, Output, } from '@angular/core'; import { TUI_TABLE_PAGINATION_TEXTS } from '@taiga-ui/addon-table/tokens'; import { TuiButton } from '@taiga-ui/core/components/button'; import { TuiDataList } from '@taiga-ui/core/components/data-list'; import { TuiIcon } from '@taiga-ui/core/components/icon'; import { TuiLink } from '@taiga-ui/core/components/link'; import { TuiDropdownDirective, TuiDropdownOpen } from '@taiga-ui/core/directives/dropdown'; import { TUI_COMMON_ICONS, TUI_SPIN_ICONS, TUI_SPIN_TEXTS } from '@taiga-ui/core/tokens'; import { PolymorpheusOutlet } from '@taiga-ui/polymorpheus'; import { TUI_TABLE_PAGINATION_OPTIONS, } from './table-pagination.options'; import * as i0 from "@angular/core"; import * as i1 from "@taiga-ui/core/components/data-list"; class TuiTablePagination { constructor() { this.options = inject(TUI_TABLE_PAGINATION_OPTIONS); this.open = false; this.icons = inject(TUI_SPIN_ICONS); this.spinTexts$ = inject(TUI_SPIN_TEXTS); this.texts$ = inject(TUI_TABLE_PAGINATION_TEXTS); this.commonIcons = inject(TUI_COMMON_ICONS); this.items = this.options.items; this.total = 0; this.page = 0; this.size = this.options.size; this.paginationChange = new EventEmitter(); } onItem(size) { const { start } = this; this.size = size; this.open = false; this.page = Math.floor(start / this.size); this.paginationChange.emit(this.pagination); } get pages() { return Math.ceil(this.total / this.size); } get showPages() { return this.options.showPages; } get sizeOptionContent() { return this.options.sizeOptionContent; } get start() { return Math.min(this.page, Math.floor(this.total / this.size)) * this.size; } get end() { return Math.min(this.start + this.size, this.total); } get leftDisabled() { return !this.start; } get rightDisabled() { return this.end === this.total; } get pagination() { return { page: this.page, size: this.size, }; } back() { this.page--; this.paginationChange.emit(this.pagination); } forth() { this.page++; this.paginationChange.emit(this.pagination); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TuiTablePagination, deps: [], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: TuiTablePagination, isStandalone: true, selector: "tui-table-pagination", inputs: { items: "items", total: "total", page: "page", size: "size" }, outputs: { paginationChange: "paginationChange" }, ngImport: i0, template: "<ng-container *ngIf=\"texts$ | async as texts\">\n <span class=\"t-pages\">\n <ng-container *ngIf=\"showPages\">\n {{ texts.pages }}\n <strong class=\"t-strong\">{{ pages }}</strong>\n </ng-container>\n </span>\n <span automation-id=\"tui-table-pagination__lines-per-page-wrapper\">\n {{ texts.linesPerPage }}\n\n <button\n *ngIf=\"total !== 0; else zeroTotal\"\n tuiLink\n type=\"button\"\n [tuiDropdown]=\"content\"\n [(tuiDropdownOpen)]=\"open\"\n >\n <strong>{{ start + 1 }}\u2013{{ end }}</strong>\n </button>\n <ng-template #zeroTotal>\n <strong>0 - 0</strong>\n </ng-template>\n <ng-template #content>\n <tui-data-list size=\"s\">\n <ng-container *ngFor=\"let item of items\">\n <button\n tuiOption\n type=\"button\"\n class=\"t-item\"\n (click)=\"onItem(item)\"\n >\n <ng-container\n *polymorpheusOutlet=\"sizeOptionContent as text; context: {$implicit: item, total: total}\"\n >\n {{ text }}\n </ng-container>\n <tui-icon\n *ngIf=\"item === size; else fakeIcon\"\n class=\"t-checkmark\"\n [icon]=\"commonIcons.check\"\n />\n\n <ng-template #fakeIcon>\n <span class=\"t-checkmark\"></span>\n </ng-template>\n </button>\n </ng-container>\n </tui-data-list>\n </ng-template>\n {{ texts.of }}\n <strong class=\"t-strong\">{{ total }}</strong>\n </span>\n <ng-container *ngIf=\"spinTexts$ | async as spinTexts\">\n <button\n appearance=\"icon\"\n size=\"xs\"\n tuiIconButton\n type=\"button\"\n class=\"t-button t-button_back\"\n [disabled]=\"leftDisabled\"\n [iconStart]=\"icons.decrement\"\n (click)=\"back()\"\n >\n {{ spinTexts[0] }}\n </button>\n <button\n appearance=\"icon\"\n size=\"xs\"\n tuiIconButton\n type=\"button\"\n class=\"t-button\"\n [disabled]=\"rightDisabled\"\n [iconStart]=\"icons.increment\"\n (click)=\"forth()\"\n >\n {{ spinTexts[1] }}\n </button>\n </ng-container>\n</ng-container>\n", styles: [":host{display:flex;font:var(--tui-font-text-s);align-items:center;color:var(--tui-text-tertiary)}.t-strong{color:var(--tui-text-primary)}.t-pages{margin-inline-end:auto}.t-item{min-inline-size:5.5rem;box-sizing:border-box}.t-checkmark{min-inline-size:1rem;font-size:1rem;margin-inline-start:.25rem}.t-button{transform:scaleX(var(--tui-inline))}.t-button_back{margin-inline-end:.25rem;margin-inline-start:1.5rem}\n"], dependencies: [{ kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "directive", type: NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: PolymorpheusOutlet, selector: "[polymorpheusOutlet]", inputs: ["polymorpheusOutlet", "polymorpheusOutletContext"] }, { kind: "directive", type: TuiButton, selector: "a[tuiButton],button[tuiButton],a[tuiIconButton],button[tuiIconButton]", inputs: ["size"] }, { kind: "component", type: i1.TuiDataListComponent, selector: "tui-data-list", inputs: ["emptyContent", "size"] }, { kind: "component", type: i1.TuiOption, selector: "button[tuiOption]:not([new]), a[tuiOption]:not([new]), label[tuiOption]:not([new])", inputs: ["disabled", "value"] }, { kind: "directive", type: TuiDropdownDirective, selector: "[tuiDropdown]:not(ng-container):not(ng-template)", inputs: ["tuiDropdown"], exportAs: ["tuiDropdown"] }, { kind: "directive", type: TuiDropdownOpen, selector: "[tuiDropdown][tuiDropdownOpen],[tuiDropdown][tuiDropdownOpenChange]", inputs: ["tuiDropdownEnabled", "tuiDropdownOpen"], outputs: ["tuiDropdownOpenChange"] }, { kind: "component", type: TuiIcon, selector: "tui-icon", inputs: ["icon", "background"] }, { kind: "directive", type: TuiLink, selector: "a[tuiLink], button[tuiLink]", inputs: ["pseudo"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); } } export { TuiTablePagination }; i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TuiTablePagination, decorators: [{ type: Component, args: [{ standalone: true, selector: 'tui-table-pagination', imports: [ AsyncPipe, NgForOf, NgIf, PolymorpheusOutlet, TuiButton, TuiDataList, TuiDropdownDirective, TuiDropdownOpen, TuiIcon, TuiLink, ], changeDetection: ChangeDetectionStrategy.OnPush, template: "<ng-container *ngIf=\"texts$ | async as texts\">\n <span class=\"t-pages\">\n <ng-container *ngIf=\"showPages\">\n {{ texts.pages }}\n <strong class=\"t-strong\">{{ pages }}</strong>\n </ng-container>\n </span>\n <span automation-id=\"tui-table-pagination__lines-per-page-wrapper\">\n {{ texts.linesPerPage }}\n\n <button\n *ngIf=\"total !== 0; else zeroTotal\"\n tuiLink\n type=\"button\"\n [tuiDropdown]=\"content\"\n [(tuiDropdownOpen)]=\"open\"\n >\n <strong>{{ start + 1 }}\u2013{{ end }}</strong>\n </button>\n <ng-template #zeroTotal>\n <strong>0 - 0</strong>\n </ng-template>\n <ng-template #content>\n <tui-data-list size=\"s\">\n <ng-container *ngFor=\"let item of items\">\n <button\n tuiOption\n type=\"button\"\n class=\"t-item\"\n (click)=\"onItem(item)\"\n >\n <ng-container\n *polymorpheusOutlet=\"sizeOptionContent as text; context: {$implicit: item, total: total}\"\n >\n {{ text }}\n </ng-container>\n <tui-icon\n *ngIf=\"item === size; else fakeIcon\"\n class=\"t-checkmark\"\n [icon]=\"commonIcons.check\"\n />\n\n <ng-template #fakeIcon>\n <span class=\"t-checkmark\"></span>\n </ng-template>\n </button>\n </ng-container>\n </tui-data-list>\n </ng-template>\n {{ texts.of }}\n <strong class=\"t-strong\">{{ total }}</strong>\n </span>\n <ng-container *ngIf=\"spinTexts$ | async as spinTexts\">\n <button\n appearance=\"icon\"\n size=\"xs\"\n tuiIconButton\n type=\"button\"\n class=\"t-button t-button_back\"\n [disabled]=\"leftDisabled\"\n [iconStart]=\"icons.decrement\"\n (click)=\"back()\"\n >\n {{ spinTexts[0] }}\n </button>\n <button\n appearance=\"icon\"\n size=\"xs\"\n tuiIconButton\n type=\"button\"\n class=\"t-button\"\n [disabled]=\"rightDisabled\"\n [iconStart]=\"icons.increment\"\n (click)=\"forth()\"\n >\n {{ spinTexts[1] }}\n </button>\n </ng-container>\n</ng-container>\n", styles: [":host{display:flex;font:var(--tui-font-text-s);align-items:center;color:var(--tui-text-tertiary)}.t-strong{color:var(--tui-text-primary)}.t-pages{margin-inline-end:auto}.t-item{min-inline-size:5.5rem;box-sizing:border-box}.t-checkmark{min-inline-size:1rem;font-size:1rem;margin-inline-start:.25rem}.t-button{transform:scaleX(var(--tui-inline))}.t-button_back{margin-inline-end:.25rem;margin-inline-start:1.5rem}\n"] }] }], propDecorators: { items: [{ type: Input }], total: [{ type: Input }], page: [{ type: Input }], size: [{ type: Input }], paginationChange: [{ type: Output }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUtcGFnaW5hdGlvbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hZGRvbi10YWJsZS9jb21wb25lbnRzL3RhYmxlLXBhZ2luYXRpb24vdGFibGUtcGFnaW5hdGlvbi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hZGRvbi10YWJsZS9jb21wb25lbnRzL3RhYmxlLXBhZ2luYXRpb24vdGFibGUtcGFnaW5hdGlvbi50ZW1wbGF0ZS5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxTQUFTLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBQ3pELE9BQU8sRUFDSCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFlBQVksRUFDWixNQUFNLEVBQ04sS0FBSyxFQUNMLE1BQU0sR0FDVCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUMsMEJBQTBCLEVBQUMsTUFBTSw4QkFBOEIsQ0FBQztBQUN4RSxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sa0NBQWtDLENBQUM7QUFDM0QsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLHFDQUFxQyxDQUFDO0FBQ2hFLE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxnQ0FBZ0MsQ0FBQztBQUN2RCxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sZ0NBQWdDLENBQUM7QUFDdkQsT0FBTyxFQUFDLG9CQUFvQixFQUFFLGVBQWUsRUFBQyxNQUFNLG9DQUFvQyxDQUFDO0FBQ3pGLE9BQU8sRUFBQyxnQkFBZ0IsRUFBRSxjQUFjLEVBQUUsY0FBYyxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFDdkYsT0FBTyxFQUFDLGtCQUFrQixFQUFDLE1BQU0sd0JBQXdCLENBQUM7QUFFMUQsT0FBTyxFQUNILDRCQUE0QixHQUUvQixNQUFNLDRCQUE0QixDQUFDOzs7QUFPcEMsTUFtQmEsa0JBQWtC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NkZBQ0osa0JBQWtCLDhIQUNsQixTQUFTLGlhQUVULG9CQUFvQixpSkFDcEIsZUFBZSx1TUFDZixPQUFPLHFGQUNQLE9BQU87O1NBTUYsa0JBQWtCOzRGQUFsQixrQkFBa0I7a0JBbkI5QixTQUFTO2lDQUNNLElBQUksWUFDTixzQkFBc0IsV0FDdkI7d0JBQ0wsU0FBUzt3QkFDVCxPQUFPO3dCQUNQLElBQUk7d0JBQ0osa0JBQWtCO3dCQUNsQixTQUFTO3dCQUNULFdBQVc7d0JBQ1gsb0JBQW9CO3dCQUNwQixlQUFlO3dCQUNmLE9BQU87d0JBQ1AsT0FBTztxQkFDVixtQkFHZ0IsdUJBQXVCLENBQUMsTUFBTTs4QkFZeEMsS0FBSztzQkFEWCxLQUFLO2dCQUlDLEtBQUs7c0JBRFgsS0FBSztnQkFJQyxJQUFJO3NCQURWLEtBQUs7Z0JBSUMsSUFBSTtzQkFEVixLQUFLO2dCQUlVLGdCQUFnQjtzQkFEL0IsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7QXN5bmNQaXBlLCBOZ0Zvck9mLCBOZ0lmfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgICBDb21wb25lbnQsXG4gICAgRXZlbnRFbWl0dGVyLFxuICAgIGluamVjdCxcbiAgICBJbnB1dCxcbiAgICBPdXRwdXQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtUVUlfVEFCTEVfUEFHSU5BVElPTl9URVhUU30gZnJvbSAnQHRhaWdhLXVpL2FkZG9uLXRhYmxlL3Rva2Vucyc7XG5pbXBvcnQge1R1aUJ1dHRvbn0gZnJvbSAnQHRhaWdhLXVpL2NvcmUvY29tcG9uZW50cy9idXR0b24nO1xuaW1wb3J0IHtUdWlEYXRhTGlzdH0gZnJvbSAnQHRhaWdhLXVpL2NvcmUvY29tcG9uZW50cy9kYXRhLWxpc3QnO1xuaW1wb3J0IHtUdWlJY29ufSBmcm9tICdAdGFpZ2EtdWkvY29yZS9jb21wb25lbnRzL2ljb24nO1xuaW1wb3J0IHtUdWlMaW5rfSBmcm9tICdAdGFpZ2EtdWkvY29yZS9jb21wb25lbnRzL2xpbmsnO1xuaW1wb3J0IHtUdWlEcm9wZG93bkRpcmVjdGl2ZSwgVHVpRHJvcGRvd25PcGVufSBmcm9tICdAdGFpZ2EtdWkvY29yZS9kaXJlY3RpdmVzL2Ryb3Bkb3duJztcbmltcG9ydCB7VFVJX0NPTU1PTl9JQ09OUywgVFVJX1NQSU5fSUNPTlMsIFRVSV9TUElOX1RFWFRTfSBmcm9tICdAdGFpZ2EtdWkvY29yZS90b2tlbnMnO1xuaW1wb3J0IHtQb2x5bW9ycGhldXNPdXRsZXR9IGZyb20gJ0B0YWlnYS11aS9wb2x5bW9ycGhldXMnO1xuXG5pbXBvcnQge1xuICAgIFRVSV9UQUJMRV9QQUdJTkFUSU9OX09QVElPTlMsXG4gICAgdHlwZSBUdWlUYWJsZVBhZ2luYXRpb25PcHRpb25zLFxufSBmcm9tICcuL3RhYmxlLXBhZ2luYXRpb24ub3B0aW9ucyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVHVpVGFibGVQYWdpbmF0aW9uRXZlbnQge1xuICAgIHJlYWRvbmx5IHBhZ2U6IG51bWJlcjtcbiAgICByZWFkb25seSBzaXplOiBudW1iZXI7XG59XG5cbkBDb21wb25lbnQoe1xuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgc2VsZWN0b3I6ICd0dWktdGFibGUtcGFnaW5hdGlvbicsXG4gICAgaW1wb3J0czogW1xuICAgICAgICBBc3luY1BpcGUsXG4gICAgICAgIE5nRm9yT2YsXG4gICAgICAgIE5nSWYsXG4gICAgICAgIFBvbHltb3JwaGV1c091dGxldCxcbiAgICAgICAgVHVpQnV0dG9uLFxuICAgICAgICBUdWlEYXRhTGlzdCxcbiAgICAgICAgVHVpRHJvcGRvd25EaXJlY3RpdmUsXG4gICAgICAgIFR1aURyb3Bkb3duT3BlbixcbiAgICAgICAgVHVpSWNvbixcbiAgICAgICAgVHVpTGluayxcbiAgICBdLFxuICAgIHRlbXBsYXRlVXJsOiAnLi90YWJsZS1wYWdpbmF0aW9uLnRlbXBsYXRlLmh0bWwnLFxuICAgIHN0eWxlVXJsczogWycuL3RhYmxlLXBhZ2luYXRpb24uc3R5bGUubGVzcyddLFxuICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBUdWlUYWJsZVBhZ2luYXRpb24ge1xuICAgIHByaXZhdGUgcmVhZG9ubHkgb3B0aW9ucyA9IGluamVjdChUVUlfVEFCTEVfUEFHSU5BVElPTl9PUFRJT05TKTtcblxuICAgIHByb3RlY3RlZCBvcGVuID0gZmFsc2U7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGljb25zID0gaW5qZWN0KFRVSV9TUElOX0lDT05TKTtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgc3BpblRleHRzJCA9IGluamVjdChUVUlfU1BJTl9URVhUUyk7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IHRleHRzJCA9IGluamVjdChUVUlfVEFCTEVfUEFHSU5BVElPTl9URVhUUyk7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGNvbW1vbkljb25zID0gaW5qZWN0KFRVSV9DT01NT05fSUNPTlMpO1xuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgaXRlbXM6IHJlYWRvbmx5IG51bWJlcltdID0gdGhpcy5vcHRpb25zLml0ZW1zO1xuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgdG90YWwgPSAwO1xuXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgcGFnZSA9IDA7XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBzaXplID0gdGhpcy5vcHRpb25zLnNpemU7XG5cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgcmVhZG9ubHkgcGFnaW5hdGlvbkNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8VHVpVGFibGVQYWdpbmF0aW9uRXZlbnQ+KCk7XG5cbiAgICBwdWJsaWMgb25JdGVtKHNpemU6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBjb25zdCB7c3RhcnR9ID0gdGhpcztcblxuICAgICAgICB0aGlzLnNpemUgPSBzaXplO1xuICAgICAgICB0aGlzLm9wZW4gPSBmYWxzZTtcbiAgICAgICAgdGhpcy5wYWdlID0gTWF0aC5mbG9vcihzdGFydCAvIHRoaXMuc2l6ZSk7XG4gICAgICAgIHRoaXMucGFnaW5hdGlvbkNoYW5nZS5lbWl0KHRoaXMucGFnaW5hdGlvbik7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGdldCBwYWdlcygpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gTWF0aC5jZWlsKHRoaXMudG90YWwgLyB0aGlzLnNpemUpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBnZXQgc2hvd1BhZ2VzKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5vcHRpb25zLnNob3dQYWdlcztcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgZ2V0IHNpemVPcHRpb25Db250ZW50KCk6IFR1aVRhYmxlUGFnaW5hdGlvbk9wdGlvbnNbJ3NpemVPcHRpb25Db250ZW50J10ge1xuICAgICAgICByZXR1cm4gdGhpcy5vcHRpb25zLnNpemVPcHRpb25Db250ZW50O1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBnZXQgc3RhcnQoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIE1hdGgubWluKHRoaXMucGFnZSwgTWF0aC5mbG9vcih0aGlzLnRvdGFsIC8gdGhpcy5zaXplKSkgKiB0aGlzLnNpemU7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGdldCBlbmQoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIE1hdGgubWluKHRoaXMuc3RhcnQgKyB0aGlzLnNpemUsIHRoaXMudG90YWwpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBnZXQgbGVmdERpc2FibGVkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gIXRoaXMuc3RhcnQ7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGdldCByaWdodERpc2FibGVkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5lbmQgPT09IHRoaXMudG90YWw7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGdldCBwYWdpbmF0aW9uKCk6IFR1aVRhYmxlUGFnaW5hdGlvbkV2ZW50IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHBhZ2U6IHRoaXMucGFnZSxcbiAgICAgICAgICAgIHNpemU6IHRoaXMuc2l6ZSxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgYmFjaygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5wYWdlLS07XG4gICAgICAgIHRoaXMucGFnaW5hdGlvbkNoYW5nZS5lbWl0KHRoaXMucGFnaW5hdGlvbik7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGZvcnRoKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnBhZ2UrKztcbiAgICAgICAgdGhpcy5wYWdpbmF0aW9uQ2hhbmdlLmVtaXQodGhpcy5wYWdpbmF0aW9uKTtcbiAgICB9XG59XG4iLCI8bmctY29udGFpbmVyICpuZ0lmPVwidGV4dHMkIHwgYXN5bmMgYXMgdGV4dHNcIj5cbiAgICA8c3BhbiBjbGFzcz1cInQtcGFnZXNcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNob3dQYWdlc1wiPlxuICAgICAgICAgICAge3sgdGV4dHMucGFnZXMgfX1cbiAgICAgICAgICAgIDxzdHJvbmcgY2xhc3M9XCJ0LXN0cm9uZ1wiPnt7IHBhZ2VzIH19PC9zdHJvbmc+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvc3Bhbj5cbiAgICA8c3BhbiBhdXRvbWF0aW9uLWlkPVwidHVpLXRhYmxlLXBhZ2luYXRpb25fX2xpbmVzLXBlci1wYWdlLXdyYXBwZXJcIj5cbiAgICAgICAge3sgdGV4dHMubGluZXNQZXJQYWdlIH19XG5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgKm5nSWY9XCJ0b3RhbCAhPT0gMDsgZWxzZSB6ZXJvVG90YWxcIlxuICAgICAgICAgICAgdHVpTGlua1xuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBbdHVpRHJvcGRvd25dPVwiY29udGVudFwiXG4gICAgICAgICAgICBbKHR1aURyb3Bkb3duT3BlbildPVwib3BlblwiXG4gICAgICAgID5cbiAgICAgICAgICAgIDxzdHJvbmc+e3sgc3RhcnQgKyAxIH194oCTe3sgZW5kIH19PC9zdHJvbmc+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8bmctdGVtcGxhdGUgI3plcm9Ub3RhbD5cbiAgICAgICAgICAgIDxzdHJvbmc+MCAtIDA8L3N0cm9uZz5cbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgPG5nLXRlbXBsYXRlICNjb250ZW50PlxuICAgICAgICAgICAgPHR1aS1kYXRhLWxpc3Qgc2l6ZT1cInNcIj5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBpdGVtIG9mIGl0ZW1zXCI+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgIHR1aU9wdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInQtaXRlbVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwib25JdGVtKGl0ZW0pXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwb2x5bW9ycGhldXNPdXRsZXQ9XCJzaXplT3B0aW9uQ29udGVudCBhcyB0ZXh0OyBjb250ZXh0OiB7JGltcGxpY2l0OiBpdGVtLCB0b3RhbDogdG90YWx9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyB0ZXh0IH19XG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0dWktaWNvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiaXRlbSA9PT0gc2l6ZTsgZWxzZSBmYWtlSWNvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ0LWNoZWNrbWFya1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2ljb25dPVwiY29tbW9uSWNvbnMuY2hlY2tcIlxuICAgICAgICAgICAgICAgICAgICAgICAgLz5cblxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNmYWtlSWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInQtY2hlY2ttYXJrXCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L3R1aS1kYXRhLWxpc3Q+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgIHt7IHRleHRzLm9mIH19XG4gICAgICAgIDxzdHJvbmcgY2xhc3M9XCJ0LXN0cm9uZ1wiPnt7IHRvdGFsIH19PC9zdHJvbmc+XG4gICAgPC9zcGFuPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzcGluVGV4dHMkIHwgYXN5bmMgYXMgc3BpblRleHRzXCI+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIGFwcGVhcmFuY2U9XCJpY29uXCJcbiAgICAgICAgICAgIHNpemU9XCJ4c1wiXG4gICAgICAgICAgICB0dWlJY29uQnV0dG9uXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIGNsYXNzPVwidC1idXR0b24gdC1idXR0b25fYmFja1wiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwibGVmdERpc2FibGVkXCJcbiAgICAgICAgICAgIFtpY29uU3RhcnRdPVwiaWNvbnMuZGVjcmVtZW50XCJcbiAgICAgICAgICAgIChjbGljayk9XCJiYWNrKClcIlxuICAgICAgICA+XG4gICAgICAgICAgICB7eyBzcGluVGV4dHNbMF0gfX1cbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIGFwcGVhcmFuY2U9XCJpY29uXCJcbiAgICAgICAgICAgIHNpemU9XCJ4c1wiXG4gICAgICAgICAgICB0dWlJY29uQnV0dG9uXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIGNsYXNzPVwidC1idXR0b25cIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cInJpZ2h0RGlzYWJsZWRcIlxuICAgICAgICAgICAgW2ljb25TdGFydF09XCJpY29ucy5pbmNyZW1lbnRcIlxuICAgICAgICAgICAgKGNsaWNrKT1cImZvcnRoKClcIlxuICAgICAgICA+XG4gICAgICAgICAgICB7eyBzcGluVGV4dHNbMV0gfX1cbiAgICAgICAgPC9idXR0b24+XG4gICAgPC9uZy1jb250YWluZXI+XG48L25nLWNvbnRhaW5lcj5cbiJdfQ==