UNPKG

dynamic-mat-table

Version:

dynamic-mat-table is an Angular component for presenting large and complex data with a lightning fast performance (at least 10x faster) and excellent level of control over the presentation.

134 lines 20.2 kB
import { combineLatest, merge, Observable, of, ReplaySubject, Subscription } from 'rxjs'; import { map } from 'rxjs/operators'; import { MatTableDataSource } from '@angular/material/table'; import { titleCase } from '../utilizes/utilizes'; export class TableVirtualScrollDataSource extends MatTableDataSource { constructor() { super(...arguments); this.filterMap = {}; this.columns = []; } get allData() { return this.data; } toTranslate() { const tranList = []; const keys = Object.keys(this.filterMap); for (const k of keys) { let fieldTotalTran = ''; for (const f of this.filterMap[k]) { fieldTotalTran += f.toPrint(); } if (fieldTotalTran !== '') { tranList.push({ key: titleCase(k), value: fieldTotalTran }); } } return tranList; } getFilter(fieldName) { return this.filterMap[fieldName]; } setFilter(fieldName, filters) { this.filterMap[fieldName] = filters; return new Observable(subscriber => { setTimeout(() => { this.refreshFilterPredicate(); subscriber.next(); subscriber.complete(); }, 200); // for show progress }); } clearFilter(fieldName = null) { if (fieldName != null) { delete this.filterMap[fieldName]; } else { this.filterMap = {}; } this.refreshFilterPredicate(); } clearData() { this.data = []; } refreshFilterPredicate() { let conditionsString = ''; Object.keys(this.filterMap).forEach(key => { let fieldCondition = ''; this.filterMap[key].forEach((fieldFilter, row, array) => { if (row < array.length - 1) { fieldCondition += fieldFilter.toString(key) + (fieldFilter.type === 'and' ? ' && ' : ' || '); } else { fieldCondition += fieldFilter.toString(key); } }); if (fieldCondition !== '') { conditionsString += ` ${conditionsString === '' ? '' : ' && '} ( ${fieldCondition} )`; } }); if (conditionsString !== '') { const filterFunction = new Function('_a$', 'return ' + conditionsString); this.filterPredicate = (data, filter) => filterFunction(data); } else { this.filterPredicate = (data, filter) => true; } this.filter = conditionsString; } // When client paging active use for retrieve paging data pagingData(data) { const p = this._paginator; if (p && p !== null) { const end = (p.pageIndex + 1) * p.pageSize; const start = p.pageIndex * p.pageSize; return data.slice(start, end); } return data; } _updateChangeSubscription() { var _a; this.initStreams(); const sort = this._sort; const paginator = this._paginator; const internalPageChanges = this._internalPageChanges; const filter = this._filter; const renderData = this._renderData; const dataStream = this._data; const sortChange = sort ? merge(sort.sortChange, sort.initialized) : of(null); const pageChange = paginator ? merge(paginator.page, internalPageChanges, paginator.initialized) : of(null); // First Filter const filteredData = combineLatest([dataStream, filter]).pipe(map(([data]) => this._filterData(data))); // Second Order const orderedData = combineLatest([filteredData, sortChange]).pipe(map(([data, sortColumn]) => { const sc = sortColumn; if (!sc) { return data; } else if (sc.active !== '') { const column = this.columns.filter(c => c.name == sc.active)[0]; if (column.sort === 'server-side') { return data; } else if (column.sort === 'client-side') { return this._orderData(data); } } })); // Last Paging const paginatedData = combineLatest([orderedData, pageChange]).pipe(map(([data]) => this.pagingData(data))); (_a = this._renderChangesSubscription) === null || _a === void 0 ? void 0 : _a.unsubscribe(); this._renderChangesSubscription = new Subscription(); this._renderChangesSubscription.add(paginatedData.subscribe(data => this.dataToRender$.next(data))); this._renderChangesSubscription.add(this.dataOfRange$.subscribe(data => renderData.next(data))); } initStreams() { if (!this.streamsReady) { this.dataToRender$ = new ReplaySubject(1); this.dataOfRange$ = new ReplaySubject(1); this.streamsReady = true; } } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUtZGF0YS1zb3VyY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9keW5hbWljLW1hdC10YWJsZS9zcmMvbGliL2NvcmVzL3RhYmxlLWRhdGEtc291cmNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBbUIsYUFBYSxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsRUFBRSxFQUFFLGFBQWEsRUFBVyxZQUFZLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDbkgsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3JDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBSTdELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUtqRCxNQUFNLE9BQU8sNEJBQWlELFNBQVEsa0JBQXFCO0lBQTNGOztRQUlVLGNBQVMsR0FBOEIsRUFBRSxDQUFDO1FBQzNDLFlBQU8sR0FBb0IsRUFBRSxDQUFBO0lBZ0t0QyxDQUFDO0lBL0pDLElBQUksT0FBTztRQUVULE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQztJQUNuQixDQUFDO0lBRUQsV0FBVztRQUVULE1BQU0sUUFBUSxHQUFHLEVBQUUsQ0FBQztRQUNwQixNQUFNLElBQUksR0FBYSxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNuRCxLQUFLLE1BQU0sQ0FBQyxJQUFJLElBQUksRUFDcEI7WUFDRSxJQUFJLGNBQWMsR0FBRyxFQUFFLENBQUM7WUFDeEIsS0FBSyxNQUFNLENBQUMsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUNqQztnQkFDRSxjQUFjLElBQUksQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDO2FBQy9CO1lBQ0QsSUFBSSxjQUFjLEtBQUssRUFBRSxFQUN6QjtnQkFDRSxRQUFRLENBQUMsSUFBSSxDQUFDLEVB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VSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUU1RyxNQUFBLElBQUksQ0FBQywwQkFBMEIsMENBQUUsV0FBVyxFQUFFLENBQUM7UUFDL0MsSUFBSSxDQUFDLDBCQUEwQixHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFDckQsSUFBSSxDQUFDLDBCQUEwQixDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3BHLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNsRyxDQUFDO0lBRU8sV0FBVztRQUVqQixJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksRUFDdEI7WUFDRSxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksYUFBYSxDQUFNLENBQUMsQ0FBQyxDQUFDO1lBQy9DLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxhQUFhLENBQU0sQ0FBQyxDQUFDLENBQUM7WUFDOUMsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7U0FDMUI7SUFDSCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIGNvbWJpbmVMYXRlc3QsIG1lcmdlLCBPYnNlcnZhYmxlLCBvZiwgUmVwbGF5U3ViamVjdCwgU3ViamVjdCwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IG1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHsgTWF0VGFibGVEYXRhU291cmNlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvdGFibGUnO1xyXG5pbXBvcnQgeyBNYXRTb3J0LCBTb3J0IH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc29ydCc7XHJcbmltcG9ydCB7IE1hdFBhZ2luYXRvciwgUGFnZUV2ZW50IH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvcGFnaW5hdG9yJztcclxuaW1wb3J0IHsgQWJzdHJhY3RGaWx0ZXIgfSBmcm9tICcuLi9keW5hbWljLW1hdC10YWJsZS9leHRlbnNpb25zL2ZpbHRlci9jb21wYXJlL2Fic3RyYWN0LWZpbHRlcic7XHJcbmltcG9ydCB7IHRpdGxlQ2FzZSB9IGZyb20gJy4uL3V0aWxpemVzL3V0aWxpemVzJztcclxuaW1wb3J0IHsgSGFzaE1hcCB9IGZyb20gJy4vdHlwZSc7XHJcbmltcG9ydCB7IFRhYmxlRmllbGQgfSBmcm9tICcuLi9tb2RlbHMvdGFibGUtZmllbGQubW9kZWwnO1xyXG5pbXBvcnQgeyBUYWJsZVJvdyB9IGZyb20gJy4uL21vZGVscy90YWJsZS1yb3cubW9kZWwnO1xyXG5cclxuZXhwb3J0IGNsYXNzIFRhYmxlVmlydHVhbFNjcm9sbERhdGFTb3VyY2U8VCBleHRlbmRzIFRhYmxlUm93PiBleHRlbmRzIE1hdFRhYmxlRGF0YVNvdXJjZTxUPiB7XHJcbiAgcHVibGljIGRhdGFUb1JlbmRlciQ6IFN1YmplY3Q8VFtdPjtcclxuICBwdWJsaWMgZGF0YU9mUmFuZ2UkOiBTdWJqZWN0PFRbXT47XHJcbiAgcHJpdmF0ZSBzdHJlYW1zUmVhZHk6IGJvb2xlYW47XHJcbiAgcHJpdmF0ZSBmaWx0ZXJNYXA6IEhhc2hNYXA8QWJzdHJhY3RGaWx0ZXJbXT4gPSB7fTtcclxuICBwdWJsaWMgY29sdW1uczogVGFibGVGaWVsZDxUPltdID0gW11cclxuICBnZXQgYWxsRGF0YSgpOiBUW11cclxuICB7XHJcbiAgICByZXR1cm4gdGhpcy5kYXRhO1xyXG4gIH1cclxuXHJcbiAgdG9UcmFuc2xhdGUoKTogYW55W11cclxuICB7XHJcbiAgICBjb25zdCB0cmFuTGlzdCA9IFtdO1xyXG4gICAgY29uc3Qga2V5czogc3RyaW5nW10gPSBPYmplY3Qua2V5cyh0aGlzLmZpbHRlck1hcCk7XHJcbiAgICBmb3IgKGNvbnN0IGsgb2Yga2V5cylcclxuICAgIHtcclxuICAgICAgbGV0IGZpZWxkVG90YWxUcmFuID0gJyc7XHJcbiAgICAgIGZvciAoY29uc3QgZiBvZiB0aGlzLmZpbHRlck1hcFtrXSlcclxuICAgICAge1xyXG4gICAgICAgIGZpZWxkVG90YWxUcmFuICs9IGYudG9QcmludCgpO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChmaWVsZFRvdGFsVHJhbiAhPT0gJycpXHJcbiAgICAgIHtcclxuICAgICAgICB0cmFuTGlzdC5wdXNoKHsga2V5OiB0aXRsZUNhc2UoayksIHZhbHVlOiBmaWVsZFRvdGFsVHJhbiB9KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRyYW5MaXN0O1xyXG4gIH1cclxuXHJcbiAgZ2V0RmlsdGVyKGZpZWxkTmFtZTogc3RyaW5nKTogQWJzdHJhY3RGaWx0ZXJbXVxyXG4gIHtcclxuICAgIHJldHVybiB0aGlzLmZpbHRlck1hcFtmaWVsZE5hbWVdO1xyXG4gIH1cclxuXHJcbiAgc2V0RmlsdGVyKGZpZWxkTmFtZTogc3RyaW5nLCBmaWx0ZXJzOiBBYnN0cmFjdEZpbHRlcltdKTogT2JzZXJ2YWJsZTxudWxsPlxyXG4gIHtcclxuICAgIHRoaXMuZmlsdGVyTWFwW2ZpZWxkTmFtZV0gPSBmaWx0ZXJzO1xyXG4gICAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlKHN1YnNjcmliZXIgPT5cclxuICAgIHtcclxuICAgICAgc2V0VGltZW91dCgoKSA9PlxyXG4gICAgICB7XHJcbiAgICAgICAgdGhpcy5yZWZyZXNoRmlsdGVyUHJlZGljYXRlKCk7XHJcbiAgICAgICAgc3Vic2NyaWJlci5uZXh0KCk7XHJcbiAgICAgICAgc3Vic2NyaWJlci5jb21wbGV0ZSgpO1xyXG4gICAgICB9LCAyMDApOyAvLyBmb3Igc2hvdyBwcm9ncmVzc1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBjbGVhckZpbHRlcihmaWVsZE5hbWU6IHN0cmluZyA9IG51bGwpXHJcbiAge1xyXG4gICAgaWYgKGZpZWxkTmFtZSAhPSBudWxsKVxyXG4gICAge1xyXG4gICAgICBkZWxldGUgdGhpcy5maWx0ZXJNYXBbZmllbGROYW1lXTtcclxuICAgIH0gZWxzZVxyXG4gICAge1xyXG4gICAgICB0aGlzLmZpbHRlck1hcCA9IHt9O1xyXG4gICAgfVxyXG4gICAgdGhpcy5yZWZyZXNoRmlsdGVyUHJlZGljYXRlKCk7XHJcbiAgfVxyXG5cclxuICBjbGVhckRhdGEoKVxyXG4gIHtcclxuICAgIHRoaXMuZGF0YSA9IFtdO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHJlZnJlc2hGaWx0ZXJQcmVkaWNhdGUoKVxyXG4gIHtcclxuICAgIGxldCBjb25kaXRpb25zU3RyaW5nID0gJyc7XHJcbiAgICBPYmplY3Qua2V5cyh0aGlzLmZpbHRlck1hcCkuZm9yRWFjaChrZXkgPT5cclxuICAgIHtcclxuICAgICAgbGV0IGZpZWxkQ29uZGl0aW9uID0gJyc7XHJcbiAgICAgIHRoaXMuZmlsdGVyTWFwW2tleV0uZm9yRWFjaCgoZmllbGRGaWx0ZXIsIHJvdywgYXJyYXkpID0+XHJcbiAgICAgIHtcclxuICAgICAgICBpZiAocm93IDwgYXJyYXkubGVuZ3RoIC0gMSlcclxuICAgICAgICB7XHJcbiAgICAgICAgICBmaWVsZENvbmRpdGlvbiArPSBmaWVsZEZpbHRlci50b1N0cmluZyhrZXkpICsgKGZpZWxkRmlsdGVyLnR5cGUgPT09ICdhbmQnID8gJyAmJiAnIDogJyB8fCAnKTtcclxuICAgICAgICB9IGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICBmaWVsZENvbmRpdGlvbiArPSBmaWVsZEZpbHRlci50b1N0cmluZyhrZXkpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICAgIGlmIChmaWVsZENvbmRpdGlvbiAhPT0gJycpXHJcbiAgICAgIHtcclxuICAgICAgICBjb25kaXRpb25zU3RyaW5nICs9IGAgJHtjb25kaXRpb25zU3RyaW5nID09PSAnJyA/ICcnIDogJyAmJiAnfSAoICR7ZmllbGRDb25kaXRpb259IClgO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIGlmIChjb25kaXRpb25zU3RyaW5nICE9PSAnJylcclxuICAgIHtcclxuICAgICAgY29uc3QgZmlsdGVyRnVuY3Rpb24gPSBuZXcgRnVuY3Rpb24oJ19hJCcsICdyZXR1cm4gJyArIGNvbmRpdGlvbnNTdHJpbmcpO1xyXG4gICAgICB0aGlzLmZpbHRlclByZWRpY2F0ZSA9IChkYXRhOiBULCBmaWx0ZXI6IHN0cmluZykgPT4gZmlsdGVyRnVuY3Rpb24oZGF0YSkgYXMgYm9vbGVhbjtcclxuICAgIH0gZWxzZVxyXG4gICAge1xyXG4gICAgICB0aGlzLmZpbHRlclByZWRpY2F0ZSA9IChkYXRhOiBULCBmaWx0ZXI6IHN0cmluZykgPT4gdHJ1ZTtcclxuICAgIH1cclxuICAgIHRoaXMuZmlsdGVyID0gY29uZGl0aW9uc1N0cmluZztcclxuICB9XHJcblxyXG4gIC8vIFdoZW4gY2xpZW50IHBhZ2luZyBhY3RpdmUgdXNlIGZvciByZXRyaWV2ZSBwYWdpbmcgZGF0YVxyXG4gIHBhZ2luZ0RhdGEoZGF0YSlcclxuICB7XHJcbiAgICBjb25zdCBwOiBNYXRQYWdpbmF0b3IgPSAodGhpcyBhcyBhbnkpLl9wYWdpbmF0b3I7XHJcbiAgICBpZiAocCAmJiBwICE9PSBudWxsKVxyXG4gICAge1xyXG4gICAgICBjb25zdCBlbmQgPSAocC5wYWdlSW5kZXggKyAxKSAqIHAucGFnZVNpemU7XHJcbiAgICAgIGNvbnN0IHN0YXJ0ID0gcC5wYWdlSW5kZXggKiBwLnBhZ2VTaXplO1xyXG4gICAgICByZXR1cm4gZGF0YS5zbGljZShzdGFydCwgZW5kKTtcclxuICAgIH1cclxuICAgIHJldHVybiBkYXRhO1xyXG4gIH1cclxuXHJcbiAgX3VwZGF0ZUNoYW5nZVN1YnNjcmlwdGlvbigpXHJcbiAge1xyXG4gICAgdGhpcy5pbml0U3RyZWFtcygpO1xyXG4gICAgY29uc3Qgc29ydDogTWF0U29ydCB8IG51bGwgPSAodGhpcyBhcyBhbnkpLl9zb3J0O1xyXG4gICAgY29uc3QgcGFnaW5hdG9yOiBNYXRQYWdpbmF0b3IgfCBudWxsID0gKHRoaXMgYXMgYW55KS5fcGFnaW5hdG9yO1xyXG4gICAgY29uc3QgaW50ZXJuYWxQYWdlQ2hhbmdlczogU3ViamVjdDx2b2lkPiA9ICh0aGlzIGFzIGFueSkuX2ludGVybmFsUGFnZUNoYW5nZXM7XHJcbiAgICBjb25zdCBmaWx0ZXI6IEJlaGF2aW9yU3ViamVjdDxzdHJpbmc+ID0gKHRoaXMgYXMgYW55KS5fZmlsdGVyO1xyXG4gICAgY29uc3QgcmVuZGVyRGF0YTogQmVoYXZpb3JTdWJqZWN0PFRbXT4gPSAodGhpcyBhcyBhbnkpLl9yZW5kZXJEYXRhO1xyXG4gICAgY29uc3QgZGF0YVN0cmVhbTogQmVoYXZpb3JTdWJqZWN0PFRbXT4gPSAodGhpcyBhcyBhbnkpLl9kYXRhO1xyXG5cclxuICAgIGNvbnN0IHNvcnRDaGFuZ2U6IE9ic2VydmFibGU8U29ydCB8IG51bGwgfCB2b2lkPiA9IHNvcnQgP1xyXG4gICAgICBtZXJnZShzb3J0LnNvcnRDaGFuZ2UsIHNvcnQuaW5pdGlhbGl6ZWQpIGFzIE9ic2VydmFibGU8U29ydCB8IHZvaWQ+IDogb2YobnVsbCk7XHJcbiAgICBjb25zdCBwYWdlQ2hhbmdlOiBPYnNlcnZhYmxlPFBhZ2VFdmVudCB8IG51bGwgfCB2b2lkPiA9IHBhZ2luYXRvciA/XHJcbiAgICAgIG1lcmdlKHBhZ2luYXRvci5wYWdlLCBpbnRlcm5hbFBhZ2VDaGFuZ2VzLCBwYWdpbmF0b3IuaW5pdGlhbGl6ZWQpIGFzIE9ic2VydmFibGU8UGFnZUV2ZW50IHwgdm9pZD4gOiBvZihudWxsKTtcclxuXHJcbiAgICAvLyBGaXJzdCBGaWx0ZXJcclxuICAgIGNvbnN0IGZpbHRlcmVkRGF0YSA9IGNvbWJpbmVMYXRlc3QoW2RhdGFTdHJlYW0sIGZpbHRlcl0pLnBpcGUobWFwKChbZGF0YV0pID0+IHRoaXMuX2ZpbHRlckRhdGEoZGF0YSkpKTtcclxuICAgIC8vIFNlY29uZCBPcmRlclxyXG4gICAgY29uc3Qgb3JkZXJlZERhdGEgPSBjb21iaW5lTGF0ZXN0KFtmaWx0ZXJlZERhdGEsIHNvcnRDaGFuZ2VdKS5waXBlKG1hcCgoW2RhdGEsIHNvcnRDb2x1bW5dKSA9PlxyXG4gICAge1xyXG4gICAgICBjb25zdCBzYzogU29ydCA9IHNvcnRDb2x1bW4gYXMgU29ydDtcclxuICAgICAgaWYgKCFzYylcclxuICAgICAge1xyXG4gICAgICAgIHJldHVybiBkYXRhO1xyXG4gICAgICB9IGVsc2UgaWYgKHNjLmFjdGl2ZSAhPT0gJycpXHJcbiAgICAgIHtcclxuICAgICAgICBjb25zdCBjb2x1bW4gPSB0aGlzLmNvbHVtbnMuZmlsdGVyKGMgPT4gYy5uYW1lID09IHNjLmFjdGl2ZSlbMF07XHJcbiAgICAgICAgaWYgKGNvbHVtbi5zb3J0ID09PSAnc2VydmVyLXNpZGUnKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgIHJldHVybiBkYXRhO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoY29sdW1uLnNvcnQgPT09ICdjbGllbnQtc2lkZScpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgcmV0dXJuIHRoaXMuX29yZGVyRGF0YShkYXRhKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0pKTtcclxuICAgIC8vIExhc3QgUGFnaW5nXHJcbiAgICBjb25zdCBwYWdpbmF0ZWREYXRhID0gY29tYmluZUxhdGVzdChbb3JkZXJlZERhdGEsIHBhZ2VDaGFuZ2VdKS5waXBlKG1hcCgoW2RhdGFdKSA9PiB0aGlzLnBhZ2luZ0RhdGEoZGF0YSkpKTtcclxuXHJcbiAgICB0aGlzLl9yZW5kZXJDaGFuZ2VzU3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xyXG4gICAgdGhpcy5fcmVuZGVyQ2hhbmdlc1N1YnNjcmlwdGlvbiA9IG5ldyBTdWJzY3JpcHRpb24oKTtcclxuICAgIHRoaXMuX3JlbmRlckNoYW5nZXNTdWJzY3JpcHRpb24uYWRkKHBhZ2luYXRlZERhdGEuc3Vic2NyaWJlKGRhdGEgPT4gdGhpcy5kYXRhVG9SZW5kZXIkLm5leHQoZGF0YSkpKTtcclxuICAgIHRoaXMuX3JlbmRlckNoYW5nZXNTdWJzY3JpcHRpb24uYWRkKHRoaXMuZGF0YU9mUmFuZ2UkLnN1YnNjcmliZShkYXRhID0+IHJlbmRlckRhdGEubmV4dChkYXRhKSkpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpbml0U3RyZWFtcygpXHJcbiAge1xyXG4gICAgaWYgKCF0aGlzLnN0cmVhbXNSZWFkeSlcclxuICAgIHtcclxuICAgICAgdGhpcy5kYXRhVG9SZW5kZXIkID0gbmV3IFJlcGxheVN1YmplY3Q8VFtdPigxKTtcclxuICAgICAgdGhpcy5kYXRhT2ZSYW5nZSQgPSBuZXcgUmVwbGF5U3ViamVjdDxUW10+KDEpO1xyXG4gICAgICB0aGlzLnN0cmVhbXNSZWFkeSA9IHRydWU7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiJdfQ==