@intzi1992/cdk-table-exporter
Version:
Abstract CdkTable Exporter
160 lines • 20.9 kB
JavaScript
import { Directive, EventEmitter, Input, Output } from '@angular/core';
import * as i0 from "@angular/core";
import * as i1 from "./services/service-locator.service";
import * as i2 from "./services/data-extractor.service";
/**
* Exporter class for CdkTable. Abstracts the varying behaviors among different CdkTable implementations.
*/
export class CdkTableExporter {
constructor(serviceLocator, dataExtractor, _cdkTable) {
this.serviceLocator = serviceLocator;
this.dataExtractor = dataExtractor;
this._cdkTable = _cdkTable;
this.exportCompleted = new EventEmitter();
this.exportStarted = new EventEmitter();
}
/**
* Triggers page event chain thus extracting and exporting all the rows in nativetables in pages
*/
exportTable(exportType, options) {
this.loadExporter(exportType);
this._options = options;
this.exportStarted.emit();
this._isIterating = true;
this._isExporting = true;
this._data = new Array();
this.extractTableHeader();
try {
this.exportWithPagination();
}
catch (notPaginated) {
this.exportSinglePage();
}
}
toggleRow(index) {
const paginatedRowIndex = this.getPaginatedRowIndex(index);
if (this.isToggleOn(paginatedRowIndex)) {
this.toggleOff(paginatedRowIndex);
}
else {
this.toggleOn(paginatedRowIndex);
}
}
/**
* This event will clear rows selection done using toggleRow functionality
*/
resetToggleRows() {
this._selectedRows = [];
}
toggleOn(index) {
this._selectedRows = [...(this._selectedRows || []), index];
}
toggleOff(index) {
this._selectedRows = this._selectedRows.filter(x => x !== index);
}
isToggleOn(index) {
return this._selectedRows?.includes(index);
}
loadExporter(exportType) {
this._exporterService = this.serviceLocator.getService(exportType, this.exporter);
}
exportWithPagination() {
this._initialPageIndex = this.getCurrentPageIndex();
this.initPageHandler();
this.goToPage(0);
}
exportSinglePage() {
this.extractDataOnCurrentPage();
this.extractTableFooter();
this.exportExtractedData();
}
extractDataOnCurrentPage() {
const rows = this.dataExtractor.extractRows(this._cdkTable, this.hiddenColumns);
this._data = this._data.concat(this.getSelectedRows(rows));
}
getSelectedRows(rows) {
if (this.isSelectiveExport()) {
return rows.filter((_, i) => this._selectedRows.includes(this.getPaginatedRowIndex(i)));
}
else {
return rows;
}
}
isSelectiveExport() {
return this._selectedRows && !this.isMasterToggleOff() && !this.isMasterToggleOn();
}
isMasterToggleOn() {
return this.compareSelectedRowCount(this.getTotalItemsCount());
}
isMasterToggleOff() {
return this.compareSelectedRowCount(0);
}
compareSelectedRowCount(rowCount) {
return !!(this._selectedRows.length === rowCount);
}
initPageHandler() {
if (!this._subscription) {
this._subscription = this.getPageChangeObservable()?.subscribe(() => {
setTimeout(() => {
if (this._isIterating) {
this.extractDataOnCurrentPage();
if (this.hasNextPage()) {
this.nextPage();
}
else {
this._isIterating = false;
this.goToPage(this._initialPageIndex);
}
}
else if (this._isExporting) {
this._isExporting = false;
this.extractTableFooter();
this.exportExtractedData();
}
});
});
}
}
exportExtractedData() {
this._exporterService.export(this._data, this._options);
this._data = new Array();
this.exportCompleted.emit();
}
extractSpecialRows(outlet) {
this._data.push(...this.dataExtractor.extractRows(this._cdkTable, this.hiddenColumns, outlet));
}
extractTableHeader() {
this.extractSpecialRows(this._cdkTable._headerRowOutlet);
}
extractTableFooter() {
this.extractSpecialRows(this._cdkTable._footerRowOutlet);
}
hasNextPage() {
if (this.getCurrentPageIndex() < this.getPageCount() - 1) {
return true;
}
else {
return false;
}
}
nextPage() {
this.goToPage(this.getCurrentPageIndex() + 1);
}
getPaginatedRowIndex(index) {
return index + (this.getPageSize() * this.getCurrentPageIndex());
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: CdkTableExporter, deps: "invalid", target: i0.ɵɵFactoryTarget.Directive }); }
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.3.12", type: CdkTableExporter, inputs: { hiddenColumns: "hiddenColumns", exporter: "exporter" }, outputs: { exportCompleted: "exportCompleted", exportStarted: "exportStarted" }, ngImport: i0 }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: CdkTableExporter, decorators: [{
type: Directive
}], ctorParameters: () => [{ type: i1.ServiceLocatorService }, { type: i2.DataExtractorService }, { type: undefined }], propDecorators: { hiddenColumns: [{
type: Input
}], exporter: [{
type: Input
}], exportCompleted: [{
type: Output
}], exportStarted: [{
type: Output
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2RrLXRhYmxlLWV4cG9ydGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvY2RrLXRhYmxlLWV4cG9ydGVyL3NyYy9saWIvY2RrLXRhYmxlLWV4cG9ydGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7Ozs7QUFRdkU7O0dBRUc7QUFFSCxNQUFNLE9BQWdCLGdCQUFnQjtJQTBCcEMsWUFDVSxjQUFxQyxFQUNyQyxhQUFtQyxFQUNqQyxTQUFjO1FBRmhCLG1CQUFjLEdBQWQsY0FBYyxDQUF1QjtRQUNyQyxrQkFBYSxHQUFiLGFBQWEsQ0FBc0I7UUFDakMsY0FBUyxHQUFULFNBQVMsQ0FBSztRQXZCaEIsb0JBQWUsR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDO1FBQzNDLGtCQUFhLEdBQUcsSUFBSSxZQUFZLEVBQVEsQ0FBQztJQXVCaEQsQ0FBQztJQWlDSjs7T0FFRztJQUNILFdBQVcsQ0FBQyxVQUEyRSxFQUFFLE9BQTZDO1FBQ3BJLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDOUIsSUFBSSxDQUFDLFFBQVEsR0FBRyxPQUFPLENBQUM7UUFDeEIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUMxQixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQztRQUN6QixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQztRQUN6QixJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksS0FBSyxFQUFPLENBQUM7UUFDOUIsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFDMUIsSUFBSSxDQUFDO1lBQ0gsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7UUFDOUIsQ0FBQztRQUFDLE9BQU8sWUFBWSxFQUFFLENBQUM7WUFDdEIsSUFBSSxDQUFDLGdC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RyxRQUFRO3NCQUFoQixLQUFLO2dCQUNJLGVBQWU7c0JBQXhCLE1BQU07Z0JBQ0csYUFBYTtzQkFBdEIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERhdGFSb3dPdXRsZXQgfSBmcm9tICdAYW5ndWxhci9jZGsvdGFibGUnO1xuaW1wb3J0IHsgRGlyZWN0aXZlLCBFdmVudEVtaXR0ZXIsIElucHV0LCBPdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE9ic2VydmFibGUsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgRXhwb3J0VHlwZSB9IGZyb20gJy4vZXhwb3J0LXR5cGUnO1xuaW1wb3J0IHsgRXhjZWxPcHRpb25zLCBPcHRpb25zLCBUeHRPcHRpb25zIH0gZnJvbSAnLi9vcHRpb25zJztcbmltcG9ydCB7IERhdGFFeHRyYWN0b3JTZXJ2aWNlIH0gZnJvbSAnLi9zZXJ2aWNlcy9kYXRhLWV4dHJhY3Rvci5zZXJ2aWNlJztcbmltcG9ydCB7IEV4cG9ydGVyIH0gZnJvbSAnLi9zZXJ2aWNlcy9leHBvcnRlcnMvZXhwb3J0ZXInO1xuaW1wb3J0IHsgU2VydmljZUxvY2F0b3JTZXJ2aWNlIH0gZnJvbSAnLi9zZXJ2aWNlcy9zZXJ2aWNlLWxvY2F0b3Iuc2VydmljZSc7XG5cbi8qKlxuICogRXhwb3J0ZXIgY2xhc3MgZm9yIENka1RhYmxlLiBBYnN0cmFjdHMgdGhlIHZhcnlpbmcgYmVoYXZpb3JzIGFtb25nIGRpZmZlcmVudCBDZGtUYWJsZSBpbXBsZW1lbnRhdGlvbnMuXG4gKi9cbkBEaXJlY3RpdmUoKVxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIENka1RhYmxlRXhwb3J0ZXIge1xuXG4gIHByaXZhdGUgX2V4cG9ydGVyU2VydmljZTogRXhwb3J0ZXI8T3B0aW9ucz47XG5cbiAgQElucHV0KCkgaGlkZGVuQ29sdW1ucz86IEFycmF5PG51bWJlcj47XG4gIEBJbnB1dCgpIGV4cG9ydGVyPzogRXhwb3J0ZXI8T3B0aW9ucz47XG4gIEBPdXRwdXQoKSBleHBvcnRDb21wbGV0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIEBPdXRwdXQoKSBleHBvcnRTdGFydGVkID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuXG4gIC8qKlxuICAgKiBEYXRhIGFycmF5IHdoaWNoIGlzIGV4dHJhY3RlZCBmcm9tIG5hdGl2ZVRhYmxlXG4gICAqL1xuICBwcml2YXRlIF9kYXRhOiBBcnJheTxhbnk+O1xuXG4gIHByaXZhdGUgX2lzSXRlcmF0aW5nOiBib29sZWFuO1xuXG4gIHByaXZhdGUgX2luaXRpYWxQYWdlSW5kZXg6IG51bWJlcjtcblxuICBwcml2YXRlIF9pc0V4cG9ydGluZzogYm9vbGVhbjtcblxuICBwcml2YXRlIF9zdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbiB8IHVuZGVmaW5lZDtcblxuICBwcml2YXRlIF9vcHRpb25zPzogT3B0aW9ucztcblxuICBwcml2YXRlIF9zZWxlY3RlZFJvd3M6IEFycmF5PG51bWJlcj47XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBzZXJ2aWNlTG9jYXRvcjogU2VydmljZUxvY2F0b3JTZXJ2aWNlLFxuICAgIHByaXZhdGUgZGF0YUV4dHJhY3RvcjogRGF0YUV4dHJhY3RvclNlcnZpY2UsXG4gICAgcHJvdGVjdGVkIF9jZGtUYWJsZTogYW55XG4gICkge31cblxuICAvKipcbiAgICogTXVzdCByZXR1cm4gdGhlIG51bWJlciBvZiBwYWdlcyBvZiB0aGUgdGFibGVcbiAgICovXG4gIHB1YmxpYyBhYnN0cmFjdCBnZXRQYWdlQ291bnQoKTogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBNdXN0IHJldHVybiB0aGUgbnVtYmVyIG9mIGl0ZW1zIHRvIGRpc3BsYXkgb24gYSBwYWdlXG4gICAqL1xuICBwdWJsaWMgYWJzdHJhY3QgZ2V0UGFnZVNpemUoKTogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBNdXN0IHJldHVybiB0aGUgaW5kZXggb2YgdGhlIGN1cnJlbnQgcGFnZSB0aGF0J3MgZGlzcGxheWVkXG4gICAqL1xuICBwdWJsaWMgYWJzdHJhY3QgZ2V0Q3VycmVudFBhZ2VJbmRleCgpOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIE11c3QgcmV0dXJuIHRoZSB0b3RhbCBudW1iZXIgb2YgaXRlbXMgaW4gdGhlIHRhYmxlXG4gICAqL1xuICBwdWJsaWMgYWJzdHJhY3QgZ2V0VG90YWxJdGVtc0NvdW50KCk6IG51bWJlcjtcblxuICAvKipcbiAgICogV2hlbiBjYWxsZWQsIHRoZSBDZGtUYWJsZSBzaG91bGQgcmVuZGVyIHRoZSByb3dzIGluc2lkZSB0aGUgcGFnZSB3aG9zZSBpbmRleCBnaXZlbiBhcyBwYXJhbWV0ZXJcbiAgICogQHBhcmFtIGluZGV4IHBhZ2UgaW5kZXhcbiAgICovXG4gIHB1YmxpYyBhYnN0cmFjdCBnb1RvUGFnZShpbmRleDogbnVtYmVyKTogdm9pZDtcblxuICAvKipcbiAgICogTXVzdCByZXR1cm4gYW4gb2JzZXJ2YWJsZSB0aGF0IG5vdGlmaWVzIHRoZSBzdWJzY3JpYmVycyBhYm91dCBwYWdlIGNoYW5nZXNcbiAgICovXG4gIHB1YmxpYyBhYnN0cmFjdCBnZXRQYWdlQ2hhbmdlT2JzZXJ2YWJsZSgpOiBPYnNlcnZhYmxlPGFueT4gfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIFRyaWdnZXJzIHBhZ2UgZXZlbnQgY2hhaW4gdGh1cyBleHRyYWN0aW5nIGFuZCBleHBvcnRpbmcgYWxsIHRoZSByb3dzIGluIG5hdGl2ZXRhYmxlcyBpbiBwYWdlc1xuICAgKi9cbiAgZXhwb3J0VGFibGUoZXhwb3J0VHlwZT86IEV4cG9ydFR5cGUgfCAneGxzJyB8ICd4bHN4JyB8ICdjc3YnIHwgJ3R4dCcgfCAnanNvbicgfCAnb3RoZXInLCBvcHRpb25zPzogT3B0aW9ucyB8IEV4Y2VsT3B0aW9ucyB8IFR4dE9wdGlvbnMpIHtcbiAgICB0aGlzLmxvYWRFeHBvcnRlcihleHBvcnRUeXBlKTtcbiAgICB0aGlzLl9vcHRpb25zID0gb3B0aW9ucztcbiAgICB0aGlzLmV4cG9ydFN0YXJ0ZWQuZW1pdCgpO1xuICAgIHRoaXMuX2lzSXRlcmF0aW5nID0gdHJ1ZTtcbiAgICB0aGlzLl9pc0V4cG9ydGluZyA9IHRydWU7XG4gICAgdGhpcy5fZGF0YSA9IG5ldyBBcnJheTxhbnk+KCk7XG4gICAgdGhpcy5leHRyYWN0VGFibGVIZWFkZXIoKTtcbiAgICB0cnkge1xuICAgICAgdGhpcy5leHBvcnRXaXRoUGFnaW5hdGlvbigpO1xuICAgIH0gY2F0Y2ggKG5vdFBhZ2luYXRlZCkge1xuICAgICAgdGhpcy5leHBvcnRTaW5nbGVQYWdlKCk7XG4gICAgfVxuICB9XG5cbiAgdG9nZ2xlUm93KGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCBwYWdpbmF0ZWRSb3dJbmRleDogbnVtYmVyID0gdGhpcy5nZXRQYWdpbmF0ZWRSb3dJbmRleChpbmRleCk7XG4gICAgaWYgKHRoaXMuaXNUb2dnbGVPbihwYWdpbmF0ZWRSb3dJbmRleCkpIHtcbiAgICAgIHRoaXMudG9nZ2xlT2ZmKHBhZ2luYXRlZFJvd0luZGV4KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy50b2dnbGVPbihwYWdpbmF0ZWRSb3dJbmRleCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgZXZlbnQgd2lsbCBjbGVhciByb3dzIHNlbGVjdGlvbiBkb25lIHVzaW5nIHRvZ2dsZVJvdyBmdW5jdGlvbmFsaXR5XG4gICAqL1xuICByZXNldFRvZ2dsZVJvd3MoKSB7XG4gICAgdGhpcy5fc2VsZWN0ZWRSb3dzID0gW107XG4gIH1cblxuICBwcml2YXRlIHRvZ2dsZU9uKGluZGV4OiBudW1iZXIpIHtcbiAgICB0aGlzLl9zZWxlY3RlZFJvd3MgPSBbLi4uKHRoaXMuX3NlbGVjdGVkUm93cyB8fCBbXSksIGluZGV4XTtcbiAgfVxuXG4gIHByaXZhdGUgdG9nZ2xlT2ZmKGluZGV4OiBudW1iZXIpIHtcbiAgICB0aGlzLl9zZWxlY3RlZFJvd3MgPSAgdGhpcy5fc2VsZWN0ZWRSb3dzLmZpbHRlcih4ID0+IHggIT09IGluZGV4KTtcbiAgfVxuXG4gIHByaXZhdGUgaXNUb2dnbGVPbihpbmRleDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3NlbGVjdGVkUm93cz8uaW5jbHVkZXMoaW5kZXgpO1xuICB9XG5cbiAgcHJpdmF0ZSBsb2FkRXhwb3J0ZXIoZXhwb3J0VHlwZTogYW55KSB7XG4gICAgdGhpcy5fZXhwb3J0ZXJTZXJ2aWNlID0gdGhpcy5zZXJ2aWNlTG9jYXRvci5nZXRTZXJ2aWNlKGV4cG9ydFR5cGUsIHRoaXMuZXhwb3J0ZXIpO1xuICB9XG5cbiAgcHJpdmF0ZSBleHBvcnRXaXRoUGFnaW5hdGlvbigpIHtcbiAgICB0aGlzLl9pbml0aWFsUGFnZUluZGV4ID0gdGhpcy5nZXRDdXJyZW50UGFnZUluZGV4KCk7XG4gICAgdGhpcy5pbml0UGFnZUhhbmRsZXIoKTtcbiAgICB0aGlzLmdvVG9QYWdlKDApO1xuICB9XG5cbiAgcHJpdmF0ZSBleHBvcnRTaW5nbGVQYWdlKCkge1xuICAgIHRoaXMuZXh0cmFjdERhdGFPbkN1cnJlbnRQYWdlKCk7XG4gICAgdGhpcy5leHRyYWN0VGFibGVGb290ZXIoKTtcbiAgICB0aGlzLmV4cG9ydEV4dHJhY3RlZERhdGEoKTtcbiAgfVxuXG4gIHByaXZhdGUgZXh0cmFjdERhdGFPbkN1cnJlbnRQYWdlKCkge1xuICAgIGNvbnN0IHJvd3MgPSB0aGlzLmRhdGFFeHRyYWN0b3IuZXh0cmFjdFJvd3ModGhpcy5fY2RrVGFibGUsIHRoaXMuaGlkZGVuQ29sdW1ucyk7XG4gICAgdGhpcy5fZGF0YSA9IHRoaXMuX2RhdGEuY29uY2F0KHRoaXMuZ2V0U2VsZWN0ZWRSb3dzKHJvd3MpKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0U2VsZWN0ZWRSb3dzKHJvd3M6IEFycmF5PGFueT4pIHtcbiAgICBpZiAodGhpcy5pc1NlbGVjdGl2ZUV4cG9ydCgpKSB7XG4gICAgICByZXR1cm4gcm93cy5maWx0ZXIoKF8sIGkpID0+IHRoaXMuX3NlbGVjdGVkUm93cy5pbmNsdWRlcyh0aGlzLmdldFBhZ2luYXRlZFJvd0luZGV4KGkpKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiByb3dzO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaXNTZWxlY3RpdmVFeHBvcnQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3NlbGVjdGVkUm93cyAmJiAhdGhpcy5pc01hc3RlclRvZ2dsZU9mZigpICYmICAhdGhpcy5pc01hc3RlclRvZ2dsZU9uKCk7XG4gIH1cblxuICBwcml2YXRlIGlzTWFzdGVyVG9nZ2xlT24oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuY29tcGFyZVNlbGVjdGVkUm93Q291bnQodGhpcy5nZXRUb3RhbEl0ZW1zQ291bnQoKSk7XG4gIH1cblxuICBwcml2YXRlIGlzTWFzdGVyVG9nZ2xlT2ZmKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmNvbXBhcmVTZWxlY3RlZFJvd0NvdW50KDApO1xuICB9XG5cbiAgcHJpdmF0ZSBjb21wYXJlU2VsZWN0ZWRSb3dDb3VudChyb3dDb3VudDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhKHRoaXMuX3NlbGVjdGVkUm93cy5sZW5ndGggPT09IHJvd0NvdW50KTtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdFBhZ2VIYW5kbGVyKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5fc3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLl9zdWJzY3JpcHRpb24gPSB0aGlzLmdldFBhZ2VDaGFuZ2VPYnNlcnZhYmxlKCk/LnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIGlmICh0aGlzLl9pc0l0ZXJhdGluZykge1xuICAgICAgICAgICAgdGhpcy5leHRyYWN0RGF0YU9uQ3VycmVudFBhZ2UoKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmhhc05leHRQYWdlKCkpIHtcbiAgICAgICAgICAgICAgdGhpcy5uZXh0UGFnZSgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGhpcy5faXNJdGVyYXRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgdGhpcy5nb1RvUGFnZSh0aGlzLl9pbml0aWFsUGFnZUluZGV4KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX2lzRXhwb3J0aW5nKSB7XG4gICAgICAgICAgICB0aGlzLl9pc0V4cG9ydGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5leHRyYWN0VGFibGVGb290ZXIoKTtcbiAgICAgICAgICAgIHRoaXMuZXhwb3J0RXh0cmFjdGVkRGF0YSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGV4cG9ydEV4dHJhY3RlZERhdGEoKSB7XG4gICAgdGhpcy5fZXhwb3J0ZXJTZXJ2aWNlLmV4cG9ydCh0aGlzLl9kYXRhLCB0aGlzLl9vcHRpb25zKTtcbiAgICB0aGlzLl9kYXRhID0gbmV3IEFycmF5PGFueT4oKTtcbiAgICB0aGlzLmV4cG9ydENvbXBsZXRlZC5lbWl0KCk7XG4gIH1cblxuICBwcml2YXRlIGV4dHJhY3RTcGVjaWFsUm93cyhvdXRsZXQ6IERhdGFSb3dPdXRsZXQpIHtcbiAgICB0aGlzLl9kYXRhLnB1c2goLi4udGhpcy5kYXRhRXh0cmFjdG9yLmV4dHJhY3RSb3dzKHRoaXMuX2Nka1RhYmxlLCB0aGlzLmhpZGRlbkNvbHVtbnMsIG91dGxldCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBleHRyYWN0VGFibGVIZWFkZXIoKSB7XG4gICAgdGhpcy5leHRyYWN0U3BlY2lhbFJvd3ModGhpcy5fY2RrVGFibGUuX2hlYWRlclJvd091dGxldCk7XG4gIH1cblxuICBwcml2YXRlIGV4dHJhY3RUYWJsZUZvb3RlcigpIHtcbiAgICB0aGlzLmV4dHJhY3RTcGVjaWFsUm93cyh0aGlzLl9jZGtUYWJsZS5fZm9vdGVyUm93T3V0bGV0KTtcbiAgfVxuXG4gIHByaXZhdGUgaGFzTmV4dFBhZ2UoKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuZ2V0Q3VycmVudFBhZ2VJbmRleCgpIDwgdGhpcy5nZXRQYWdlQ291bnQoKSAtIDEpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBuZXh0UGFnZSgpOiB2b2lkIHtcbiAgICB0aGlzLmdvVG9QYWdlKHRoaXMuZ2V0Q3VycmVudFBhZ2VJbmRleCgpICsgMSk7XG4gIH1cblxuICBwcml2YXRlIGdldFBhZ2luYXRlZFJvd0luZGV4KGluZGV4OiBudW1iZXIpOiBudW1iZXIge1xuICAgIHJldHVybiBpbmRleCArICh0aGlzLmdldFBhZ2VTaXplKCkgKiB0aGlzLmdldEN1cnJlbnRQYWdlSW5kZXgoKSk7XG4gIH1cbn1cbiJdfQ==