UNPKG

material-dynamic-table

Version:

Dynamic table component for angular built on top of angular material table. It offers sorting, pagination, filtering per column and the ability to specify content types and components used for displaying them.

146 lines 25.2 kB
/** * @license * Copyright Google LLC All Rights Reserved. * * Use of this source code is governed by an MIT-style license that can be * found in the LICENSE file at https://angular.io/license */ import { Directive } from '@angular/core'; import { coerceCssPixelValue } from '@angular/cdk/coercion'; import { ESCAPE } from '@angular/cdk/keycodes'; import { fromEvent, Subject, merge } from 'rxjs'; import { distinctUntilChanged, filter, map, mapTo, pairwise, startWith, takeUntil, } from 'rxjs/operators'; import { closest } from './closest'; import { HEADER_CELL_SELECTOR } from './selectors'; import * as i0 from "@angular/core"; // TODO: Take another look at using cdk drag drop. IIRC I ran into a couple // good reasons for not using it but I don't remember what they were at this point. /** * Base class for a component shown over the edge of a resizable column that is responsible * for handling column resize mouse events and displaying any visible UI on the column edge. */ export class ResizeOverlayHandle { constructor() { this.destroyed = new Subject(); } ngAfterViewInit() { this._listenForMouseEvents(); } ngOnDestroy() { this.destroyed.next(); this.destroyed.complete(); } _listenForMouseEvents() { this.ngZone.runOutsideAngular(() => { fromEvent(this.elementRef.nativeElement, 'mouseenter') .pipe(mapTo(this.resizeRef.origin.nativeElement), takeUntil(this.destroyed)) .subscribe(cell => this.eventDispatcher.headerCellHovered.next(cell)); fromEvent(this.elementRef.nativeElement, 'mouseleave') .pipe(map(event => event.relatedTarget && closest(event.relatedTarget, HEADER_CELL_SELECTOR)), takeUntil(this.destroyed)) .subscribe(cell => this.eventDispatcher.headerCellHovered.next(cell)); fromEvent(this.elementRef.nativeElement, 'mousedown') .pipe(takeUntil(this.destroyed)) .subscribe(mousedownEvent => { this._dragStarted(mousedownEvent); }); }); } _dragStarted(mousedownEvent) { // Only allow dragging using the left mouse button. if (mousedownEvent.button !== 0) { return; } const mouseup = fromEvent(this.document, 'mouseup'); const mousemove = fromEvent(this.document, 'mousemove'); const escape = fromEvent(this.document, 'keyup').pipe(filter(event => event.keyCode === ESCAPE)); const startX = mousedownEvent.screenX; const initialSize = this._getOriginWidth(); let overlayOffset = 0; let originOffset = this._getOriginOffset(); let size = initialSize; let overshot = 0; this.updateResizeActive(true); mouseup.pipe(takeUntil(merge(escape, this.destroyed))).subscribe(({ screenX }) => { this.styleScheduler.scheduleEnd(() => { this._notifyResizeEnded(size, screenX !== startX); }); }); escape.pipe(takeUntil(merge(mouseup, this.destroyed))).subscribe(() => { this._notifyResizeEnded(initialSize); }); mousemove .pipe(map(({ screenX }) => screenX), startWith(startX), distinctUntilChanged(), pairwise(), takeUntil(merge(mouseup, escape, this.destroyed))) .subscribe(([prevX, currX]) => { let deltaX = currX - prevX; // If the mouse moved further than the resize was able to match, limit the // movement of the overlay to match the actual size and position of the origin. if (overshot !== 0) { if ((overshot < 0 && deltaX < 0) || (overshot > 0 && deltaX > 0)) { overshot += deltaX; return; } else { const remainingOvershot = overshot + deltaX; overshot = overshot > 0 ? Math.max(remainingOvershot, 0) : Math.min(remainingOvershot, 0); deltaX = remainingOvershot - overshot; if (deltaX === 0) { return; } } } let computedNewSize = size + (this._isLtr() ? deltaX : -deltaX); computedNewSize = Math.min(Math.max(computedNewSize, this.resizeRef.minWidthPx, 0), this.resizeRef.maxWidthPx); this.resizeNotifier.triggerResize.next({ columnId: this.columnDef.name, size: computedNewSize, previousSize: size, isStickyColumn: this.columnDef.sticky || this.columnDef.stickyEnd, }); this.styleScheduler.scheduleEnd(() => { const originNewSize = this._getOriginWidth(); const originNewOffset = this._getOriginOffset(); const originOffsetDeltaX = originNewOffset - originOffset; const originSizeDeltaX = originNewSize - size; size = originNewSize; originOffset = originNewOffset; overshot += deltaX + (this._isLtr() ? -originSizeDeltaX : originSizeDeltaX); overlayOffset += originOffsetDeltaX + (this._isLtr() ? originSizeDeltaX : 0); this._updateOverlayOffset(overlayOffset); }); }); } updateResizeActive(active) { this.eventDispatcher.overlayHandleActiveForCell.next(active ? this.resizeRef.origin.nativeElement : null); } _getOriginWidth() { return this.resizeRef.origin.nativeElement.offsetWidth; } _getOriginOffset() { return this.resizeRef.origin.nativeElement.offsetLeft; } _updateOverlayOffset(offset) { this.resizeRef.overlayRef.overlayElement.style.transform = `translateX(${coerceCssPixelValue(offset)})`; } _isLtr() { return this.directionality.value === 'ltr'; } _notifyResizeEnded(size, completedSuccessfully = false) { this.updateResizeActive(false); this.ngZone.run(() => { const sizeMessage = { columnId: this.columnDef.name, size }; if (completedSuccessfully) { this.resizeNotifier.resizeCompleted.next(sizeMessage); } else { this.resizeNotifier.resizeCanceled.next(sizeMessage); } }); } /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ResizeOverlayHandle, deps: [], target: i0.ɵɵFactoryTarget.Directive }); } /** @nocollapse */ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.13", type: ResizeOverlayHandle, ngImport: i0 }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ResizeOverlayHandle, decorators: [{ type: Directive }] }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2RrLW92ZXJsYXktaGFuZGxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbWF0ZXJpYWwtZHluYW1pYy10YWJsZS9zcmMvbGliL2NvbHVtbi1yZXNpemUvY2RrLW92ZXJsYXktaGFuZGxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7R0FNRztBQUVILE9BQU8sRUFBaUIsU0FBUyxFQUFpQyxNQUFNLGVBQWUsQ0FBQztBQUN4RixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUU1RCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFL0MsT0FBTyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ2pELE9BQU8sRUFDTCxvQkFBb0IsRUFDcEIsTUFBTSxFQUNOLEdBQUcsRUFDSCxLQUFLLEVBQ0wsUUFBUSxFQUNSLFNBQVMsRUFDVCxTQUFTLEdBQ1YsTUFBTSxnQkFBZ0IsQ0FBQztBQUV4QixPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBRXBDLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGFBQWEsQ0FBQzs7QUFLbkQsMkVBQTJFO0FBQzNFLG1GQUFtRjtBQUNuRjs7O0dBR0c7QUFFSCxNQUFNLE9BQWdCLG1CQUFtQjtJQUR6QztRQUVxQixjQUFTLEdBQUcsSUFBSSxPQUFPLEVBQVEsQ0FBQztLQTJLcEQ7SUEvSkMsZUFBZTtRQUNiLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO0lBQy9CLENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUN0QixJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQzVCLENBQUM7SUFFTyxxQkFBcUI7UUFDM0IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FB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QUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRTtZQUNuQixNQUFNLFdBQVcsR0FBRyxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQztZQUM1RCxJQUFJLHFCQUFxQixFQUFFLENBQUM7Z0JBQzFCLElBQUksQ0FBQyxjQUFjLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUN4RCxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sSUFBSSxDQUFDLGNBQWMsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQ3ZELENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7a0lBM0ttQixtQkFBbUI7c0hBQW5CLG1CQUFtQjs7NEZBQW5CLG1CQUFtQjtrQkFEeEMsU0FBUyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLlxyXG4gKlxyXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxyXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXHJcbiAqL1xyXG5cclxuaW1wb3J0IHsgQWZ0ZXJWaWV3SW5pdCwgRGlyZWN0aXZlLCBFbGVtZW50UmVmLCBPbkRlc3Ryb3ksIE5nWm9uZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBjb2VyY2VDc3NQaXhlbFZhbHVlIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2NvZXJjaW9uJztcclxuaW1wb3J0IHsgRGlyZWN0aW9uYWxpdHkgfSBmcm9tICdAYW5ndWxhci9jZGsvYmlkaSc7XHJcbmltcG9ydCB7IEVTQ0FQRSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9rZXljb2Rlcyc7XHJcbmltcG9ydCB7IENka0NvbHVtbkRlZiwgX0NvYWxlc2NlZFN0eWxlU2NoZWR1bGVyIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL3RhYmxlJztcclxuaW1wb3J0IHsgZnJvbUV2ZW50LCBTdWJqZWN0LCBtZXJnZSB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQge1xyXG4gIGRpc3RpbmN0VW50aWxDaGFuZ2VkLFxyXG4gIGZpbHRlcixcclxuICBtYXAsXHJcbiAgbWFwVG8sXHJcbiAgcGFpcndpc2UsXHJcbiAgc3RhcnRXaXRoLFxyXG4gIHRha2VVbnRpbCxcclxufSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcblxyXG5pbXBvcnQgeyBjbG9zZXN0IH0gZnJvbSAnLi9jbG9zZXN0JztcclxuXHJcbmltcG9ydCB7IEhFQURFUl9DRUxMX1NFTEVDVE9SIH0gZnJvbSAnLi9zZWxlY3RvcnMnO1xyXG5pbXBvcnQgeyBDb2x1bW5SZXNpemVOb3RpZmllclNvdXJjZSB9IGZyb20gJy4vY29sdW1uLXJlc2l6ZS1ub3RpZmllcic7XHJcbmltcG9ydCB7IEhlYWRlclJvd0V2ZW50RGlzcGF0Y2hlciB9IGZyb20gJy4vZXZlbnQtZGlzcGF0Y2hlcic7XHJcbmltcG9ydCB7IFJlc2l6ZVJlZiB9IGZyb20gJy4vcmVzaXplLXJlZic7XHJcblxyXG4vLyBUT0RPOiBUYWtlIGFub3RoZXIgbG9vayBhdCB1c2luZyBjZGsgZHJhZyBkcm9wLiBJSVJDIEkgcmFuIGludG8gYSBjb3VwbGVcclxuLy8gZ29vZCByZWFzb25zIGZvciBub3QgdXNpbmcgaXQgYnV0IEkgZG9uJ3QgcmVtZW1iZXIgd2hhdCB0aGV5IHdlcmUgYXQgdGhpcyBwb2ludC5cclxuLyoqXHJcbiAqIEJhc2UgY2xhc3MgZm9yIGEgY29tcG9uZW50IHNob3duIG92ZXIgdGhlIGVkZ2Ugb2YgYSByZXNpemFibGUgY29sdW1uIHRoYXQgaXMgcmVzcG9uc2libGVcclxuICogZm9yIGhhbmRsaW5nIGNvbHVtbiByZXNpemUgbW91c2UgZXZlbnRzIGFuZCBkaXNwbGF5aW5nIGFueSB2aXNpYmxlIFVJIG9uIHRoZSBjb2x1bW4gZWRnZS5cclxuICovXHJcbkBEaXJlY3RpdmUoKVxyXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgUmVzaXplT3ZlcmxheUhhbmRsZSBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSB7XHJcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGRlc3Ryb3llZCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XHJcblxyXG4gIHByb3RlY3RlZCBhYnN0cmFjdCByZWFkb25seSBjb2x1bW5EZWY6IENka0NvbHVtbkRlZjtcclxuICBwcm90ZWN0ZWQgYWJzdHJhY3QgcmVhZG9ubHkgZG9jdW1lbnQ6IERvY3VtZW50O1xyXG4gIHByb3RlY3RlZCBhYnN0cmFjdCByZWFkb25seSBkaXJlY3Rpb25hbGl0eTogRGlyZWN0aW9uYWxpdHk7XHJcbiAgcHJvdGVjdGVkIGFic3RyYWN0IHJlYWRvbmx5IGVsZW1lbnRSZWY6IEVsZW1lbnRSZWY7XHJcbiAgcHJvdGVjdGVkIGFic3RyYWN0IHJlYWRvbmx5IGV2ZW50RGlzcGF0Y2hlcjogSGVhZGVyUm93RXZlbnREaXNwYXRjaGVyO1xyXG4gIHByb3RlY3RlZCBhYnN0cmFjdCByZWFkb25seSBuZ1pvbmU6IE5nWm9uZTtcclxuICBwcm90ZWN0ZWQgYWJzdHJhY3QgcmVhZG9ubHkgcmVzaXplTm90aWZpZXI6IENvbHVtblJlc2l6ZU5vdGlmaWVyU291cmNlO1xyXG4gIHByb3RlY3RlZCBhYnN0cmFjdCByZWFkb25seSByZXNpemVSZWY6IFJlc2l6ZVJlZjtcclxuICBwcm90ZWN0ZWQgYWJzdHJhY3QgcmVhZG9ubHkgc3R5bGVTY2hlZHVsZXI6IF9Db2FsZXNjZWRTdHlsZVNjaGVkdWxlcjtcclxuXHJcbiAgbmdBZnRlclZpZXdJbml0KCkge1xyXG4gICAgdGhpcy5fbGlzdGVuRm9yTW91c2VFdmVudHMoKTtcclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCkge1xyXG4gICAgdGhpcy5kZXN0cm95ZWQubmV4dCgpO1xyXG4gICAgdGhpcy5kZXN0cm95ZWQuY29tcGxldGUoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2xpc3RlbkZvck1vdXNlRXZlbnRzKCkge1xyXG4gICAgdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xyXG4gICAgICBmcm9tRXZlbnQ8TW91c2VFdmVudD4odGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQhLCAnbW91c2VlbnRlcicpXHJcbiAgICAgICAgLnBpcGUobWFwVG8odGhpcy5yZXNpemVSZWYub3JpZ2luLm5hdGl2ZUVsZW1lbnQhKSwgdGFrZVVudGlsKHRoaXMuZGVzdHJveWVkKSlcclxuICAgICAgICAuc3Vic2NyaWJlKGNlbGwgPT4gdGhpcy5ldmVudERpc3BhdGNoZXIuaGVhZGVyQ2VsbEhvdmVyZWQubmV4dChjZWxsKSk7XHJcblxyXG4gICAgICBmcm9tRXZlbnQ8TW91c2VFdmVudD4odGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQhLCAnbW91c2VsZWF2ZScpXHJcbiAgICAgICAgLnBpcGUoXHJcbiAgICAgICAgICBtYXAoXHJcbiAgICAgICAgICAgIGV2ZW50ID0+XHJcbiAgICAgICAgICAgICAgZXZlbnQucmVsYXRlZFRhcmdldCAmJiBjbG9zZXN0KGV2ZW50LnJlbGF0ZWRUYXJnZXQgYXMgRWxlbWVudCwgSEVBREVSX0NFTExfU0VMRUNUT1IpLFxyXG4gICAgICAgICAgKSxcclxuICAgICAgICAgIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3llZCksXHJcbiAgICAgICAgKVxyXG4gICAgICAgIC5zdWJzY3JpYmUoY2VsbCA9PiB0aGlzLmV2ZW50RGlzcGF0Y2hlci5oZWFkZXJDZWxsSG92ZXJlZC5uZXh0KGNlbGwpKTtcclxuXHJcbiAgICAgIGZyb21FdmVudDxNb3VzZUV2ZW50Pih0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCEsICdtb3VzZWRvd24nKVxyXG4gICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3llZCkpXHJcbiAgICAgICAgLnN1YnNjcmliZShtb3VzZWRvd25FdmVudCA9PiB7XHJcbiAgICAgICAgICB0aGlzLl9kcmFnU3RhcnRlZChtb3VzZWRvd25FdmVudCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2RyYWdTdGFydGVkKG1vdXNlZG93bkV2ZW50OiBNb3VzZUV2ZW50KSB7XHJcbiAgICAvLyBPbmx5IGFsbG93IGRyYWdnaW5nIHVzaW5nIHRoZSBsZWZ0IG1vdXNlIGJ1dHRvbi5cclxuICAgIGlmIChtb3VzZWRvd25FdmVudC5idXR0b24gIT09IDApIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IG1vdXNldXAgPSBmcm9tRXZlbnQ8TW91c2VFdmVudD4odGhpcy5kb2N1bWVudCwgJ21vdXNldXAnKTtcclxuICAgIGNvbnN0IG1vdXNlbW92ZSA9IGZyb21FdmVudDxNb3VzZUV2ZW50Pih0aGlzLmRvY3VtZW50LCAnbW91c2Vtb3ZlJyk7XHJcbiAgICBjb25zdCBlc2NhcGUgPSBmcm9tRXZlbnQ8S2V5Ym9hcmRFdmVudD4odGhpcy5kb2N1bWVudCwgJ2tleXVwJykucGlwZShcclxuICAgICAgZmlsdGVyKGV2ZW50ID0+IGV2ZW50LmtleUNvZGUgPT09IEVTQ0FQRSksXHJcbiAgICApO1xyXG5cclxuICAgIGNvbnN0IHN0YXJ0WCA9IG1vdXNlZG93bkV2ZW50LnNjcmVlblg7XHJcblxyXG4gICAgY29uc3QgaW5pdGlhbFNpemUgPSB0aGlzLl9nZXRPcmlnaW5XaWR0aCgpO1xyXG4gICAgbGV0IG92ZXJsYXlPZmZzZXQgPSAwO1xyXG4gICAgbGV0IG9yaWdpbk9mZnNldCA9IHRoaXMuX2dldE9yaWdpbk9mZnNldCgpO1xyXG4gICAgbGV0IHNpemUgPSBpbml0aWFsU2l6ZTtcclxuICAgIGxldCBvdmVyc2hvdCA9IDA7XHJcblxyXG4gICAgdGhpcy51cGRhdGVSZXNpemVBY3RpdmUodHJ1ZSk7XHJcblxyXG4gICAgbW91c2V1cC5waXBlKHRha2VVbnRpbChtZXJnZShlc2NhcGUsIHRoaXMuZGVzdHJveWVkKSkpLnN1YnNjcmliZSgoeyBzY3JlZW5YIH0pID0+IHtcclxuICAgICAgdGhpcy5zdHlsZVNjaGVkdWxlci5zY2hlZHVsZUVuZCgoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5fbm90aWZ5UmVzaXplRW5kZWQoc2l6ZSwgc2NyZWVuWCAhPT0gc3RhcnRYKTtcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuXHJcbiAgICBlc2NhcGUucGlwZSh0YWtlVW50aWwobWVyZ2UobW91c2V1cCwgdGhpcy5kZXN0cm95ZWQpKSkuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgdGhpcy5fbm90aWZ5UmVzaXplRW5kZWQoaW5pdGlhbFNpemUpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgbW91c2Vtb3ZlXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIG1hcCgoeyBzY3JlZW5YIH0pID0+IHNjcmVlblgpLFxyXG4gICAgICAgIHN0YXJ0V2l0aChzdGFydFgpLFxyXG4gICAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXHJcbiAgICAgICAgcGFpcndpc2UoKSxcclxuICAgICAgICB0YWtlVW50aWwobWVyZ2UobW91c2V1cCwgZXNjYXBlLCB0aGlzLmRlc3Ryb3llZCkpLFxyXG4gICAgICApXHJcbiAgICAgIC5zdWJzY3JpYmUoKFtwcmV2WCwgY3VyclhdKSA9PiB7XHJcbiAgICAgICAgbGV0IGRlbHRhWCA9IGN1cnJYIC0gcHJldlg7XHJcblxyXG4gICAgICAgIC8vIElmIHRoZSBtb3VzZSBtb3ZlZCBmdXJ0aGVyIHRoYW4gdGhlIHJlc2l6ZSB3YXMgYWJsZSB0byBtYXRjaCwgbGltaXQgdGhlXHJcbiAgICAgICAgLy8gbW92ZW1lbnQgb2YgdGhlIG92ZXJsYXkgdG8gbWF0Y2ggdGhlIGFjdHVhbCBzaXplIGFuZCBwb3NpdGlvbiBvZiB0aGUgb3JpZ2luLlxyXG4gICAgICAgIGlmIChvdmVyc2hvdCAhPT0gMCkge1xyXG4gICAgICAgICAgaWYgKChvdmVyc2hvdCA8IDAgJiYgZGVsdGFYIDwgMCkgfHwgKG92ZXJzaG90ID4gMCAmJiBkZWx0YVggPiAwKSkge1xyXG4gICAgICAgICAgICBvdmVyc2hvdCArPSBkZWx0YVg7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlbWFpbmluZ092ZXJzaG90ID0gb3ZlcnNob3QgKyBkZWx0YVg7XHJcbiAgICAgICAgICAgIG92ZXJzaG90ID1cclxuICAgICAgICAgICAgICBvdmVyc2hvdCA+IDAgPyBNYXRoLm1heChyZW1haW5pbmdPdmVyc2hvdCwgMCkgOiBNYXRoLm1pbihyZW1haW5pbmdPdmVyc2hvdCwgMCk7XHJcbiAgICAgICAgICAgIGRlbHRhWCA9IHJlbWFpbmluZ092ZXJzaG90IC0gb3ZlcnNob3Q7XHJcblxyXG4gICAgICAgICAgICBpZiAoZGVsdGFYID09PSAwKSB7XHJcbiAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgY29tcHV0ZWROZXdTaXplOiBudW1iZXIgPSBzaXplICsgKHRoaXMuX2lzTHRyKCkgPyBkZWx0YVggOiAtZGVsdGFYKTtcclxuICAgICAgICBjb21wdXRlZE5ld1NpemUgPSBNYXRoLm1pbihcclxuICAgICAgICAgIE1hdGgubWF4KGNvbXB1dGVkTmV3U2l6ZSwgdGhpcy5yZXNpemVSZWYubWluV2lkdGhQeCwgMCksXHJcbiAgICAgICAgICB0aGlzLnJlc2l6ZVJlZi5tYXhXaWR0aFB4LFxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIHRoaXMucmVzaXplTm90aWZpZXIudHJpZ2dlclJlc2l6ZS5uZXh0KHtcclxuICAgICAgICAgIGNvbHVtbklkOiB0aGlzLmNvbHVtbkRlZi5uYW1lLFxyXG4gICAgICAgICAgc2l6ZTogY29tcHV0ZWROZXdTaXplLFxyXG4gICAgICAgICAgcHJldmlvdXNTaXplOiBzaXplLFxyXG4gICAgICAgICAgaXNTdGlja3lDb2x1bW46IHRoaXMuY29sdW1uRGVmLnN0aWNreSB8fCB0aGlzLmNvbHVtbkRlZi5zdGlja3lFbmQsXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuc3R5bGVTY2hlZHVsZXIuc2NoZWR1bGVFbmQoKCkgPT4ge1xyXG4gICAgICAgICAgY29uc3Qgb3JpZ2luTmV3U2l6ZSA9IHRoaXMuX2dldE9yaWdpbldpZHRoKCk7XHJcbiAgICAgICAgICBjb25zdCBvcmlnaW5OZXdPZmZzZXQgPSB0aGlzLl9nZXRPcmlnaW5PZmZzZXQoKTtcclxuICAgICAgICAgIGNvbnN0IG9yaWdpbk9mZnNldERlbHRhWCA9IG9yaWdpbk5ld09mZnNldCAtIG9yaWdpbk9mZnNldDtcclxuICAgICAgICAgIGNvbnN0IG9yaWdpblNpemVEZWx0YVggPSBvcmlnaW5OZXdTaXplIC0gc2l6ZTtcclxuICAgICAgICAgIHNpemUgPSBvcmlnaW5OZXdTaXplO1xyXG4gICAgICAgICAgb3JpZ2luT2Zmc2V0ID0gb3JpZ2luTmV3T2Zmc2V0O1xyXG5cclxuICAgICAgICAgIG92ZXJzaG90ICs9IGRlbHRhWCArICh0aGlzLl9pc0x0cigpID8gLW9yaWdpblNpemVEZWx0YVggOiBvcmlnaW5TaXplRGVsdGFYKTtcclxuICAgICAgICAgIG92ZXJsYXlPZmZzZXQgKz0gb3JpZ2luT2Zmc2V0RGVsdGFYICsgKHRoaXMuX2lzTHRyKCkgPyBvcmlnaW5TaXplRGVsdGFYIDogMCk7XHJcblxyXG4gICAgICAgICAgdGhpcy5fdXBkYXRlT3ZlcmxheU9mZnNldChvdmVybGF5T2Zmc2V0KTtcclxuICAgICAgICB9KTtcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgdXBkYXRlUmVzaXplQWN0aXZlKGFjdGl2ZTogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgdGhpcy5ldmVudERpc3BhdGNoZXIub3ZlcmxheUhhbmRsZUFjdGl2ZUZvckNlbGwubmV4dChcclxuICAgICAgYWN0aXZlID8gdGhpcy5yZXNpemVSZWYub3JpZ2luLm5hdGl2ZUVsZW1lbnQhIDogbnVsbCxcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9nZXRPcmlnaW5XaWR0aCgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMucmVzaXplUmVmLm9yaWdpbi5uYXRpdmVFbGVtZW50IS5vZmZzZXRXaWR0aDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2dldE9yaWdpbk9mZnNldCgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMucmVzaXplUmVmLm9yaWdpbi5uYXRpdmVFbGVtZW50IS5vZmZzZXRMZWZ0O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfdXBkYXRlT3ZlcmxheU9mZnNldChvZmZzZXQ6IG51bWJlcik6IHZvaWQge1xyXG4gICAgdGhpcy5yZXNpemVSZWYub3ZlcmxheVJlZi5vdmVybGF5RWxlbWVudC5zdHlsZS50cmFuc2Zvcm0gPSBgdHJhbnNsYXRlWCgke2NvZXJjZUNzc1BpeGVsVmFsdWUoXHJcbiAgICAgIG9mZnNldCxcclxuICAgICl9KWA7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9pc0x0cigpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLmRpcmVjdGlvbmFsaXR5LnZhbHVlID09PSAnbHRyJztcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX25vdGlmeVJlc2l6ZUVuZGVkKHNpemU6IG51bWJlciwgY29tcGxldGVkU3VjY2Vzc2Z1bGx5ID0gZmFsc2UpOiB2b2lkIHtcclxuICAgIHRoaXMudXBkYXRlUmVzaXplQWN0aXZlKGZhbHNlKTtcclxuXHJcbiAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xyXG4gICAgICBjb25zdCBzaXplTWVzc2FnZSA9IHsgY29sdW1uSWQ6IHRoaXMuY29sdW1uRGVmLm5hbWUsIHNpemUgfTtcclxuICAgICAgaWYgKGNvbXBsZXRlZFN1Y2Nlc3NmdWxseSkge1xyXG4gICAgICAgIHRoaXMucmVzaXplTm90aWZpZXIucmVzaXplQ29tcGxldGVkLm5leHQoc2l6ZU1lc3NhZ2UpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMucmVzaXplTm90aWZpZXIucmVzaXplQ2FuY2VsZWQubmV4dChzaXplTWVzc2FnZSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxufVxyXG4iXX0=