UNPKG

@iotize/ionic

Version:

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

184 lines 24.6 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 { 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(); } }; } set label(indexOrArray) { this.chartModel.initLabel(indexOrArray); } 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]; } } constructor(myChartElement, zone, cd, platformId, decimalPipe) { super(myChartElement, zone, cd, platformId); this.decimalPipe = decimalPipe; this.showText = true; /** * Automatically set min/max range according to input values */ this.dynamicRange = true; this.legend = false; this.units = ''; this.showExportButton = false; this.colorScheme = { domain: [ '#5DADE2', '#9B59B6', '#F39C12', '#5AA454', '#A10A28', '#C7B42C', '#AAAAAA', ], }; // @Input() view: [number, number]; this.onError = new EventEmitter(); this.chartModel = new ChartDataModel(); this.results = [ { name: 'Value', value: 0, }, ]; } 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 */ GaugeCardComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", 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 */ GaugeCardComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", 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: "15.2.10", 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: function () { return [{ 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2F1Z2UtY2FyZC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9pb3RpemUtaW9uaWMvbW9uaXRvcmluZy9zcmMvbGliL3VpLWNvbXBvbmVudHMvZ2F1Z2UtY2FyZC9nYXVnZS1jYXJkLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2lvdGl6ZS1pb25pYy9tb25pdG9yaW5nL3NyYy9saWIvdWktY29tcG9uZW50cy9nYXVnZS1jYXJkL2dhdWdlLWNhcmQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzlDLE9BQU8sRUFFTCxpQkFBaUIsRUFDakIsU0FBUyxFQUNULFVBQVUsRUFDVixZQUFZLEVBQ1osTUFBTSxFQUNOLEtBQUssRUFDTCxNQUFNLEVBRU4sTUFBTSxFQUNOLFdBQVcsRUFDWCxTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3RELE9BQU8sRUFBRSxVQUFVLEVBQWdCLE1BQU0sTUFBTSxDQUFDO0FBQ2hELE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFFcEMsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG1CQUFtQixDQUFDOzs7Ozs7QUFlbkQsTUFBTSxPQUFPLGtCQUNYLFNBQVEsY0FBYztJQXNCdEIsSUFDSSxVQUFVLENBQUMsVUFBa0I7UUFDL0IsS0FBSyxDQUFDLDJCQUEyQixFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQy9DLElBQUksQ0FBQyxlQUFlLEdBQUcsQ0FBQyxLQUFVLEVBQVUsRUFBRTtZQUM1QyxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsRUFBRTtnQkFDN0IsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLFdB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bmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBFbGVtZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIEluamVjdCxcbiAgSW5wdXQsXG4gIE5nWm9uZSxcbiAgT25EZXN0cm95LFxuICBPdXRwdXQsXG4gIFBMQVRGT1JNX0lELFxuICBWaWV3Q2hpbGQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgR2F1Z2VDb21wb25lbnQgfSBmcm9tICdAc3dpbWxhbmUvbmd4LWNoYXJ0cyc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGRlYnVnIH0gZnJvbSAnLi4vLi4vZGVidWcnO1xuaW1wb3J0IHsgQXBwR2VuRmllbGQgfSBmcm9tICcuLi8uLi9tZXRhZGF0YS9kZWNvcmF0b3JzJztcbmltcG9ydCB7IENoYXJ0RGF0YU1vZGVsIH0gZnJvbSAnLi4vQ2hhcnREYXRhTW9kZWwnO1xuaW1wb3J0IHtcbiAgQ09MT1JfU0NIRU1FX1NDSEVNQSxcbiAgRElHSVRTX0lORk9fU0NIRU1BLFxuICBFWFBPUlRfREFUQV9GSUxFX05BTUVfU0NIRU1BLFxuICBTSE9XX0VYUE9SVF9EQVRBX0JVVFRPTl9TQ0hFTUEsXG4gIFNIT1dfTEVHRU5EX1NDSEVNQSxcbn0gZnJvbSAnLi4vc2hhcmVkLXNjaGVtYSc7XG5pbXBvcnQgeyBPbkNoYXJ0U2VsZWN0RXZlbnQgfSBmcm9tICcuLi9zaGFyZWQtdHlwZXMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdtb25pdG9yaW5nLWdhdWdlLWNhcmQnLFxuICB0ZW1wbGF0ZVVybDogJy4vZ2F1Z2UtY2FyZC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2dhdWdlLWNhcmQuY29tcG9uZW50LnNjc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgR2F1Z2VDYXJkQ29tcG9uZW50XG4gIGV4dGVuZHMgR2F1Z2VDb21wb25lbnRcbiAgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3lcbntcbiAgQFZpZXdDaGlsZCgnbmd4Q2hhcnRzR2F1Z2UnKSBnYXVnZUNoYXJ0ITogR2F1Z2VDb21wb25lbnQ7XG5cbiAgQFZpZXdDaGlsZCgnbmd4Q2hhcnRzR2F1Z2UnKSBuZ3hDaGFydHNHYXVnZSE6IEVsZW1lbnRSZWY7XG5cbiAgQElucHV0KClcbiAgc2hvd1RleHQgPSB0cnVlO1xuXG4gIC8qKlxuICAgKiBBdXRvbWF0aWNhbGx5IHNldCBtaW4vbWF4IHJhbmdlIGFjY29yZGluZyB0byBpbnB1dCB2YWx1ZXNcbiAgICovXG4gIEBJbnB1dCgpXG4gIGR5bmFtaWNSYW5nZTogYm9vbGVhbiA9IHRydWU7XG5cbiAgQElucHV0KClcbiAgbWluITogbnVtYmVyO1xuXG4gIEBJbnB1dCgpXG4gIG1heCE6IG51bWJlcjtcblxuICBASW5wdXQoKVxuICBzZXQgZGlnaXRzSW5mbyhkaWdpdHNJbmZvOiBzdHJpbmcpIHtcbiAgICBkZWJ1Zygnc2V0IHZhbHVlRm9ybWF0dGluZyBmcm9tICcsIGRpZ2l0c0luZm8pO1xuICAgIHRoaXMudmFsdWVGb3JtYXR0aW5nID0gKHZhbHVlOiBhbnkpOiBzdHJpbmcgPT4ge1xuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgY29uc3QgZm9ybWF0dGVkT3JOdWxsID0gdGhpcy5kZWNpbWFsUGlwZT8udHJhbnNmb3JtKHZhbHVlLCBkaWdpdHNJbmZvKTtcbiAgICAgICAgcmV0dXJuIGZvcm1hdHRlZE9yTnVsbCB8fCB2YWx1ZS50b1N0cmluZygpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlLnRvU3RyaW5nKCk7XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIEBJbnB1dCgpXG4gIGxlZ2VuZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIEBJbnB1dCgpXG4gIGxlZ2VuZFRpdGxlITogc3RyaW5nO1xuXG4gIEBJbnB1dCgpXG4gIHVuaXRzOiBzdHJpbmcgPSAnJztcblxuICBASW5wdXQoKVxuICBzaG93RXhwb3J0QnV0dG9uOiBib29sZWFuID0gZmFsc2U7XG5cbiAgQElucHV0KClcbiAgZXhwb3J0ZWRGaWxlTmFtZT86IHN0cmluZztcblxuICBASW5wdXQoKVxuICBzZXQgbGFiZWwoaW5kZXhPckFycmF5OiBzdHJpbmcgfCBzdHJpbmdbXSB8IHVuZGVmaW5lZCB8IEZ1bmN0aW9uKSB7XG4gICAgdGhpcy5jaGFydE1vZGVsLmluaXRMYWJlbChpbmRleE9yQXJyYXkpO1xuICB9XG5cbiAgQElucHV0KClcbiAgY29sb3JTY2hlbWUgPSB7XG4gICAgZG9tYWluOiBbXG4gICAgICAnIzVEQURFMicsXG4gICAgICAnIzlCNTlCNicsXG4gICAgICAnI0YzOUMxMicsXG4gICAgICAnIzVBQTQ1NCcsXG4gICAgICAnI0ExMEEyOCcsXG4gICAgICAnI0M3QjQyQycsXG4gICAgICAnI0FBQUFBQScsXG4gICAgXSxcbiAgfTtcblxuICBASW5wdXQoKVxuICBzZXQgaW5wdXRTdHJlYW0oc3RyZWFtOiBPYnNlcnZhYmxlPGFueT4pIHtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcbiAgICBpZiAoIXN0cmVhbSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnN1YnNjcmlwdGlvbiA9IHN0cmVhbS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKHZhbHVlKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmR5bmFtaWNSYW5nZSkge1xuICAgICAgICAgIGlmICh0aGlzLm1heCA9PSB1bmRlZmluZWQgfHwgdmFsdWUgPiB0aGlzLm1heCEpIHtcbiAgICAgICAgICAgIHRoaXMubWF4ID0gdmFsdWU7XG4gICAgICAgICAgICBkZWJ1ZygnZHluYW1pYyBtYXggcmFuZ2UgdXBkYXRlZCB3aXRoOiAnLCB2YWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0aGlzLm1pbiA9PSB1bmRlZmluZWQgfHwgdmFsdWUgPCB0aGlzLm1pbiEpIHtcbiAgICAgICAgICAgIHRoaXMubWluID0gdmFsdWU7XG4gICAgICAgICAgICBkZWJ1ZygnZHluYW1pYyBtaW4gcmFuZ2UgdXBkYXRlZCB3aXRoOiAnLCB2YWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgdmFsdWUuZm9yRWFjaCgodmFsLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgaWYgKCF0aGlzLnJlc3VsdHNbaW5kZXhdKSB7XG4gICAgICAgICAgICAgIHRoaXMucmVzdWx0cy5wdXNoKHtcbiAgICAgICAgICAgICAgICBuYW1lOiB0aGlzLmNoYXJ0TW9kZWwubGFiZWxDb25maWcoaW5kZXgsICdJbmRleCcpLFxuICAgICAgICAgICAgICAgIHZhbHVlOiB2YWwsXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGhpcy5yZXN1bHRzW2luZGV4XS52YWx1ZSA9IHZhbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnNldFNpbmdsZVZhbHVlKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJlc3VsdHMgPSBbLi4udGhpcy5yZXN1bHRzXTtcbiAgICAgIH0sXG4gICAgICBlcnJvcjogKGVycikgPT4ge1xuICAgICAgICBkZWJ1ZyhlcnIpO1xuICAgICAgICB0aGlzLm9uRXJyb3IuZW1pdChlcnIpO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzZXRTaW5nbGVWYWx1ZSh2YWx1ZTogYW55KSB7XG4gICAgdmFsdWUgPSBOdW1iZXIodmFsdWUpO1xuICAgIGlmICghdGhpcy5yZXN1bHRzPy5bMF0pIHtcbiAgICAgIHRoaXMucmVzdWx0cyA9IFtcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6ICdWYWx1ZScsXG4gICAgICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgICB9LFxuICAgICAgXTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5yZXN1bHRzWzBdLnZhbHVlID0gdmFsdWU7XG4gICAgICB0aGlzLnJlc3VsdHMgPSBbLi4udGhpcy5yZXN1bHRzXTtcbiAgICB9XG4gIH1cblxuICAvLyBASW5wdXQoKSB2aWV3OiBbbnVtYmVyLCBudW1iZXJdO1xuXG4gIEBPdXRwdXQoKSBvbkVycm9yID0gbmV3IEV2ZW50RW1pdHRlcjxFcnJvcj4oKTtcblxuICBwcml2YXRlIGNoYXJ0TW9kZWw6IENoYXJ0RGF0YU1vZGVsID0gbmV3IENoYXJ0RGF0YU1vZGVsKCk7XG5cbiAgcHVibGljIHJlc3VsdHM6IHsgbmFtZTogc3RyaW5nOyB2YWx1ZTogYW55IH1bXSA9IFtcbiAgICB7XG4gICAgICBuYW1lOiAnVmFsdWUnLFxuICAgICAgdmFsdWU6IDAsXG4gICAgfSxcbiAgXTtcblxuICBwcml2YXRlIHN1YnNjcmlwdGlvbj86IFN1YnNjcmlwdGlvbjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBteUNoYXJ0RWxlbWVudDogRWxlbWVudFJlZjxhbnk+LFxuICAgIHpvbmU6IE5nWm9uZSxcbiAgICBjZDogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgQEluamVjdChQTEFURk9STV9JRCkgcGxhdGZvcm1JZDogc3RyaW5nLFxuICAgIHB1YmxpYyBkZWNpbWFsUGlwZTogRGVjaW1hbFBpcGVcbiAgKSB7XG4gICAgc3VwZXIobXlDaGFydEVsZW1lbnQsIHpvbmUsIGNkLCBwbGF0Zm9ybUlkKTtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5nYXVnZUNoYXJ0LmhlaWdodCA+IDI1MCkge1xuICAgICAgdGhpcy5nYXVnZUNoYXJ0Lm1hcmdpbiA9IFs4MCwgODAsIDAsIDgwXTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5nYXVnZUNoYXJ0Lm1hcmdpbiA9IFswLCA4MCwgMCwgODBdO1xuICAgIH1cbiAgICB0aGlzLmdhdWdlQ2hhcnQudXBkYXRlKCk7XG4gIH1cblxuICBzY2FsZVRleHQocmVwZWF0OiBib29sZWFuID0gdHJ1ZSkge1xuICAgIC8vIGlmICh0aGlzLnRleHRTaXplKSB7XG4gICAgLy8gICB0aGlzLnRleHRUcmFuc2Zvcm0gPSBgYDtcbiAgICAvLyAgIHJldHVybjtcbiAgICAvLyB9XG4gICAgaWYgKCF0aGlzLnRleHRFbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByZXR1cm4gc3VwZXIuc2NhbGVUZXh0KHJlcGVhdCk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICBzdXBlci5uZ09uRGVzdHJveSgpO1xuICAgIHRoaXMuc3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xuICB9XG5cbiAgb25TZWxlY3QoZXZlbnQ6IE9uQ2hhcnRTZWxlY3RFdmVudCkge31cbn1cbiIsIjxkaXYgY2xhc3M9XCJjaGFydC1jb250YWluZXJcIiBzdHlsZT1cInBvc2l0aW9uOiByZWxhdGl2ZVwiPlxuICA8bmd4LWNoYXJ0cy1nYXVnZVxuICAgICNuZ3hDaGFydHNHYXVnZVxuICAgIFtzY2hlbWVdPVwiY29sb3JTY2hlbWVcIlxuICAgIFtyZXN1bHRzXT1cInJlc3VsdHNcIlxuICAgIFttaW5dPVwibWluXCJcbiAgICBbbWF4XT1cIm1heFwiXG4gICAgW2FuZ2xlU3Bhbl09XCJhbmdsZVNwYW5cIlxuICAgIFtzdGFydEFuZ2xlXT1cInN0YXJ0QW5nbGVcIlxuICAgIFt1bml0c109XCJ1bml0c1wiXG4gICAgW2JpZ1NlZ21lbnRzXT1cImJpZ1NlZ21lbnRzXCJcbiAgICBbc21hbGxTZWdtZW50c109XCJzbWFsbFNlZ21lbnRzXCJcbiAgICBbbGVnZW5kXT1cImxlZ2VuZFwiXG4gICAgW2xlZ2VuZFRpdGxlXT1cImxlZ2VuZFRpdGxlXCJcbiAgICBbdmFsdWVGb3JtYXR0aW5nXT1cInZhbHVlRm9ybWF0dGluZ1wiXG4gICAgW3Nob3dUZXh0XT1cInNob3dUZXh0XCJcbiAgICBbdmlld109XCJ2aWV3XCJcbiAgICAoc2VsZWN0KT1cIm9uU2VsZWN0KCRldmVudClcIlxuICA+XG4gIDwvbmd4LWNoYXJ0cy1nYXVnZT5cbiAgPGlvbi1mYWItYnV0dG9uXG4gICAgaWQ9XCJleHBvcnRGYWJCdXR0b25cIlxuICAgIHNpemU9XCJzbWFsbFwiXG4gICAgdGFwRXhwb3J0RGF0YVxuICAgIFtkYXRhVG9FeHBvcnRdPVwicmVzdWx0c1wiXG4gICAgW2V4cG9ydGVkRmlsZU5hbWVdPVwiZXhwb3J0ZWRGaWxlTmFtZVwiXG4gICAgKm5nSWY9XCJzaG93RXhwb3J0QnV0dG9uXCJcbiAgPlxuICAgIDxpb24taWNvbiBuYW1lPVwiZG93bmxvYWRcIj48L2lvbi1pY29uPlxuICA8L2lvbi1mYWItYnV0dG9uPlxuPC9kaXY+XG4iXX0=