UNPKG

@iotize/ionic

Version:

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

192 lines 24.7 kB
import { DecimalPipe } from '@angular/common'; import { ChangeDetectorRef, Component, ElementRef, EventEmitter, Inject, Input, NgZone, Output, PLATFORM_ID, ViewChild, } from '@angular/core'; import { GaugeComponent } from '@swimlane/ngx-charts'; import { Observable } from 'rxjs'; import { debug } from '../../debug'; import { ChartDataModel } from '../ChartDataModel'; import * as i0 from "@angular/core"; import * as i1 from "@angular/common"; import * as i2 from "@swimlane/ngx-charts"; import * as i3 from "@ionic/angular"; import * as i4 from "../../ui-directive/export-data.directive"; export class GaugeCardComponent extends GaugeComponent { decimalPipe; gaugeChart; ngxChartsGauge; showText = true; /** * Automatically set min/max range according to input values */ dynamicRange = true; min; max; set digitsInfo(digitsInfo) { debug('set valueFormatting from ', digitsInfo); this.valueFormatting = (value) => { if (typeof value === 'number') { const formattedOrNull = this.decimalPipe?.transform(value, digitsInfo); return formattedOrNull || value.toString(); } else { return value.toString(); } }; } legend = false; legendTitle; units = ''; showExportButton = false; exportedFileName; set label(indexOrArray) { this.chartModel.initLabel(indexOrArray); } colorScheme = { domain: [ '#5DADE2', '#9B59B6', '#F39C12', '#5AA454', '#A10A28', '#C7B42C', '#AAAAAA', ], }; set inputStream(stream) { this.subscription?.unsubscribe(); if (!stream) { return; } this.subscription = stream.subscribe({ next: (value) => { if (this.dynamicRange) { if (this.max == undefined || value > this.max) { this.max = value; debug('dynamic max range updated with: ', value); } if (this.min == undefined || value < this.min) { this.min = value; debug('dynamic min range updated with: ', value); } } if (Array.isArray(value)) { value.forEach((val, index) => { if (!this.results[index]) { this.results.push({ name: this.chartModel.labelConfig(index, 'Index'), value: val, }); } else { this.results[index].value = val; } }); } else { this.setSingleValue(value); } this.results = [...this.results]; }, error: (err) => { debug(err); this.onError.emit(err); }, }); } setSingleValue(value) { value = Number(value); if (!this.results?.[0]) { this.results = [ { name: 'Value', value: value, }, ]; } else { this.results[0].value = value; this.results = [...this.results]; } } // @Input() view: [number, number]; onError = new EventEmitter(); chartModel = new ChartDataModel(); results = [ { name: 'Value', value: 0, }, ]; subscription; constructor(myChartElement, zone, cd, platformId, decimalPipe) { super(myChartElement, zone, cd, platformId); this.decimalPipe = decimalPipe; } ngAfterViewInit() { if (this.gaugeChart.height > 250) { this.gaugeChart.margin = [80, 80, 0, 80]; } else { this.gaugeChart.margin = [0, 80, 0, 80]; } this.gaugeChart.update(); } scaleText(repeat = true) { // if (this.textSize) { // this.textTransform = ``; // return; // } if (!this.textEl) { return; } return super.scaleText(repeat); } ngOnDestroy() { super.ngOnDestroy(); this.subscription?.unsubscribe(); } onSelect(event) { } /** @nocollapse */ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: GaugeCardComponent, deps: [{ token: i0.ElementRef }, { token: i0.NgZone }, { token: i0.ChangeDetectorRef }, { token: PLATFORM_ID }, { token: i1.DecimalPipe }], target: i0.ɵɵFactoryTarget.Component }); /** @nocollapse */ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: GaugeCardComponent, selector: "monitoring-gauge-card", inputs: { showText: "showText", dynamicRange: "dynamicRange", min: "min", max: "max", digitsInfo: "digitsInfo", legend: "legend", legendTitle: "legendTitle", units: "units", showExportButton: "showExportButton", exportedFileName: "exportedFileName", label: "label", colorScheme: "colorScheme", inputStream: "inputStream" }, outputs: { onError: "onError" }, viewQueries: [{ propertyName: "gaugeChart", first: true, predicate: ["ngxChartsGauge"], descendants: true }, { propertyName: "ngxChartsGauge", first: true, predicate: ["ngxChartsGauge"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<div class=\"chart-container\" style=\"position: relative\">\n <ngx-charts-gauge\n #ngxChartsGauge\n [scheme]=\"colorScheme\"\n [results]=\"results\"\n [min]=\"min\"\n [max]=\"max\"\n [angleSpan]=\"angleSpan\"\n [startAngle]=\"startAngle\"\n [units]=\"units\"\n [bigSegments]=\"bigSegments\"\n [smallSegments]=\"smallSegments\"\n [legend]=\"legend\"\n [legendTitle]=\"legendTitle\"\n [valueFormatting]=\"valueFormatting\"\n [showText]=\"showText\"\n [view]=\"view\"\n (select)=\"onSelect($event)\"\n >\n </ngx-charts-gauge>\n <ion-fab-button\n id=\"exportFabButton\"\n size=\"small\"\n tapExportData\n [dataToExport]=\"results\"\n [exportedFileName]=\"exportedFileName\"\n *ngIf=\"showExportButton\"\n >\n <ion-icon name=\"download\"></ion-icon>\n </ion-fab-button>\n</div>\n", styles: [".chart-container{display:grid}@media (prefers-color-scheme: dark){::ng-deep span.legend-label-text{color:#ccc!important}::ng-deep span.legend-label-text:hover{color:#fff!important}::ng-deep .ngx-charts text{fill:#fff!important}}#exportFabButton{position:absolute;top:10px;right:10px}\n"], dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.GaugeComponent, selector: "ngx-charts-gauge", inputs: ["legend", "legendTitle", "legendPosition", "min", "max", "textValue", "units", "bigSegments", "smallSegments", "results", "showAxis", "startAngle", "angleSpan", "activeEntries", "axisTickFormatting", "tooltipDisabled", "valueFormatting", "showText", "margin"], outputs: ["activate", "deactivate"] }, { kind: "component", type: i3.IonFabButton, selector: "ion-fab-button", inputs: ["activated", "closeIcon", "color", "disabled", "download", "href", "mode", "rel", "routerAnimation", "routerDirection", "show", "size", "target", "translucent", "type"] }, { kind: "component", type: i3.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"] }] }); } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: GaugeCardComponent, decorators: [{ type: Component, args: [{ selector: 'monitoring-gauge-card', template: "<div class=\"chart-container\" style=\"position: relative\">\n <ngx-charts-gauge\n #ngxChartsGauge\n [scheme]=\"colorScheme\"\n [results]=\"results\"\n [min]=\"min\"\n [max]=\"max\"\n [angleSpan]=\"angleSpan\"\n [startAngle]=\"startAngle\"\n [units]=\"units\"\n [bigSegments]=\"bigSegments\"\n [smallSegments]=\"smallSegments\"\n [legend]=\"legend\"\n [legendTitle]=\"legendTitle\"\n [valueFormatting]=\"valueFormatting\"\n [showText]=\"showText\"\n [view]=\"view\"\n (select)=\"onSelect($event)\"\n >\n </ngx-charts-gauge>\n <ion-fab-button\n id=\"exportFabButton\"\n size=\"small\"\n tapExportData\n [dataToExport]=\"results\"\n [exportedFileName]=\"exportedFileName\"\n *ngIf=\"showExportButton\"\n >\n <ion-icon name=\"download\"></ion-icon>\n </ion-fab-button>\n</div>\n", styles: [".chart-container{display:grid}@media (prefers-color-scheme: dark){::ng-deep span.legend-label-text{color:#ccc!important}::ng-deep span.legend-label-text:hover{color:#fff!important}::ng-deep .ngx-charts text{fill:#fff!important}}#exportFabButton{position:absolute;top:10px;right:10px}\n"] }] }], ctorParameters: () => [{ type: i0.ElementRef }, { type: i0.NgZone }, { type: i0.ChangeDetectorRef }, { type: undefined, decorators: [{ type: Inject, args: [PLATFORM_ID] }] }, { type: i1.DecimalPipe }], propDecorators: { gaugeChart: [{ type: ViewChild, args: ['ngxChartsGauge'] }], ngxChartsGauge: [{ type: ViewChild, args: ['ngxChartsGauge'] }], showText: [{ type: Input }], dynamicRange: [{ type: Input }], min: [{ type: Input }], max: [{ type: Input }], digitsInfo: [{ type: Input }], legend: [{ type: Input }], legendTitle: [{ type: Input }], units: [{ type: Input }], showExportButton: [{ type: Input }], exportedFileName: [{ type: Input }], label: [{ type: Input }], colorScheme: [{ type: Input }], inputStream: [{ type: Input }], onError: [{ type: Output }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2F1Z2UtY2FyZC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9pb3RpemUtaW9uaWMvbW9uaXRvcmluZy9zcmMvbGliL3VpLWNvbXBvbmVudHMvZ2F1Z2UtY2FyZC9nYXVnZS1jYXJkLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2lvdGl6ZS1pb25pYy9tb25pdG9yaW5nL3NyYy9saWIvdWktY29tcG9uZW50cy9nYXVnZS1jYXJkL2dhdWdlLWNhcmQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzlDLE9BQU8sRUFFTCxpQkFBaUIsRUFDakIsU0FBUyxFQUNULFVBQVUsRUFDVixZQUFZLEVBQ1osTUFBTSxFQUNOLEtBQUssRUFDTCxNQUFNLEVBRU4sTUFBTSxFQUNOLFdBQVcsRUFDWCxTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3RELE9BQU8sRUFBRSxVQUFVLEVBQWdCLE1BQU0sTUFBTSxDQUFDO0FBQ2hELE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFFcEMsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG1CQUFtQixDQUFDOzs7Ozs7QUFlbkQsTUFBTSxPQUFPLGtCQUNYLFNBQVEsY0FBYztJQWlKYjtJQTlJb0IsVUFBVSxDQUFrQjtJQUU1QixjQUFjLENBQWM7SUFHekQsUUFBUSxHQUFHLElBQUksQ0FBQztJQUVoQjs7T0FFRztJQUVILFlBQVksR0FBWSxJQUFJLENBQUM7SUFHckIsR0FBRyxDQUFTO0lBR1osR0FBRyxDQUFTO0lBRXBCLElBQ0ksVUFBVSxDQUFDLFVBQWtCO1FBQy9CLEtBQUssQ0FBQywyQkFBMkIsRUFB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Z0JBY04sTUFBTTtzQkFETCxLQUFLO2dCQUlFLFdBQVc7c0JBRGxCLEtBQUs7Z0JBSU4sS0FBSztzQkFESixLQUFLO2dCQUlOLGdCQUFnQjtzQkFEZixLQUFLO2dCQUlOLGdCQUFnQjtzQkFEZixLQUFLO2dCQUlGLEtBQUs7c0JBRFIsS0FBSztnQkFNTixXQUFXO3NCQURWLEtBQUs7Z0JBY0YsV0FBVztzQkFEZCxLQUFLO2dCQTJESSxPQUFPO3NCQUFoQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGVjaW1hbFBpcGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBJbmplY3QsXG4gIElucHV0LFxuICBOZ1pvbmUsXG4gIE9uRGVzdHJveSxcbiAgT3V0cHV0LFxuICBQTEFURk9STV9JRCxcbiAgVmlld0NoaWxkLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEdhdWdlQ29tcG9uZW50IH0gZnJvbSAnQHN3aW1sYW5lL25neC1jaGFydHMnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBkZWJ1ZyB9IGZyb20gJy4uLy4uL2RlYnVnJztcbmltcG9ydCB7IEFwcEdlbkZpZWxkIH0gZnJvbSAnLi4vLi4vbWV0YWRhdGEvZGVjb3JhdG9ycyc7XG5pbXBvcnQgeyBDaGFydERhdGFNb2RlbCB9IGZyb20gJy4uL0NoYXJ0RGF0YU1vZGVsJztcbmltcG9ydCB7XG4gIENPTE9SX1NDSEVNRV9TQ0hFTUEsXG4gIERJR0lUU19JTkZPX1NDSEVNQSxcbiAgRVhQT1JUX0RBVEFfRklMRV9OQU1FX1NDSEVNQSxcbiAgU0hPV19FWFBPUlRfREFUQV9CVVRUT05fU0NIRU1BLFxuICBTSE9XX0xFR0VORF9TQ0hFTUEsXG59IGZyb20gJy4uL3NoYXJlZC1zY2hlbWEnO1xuaW1wb3J0IHsgT25DaGFydFNlbGVjdEV2ZW50IH0gZnJvbSAnLi4vc2hhcmVkLXR5cGVzJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbW9uaXRvcmluZy1nYXVnZS1jYXJkJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2dhdWdlLWNhcmQuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9nYXVnZS1jYXJkLmNvbXBvbmVudC5zY3NzJ10sXG59KVxuZXhwb3J0IGNsYXNzIEdhdWdlQ2FyZENvbXBvbmVudFxuICBleHRlbmRzIEdhdWdlQ29tcG9uZW50XG4gIGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95XG57XG4gIEBWaWV3Q2hpbGQoJ25neENoYXJ0c0dhdWdlJykgZ2F1Z2VDaGFydCE6IEdhdWdlQ29tcG9uZW50O1xuXG4gIEBWaWV3Q2hpbGQoJ25neENoYXJ0c0dhdWdlJykgbmd4Q2hhcnRzR2F1Z2UhOiBFbGVtZW50UmVmO1xuXG4gIEBJbnB1dCgpXG4gIHNob3dUZXh0ID0gdHJ1ZTtcblxuICAvKipcbiAgICogQXV0b21hdGljYWxseSBzZXQgbWluL21heCByYW5nZSBhY2NvcmRpbmcgdG8gaW5wdXQgdmFsdWVzXG4gICAqL1xuICBASW5wdXQoKVxuICBkeW5hbWljUmFuZ2U6IGJvb2xlYW4gPSB0cnVlO1xuXG4gIEBJbnB1dCgpXG4gIGRlY2xhcmUgbWluOiBudW1iZXI7XG5cbiAgQElucHV0KClcbiAgZGVjbGFyZSBtYXg6IG51bWJlcjtcblxuICBASW5wdXQoKVxuICBzZXQgZGlnaXRzSW5mbyhkaWdpdHNJbmZvOiBzdHJpbmcpIHtcbiAgICBkZWJ1Zygnc2V0IHZhbHVlRm9ybWF0dGluZyBmcm9tICcsIGRpZ2l0c0luZm8pO1xuICAgIHRoaXMudmFsdWVGb3JtYXR0aW5nID0gKHZhbHVlOiBhbnkpOiBzdHJpbmcgPT4ge1xuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgY29uc3QgZm9ybWF0dGVkT3JOdWxsID0gdGhpcy5kZWNpbWFsUGlwZT8udHJhbnNmb3JtKHZhbHVlLCBkaWdpdHNJbmZvKTtcbiAgICAgICAgcmV0dXJuIGZvcm1hdHRlZE9yTnVsbCB8fCB2YWx1ZS50b1N0cmluZygpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlLnRvU3RyaW5nKCk7XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIEBJbnB1dCgpXG4gIGxlZ2VuZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIEBJbnB1dCgpXG4gIGRlY2xhcmUgbGVnZW5kVGl0bGU6IHN0cmluZztcblxuICBASW5wdXQoKVxuICB1bml0czogc3RyaW5nID0gJyc7XG5cbiAgQElucHV0KClcbiAgc2hvd0V4cG9ydEJ1dHRvbjogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIEBJbnB1dCgpXG4gIGV4cG9ydGVkRmlsZU5hbWU/OiBzdHJpbmc7XG5cbiAgQElucHV0KClcbiAgc2V0IGxhYmVsKGluZGV4T3JBcnJheTogc3RyaW5nIHwgc3RyaW5nW10gfCB1bmRlZmluZWQgfCBGdW5jdGlvbikge1xuICAgIHRoaXMuY2hhcnRNb2RlbC5pbml0TGFiZWwoaW5kZXhPckFycmF5KTtcbiAgfVxuXG4gIEBJbnB1dCgpXG4gIGNvbG9yU2NoZW1lID0ge1xuICAgIGRvbWFpbjogW1xuICAgICAgJyM1REFERTInLFxuICAgICAgJyM5QjU5QjYnLFxuICAgICAgJyNGMzlDMTInLFxuICAgICAgJyM1QUE0NTQnLFxuICAgICAgJyNBMTBBMjgnLFxuICAgICAgJyNDN0I0MkMnLFxuICAgICAgJyNBQUFBQUEnLFxuICAgIF0sXG4gIH07XG5cbiAgQElucHV0KClcbiAgc2V0IGlucHV0U3RyZWFtKHN0cmVhbTogT2JzZXJ2YWJsZTxhbnk+KSB7XG4gICAgdGhpcy5zdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XG4gICAgaWYgKCFzdHJlYW0pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5zdWJzY3JpcHRpb24gPSBzdHJlYW0uc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6ICh2YWx1ZSkgPT4ge1xuICAgICAgICBpZiAodGhpcy5keW5hbWljUmFuZ2UpIHtcbiAgICAgICAgICBpZiAodGhpcy5tYXggPT0gdW5kZWZpbmVkIHx8IHZhbHVlID4gdGhpcy5tYXghKSB7XG4gICAgICAgICAgICB0aGlzLm1heCA9IHZhbHVlO1xuICAgICAgICAgICAgZGVidWcoJ2R5bmFtaWMgbWF4IHJhbmdlIHVwZGF0ZWQgd2l0aDogJywgdmFsdWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodGhpcy5taW4gPT0gdW5kZWZpbmVkIHx8IHZhbHVlIDwgdGhpcy5taW4hKSB7XG4gICAgICAgICAgICB0aGlzLm1pbiA9IHZhbHVlO1xuICAgICAgICAgICAgZGVidWcoJ2R5bmFtaWMgbWluIHJhbmdlIHVwZGF0ZWQgd2l0aDogJywgdmFsdWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgIHZhbHVlLmZvckVhY2goKHZhbCwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIGlmICghdGhpcy5yZXN1bHRzW2luZGV4XSkge1xuICAgICAgICAgICAgICB0aGlzLnJlc3VsdHMucHVzaCh7XG4gICAgICAgICAgICAgICAgbmFtZTogdGhpcy5jaGFydE1vZGVsLmxhYmVsQ29uZmlnKGluZGV4LCAnSW5kZXgnKSxcbiAgICAgICAgICAgICAgICB2YWx1ZTogdmFsLFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRoaXMucmVzdWx0c1tpbmRleF0udmFsdWUgPSB2YWw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5zZXRTaW5nbGVWYWx1ZSh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yZXN1bHRzID0gWy4uLnRoaXMucmVzdWx0c107XG4gICAgICB9LFxuICAgICAgZXJyb3I6IChlcnIpID0+IHtcbiAgICAgICAgZGVidWcoZXJyKTtcbiAgICAgICAgdGhpcy5vbkVycm9yLmVtaXQoZXJyKTtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgc2V0U2luZ2xlVmFsdWUodmFsdWU6IGFueSkge1xuICAgIHZhbHVlID0gTnVtYmVyKHZhbHVlKTtcbiAgICBpZiAoIXRoaXMucmVzdWx0cz8uWzBdKSB7XG4gICAgICB0aGlzLnJlc3VsdHMgPSBbXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiAnVmFsdWUnLFxuICAgICAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgICAgfSxcbiAgICAgIF07XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucmVzdWx0c1swXS52YWx1ZSA9IHZhbHVlO1xuICAgICAgdGhpcy5yZXN1bHRzID0gWy4uLnRoaXMucmVzdWx0c107XG4gICAgfVxuICB9XG5cbiAgLy8gQElucHV0KCkgdmlldzogW251bWJlciwgbnVtYmVyXTtcblxuICBAT3V0cHV0KCkgb25FcnJvciA9IG5ldyBFdmVudEVtaXR0ZXI8RXJyb3I+KCk7XG5cbiAgcHJpdmF0ZSBjaGFydE1vZGVsOiBDaGFydERhdGFNb2RlbCA9IG5ldyBDaGFydERhdGFNb2RlbCgpO1xuXG4gIHB1YmxpYyByZXN1bHRzOiB7IG5hbWU6IHN0cmluZzsgdmFsdWU6IGFueSB9W10gPSBbXG4gICAge1xuICAgICAgbmFtZTogJ1ZhbHVlJyxcbiAgICAgIHZhbHVlOiAwLFxuICAgIH0sXG4gIF07XG5cbiAgcHJpdmF0ZSBzdWJzY3JpcHRpb24/OiBTdWJzY3JpcHRpb247XG5cbiAgY29uc3RydWN0b3IoXG4gICAgbXlDaGFydEVsZW1lbnQ6IEVsZW1lbnRSZWY8YW55PixcbiAgICB6b25lOiBOZ1pvbmUsXG4gICAgY2Q6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIEBJbmplY3QoUExBVEZPUk1fSUQpIHBsYXRmb3JtSWQ6IHN0cmluZyxcbiAgICBwdWJsaWMgZGVjaW1hbFBpcGU6IERlY2ltYWxQaXBlXG4gICkge1xuICAgIHN1cGVyKG15Q2hhcnRFbGVtZW50LCB6b25lLCBjZCwgcGxhdGZvcm1JZCk7XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZ2F1Z2VDaGFydC5oZWlnaHQgPiAyNTApIHtcbiAgICAgIHRoaXMuZ2F1Z2VDaGFydC5tYXJnaW4gPSBbODAsIDgwLCAwLCA4MF07XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZ2F1Z2VDaGFydC5tYXJnaW4gPSBbMCwgODAsIDAsIDgwXTtcbiAgICB9XG4gICAgdGhpcy5nYXVnZUNoYXJ0LnVwZGF0ZSgpO1xuICB9XG5cbiAgc2NhbGVUZXh0KHJlcGVhdDogYm9vbGVhbiA9IHRydWUpIHtcbiAgICAvLyBpZiAodGhpcy50ZXh0U2l6ZSkge1xuICAgIC8vICAgdGhpcy50ZXh0VHJhbnNmb3JtID0gYGA7XG4gICAgLy8gICByZXR1cm47XG4gICAgLy8gfVxuICAgIGlmICghdGhpcy50ZXh0RWwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcmV0dXJuIHN1cGVyLnNjYWxlVGV4dChyZXBlYXQpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgc3VwZXIubmdPbkRlc3Ryb3koKTtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIG9uU2VsZWN0KGV2ZW50OiBPbkNoYXJ0U2VsZWN0RXZlbnQpIHt9XG59XG4iLCI8ZGl2IGNsYXNzPVwiY2hhcnQtY29udGFpbmVyXCIgc3R5bGU9XCJwb3NpdGlvbjogcmVsYXRpdmVcIj5cbiAgPG5neC1jaGFydHMtZ2F1Z2VcbiAgICAjbmd4Q2hhcnRzR2F1Z2VcbiAgICBbc2NoZW1lXT1cImNvbG9yU2NoZW1lXCJcbiAgICBbcmVzdWx0c109XCJyZXN1bHRzXCJcbiAgICBbbWluXT1cIm1pblwiXG4gICAgW21heF09XCJtYXhcIlxuICAgIFthbmdsZVNwYW5dPVwiYW5nbGVTcGFuXCJcbiAgICBbc3RhcnRBbmdsZV09XCJzdGFydEFuZ2xlXCJcbiAgICBbdW5pdHNdPVwidW5pdHNcIlxuICAgIFtiaWdTZWdtZW50c109XCJiaWdTZWdtZW50c1wiXG4gICAgW3NtYWxsU2VnbWVudHNdPVwic21hbGxTZWdtZW50c1wiXG4gICAgW2xlZ2VuZF09XCJsZWdlbmRcIlxuICAgIFtsZWdlbmRUaXRsZV09XCJsZWdlbmRUaXRsZVwiXG4gICAgW3ZhbHVlRm9ybWF0dGluZ109XCJ2YWx1ZUZvcm1hdHRpbmdcIlxuICAgIFtzaG93VGV4dF09XCJzaG93VGV4dFwiXG4gICAgW3ZpZXddPVwidmlld1wiXG4gICAgKHNlbGVjdCk9XCJvblNlbGVjdCgkZXZlbnQpXCJcbiAgPlxuICA8L25neC1jaGFydHMtZ2F1Z2U+XG4gIDxpb24tZmFiLWJ1dHRvblxuICAgIGlkPVwiZXhwb3J0RmFiQnV0dG9uXCJcbiAgICBzaXplPVwic21hbGxcIlxuICAgIHRhcEV4cG9ydERhdGFcbiAgICBbZGF0YVRvRXhwb3J0XT1cInJlc3VsdHNcIlxuICAgIFtleHBvcnRlZEZpbGVOYW1lXT1cImV4cG9ydGVkRmlsZU5hbWVcIlxuICAgICpuZ0lmPVwic2hvd0V4cG9ydEJ1dHRvblwiXG4gID5cbiAgICA8aW9uLWljb24gbmFtZT1cImRvd25sb2FkXCI+PC9pb24taWNvbj5cbiAgPC9pb24tZmFiLWJ1dHRvbj5cbjwvZGl2PlxuIl19