@doku-dev/doku-fragment
Version:
A new Angular UI library that moving away from Bootstrap and built from scratch.
124 lines • 18.1 kB
JavaScript
import { Directive, HostBinding, HostListener, Inject, Input, createComponent, } from '@angular/core';
import { BehaviorSubject, ReplaySubject, filter, takeUntil } from 'rxjs';
import { DokuSorterIcon } from './sorter-icon.component';
import { DokuTable } from './table.directive';
import * as i0 from "@angular/core";
import * as i1 from "./table.directive";
export class DokuTableSortable {
constructor(envInjector, appRef, elementRef, table) {
this.envInjector = envInjector;
this.appRef = appRef;
this.elementRef = elementRef;
this.table = table;
this.direction$ = new BehaviorSubject('');
this.destroy$ = new ReplaySubject();
}
get classes() {
return ['d-table-sortable'];
}
ngOnInit() {
this.table?.['sortChange$']
.pipe(filter(() => !!this.sortable), filter(() => !!this.sorterIconComponent), takeUntil(this.destroy$))
.subscribe(({ activeSorter }) => {
if (this.direction$.value !== '' && activeSorter?.column !== this.sortable) {
// Reset direction because the active sorter is on another column.
this.direction$.next('');
}
if (activeSorter?.column === this.sortable &&
this.direction$.value !== activeSorter?.direction) {
// Update direction from table active sorter
this.direction$.next(activeSorter?.direction || '');
}
});
this.direction$
.pipe(filter(() => !!this.sortable), filter(() => !!this.sorterIconComponent), takeUntil(this.destroy$))
.subscribe((direction) => {
// Update sorter icon based on active direction.
if (direction === 'ascending') {
this.sorterIconComponent?.setInput('colorAsc', 'currentColor');
this.sorterIconComponent?.setInput('colorDesc', 'none');
}
else if (direction === 'descending') {
this.sorterIconComponent?.setInput('colorAsc', 'none');
this.sorterIconComponent?.setInput('colorDesc', 'currentColor');
}
else {
this.sorterIconComponent?.setInput('colorAsc', 'currentColor');
this.sorterIconComponent?.setInput('colorDesc', 'currentColor');
}
});
}
ngOnChanges(changes) {
if (changes['sortable']) {
const sortable = changes['sortable'].currentValue;
sortable ? this.appendElement() : this.removeElement();
}
}
ngOnDestroy() {
this.removeElement();
this.destroy$.next(true);
this.destroy$.complete();
}
onClick() {
if (!this.sortable)
return;
this.direction$.next(this.nextDirection(this.direction$.value));
this.table?.['_sortChange'].emit({
activeSorter: {
column: this.sortable,
direction: this.direction$.value,
},
});
}
appendElement() {
if (this.sorterIconComponent)
return;
this.sorterIconComponent = this.createSorterIconComponent();
const cell = this.elementRef.nativeElement;
cell.appendChild(this.sorterIconComponent.location.nativeElement);
cell.classList.add('d-table-th-with-sorter');
}
removeElement() {
this.sorterIconComponent?.destroy();
this.sorterIconComponent = undefined;
const cell = this.elementRef.nativeElement;
cell.classList.remove('d-table-th-with-sorter');
}
createSorterIconComponent() {
const component = createComponent(DokuSorterIcon, { environmentInjector: this.envInjector });
component.location.nativeElement.className = 'd-table-sorter-icon';
this.appRef.attachView(component.hostView);
return component;
}
nextDirection(currentDirection) {
const flows = ['', 'ascending', 'descending'];
const flowIndex = flows.findIndex((flow) => flow === currentDirection);
let nextIndex = flowIndex + 1;
if (flowIndex < 0 || flowIndex >= flows.length - 1)
nextIndex = 0;
return flows[nextIndex];
}
}
DokuTableSortable.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: DokuTableSortable, deps: [{ token: i0.EnvironmentInjector }, { token: i0.ApplicationRef }, { token: i0.ElementRef }, { token: DokuTable }], target: i0.ɵɵFactoryTarget.Directive });
DokuTableSortable.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.9", type: DokuTableSortable, isStandalone: true, selector: "th[doku-sortable]", inputs: { sortable: ["doku-sortable", "sortable"] }, host: { listeners: { "click": "onClick()" }, properties: { "class": "this.classes" } }, exportAs: ["dokuSortable"], usesOnChanges: true, ngImport: i0 });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: DokuTableSortable, decorators: [{
type: Directive,
args: [{
selector: 'th[doku-sortable]',
exportAs: 'dokuSortable',
standalone: true,
}]
}], ctorParameters: function () { return [{ type: i0.EnvironmentInjector }, { type: i0.ApplicationRef }, { type: i0.ElementRef }, { type: i1.DokuTable, decorators: [{
type: Inject,
args: [DokuTable]
}] }]; }, propDecorators: { sortable: [{
type: Input,
args: ['doku-sortable']
}], classes: [{
type: HostBinding,
args: ['class']
}], onClick: [{
type: HostListener,
args: ['click']
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUtc29ydGFibGUuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZG9rdS1mcmFnbWVudC9zcmMvbGliL3RhYmxlL3RhYmxlLXNvcnRhYmxlLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBR0wsU0FBUyxFQUdULFdBQVcsRUFDWCxZQUFZLEVBQ1osTUFBTSxFQUNOLEtBQUssRUFLTCxlQUFlLEdBQ2hCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxlQUFlLEVBQUUsYUFBYSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDekUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3pELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQzs7O0FBUTlDLE1BQU0sT0FBTyxpQkFBaUI7SUFZNUIsWUFDVSxXQUFnQyxFQUNoQyxNQUFzQixFQUN0QixVQUFzQixFQUNILEtBQWlCO1FBSHBDLGdCQUFXLEdBQVgsV0FBVyxDQUFxQjtRQUNoQyxXQUFNLEdBQU4sTUFBTSxDQUFnQjtRQUN0QixlQUFVLEdBQVYsVUFBVSxDQUFZO1FBQ0gsVUFBSyxHQUFMLEtBQUssQ0FBWTtRQVR0QyxlQUFVLEdBQUcsSUFBSSxlQUFlLENBQWdDLEVBQUUsQ0FBQyxDQUFDO1FBR3BFLGFBQVEsR0FBRyxJQUFJLGFBQWEsRUFBRSxDQUFDO0lBT3BDLENBQUM7SUFFSixJQUNjLE9BQU87UUFDbkIsT0FBTyxDQUFDLGtCQUFrQixDQUFDLENBQUM7SUFDOUIsQ0FBQztJQUVELFFBQVE7UUFDTixJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsYUFBYSxDQUFDO2FBQ3hCLElBQUksQ0FDSCxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsRUFDN0IsTUFB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LENBQ25CLGdCQUErQztRQUUvQyxNQUFNLEtBQUssR0FBb0MsQ0FBQyxFQUFFLEVBQUUsV0FBVyxFQUFFLFlBQVksQ0FBQyxDQUFDO1FBQy9FLE1BQU0sU0FBUyxHQUFHLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksS0FBSyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQ3ZFLElBQUksU0FBUyxHQUFXLFNBQVMsR0FBRyxDQUFDLENBQUM7UUFDdEMsSUFBSSxTQUFTLEdBQUcsQ0FBQyxJQUFJLFNBQVMsSUFBSSxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUM7WUFBRSxTQUFTLEdBQUcsQ0FBQyxDQUFDO1FBQ2xFLE9BQU8sS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQzFCLENBQUM7OzhHQTFIVSxpQkFBaUIsNkdBZ0JsQixTQUFTO2tHQWhCUixpQkFBaUI7MkZBQWpCLGlCQUFpQjtrQkFMN0IsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsbUJBQW1CO29CQUM3QixRQUFRLEVBQUUsY0FBYztvQkFDeEIsVUFBVSxFQUFFLElBQUk7aUJBQ2pCOzswQkFpQkksTUFBTTsyQkFBQyxTQUFTOzRDQVhLLFFBQVE7c0JBQS9CLEtBQUs7dUJBQUMsZUFBZTtnQkFlUixPQUFPO3NCQURwQixXQUFXO3VCQUFDLE9BQU87Z0JBOERWLE9BQU87c0JBRGhCLFlBQVk7dUJBQUMsT0FBTyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE5nQ2xhc3MgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgQXBwbGljYXRpb25SZWYsXG4gIENvbXBvbmVudFJlZixcbiAgRGlyZWN0aXZlLFxuICBFbGVtZW50UmVmLFxuICBFbnZpcm9ubWVudEluamVjdG9yLFxuICBIb3N0QmluZGluZyxcbiAgSG9zdExpc3RlbmVyLFxuICBJbmplY3QsXG4gIElucHV0LFxuICBPbkNoYW5nZXMsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBTaW1wbGVDaGFuZ2VzLFxuICBjcmVhdGVDb21wb25lbnQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBSZXBsYXlTdWJqZWN0LCBmaWx0ZXIsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgRG9rdVNvcnRlckljb24gfSBmcm9tICcuL3NvcnRlci1pY29uLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBEb2t1VGFibGUgfSBmcm9tICcuL3RhYmxlLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBEb2t1QWN0aXZlU29ydGVyIH0gZnJvbSAnLi90YWJsZS5pbnRlcmZhY2UnO1xuXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICd0aFtkb2t1LXNvcnRhYmxlXScsXG4gIGV4cG9ydEFzOiAnZG9rdVNvcnRhYmxlJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbn0pXG5leHBvcnQgY2xhc3MgRG9rdVRhYmxlU29ydGFibGUgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcywgT25EZXN0cm95IHtcbiAgLyoqXG4gICAqIENvbHVtbiBuYW1lIHRoYXQgd2lsbCBiZSBzb3J0ZWQuXG4gICAqIEBkZWZhdWx0IHVuZGVmaW5lZFxuICAgKi9cbiAgQElucHV0KCdkb2t1LXNvcnRhYmxlJykgc29ydGFibGU/OiBzdHJpbmc7XG5cbiAgcHJpdmF0ZSBkaXJlY3Rpb24kID0gbmV3IEJlaGF2aW9yU3ViamVjdDxEb2t1QWN0aXZlU29ydGVyWydkaXJlY3Rpb24nXT4oJycpO1xuICBwcml2YXRlIHNvcnRlckljb25Db21wb25lbnQ/OiBDb21wb25lbnRSZWY8RG9rdVNvcnRlckljb24+O1xuXG4gIHByaXZhdGUgZGVzdHJveSQgPSBuZXcgUmVwbGF5U3ViamVjdCgpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgZW52SW5qZWN0b3I6IEVudmlyb25tZW50SW5qZWN0b3IsXG4gICAgcHJpdmF0ZSBhcHBSZWY6IEFwcGxpY2F0aW9uUmVmLFxuICAgIHByaXZhdGUgZWxlbWVudFJlZjogRWxlbWVudFJlZixcbiAgICBASW5qZWN0KERva3VUYWJsZSkgcHJpdmF0ZSB0YWJsZT86IERva3VUYWJsZVxuICApIHt9XG5cbiAgQEhvc3RCaW5kaW5nKCdjbGFzcycpXG4gIHByb3RlY3RlZCBnZXQgY2xhc3NlcygpOiBOZ0NsYXNzWyduZ0NsYXNzJ10ge1xuICAgIHJldHVybiBbJ2QtdGFibGUtc29ydGFibGUnXTtcbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMudGFibGU/Llsnc29ydENoYW5nZSQnXVxuICAgICAgLnBpcGUoXG4gICAgICAgIGZpbHRlcigoKSA9PiAhIXRoaXMuc29ydGFibGUpLFxuICAgICAgICBmaWx0ZXIoKCkgPT4gISF0aGlzLnNvcnRlckljb25Db21wb25lbnQpLFxuICAgICAgICB0YWtlVW50aWwodGhpcy5kZXN0cm95JClcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKHsgYWN0aXZlU29ydGVyIH0pID0+IHtcbiAgICAgICAgaWYgKHRoaXMuZGlyZWN0aW9uJC52YWx1ZSAhPT0gJycgJiYgYWN0aXZlU29ydGVyPy5jb2x1bW4gIT09IHRoaXMuc29ydGFibGUpIHtcbiAgICAgICAgICAvLyBSZXNldCBkaXJlY3Rpb24gYmVjYXVzZSB0aGUgYWN0aXZlIHNvcnRlciBpcyBvbiBhbm90aGVyIGNvbHVtbi5cbiAgICAgICAgICB0aGlzLmRpcmVjdGlvbiQubmV4dCgnJyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoXG4gICAgICAgICAgYWN0aXZlU29ydGVyPy5jb2x1bW4gPT09IHRoaXMuc29ydGFibGUgJiZcbiAgICAgICAgICB0aGlzLmRpcmVjdGlvbiQudmFsdWUgIT09IGFjdGl2ZVNvcnRlcj8uZGlyZWN0aW9uXG4gICAgICAgICkge1xuICAgICAgICAgIC8vIFVwZGF0ZSBkaXJlY3Rpb24gZnJvbSB0YWJsZSBhY3RpdmUgc29ydGVyXG4gICAgICAgICAgdGhpcy5kaXJlY3Rpb24kLm5leHQoYWN0aXZlU29ydGVyPy5kaXJlY3Rpb24gfHwgJycpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgIHRoaXMuZGlyZWN0aW9uJFxuICAgICAgLnBpcGUoXG4gICAgICAgIGZpbHRlcigoKSA9PiAhIXRoaXMuc29ydGFibGUpLFxuICAgICAgICBmaWx0ZXIoKCkgPT4gISF0aGlzLnNvcnRlckljb25Db21wb25lbnQpLFxuICAgICAgICB0YWtlVW50aWwodGhpcy5kZXN0cm95JClcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKGRpcmVjdGlvbikgPT4ge1xuICAgICAgICAvLyBVcGRhdGUgc29ydGVyIGljb24gYmFzZWQgb24gYWN0aXZlIGRpcmVjdGlvbi5cbiAgICAgICAgaWYgKGRpcmVjdGlvbiA9PT0gJ2FzY2VuZGluZycpIHtcbiAgICAgICAgICB0aGlzLnNvcnRlckljb25Db21wb25lbnQ/LnNldElucHV0KCdjb2xvckFzYycsICdjdXJyZW50Q29sb3InKTtcbiAgICAgICAgICB0aGlzLnNvcnRlckljb25Db21wb25lbnQ/LnNldElucHV0KCdjb2xvckRlc2MnLCAnbm9uZScpO1xuICAgICAgICB9IGVsc2UgaWYgKGRpcmVjdGlvbiA9PT0gJ2Rlc2NlbmRpbmcnKSB7XG4gICAgICAgICAgdGhpcy5zb3J0ZXJJY29uQ29tcG9uZW50Py5zZXRJbnB1dCgnY29sb3JBc2MnLCAnbm9uZScpO1xuICAgICAgICAgIHRoaXMuc29ydGVySWNvbkNvbXBvbmVudD8uc2V0SW5wdXQoJ2NvbG9yRGVzYycsICdjdXJyZW50Q29sb3InKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnNvcnRlckljb25Db21wb25lbnQ/LnNldElucHV0KCdjb2xvckFzYycsICdjdXJyZW50Q29sb3InKTtcbiAgICAgICAgICB0aGlzLnNvcnRlckljb25Db21wb25lbnQ/LnNldElucHV0KCdjb2xvckRlc2MnLCAnY3VycmVudENvbG9yJyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzWydzb3J0YWJsZSddKSB7XG4gICAgICBjb25zdCBzb3J0YWJsZSA9IGNoYW5nZXNbJ3NvcnRhYmxlJ10uY3VycmVudFZhbHVlO1xuICAgICAgc29ydGFibGUgPyB0aGlzLmFwcGVuZEVsZW1lbnQoKSA6IHRoaXMucmVtb3ZlRWxlbWVudCgpO1xuICAgIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMucmVtb3ZlRWxlbWVudCgpO1xuICAgIHRoaXMuZGVzdHJveSQubmV4dCh0cnVlKTtcbiAgICB0aGlzLmRlc3Ryb3kkLmNvbXBsZXRlKCk7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCdjbGljaycpXG4gIHByb3RlY3RlZCBvbkNsaWNrKCkge1xuICAgIGlmICghdGhpcy5zb3J0YWJsZSkgcmV0dXJuO1xuICAgIHRoaXMuZGlyZWN0aW9uJC5uZXh0KHRoaXMubmV4dERpcmVjdGlvbih0aGlzLmRpcmVjdGlvbiQudmFsdWUpKTtcbiAgICB0aGlzLnRhYmxlPy5bJ19zb3J0Q2hhbmdlJ10uZW1pdCh7XG4gICAgICBhY3RpdmVTb3J0ZXI6IHtcbiAgICAgICAgY29sdW1uOiB0aGlzLnNvcnRhYmxlLFxuICAgICAgICBkaXJlY3Rpb246IHRoaXMuZGlyZWN0aW9uJC52YWx1ZSxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGFwcGVuZEVsZW1lbnQoKSB7XG4gICAgaWYgKHRoaXMuc29ydGVySWNvbkNvbXBvbmVudCkgcmV0dXJuO1xuICAgIHRoaXMuc29ydGVySWNvbkNvbXBvbmVudCA9IHRoaXMuY3JlYXRlU29ydGVySWNvbkNvbXBvbmVudCgpO1xuICAgIGNvbnN0IGNlbGwgPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCBhcyBIVE1MVGFibGVDZWxsRWxlbWVudDtcbiAgICBjZWxsLmFwcGVuZENoaWxkKHRoaXMuc29ydGVySWNvbkNvbXBvbmVudC5sb2NhdGlvbi5uYXRpdmVFbGVtZW50KTtcbiAgICBjZWxsLmNsYXNzTGlzdC5hZGQoJ2QtdGFibGUtdGgtd2l0aC1zb3J0ZXInKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVtb3ZlRWxlbWVudCgpIHtcbiAgICB0aGlzLnNvcnRlckljb25Db21wb25lbnQ/LmRlc3Ryb3koKTtcbiAgICB0aGlzLnNvcnRlckljb25Db21wb25lbnQgPSB1bmRlZmluZWQ7XG4gICAgY29uc3QgY2VsbCA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50IGFzIEhUTUxUYWJsZUNlbGxFbGVtZW50O1xuICAgIGNlbGwuY2xhc3NMaXN0LnJlbW92ZSgnZC10YWJsZS10aC13aXRoLXNvcnRlcicpO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVTb3J0ZXJJY29uQ29tcG9uZW50KCkge1xuICAgIGNvbnN0IGNvbXBvbmVudCA9IGNyZWF0ZUNvbXBvbmVudChEb2t1U29ydGVySWNvbiwgeyBlbnZpcm9ubWVudEluamVjdG9yOiB0aGlzLmVudkluamVjdG9yIH0pO1xuICAgIChjb21wb25lbnQubG9jYXRpb24ubmF0aXZlRWxlbWVudCBhcyBIVE1MRWxlbWVudCkuY2xhc3NOYW1lID0gJ2QtdGFibGUtc29ydGVyLWljb24nO1xuICAgIHRoaXMuYXBwUmVmLmF0dGFjaFZpZXcoY29tcG9uZW50Lmhvc3RWaWV3KTtcbiAgICByZXR1cm4gY29tcG9uZW50O1xuICB9XG5cbiAgcHJpdmF0ZSBuZXh0RGlyZWN0aW9uKFxuICAgIGN1cnJlbnREaXJlY3Rpb246IERva3VBY3RpdmVTb3J0ZXJbJ2RpcmVjdGlvbiddXG4gICk6IERva3VBY3RpdmVTb3J0ZXJbJ2RpcmVjdGlvbiddIHtcbiAgICBjb25zdCBmbG93czogRG9rdUFjdGl2ZVNvcnRlclsnZGlyZWN0aW9uJ11bXSA9IFsnJywgJ2FzY2VuZGluZycsICdkZXNjZW5kaW5nJ107XG4gICAgY29uc3QgZmxvd0luZGV4ID0gZmxvd3MuZmluZEluZGV4KChmbG93KSA9PiBmbG93ID09PSBjdXJyZW50RGlyZWN0aW9uKTtcbiAgICBsZXQgbmV4dEluZGV4OiBudW1iZXIgPSBmbG93SW5kZXggKyAxO1xuICAgIGlmIChmbG93SW5kZXggPCAwIHx8IGZsb3dJbmRleCA+PSBmbG93cy5sZW5ndGggLSAxKSBuZXh0SW5kZXggPSAwO1xuICAgIHJldHVybiBmbG93c1tuZXh0SW5kZXhdO1xuICB9XG59XG4iXX0=