UNPKG

ng-cdk-table-virtual-scroll

Version:
168 lines 22.7 kB
var TableItemSizeDirective_1; import { __decorate } from "tslib"; import { AfterContentInit, ContentChild, Directive, forwardRef, Input, NgZone, OnChanges, OnDestroy, } from '@angular/core'; import { distinctUntilChanged, filter, map, switchMap, takeUntil, takeWhile, tap, } from 'rxjs/operators'; import { Subject } from 'rxjs'; import { VIRTUAL_SCROLL_STRATEGY } from '@angular/cdk/scrolling'; import { CdkTable } from '@angular/cdk/table'; import { TableVirtualScrollDataSource } from './table-data-source'; import { FixedSizeTableVirtualScrollStrategy } from './fixed-size-table-virtual-scroll-strategy'; export function _tableVirtualScrollDirectiveStrategyFactory(tableDir) { return tableDir.scrollStrategy; } const stickyHeaderSelector = '.cdk-header-row .cdk-table-sticky'; const stickyFooterSelector = '.cdk-footer-row .cdk-table-sticky'; const defaults = { rowHeight: 48, headerHeight: 56, headerEnabled: true, footerHeight: 48, footerEnabled: false, bufferMultiplier: 0.7, }; let TableItemSizeDirective = TableItemSizeDirective_1 = class TableItemSizeDirective { constructor(zone) { this.zone = zone; this.alive = true; // tslint:disable-next-line:no-input-rename this.rowHeight = defaults.rowHeight; this.headerEnabled = defaults.headerEnabled; this.headerHeight = defaults.headerHeight; this.footerEnabled = defaults.footerEnabled; this.footerHeight = defaults.footerHeight; this.bufferMultiplier = defaults.bufferMultiplier; this.scrollStrategy = new FixedSizeTableVirtualScrollStrategy(); this.dataSourceChanges = new Subject(); } ngOnDestroy() { this.alive = false; this.dataSourceChanges.complete(); } isAlive() { return () => this.alive; } isStickyEnabled() { return (!!this.scrollStrategy.viewport && this.table['_headerRowDefs'] .map((def) => def.sticky) .reduce((prevState, state) => prevState && state, true)); } ngAfterContentInit() { const switchDataSourceOrigin = this.table['_switchDataSource']; this.table['_switchDataSource'] = (dataSource) => { switchDataSourceOrigin.call(this.table, dataSource); this.connectDataSource(dataSource); }; this.connectDataSource(this.table.dataSource); this.scrollStrategy.stickyChange .pipe(filter(() => this.isStickyEnabled()), tap(() => { if (!this.stickyPositions) { this.initStickyPositions(); } }), takeWhile(this.isAlive())) .subscribe((stickyOffset) => { this.setSticky(stickyOffset); }); } connectDataSource(dataSource) { this.dataSourceChanges.next(); if (dataSource instanceof TableVirtualScrollDataSource) { dataSource.dataToRender$ .pipe(distinctUntilChanged(), takeUntil(this.dataSourceChanges), takeWhile(this.isAlive()), tap((data) => (this.scrollStrategy.dataLength = data.length)), switchMap((data) => this.scrollStrategy.renderedRangeStream.pipe(map(({ start, end }) => typeof start !== 'number' || typeof end !== 'number' ? data : data.slice(start, end))))) .subscribe((data) => { this.zone.run(() => { dataSource.dataOfRange$.next(data); }); }); } else { throw new Error('[tvsItemSize] requires TableVirtualScrollDataSource be set as [dataSource] of [cdk-table]'); } } ngOnChanges() { const config = { rowHeight: +this.rowHeight || defaults.rowHeight, headerHeight: this.headerEnabled ? +this.headerHeight || defaults.headerHeight : 0, footerHeight: this.footerEnabled ? +this.footerHeight || defaults.footerHeight : 0, bufferMultiplier: +this.bufferMultiplier || defaults.bufferMultiplier, }; this.scrollStrategy.setConfig(config); } setSticky(offset) { this.scrollStrategy.viewport.elementRef.nativeElement .querySelectorAll(stickyHeaderSelector) .forEach((el) => { const parent = el.parentElement; let baseOffset = 0; if (this.stickyPositions.has(parent)) { baseOffset = this.stickyPositions.get(parent); } el.style.top = `${baseOffset - offset}px`; }); this.scrollStrategy.viewport.elementRef.nativeElement .querySelectorAll(stickyFooterSelector) .forEach((el) => { const parent = el.parentElement; let baseOffset = 0; if (this.stickyPositions.has(parent)) { baseOffset = this.stickyPositions.get(parent); } el.style.bottom = `${-baseOffset + offset}px`; }); } initStickyPositions() { this.stickyPositions = new Map(); this.scrollStrategy.viewport.elementRef.nativeElement .querySelectorAll(stickyHeaderSelector) .forEach((el) => { const parent = el.parentElement; if (!this.stickyPositions.has(parent)) { this.stickyPositions.set(parent, parent.offsetTop); } }); } }; TableItemSizeDirective.ctorParameters = () => [ { type: NgZone } ]; __decorate([ Input('tvsItemSize') ], TableItemSizeDirective.prototype, "rowHeight", void 0); __decorate([ Input() ], TableItemSizeDirective.prototype, "headerEnabled", void 0); __decorate([ Input() ], TableItemSizeDirective.prototype, "headerHeight", void 0); __decorate([ Input() ], TableItemSizeDirective.prototype, "footerEnabled", void 0); __decorate([ Input() ], TableItemSizeDirective.prototype, "footerHeight", void 0); __decorate([ Input() ], TableItemSizeDirective.prototype, "bufferMultiplier", void 0); __decorate([ ContentChild(CdkTable, { static: false }) ], TableItemSizeDirective.prototype, "table", void 0); TableItemSizeDirective = TableItemSizeDirective_1 = __decorate([ Directive({ selector: 'cdk-virtual-scroll-viewport[tvsItemSize]', providers: [ { provide: VIRTUAL_SCROLL_STRATEGY, useFactory: _tableVirtualScrollDirectiveStrategyFactory, deps: [forwardRef(() => TableItemSizeDirective_1)], }, ], }) ], TableItemSizeDirective); export { TableItemSizeDirective }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUtaXRlbS1zaXplLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25nLWNkay10YWJsZS12aXJ0dWFsLXNjcm9sbC8iLCJzb3VyY2VzIjpbImxpYi90YWJsZS1pdGVtLXNpemUuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsT0FBTyxFQUNMLGdCQUFnQixFQUNoQixZQUFZLEVBQ1osU0FBUyxFQUNULFVBQVUsRUFDVixLQUFLLEVBQ0wsTUFBTSxFQUNOLFNBQVMsRUFDVCxTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUNMLG9CQUFvQixFQUNwQixNQUFNLEVBQ04sR0FBRyxFQUNILFNBQVMsRUFDVCxTQUFTLEVBQ1QsU0FBUyxFQUNULEdBQUcsR0FDSixNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0IsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDakUsT0FBTyxFQUFtQixRQUFRLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUUvRCxPQUFPLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNuRSxPQUFPLEVBQUUsbUNBQW1DLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUVqRyxNQUFNLFVBQVUsMkNBQTJDLENBQ3pELFFBQWdDO0lBRWhDLE9BQU8sUUFBUSxDQUFDLGNBQWMsQ0FBQztBQUNqQyxDQUFDO0FBRUQsTUFBTSxvQkFBb0IsR0FBRyxtQ0FBbUMsQ0FBQztBQUNqRSxNQUFNLG9CQUFvQixHQUFHLG1DQUFtQyxDQUFDO0FBRWpFLE1BQU0sUUFBUSxHQUFHO0lBQ2YsU0FBUyxFQUFFLEVBQUU7SUFDYixZQUFZLEVBQUUsRUFBRTtJQUNoQixhQUFhLEVBQUUsSUFBSTtJQUNuQixZQUFZLEVBQUUsRUFBRTtJQUNoQixhQUFhLEVBQUUsS0FBSztJQUNwQixnQkFBZ0IsRUFBRSxH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QUUsQ0FBQyx3QkFBc0IsQ0FBQyxDQUFDO2FBQ2pEO1NBQ0Y7S0FDRixDQUFDO0dBQ1csc0JBQXNCLENBMkpsQztTQTNKWSxzQkFBc0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIEFmdGVyQ29udGVudEluaXQsXHJcbiAgQ29udGVudENoaWxkLFxyXG4gIERpcmVjdGl2ZSxcclxuICBmb3J3YXJkUmVmLFxyXG4gIElucHV0LFxyXG4gIE5nWm9uZSxcclxuICBPbkNoYW5nZXMsXHJcbiAgT25EZXN0cm95LFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQge1xyXG4gIGRpc3RpbmN0VW50aWxDaGFuZ2VkLFxyXG4gIGZpbHRlcixcclxuICBtYXAsXHJcbiAgc3dpdGNoTWFwLFxyXG4gIHRha2VVbnRpbCxcclxuICB0YWtlV2hpbGUsXHJcbiAgdGFwLFxyXG59IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBWSVJUVUFMX1NDUk9MTF9TVFJBVEVHWSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9zY3JvbGxpbmcnO1xyXG5pbXBvcnQgeyBDZGtIZWFkZXJSb3dEZWYsIENka1RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL3RhYmxlJztcclxuXHJcbmltcG9ydCB7IFRhYmxlVmlydHVhbFNjcm9sbERhdGFTb3VyY2UgfSBmcm9tICcuL3RhYmxlLWRhdGEtc291cmNlJztcclxuaW1wb3J0IHsgRml4ZWRTaXplVGFibGVWaXJ0dWFsU2Nyb2xsU3RyYXRlZ3kgfSBmcm9tICcuL2ZpeGVkLXNpemUtdGFibGUtdmlydHVhbC1zY3JvbGwtc3RyYXRlZ3knO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF90YWJsZVZpcnR1YWxTY3JvbGxEaXJlY3RpdmVTdHJhdGVneUZhY3RvcnkoXHJcbiAgdGFibGVEaXI6IFRhYmxlSXRlbVNpemVEaXJlY3RpdmVcclxuKSB7XHJcbiAgcmV0dXJuIHRhYmxlRGlyLnNjcm9sbFN0cmF0ZWd5O1xyXG59XHJcblxyXG5jb25zdCBzdGlja3lIZWFkZXJTZWxlY3RvciA9ICcuY2RrLWhlYWRlci1yb3cgLmNkay10YWJsZS1zdGlja3knO1xyXG5jb25zdCBzdGlja3lGb290ZXJTZWxlY3RvciA9ICcuY2RrLWZvb3Rlci1yb3cgLmNkay10YWJsZS1zdGlja3knO1xyXG5cclxuY29uc3QgZGVmYXVsdHMgPSB7XHJcbiAgcm93SGVpZ2h0OiA0OCxcclxuICBoZWFkZXJIZWlnaHQ6IDU2LFxyXG4gIGhlYWRlckVuYWJsZWQ6IHRydWUsXHJcbiAgZm9vdGVySGVpZ2h0OiA0OCxcclxuICBmb290ZXJFbmFibGVkOiBmYWxzZSxcclxuICBidWZmZXJNdWx0aXBsaWVyOiAwLjcsXHJcbn07XHJcblxyXG5ARGlyZWN0aXZlKHtcclxuICBzZWxlY3RvcjogJ2Nkay12aXJ0dWFsLXNjcm9sbC12aWV3cG9ydFt0dnNJdGVtU2l6ZV0nLFxyXG4gIHByb3ZpZGVyczogW1xyXG4gICAge1xyXG4gICAgICBwcm92aWRlOiBWSVJUVUFMX1NDUk9MTF9TVFJBVEVHWSxcclxuICAgICAgdXNlRmFjdG9yeTogX3RhYmxlVmlydHVhbFNjcm9sbERpcmVjdGl2ZVN0cmF0ZWd5RmFjdG9yeSxcclxuICAgICAgZGVwczogW2ZvcndhcmRSZWYoKCkgPT4gVGFibGVJdGVtU2l6ZURpcmVjdGl2ZSldLFxyXG4gICAgfSxcclxuICBdLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgVGFibGVJdGVtU2l6ZURpcmVjdGl2ZVxyXG4gIGltcGxlbWVudHMgT25DaGFuZ2VzLCBBZnRlckNvbnRlbnRJbml0LCBPbkRlc3Ryb3kge1xyXG4gIHByaXZhdGUgYWxpdmUgPSB0cnVlO1xyXG5cclxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8taW5wdXQtcmVuYW1lXHJcbiAgQElucHV0KCd0dnNJdGVtU2l6ZScpXHJcbiAgcm93SGVpZ2h0ID0gZGVmYXVsdHMucm93SGVpZ2h0O1xyXG5cclxuICBASW5wdXQoKVxyXG4gIGhlYWRlckVuYWJsZWQgPSBkZWZhdWx0cy5oZWFkZXJFbmFibGVkO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIGhlYWRlckhlaWdodCA9IGRlZmF1bHRzLmhlYWRlckhlaWdodDtcclxuXHJcbiAgQElucHV0KClcclxuICBmb290ZXJFbmFibGVkID0gZGVmYXVsdHMuZm9vdGVyRW5hYmxlZDtcclxuXHJcbiAgQElucHV0KClcclxuICBmb290ZXJIZWlnaHQgPSBkZWZhdWx0cy5mb290ZXJIZWlnaHQ7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgYnVmZmVyTXVsdGlwbGllciA9IGRlZmF1bHRzLmJ1ZmZlck11bHRpcGxpZXI7XHJcblxyXG4gIEBDb250ZW50Q2hpbGQoQ2RrVGFibGUsIHsgc3RhdGljOiBmYWxzZSB9KVxyXG4gIHRhYmxlOiBDZGtUYWJsZTxhbnk+O1xyXG5cclxuICBzY3JvbGxTdHJhdGVneSA9IG5ldyBGaXhlZFNpemVUYWJsZVZpcnR1YWxTY3JvbGxTdHJhdGVneSgpO1xyXG5cclxuICBkYXRhU291cmNlQ2hhbmdlcyA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XHJcblxyXG4gIHByaXZhdGUgc3RpY2t5UG9zaXRpb25zOiBNYXA8SFRNTEVsZW1lbnQsIG51bWJlcj47XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgem9uZTogTmdab25lKSB7fVxyXG5cclxuICBuZ09uRGVzdHJveSgpIHtcclxuICAgIHRoaXMuYWxpdmUgPSBmYWxzZTtcclxuICAgIHRoaXMuZGF0YVNvdXJjZUNoYW5nZXMuY29tcGxldGUoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaXNBbGl2ZSgpIHtcclxuICAgIHJldHVybiAoKSA9PiB0aGlzLmFsaXZlO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpc1N0aWNreUVuYWJsZWQoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gKFxyXG4gICAgICAhIXRoaXMuc2Nyb2xsU3RyYXRlZ3kudmlld3BvcnQgJiZcclxuICAgICAgKHRoaXMudGFibGVbJ19oZWFkZXJSb3dEZWZzJ10gYXMgQ2RrSGVhZGVyUm93RGVmW10pXHJcbiAgICAgICAgLm1hcCgoZGVmKSA9PiBkZWYuc3RpY2t5KVxyXG4gICAgICAgIC5yZWR1Y2UoKHByZXZTdGF0ZSwgc3RhdGUpID0+IHByZXZTdGF0ZSAmJiBzdGF0ZSwgdHJ1ZSlcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBuZ0FmdGVyQ29udGVudEluaXQoKSB7XHJcbiAgICBjb25zdCBzd2l0Y2hEYXRhU291cmNlT3JpZ2luID0gdGhpcy50YWJsZVsnX3N3aXRjaERhdGFTb3VyY2UnXTtcclxuICAgIHRoaXMudGFibGVbJ19zd2l0Y2hEYXRhU291cmNlJ10gPSAoZGF0YVNvdXJjZTogYW55KSA9PiB7XHJcbiAgICAgIHN3aXRjaERhdGFTb3VyY2VPcmlnaW4uY2FsbCh0aGlzLnRhYmxlLCBkYXRhU291cmNlKTtcclxuICAgICAgdGhpcy5jb25uZWN0RGF0YVNvdXJjZShkYXRhU291cmNlKTtcclxuICAgIH07XHJcblxyXG4gICAgdGhpcy5jb25uZWN0RGF0YVNvdXJjZSh0aGlzLnRhYmxlLmRhdGFTb3VyY2UpO1xyXG5cclxuICAgIHRoaXMuc2Nyb2xsU3RyYXRlZ3kuc3RpY2t5Q2hhbmdlXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIGZpbHRlcigoKSA9PiB0aGlzLmlzU3RpY2t5RW5hYmxlZCgpKSxcclxuICAgICAgICB0YXAoKCkgPT4ge1xyXG4gICAgICAgICAgaWYgKCF0aGlzLnN0aWNreVBvc2l0aW9ucykge1xyXG4gICAgICAgICAgICB0aGlzLmluaXRTdGlja3lQb3NpdGlvbnMoKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KSxcclxuICAgICAgICB0YWtlV2hpbGUodGhpcy5pc0FsaXZlKCkpXHJcbiAgICAgIClcclxuICAgICAgLnN1YnNjcmliZSgoc3RpY2t5T2Zmc2V0KSA9PiB7XHJcbiAgICAgICAgdGhpcy5zZXRTdGlja3koc3RpY2t5T2Zmc2V0KTtcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICBjb25uZWN0RGF0YVNvdXJjZShkYXRhU291cmNlOiBhbnkpIHtcclxuICAgIHRoaXMuZGF0YVNvdXJjZUNoYW5nZXMubmV4dCgpO1xyXG4gICAgaWYgKGRhdGFTb3VyY2UgaW5zdGFuY2VvZiBUYWJsZVZpcnR1YWxTY3JvbGxEYXRhU291cmNlKSB7XHJcbiAgICAgIGRhdGFTb3VyY2UuZGF0YVRvUmVuZGVyJFxyXG4gICAgICAgIC5waXBlKFxyXG4gICAgICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcclxuICAgICAgICAgIHRha2VVbnRpbCh0aGlzLmRhdGFTb3VyY2VDaGFuZ2VzKSxcclxuICAgICAgICAgIHRha2VXaGlsZSh0aGlzLmlzQWxpdmUoKSksXHJcbiAgICAgICAgICB0YXAoKGRhdGEpID0+ICh0aGlzLnNjcm9sbFN0cmF0ZWd5LmRhdGFMZW5ndGggPSBkYXRhLmxlbmd0aCkpLFxyXG4gICAgICAgICAgc3dpdGNoTWFwKChkYXRhKSA9PlxyXG4gICAgICAgICAgICB0aGlzLnNjcm9sbFN0cmF0ZWd5LnJlbmRlcmVkUmFuZ2VTdHJlYW0ucGlwZShcclxuICAgICAgICAgICAgICBtYXAoKHsgc3RhcnQsIGVuZCB9KSA9PlxyXG4gICAgICAgICAgICAgICAgdHlwZW9mIHN0YXJ0ICE9PSAnbnVtYmVyJyB8fCB0eXBlb2YgZW5kICE9PSAnbnVtYmVyJ1xyXG4gICAgICAgICAgICAgICAgICA/IGRhdGFcclxuICAgICAgICAgICAgICAgICAgOiBkYXRhLnNsaWNlKHN0YXJ0LCBlbmQpXHJcbiAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgICApXHJcbiAgICAgICAgKVxyXG4gICAgICAgIC5zdWJzY3JpYmUoKGRhdGEpID0+IHtcclxuICAgICAgICAgIHRoaXMuem9uZS5ydW4oKCkgPT4ge1xyXG4gICAgICAgICAgICBkYXRhU291cmNlLmRhdGFPZlJhbmdlJC5uZXh0KGRhdGEpO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXHJcbiAgICAgICAgJ1t0dnNJdGVtU2l6ZV0gcmVxdWlyZXMgVGFibGVWaXJ0dWFsU2Nyb2xsRGF0YVNvdXJjZSBiZSBzZXQgYXMgW2RhdGFTb3VyY2VdIG9mIFtjZGstdGFibGVdJ1xyXG4gICAgICApO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbmdPbkNoYW5nZXMoKSB7XHJcbiAgICBjb25zdCBjb25maWcgPSB7XHJcbiAgICAgIHJvd0hlaWdodDogK3RoaXMucm93SGVpZ2h0IHx8IGRlZmF1bHRzLnJvd0hlaWdodCxcclxuICAgICAgaGVhZGVySGVpZ2h0OiB0aGlzLmhlYWRlckVuYWJsZWRcclxuICAgICAgICA/ICt0aGlzLmhlYWRlckhlaWdodCB8fCBkZWZhdWx0cy5oZWFkZXJIZWlnaHRcclxuICAgICAgICA6IDAsXHJcbiAgICAgIGZvb3RlckhlaWdodDogdGhpcy5mb290ZXJFbmFibGVkXHJcbiAgICAgICAgPyArdGhpcy5mb290ZXJIZWlnaHQgfHwgZGVmYXVsdHMuZm9vdGVySGVpZ2h0XHJcbiAgICAgICAgOiAwLFxyXG4gICAgICBidWZmZXJNdWx0aXBsaWVyOiArdGhpcy5idWZmZXJNdWx0aXBsaWVyIHx8IGRlZmF1bHRzLmJ1ZmZlck11bHRpcGxpZXIsXHJcbiAgICB9O1xyXG4gICAgdGhpcy5zY3JvbGxTdHJhdGVneS5zZXRDb25maWcoY29uZmlnKTtcclxuICB9XHJcblxyXG4gIHNldFN0aWNreShvZmZzZXQpIHtcclxuICAgIHRoaXMuc2Nyb2xsU3RyYXRlZ3kudmlld3BvcnQuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50XHJcbiAgICAgIC5xdWVyeVNlbGVjdG9yQWxsKHN0aWNreUhlYWRlclNlbGVjdG9yKVxyXG4gICAgICAuZm9yRWFjaCgoZWw6IEhUTUxFbGVtZW50KSA9PiB7XHJcbiAgICAgICAgY29uc3QgcGFyZW50ID0gZWwucGFyZW50RWxlbWVudDtcclxuICAgICAgICBsZXQgYmFzZU9mZnNldCA9IDA7XHJcbiAgICAgICAgaWYgKHRoaXMuc3RpY2t5UG9zaXRpb25zLmhhcyhwYXJlbnQpKSB7XHJcbiAgICAgICAgICBiYXNlT2Zmc2V0ID0gdGhpcy5zdGlja3lQb3NpdGlvbnMuZ2V0KHBhcmVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsLnN0eWxlLnRvcCA9IGAke2Jhc2VPZmZzZXQgLSBvZmZzZXR9cHhgO1xyXG4gICAgICB9KTtcclxuICAgIHRoaXMuc2Nyb2xsU3RyYXRlZ3kudmlld3BvcnQuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50XHJcbiAgICAgIC5xdWVyeVNlbGVjdG9yQWxsKHN0aWNreUZvb3RlclNlbGVjdG9yKVxyXG4gICAgICAuZm9yRWFjaCgoZWw6IEhUTUxFbGVtZW50KSA9PiB7XHJcbiAgICAgICAgY29uc3QgcGFyZW50ID0gZWwucGFyZW50RWxlbWVudDtcclxuICAgICAgICBsZXQgYmFzZU9mZnNldCA9IDA7XHJcbiAgICAgICAgaWYgKHRoaXMuc3RpY2t5UG9zaXRpb25zLmhhcyhwYXJlbnQpKSB7XHJcbiAgICAgICAgICBiYXNlT2Zmc2V0ID0gdGhpcy5zdGlja3lQb3NpdGlvbnMuZ2V0KHBhcmVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsLnN0eWxlLmJvdHRvbSA9IGAkey1iYXNlT2Zmc2V0ICsgb2Zmc2V0fXB4YDtcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGluaXRTdGlja3lQb3NpdGlvbnMoKSB7XHJcbiAgICB0aGlzLnN0aWNreVBvc2l0aW9ucyA9IG5ldyBNYXA8SFRNTEVsZW1lbnQsIG51bWJlcj4oKTtcclxuICAgIHRoaXMuc2Nyb2xsU3RyYXRlZ3kudmlld3BvcnQuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50XHJcbiAgICAgIC5xdWVyeVNlbGVjdG9yQWxsKHN0aWNreUhlYWRlclNlbGVjdG9yKVxyXG4gICAgICAuZm9yRWFjaCgoZWwpID0+IHtcclxuICAgICAgICBjb25zdCBwYXJlbnQgPSBlbC5wYXJlbnRFbGVtZW50O1xyXG4gICAgICAgIGlmICghdGhpcy5zdGlja3lQb3NpdGlvbnMuaGFzKHBhcmVudCkpIHtcclxuICAgICAgICAgIHRoaXMuc3RpY2t5UG9zaXRpb25zLnNldChwYXJlbnQsIHBhcmVudC5vZmZzZXRUb3ApO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgfVxyXG59XHJcbiJdfQ==