@nghacks/ngmat-table-query-reflector
Version:
Stores and retrieves mat table states (sorting, pagination) with url query params
124 lines • 16.4 kB
JavaScript
import { __awaiter } from "tslib";
import { Directive, Input } from '@angular/core';
import { Router, ActivatedRoute } from '@angular/router';
import { Subject, interval } from 'rxjs';
import { takeUntil } from 'rxjs/operators';
export class NgMatTableQueryReflectorDirective {
constructor(_router, _activatedRoute) {
this._router = _router;
this._activatedRoute = _activatedRoute;
this.unsubscribeAll$ = new Subject();
}
ngOnInit() {
return __awaiter(this, void 0, void 0, function* () {
yield this.waitForDatasourceToLoad();
this._initialSetup();
this.listenToStateChangeEvents();
});
}
_initialSetup() {
const activePageQuery = this.isPageQueryActive();
if (activePageQuery) {
this.dataSource.paginator.pageIndex = activePageQuery.page_index;
this.dataSource.paginator.pageSize = activePageQuery.page_size;
}
// Activating initial Sort
const activeSortQuery = this.isSortQueryActive();
if (activeSortQuery) {
const sortActiveColumn = activeSortQuery ? (activeSortQuery.sort_direction ? activeSortQuery.sort_active : null) : this.matSortActive;
const sortable = {
id: sortActiveColumn,
start: activeSortQuery ? (activeSortQuery.sort_direction || null) : this.matSortDirection,
disableClear: true
};
this.dataSource.sort.sort(sortable);
if (!sortActiveColumn) {
return;
}
// Material Sort Issue: https://github.com/angular/components/issues/10242
// Picked a hack from: https://github.com/angular/components/issues/10242#issuecomment-421490991
const activeSortHeader = this.dataSource.sort.sortables.get(sortActiveColumn);
activeSortHeader['_setAnimationTransitionState']({
fromState: this.dataSource.sort.direction,
toState: 'active',
});
}
}
isSortQueryActive() {
const queryParams = this._activatedRoute.snapshot.queryParams;
if (queryParams.hasOwnProperty('sort_active') || queryParams.hasOwnProperty('sort_direction')) {
return {
sort_active: queryParams.sort_active,
sort_direction: queryParams.sort_direction
};
}
return;
}
isPageQueryActive() {
const queryParams = this._activatedRoute.snapshot.queryParams;
if (queryParams.hasOwnProperty('page_size') || queryParams.hasOwnProperty('page_index')) {
return {
page_size: queryParams.page_size,
page_index: queryParams.page_index
};
}
return;
}
listenToStateChangeEvents() {
this.dataSource.sort.sortChange
.pipe(takeUntil(this.unsubscribeAll$))
.subscribe((sortChange) => {
this._applySortChangesToUrlQueryParams(sortChange);
});
this.dataSource.paginator.page
.pipe(takeUntil(this.unsubscribeAll$))
.subscribe((pageChange) => {
this._applyPageStateChangesToUrlQueryParams(pageChange);
});
}
_applySortChangesToUrlQueryParams(sortChange) {
const sortingAndPaginationQueryParams = {
sort_active: sortChange.active,
sort_direction: sortChange.direction,
};
this._router.navigate([], { queryParams: sortingAndPaginationQueryParams, queryParamsHandling: 'merge' });
}
_applyPageStateChangesToUrlQueryParams(pageChange) {
const sortingAndPaginationQueryParams = {
page_size: pageChange.pageSize,
page_index: pageChange.pageIndex,
};
this._router.navigate([], { queryParams: sortingAndPaginationQueryParams, queryParamsHandling: 'merge' });
}
waitForDatasourceToLoad() {
const titleCheckingInterval$ = interval(500);
return new Promise((resolve) => {
this._dataSourceChecker$ = titleCheckingInterval$.subscribe(val => {
var _a, _b;
if (((_a = this.dataSource) === null || _a === void 0 ? void 0 : _a.sort) && ((_b = this.dataSource) === null || _b === void 0 ? void 0 : _b.paginator)) {
this._dataSourceChecker$.unsubscribe();
return resolve();
}
});
});
}
ngOnDestroy() {
this.unsubscribeAll$.next();
this.unsubscribeAll$.complete();
}
}
NgMatTableQueryReflectorDirective.decorators = [
{ type: Directive, args: [{
selector: '[NgMatTableQueryReflector]'
},] }
];
NgMatTableQueryReflectorDirective.ctorParameters = () => [
{ type: Router },
{ type: ActivatedRoute }
];
NgMatTableQueryReflectorDirective.propDecorators = {
matSortActive: [{ type: Input }],
matSortDirection: [{ type: Input }],
dataSource: [{ type: Input }]
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmdtYXQtdGFibGUtcXVlcnktcmVmbGVjdG9yLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL25nbWF0LXRhYmxlLXF1ZXJ5LXJlZmxlY3Rvci9zcmMvbGliL25nbWF0LXRhYmxlLXF1ZXJ5LXJlZmxlY3Rvci5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFxQixNQUFNLGVBQWUsQ0FBQztBQUVwRSxPQUFPLEVBQUUsTUFBTSxFQUFFLGNBQWMsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3pELE9BQU8sRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFnQixNQUFNLE1BQU0sQ0FBQztBQUN2RCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFPM0MsTUFBTSxPQUFPLGlDQUFpQztJQVM1QyxZQUNVLE9BQWUsRUFDZixlQUErQjtRQUQvQixZQUFPLEdBQVAsT0FBTyxDQUFRO1FBQ2Ysb0JBQWUsR0FBZixlQUFlLENBQWdCO1FBVGpDLG9CQUFlLEdBQWlCLElBQUksT0FBTyxFQUFFLENBQUM7SUFVbEQsQ0FBQztJQUVDLFFBQVE7O1lBQ1osTUFBTSxJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztZQUNyQyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDckIsSUFBSSxDQUFDLHlCQUF5QixFQUFFLENBQUM7UUFDbkMsQ0FBQztLQUFBO0lBRU8sYUFBYTtRQUVuQixNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUVqRCxJQUFJLGVBQWUsRUFBRTtZQUNuQixJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxTQUFTLEdBQUcsZUFBZSxDQUFDLFVBQVUsQ0FBQztZQUNqRSxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxRQUFRLEdBQUcsZUFBZSxDQUFDLFNBQVMsQ0FBQztTQUNoRTtRQUVELDBCQUEwQjtRQUMxQixNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUNqRCxJQUFJLGVBQWUsRUFBRTtZQUNuQixNQUFNLGdCQUFnQixHQUFHLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQztZQUN0SSxNQUFNLFFBQVEsR0FBZ0I7Z0JBQzVCLEVBQUUsRUFBRSxnQkFBZ0I7Z0JBQ3BCLEtBQUssRUFBRSxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLGNBQWMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQjtnQkFDekYsWUFBWSxFQUFFLElBQUk7YUFDbkIsQ0FBQztZQUNGLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUVwQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUU7Z0JBQUUsT0FBTzthQUFFO1lBQ2xDLDBFQUEwRTtZQUMxRSxnR0FBZ0c7WUFDaEcsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLGdCQUFnQixDQUFDLENBQUM7WUFDOUUsZ0JBQWdCLENBQUMsOEJBQThCLENBQUMsQ0FBQztnQkFDL0MsU0FBUyxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFNBQVM7Z0JBQ3pDLE9BQU8sRUFBRSxRQUFRO2FBQ2xCLENBQUMsQ0FBQztTQUNKO0lBRUgsQ0FBQztJQUVPLGlCQUFpQjtRQUV2QixNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUM7UUFFOUQsSUFBSSxXQUFXLENBQUMsY0FBYyxDQUFDLGFBQWEsQ0FBQyxJQUFJLFdBQVcsQ0FBQyxjQUFjLENBQUMsZ0JBQWdCLENBQUMsRUFBRTtZQUM3RixPQUFPO2dCQUNMLFdBQVcsRUFBRSxXQUFXLENBQUMsV0FBVztnQkFDcEMsY0FBYyxFQUFFLFdBQVcsQ0FBQyxjQUFjO2FBQzNDLENBQUM7U0FDSDtRQUVELE9BQU87SUFDVCxDQUFDO0lBRU8saUJBQWlCO1FBRXZCLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQztRQUU5RCxJQUFJLFdBQVcsQ0FBQyxjQUFjLENBQUMsV0FBVyxDQUFDLElBQUksV0FBVyxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsRUFBRTtZQUN2RixPQUFPO2dCQUNMLFNBQVMsRUFBRSxXQUFXLENBQUMsU0FBUztnQkFDaEMsVUFBVSxFQUFFLFdBQVcsQ0FBQyxVQUFVO2FBQ25DLENBQUM7U0FDSDtRQUVELE9BQU87SUFDVCxDQUFDO0lBRU8seUJBQXlCO1FBQy9CLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFVBQVU7YUFDNUIsSUFBSSxDQUNILFNBQVMsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQ2hDO2FBQ0EsU0FBUyxDQUFDLENBQUMsVUFBZ0IsRUFBRSxFQUFFO1lBQzlCLElBQUksQ0FBQyxpQ0FBaUMsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNyRCxDQUFDLENBQUMsQ0FBQztRQUVMLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLElBQUk7YUFDM0IsSUFBSSxDQUNILFNBQVMsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQ2hDO2FBQ0EsU0FBUyxDQUFDLENBQUMsVUFBcUIsRUFBRSxFQUFFO1lBQ25DLElBQUksQ0FBQyxzQ0FBc0MsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUMxRCxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFTyxpQ0FBaUMsQ0FBQyxVQUFnQjtRQUV4RCxNQUFNLCtCQUErQixHQUFHO1lBQ3RDLFdBQVcsRUFBRSxVQUFVLENBQUMsTUFBTTtZQUM5QixjQUFjLEVBQUUsVUFBVSxDQUFDLFNBQVM7U0FDckMsQ0FBQztRQUVGLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBRSxFQUFFLFdBQVcsRUFBRSwrQkFBK0IsRUFBRSxtQkFBbUIsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO0lBQzVHLENBQUM7SUFFTyxzQ0FBc0MsQ0FBQyxVQUFxQjtRQUVsRSxNQUFNLCtCQUErQixHQUFHO1lBQ3RDLFNBQVMsRUFBRSxVQUFVLENBQUMsUUFBUTtZQUM5QixVQUFVLEVBQUUsVUFBVSxDQUFDLFNBQVM7U0FDakMsQ0FBQztRQUVGLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBRSxFQUFFLFdBQVcsRUFBRSwrQkFBK0IsRUFBRSxtQkFBbUIsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO0lBQzVHLENBQUM7SUFFTyx1QkFBdUI7UUFFN0IsTUFBTSxzQkFBc0IsR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUM7UUFFN0MsT0FBTyxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFO1lBQzdCLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxzQkFBc0IsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLEVBQUU7O2dCQUNoRSxJQUFJLE9BQUEsSUFBSSxDQUFDLFVBQVUsMENBQUUsSUFBSSxZQUFJLElBQUksQ0FBQyxVQUFVLDBDQUFFLFNBQVMsQ0FBQSxFQUFFO29CQUN2RCxJQUFJLENBQUMsbUJBQW1CLENBQUMsV0FBVyxFQUFFLENBQUM7b0JBQ3ZDLE9BQU8sT0FBTyxFQUFFLENBQUM7aUJBQ2xCO1lBQ0gsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztJQUVMLENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUM1QixJQUFJLENBQUMsZUFBZSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ2xDLENBQUM7OztZQTNJRixTQUFTLFNBQUM7Z0JBQ1QsUUFBUSxFQUFFLDRCQUE0QjthQUN2Qzs7O1lBUlEsTUFBTTtZQUFFLGNBQWM7Ozs0QkFhNUIsS0FBSzsrQkFDTCxLQUFLO3lCQUNMLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEaXJlY3RpdmUsIElucHV0LCBPbkluaXQsIE9uRGVzdHJveSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgU29ydCwgTWF0U29ydGFibGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9zb3J0JztcbmltcG9ydCB7IFJvdXRlciwgQWN0aXZhdGVkUm91dGUgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgU3ViamVjdCwgaW50ZXJ2YWwsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgTWF0VGFibGVEYXRhU291cmNlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvdGFibGUnO1xuaW1wb3J0IHsgUGFnZUV2ZW50IH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvcGFnaW5hdG9yJztcblxuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiAnW05nTWF0VGFibGVRdWVyeVJlZmxlY3Rvcl0nXG59KVxuZXhwb3J0IGNsYXNzIE5nTWF0VGFibGVRdWVyeVJlZmxlY3RvckRpcmVjdGl2ZSBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcblxuICBwcml2YXRlIHVuc3Vic2NyaWJlQWxsJDogU3ViamVjdDxhbnk+ID0gbmV3IFN1YmplY3QoKTtcblxuICBASW5wdXQoKSBtYXRTb3J0QWN0aXZlOiBzdHJpbmc7XG4gIEBJbnB1dCgpIG1hdFNvcnREaXJlY3Rpb246ICdhc2MnIHwgJ2Rlc2MnO1xuICBASW5wdXQoKSBkYXRhU291cmNlOiBNYXRUYWJsZURhdGFTb3VyY2U8YW55PjtcbiAgcHJpdmF0ZSBfZGF0YVNvdXJjZUNoZWNrZXIkOiBTdWJzY3JpcHRpb247XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBfcm91dGVyOiBSb3V0ZXIsXG4gICAgcHJpdmF0ZSBfYWN0aXZhdGVkUm91dGU6IEFjdGl2YXRlZFJvdXRlXG4gICkgeyB9XG5cbiAgYXN5bmMgbmdPbkluaXQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy53YWl0Rm9yRGF0YXNvdXJjZVRvTG9hZCgpO1xuICAgIHRoaXMuX2luaXRpYWxTZXR1cCgpO1xuICAgIHRoaXMubGlzdGVuVG9TdGF0ZUNoYW5nZUV2ZW50cygpO1xuICB9XG5cbiAgcHJpdmF0ZSBfaW5pdGlhbFNldHVwKCk6IHZvaWQge1xuXG4gICAgY29uc3QgYWN0aXZlUGFnZVF1ZXJ5ID0gdGhpcy5pc1BhZ2VRdWVyeUFjdGl2ZSgpO1xuXG4gICAgaWYgKGFjdGl2ZVBhZ2VRdWVyeSkge1xuICAgICAgdGhpcy5kYXRhU291cmNlLnBhZ2luYXRvci5wYWdlSW5kZXggPSBhY3RpdmVQYWdlUXVlcnkucGFnZV9pbmRleDtcbiAgICAgIHRoaXMuZGF0YVNvdXJjZS5wYWdpbmF0b3IucGFnZVNpemUgPSBhY3RpdmVQYWdlUXVlcnkucGFnZV9zaXplO1xuICAgIH1cblxuICAgIC8vIEFjdGl2YXRpbmcgaW5pdGlhbCBTb3J0XG4gICAgY29uc3QgYWN0aXZlU29ydFF1ZXJ5ID0gdGhpcy5pc1NvcnRRdWVyeUFjdGl2ZSgpO1xuICAgIGlmIChhY3RpdmVTb3J0UXVlcnkpIHtcbiAgICAgIGNvbnN0IHNvcnRBY3RpdmVDb2x1bW4gPSBhY3RpdmVTb3J0UXVlcnkgPyAoYWN0aXZlU29ydFF1ZXJ5LnNvcnRfZGlyZWN0aW9uID8gYWN0aXZlU29ydFF1ZXJ5LnNvcnRfYWN0aXZlIDogbnVsbCkgOiB0aGlzLm1hdFNvcnRBY3RpdmU7XG4gICAgICBjb25zdCBzb3J0YWJsZTogTWF0U29ydGFibGUgPSB7XG4gICAgICAgIGlkOiBzb3J0QWN0aXZlQ29sdW1uLFxuICAgICAgICBzdGFydDogYWN0aXZlU29ydFF1ZXJ5ID8gKGFjdGl2ZVNvcnRRdWVyeS5zb3J0X2RpcmVjdGlvbiB8fCBudWxsKSA6IHRoaXMubWF0U29ydERpcmVjdGlvbixcbiAgICAgICAgZGlzYWJsZUNsZWFyOiB0cnVlXG4gICAgICB9O1xuICAgICAgdGhpcy5kYXRhU291cmNlLnNvcnQuc29ydChzb3J0YWJsZSk7XG5cbiAgICAgIGlmICghc29ydEFjdGl2ZUNvbHVtbikgeyByZXR1cm47IH1cbiAgICAgIC8vIE1hdGVyaWFsIFNvcnQgSXNzdWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2NvbXBvbmVudHMvaXNzdWVzLzEwMjQyXG4gICAgICAvLyBQaWNrZWQgYSBoYWNrIGZyb206IGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2NvbXBvbmVudHMvaXNzdWVzLzEwMjQyI2lzc3VlY29tbWVudC00MjE0OTA5OTFcbiAgICAgIGNvbnN0IGFjdGl2ZVNvcnRIZWFkZXIgPSB0aGlzLmRhdGFTb3VyY2Uuc29ydC5zb3J0YWJsZXMuZ2V0KHNvcnRBY3RpdmVDb2x1bW4pO1xuICAgICAgYWN0aXZlU29ydEhlYWRlclsnX3NldEFuaW1hdGlvblRyYW5zaXRpb25TdGF0ZSddKHtcbiAgICAgICAgZnJvbVN0YXRlOiB0aGlzLmRhdGFTb3VyY2Uuc29ydC5kaXJlY3Rpb24sXG4gICAgICAgIHRvU3RhdGU6ICdhY3RpdmUnLFxuICAgICAgfSk7XG4gICAgfVxuXG4gIH1cblxuICBwcml2YXRlIGlzU29ydFF1ZXJ5QWN0aXZlKCk6IHsgc29ydF9hY3RpdmU6IHN0cmluZywgc29ydF9kaXJlY3Rpb246ICdhc2MnIHwgJ2Rlc2MnIH0ge1xuXG4gICAgY29uc3QgcXVlcnlQYXJhbXMgPSB0aGlzLl9hY3RpdmF0ZWRSb3V0ZS5zbmFwc2hvdC5xdWVyeVBhcmFtcztcblxuICAgIGlmIChxdWVyeVBhcmFtcy5oYXNPd25Qcm9wZXJ0eSgnc29ydF9hY3RpdmUnKSB8fCBxdWVyeVBhcmFtcy5oYXNPd25Qcm9wZXJ0eSgnc29ydF9kaXJlY3Rpb24nKSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc29ydF9hY3RpdmU6IHF1ZXJ5UGFyYW1zLnNvcnRfYWN0aXZlLFxuICAgICAgICBzb3J0X2RpcmVjdGlvbjogcXVlcnlQYXJhbXMuc29ydF9kaXJlY3Rpb25cbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuO1xuICB9XG5cbiAgcHJpdmF0ZSBpc1BhZ2VRdWVyeUFjdGl2ZSgpOiB7IHBhZ2Vfc2l6ZTogbnVtYmVyLCBwYWdlX2luZGV4OiBudW1iZXIgfSB7XG5cbiAgICBjb25zdCBxdWVyeVBhcmFtcyA9IHRoaXMuX2FjdGl2YXRlZFJvdXRlLnNuYXBzaG90LnF1ZXJ5UGFyYW1zO1xuXG4gICAgaWYgKHF1ZXJ5UGFyYW1zLmhhc093blByb3BlcnR5KCdwYWdlX3NpemUnKSB8fCBxdWVyeVBhcmFtcy5oYXNPd25Qcm9wZXJ0eSgncGFnZV9pbmRleCcpKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBwYWdlX3NpemU6IHF1ZXJ5UGFyYW1zLnBhZ2Vfc2l6ZSxcbiAgICAgICAgcGFnZV9pbmRleDogcXVlcnlQYXJhbXMucGFnZV9pbmRleFxuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm47XG4gIH1cblxuICBwcml2YXRlIGxpc3RlblRvU3RhdGVDaGFuZ2VFdmVudHMoKTogdm9pZCB7XG4gICAgdGhpcy5kYXRhU291cmNlLnNvcnQuc29ydENoYW5nZVxuICAgICAgLnBpcGUoXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLnVuc3Vic2NyaWJlQWxsJClcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKHNvcnRDaGFuZ2U6IFNvcnQpID0+IHtcbiAgICAgICAgdGhpcy5fYXBwbHlTb3J0Q2hhbmdlc1RvVXJsUXVlcnlQYXJhbXMoc29ydENoYW5nZSk7XG4gICAgICB9KTtcblxuICAgIHRoaXMuZGF0YVNvdXJjZS5wYWdpbmF0b3IucGFnZVxuICAgICAgLnBpcGUoXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLnVuc3Vic2NyaWJlQWxsJClcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKHBhZ2VDaGFuZ2U6IFBhZ2VFdmVudCkgPT4ge1xuICAgICAgICB0aGlzLl9hcHBseVBhZ2VTdGF0ZUNoYW5nZXNUb1VybFF1ZXJ5UGFyYW1zKHBhZ2VDaGFuZ2UpO1xuICAgICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF9hcHBseVNvcnRDaGFuZ2VzVG9VcmxRdWVyeVBhcmFtcyhzb3J0Q2hhbmdlOiBTb3J0KTogdm9pZCB7XG5cbiAgICBjb25zdCBzb3J0aW5nQW5kUGFnaW5hdGlvblF1ZXJ5UGFyYW1zID0ge1xuICAgICAgc29ydF9hY3RpdmU6IHNvcnRDaGFuZ2UuYWN0aXZlLFxuICAgICAgc29ydF9kaXJlY3Rpb246IHNvcnRDaGFuZ2UuZGlyZWN0aW9uLFxuICAgIH07XG5cbiAgICB0aGlzLl9yb3V0ZXIubmF2aWdhdGUoW10sIHsgcXVlcnlQYXJhbXM6IHNvcnRpbmdBbmRQYWdpbmF0aW9uUXVlcnlQYXJhbXMsIHF1ZXJ5UGFyYW1zSGFuZGxpbmc6ICdtZXJnZScgfSk7XG4gIH1cblxuICBwcml2YXRlIF9hcHBseVBhZ2VTdGF0ZUNoYW5nZXNUb1VybFF1ZXJ5UGFyYW1zKHBhZ2VDaGFuZ2U6IFBhZ2VFdmVudCk6IHZvaWQge1xuXG4gICAgY29uc3Qgc29ydGluZ0FuZFBhZ2luYXRpb25RdWVyeVBhcmFtcyA9IHtcbiAgICAgIHBhZ2Vfc2l6ZTogcGFnZUNoYW5nZS5wYWdlU2l6ZSxcbiAgICAgIHBhZ2VfaW5kZXg6IHBhZ2VDaGFuZ2UucGFnZUluZGV4LFxuICAgIH07XG5cbiAgICB0aGlzLl9yb3V0ZXIubmF2aWdhdGUoW10sIHsgcXVlcnlQYXJhbXM6IHNvcnRpbmdBbmRQYWdpbmF0aW9uUXVlcnlQYXJhbXMsIHF1ZXJ5UGFyYW1zSGFuZGxpbmc6ICdtZXJnZScgfSk7XG4gIH1cblxuICBwcml2YXRlIHdhaXRGb3JEYXRhc291cmNlVG9Mb2FkKCk6IFByb21pc2U8dm9pZD4ge1xuXG4gICAgY29uc3QgdGl0bGVDaGVja2luZ0ludGVydmFsJCA9IGludGVydmFsKDUwMCk7XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgIHRoaXMuX2RhdGFTb3VyY2VDaGVja2VyJCA9IHRpdGxlQ2hlY2tpbmdJbnRlcnZhbCQuc3Vic2NyaWJlKHZhbCA9PiB7XG4gICAgICAgIGlmICh0aGlzLmRhdGFTb3VyY2U/LnNvcnQgJiYgdGhpcy5kYXRhU291cmNlPy5wYWdpbmF0b3IpIHtcbiAgICAgICAgICB0aGlzLl9kYXRhU291cmNlQ2hlY2tlciQudW5zdWJzY3JpYmUoKTtcbiAgICAgICAgICByZXR1cm4gcmVzb2x2ZSgpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcblxuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy51bnN1YnNjcmliZUFsbCQubmV4dCgpO1xuICAgIHRoaXMudW5zdWJzY3JpYmVBbGwkLmNvbXBsZXRlKCk7XG4gIH1cblxufVxuIl19