@taiga-ui/kit
Version:
Taiga UI Angular main components kit
105 lines • 19.7 kB
JavaScript
import { __decorate } from "tslib";
import { ContentChildren, DestroyRef, Directive, ElementRef, inject } from '@angular/core';
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
import { EMPTY_QUERY } from '@taiga-ui/cdk/constants';
import { tuiPreventDefault, tuiQueryListChanges, tuiTypedFromEvent, } from '@taiga-ui/cdk/observables';
import { tuiGetClosestFocusable } from '@taiga-ui/cdk/utils/focus';
import { tuiPure } from '@taiga-ui/cdk/utils/miscellaneous';
import { TuiDropdownDirective } from '@taiga-ui/core/directives/dropdown';
import { debounceTime, EMPTY, filter, map, merge, shareReplay, switchMap, take, tap, } from 'rxjs';
import * as i0 from "@angular/core";
class TuiDataListDropdownManager {
constructor() {
this.dropdowns = EMPTY_QUERY;
this.els = EMPTY_QUERY;
this.destroyRef = inject(DestroyRef);
}
ngAfterViewInit() {
this.right$.pipe(takeUntilDestroyed(this.destroyRef)).subscribe((index) => {
this.tryToFocus(index);
});
merge(this.immediate$, this.debounce$)
.pipe(switchMap((active) => {
this.dropdowns.forEach((dropdown, index) => {
dropdown.toggle(index === active);
});
const element = this.els.get(active);
const dropdown = this.dropdowns.get(active);
const ref = dropdown?.ref();
if (!element || !dropdown || !ref) {
return EMPTY;
}
const { nativeElement } = ref.location;
const mouseEnter$ = tuiTypedFromEvent(nativeElement, 'mouseenter').pipe(take(1));
const esc$ = merge(tuiTypedFromEvent(element.nativeElement, 'keydown'), tuiTypedFromEvent(nativeElement, 'keydown')).pipe(filter(({ key }) => key === 'Escape'));
return merge(mouseEnter$, esc$).pipe(tap((event) => {
if (dropdown.ref()) {
event.stopPropagation();
}
element.nativeElement.focus();
dropdown.toggle('offsetX' in event);
}));
}), takeUntilDestroyed(this.destroyRef))
.subscribe();
}
get elements$() {
return tuiQueryListChanges(this.els).pipe(map((array) => array.map(({ nativeElement }) => nativeElement)), shareReplay({ bufferSize: 1, refCount: true }));
}
get right$() {
return this.elements$.pipe(switchMap((elements) => merge(...elements.map((element, index) => tuiTypedFromEvent(element, 'keydown').pipe(filter(({ key }) => key === 'ArrowRight'), tuiPreventDefault(), map(() => index))))));
}
get immediate$() {
return this.elements$.pipe(switchMap((elements) => merge(...elements.map((element, index) => tuiTypedFromEvent(element, 'click').pipe(map(() => index))))));
}
get debounce$() {
return this.elements$.pipe(switchMap((elements) => merge(...elements.map((element, index) => merge(tuiTypedFromEvent(element, 'focus'), tuiTypedFromEvent(element, 'blur')).pipe(filter(({ relatedTarget }) => this.notInDropdown(relatedTarget, index)), map(({ type }) => (type === 'focus' ? index : NaN)))))), debounceTime(300));
}
notInDropdown(element, index) {
return !this.dropdowns
.get(index)
?.ref()
?.location.nativeElement.contains(element);
}
tryToFocus(index) {
const content = this.dropdowns.get(index)?.ref()?.location.nativeElement;
if (!content) {
return;
}
// First item is focus trap
const focusTrap = tuiGetClosestFocusable({ initial: content, root: content });
const item = tuiGetClosestFocusable({
initial: focusTrap || content,
root: content,
});
item?.focus();
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TuiDataListDropdownManager, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.2.12", type: TuiDataListDropdownManager, isStandalone: true, selector: "tui-data-list[tuiDataListDropdownManager]", queries: [{ propertyName: "dropdowns", predicate: TuiDropdownDirective, descendants: true }, { propertyName: "els", predicate: TuiDropdownDirective, descendants: true, read: ElementRef }], ngImport: i0 }); }
}
__decorate([
tuiPure
], TuiDataListDropdownManager.prototype, "elements$", null);
__decorate([
tuiPure
], TuiDataListDropdownManager.prototype, "right$", null);
__decorate([
tuiPure
], TuiDataListDropdownManager.prototype, "immediate$", null);
__decorate([
tuiPure
], TuiDataListDropdownManager.prototype, "debounce$", null);
export { TuiDataListDropdownManager };
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TuiDataListDropdownManager, decorators: [{
type: Directive,
args: [{
standalone: true,
selector: 'tui-data-list[tuiDataListDropdownManager]',
}]
}], propDecorators: { dropdowns: [{
type: ContentChildren,
args: [TuiDropdownDirective, { descendants: true }]
}], els: [{
type: ContentChildren,
args: [TuiDropdownDirective, { read: ElementRef, descendants: true }]
}], elements$: [], right$: [], immediate$: [], debounce$: [] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS1saXN0LWRyb3Bkb3duLW1hbmFnZXIuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMva2l0L2RpcmVjdGl2ZXMvZGF0YS1saXN0LWRyb3Bkb3duLW1hbmFnZXIvZGF0YS1saXN0LWRyb3Bkb3duLW1hbmFnZXIuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFDQSxPQUFPLEVBQUMsZUFBZSxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUN6RixPQUFPLEVBQUMsa0JBQWtCLEVBQUMsTUFBTSw0QkFBNEIsQ0FBQztBQUM5RCxPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0seUJBQXlCLENBQUM7QUFDcEQsT0FBTyxFQUNILGlCQUFpQixFQUNqQixtQkFBbUIsRUFDbkIsaUJBQWlCLEdBQ3BCLE1BQU0sMkJBQTJCLENBQUM7QUFDbkMsT0FBTyxFQUFDLHNCQUFzQixFQUFDLE1BQU0sMkJBQTJCLENBQUM7QUFDakUsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLG1DQUFtQyxDQUFDO0FBQzFELE9BQU8sRUFBQyxvQkFBb0IsRUFBQyxNQUFNLG9DQUFvQyxDQUFDO0FBRXhFLE9BQU8sRUFDSCxZQUFZLEVBQ1osS0FBSyxFQUNMLE1BQU0sRUFDTixHQUFHLEVBQ0gsS0FBSyxFQUNMLFdBQVcsRUFDWCxTQUFTLEVBQ1QsSUFBSSxFQUNKLEdBQUcsR0FDTixNQUFNLE1BQU0sQ0FBQzs7QUFFZCxNQUlhLDBCQUEwQjtJQUp2QztRQU1xQixjQUFTLEdBQW9DLFdBQVcsQ0FBQztRQUd6RCxRQUFHLEdBQXVDLFdBQVcsQ0FBQztRQUV0RCxlQUFVLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0tBbUlwRDtJQWpJVSxlQUFlO1FBQ2xCLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFD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O29CQUNQLFVBQVUsRUFBRSxJQUFJO29CQUNoQixRQUFRLEVBQUUsMkNBQTJDO2lCQUN4RDs4QkFHb0IsU0FBUztzQkFEekIsZUFBZTt1QkFBQyxvQkFBb0IsRUFBRSxFQUFDLFdBQVcsRUFBRSxJQUFJLEVBQUM7Z0JBSXpDLEdBQUc7c0JBRG5CLGVBQWU7dUJBQUMsb0JBQW9CLEVBQUUsRUFBQyxJQUFJLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUM7Z0JBb0RoRSxTQUFTLE1BUVQsTUFBTSxNQWlCTixVQUFVLE1BYVYsU0FBUyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHtBZnRlclZpZXdJbml0LCBRdWVyeUxpc3R9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtDb250ZW50Q2hpbGRyZW4sIERlc3Ryb3lSZWYsIERpcmVjdGl2ZSwgRWxlbWVudFJlZiwgaW5qZWN0fSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7dGFrZVVudGlsRGVzdHJveWVkfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XG5pbXBvcnQge0VNUFRZX1FVRVJZfSBmcm9tICdAdGFpZ2EtdWkvY2RrL2NvbnN0YW50cyc7XG5pbXBvcnQge1xuICAgIHR1aVByZXZlbnREZWZhdWx0LFxuICAgIHR1aVF1ZXJ5TGlzdENoYW5nZXMsXG4gICAgdHVpVHlwZWRGcm9tRXZlbnQsXG59IGZyb20gJ0B0YWlnYS11aS9jZGsvb2JzZXJ2YWJsZXMnO1xuaW1wb3J0IHt0dWlHZXRDbG9zZXN0Rm9jdXNhYmxlfSBmcm9tICdAdGFpZ2EtdWkvY2RrL3V0aWxzL2ZvY3VzJztcbmltcG9ydCB7dHVpUHVyZX0gZnJvbSAnQHRhaWdhLXVpL2Nkay91dGlscy9taXNjZWxsYW5lb3VzJztcbmltcG9ydCB7VHVpRHJvcGRvd25EaXJlY3RpdmV9IGZyb20gJ0B0YWlnYS11aS9jb3JlL2RpcmVjdGl2ZXMvZHJvcGRvd24nO1xuaW1wb3J0IHR5cGUge09ic2VydmFibGV9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtcbiAgICBkZWJvdW5jZVRpbWUsXG4gICAgRU1QVFksXG4gICAgZmlsdGVyLFxuICAgIG1hcCxcbiAgICBtZXJnZSxcbiAgICBzaGFyZVJlcGxheSxcbiAgICBzd2l0Y2hNYXAsXG4gICAgdGFrZSxcbiAgICB0YXAsXG59IGZyb20gJ3J4anMnO1xuXG5ARGlyZWN0aXZlKHtcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIHNlbGVjdG9yOiAndHVpLWRhdGEtbGlzdFt0dWlEYXRhTGlzdERyb3Bkb3duTWFuYWdlcl0nLFxufSlcbmV4cG9ydCBjbGFzcyBUdWlEYXRhTGlzdERyb3Bkb3duTWFuYWdlciBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQge1xuICAgIEBDb250ZW50Q2hpbGRyZW4oVHVpRHJvcGRvd25EaXJlY3RpdmUsIHtkZXNjZW5kYW50czogdHJ1ZX0pXG4gICAgcHJpdmF0ZSByZWFkb25seSBkcm9wZG93bnM6IFF1ZXJ5TGlzdDxUdWlEcm9wZG93bkRpcmVjdGl2ZT4gPSBFTVBUWV9RVUVSWTtcblxuICAgIEBDb250ZW50Q2hpbGRyZW4oVHVpRHJvcGRvd25EaXJlY3RpdmUsIHtyZWFkOiBFbGVtZW50UmVmLCBkZXNjZW5kYW50czogdHJ1ZX0pXG4gICAgcHJpdmF0ZSByZWFkb25seSBlbHM6IFF1ZXJ5TGlzdDxFbGVtZW50UmVmPEhUTUxFbGVtZW50Pj4gPSBFTVBUWV9RVUVSWTtcblxuICAgIHByaXZhdGUgcmVhZG9ubHkgZGVzdHJveVJlZiA9IGluamVjdChEZXN0cm95UmVmKTtcblxuICAgIHB1YmxpYyBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMucmlnaHQkLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZikpLnN1YnNjcmliZSgoaW5kZXgpID0+IHtcbiAgICAgICAgICAgIHRoaXMudHJ5VG9Gb2N1cyhpbmRleCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIG1lcmdlKHRoaXMuaW1tZWRpYXRlJCwgdGhpcy5kZWJvdW5jZSQpXG4gICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICBzd2l0Y2hNYXAoKGFjdGl2ZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRyb3Bkb3ducy5mb3JFYWNoKChkcm9wZG93biwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRyb3Bkb3duLnRvZ2dsZShpbmRleCA9PT0gYWN0aXZlKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMuZWxzLmdldChhY3RpdmUpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBkcm9wZG93biA9IHRoaXMuZHJvcGRvd25zLmdldChhY3RpdmUpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZWYgPSBkcm9wZG93bj8ucmVmKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFlbGVtZW50IHx8ICFkcm9wZG93biB8fCAhcmVmKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRU1QVFk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBjb25zdCB7bmF0aXZlRWxlbWVudH0gPSByZWYubG9jYXRpb247XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG1vdXNlRW50ZXIkID0gdHVpVHlwZWRGcm9tRXZlbnQoXG4gICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmVFbGVtZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgJ21vdXNlZW50ZXInLFxuICAgICAgICAgICAgICAgICAgICApLnBpcGUodGFrZSgxKSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVzYyQgPSBtZXJnZShcbiAgICAgICAgICAgICAgICAgICAgICAgIHR1aVR5cGVkRnJvbUV2ZW50KGVsZW1lbnQubmF0aXZlRWxlbWVudCwgJ2tleWRvd24nKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHR1aVR5cGVkRnJvbUV2ZW50KG5hdGl2ZUVsZW1lbnQsICdrZXlkb3duJyksXG4gICAgICAgICAgICAgICAgICAgICkucGlwZShmaWx0ZXIoKHtrZXl9KSA9PiBrZXkgPT09ICdFc2NhcGUnKSk7XG5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1lcmdlKG1vdXNlRW50ZXIkLCBlc2MkKS5waXBlKFxuICAgICAgICAgICAgICAgICAgICAgICAgdGFwKChldmVudCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkcm9wZG93bi5yZWYoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcm9wZG93bi50b2dnbGUoJ29mZnNldFgnIGluIGV2ZW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpLFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgpO1xuICAgIH1cblxuICAgIEB0dWlQdXJlXG4gICAgcHJpdmF0ZSBnZXQgZWxlbWVudHMkKCk6IE9ic2VydmFibGU8cmVhZG9ubHkgSFRNTEVsZW1lbnRbXT4ge1xuICAgICAgICByZXR1cm4gdHVpUXVlcnlMaXN0Q2hhbmdlcyh0aGlzLmVscykucGlwZShcbiAgICAgICAgICAgIG1hcCgoYXJyYXkpID0+IGFycmF5Lm1hcCgoe25hdGl2ZUVsZW1lbnR9KSA9PiBuYXRpdmVFbGVtZW50KSksXG4gICAgICAgICAgICBzaGFyZVJlcGxheSh7YnVmZmVyU2l6ZTogMSwgcmVmQ291bnQ6IHRydWV9KSxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBAdHVpUHVyZVxuICAgIHByaXZhdGUgZ2V0IHJpZ2h0JCgpOiBPYnNlcnZhYmxlPG51bWJlcj4ge1xuICAgICAgICByZXR1cm4gdGhpcy5lbGVtZW50cyQucGlwZShcbiAgICAgICAgICAgIHN3aXRjaE1hcCgoZWxlbWVudHMpID0+XG4gICAgICAgICAgICAgICAgbWVyZ2UoXG4gICAgICAgICAgICAgICAgICAgIC4uLmVsZW1lbnRzLm1hcCgoZWxlbWVudCwgaW5kZXgpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICB0dWlUeXBlZEZyb21FdmVudChlbGVtZW50LCAna2V5ZG93bicpLnBpcGUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyKCh7a2V5fSkgPT4ga2V5ID09PSAnQXJyb3dSaWdodCcpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR1aVByZXZlbnREZWZhdWx0KCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwKCgpID0+IGluZGV4KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICksXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgQHR1aVB1cmVcbiAgICBwcml2YXRlIGdldCBpbW1lZGlhdGUkKCk6IE9ic2VydmFibGU8bnVtYmVyPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmVsZW1lbnRzJC5waXBlKFxuICAgICAgICAgICAgc3dpdGNoTWFwKChlbGVtZW50cykgPT5cbiAgICAgICAgICAgICAgICBtZXJnZShcbiAgICAgICAgICAgICAgICAgICAgLi4uZWxlbWVudHMubWFwKChlbGVtZW50LCBpbmRleCkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgIHR1aVR5cGVkRnJvbUV2ZW50KGVsZW1lbnQsICdjbGljaycpLnBpcGUobWFwKCgpID0+IGluZGV4KSksXG4gICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICksXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgQHR1aVB1cmVcbiAgICBwcml2YXRlIGdldCBkZWJvdW5jZSQoKTogT2JzZXJ2YWJsZTxudW1iZXI+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudHMkLnBpcGUoXG4gICAgICAgICAgICBzd2l0Y2hNYXAoKGVsZW1lbnRzKSA9PlxuICAgICAgICAgICAgICAgIG1lcmdlKFxuICAgICAgICAgICAgICAgICAgICAuLi5lbGVtZW50cy5tYXAoKGVsZW1lbnQsIGluZGV4KSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgbWVyZ2UoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHVpVHlwZWRGcm9tRXZlbnQoZWxlbWVudCwgJ2ZvY3VzJyksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHVpVHlwZWRGcm9tRXZlbnQoZWxlbWVudCwgJ2JsdXInKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICkucGlwZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoKHtyZWxhdGVkVGFyZ2V0fSkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ub3RJbkRyb3Bkb3duKHJlbGF0ZWRUYXJnZXQsIGluZGV4KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcCgoe3R5cGV9KSA9PiAodHlwZSA9PT0gJ2ZvY3VzJyA/IGluZGV4IDogTmFOKSksXG4gICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgZGVib3VuY2VUaW1lKDMwMCksXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBub3RJbkRyb3Bkb3duKGVsZW1lbnQ6IEV2ZW50VGFyZ2V0IHwgbnVsbCwgaW5kZXg6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gIXRoaXMuZHJvcGRvd25zXG4gICAgICAgICAgICAuZ2V0KGluZGV4KVxuICAgICAgICAgICAgPy5yZWYoKVxuICAgICAgICAgICAgPy5sb2NhdGlvbi5uYXRpdmVFbGVtZW50LmNvbnRhaW5zKGVsZW1lbnQpO1xuICAgIH1cblxuICAgIHByaXZhdGUgdHJ5VG9Gb2N1cyhpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGNvbnRlbnQgPSB0aGlzLmRyb3Bkb3ducy5nZXQoaW5kZXgpPy5yZWYoKT8ubG9jYXRpb24ubmF0aXZlRWxlbWVudDtcblxuICAgICAgICBpZiAoIWNvbnRlbnQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEZpcnN0IGl0ZW0gaXMgZm9jdXMgdHJhcFxuICAgICAgICBjb25zdCBmb2N1c1RyYXAgPSB0dWlHZXRDbG9zZXN0Rm9jdXNhYmxlKHtpbml0aWFsOiBjb250ZW50LCByb290OiBjb250ZW50fSk7XG4gICAgICAgIGNvbnN0IGl0ZW0gPSB0dWlHZXRDbG9zZXN0Rm9jdXNhYmxlKHtcbiAgICAgICAgICAgIGluaXRpYWw6IGZvY3VzVHJhcCB8fCBjb250ZW50LFxuICAgICAgICAgICAgcm9vdDogY29udGVudCxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaXRlbT8uZm9jdXMoKTtcbiAgICB9XG59XG4iXX0=