UNPKG

@iotize/ionic

Version:

Iotize specific building blocks on top of @ionic/angular.

168 lines 26.1 kB
import { __decorate, __metadata } from "tslib"; import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Input, } from '@angular/core'; import { ModalController } from '@ionic/angular'; import { ColumnMode } from '@swimlane/ngx-datatable'; import { BehaviorSubject, Subject, combineLatest } from 'rxjs'; import { switchMap, takeUntil } from 'rxjs/operators'; import { MonitoringAppGenComponent } from '../../metadata/decorators'; import { ChartDataModel, } from '../ChartDataModel'; import { TapVariableDataPopupComponent } from '../tap-variable-data-popup/tap-variable-data-popup.component'; import * as i0 from "@angular/core"; import * as i1 from "@ionic/angular"; import * as i2 from "@angular/common"; import * as i3 from "@swimlane/ngx-datatable"; import * as i4 from "../../ui-directive/export-data.directive"; const TABLE_LIMIT = 10; let TapVariableTableComponent = class TapVariableTableComponent { modalController; cdr; rows = []; columns; darkModeStatus; chartModel = new ChartDataModel(); loadingIndicator = true; reorderable = false; columnMode = ColumnMode.force; limit = TABLE_LIMIT; valueLabel = 'Value'; nameLabel; set history(enable) { this._history.next(enable); } set valueCountLimit(limit) { if (limit === undefined) { limit = 30; } this._valueCountLimit.next(limit); } showExportButton = false; exportedFileName; set label(indexOrArray) { this.chartModel.initLabel(indexOrArray); } _history = new BehaviorSubject(true); _valueCountLimit = new BehaviorSubject(30); destroyed = new Subject(); _input = new BehaviorSubject([]); multiple = false; set variable(variableOrArray) { this.multiple = !!Array.isArray(variableOrArray); this.input = this.chartModel.initVariable(variableOrArray); } set input(inputs) { this._input.next(inputs); } columnsPushForEachKey(key) { console.log('DEBUG columnsPushForEachKey', key, this.columns); if (this.history && key === 'name') { this.columns.push({ prop: key, name: !this.nameLabel ? this.history ? 'Time' : 'Name' : this.nameLabel, sortable: true, }); } else if (key === 'value') { this.columns.push({ prop: key, name: this.valueLabel, sortable: true }); } else if (key !== 'extra') { this.columns.push({ prop: key, name: key, sortable: true }); } } constructor(modalController, cdr) { this.modalController = modalController; this.cdr = cdr; } createExportedData() { return this.rows; } ngAfterViewInit() { this.darkModeStatus = window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches; combineLatest([this._valueCountLimit, this._input, this._history]) .pipe(takeUntil(this.destroyed), switchMap(([valueCountLimit, input, history]) => { this.chartModel.destroyCurrentSub(); if (this.multiple) { return this.chartModel.defineMultiInputStream(input); } else { return this.chartModel.defineInputStreamSingle(input, history, valueCountLimit, true); } })) .subscribe((result) => { this.resultToTableData(result); }); } resultToTableData(result) { this.rows = result; this.columns = []; const jsonData = JSON.parse(JSON.stringify(this.rows[0])); for (const key of Object.keys(jsonData)) { if (key === 'series') { jsonData['series'].forEach((k) => this.columnsPushForEachKey(k.name)); } else { this.columnsPushForEachKey(key); } } this.loadingIndicator = false; this.cdr.detectChanges(); } onSelect(event) { if (typeof event === 'object') { this.chartModel .showDetail(event, this.modalController, TapVariableDataPopupComponent) .catch((err) => { console.warn(err); }); } } ngOnDestroy() { this.chartModel.destroyCurrentSub(); this.destroyed.next(); this.destroyed.complete(); } /** @nocollapse */ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: TapVariableTableComponent, deps: [{ token: i1.ModalController }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); /** @nocollapse */ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: TapVariableTableComponent, selector: "tap-variable-table", inputs: { loadingIndicator: "loadingIndicator", reorderable: "reorderable", columnMode: "columnMode", limit: "limit", valueLabel: "valueLabel", nameLabel: "nameLabel", history: "history", valueCountLimit: "valueCountLimit", showExportButton: "showExportButton", exportedFileName: "exportedFileName", label: "label", variable: "variable", input: "input" }, ngImport: i0, template: "<div style=\"position: relative\">\n <ngx-datatable\n [ngClass]=\"darkModeStatus ? 'dark' : 'material'\"\n [rows]=\"rows\"\n [loadingIndicator]=\"loadingIndicator\"\n [columns]=\"columns\"\n [columnMode]=\"columnMode\"\n [headerHeight]=\"50\"\n [footerHeight]=\"50\"\n [rowHeight]=\"50\"\n [reorderable]=\"reorderable\"\n [scrollbarH]=\"true\"\n [limit]=\"limit\"\n >\n </ngx-datatable>\n <!--\n [targetMarkerTemplate]=\"targetMarkerTemplate\"\n <ng-template #targetMarkerTemplate let-class=\"class\">\n <div [ngClass]=\"class\">\n <div class=\"icon datatable-icon-down\"></div>\n <div class=\"icon datatable-icon-up\"></div>\n </div>\n </ng-template>\n -->\n\n <ion-fab-button\n id=\"exportFabButton\"\n size=\"small\"\n tapExportData\n [dataToExport]=\"createExportedData.bind(this)\"\n [exportedFileName]=\"exportedFileName\"\n *ngIf=\"showExportButton\"\n >\n <ion-icon name=\"download\"></ion-icon>\n </ion-fab-button>\n</div>\n", styles: [":host ::ng-deep .datatable-scroll{width:100%!important}:host ::ng-deep datatable-pager{width:85%!important}#exportFabButton{position:absolute;top:0;right:2px}:host ::ng-deep .page-count{white-space:nowrap!important}:host ::ng-deep .datatable-pager{max-width:85%!important}\n"], dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i3.DatatableComponent, selector: "ngx-datatable", inputs: ["targetMarkerTemplate", "rows", "groupRowsBy", "groupedRows", "columns", "selected", "scrollbarV", "scrollbarH", "rowHeight", "columnMode", "headerHeight", "footerHeight", "externalPaging", "externalSorting", "limit", "count", "offset", "loadingIndicator", "selectionType", "reorderable", "swapColumns", "sortType", "sorts", "cssClasses", "messages", "rowClass", "selectCheck", "displayCheck", "groupExpansionDefault", "trackByProp", "selectAllRowsOnPage", "virtualization", "treeFromRelation", "treeToRelation", "summaryRow", "summaryHeight", "summaryPosition", "rowIdentity"], outputs: ["scroll", "activate", "select", "sort", "page", "reorder", "resize", "tableContextmenu", "treeAction"] }, { kind: "component", type: i1.IonFabButton, selector: "ion-fab-button", inputs: ["activated", "closeIcon", "color", "disabled", "download", "href", "mode", "rel", "routerAnimation", "routerDirection", "show", "size", "target", "translucent", "type"] }, { kind: "component", type: i1.IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "directive", type: i4.ExportDataDirective, selector: "[tapExportData]", inputs: ["exportedFileName", "dataToExport", "format"], outputs: ["exportDataError"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }; TapVariableTableComponent = __decorate([ MonitoringAppGenComponent({}), __metadata("design:paramtypes", [ModalController, ChangeDetectorRef]) ], TapVariableTableComponent); export { TapVariableTableComponent }; i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: TapVariableTableComponent, decorators: [{ type: Component, args: [{ changeDetection: ChangeDetectionStrategy.OnPush, selector: 'tap-variable-table', template: "<div style=\"position: relative\">\n <ngx-datatable\n [ngClass]=\"darkModeStatus ? 'dark' : 'material'\"\n [rows]=\"rows\"\n [loadingIndicator]=\"loadingIndicator\"\n [columns]=\"columns\"\n [columnMode]=\"columnMode\"\n [headerHeight]=\"50\"\n [footerHeight]=\"50\"\n [rowHeight]=\"50\"\n [reorderable]=\"reorderable\"\n [scrollbarH]=\"true\"\n [limit]=\"limit\"\n >\n </ngx-datatable>\n <!--\n [targetMarkerTemplate]=\"targetMarkerTemplate\"\n <ng-template #targetMarkerTemplate let-class=\"class\">\n <div [ngClass]=\"class\">\n <div class=\"icon datatable-icon-down\"></div>\n <div class=\"icon datatable-icon-up\"></div>\n </div>\n </ng-template>\n -->\n\n <ion-fab-button\n id=\"exportFabButton\"\n size=\"small\"\n tapExportData\n [dataToExport]=\"createExportedData.bind(this)\"\n [exportedFileName]=\"exportedFileName\"\n *ngIf=\"showExportButton\"\n >\n <ion-icon name=\"download\"></ion-icon>\n </ion-fab-button>\n</div>\n", styles: [":host ::ng-deep .datatable-scroll{width:100%!important}:host ::ng-deep datatable-pager{width:85%!important}#exportFabButton{position:absolute;top:0;right:2px}:host ::ng-deep .page-count{white-space:nowrap!important}:host ::ng-deep .datatable-pager{max-width:85%!important}\n"] }] }], ctorParameters: () => [{ type: i1.ModalController }, { type: i0.ChangeDetectorRef }], propDecorators: { loadingIndicator: [{ type: Input }], reorderable: [{ type: Input }], columnMode: [{ type: Input }], limit: [{ type: Input }], valueLabel: [{ type: Input }], nameLabel: [{ type: Input }], history: [{ type: Input }], valueCountLimit: [{ type: Input }], showExportButton: [{ type: Input }], exportedFileName: [{ type: Input }], label: [{ type: Input }], variable: [{ type: Input }], input: [{ type: Input }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFwLXZhcmlhYmxlLXRhYmxlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2lvdGl6ZS1pb25pYy9tb25pdG9yaW5nL3NyYy9saWIvdWktY29tcG9uZW50cy90YXAtdmFyaWFibGUtdGFibGUvdGFwLXZhcmlhYmxlLXRhYmxlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2lvdGl6ZS1pb25pYy9tb25pdG9yaW5nL3NyYy9saWIvdWktY29tcG9uZW50cy90YXAtdmFyaWFibGUtdGFibGUvdGFwLXZhcmlhYmxlLXRhYmxlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBRUwsdUJBQXVCLEVBQ3ZCLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsS0FBSyxHQUVOLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUVqRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDckQsT0FBTyxFQUFFLGVBQWUsRUFBRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQy9ELE9BQU8sRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDdEQsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDdEUsT0FBTyxFQUNMLGNBQWMsR0FJZixNQUFNLG1CQUFtQixDQUFDO0FBRTNCLE9BQU8sRUFBRSw2QkFBNkIsRUFBRSxNQUFNLDhEQUE4RCxDQUFDOzs7Ozs7QUFFN0csTUFBTSxXQUFXLEdBQUcsRUFBRSxDQUFDO0FBU2hCLElBQU0seUJBQXlCLEdBQS9CLE1BQU0seUJBQXlCO0lBZ0czQjtJQUNDO0lBaEdWLElBQUksR0FBMkMsRUFBRSxDQUFDO0lBRWxELE9B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QUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQzVCLENBQUM7MkhBaktVLHlCQUF5QjsrR0FBekIseUJBQXlCLDhaQ2hDdEMsc2dDQW9DQTs7QURKYSx5QkFBeUI7SUFQckMseUJBQXlCLENBQUMsRUFBRSxDQUFDO3FDQXVHRixlQUFlO1FBQzFCLGlCQUFpQjtHQWpHckIseUJBQXlCLENBa0tyQzs7NEZBbEtZLHlCQUF5QjtrQkFOckMsU0FBUztzQ0FDUyx1QkFBdUIsQ0FBQyxNQUFNLFlBQ3JDLG9CQUFvQjtvSEFhOUIsZ0JBQWdCO3NCQURmLEtBQUs7Z0JBSU4sV0FBVztzQkFEVixLQUFLO2dCQUlOLFVBQVU7c0JBRFQsS0FBSztnQkFJTixLQUFLO3NCQURKLEtBQUs7Z0JBSU4sVUFBVTtzQkFEVCxLQUFLO2dCQUlOLFNBQVM7c0JBRFIsS0FBSztnQkFJRixPQUFPO3NCQURWLEtBQUs7Z0JBTUYsZUFBZTtzQkFEbEIsS0FBSztnQkFTTixnQkFBZ0I7c0JBRGYsS0FBSztnQkFJTixnQkFBZ0I7c0JBRGYsS0FBSztnQkFJRixLQUFLO3NCQURSLEtBQUs7Z0JBZ0JGLFFBQVE7c0JBRFgsS0FBSztnQkFZRixLQUFLO3NCQURSLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgSW5wdXQsXG4gIE9uRGVzdHJveSxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBNb2RhbENvbnRyb2xsZXIgfSBmcm9tICdAaW9uaWMvYW5ndWxhcic7XG5pbXBvcnQgeyBBYnN0cmFjdFZhcmlhYmxlIH0gZnJvbSAnQGlvdGl6ZS90YXAvZGF0YSc7XG5pbXBvcnQgeyBDb2x1bW5Nb2RlIH0gZnJvbSAnQHN3aW1sYW5lL25neC1kYXRhdGFibGUnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBTdWJqZWN0LCBjb21iaW5lTGF0ZXN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBzd2l0Y2hNYXAsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IE1vbml0b3JpbmdBcHBHZW5Db21wb25lbnQgfSBmcm9tICcuLi8uLi9tZXRhZGF0YS9kZWNvcmF0b3JzJztcbmltcG9ydCB7XG4gIENoYXJ0RGF0YU1vZGVsLFxuICBDaGFydElucHV0U2luZ2xlLFxuICBDaGFydElucHV0U3RyZWFtVmFyLFxuICBDaGFydElucHV0VGFibGUsXG59IGZyb20gJy4uL0NoYXJ0RGF0YU1vZGVsJztcbmltcG9ydCB7IE9uQ2hhcnRTZWxlY3RFdmVudCB9IGZyb20gJy4uL3NoYXJlZC10eXBlcyc7XG5pbXBvcnQgeyBUYXBWYXJpYWJsZURhdGFQb3B1cENvbXBvbmVudCB9IGZyb20gJy4uL3RhcC12YXJpYWJsZS1kYXRhLXBvcHVwL3RhcC12YXJpYWJsZS1kYXRhLXBvcHVwLmNvbXBvbmVudCc7XG5cbmNvbnN0IFRBQkxFX0xJTUlUID0gMTA7XG5cbkBNb25pdG9yaW5nQXBwR2VuQ29tcG9uZW50KHt9KVxuQENvbXBvbmVudCh7XG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBzZWxlY3RvcjogJ3RhcC12YXJpYWJsZS10YWJsZScsXG4gIHRlbXBsYXRlVXJsOiAnLi90YXAtdmFyaWFibGUtdGFibGUuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi90YXAtdmFyaWFibGUtdGFibGUuY29tcG9uZW50LnNjc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgVGFwVmFyaWFibGVUYWJsZUNvbXBvbmVudCBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSB7XG4gIHJvd3M6IENoYXJ0SW5wdXRTaW5nbGVbXSB8IENoYXJ0SW5wdXRUYWJsZVtdID0gW107XG5cbiAgY29sdW1ucyE6IGFueVtdO1xuICBkYXJrTW9kZVN0YXR1cz86IGJvb2xlYW47XG5cbiAgcHJpdmF0ZSBjaGFydE1vZGVsOiBDaGFydERhdGFNb2RlbCA9IG5ldyBDaGFydERhdGFNb2RlbCgpO1xuXG4gIEBJbnB1dCgpXG4gIGxvYWRpbmdJbmRpY2F0b3IgPSB0cnVlO1xuXG4gIEBJbnB1dCgpXG4gIHJlb3JkZXJhYmxlID0gZmFsc2U7XG5cbiAgQElucHV0KClcbiAgY29sdW1uTW9kZSA9IENvbHVtbk1vZGUuZm9yY2U7XG5cbiAgQElucHV0KClcbiAgbGltaXQ6IG51bWJlciA9IFRBQkxFX0xJTUlUO1xuXG4gIEBJbnB1dCgpXG4gIHZhbHVlTGFiZWwgPSAnVmFsdWUnO1xuXG4gIEBJbnB1dCgpXG4gIG5hbWVMYWJlbD86IHN0cmluZztcblxuICBASW5wdXQoKVxuICBzZXQgaGlzdG9yeShlbmFibGU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9oaXN0b3J5Lm5leHQoZW5hYmxlKTtcbiAgfVxuXG4gIEBJbnB1dCgpXG4gIHNldCB2YWx1ZUNvdW50TGltaXQobGltaXQ6IG51bWJlciB8IHVuZGVmaW5lZCkge1xuICAgIGlmIChsaW1pdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBsaW1pdCA9IDMwO1xuICAgIH1cbiAgICB0aGlzLl92YWx1ZUNvdW50TGltaXQubmV4dChsaW1pdCk7XG4gIH1cblxuICBASW5wdXQoKVxuICBzaG93RXhwb3J0QnV0dG9uOiBib29sZWFuID0gZmFsc2U7XG5cbiAgQElucHV0KClcbiAgZXhwb3J0ZWRGaWxlTmFtZT86IHN0cmluZztcblxuICBASW5wdXQoKVxuICBzZXQgbGFiZWwoaW5kZXhPckFycmF5OiBzdHJpbmcgfCBzdHJpbmdbXSB8IHVuZGVmaW5lZCB8IEZ1bmN0aW9uKSB7XG4gICAgdGhpcy5jaGFydE1vZGVsLmluaXRMYWJlbChpbmRleE9yQXJyYXkpO1xuICB9XG5cbiAgcHJpdmF0ZSBfaGlzdG9yeSA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4odHJ1ZSk7XG5cbiAgcHJpdmF0ZSBfdmFsdWVDb3VudExpbWl0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxudW1iZXI+KDMwKTtcblxuICBwcml2YXRlIGRlc3Ryb3llZCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgcHJpdmF0ZSBfaW5wdXQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PENoYXJ0SW5wdXRTdHJlYW1WYXJbXT4oW10pO1xuXG4gIHByaXZhdGUgbXVsdGlwbGU6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBASW5wdXQoKVxuICBzZXQgdmFyaWFibGUoXG4gICAgdmFyaWFibGVPckFycmF5OlxuICAgICAgfCBBYnN0cmFjdFZhcmlhYmxlPG51bWJlciB8IG51bWJlcltdPlxuICAgICAgfCBBYnN0cmFjdFZhcmlhYmxlPG51bWJlciB8IG51bWJlcltdPltdXG4gICAgICB8IHVuZGVmaW5lZFxuICApIHtcbiAgICB0aGlzLm11bHRpcGxlID0gISFBcnJheS5pc0FycmF5KHZhcmlhYmxlT3JBcnJheSk7XG4gICAgdGhpcy5pbnB1dCA9IHRoaXMuY2hhcnRNb2RlbC5pbml0VmFyaWFibGUodmFyaWFibGVPckFycmF5KTtcbiAgfVxuXG4gIEBJbnB1dCgpXG4gIHNldCBpbnB1dChpbnB1dHM6IENoYXJ0SW5wdXRTdHJlYW1WYXJbXSkge1xuICAgIHRoaXMuX2lucHV0Lm5leHQoaW5wdXRzKTtcbiAgfVxuXG4gIGNvbHVtbnNQdXNoRm9yRWFjaEtleShrZXk6IHN0cmluZykge1xuICAgIGNvbnNvbGUubG9nKCdERUJVRyBjb2x1bW5zUHVzaEZvckVhY2hLZXknLCBrZXksIHRoaXMuY29sdW1ucyk7XG4gICAgaWYgKHRoaXMuaGlzdG9yeSAmJiBrZXkgPT09ICduYW1lJykge1xuICAgICAgdGhpcy5jb2x1bW5zLnB1c2goe1xuICAgICAgICBwcm9wOiBrZXksXG4gICAgICAgIG5hbWU6ICF0aGlzLm5hbWVMYWJlbFxuICAgICAgICAgID8gdGhpcy5oaXN0b3J5XG4gICAgICAgICAgICA/ICdUaW1lJ1xuICAgICAgICAgICAgOiAnTmFtZSdcbiAgICAgICAgICA6IHRoaXMubmFtZUxhYmVsLFxuICAgICAgICBzb3J0YWJsZTogdHJ1ZSxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAoa2V5ID09PSAndmFsdWUnKSB7XG4gICAgICB0aGlzLmNvbHVtbnMucHVzaCh7IHByb3A6IGtleSwgbmFtZTogdGhpcy52YWx1ZUxhYmVsLCBzb3J0YWJsZTogdHJ1ZSB9KTtcbiAgICB9IGVsc2UgaWYgKGtleSAhPT0gJ2V4dHJhJykge1xuICAgICAgdGhpcy5jb2x1bW5zLnB1c2goeyBwcm9wOiBrZXksIG5hbWU6IGtleSwgc29ydGFibGU6IHRydWUgfSk7XG4gICAgfVxuICB9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIG1vZGFsQ29udHJvbGxlcjogTW9kYWxDb250cm9sbGVyLFxuICAgIHByaXZhdGUgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZlxuICApIHt9XG5cbiAgY3JlYXRlRXhwb3J0ZWREYXRhKCkge1xuICAgIHJldHVybiB0aGlzLnJvd3M7XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgdGhpcy5kYXJrTW9kZVN0YXR1cyA9XG4gICAgICB3aW5kb3cubWF0Y2hNZWRpYSAmJlxuICAgICAgd2luZG93Lm1hdGNoTWVkaWEoJyhwcmVmZXJzLWNvbG9yLXNjaGVtZTogZGFyayknKS5tYXRjaGVzO1xuICAgIGNvbWJpbmVMYXRlc3QoW3RoaXMuX3ZhbHVlQ291bnRMaW1pdCwgdGhpcy5faW5wdXQsIHRoaXMuX2hpc3RvcnldKVxuICAgICAgLnBpcGUoXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3llZCksXG4gICAgICAgIHN3aXRjaE1hcCgoW3ZhbHVlQ291bnRMaW1pdCwgaW5wdXQsIGhpc3RvcnldKSA9PiB7XG4gICAgICAgICAgdGhpcy5jaGFydE1vZGVsLmRlc3Ryb3lDdXJyZW50U3ViKCk7XG4gICAgICAgICAgaWYgKHRoaXMubXVsdGlwbGUpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNoYXJ0TW9kZWwuZGVmaW5lTXVsdGlJbnB1dFN0cmVhbShpbnB1dCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNoYXJ0TW9kZWwuZGVmaW5lSW5wdXRTdHJlYW1TaW5nbGUoXG4gICAgICAgICAgICAgIGlucHV0LFxuICAgICAgICAgICAgICBoaXN0b3J5LFxuICAgICAgICAgICAgICB2YWx1ZUNvdW50TGltaXQsXG4gICAgICAgICAgICAgIHRydWVcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgocmVzdWx0KSA9PiB7XG4gICAgICAgIHRoaXMucmVzdWx0VG9UYWJsZURhdGEocmVzdWx0KTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcmVzdWx0VG9UYWJsZURhdGEocmVzdWx0OiBhbnkpIHtcbiAgICB0aGlzLnJvd3MgPSByZXN1bHQ7XG4gICAgdGhpcy5jb2x1bW5zID0gW107XG4gICAgY29uc3QganNvbkRhdGEgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRoaXMucm93c1swXSkpO1xuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKGpzb25EYXRhKSkge1xuICAgICAgaWYgKGtleSA9PT0gJ3NlcmllcycpIHtcbiAgICAgICAganNvbkRhdGFbJ3NlcmllcyddLmZvckVhY2goKGs6IHsgbmFtZTogc3RyaW5nIH0pID0+XG4gICAgICAgICAgdGhpcy5jb2x1bW5zUHVzaEZvckVhY2hLZXkoay5uYW1lKVxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5jb2x1bW5zUHVzaEZvckVhY2hLZXkoa2V5KTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5sb2FkaW5nSW5kaWNhdG9yID0gZmFsc2U7XG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICB9XG5cbiAgb25TZWxlY3QoZXZlbnQ6IE9uQ2hhcnRTZWxlY3RFdmVudCkge1xuICAgIGlmICh0eXBlb2YgZXZlbnQgPT09ICdvYmplY3QnKSB7XG4gICAgICB0aGlzLmNoYXJ0TW9kZWxcbiAgICAgICAgLnNob3dEZXRhaWwoZXZlbnQsIHRoaXMubW9kYWxDb250cm9sbGVyLCBUYXBWYXJpYWJsZURhdGFQb3B1cENvbXBvbmVudClcbiAgICAgICAgLmNhdGNoKChlcnIpID0+IHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oZXJyKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5jaGFydE1vZGVsLmRlc3Ryb3lDdXJyZW50U3ViKCk7XG4gICAgdGhpcy5kZXN0cm95ZWQubmV4dCgpO1xuICAgIHRoaXMuZGVzdHJveWVkLmNvbXBsZXRlKCk7XG4gIH1cbn1cbiIsIjxkaXYgc3R5bGU9XCJwb3NpdGlvbjogcmVsYXRpdmVcIj5cbiAgPG5neC1kYXRhdGFibGVcbiAgICBbbmdDbGFzc109XCJkYXJrTW9kZVN0YXR1cyA/ICdkYXJrJyA6ICdtYXRlcmlhbCdcIlxuICAgIFtyb3dzXT1cInJvd3NcIlxuICAgIFtsb2FkaW5nSW5kaWNhdG9yXT1cImxvYWRpbmdJbmRpY2F0b3JcIlxuICAgIFtjb2x1bW5zXT1cImNvbHVtbnNcIlxuICAgIFtjb2x1bW5Nb2RlXT1cImNvbHVtbk1vZGVcIlxuICAgIFtoZWFkZXJIZWlnaHRdPVwiNTBcIlxuICAgIFtmb290ZXJIZWlnaHRdPVwiNTBcIlxuICAgIFtyb3dIZWlnaHRdPVwiNTBcIlxuICAgIFtyZW9yZGVyYWJsZV09XCJyZW9yZGVyYWJsZVwiXG4gICAgW3Njcm9sbGJhckhdPVwidHJ1ZVwiXG4gICAgW2xpbWl0XT1cImxpbWl0XCJcbiAgPlxuICA8L25neC1kYXRhdGFibGU+XG4gIDwhLS1cbiAgICAgICAgW3RhcmdldE1hcmtlclRlbXBsYXRlXT1cInRhcmdldE1hcmtlclRlbXBsYXRlXCJcbiAgICAgICAgPG5nLXRlbXBsYXRlICN0YXJnZXRNYXJrZXJUZW1wbGF0ZSBsZXQtY2xhc3M9XCJjbGFzc1wiPlxuICAgIDxkaXYgW25nQ2xhc3NdPVwiY2xhc3NcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJpY29uIGRhdGF0YWJsZS1pY29uLWRvd25cIj48L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJpY29uIGRhdGF0YWJsZS1pY29uLXVwXCI+PC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPC9uZy10ZW1wbGF0ZT5cbiAgLS0+XG5cbiAgPGlvbi1mYWItYnV0dG9uXG4gICAgaWQ9XCJleHBvcnRGYWJCdXR0b25cIlxuICAgIHNpemU9XCJzbWFsbFwiXG4gICAgdGFwRXhwb3J0RGF0YVxuICAgIFtkYXRhVG9FeHBvcnRdPVwiY3JlYXRlRXhwb3J0ZWREYXRhLmJpbmQodGhpcylcIlxuICAgIFtleHBvcnRlZEZpbGVOYW1lXT1cImV4cG9ydGVkRmlsZU5hbWVcIlxuICAgICpuZ0lmPVwic2hvd0V4cG9ydEJ1dHRvblwiXG4gID5cbiAgICA8aW9uLWljb24gbmFtZT1cImRvd25sb2FkXCI+PC9pb24taWNvbj5cbiAgPC9pb24tZmFiLWJ1dHRvbj5cbjwvZGl2PlxuIl19