@c8y/ngx-components 1021.75.7 → 1021.76.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/branding/shared/supports-branding.service.d.ts.map +1 -1
- package/core/dashboard/widgets-dashboard.component.d.ts +4 -2
- package/core/dashboard/widgets-dashboard.component.d.ts.map +1 -1
- package/core/navigator/navigator-bottom/navigator-bottom.service.d.ts +3 -1
- package/core/navigator/navigator-bottom/navigator-bottom.service.d.ts.map +1 -1
- package/esm2022/branding/shared/supports-branding.service.mjs +6 -3
- package/esm2022/core/dashboard/widgets-dashboard.component.mjs +9 -5
- package/esm2022/core/navigator/navigator-bottom/navigator-bottom.service.mjs +13 -6
- package/esm2022/device-map/device-map.component.mjs +2 -2
- package/esm2022/map/cluster-map.component.mjs +6 -3
- package/esm2022/map/map-status.component.mjs +23 -5
- package/esm2022/map/map.model.mjs +5 -2
- package/esm2022/map/map.service.mjs +17 -1
- package/esm2022/widgets/implementations/map/map-widget-config.component.mjs +25 -6
- package/esm2022/widgets/implementations/map/map-widget.component.mjs +40 -11
- package/fesm2022/c8y-ngx-components-branding-shared.mjs +5 -2
- package/fesm2022/c8y-ngx-components-branding-shared.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-device-map.mjs +1 -1
- package/fesm2022/c8y-ngx-components-device-map.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-map.mjs +47 -7
- package/fesm2022/c8y-ngx-components-map.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-implementations-map.mjs +67 -19
- package/fesm2022/c8y-ngx-components-widgets-implementations-map.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components.mjs +17 -8
- package/fesm2022/c8y-ngx-components.mjs.map +1 -1
- package/locales/locales.pot +3 -0
- package/map/cluster-map.component.d.ts +2 -1
- package/map/cluster-map.component.d.ts.map +1 -1
- package/map/map-status.component.d.ts +7 -2
- package/map/map-status.component.d.ts.map +1 -1
- package/map/map.model.d.ts +1 -0
- package/map/map.model.d.ts.map +1 -1
- package/map/map.service.d.ts +1 -0
- package/map/map.service.d.ts.map +1 -1
- package/package.json +1 -1
- package/widgets/implementations/map/map-widget-config.component.d.ts +1 -0
- package/widgets/implementations/map/map-widget-config.component.d.ts.map +1 -1
- package/widgets/implementations/map/map-widget.component.d.ts +10 -4
- package/widgets/implementations/map/map-widget.component.d.ts.map +1 -1
|
@@ -3,10 +3,10 @@ import { CommonModule as NgCommonModule } from '@angular/common';
|
|
|
3
3
|
import { FormsModule as NgFormsModule } from '@angular/forms';
|
|
4
4
|
import { ControlContainer, NgForm } from '@angular/forms';
|
|
5
5
|
import { AlertService, AssetLinkPipe, CommonModule, FormsModule, gettext } from '@c8y/ngx-components';
|
|
6
|
-
import { MAP_DEFAULT_CONFIG, MapComponent, MapModule, MapService } from '@c8y/ngx-components/map';
|
|
6
|
+
import { defaultFitBoundsOptions, MAP_DEFAULT_CONFIG, MapComponent, MapModule, MapService } from '@c8y/ngx-components/map';
|
|
7
7
|
import { TranslateService } from '@ngx-translate/core';
|
|
8
|
-
import { Observable, Subject } from 'rxjs';
|
|
9
|
-
import { takeUntil } from 'rxjs/operators';
|
|
8
|
+
import { fromEvent, Observable, Subject } from 'rxjs';
|
|
9
|
+
import { combineLatestWith, take, takeUntil } from 'rxjs/operators';
|
|
10
10
|
import { IconSelectorModule } from '@c8y/ngx-components/icon-selector';
|
|
11
11
|
import { TooltipModule } from 'ngx-bootstrap/tooltip';
|
|
12
12
|
import * as i0 from "@angular/core";
|
|
@@ -119,6 +119,25 @@ export class MapWidgetConfigComponent {
|
|
|
119
119
|
];
|
|
120
120
|
this.changeCenter();
|
|
121
121
|
}
|
|
122
|
+
async fitToBounds() {
|
|
123
|
+
if (!this.assets?.length || !this.previewMap?.map) {
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
const bounds = await this.mapService.getAssetsBounds(this.assets);
|
|
127
|
+
// map.fitBounds causes zoom and move events, so get new center and zoom level only when these events are finished
|
|
128
|
+
fromEvent(this.previewMap.map, 'moveend')
|
|
129
|
+
.pipe(combineLatestWith(fromEvent(this.previewMap.map, 'zoomend')), take(1))
|
|
130
|
+
.subscribe(() => {
|
|
131
|
+
const center = this.previewMap.map.getCenter();
|
|
132
|
+
const zoom = this.previewMap.map.getZoom();
|
|
133
|
+
const fixedLat = +center.lat.toFixed(this.FIXED_POINT_DIGITS);
|
|
134
|
+
const fixedLng = +center.lng.toFixed(this.FIXED_POINT_DIGITS);
|
|
135
|
+
this.formConfig.center = [fixedLat, fixedLng];
|
|
136
|
+
this.formConfig.zoomLevel = Math.floor(zoom);
|
|
137
|
+
this.changeCenter();
|
|
138
|
+
});
|
|
139
|
+
this.previewMap.map.fitBounds(bounds, defaultFitBoundsOptions);
|
|
140
|
+
}
|
|
122
141
|
updateRefreshOption() {
|
|
123
142
|
this.formConfig.realtime = this.refreshOption === 'realtime';
|
|
124
143
|
this.config.widgetInstanceGlobalAutoRefreshContext =
|
|
@@ -188,7 +207,7 @@ export class MapWidgetConfigComponent {
|
|
|
188
207
|
this.previewMap.addMarkerToMap(this.centerIcon);
|
|
189
208
|
}
|
|
190
209
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MapWidgetConfigComponent, deps: [{ token: i1.MapService }, { token: i2.AlertService }, { token: i3.TranslateService }, { token: MAP_DEFAULT_CONFIG }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
191
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: MapWidgetConfigComponent, isStandalone: true, selector: "c8y-map-widget-config", inputs: { config: "config" }, viewQueries: [{ propertyName: "previewMap", first: true, predicate: MapComponent, descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div\n class=\"row p-t-16\"\n *ngIf=\"formConfig\"\n>\n <div class=\"col-xs-2\">\n <c8y-form-group class=\"m-b-0 text-center form-group-sm\">\n <label translate>Marker icon</label>\n <c8y-icon-selector-wrapper\n [canRemoveIcon]=\"true\"\n [selectedIcon]=\"formConfig.icon\"\n (onSelect)=\"selectIcon($event)\"\n ></c8y-icon-selector-wrapper>\n </c8y-form-group>\n </div>\n <div class=\"col-xs-10\">\n <div class=\"row tight-grid separator-bottom\">\n <div class=\"col-xs-4\">\n <div class=\"form-group form-group-sm\">\n <label translate>Zoom level</label>\n <c8y-range\n class=\"label-bottom\"\n name=\"zoomLevel\"\n #range\n [(ngModel)]=\"formConfig.zoomLevel\"\n (change)=\"zoomLevelChanged()\"\n >\n <input\n type=\"range\"\n min=\"2\"\n max=\"18\"\n step=\"1\"\n />\n </c8y-range>\n </div>\n </div>\n <div class=\"col-xs-8\">\n <c8y-form-group class=\"form-group-sm m-b-8\">\n <label translate>Center bound</label>\n <div class=\"input-group input-group-sm\">\n <input\n class=\"form-control\"\n placeholder=\"{{ 'lat.`latitude`' | translate }}\"\n name=\"centerLat\"\n type=\"number\"\n required\n [(ngModel)]=\"formConfig.center[0]\"\n (change)=\"changeCenter()\"\n (keydown.enter)=\"changeCenterOnEnterKey($event)\"\n min=\"-90\"\n max=\"90\"\n step=\"0.1\"\n />\n <input\n class=\"form-control\"\n placeholder=\"{{ 'lng.`longitude`' | translate }}\"\n name=\"centerLng\"\n type=\"number\"\n required\n min=\"-180\"\n max=\"180\"\n [(ngModel)]=\"formConfig.center[1]\"\n (change)=\"changeCenter()\"\n (keydown.enter)=\"changeCenterOnEnterKey($event)\"\n min=\"-180\"\n max=\"180\"\n step=\"0.1\"\n />\n <div class=\"input-group-btn\">\n <button\n class=\"btn btn-default\"\n [attr.aria-label]=\"'Use your location' | translate\"\n [tooltip]=\"'Use your location' | translate\"\n placement=\"top\"\n container=\"body\"\n (click)=\"useOwnPosition()\"\n >\n <i\n class=\"icon-14\"\n c8yIcon=\"location-arrow\"\n ></i>\n </button>\n </div>\n <div\n class=\"input-group-btn\"\n *ngIf=\"canAutoCenter\"\n >\n <button\n class=\"btn btn-default\"\n [attr.aria-label]=\"'Use selected asset location' | translate\"\n [tooltip]=\"'Use selected asset location' | translate\"\n placement=\"top\"\n container=\"body\"\n (click)=\"centerToAsset()\"\n >\n <i\n class=\"icon-14\"\n c8yIcon=\"location\"\n ></i>\n </button>\n </div>\n </div>\n <c8y-messages\n [helpMessage]=\"'Drag the map to the desired position' | translate\"\n ></c8y-messages>\n </c8y-form-group>\n </div>\n </div>\n\n <div class=\"row tight-grid p-t-8 d-flex a-i-center\">\n <div class=\"col-xs-6\">\n <c8y-form-group class=\"m-b-0 form-group-sm\">\n <div class=\"c8y-select-wrapper\">\n <select\n class=\"form-control\"\n title=\"{{ 'Refresh options`options for refreshing a view`' | translate }}\"\n id=\"selectExample\"\n name=\"refreshSelection\"\n [(ngModel)]=\"refreshOption\"\n (change)=\"updateRefreshOption()\"\n >\n <option\n [title]=\"'Only refreshing on interaction' | translate\"\n value=\"none\"\n translate\n >\n No automatic refresh\n </option>\n <option\n [title]=\"'Refreshing after the given interval and on interaction' | translate\"\n value=\"interval\"\n *ngIf=\"!isPositionedDevice\"\n translate\n >\n Use refresh interval\n </option>\n <option\n [title]=\"\n 'Refreshing after the given interval and on interaction, synchronized globally'\n | translate\n \"\n value=\"dashboard-auto-refresh-context\"\n *ngIf=\"!isPositionedDevice\"\n translate\n >\n Use global refresh interval\n </option>\n <option\n [title]=\"'Live updating on each position change' | translate\"\n value=\"realtime\"\n *ngIf=\"isPositionedDevice\"\n translate\n >\n Realtime\n </option>\n <option\n [title]=\"'Bind widget to dashboard realtime context' | translate\"\n value=\"dashboard-realtime-context\"\n *ngIf=\"isPositionedDevice\"\n translate\n >\n Dashboard realtime context\n </option>\n </select>\n </div>\n </c8y-form-group>\n </div>\n <div class=\"col-xs-8\">\n <div class=\"form-group form-group-sm m-b-0\">\n <c8y-range\n class=\"label-bottom\"\n name=\"refreshInterval\"\n #intervalRange\n *ngIf=\"refreshOption === 'interval'\"\n [(ngModel)]=\"formConfig.refreshInterval\"\n >\n <ng-template #c8yRangeValue>\n <div>\n <span\n [translateParams]=\"{ intervalInSeconds: intervalRange.value * 0.001 }\"\n translate\n ngNonBindable\n >\n {{ intervalInSeconds }} s\n </span>\n </div>\n </ng-template>\n <input\n type=\"range\"\n min=\"5000\"\n max=\"100000\"\n step=\"1000\"\n />\n </c8y-range>\n </div>\n <label\n class=\"c8y-switch c8y-switch--inline\"\n *ngIf=\"refreshOption === 'realtime' || refreshOption === 'dashboard-realtime-context'\"\n >\n <input\n name=\"follow\"\n type=\"checkbox\"\n [(ngModel)]=\"formConfig.follow\"\n />\n <span></span>\n <span\n class=\"text-12\"\n translate\n >\n Follow selected\n </span>\n </label>\n </div>\n </div>\n </div>\n</div>\n\n<div\n class=\"p-t-16 p-b-16\"\n style=\"width: 100%; height: 240px\"\n>\n <c8y-map\n *ngIf=\"config.mapConfig\"\n [assets]=\"assets\"\n [config]=\"config.mapConfig\"\n (onMove)=\"onPreviewMapMove($event)\"\n (onZoomStart)=\"onPreviewZoomStart()\"\n (onZoomEnd)=\"onPreviewZoomEnd($event)\"\n (onInit)=\"previewMapInit($event)\"\n ></c8y-map>\n</div>\n", dependencies: [{ kind: "ngmodule", type: NgCommonModule }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: NgFormsModule }, { kind: "directive", type: i5.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i5.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i5.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i5.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i5.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i5.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i5.MinValidator, selector: "input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]", inputs: ["min"] }, { kind: "directive", type: i5.MaxValidator, selector: "input[type=number][max][formControlName],input[type=number][max][formControl],input[type=number][max][ngModel]", inputs: ["max"] }, { kind: "directive", type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "pipe", type: i2.C8yTranslatePipe, name: "translate" }, { kind: "directive", type: i2.C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.MinValidationDirective, selector: "[min]", inputs: ["min"] }, { kind: "directive", type: i2.MaxValidationDirective, selector: "[max]", inputs: ["max"] }, { kind: "component", type: i2.FormGroupComponent, selector: "c8y-form-group", inputs: ["hasError", "hasWarning", "hasSuccess", "novalidation", "status"] }, { kind: "component", type: i2.MessagesComponent, selector: "c8y-messages", inputs: ["show", "defaults", "helpMessage"] }, { kind: "directive", type: i2.RequiredInputPlaceholderDirective, selector: "input[required], input[formControlName]" }, { kind: "directive", type: i2.RangeDirective, selector: "input[type=\"range\"]" }, { kind: "component", type: i2.RangeComponent, selector: "c8y-range", inputs: ["valueDisplayMode"] }, { kind: "ngmodule", type: IconSelectorModule }, { kind: "component", type: i6.IconSelectorWrapperComponent, selector: "c8y-icon-selector-wrapper", inputs: ["canRemoveIcon", "selectedIcon", "iconSize"], outputs: ["onSelect"] }, { kind: "ngmodule", type: MapModule }, { kind: "component", type: i1.MapComponent, selector: "c8y-map", inputs: ["config", "assets", "polyline$", "polylineOptions"], outputs: ["onRealtimeUpdate", "onMove", "onMoveEnd", "onZoomStart", "onZoomEnd", "onMap", "onInit"] }, { kind: "ngmodule", type: TooltipModule }, { kind: "directive", type: i7.TooltipDirective, selector: "[tooltip], [tooltipHtml]", inputs: ["adaptivePosition", "tooltip", "placement", "triggers", "container", "containerClass", "boundariesElement", "isOpen", "isDisabled", "delay", "tooltipHtml", "tooltipPlacement", "tooltipIsOpen", "tooltipEnable", "tooltipAppendToBody", "tooltipAnimation", "tooltipClass", "tooltipContext", "tooltipPopupDelay", "tooltipFadeDuration", "tooltipTrigger"], outputs: ["tooltipChange", "onShown", "onHidden", "tooltipStateChanged"], exportAs: ["bs-tooltip"] }], viewProviders: [{ provide: ControlContainer, useExisting: NgForm }] }); }
|
|
210
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: MapWidgetConfigComponent, isStandalone: true, selector: "c8y-map-widget-config", inputs: { config: "config" }, viewQueries: [{ propertyName: "previewMap", first: true, predicate: MapComponent, descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div\n class=\"row p-t-16\"\n *ngIf=\"formConfig\"\n>\n <div class=\"col-xs-2\">\n <c8y-form-group class=\"m-b-0 text-center form-group-sm\">\n <label translate>Marker icon</label>\n <c8y-icon-selector-wrapper\n [canRemoveIcon]=\"true\"\n [selectedIcon]=\"formConfig.icon\"\n (onSelect)=\"selectIcon($event)\"\n ></c8y-icon-selector-wrapper>\n </c8y-form-group>\n </div>\n <div class=\"col-xs-10\">\n <div class=\"row tight-grid separator-bottom\">\n <div class=\"col-xs-4\">\n <div class=\"form-group form-group-sm\">\n <label translate>Zoom level</label>\n <c8y-range\n class=\"label-bottom\"\n name=\"zoomLevel\"\n #range\n [(ngModel)]=\"formConfig.zoomLevel\"\n (change)=\"zoomLevelChanged()\"\n >\n <input\n type=\"range\"\n min=\"0\"\n max=\"18\"\n step=\"1\"\n />\n </c8y-range>\n </div>\n </div>\n <div class=\"col-xs-8\">\n <c8y-form-group class=\"form-group-sm m-b-8\">\n <label translate>Center bound</label>\n <div class=\"input-group input-group-sm\">\n <input\n class=\"form-control\"\n placeholder=\"{{ 'lat.`latitude`' | translate }}\"\n name=\"centerLat\"\n type=\"number\"\n required\n [(ngModel)]=\"formConfig.center[0]\"\n (change)=\"changeCenter()\"\n (keydown.enter)=\"changeCenterOnEnterKey($event)\"\n min=\"-90\"\n max=\"90\"\n step=\"0.1\"\n />\n <input\n class=\"form-control\"\n placeholder=\"{{ 'lng.`longitude`' | translate }}\"\n name=\"centerLng\"\n type=\"number\"\n required\n min=\"-180\"\n max=\"180\"\n [(ngModel)]=\"formConfig.center[1]\"\n (change)=\"changeCenter()\"\n (keydown.enter)=\"changeCenterOnEnterKey($event)\"\n min=\"-180\"\n max=\"180\"\n step=\"0.1\"\n />\n <div class=\"input-group-btn\">\n <button\n class=\"btn btn-default\"\n [attr.aria-label]=\"'Use your location' | translate\"\n [tooltip]=\"'Use your location' | translate\"\n placement=\"top\"\n container=\"body\"\n (click)=\"useOwnPosition()\"\n >\n <i\n class=\"icon-14\"\n c8yIcon=\"location-arrow\"\n ></i>\n </button>\n </div>\n <div class=\"input-group-btn\">\n <button\n class=\"btn btn-default\"\n [attr.aria-label]=\"'Use selected asset location' | translate\"\n [tooltip]=\"'Use selected asset location' | translate\"\n placement=\"top\"\n container=\"body\"\n *ngIf=\"canAutoCenter; else fitToBoundsButton\"\n (click)=\"centerToAsset()\"\n >\n <i\n class=\"icon-14\"\n c8yIcon=\"location\"\n ></i>\n </button>\n </div>\n </div>\n\n <ng-template #fitToBoundsButton>\n <button\n class=\"btn btn-default\"\n [attr.aria-label]=\"'Fit to assets bounds' | translate\"\n [tooltip]=\"'Fit to assets bounds' | translate\"\n placement=\"top\"\n container=\"body\"\n (click)=\"fitToBounds()\"\n >\n <i\n class=\"icon-14\"\n c8yIcon=\"waypoint-map\"\n ></i>\n </button>\n </ng-template>\n <c8y-messages\n [helpMessage]=\"'Drag the map to the desired position' | translate\"\n ></c8y-messages>\n </c8y-form-group>\n </div>\n </div>\n\n <div class=\"row tight-grid p-t-8 d-flex a-i-center\">\n <div class=\"col-xs-6\">\n <c8y-form-group class=\"m-b-0 form-group-sm\">\n <div class=\"c8y-select-wrapper\">\n <select\n class=\"form-control\"\n title=\"{{ 'Refresh options`options for refreshing a view`' | translate }}\"\n id=\"selectExample\"\n name=\"refreshSelection\"\n [(ngModel)]=\"refreshOption\"\n (change)=\"updateRefreshOption()\"\n >\n <option\n [title]=\"'Only refreshing on interaction' | translate\"\n value=\"none\"\n translate\n >\n No automatic refresh\n </option>\n <option\n [title]=\"'Refreshing after the given interval and on interaction' | translate\"\n value=\"interval\"\n *ngIf=\"!isPositionedDevice\"\n translate\n >\n Use refresh interval\n </option>\n <option\n [title]=\"\n 'Refreshing after the given interval and on interaction, synchronized globally'\n | translate\n \"\n value=\"dashboard-auto-refresh-context\"\n *ngIf=\"!isPositionedDevice\"\n translate\n >\n Use global refresh interval\n </option>\n <option\n [title]=\"'Live updating on each position change' | translate\"\n value=\"realtime\"\n *ngIf=\"isPositionedDevice\"\n translate\n >\n Realtime\n </option>\n <option\n [title]=\"'Bind widget to dashboard realtime context' | translate\"\n value=\"dashboard-realtime-context\"\n *ngIf=\"isPositionedDevice\"\n translate\n >\n Dashboard realtime context\n </option>\n </select>\n </div>\n </c8y-form-group>\n </div>\n <div class=\"col-xs-8\">\n <div class=\"form-group form-group-sm m-b-0\">\n <c8y-range\n class=\"label-bottom\"\n name=\"refreshInterval\"\n #intervalRange\n *ngIf=\"refreshOption === 'interval'\"\n [(ngModel)]=\"formConfig.refreshInterval\"\n >\n <ng-template #c8yRangeValue>\n <div>\n <span\n [translateParams]=\"{ intervalInSeconds: intervalRange.value * 0.001 }\"\n translate\n ngNonBindable\n >\n {{ intervalInSeconds }} s\n </span>\n </div>\n </ng-template>\n <input\n type=\"range\"\n min=\"5000\"\n max=\"100000\"\n step=\"1000\"\n />\n </c8y-range>\n </div>\n <label\n class=\"c8y-switch c8y-switch--inline\"\n *ngIf=\"refreshOption === 'realtime' || refreshOption === 'dashboard-realtime-context'\"\n >\n <input\n name=\"follow\"\n type=\"checkbox\"\n [(ngModel)]=\"formConfig.follow\"\n />\n <span></span>\n <span\n class=\"text-12\"\n translate\n >\n Follow selected\n </span>\n </label>\n </div>\n </div>\n </div>\n</div>\n\n<div\n class=\"p-t-16 p-b-16\"\n style=\"width: 100%; height: 240px\"\n>\n <c8y-map\n *ngIf=\"config.mapConfig\"\n [assets]=\"assets\"\n [config]=\"config.mapConfig\"\n (onMove)=\"onPreviewMapMove($event)\"\n (onZoomStart)=\"onPreviewZoomStart()\"\n (onZoomEnd)=\"onPreviewZoomEnd($event)\"\n (onInit)=\"previewMapInit($event)\"\n ></c8y-map>\n</div>\n", dependencies: [{ kind: "ngmodule", type: NgCommonModule }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: NgFormsModule }, { kind: "directive", type: i5.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i5.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i5.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i5.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i5.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i5.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i5.MinValidator, selector: "input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]", inputs: ["min"] }, { kind: "directive", type: i5.MaxValidator, selector: "input[type=number][max][formControlName],input[type=number][max][formControl],input[type=number][max][ngModel]", inputs: ["max"] }, { kind: "directive", type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "pipe", type: i2.C8yTranslatePipe, name: "translate" }, { kind: "directive", type: i2.C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.MinValidationDirective, selector: "[min]", inputs: ["min"] }, { kind: "directive", type: i2.MaxValidationDirective, selector: "[max]", inputs: ["max"] }, { kind: "component", type: i2.FormGroupComponent, selector: "c8y-form-group", inputs: ["hasError", "hasWarning", "hasSuccess", "novalidation", "status"] }, { kind: "component", type: i2.MessagesComponent, selector: "c8y-messages", inputs: ["show", "defaults", "helpMessage"] }, { kind: "directive", type: i2.RequiredInputPlaceholderDirective, selector: "input[required], input[formControlName]" }, { kind: "directive", type: i2.RangeDirective, selector: "input[type=\"range\"]" }, { kind: "component", type: i2.RangeComponent, selector: "c8y-range", inputs: ["valueDisplayMode"] }, { kind: "ngmodule", type: IconSelectorModule }, { kind: "component", type: i6.IconSelectorWrapperComponent, selector: "c8y-icon-selector-wrapper", inputs: ["canRemoveIcon", "selectedIcon", "iconSize"], outputs: ["onSelect"] }, { kind: "ngmodule", type: MapModule }, { kind: "component", type: i1.MapComponent, selector: "c8y-map", inputs: ["config", "assets", "polyline$", "polylineOptions"], outputs: ["onRealtimeUpdate", "onMove", "onMoveEnd", "onZoomStart", "onZoomEnd", "onMap", "onInit"] }, { kind: "ngmodule", type: TooltipModule }, { kind: "directive", type: i7.TooltipDirective, selector: "[tooltip], [tooltipHtml]", inputs: ["adaptivePosition", "tooltip", "placement", "triggers", "container", "containerClass", "boundariesElement", "isOpen", "isDisabled", "delay", "tooltipHtml", "tooltipPlacement", "tooltipIsOpen", "tooltipEnable", "tooltipAppendToBody", "tooltipAnimation", "tooltipClass", "tooltipContext", "tooltipPopupDelay", "tooltipFadeDuration", "tooltipTrigger"], outputs: ["tooltipChange", "onShown", "onHidden", "tooltipStateChanged"], exportAs: ["bs-tooltip"] }], viewProviders: [{ provide: ControlContainer, useExisting: NgForm }] }); }
|
|
192
211
|
}
|
|
193
212
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MapWidgetConfigComponent, decorators: [{
|
|
194
213
|
type: Component,
|
|
@@ -201,7 +220,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
|
|
|
201
220
|
MapModule,
|
|
202
221
|
AssetLinkPipe,
|
|
203
222
|
TooltipModule
|
|
204
|
-
], template: "<div\n class=\"row p-t-16\"\n *ngIf=\"formConfig\"\n>\n <div class=\"col-xs-2\">\n <c8y-form-group class=\"m-b-0 text-center form-group-sm\">\n <label translate>Marker icon</label>\n <c8y-icon-selector-wrapper\n [canRemoveIcon]=\"true\"\n [selectedIcon]=\"formConfig.icon\"\n (onSelect)=\"selectIcon($event)\"\n ></c8y-icon-selector-wrapper>\n </c8y-form-group>\n </div>\n <div class=\"col-xs-10\">\n <div class=\"row tight-grid separator-bottom\">\n <div class=\"col-xs-4\">\n <div class=\"form-group form-group-sm\">\n <label translate>Zoom level</label>\n <c8y-range\n class=\"label-bottom\"\n name=\"zoomLevel\"\n #range\n [(ngModel)]=\"formConfig.zoomLevel\"\n (change)=\"zoomLevelChanged()\"\n >\n <input\n type=\"range\"\n min=\"
|
|
223
|
+
], template: "<div\n class=\"row p-t-16\"\n *ngIf=\"formConfig\"\n>\n <div class=\"col-xs-2\">\n <c8y-form-group class=\"m-b-0 text-center form-group-sm\">\n <label translate>Marker icon</label>\n <c8y-icon-selector-wrapper\n [canRemoveIcon]=\"true\"\n [selectedIcon]=\"formConfig.icon\"\n (onSelect)=\"selectIcon($event)\"\n ></c8y-icon-selector-wrapper>\n </c8y-form-group>\n </div>\n <div class=\"col-xs-10\">\n <div class=\"row tight-grid separator-bottom\">\n <div class=\"col-xs-4\">\n <div class=\"form-group form-group-sm\">\n <label translate>Zoom level</label>\n <c8y-range\n class=\"label-bottom\"\n name=\"zoomLevel\"\n #range\n [(ngModel)]=\"formConfig.zoomLevel\"\n (change)=\"zoomLevelChanged()\"\n >\n <input\n type=\"range\"\n min=\"0\"\n max=\"18\"\n step=\"1\"\n />\n </c8y-range>\n </div>\n </div>\n <div class=\"col-xs-8\">\n <c8y-form-group class=\"form-group-sm m-b-8\">\n <label translate>Center bound</label>\n <div class=\"input-group input-group-sm\">\n <input\n class=\"form-control\"\n placeholder=\"{{ 'lat.`latitude`' | translate }}\"\n name=\"centerLat\"\n type=\"number\"\n required\n [(ngModel)]=\"formConfig.center[0]\"\n (change)=\"changeCenter()\"\n (keydown.enter)=\"changeCenterOnEnterKey($event)\"\n min=\"-90\"\n max=\"90\"\n step=\"0.1\"\n />\n <input\n class=\"form-control\"\n placeholder=\"{{ 'lng.`longitude`' | translate }}\"\n name=\"centerLng\"\n type=\"number\"\n required\n min=\"-180\"\n max=\"180\"\n [(ngModel)]=\"formConfig.center[1]\"\n (change)=\"changeCenter()\"\n (keydown.enter)=\"changeCenterOnEnterKey($event)\"\n min=\"-180\"\n max=\"180\"\n step=\"0.1\"\n />\n <div class=\"input-group-btn\">\n <button\n class=\"btn btn-default\"\n [attr.aria-label]=\"'Use your location' | translate\"\n [tooltip]=\"'Use your location' | translate\"\n placement=\"top\"\n container=\"body\"\n (click)=\"useOwnPosition()\"\n >\n <i\n class=\"icon-14\"\n c8yIcon=\"location-arrow\"\n ></i>\n </button>\n </div>\n <div class=\"input-group-btn\">\n <button\n class=\"btn btn-default\"\n [attr.aria-label]=\"'Use selected asset location' | translate\"\n [tooltip]=\"'Use selected asset location' | translate\"\n placement=\"top\"\n container=\"body\"\n *ngIf=\"canAutoCenter; else fitToBoundsButton\"\n (click)=\"centerToAsset()\"\n >\n <i\n class=\"icon-14\"\n c8yIcon=\"location\"\n ></i>\n </button>\n </div>\n </div>\n\n <ng-template #fitToBoundsButton>\n <button\n class=\"btn btn-default\"\n [attr.aria-label]=\"'Fit to assets bounds' | translate\"\n [tooltip]=\"'Fit to assets bounds' | translate\"\n placement=\"top\"\n container=\"body\"\n (click)=\"fitToBounds()\"\n >\n <i\n class=\"icon-14\"\n c8yIcon=\"waypoint-map\"\n ></i>\n </button>\n </ng-template>\n <c8y-messages\n [helpMessage]=\"'Drag the map to the desired position' | translate\"\n ></c8y-messages>\n </c8y-form-group>\n </div>\n </div>\n\n <div class=\"row tight-grid p-t-8 d-flex a-i-center\">\n <div class=\"col-xs-6\">\n <c8y-form-group class=\"m-b-0 form-group-sm\">\n <div class=\"c8y-select-wrapper\">\n <select\n class=\"form-control\"\n title=\"{{ 'Refresh options`options for refreshing a view`' | translate }}\"\n id=\"selectExample\"\n name=\"refreshSelection\"\n [(ngModel)]=\"refreshOption\"\n (change)=\"updateRefreshOption()\"\n >\n <option\n [title]=\"'Only refreshing on interaction' | translate\"\n value=\"none\"\n translate\n >\n No automatic refresh\n </option>\n <option\n [title]=\"'Refreshing after the given interval and on interaction' | translate\"\n value=\"interval\"\n *ngIf=\"!isPositionedDevice\"\n translate\n >\n Use refresh interval\n </option>\n <option\n [title]=\"\n 'Refreshing after the given interval and on interaction, synchronized globally'\n | translate\n \"\n value=\"dashboard-auto-refresh-context\"\n *ngIf=\"!isPositionedDevice\"\n translate\n >\n Use global refresh interval\n </option>\n <option\n [title]=\"'Live updating on each position change' | translate\"\n value=\"realtime\"\n *ngIf=\"isPositionedDevice\"\n translate\n >\n Realtime\n </option>\n <option\n [title]=\"'Bind widget to dashboard realtime context' | translate\"\n value=\"dashboard-realtime-context\"\n *ngIf=\"isPositionedDevice\"\n translate\n >\n Dashboard realtime context\n </option>\n </select>\n </div>\n </c8y-form-group>\n </div>\n <div class=\"col-xs-8\">\n <div class=\"form-group form-group-sm m-b-0\">\n <c8y-range\n class=\"label-bottom\"\n name=\"refreshInterval\"\n #intervalRange\n *ngIf=\"refreshOption === 'interval'\"\n [(ngModel)]=\"formConfig.refreshInterval\"\n >\n <ng-template #c8yRangeValue>\n <div>\n <span\n [translateParams]=\"{ intervalInSeconds: intervalRange.value * 0.001 }\"\n translate\n ngNonBindable\n >\n {{ intervalInSeconds }} s\n </span>\n </div>\n </ng-template>\n <input\n type=\"range\"\n min=\"5000\"\n max=\"100000\"\n step=\"1000\"\n />\n </c8y-range>\n </div>\n <label\n class=\"c8y-switch c8y-switch--inline\"\n *ngIf=\"refreshOption === 'realtime' || refreshOption === 'dashboard-realtime-context'\"\n >\n <input\n name=\"follow\"\n type=\"checkbox\"\n [(ngModel)]=\"formConfig.follow\"\n />\n <span></span>\n <span\n class=\"text-12\"\n translate\n >\n Follow selected\n </span>\n </label>\n </div>\n </div>\n </div>\n</div>\n\n<div\n class=\"p-t-16 p-b-16\"\n style=\"width: 100%; height: 240px\"\n>\n <c8y-map\n *ngIf=\"config.mapConfig\"\n [assets]=\"assets\"\n [config]=\"config.mapConfig\"\n (onMove)=\"onPreviewMapMove($event)\"\n (onZoomStart)=\"onPreviewZoomStart()\"\n (onZoomEnd)=\"onPreviewZoomEnd($event)\"\n (onInit)=\"previewMapInit($event)\"\n ></c8y-map>\n</div>\n" }]
|
|
205
224
|
}], ctorParameters: () => [{ type: i1.MapService }, { type: i2.AlertService }, { type: i3.TranslateService }, { type: i8.Observable, decorators: [{
|
|
206
225
|
type: Inject,
|
|
207
226
|
args: [MAP_DEFAULT_CONFIG]
|
|
@@ -211,4 +230,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
|
|
|
211
230
|
type: ViewChild,
|
|
212
231
|
args: [MapComponent]
|
|
213
232
|
}] } });
|
|
214
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFwLXdpZGdldC1jb25maWcuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vd2lkZ2V0cy9pbXBsZW1lbnRhdGlvbnMvbWFwL21hcC13aWRnZXQtY29uZmlnLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3dpZGdldHMvaW1wbGVtZW50YXRpb25zL21hcC9tYXAtd2lkZ2V0LWNvbmZpZy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULE1BQU0sRUFDTixLQUFLLEVBS0wsU0FBUyxFQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxZQUFZLElBQUksY0FBYyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDakUsT0FBTyxFQUFFLFdBQVcsSUFBSSxhQUFhLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM5RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDMUQsT0FBTyxFQUNMLFlBQVksRUFDWixhQUFhLEVBQ2IsWUFBWSxFQUNaLFdBQVcsRUFDWCxPQUFPLEVBQ1IsTUFBTSxxQkFBcUIsQ0FBQztBQUU3QixPQUFPLEVBRUwsa0JBQWtCLEVBQ2xCLFlBQVksRUFDWixTQUFTLEVBQ1QsVUFBVSxFQUVYLE1BQU0seUJBQXlCLENBQUM7QUFDakMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFFdkQsT0FBTyxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDM0MsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRTNDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQzs7Ozs7Ozs7OztBQWtCdEQsTUFBTSxPQUFP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cnQge1xuICBDb21wb25lbnQsXG4gIEluamVjdCxcbiAgSW5wdXQsXG4gIE9uQ2hhbmdlcyxcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG4gIFNpbXBsZUNoYW5nZXMsXG4gIFZpZXdDaGlsZFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSBhcyBOZ0NvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBGb3Jtc01vZHVsZSBhcyBOZ0Zvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgQ29udHJvbENvbnRhaW5lciwgTmdGb3JtIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHtcbiAgQWxlcnRTZXJ2aWNlLFxuICBBc3NldExpbmtQaXBlLFxuICBDb21tb25Nb2R1bGUsXG4gIEZvcm1zTW9kdWxlLFxuICBnZXR0ZXh0XG59IGZyb20gJ0BjOHkvbmd4LWNvbXBvbmVudHMnO1xuaW1wb3J0IHR5cGUgeyBNYXBEZWZhdWx0Q29uZmlnIH0gZnJvbSAnQGM4eS9vcHRpb25zJztcbmltcG9ydCB7XG4gIENsdXN0ZXJNYXBDb25maWcsXG4gIE1BUF9ERUZBVUxUX0NPTkZJRyxcbiAgTWFwQ29tcG9uZW50LFxuICBNYXBNb2R1bGUsXG4gIE1hcFNlcnZpY2UsXG4gIFBvc2l0aW9uTWFuYWdlZE9iamVjdFxufSBmcm9tICdAYzh5L25neC1jb21wb25lbnRzL21hcCc7XG5pbXBvcnQgeyBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQgdHlwZSBMIGZyb20gJ2xlYWZsZXQnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgTWFwV2lkZ2V0Q29uZmlnLCBNYXBSZWZyZXNoT3B0aW9uIH0gZnJvbSAnLi9tYXAtd2lkZ2V0Lm1vZGVsJztcbmltcG9ydCB7IEljb25TZWxlY3Rvck1vZHVsZSB9IGZyb20gJ0BjOHkvbmd4LWNvbXBvbmVudHMvaWNvbi1zZWxlY3Rvcic7XG5pbXBvcnQgeyBUb29sdGlwTW9kdWxlIH0gZnJvbSAnbmd4LWJvb3RzdHJhcC90b29sdGlwJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYzh5LW1hcC13aWRnZXQtY29uZmlnJyxcbiAgdGVtcGxhdGVVcmw6ICcuL21hcC13aWRnZXQtY29uZmlnLmNvbXBvbmVudC5odG1sJyxcbiAgdmlld1Byb3ZpZGVyczogW3sgcHJvdmlkZTogQ29udHJvbENvbnRhaW5lciwgdXNlRXhpc3Rpbmc6IE5nRm9ybSB9XSxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIE5nQ29tbW9uTW9kdWxlLFxuICAgIE5nRm9ybXNNb2R1bGUsXG4gICAgQ29tbW9uTW9kdWxlLFxuICAgIEZvcm1zTW9kdWxlLFxuICAgIEljb25TZWxlY3Rvck1vZHVsZSxcbiAgICBNYXBNb2R1bGUsXG4gICAgQXNzZXRMaW5rUGlwZSxcbiAgICBUb29sdGlwTW9kdWxlXG4gIF1cbn0pXG5leHBvcnQgY2xhc3MgTWFwV2lkZ2V0Q29uZmlnQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMsIE9uRGVzdHJveSB7XG4gIEBJbnB1dCgpIGNvbmZpZzogTWFwV2lkZ2V0Q29uZmlnID0ge1xuICAgIG1hcENvbmZpZzogdW5kZWZpbmVkXG4gIH07XG5cbiAgZm9ybUNvbmZpZzogQ2x1c3Rlck1hcENvbmZpZztcblxuICBjYW5BdXRvQ2VudGVyID0gdHJ1ZTtcbiAgaXNQb3NpdGlvbmVkRGV2aWNlID0gZmFsc2U7XG4gIGFzc2V0czogUG9zaXRpb25NYW5hZ2VkT2JqZWN0W107XG4gIHJlZnJlc2hPcHRpb246IE1hcFJlZnJlc2hPcHRpb24gPSAnbm9uZSc7XG5cbiAgcHJpdmF0ZSBkZXN0cm95ZWQkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcbiAgcHJpdmF0ZSBsZWFmbGV0OiB0eXBlb2YgTDtcbiAgcHJpdmF0ZSBjZW50ZXJJY29uOiBMLk1hcmtlcjtcbiAgLy8gSlMgcHJlY2lzaW9uIGZvciBmbG9hdGluZyBwb2ludCBudW1iZXIgaXMgMTUgZm9yIDY0LWJpdCBhbmQgYmVjYXVzZSBvZiB0aGlzIHByb3ZpZGVkIHRvIGxlYWZsZXQgYXJlIHJlY2FsY3VsYXRlZFxuICAvLyB0byB2YWx1ZXMgYWxtb3N0LWxpa2UgcHJvdmlkZWQgKGUuZy4gMCBpcyByZWNhbGN1bGF0ZWQgdG8gMS40NmUtMTQ7IGZvciAxODAgaXQncyAxODAuMDAwMDAwMDAwMDAwMDMpLlxuICAvLyBUbyBlbnN1cmUgcHJvdmlkZWQgdmFsdWUgaGFzIG5vIGZsb2F0aW5nIHBvaW50IGVycm9yLCBudW1iZXIgbmVlZHMgdG8gYmUgcm91bmRlZCB0byBmaXhlZCBwb2ludCAxMy5cbiAgcHJpdmF0ZSByZWFkb25seSBGSVhFRF9QT0lOVF9ESUdJVFMgPSAxMztcblxuICBAVmlld0NoaWxkKE1hcENvbXBvbmVudClcbiAgcHJldmlld01hcDogTWFwQ29tcG9uZW50O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgbWFwU2VydmljZTogTWFwU2VydmljZSxcbiAgICBwcml2YXRlIGFsZXJ0U2VydmljZTogQWxlcnRTZXJ2aWNlLFxuICAgIHByaXZhdGUgdHJhbnNsYXRlU2VydmljZTogVHJhbnNsYXRlU2VydmljZSxcbiAgICBASW5qZWN0KE1BUF9ERUZBVUxUX0NPTkZJRykgcHJpdmF0ZSBkZWZhdWx0TWFwQ29uZmlnOiBPYnNlcnZhYmxlPE1hcERlZmF1bHRDb25maWc+XG4gICkge31cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmRlc3Ryb3llZCQubmV4dCgpO1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5kZWZhdWx0TWFwQ29uZmlnLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveWVkJCkpLnN1YnNjcmliZShkZWZhdWx0Q29uZmlnID0+IHtcbiAgICAgIHRoaXMuZm9ybUNvbmZpZyA9IHtcbiAgICAgICAgem9vbUxldmVsOiBkZWZhdWx0Q29uZmlnLnpvb21MZXZlbCxcbiAgICAgICAgY2VudGVyOiBkZWZhdWx0Q29uZmlnLmNlbnRlclxuICAgICAgfTtcbiAgICAgIHRoaXMuaW5pdEZvcm0oKTtcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIGluaXRGb3JtKCkge1xuICAgIGlmICghdGhpcy5jb25maWcubWFwQ29uZmlnKSB7XG4gICAgICB0aGlzLmNvbmZpZy5tYXBDb25maWcgPSB0aGlzLmZvcm1Db25maWc7XG4gICAgfVxuICAgIHRoaXMuZm9ybUNvbmZpZyA9IHtcbiAgICAgIC4uLnRoaXMuZm9ybUNvbmZpZyxcbiAgICAgIC4uLnRoaXMuY29uZmlnLm1hcENvbmZpZyxcbiAgICAgIGRpc2FibGVQYW46IGZhbHNlXG4gICAgfTtcbiAgICBhd2FpdCB0aGlzLnVwZGF0ZUFzc2V0KCk7XG4gIH1cblxuICBhc3luYyBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XG4gICAgaWYgKFxuICAgICAgY2hhbmdlcy5jb25maWcuY3VycmVudFZhbHVlICE9PSBjaGFuZ2VzLmNvbmZpZy5wcmV2aW91c1ZhbHVlICYmXG4gICAgICAhY2hhbmdlcy5jb25maWcuZmlyc3RDaGFuZ2VcbiAgICApIHtcbiAgICAgIGF3YWl0IHRoaXMudXBkYXRlQXNzZXQoKTtcbiAgICB9XG4gIH1cblxuICBwcmV2aWV3TWFwSW5pdChsZWFmbGV0OiB0eXBlb2YgTCk6IHZvaWQge1xuICAgIHRoaXMubGVhZmxldCA9IGxlYWZsZXQ7XG4gICAgdGhpcy5hZGRDZW50ZXJJY29uKHRoaXMuZm9ybUNvbmZpZy5jZW50ZXJbMF0sIHRoaXMuZm9ybUNvbmZpZy5jZW50ZXJbMV0pO1xuICB9XG5cbiAgb25CZWZvcmVTYXZlKCkge1xuICAgIHRoaXMuY29uZmlnLm1hcENvbmZpZyA9IHRoaXMuZm9ybUNvbmZpZztcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHpvb21MZXZlbENoYW5nZWQoKSB7XG4gICAgdGhpcy5jb25maWcubWFwQ29uZmlnID0ge1xuICAgICAgLi4udGhpcy5jb25maWcubWFwQ29uZmlnLFxuICAgICAgem9vbUxldmVsOiB0aGlzLmZvcm1Db25maWcuem9vbUxldmVsXG4gICAgfTtcbiAgfVxuXG4gIGNoYW5nZUNlbnRlcigpIHtcbiAgICBpZiAodGhpcy5jZW50ZXJJY29uKSB7XG4gICAgICB0aGlzLmNlbnRlckljb24ucmVtb3ZlKCk7XG4gICAgfVxuICAgIHRoaXMuY29uZmlnLm1hcENvbmZpZyA9IHsgLi4udGhpcy5mb3JtQ29uZmlnLCBjZW50ZXI6IFsuLi50aGlzLmZvcm1Db25maWcuY2VudGVyXSB9O1xuICAgIHRoaXMuYWRkQ2VudGVySWNvbih0aGlzLmZvcm1Db25maWcuY2VudGVyWzBdLCB0aGlzLmZvcm1Db25maWcuY2VudGVyWzFdKTtcbiAgfVxuXG4gIGNoYW5nZUNlbnRlck9uRW50ZXJLZXkoZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIHRoaXMuY2hhbmdlQ2VudGVyKCk7XG4gIH1cblxuICBvblByZXZpZXdab29tU3RhcnQoKSB7XG4gICAgdGhpcy5jZW50ZXJJY29uLnJlbW92ZSgpO1xuICB9XG5cbiAgb25QcmV2aWV3Wm9vbUVuZChldmVudDogTC5MZWFmbGV0RXZlbnQpIHtcbiAgICB0aGlzLmZvcm1Db25maWcuem9vbUxldmVsID0gTWF0aC5mbG9vcihldmVudC50YXJnZXQuZ2V0Wm9vbSgpKTtcbiAgfVxuXG4gIG9uUHJldmlld01hcE1vdmUoZXZlbnQ6IEwuTGVhZmxldEV2ZW50KSB7XG4gICAgaWYgKHRoaXMuY2VudGVySWNvbikge1xuICAgICAgdGhpcy5jZW50ZXJJY29uLnJlbW92ZSgpO1xuICAgIH1cbiAgICBjb25zdCB7IGxhdCwgbG5nIH0gPSBldmVudC50YXJnZXQuZ2V0Q2VudGVyKCk7XG4gICAgY29uc3QgZml4ZWRMYXQgPSArbGF0LnRvRml4ZWQodGhpcy5GSVhFRF9QT0lOVF9ESUdJVFMpO1xuICAgIGNvbnN0IGZpeGVkTG5nID0gK2xuZy50b0ZpeGVkKHRoaXMuRklYRURfUE9JTlRfRElHSVRTKTtcbiAgICB0aGlzLmFkZENlbnRlckljb24oZml4ZWRMYXQsIGZpeGVkTG5nKTtcbiAgICB0aGlzLmZvcm1Db25maWcuY2VudGVyID0gW2ZpeGVkTGF0LCBmaXhlZExuZ107XG4gIH1cblxuICB1c2VPd25Qb3NpdGlvbigpIHtcbiAgICBuYXZpZ2F0b3IuZ2VvbG9jYXRpb24uZ2V0Q3VycmVudFBvc2l0aW9uKCh7IGNvb3JkcyB9KSA9PiB7XG4gICAgICB0aGlzLmZvcm1Db25maWcuY2VudGVyID0gW2Nvb3Jkcy5sYXRpdHVkZSwgY29vcmRzLmxvbmdpdHVkZV07XG4gICAgICB0aGlzLmNoYW5nZUNlbnRlcigpO1xuICAgIH0pO1xuICB9XG5cbiAgY2VudGVyVG9Bc3NldCgpIHtcbiAgICB0aGlzLmZvcm1Db25maWcuY2VudGVyID0gW1xuICAgICAgdGhpcy5jb25maWcuZGV2aWNlLmM4eV9Qb3NpdGlvbi5sYXQsXG4gICAgICB0aGlzLmNvbmZpZy5kZXZpY2UuYzh5X1Bvc2l0aW9uLmxuZ1xuICAgIF07XG4gICAgdGhpcy5jaGFuZ2VDZW50ZXIoKTtcbiAgfVxuXG4gIHVwZGF0ZVJlZnJlc2hPcHRpb24oKSB7XG4gICAgdGhpcy5mb3JtQ29uZmlnLnJlYWx0aW1lID0gdGhpcy5yZWZyZXNoT3B0aW9uID09PSAncmVhbHRpbWUnO1xuICAgIHRoaXMuY29uZmlnLndpZGdldEluc3RhbmNlR2xvYmFsQXV0b1JlZnJlc2hDb250ZXh0ID1cbiAgICAgIHRoaXMucmVmcmVzaE9wdGlvbiA9PT0gJ2Rhc2hib2FyZC1hdXRvLXJlZnJlc2gtY29udGV4dCc7XG4gICAgdGhpcy5mb3JtQ29uZmlnLndpZGdldEluc3RhbmNlR2xvYmFsQXV0b1JlZnJlc2hDb250ZXh0ID1cbiAgICAgIHRoaXMucmVmcmVzaE9wdGlvbiA9PT0gJ2Rhc2hib2FyZC1hdXRvLXJlZnJlc2gtY29udGV4dCc7XG4gICAgaWYgKHRoaXMucmVmcmVzaE9wdGlvbiA9PT0gJ2ludGVydmFsJykge1xuICAgICAgdGhpcy5mb3JtQ29uZmlnLnJlZnJlc2hJbnRlcnZhbCA/Pz0gNTAwMDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5mb3JtQ29uZmlnLnJlZnJlc2hJbnRlcnZhbCA9IG51bGw7XG4gICAgfVxuICAgIGlmICghdGhpcy5mb3JtQ29uZmlnLnJlYWx0aW1lKSB7XG4gICAgICB0aGlzLmZvcm1Db25maWcuZm9sbG93ID0gZmFsc2U7XG4gICAgfVxuICAgIHRoaXMuY29uZmlnLndpZGdldEluc3RhbmNlR2xvYmFsVGltZUNvbnRleHQgPVxuICAgICAgdGhpcy5yZWZyZXNoT3B0aW9uID09PSAnZGFzaGJvYXJkLXJlYWx0aW1lLWNvbnRleHQnO1xuICAgIGlmICh0aGlzLmNvbmZpZy53aWRnZXRJbnN0YW5jZUdsb2JhbFRpbWVDb250ZXh0KSB7XG4gICAgICB0aGlzLmZvcm1Db25maWcucmVhbHRpbWUgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIHNlbGVjdEljb24oaWNvbjogc3RyaW5nKSB7XG4gICAgdGhpcy5mb3JtQ29uZmlnLmljb24gPSBpY29uO1xuICAgIHRoaXMuY29uZmlnLm1hcENvbmZpZy5pY29uID0gaWNvbjtcbiAgICB0aGlzLnByZXZpZXdNYXAucmVmcmVzaE1hcmtlcnMoKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgdXBkYXRlQXNzZXQoKSB7XG4gICAgdGhpcy5jYW5BdXRvQ2VudGVyID0gdGhpcy5tYXBTZXJ2aWNlLmhhc1Bvc2l0aW9uKHRoaXMuY29uZmlnLmRldmljZSk7XG4gICAgdGhpcy5pc1Bvc2l0aW9uZWREZXZpY2UgPSB0aGlzLm1hcFNlcnZpY2UuaXNQb3NpdGlvbmVkRGV2aWNlKHRoaXMuY29uZmlnLmRldmljZSk7XG4gICAgdGhpcy5yZWZyZXNoT3B0aW9uID0gdGhpcy5nZXRSZWZyZXNoT3B0aW9uKCk7XG4gICAgdGhpcy51cGRhdGVSZWZyZXNoT3B0aW9uKCk7XG5cbiAgICBjb25zdCB7IGRhdGEsIHBhZ2luZyB9ID0gYXdhaXQgdGhpcy5tYXBTZXJ2aWNlLmdldEFsbFBvc2l0aW9uTU9zKHRoaXMuY29uZmlnLmRldmljZSk7XG4gICAgdGhpcy5hc3NldHMgPSBkYXRhO1xuICAgIGlmIChwYWdpbmcudG90YWxQYWdlcyA+IDEpIHtcbiAgICAgIHRoaXMuYWxlcnRTZXJ2aWNlLmRhbmdlcihcbiAgICAgICAgZ2V0dGV4dChcbiAgICAgICAgICAnSXQgbWlnaHQgYmUgcG9zc2libGUgdGhhdCBhc3NldHMgYXJlIG5vdCBzaG93biBpbiB0aGUgcHJldmlldywgYXMgdGhlIGN1cnJlbnQgc2VsZWN0aW9uIGhhcyBtb3JlIHRoYW4gNTAwIGFzc2V0cyBhbmQgdGhlIHByZXZpZXcgb25seSBzdXBwb3J0cyBhIG1heGltdW0gb2YgNTAwIGFzc2V0cy4nXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRSZWZyZXNoT3B0aW9uKCk6IE1hcFJlZnJlc2hPcHRpb24ge1xuICAgIGxldCBvcHRpb246IE1hcFJlZnJlc2hPcHRpb24gPSAnbm9uZSc7XG4gICAgaWYgKHRoaXMuZm9ybUNvbmZpZy5yZWFsdGltZSkge1xuICAgICAgb3B0aW9uID0gJ3JlYWx0aW1lJztcbiAgICB9IGVsc2UgaWYgKHRoaXMuZm9ybUNvbmZpZy5yZWZyZXNoSW50ZXJ2YWwpIHtcbiAgICAgIG9wdGlvbiA9ICdpbnRlcnZhbCc7XG4gICAgfSBlbHNlIGlmICh0aGlzLmNvbmZpZy53aWRnZXRJbnN0YW5jZUdsb2JhbFRpbWVDb250ZXh0KSB7XG4gICAgICBvcHRpb24gPSAnZGFzaGJvYXJkLXJlYWx0aW1lLWNvbnRleHQnO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICB0aGlzLmNvbmZpZy53aWRnZXRJbnN0YW5jZUdsb2JhbEF1dG9SZWZyZXNoQ29udGV4dCB8fFxuICAgICAgdGhpcy5mb3JtQ29uZmlnLndpZGdldEluc3RhbmNlR2xvYmFsQXV0b1JlZnJlc2hDb250ZXh0XG4gICAgKSB7XG4gICAgICBvcHRpb24gPSAnZGFzaGJvYXJkLWF1dG8tcmVmcmVzaC1jb250ZXh0JztcbiAgICB9XG4gICAgY29uc3QgaXNOb3RBbGxvd2VkT3B0aW9uID1cbiAgICAgICghdGhpcy5pc1Bvc2l0aW9uZWREZXZpY2UgJiYgb3B0aW9uID09PSAnZGFzaGJvYXJkLXJlYWx0aW1lLWNvbnRleHQnKSB8fFxuICAgICAgKCF0aGlzLmlzUG9zaXRpb25lZERldmljZSAmJiBvcHRpb24gPT09ICdyZWFsdGltZScpIHx8XG4gICAgICAodGhpcy5pc1Bvc2l0aW9uZWREZXZpY2UgJiYgb3B0aW9uID09PSAnaW50ZXJ2YWwnKTtcbiAgICBvcHRpb24gPSBpc05vdEFsbG93ZWRPcHRpb24gPyAnbm9uZScgOiBvcHRpb247XG4gICAgcmV0dXJuIG9wdGlvbjtcbiAgfVxuXG4gIHByaXZhdGUgYWRkQ2VudGVySWNvbihsYXQ6IG51bWJlciwgbG5nOiBudW1iZXIpIHtcbiAgICBjb25zdCB0aXRsZVRleHQgPSB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudChnZXR0ZXh0KCdNYXAgY2VudGVyJykpO1xuICAgIGNvbnN0IGljb24gPSB0aGlzLmxlYWZsZXQuZGl2SWNvbih7XG4gICAgICBodG1sOiBgPGkgc3R5bGU9XCJwb2ludGVyLWV2ZW50czogbm9uZVwiIGNsYXNzPVwiYzh5LW1hcC1tYXJrZXItaWNvbiB0ZXh0LW11dGVkIGRsdC1jOHktaWNvbi10YXJnZXQgaWNvbi0yeFwiIHRpdGxlPVwiJHt0aXRsZVRleHR9XCIgLz5gXG4gICAgfSk7XG4gICAgdGhpcy5jZW50ZXJJY29uID0gdGhpcy5sZWFmbGV0Lm1hcmtlcihbbGF0LCBsbmddLCB7XG4gICAgICBpY29uXG4gICAgfSk7XG4gICAgdGhpcy5wcmV2aWV3TWFwLmFkZE1hcmtlclRvTWFwKHRoaXMuY2VudGVySWNvbik7XG4gIH1cbn1cbiIsIjxkaXZcbiAgY2xhc3M9XCJyb3cgcC10LTE2XCJcbiAgKm5nSWY9XCJmb3JtQ29uZmlnXCJcbj5cbiAgPGRpdiBjbGFzcz1cImNvbC14cy0yXCI+XG4gICAgPGM4eS1mb3JtLWdyb3VwIGNsYXNzPVwibS1iLTAgdGV4dC1jZW50ZXIgZm9ybS1ncm91cC1zbVwiPlxuICAgICAgPGxhYmVsIHRyYW5zbGF0ZT5NYXJrZXIgaWNvbjwvbGFiZWw+XG4gICAgICA8Yzh5LWljb24tc2VsZWN0b3Itd3JhcHBlclxuICAgICAgICBbY2FuUmVtb3ZlSWNvbl09XCJ0cnVlXCJcbiAgICAgICAgW3NlbGVjdGVkSWNvbl09XCJmb3JtQ29uZmlnLmljb25cIlxuICAgICAgICAob25TZWxlY3QpPVwic2VsZWN0SWNvbigkZXZlbnQpXCJcbiAgICAgID48L2M4eS1pY29uLXNlbGVjdG9yLXdyYXBwZXI+XG4gICAgPC9jOHktZm9ybS1ncm91cD5cbiAgPC9kaXY+XG4gIDxkaXYgY2xhc3M9XCJjb2wteHMtMTBcIj5cbiAgICA8ZGl2IGNsYXNzPVwicm93IHRpZ2h0LWdyaWQgc2VwYXJhdG9yLWJvdHRvbVwiPlxuICAgICAgPGRpdiBjbGFzcz1cImNvbC14cy00XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIGZvcm0tZ3JvdXAtc21cIj5cbiAgICAgICAgICA8bGFiZWwgdHJhbnNsYXRlPlpvb20gbGV2ZWw8L2xhYmVsPlxuICAgICAgICAgIDxjOHktcmFuZ2VcbiAgICAgICAgICAgIGNsYXNzPVwibGFiZWwtYm90dG9tXCJcbiAgICAgICAgICAgIG5hbWU9XCJ6b29tTGV2ZWxcIlxuICAgICAgICAgICAgI3JhbmdlXG4gICAgICAgICAgICBbKG5nTW9kZWwpXT1cImZvcm1Db25maWcuem9vbUxldmVsXCJcbiAgICAgICAgICAgIChjaGFuZ2UpPVwiem9vbUxldmVsQ2hhbmdlZCgpXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgdHlwZT1cInJhbmdlXCJcbiAgICAgICAgICAgICAgbWluPVwiMlwiXG4gICAgICAgICAgICAgIG1heD1cIjE4XCJcbiAgICAgICAgICAgICAgc3RlcD1cIjFcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICA8L2M4eS1yYW5nZT5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjb2wteHMtOFwiPlxuICAgICAgICA8Yzh5LWZvcm0tZ3JvdXAgY2xhc3M9XCJmb3JtLWdyb3VwLXNtIG0tYi04XCI+XG4gICAgICAgICAgPGxhYmVsIHRyYW5zbGF0ZT5DZW50ZXIgYm91bmQ8L2xhYmVsPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1ncm91cCBpbnB1dC1ncm91cC1zbVwiPlxuICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sXCJcbiAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJ7eyAnbGF0LmBsYXRpdHVkZWAnIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICAgICAgbmFtZT1cImNlbnRlckxhdFwiXG4gICAgICAgICAgICAgIHR5cGU9XCJudW1iZXJcIlxuICAgICAgICAgICAgICByZXF1aXJlZFxuICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImZvcm1Db25maWcuY2VudGVyWzBdXCJcbiAgICAgICAgICAgICAgKGNoYW5nZSk9XCJjaGFuZ2VDZW50ZXIoKVwiXG4gICAgICAgICAgICAgIChrZXlkb3duLmVudGVyKT1cImNoYW5nZUNlbnRlck9uRW50ZXJLZXkoJGV2ZW50KVwiXG4gICAgICAgICAgICAgIG1pbj1cIi05MFwiXG4gICAgICAgICAgICAgIG1heD1cIjkwXCJcbiAgICAgICAgICAgICAgc3RlcD1cIjAuMVwiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sXCJcbiAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJ7eyAnbG5nLmBsb25naXR1ZGVgJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICAgIG5hbWU9XCJjZW50ZXJMbmdcIlxuICAgICAgICAgICAgICB0eXBlPVwibnVtYmVyXCJcbiAgICAgICAgICAgICAgcmVxdWlyZWRcbiAgICAgICAgICAgICAgbWluPVwiLTE4MFwiXG4gICAgICAgICAgICAgIG1heD1cIjE4MFwiXG4gICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiZm9ybUNvbmZpZy5jZW50ZXJbMV1cIlxuICAgICAgICAgICAgICAoY2hhbmdlKT1cImNoYW5nZUNlbnRlcigpXCJcbiAgICAgICAgICAgICAgKGtleWRvd24uZW50ZXIpPVwiY2hhbmdlQ2VudGVyT25FbnRlcktleSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgbWluPVwiLTE4MFwiXG4gICAgICAgICAgICAgIG1heD1cIjE4MFwiXG4gICAgICAgICAgICAgIHN0ZXA9XCIwLjFcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1ncm91cC1idG5cIj5cbiAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1kZWZhdWx0XCJcbiAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidVc2UgeW91ciBsb2NhdGlvbicgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgIFt0b29sdGlwXT1cIidVc2UgeW91ciBsb2NhdGlvbicgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgIHBsYWNlbWVudD1cInRvcFwiXG4gICAgICAgICAgICAgICAgY29udGFpbmVyPVwiYm9keVwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cInVzZU93blBvc2l0aW9uKClcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGlcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiaWNvbi0xNFwiXG4gICAgICAgICAgICAgICAgICBjOHlJY29uPVwibG9jYXRpb24tYXJyb3dcIlxuICAgICAgICAgICAgICAgID48L2k+XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgIGNsYXNzPVwiaW5wdXQtZ3JvdXAtYnRuXCJcbiAgICAgICAgICAgICAgKm5nSWY9XCJjYW5BdXRvQ2VudGVyXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1kZWZhdWx0XCJcbiAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidVc2Ugc2VsZWN0ZWQgYXNzZXQgbG9jYXRpb24nIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICBbdG9vbHRpcF09XCInVXNlIHNlbGVjdGVkIGFzc2V0IGxvY2F0aW9uJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgcGxhY2VtZW50PVwidG9wXCJcbiAgICAgICAgICAgICAgICBjb250YWluZXI9XCJib2R5XCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiY2VudGVyVG9Bc3NldCgpXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImljb24tMTRcIlxuICAgICAgICAgICAgICAgICAgYzh5SWNvbj1cImxvY2F0aW9uXCJcbiAgICAgICAgICAgICAgICA+PC9pPlxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxjOHktbWVzc2FnZXNcbiAgICAgICAgICAgIFtoZWxwTWVzc2FnZV09XCInRHJhZyB0aGUgbWFwIHRvIHRoZSBkZXNpcmVkIHBvc2l0aW9uJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgPjwvYzh5LW1lc3NhZ2VzPlxuICAgICAgICA8L2M4eS1mb3JtLWdyb3VwPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IGNsYXNzPVwicm93IHRpZ2h0LWdyaWQgcC10LTggZC1mbGV4IGEtaS1jZW50ZXJcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjb2wteHMtNlwiPlxuICAgICAgICA8Yzh5LWZvcm0tZ3JvdXAgY2xhc3M9XCJtLWItMCBmb3JtLWdyb3VwLXNtXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImM4eS1zZWxlY3Qtd3JhcHBlclwiPlxuICAgICAgICAgICAgPHNlbGVjdFxuICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbFwiXG4gICAgICAgICAgICAgIHRpdGxlPVwie3sgJ1JlZnJlc2ggb3B0aW9uc2BvcHRpb25zIGZvciByZWZyZXNoaW5nIGEgdmlld2AnIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICAgICAgaWQ9XCJzZWxlY3RFeGFtcGxlXCJcbiAgICAgICAgICAgICAgbmFtZT1cInJlZnJlc2hTZWxlY3Rpb25cIlxuICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInJlZnJlc2hPcHRpb25cIlxuICAgICAgICAgICAgICAoY2hhbmdlKT1cInVwZGF0ZVJlZnJlc2hPcHRpb24oKVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxvcHRpb25cbiAgICAgICAgICAgICAgICBbdGl0bGVdPVwiJ09ubHkgcmVmcmVzaGluZyBvbiBpbnRlcmFjdGlvbicgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgIHZhbHVlPVwibm9uZVwiXG4gICAgICAgICAgICAgICAgdHJhbnNsYXRlXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICBObyBhdXRvbWF0aWMgcmVmcmVzaFxuICAgICAgICAgICAgICA8L29wdGlvbj5cbiAgICAgICAgICAgICAgPG9wdGlvblxuICAgICAgICAgICAgICAgIFt0aXRsZV09XCInUmVmcmVzaGluZyBhZnRlciB0aGUgZ2l2ZW4gaW50ZXJ2YWwgYW5kIG9uIGludGVyYWN0aW9uJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgdmFsdWU9XCJpbnRlcnZhbFwiXG4gICAgICAgICAgICAgICAgKm5nSWY9XCIhaXNQb3NpdGlvbmVkRGV2aWNlXCJcbiAgICAgICAgICAgICAgICB0cmFuc2xhdGVcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIFVzZSByZWZyZXNoIGludGVydmFsXG4gICAgICAgICAgICAgIDwvb3B0aW9uPlxuICAgICAgICAgICAgICA8b3B0aW9uXG4gICAgICAgICAgICAgICAgW3RpdGxlXT1cIlxuICAgICAgICAgICAgICAgICAgJ1JlZnJlc2hpbmcgYWZ0ZXIgdGhlIGdpdmVuIGludGVydmFsIGFuZCBvbiBpbnRlcmFjdGlvbiwgc3luY2hyb25pemVkIGdsb2JhbGx5J1xuICAgICAgICAgICAgICAgICAgICB8IHRyYW5zbGF0ZVxuICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgdmFsdWU9XCJkYXNoYm9hcmQtYXV0by1yZWZyZXNoLWNvbnRleHRcIlxuICAgICAgICAgICAgICAgICpuZ0lmPVwiIWlzUG9zaXRpb25lZERldmljZVwiXG4gICAgICAgICAgICAgICAgdHJhbnNsYXRlXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICBVc2UgZ2xvYmFsIHJlZnJlc2ggaW50ZXJ2YWxcbiAgICAgICAgICAgICAgPC9vcHRpb24+XG4gICAgICAgICAgICAgIDxvcHRpb25cbiAgICAgICAgICAgICAgICBbdGl0bGVdPVwiJ0xpdmUgdXBkYXRpbmcgb24gZWFjaCBwb3NpdGlvbiBjaGFuZ2UnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICB2YWx1ZT1cInJlYWx0aW1lXCJcbiAgICAgICAgICAgICAgICAqbmdJZj1cImlzUG9zaXRpb25lZERldmljZVwiXG4gICAgICAgICAgICAgICAgdHJhbnNsYXRlXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICBSZWFsdGltZVxuICAgICAgICAgICAgICA8L29wdGlvbj5cbiAgICAgICAgICAgICAgPG9wdGlvblxuICAgICAgICAgICAgICAgIFt0aXRsZV09XCInQmluZCB3aWRnZXQgdG8gZGFzaGJvYXJkIHJlYWx0aW1lIGNvbnRleHQnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICB2YWx1ZT1cImRhc2hib2FyZC1yZWFsdGltZS1jb250ZXh0XCJcbiAgICAgICAgICAgICAgICAqbmdJZj1cImlzUG9zaXRpb25lZERldmljZVwiXG4gICAgICAgICAgICAgICAgdHJhbnNsYXRlXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICBEYXNoYm9hcmQgcmVhbHRpbWUgY29udGV4dFxuICAgICAgICAgICAgICA8L29wdGlvbj5cbiAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2M4eS1mb3JtLWdyb3VwPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiY29sLXhzLThcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgZm9ybS1ncm91cC1zbSBtLWItMFwiPlxuICAgICAgICAgIDxjOHktcmFuZ2VcbiAgICAgICAgICAgIGNsYXNzPVwibGFiZWwtYm90dG9tXCJcbiAgICAgICAgICAgIG5hbWU9XCJyZWZyZXNoSW50ZXJ2YWxcIlxuICAgICAgICAgICAgI2ludGVydmFsUmFuZ2VcbiAgICAgICAgICAgICpuZ0lmPVwicmVmcmVzaE9wdGlvbiA9PT0gJ2ludGVydmFsJ1wiXG4gICAgICAgICAgICBbKG5nTW9kZWwpXT1cImZvcm1Db25maWcucmVmcmVzaEludGVydmFsXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgI2M4eVJhbmdlVmFsdWU+XG4gICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgIFt0cmFuc2xhdGVQYXJhbXNdPVwieyBpbnRlcnZhbEluU2Vjb25kczogaW50ZXJ2YWxSYW5nZS52YWx1ZSAqIDAuMDAxIH1cIlxuICAgICAgICAgICAgICAgICAgdHJhbnNsYXRlXG4gICAgICAgICAgICAgICAgICBuZ05vbkJpbmRhYmxlXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAge3sgaW50ZXJ2YWxJblNlY29uZHMgfX0gc1xuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgIHR5cGU9XCJyYW5nZVwiXG4gICAgICAgICAgICAgIG1pbj1cIjUwMDBcIlxuICAgICAgICAgICAgICBtYXg9XCIxMDAwMDBcIlxuICAgICAgICAgICAgICBzdGVwPVwiMTAwMFwiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgIDwvYzh5LXJhbmdlPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGxhYmVsXG4gICAgICAgICAgY2xhc3M9XCJjOHktc3dpdGNoIGM4eS1zd2l0Y2gtLWlubGluZVwiXG4gICAgICAgICAgKm5nSWY9XCJyZWZyZXNoT3B0aW9uID09PSAncmVhbHRpbWUnIHx8IHJlZnJlc2hPcHRpb24gPT09ICdkYXNoYm9hcmQtcmVhbHRpbWUtY29udGV4dCdcIlxuICAgICAgICA+XG4gICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICBuYW1lPVwiZm9sbG93XCJcbiAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgICAgICBbKG5nTW9kZWwpXT1cImZvcm1Db25maWcuZm9sbG93XCJcbiAgICAgICAgICAvPlxuICAgICAgICAgIDxzcGFuPjwvc3Bhbj5cbiAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgY2xhc3M9XCJ0ZXh0LTEyXCJcbiAgICAgICAgICAgIHRyYW5zbGF0ZVxuICAgICAgICAgID5cbiAgICAgICAgICAgIEZvbGxvdyBzZWxlY3RlZFxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPC9sYWJlbD5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PlxuXG48ZGl2XG4gIGNsYXNzPVwicC10LTE2IHAtYi0xNlwiXG4gIHN0eWxlPVwid2lkdGg6IDEwMCU7IGhlaWdodDogMjQwcHhcIlxuPlxuICA8Yzh5LW1hcFxuICAgICpuZ0lmPVwiY29uZmlnLm1hcENvbmZpZ1wiXG4gICAgW2Fzc2V0c109XCJhc3NldHNcIlxuICAgIFtjb25maWddPVwiY29uZmlnLm1hcENvbmZpZ1wiXG4gICAgKG9uTW92ZSk9XCJvblByZXZpZXdNYXBNb3ZlKCRldmVudClcIlxuICAgIChvblpvb21TdGFydCk9XCJvblByZXZpZXdab29tU3RhcnQoKVwiXG4gICAgKG9uWm9vbUVuZCk9XCJvblByZXZpZXdab29tRW5kKCRldmVudClcIlxuICAgIChvbkluaXQpPVwicHJldmlld01hcEluaXQoJGV2ZW50KVwiXG4gID48L2M4eS1tYXA+XG48L2Rpdj5cbiJdfQ==
|
|
233
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFwLXdpZGdldC1jb25maWcuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vd2lkZ2V0cy9pbXBsZW1lbnRhdGlvbnMvbWFwL21hcC13aWRnZXQtY29uZmlnLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3dpZGdldHMvaW1wbGVtZW50YXRpb25zL21hcC9tYXAtd2lkZ2V0LWNvbmZpZy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULE1BQU0sRUFDTixLQUFLLEVBS0wsU0FBUyxFQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxZQUFZLElBQUksY0FBYyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDakUsT0FBTyxFQUFFLFdBQVcsSUFBSSxhQUFhLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM5RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDMUQsT0FBTyxFQUNMLFlBQVksRUFDWixhQUFhLEVBQ2IsWUFBWSxFQUNaLFdBQVcsRUFDWCxPQUFPLEVBQ1IsTUFBTSxxQkFBcUIsQ0FBQztBQUU3QixPQUFPLEVBRUwsdUJBQXVCLEVBQ3ZCLGtCQUFrQixFQUNsQixZQUFZLEVBQ1osU0FBUyxFQUNULFVBQVUsRUFFWCxNQUFNLHlCQUF5QixDQUFDO0FBQ2pDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRXZELE9BQU8sRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN0RCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXBFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxhQUFhLEVB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YUFBYTt3QkFDYixhQUFhO3FCQUNkOzswQkE2QkUsTUFBTTsyQkFBQyxrQkFBa0I7eUNBMUJuQixNQUFNO3NCQUFkLEtBQUs7Z0JBb0JOLFVBQVU7c0JBRFQsU0FBUzt1QkFBQyxZQUFZIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBJbmplY3QsXG4gIElucHV0LFxuICBPbkNoYW5nZXMsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBTaW1wbGVDaGFuZ2VzLFxuICBWaWV3Q2hpbGRcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgYXMgTmdDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgRm9ybXNNb2R1bGUgYXMgTmdGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IENvbnRyb2xDb250YWluZXIsIE5nRm9ybSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7XG4gIEFsZXJ0U2VydmljZSxcbiAgQXNzZXRMaW5rUGlwZSxcbiAgQ29tbW9uTW9kdWxlLFxuICBGb3Jtc01vZHVsZSxcbiAgZ2V0dGV4dFxufSBmcm9tICdAYzh5L25neC1jb21wb25lbnRzJztcbmltcG9ydCB0eXBlIHsgTWFwRGVmYXVsdENvbmZpZyB9IGZyb20gJ0BjOHkvb3B0aW9ucyc7XG5pbXBvcnQge1xuICBDbHVzdGVyTWFwQ29uZmlnLFxuICBkZWZhdWx0Rml0Qm91bmRzT3B0aW9ucyxcbiAgTUFQX0RFRkFVTFRfQ09ORklHLFxuICBNYXBDb21wb25lbnQsXG4gIE1hcE1vZHVsZSxcbiAgTWFwU2VydmljZSxcbiAgUG9zaXRpb25NYW5hZ2VkT2JqZWN0XG59IGZyb20gJ0BjOHkvbmd4LWNvbXBvbmVudHMvbWFwJztcbmltcG9ydCB7IFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB0eXBlIEwgZnJvbSAnbGVhZmxldCc7XG5pbXBvcnQgeyBmcm9tRXZlbnQsIE9ic2VydmFibGUsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGNvbWJpbmVMYXRlc3RXaXRoLCB0YWtlLCB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBNYXBXaWRnZXRDb25maWcsIE1hcFJlZnJlc2hPcHRpb24gfSBmcm9tICcuL21hcC13aWRnZXQubW9kZWwnO1xuaW1wb3J0IHsgSWNvblNlbGVjdG9yTW9kdWxlIH0gZnJvbSAnQGM4eS9uZ3gtY29tcG9uZW50cy9pY29uLXNlbGVjdG9yJztcbmltcG9ydCB7IFRvb2x0aXBNb2R1bGUgfSBmcm9tICduZ3gtYm9vdHN0cmFwL3Rvb2x0aXAnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjOHktbWFwLXdpZGdldC1jb25maWcnLFxuICB0ZW1wbGF0ZVVybDogJy4vbWFwLXdpZGdldC1jb25maWcuY29tcG9uZW50Lmh0bWwnLFxuICB2aWV3UHJvdmlkZXJzOiBbeyBwcm92aWRlOiBDb250cm9sQ29udGFpbmVyLCB1c2VFeGlzdGluZzogTmdGb3JtIH1dLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXG4gICAgTmdDb21tb25Nb2R1bGUsXG4gICAgTmdGb3Jtc01vZHVsZSxcbiAgICBDb21tb25Nb2R1bGUsXG4gICAgRm9ybXNNb2R1bGUsXG4gICAgSWNvblNlbGVjdG9yTW9kdWxlLFxuICAgIE1hcE1vZHVsZSxcbiAgICBBc3NldExpbmtQaXBlLFxuICAgIFRvb2x0aXBNb2R1bGVcbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBNYXBXaWRnZXRDb25maWdDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcywgT25EZXN0cm95IHtcbiAgQElucHV0KCkgY29uZmlnOiBNYXBXaWRnZXRDb25maWcgPSB7XG4gICAgbWFwQ29uZmlnOiB1bmRlZmluZWRcbiAgfTtcblxuICBmb3JtQ29uZmlnOiBDbHVzdGVyTWFwQ29uZmlnO1xuXG4gIGNhbkF1dG9DZW50ZXIgPSB0cnVlO1xuICBpc1Bvc2l0aW9uZWREZXZpY2UgPSBmYWxzZTtcbiAgYXNzZXRzOiBQb3NpdGlvbk1hbmFnZWRPYmplY3RbXTtcbiAgcmVmcmVzaE9wdGlvbjogTWFwUmVmcmVzaE9wdGlvbiA9ICdub25lJztcblxuICBwcml2YXRlIGRlc3Ryb3llZCQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuICBwcml2YXRlIGxlYWZsZXQ6IHR5cGVvZiBMO1xuICBwcml2YXRlIGNlbnRlckljb246IEwuTWFya2VyO1xuICAvLyBKUyBwcmVjaXNpb24gZm9yIGZsb2F0aW5nIHBvaW50IG51bWJlciBpcyAxNSBmb3IgNjQtYml0IGFuZCBiZWNhdXNlIG9mIHRoaXMgcHJvdmlkZWQgdG8gbGVhZmxldCBhcmUgcmVjYWxjdWxhdGVkXG4gIC8vIHRvIHZhbHVlcyBhbG1vc3QtbGlrZSBwcm92aWRlZCAoZS5nLiAwIGlzIHJlY2FsY3VsYXRlZCB0byAxLjQ2ZS0xNDsgZm9yIDE4MCBpdCdzIDE4MC4wMDAwMDAwMDAwMDAwMykuXG4gIC8vIFRvIGVuc3VyZSBwcm92aWRlZCB2YWx1ZSBoYXMgbm8gZmxvYXRpbmcgcG9pbnQgZXJyb3IsIG51bWJlciBuZWVkcyB0byBiZSByb3VuZGVkIHRvIGZpeGVkIHBvaW50IDEzLlxuICBwcml2YXRlIHJlYWRvbmx5IEZJWEVEX1BPSU5UX0RJR0lUUyA9IDEzO1xuXG4gIEBWaWV3Q2hpbGQoTWFwQ29tcG9uZW50KVxuICBwcmV2aWV3TWFwOiBNYXBDb21wb25lbnQ7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBtYXBTZXJ2aWNlOiBNYXBTZXJ2aWNlLFxuICAgIHByaXZhdGUgYWxlcnRTZXJ2aWNlOiBBbGVydFNlcnZpY2UsXG4gICAgcHJpdmF0ZSB0cmFuc2xhdGVTZXJ2aWNlOiBUcmFuc2xhdGVTZXJ2aWNlLFxuICAgIEBJbmplY3QoTUFQX0RFRkFVTFRfQ09ORklHKSBwcml2YXRlIGRlZmF1bHRNYXBDb25maWc6IE9ic2VydmFibGU8TWFwRGVmYXVsdENvbmZpZz5cbiAgKSB7fVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuZGVzdHJveWVkJC5uZXh0KCk7XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLmRlZmF1bHRNYXBDb25maWcucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95ZWQkKSkuc3Vic2NyaWJlKGRlZmF1bHRDb25maWcgPT4ge1xuICAgICAgdGhpcy5mb3JtQ29uZmlnID0ge1xuICAgICAgICB6b29tTGV2ZWw6IGRlZmF1bHRDb25maWcuem9vbUxldmVsLFxuICAgICAgICBjZW50ZXI6IGRlZmF1bHRDb25maWcuY2VudGVyXG4gICAgICB9O1xuICAgICAgdGhpcy5pbml0Rm9ybSgpO1xuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgaW5pdEZvcm0oKSB7XG4gICAgaWYgKCF0aGlzLmNvbmZpZy5tYXBDb25maWcpIHtcbiAgICAgIHRoaXMuY29uZmlnLm1hcENvbmZpZyA9IHRoaXMuZm9ybUNvbmZpZztcbiAgICB9XG4gICAgdGhpcy5mb3JtQ29uZmlnID0ge1xuICAgICAgLi4udGhpcy5mb3JtQ29uZmlnLFxuICAgICAgLi4udGhpcy5jb25maWcubWFwQ29uZmlnLFxuICAgICAgZGlzYWJsZVBhbjogZmFsc2VcbiAgICB9O1xuICAgIGF3YWl0IHRoaXMudXBkYXRlQXNzZXQoKTtcbiAgfVxuXG4gIGFzeW5jIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcbiAgICBpZiAoXG4gICAgICBjaGFuZ2VzLmNvbmZpZy5jdXJyZW50VmFsdWUgIT09IGNoYW5nZXMuY29uZmlnLnByZXZpb3VzVmFsdWUgJiZcbiAgICAgICFjaGFuZ2VzLmNvbmZpZy5maXJzdENoYW5nZVxuICAgICkge1xuICAgICAgYXdhaXQgdGhpcy51cGRhdGVBc3NldCgpO1xuICAgIH1cbiAgfVxuXG4gIHByZXZpZXdNYXBJbml0KGxlYWZsZXQ6IHR5cGVvZiBMKTogdm9pZCB7XG4gICAgdGhpcy5sZWFmbGV0ID0gbGVhZmxldDtcbiAgICB0aGlzLmFkZENlbnRlckljb24odGhpcy5mb3JtQ29uZmlnLmNlbnRlclswXSwgdGhpcy5mb3JtQ29uZmlnLmNlbnRlclsxXSk7XG4gIH1cblxuICBvbkJlZm9yZVNhdmUoKSB7XG4gICAgdGhpcy5jb25maWcubWFwQ29uZmlnID0gdGhpcy5mb3JtQ29uZmlnO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgem9vbUxldmVsQ2hhbmdlZCgpIHtcbiAgICB0aGlzLmNvbmZpZy5tYXBDb25maWcgPSB7XG4gICAgICAuLi50aGlzLmNvbmZpZy5tYXBDb25maWcsXG4gICAgICB6b29tTGV2ZWw6IHRoaXMuZm9ybUNvbmZpZy56b29tTGV2ZWxcbiAgICB9O1xuICB9XG5cbiAgY2hhbmdlQ2VudGVyKCkge1xuICAgIGlmICh0aGlzLmNlbnRlckljb24pIHtcbiAgICAgIHRoaXMuY2VudGVySWNvbi5yZW1vdmUoKTtcbiAgICB9XG4gICAgdGhpcy5jb25maWcubWFwQ29uZmlnID0geyAuLi50aGlzLmZvcm1Db25maWcsIGNlbnRlcjogWy4uLnRoaXMuZm9ybUNvbmZpZy5jZW50ZXJdIH07XG4gICAgdGhpcy5hZGRDZW50ZXJJY29uKHRoaXMuZm9ybUNvbmZpZy5jZW50ZXJbMF0sIHRoaXMuZm9ybUNvbmZpZy5jZW50ZXJbMV0pO1xuICB9XG5cbiAgY2hhbmdlQ2VudGVyT25FbnRlcktleShldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgdGhpcy5jaGFuZ2VDZW50ZXIoKTtcbiAgfVxuXG4gIG9uUHJldmlld1pvb21TdGFydCgpIHtcbiAgICB0aGlzLmNlbnRlckljb24ucmVtb3ZlKCk7XG4gIH1cblxuICBvblByZXZpZXdab29tRW5kKGV2ZW50OiBMLkxlYWZsZXRFdmVudCkge1xuICAgIHRoaXMuZm9ybUNvbmZpZy56b29tTGV2ZWwgPSBNYXRoLmZsb29yKGV2ZW50LnRhcmdldC5nZXRab29tKCkpO1xuICB9XG5cbiAgb25QcmV2aWV3TWFwTW92ZShldmVudDogTC5MZWFmbGV0RXZlbnQpIHtcbiAgICBpZiAodGhpcy5jZW50ZXJJY29uKSB7XG4gICAgICB0aGlzLmNlbnRlckljb24ucmVtb3ZlKCk7XG4gICAgfVxuICAgIGNvbnN0IHsgbGF0LCBsbmcgfSA9IGV2ZW50LnRhcmdldC5nZXRDZW50ZXIoKTtcbiAgICBjb25zdCBmaXhlZExhdCA9ICtsYXQudG9GaXhlZCh0aGlzLkZJWEVEX1BPSU5UX0RJR0lUUyk7XG4gICAgY29uc3QgZml4ZWRMbmcgPSArbG5nLnRvRml4ZWQodGhpcy5GSVhFRF9QT0lOVF9ESUdJVFMpO1xuICAgIHRoaXMuYWRkQ2VudGVySWNvbihmaXhlZExhdCwgZml4ZWRMbmcpO1xuICAgIHRoaXMuZm9ybUNvbmZpZy5jZW50ZXIgPSBbZml4ZWRMYXQsIGZpeGVkTG5nXTtcbiAgfVxuXG4gIHVzZU93blBvc2l0aW9uKCkge1xuICAgIG5hdmlnYXRvci5nZW9sb2NhdGlvbi5nZXRDdXJyZW50UG9zaXRpb24oKHsgY29vcmRzIH0pID0+IHtcbiAgICAgIHRoaXMuZm9ybUNvbmZpZy5jZW50ZXIgPSBbY29vcmRzLmxhdGl0dWRlLCBjb29yZHMubG9uZ2l0dWRlXTtcbiAgICAgIHRoaXMuY2hhbmdlQ2VudGVyKCk7XG4gICAgfSk7XG4gIH1cblxuICBjZW50ZXJUb0Fzc2V0KCkge1xuICAgIHRoaXMuZm9ybUNvbmZpZy5jZW50ZXIgPSBbXG4gICAgICB0aGlzLmNvbmZpZy5kZXZpY2UuYzh5X1Bvc2l0aW9uLmxhdCxcbiAgICAgIHRoaXMuY29uZmlnLmRldmljZS5jOHlfUG9zaXRpb24ubG5nXG4gICAgXTtcbiAgICB0aGlzLmNoYW5nZUNlbnRlcigpO1xuICB9XG5cbiAgYXN5bmMgZml0VG9Cb3VuZHMoKSB7XG4gICAgaWYgKCF0aGlzLmFzc2V0cz8ubGVuZ3RoIHx8ICF0aGlzLnByZXZpZXdNYXA/Lm1hcCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGJvdW5kcyA9IGF3YWl0IHRoaXMubWFwU2VydmljZS5nZXRBc3NldHNCb3VuZHModGhpcy5hc3NldHMpO1xuXG4gICAgLy8gbWFwLmZpdEJvdW5kcyBjYXVzZXMgem9vbSBhbmQgbW92ZSBldmVudHMsIHNvIGdldCBuZXcgY2VudGVyIGFuZCB6b29tIGxldmVsIG9ubHkgd2hlbiB0aGVzZSBldmVudHMgYXJlIGZpbmlzaGVkXG4gICAgZnJvbUV2ZW50PEwuTGVhZmxldEV2ZW50Pih0aGlzLnByZXZpZXdNYXAubWFwLCAnbW92ZWVuZCcpXG4gICAgICAucGlwZShjb21iaW5lTGF0ZXN0V2l0aChmcm9tRXZlbnQ8TC5MZWFmbGV0RXZlbnQ+KHRoaXMucHJldmlld01hcC5tYXAsICd6b29tZW5kJykpLCB0YWtlKDEpKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIGNvbnN0IGNlbnRlciA9IHRoaXMucHJldmlld01hcC5tYXAuZ2V0Q2VudGVyKCk7XG4gICAgICAgIGNvbnN0IHpvb20gPSB0aGlzLnByZXZpZXdNYXAubWFwLmdldFpvb20oKTtcblxuICAgICAgICBjb25zdCBmaXhlZExhdCA9ICtjZW50ZXIubGF0LnRvRml4ZWQodGhpcy5GSVhFRF9QT0lOVF9ESUdJVFMpO1xuICAgICAgICBjb25zdCBmaXhlZExuZyA9ICtjZW50ZXIubG5nLnRvRml4ZWQodGhpcy5GSVhFRF9QT0lOVF9ESUdJVFMpO1xuICAgICAgICB0aGlzLmZvcm1Db25maWcuY2VudGVyID0gW2ZpeGVkTGF0LCBmaXhlZExuZ107XG4gICAgICAgIHRoaXMuZm9ybUNvbmZpZy56b29tTGV2ZWwgPSBNYXRoLmZsb29yKHpvb20pO1xuXG4gICAgICAgIHRoaXMuY2hhbmdlQ2VudGVyKCk7XG4gICAgICB9KTtcblxuICAgIHRoaXMucHJldmlld01hcC5tYXAuZml0Qm91bmRzKGJvdW5kcywgZGVmYXVsdEZpdEJvdW5kc09wdGlvbnMpO1xuICB9XG5cbiAgdXBkYXRlUmVmcmVzaE9wdGlvbigpIHtcbiAgICB0aGlzLmZvcm1Db25maWcucmVhbHRpbWUgPSB0aGlzLnJlZnJlc2hPcHRpb24gPT09ICdyZWFsdGltZSc7XG4gICAgdGhpcy5jb25maWcud2lkZ2V0SW5zdGFuY2VHbG9iYWxBdXRvUmVmcmVzaENvbnRleHQgPVxuICAgICAgdGhpcy5yZWZyZXNoT3B0aW9uID09PSAnZGFzaGJvYXJkLWF1dG8tcmVmcmVzaC1jb250ZXh0JztcbiAgICB0aGlzLmZvcm1Db25maWcud2lkZ2V0SW5zdGFuY2VHbG9iYWxBdXRvUmVmcmVzaENvbnRleHQgPVxuICAgICAgdGhpcy5yZWZyZXNoT3B0aW9uID09PSAnZGFzaGJvYXJkLWF1dG8tcmVmcmVzaC1jb250ZXh0JztcbiAgICBpZiAodGhpcy5yZWZyZXNoT3B0aW9uID09PSAnaW50ZXJ2YWwnKSB7XG4gICAgICB0aGlzLmZvcm1Db25maWcucmVmcmVzaEludGVydmFsID8/PSA1MDAwO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmZvcm1Db25maWcucmVmcmVzaEludGVydmFsID0gbnVsbDtcbiAgICB9XG4gICAgaWYgKCF0aGlzLmZvcm1Db25maWcucmVhbHRpbWUpIHtcbiAgICAgIHRoaXMuZm9ybUNvbmZpZy5mb2xsb3cgPSBmYWxzZTtcbiAgICB9XG4gICAgdGhpcy5jb25maWcud2lkZ2V0SW5zdGFuY2VHbG9iYWxUaW1lQ29udGV4dCA9XG4gICAgICB0aGlzLnJlZnJlc2hPcHRpb24gPT09ICdkYXNoYm9hcmQtcmVhbHRpbWUtY29udGV4dCc7XG4gICAgaWYgKHRoaXMuY29uZmlnLndpZGdldEluc3RhbmNlR2xvYmFsVGltZUNvbnRleHQpIHtcbiAgICAgIHRoaXMuZm9ybUNvbmZpZy5yZWFsdGltZSA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgc2VsZWN0SWNvbihpY29uOiBzdHJpbmcpIHtcbiAgICB0aGlzLmZvcm1Db25maWcuaWNvbiA9IGljb247XG4gICAgdGhpcy5jb25maWcubWFwQ29uZmlnLmljb24gPSBpY29uO1xuICAgIHRoaXMucHJldmlld01hcC5yZWZyZXNoTWFya2VycygpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyB1cGRhdGVBc3NldCgpIHtcbiAgICB0aGlzLmNhbkF1dG9DZW50ZXIgPSB0aGlzLm1hcFNlcnZpY2UuaGFzUG9zaXRpb24odGhpcy5jb25maWcuZGV2aWNlKTtcbiAgICB0aGlzLmlzUG9zaXRpb25lZERldmljZSA9IHRoaXMubWFwU2VydmljZS5pc1Bvc2l0aW9uZWREZXZpY2UodGhpcy5jb25maWcuZGV2aWNlKTtcbiAgICB0aGlzLnJlZnJlc2hPcHRpb24gPSB0aGlzLmdldFJlZnJlc2hPcHRpb24oKTtcbiAgICB0aGlzLnVwZGF0ZVJlZnJlc2hPcHRpb24oKTtcblxuICAgIGNvbnN0IHsgZGF0YSwgcGFnaW5nIH0gPSBhd2FpdCB0aGlzLm1hcFNlcnZpY2UuZ2V0QWxsUG9zaXRpb25NT3ModGhpcy5jb25maWcuZGV2aWNlKTtcbiAgICB0aGlzLmFzc2V0cyA9IGRhdGE7XG4gICAgaWYgKHBhZ2luZy50b3RhbFBhZ2VzID4gMSkge1xuICAgICAgdGhpcy5hbGVydFNlcnZpY2UuZGFuZ2VyKFxuICAgICAgICBnZXR0ZXh0KFxuICAgICAgICAgICdJdCBtaWdodCBiZSBwb3NzaWJsZSB0aGF0IGFzc2V0cyBhcmUgbm90IHNob3duIGluIHRoZSBwcmV2aWV3LCBhcyB0aGUgY3VycmVudCBzZWxlY3Rpb24gaGFzIG1vcmUgdGhhbiA1MDAgYXNzZXRzIGFuZCB0aGUgcHJldmlldyBvbmx5IHN1cHBvcnRzIGEgbWF4aW11bSBvZiA1MDAgYXNzZXRzLidcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldFJlZnJlc2hPcHRpb24oKTogTWFwUmVmcmVzaE9wdGlvbiB7XG4gICAgbGV0IG9wdGlvbjogTWFwUmVmcmVzaE9wdGlvbiA9ICdub25lJztcbiAgICBpZiAodGhpcy5mb3JtQ29uZmlnLnJlYWx0aW1lKSB7XG4gICAgICBvcHRpb24gPSAncmVhbHRpbWUnO1xuICAgIH0gZWxzZSBpZiAodGhpcy5mb3JtQ29uZmlnLnJlZnJlc2hJbnRlcnZhbCkge1xuICAgICAgb3B0aW9uID0gJ2ludGVydmFsJztcbiAgICB9IGVsc2UgaWYgKHRoaXMuY29uZmlnLndpZGdldEluc3RhbmNlR2xvYmFsVGltZUNvbnRleHQpIHtcbiAgICAgIG9wdGlvbiA9ICdkYXNoYm9hcmQtcmVhbHRpbWUtY29udGV4dCc7XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIHRoaXMuY29uZmlnLndpZGdldEluc3RhbmNlR2xvYmFsQXV0b1JlZnJlc2hDb250ZXh0IHx8XG4gICAgICB0aGlzLmZvcm1Db25maWcud2lkZ2V0SW5zdGFuY2VHbG9iYWxBdXRvUmVmcmVzaENvbnRleHRcbiAgICApIHtcbiAgICAgIG9wdGlvbiA9ICdkYXNoYm9hcmQtYXV0by1yZWZyZXNoLWNvbnRleHQnO1xuICAgIH1cbiAgICBjb25zdCBpc05vdEFsbG93ZWRPcHRpb24gPVxuICAgICAgKCF0aGlzLmlzUG9zaXRpb25lZERldmljZSAmJiBvcHRpb24gPT09ICdkYXNoYm9hcmQtcmVhbHRpbWUtY29udGV4dCcpIHx8XG4gICAgICAoIXRoaXMuaXNQb3NpdGlvbmVkRGV2aWNlICYmIG9wdGlvbiA9PT0gJ3JlYWx0aW1lJykgfHxcbiAgICAgICh0aGlzLmlzUG9zaXRpb25lZERldmljZSAmJiBvcHRpb24gPT09ICdpbnRlcnZhbCcpO1xuICAgIG9wdGlvbiA9IGlzTm90QWxsb3dlZE9wdGlvbiA/ICdub25lJyA6IG9wdGlvbjtcbiAgICByZXR1cm4gb3B0aW9uO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGRDZW50ZXJJY29uKGxhdDogbnVtYmVyLCBsbmc6IG51bWJlcikge1xuICAgIGNvbnN0IHRpdGxlVGV4dCA9IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KGdldHRleHQoJ01hcCBjZW50ZXInKSk7XG4gICAgY29uc3QgaWNvbiA9IHRoaXMubGVhZmxldC5kaXZJY29uKHtcbiAgICAgIGh0bWw6IGA8aSBzdHlsZT1cInBvaW50ZXItZXZlbnRzOiBub25lXCIgY2xhc3M9XCJjOHktbWFwLW1hcmtlci1pY29uIHRleHQtbXV0ZWQgZGx0LWM4eS1pY29uLXRhcmdldCBpY29uLTJ4XCIgdGl0bGU9XCIke3RpdGxlVGV4dH1cIiAvPmBcbiAgICB9KTtcbiAgICB0aGlzLmNlbnRlckljb24gPSB0aGlzLmxlYWZsZXQubWFya2VyKFtsYXQsIGxuZ10sIHtcbiAgICAgIGljb25cbiAgICB9KTtcbiAgICB0aGlzLnByZXZpZXdNYXAuYWRkTWFya2VyVG9NYXAodGhpcy5jZW50ZXJJY29uKTtcbiAgfVxufVxuIiwiPGRpdlxuICBjbGFzcz1cInJvdyBwLXQtMTZcIlxuICAqbmdJZj1cImZvcm1Db25maWdcIlxuPlxuICA8ZGl2IGNsYXNzPVwiY29sLXhzLTJcIj5cbiAgICA8Yzh5LWZvcm0tZ3JvdXAgY2xhc3M9XCJtLWItMCB0ZXh0LWNlbnRlciBmb3JtLWdyb3VwLXNtXCI+XG4gICAgICA8bGFiZWwgdHJhbnNsYXRlPk1hcmtlciBpY29uPC9sYWJlbD5cbiAgICAgIDxjOHktaWNvbi1zZWxlY3Rvci13cmFwcGVyXG4gICAgICAgIFtjYW5SZW1vdmVJY29uXT1cInRydWVcIlxuICAgICAgICBbc2VsZWN0ZWRJY29uXT1cImZvcm1Db25maWcuaWNvblwiXG4gICAgICAgIChvblNlbGVjdCk9XCJzZWxlY3RJY29uKCRldmVudClcIlxuICAgICAgPjwvYzh5LWljb24tc2VsZWN0b3Itd3JhcHBlcj5cbiAgICA8L2M4eS1mb3JtLWdyb3VwPlxuICA8L2Rpdj5cbiAgPGRpdiBjbGFzcz1cImNvbC14cy0xMFwiPlxuICAgIDxkaXYgY2xhc3M9XCJyb3cgdGlnaHQtZ3JpZCBzZXBhcmF0b3ItYm90dG9tXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY29sLXhzLTRcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgZm9ybS1ncm91cC1zbVwiPlxuICAgICAgICAgIDxsYWJlbCB0cmFuc2xhdGU+Wm9vbSBsZXZlbDwvbGFiZWw+XG4gICAgICAgICAgPGM4eS1yYW5nZVxuICAgICAgICAgICAgY2xhc3M9XCJsYWJlbC1ib3R0b21cIlxuICAgICAgICAgICAgbmFtZT1cInpvb21MZXZlbFwiXG4gICAgICAgICAgICAjcmFuZ2VcbiAgICAgICAgICAgIFsobmdNb2RlbCldPVwiZm9ybUNvbmZpZy56b29tTGV2ZWxcIlxuICAgICAgICAgICAgKGNoYW5nZSk9XCJ6b29tTGV2ZWxDaGFuZ2VkKClcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICB0eXBlPVwicmFuZ2VcIlxuICAgICAgICAgICAgICBtaW49XCIwXCJcbiAgICAgICAgICAgICAgbWF4PVwiMThcIlxuICAgICAgICAgICAgICBzdGVwPVwiMVwiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgIDwvYzh5LXJhbmdlPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImNvbC14cy04XCI+XG4gICAgICAgIDxjOHktZm9ybS1ncm91cCBjbGFzcz1cImZvcm0tZ3JvdXAtc20gbS1iLThcIj5cbiAgICAgICAgICA8bGFiZWwgdHJhbnNsYXRlPkNlbnRlciBib3VuZDwvbGFiZWw+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LWdyb3VwIGlucHV0LWdyb3VwLXNtXCI+XG4gICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIlxuICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cInt7ICdsYXQuYGxhdGl0dWRlYCcgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgICAgICBuYW1lPVwiY2VudGVyTGF0XCJcbiAgICAgICAgICAgICAgdHlwZT1cIm51bWJlclwiXG4gICAgICAgICAgICAgIHJlcXVpcmVkXG4gICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiZm9ybUNvbmZpZy5jZW50ZXJbMF1cIlxuICAgICAgICAgICAgICAoY2hhbmdlKT1cImNoYW5nZUNlbnRlcigpXCJcbiAgICAgICAgICAgICAgKGtleWRvd24uZW50ZXIpPVwiY2hhbmdlQ2VudGVyT25FbnRlcktleSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgbWluPVwiLTkwXCJcbiAgICAgICAgICAgICAgbWF4PVwiOTBcIlxuICAgICAgICAgICAgICBzdGVwPVwiMC4xXCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIlxuICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cInt7ICdsbmcuYGxvbmdpdHVkZWAnIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICAgICAgbmFtZT1cImNlbnRlckxuZ1wiXG4gICAgICAgICAgICAgIHR5cGU9XCJudW1iZXJcIlxuICAgICAgICAgICAgICByZXF1aXJlZFxuICAgICAgICAgICAgICBtaW49XCItMTgwXCJcbiAgICAgICAgICAgICAgbWF4PVwiMTgwXCJcbiAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJmb3JtQ29uZmlnLmNlbnRlclsxXVwiXG4gICAgICAgICAgICAgIChjaGFuZ2UpPVwiY2hhbmdlQ2VudGVyKClcIlxuICAgICAgICAgICAgICAoa2V5ZG93bi5lbnRlcik9XCJjaGFuZ2VDZW50ZXJPbkVudGVyS2V5KCRldmVudClcIlxuICAgICAgICAgICAgICBtaW49XCItMTgwXCJcbiAgICAgICAgICAgICAgbWF4PVwiMTgwXCJcbiAgICAgICAgICAgICAgc3RlcD1cIjAuMVwiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LWdyb3VwLWJ0blwiPlxuICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLWRlZmF1bHRcIlxuICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ1VzZSB5b3VyIGxvY2F0aW9uJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgW3Rvb2x0aXBdPVwiJ1VzZSB5b3VyIGxvY2F0aW9uJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgcGxhY2VtZW50PVwidG9wXCJcbiAgICAgICAgICAgICAgICBjb250YWluZXI9XCJib2R5XCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwidXNlT3duUG9zaXRpb24oKVwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8aVxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJpY29uLTE0XCJcbiAgICAgICAgICAgICAgICAgIGM4eUljb249XCJsb2NhdGlvbi1hcnJvd1wiXG4gICAgICAgICAgICAgICAgPjwvaT5cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1ncm91cC1idG5cIj5cbiAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1kZWZhdWx0XCJcbiAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidVc2Ugc2VsZWN0ZWQgYXNzZXQgbG9jYXRpb24nIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICBbdG9vbHRpcF09XCInVXNlIHNlbGVjdGVkIGFzc2V0IGxvY2F0aW9uJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgcGxhY2VtZW50PVwidG9wXCJcbiAgICAgICAgICAgICAgICBjb250YWluZXI9XCJib2R5XCJcbiAgICAgICAgICAgICAgICAqbmdJZj1cImNhbkF1dG9DZW50ZXI7IGVsc2UgZml0VG9Cb3VuZHNCdXR0b25cIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJjZW50ZXJUb0Fzc2V0KClcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGlcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiaWNvbi0xNFwiXG4gICAgICAgICAgICAgICAgICBjOHlJY29uPVwibG9jYXRpb25cIlxuICAgICAgICAgICAgICAgID48L2k+XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8bmctdGVtcGxhdGUgI2ZpdFRvQm91bmRzQnV0dG9uPlxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICBjbGFzcz1cImJ0biBidG4tZGVmYXVsdFwiXG4gICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ0ZpdCB0byBhc3NldHMgYm91bmRzJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgIFt0b29sdGlwXT1cIidGaXQgdG8gYXNzZXRzIGJvdW5kcycgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICBwbGFjZW1lbnQ9XCJ0b3BcIlxuICAgICAgICAgICAgICBjb250YWluZXI9XCJib2R5XCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cImZpdFRvQm91bmRzKClcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8aVxuICAgICAgICAgICAgICAgIGNsYXNzPVwiaWNvbi0xNFwiXG4gICAgICAgICAgICAgICAgYzh5SWNvbj1cIndheXBvaW50LW1hcFwiXG4gICAgICAgICAgICAgID48L2k+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgIDxjOHktbWVzc2FnZXNcbiAgICAgICAgICAgIFtoZWxwTWVzc2FnZV09XCInRHJhZyB0aGUgbWFwIHRvIHRoZSBkZXNpcmVkIHBvc2l0aW9uJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgPjwvYzh5LW1lc3NhZ2VzPlxuICAgICAgICA8L2M4eS1mb3JtLWdyb3VwPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IGNsYXNzPVwicm93IHRpZ2h0LWdyaWQgcC10LTggZC1mbGV4IGEtaS1jZW50ZXJcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjb2wteHMtNlwiPlxuICAgICAgICA8Yzh5LWZvcm0tZ3JvdXAgY2xhc3M9XCJtLWItMCBmb3JtLWdyb3VwLXNtXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImM4eS1zZWxlY3Qtd3JhcHBlclwiPlxuICAgICAgICAgICAgPHNlbGVjdFxuICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbFwiXG4gICAgICAgICAgICAgIHRpdGxlPVwie3sgJ1JlZnJlc2ggb3B0aW9uc2BvcHRpb25zIGZvciByZWZyZXNoaW5nIGEgdmlld2AnIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICAgICAgaWQ9XCJzZWxlY3RFeGFtcGxlXCJcbiAgICAgICAgICAgICAgbmFtZT1cInJlZnJlc2hTZWxlY3Rpb25cIlxuICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInJlZnJlc2hPcHRpb25cIlxuICAgICAgICAgICAgICAoY2hhbmdlKT1cInVwZGF0ZVJlZnJlc2hPcHRpb24oKVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxvcHRpb25cbiAgICAgICAgICAgICAgICBbdGl0bGVdPVwiJ09ubHkgcmVmcmVzaGluZyBvbiBpbnRlcmFjdGlvbicgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgIHZhbHVlPVwibm9uZVwiXG4gICAgICAgICAgICAgICAgdHJhbnNsYXRlXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICBObyBhdXRvbWF0aWMgcmVmcmVzaFxuICAgICAgICAgICAgICA8L29wdGlvbj5cbiAgICAgICAgICAgICAgPG9wdGlvblxuICAgICAgICAgICAgICAgIFt0aXRsZV09XCInUmVmcmVzaGluZyBhZnRlciB0aGUgZ2l2ZW4gaW50ZXJ2YWwgYW5kIG9uIGludGVyYWN0aW9uJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgdmFsdWU9XCJpbnRlcnZhbFwiXG4gICAgICAgICAgICAgICAgKm5nSWY9XCIhaXNQb3NpdGlvbmVkRGV2aWNlXCJcbiAgICAgICAgICAgICAgICB0cmFuc2xhdGVcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIFVzZSByZWZyZXNoIGludGVydmFsXG4gICAgICAgICAgICAgIDwvb3B0aW9uPlxuICAgICAgICAgICAgICA8b3B0aW9uXG4gICAgICAgICAgICAgICAgW3RpdGxlXT1cIlxuICAgICAgICAgICAgICAgICAgJ1JlZnJlc2hpbmcgYWZ0ZXIgdGhlIGdpdmVuIGludGVydmFsIGFuZCBvbiBpbnRlcmFjdGlvbiwgc3luY2hyb25pemVkIGdsb2JhbGx5J1xuICAgICAgICAgICAgICAgICAgICB8IHRyYW5zbGF0ZVxuICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgdmFsdWU9XCJkYXNoYm9hcmQtYXV0by1yZWZyZXNoLWNvbnRleHRcIlxuICAgICAgICAgICAgICAgICpuZ0lmPVwiIWlzUG9zaXRpb25lZERldmljZVwiXG4gICAgICAgICAgICAgICAgdHJhbnNsYXRlXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICBVc2UgZ2xvYmFsIHJlZnJlc2ggaW50ZXJ2YWxcbiAgICAgICAgICAgICAgPC9vcHRpb24+XG4gICAgICAgICAgICAgIDxvcHRpb25cbiAgICAgICAgICAgICAgICBbdGl0bGVdPVwiJ0xpdmUgdXBkYXRpbmcgb24gZWFjaCBwb3NpdGlvbiBjaGFuZ2UnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICB2YWx1ZT1cInJlYWx0aW1lXCJcbiAgICAgICAgICAgICAgICAqbmdJZj1cImlzUG9zaXRpb25lZERldmljZVwiXG4gICAgICAgICAgICAgICAgdHJhbnNsYXRlXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICBSZWFsdGltZVxuICAgICAgICAgICAgICA8L29wdGlvbj5cbiAgICAgICAgICAgICAgPG9wdGlvblxuICAgICAgICAgICAgICAgIFt0aXRsZV09XCInQmluZCB3aWRnZXQgdG8gZGFzaGJvYXJkIHJlYWx0aW1lIGNvbnRleHQnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICB2YWx1ZT1cImRhc2hib2FyZC1yZWFsdGltZS1jb250ZXh0XCJcbiAgICAgICAgICAgICAgICAqbmdJZj1cImlzUG9zaXRpb25lZERldmljZVwiXG4gICAgICAgICAgICAgICAgdHJhbnNsYXRlXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICBEYXNoYm9hcmQgcmVhbHRpbWUgY29udGV4dFxuICAgICAgICAgICAgICA8L29wdGlvbj5cbiAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2M4eS1mb3JtLWdyb3VwPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiY29sLXhzLThcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgZm9ybS1ncm91cC1zbSBtLWItMFwiPlxuICAgICAgICAgIDxjOHktcmFuZ2VcbiAgICAgICAgICAgIGNsYXNzPVwibGFiZWwtYm90dG9tXCJcbiAgICAgICAgICAgIG5hbWU9XCJyZWZyZXNoSW50ZXJ2YWxcIlxuICAgICAgICAgICAgI2ludGVydmFsUmFuZ2VcbiAgICAgICAgICAgICpuZ0lmPVwicmVmcmVzaE9wdGlvbiA9PT0gJ2ludGVydmFsJ1wiXG4gICAgICAgICAgICBbKG5nTW9kZWwpXT1cImZvcm1Db25maWcucmVmcmVzaEludGVydmFsXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgI2M4eVJhbmdlVmFsdWU+XG4gICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgIFt0cmFuc2xhdGVQYXJhbXNdPVwieyBpbnRlcnZhbEluU2Vjb25kczogaW50ZXJ2YWxSYW5nZS52YWx1ZSAqIDAuMDAxIH1cIlxuICAgICAgICAgICAgICAgICAgdHJhbnNsYXRlXG4gICAgICAgICAgICAgICAgICBuZ05vbkJpbmRhYmxlXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAge3sgaW50ZXJ2YWxJblNlY29uZHMgfX0gc1xuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgIHR5cGU9XCJyYW5nZVwiXG4gICAgICAgICAgICAgIG1pbj1cIjUwMDBcIlxuICAgICAgICAgICAgICBtYXg9XCIxMDAwMDBcIlxuICAgICAgICAgICAgICBzdGVwPVwiMTAwMFwiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgIDwvYzh5LXJhbmdlPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGxhYmVsXG4gICAgICAgICAgY2xhc3M9XCJjOHktc3dpdGNoIGM4eS1zd2l0Y2gtLWlubGluZVwiXG4gICAgICAgICAgKm5nSWY9XCJyZWZyZXNoT3B0aW9uID09PSAncmVhbHRpbWUnIHx8IHJlZnJlc2hPcHRpb24gPT09ICdkYXNoYm9hcmQtcmVhbHRpbWUtY29udGV4dCdcIlxuICAgICAgICA+XG4gICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICBuYW1lPVwiZm9sbG93XCJcbiAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgICAgICBbKG5nTW9kZWwpXT1cImZvcm1Db25maWcuZm9sbG93XCJcbiAgICAgICAgICAvPlxuICAgICAgICAgIDxzcGFuPjwvc3Bhbj5cbiAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgY2xhc3M9XCJ0ZXh0LTEyXCJcbiAgICAgICAgICAgIHRyYW5zbGF0ZVxuICAgICAgICAgID5cbiAgICAgICAgICAgIEZvbGxvdyBzZWxlY3RlZFxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPC9sYWJlbD5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PlxuXG48ZGl2XG4gIGNsYXNzPVwicC10LTE2IHAtYi0xNlwiXG4gIHN0eWxlPVwid2lkdGg6IDEwMCU7IGhlaWdodDogMjQwcHhcIlxuPlxuICA8Yzh5LW1hcFxuICAgICpuZ0lmPVwiY29uZmlnLm1hcENvbmZpZ1wiXG4gICAgW2Fzc2V0c109XCJhc3NldHNcIlxuICAgIFtjb25maWddPVwiY29uZmlnLm1hcENvbmZpZ1wiXG4gICAgKG9uTW92ZSk9XCJvblByZXZpZXdNYXBNb3ZlKCRldmVudClcIlxuICAgIChvblpvb21TdGFydCk9XCJvblByZXZpZXdab29tU3RhcnQoKVwiXG4gICAgKG9uWm9vbUVuZCk9XCJvblByZXZpZXdab29tRW5kKCRldmVudClcIlxuICAgIChvbkluaXQpPVwicHJldmlld01hcEluaXQoJGV2ZW50KVwiXG4gID48L2M4eS1tYXA+XG48L2Rpdj5cbiJdfQ==
|
|
@@ -2,8 +2,8 @@ import { Component, Input, Optional, ViewChild } from '@angular/core';
|
|
|
2
2
|
import { CommonModule as NgCommonModule } from '@angular/common';
|
|
3
3
|
import { FormsModule as NgFormsModule } from '@angular/forms';
|
|
4
4
|
import { InventoryService } from '@c8y/client';
|
|
5
|
-
import { ClusterMapComponent, MapModule } from '@c8y/ngx-components/map';
|
|
6
|
-
import { AssetLinkPipe, CommonModule, DashboardChildComponent, DismissAlertStrategy, DynamicComponentAlert, FormsModule, gettext } from '@c8y/ngx-components';
|
|
5
|
+
import { ClusterMapComponent, defaultFitBoundsOptions, MapModule, MapService } from '@c8y/ngx-components/map';
|
|
6
|
+
import { AssetLinkPipe, CommonModule, DashboardChildComponent, DismissAlertStrategy, DynamicComponentAlert, FormsModule, gettext, WidgetsDashboardComponent } from '@c8y/ngx-components';
|
|
7
7
|
import { filter, takeUntil } from 'rxjs/operators';
|
|
8
8
|
import { Subject } from 'rxjs';
|
|
9
9
|
import { ContextDashboardComponent } from '@c8y/ngx-components/context-dashboard';
|
|
@@ -11,16 +11,19 @@ import { MapEventInfoComponent } from './map-event-info.component';
|
|
|
11
11
|
import { IconSelectorModule } from '@c8y/ngx-components/icon-selector';
|
|
12
12
|
import { TooltipModule } from 'ngx-bootstrap/tooltip';
|
|
13
13
|
import { RouterLink } from '@angular/router';
|
|
14
|
+
import { debounce } from 'lodash-es';
|
|
14
15
|
import * as i0 from "@angular/core";
|
|
15
16
|
import * as i1 from "@c8y/ngx-components";
|
|
16
17
|
import * as i2 from "@c8y/ngx-components/context-dashboard";
|
|
17
18
|
import * as i3 from "@c8y/client";
|
|
18
|
-
import * as i4 from "@
|
|
19
|
-
import * as i5 from "@
|
|
19
|
+
import * as i4 from "@c8y/ngx-components/map";
|
|
20
|
+
import * as i5 from "@angular/common";
|
|
20
21
|
export class MapWidgetComponent {
|
|
21
|
-
constructor(dashboardChild, dashboardContextComponent, inventory) {
|
|
22
|
+
constructor(dashboardChild, dashboardContextComponent, inventory, mapService, widgetsDashboardComponent) {
|
|
22
23
|
this.dashboardContextComponent = dashboardContextComponent;
|
|
23
24
|
this.inventory = inventory;
|
|
25
|
+
this.mapService = mapService;
|
|
26
|
+
this.widgetsDashboardComponent = widgetsDashboardComponent;
|
|
24
27
|
this.mapConfig = { center: [0, 0] };
|
|
25
28
|
this.TIMEOUT_ERROR_TEXT = gettext('The request is taking longer than usual. We apologize for the inconvenience.');
|
|
26
29
|
this.SERVER_ERROR_TEXT = gettext('Server error occurred.');
|
|
@@ -44,6 +47,7 @@ export class MapWidgetComponent {
|
|
|
44
47
|
this.updateMapConfigRealtime();
|
|
45
48
|
}
|
|
46
49
|
this.savedNode = this.rootNode;
|
|
50
|
+
await this.updateAssets();
|
|
47
51
|
}
|
|
48
52
|
ngOnChanges(changes) {
|
|
49
53
|
if (changes.config?.currentValue?.widgetInstanceGlobalTimeContext) {
|
|
@@ -52,6 +56,15 @@ export class MapWidgetComponent {
|
|
|
52
56
|
}
|
|
53
57
|
ngAfterViewInit() {
|
|
54
58
|
this.subscribeToErrorsOccurred();
|
|
59
|
+
if (this.widgetsDashboardComponent) {
|
|
60
|
+
const resizeCallback = debounce(() => {
|
|
61
|
+
// initial size of map is assigned when left drawer is closed, but if it is opened after initialization
|
|
62
|
+
// the map size is not updated, so we need to call invalidateSize so that map use the correct size
|
|
63
|
+
this.clusterMap.map?.invalidateSize(false);
|
|
64
|
+
}, 100);
|
|
65
|
+
this.resizeObserver = new ResizeObserver(resizeCallback);
|
|
66
|
+
this.resizeObserver.observe(this.widgetsDashboardComponent.nativeElement);
|
|
67
|
+
}
|
|
55
68
|
}
|
|
56
69
|
startFollow(context) {
|
|
57
70
|
if (context.id !== this.rootNode?.id) {
|
|
@@ -74,8 +87,22 @@ export class MapWidgetComponent {
|
|
|
74
87
|
this.rootNode = this.savedNode;
|
|
75
88
|
}
|
|
76
89
|
ngOnDestroy() {
|
|
90
|
+
if (this.resizeObserver) {
|
|
91
|
+
this.resizeObserver.disconnect();
|
|
92
|
+
}
|
|
77
93
|
this.destroy$.next();
|
|
78
94
|
}
|
|
95
|
+
async fitToBounds() {
|
|
96
|
+
await this.updateAssets();
|
|
97
|
+
if (this.assets.length === 0 || !this.clusterMap?.map) {
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
const bounds = await this.mapService.getAssetsBounds(this.assets);
|
|
101
|
+
this.clusterMap.map.fitBounds(bounds, defaultFitBoundsOptions);
|
|
102
|
+
}
|
|
103
|
+
async updateAssets() {
|
|
104
|
+
this.assets = (await this.mapService.getAllPositionMOs(this.config.device)).data;
|
|
105
|
+
}
|
|
79
106
|
listenToWidgetResizeEvent(dashboardChild) {
|
|
80
107
|
dashboardChild.changeEnd
|
|
81
108
|
.pipe(filter(child => child.lastChange === 'resize'), takeUntil(this.destroy$))
|
|
@@ -91,15 +118,15 @@ export class MapWidgetComponent {
|
|
|
91
118
|
type: 'warning',
|
|
92
119
|
text: error?.name === 'TimeoutError'
|
|
93
120
|
? this.TIMEOUT_ERROR_TEXT
|
|
94
|
-
: error?.message ?? this.SERVER_ERROR_TEXT
|
|
121
|
+
: (error?.message ?? this.SERVER_ERROR_TEXT)
|
|
95
122
|
}));
|
|
96
123
|
});
|
|
97
124
|
}
|
|
98
125
|
updateMapConfigRealtime() {
|
|
99
126
|
this.mapConfig.realtime = this.config.realtime || false;
|
|
100
127
|
}
|
|
101
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MapWidgetComponent, deps: [{ token: i1.DashboardChildComponent }, { token: i2.ContextDashboardComponent, optional: true }, { token: i3.InventoryService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
102
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: MapWidgetComponent, isStandalone: true, selector: "c8y-map-widget", inputs: { config: "config" }, viewQueries: [{ propertyName: "clusterMap", first: true, predicate: ClusterMapComponent, descendants: true }], usesOnChanges: true, ngImport: i0, template: "<c8y-map-status\n [clusterMap]=\"mapWidget\"\n [(config)]=\"mapConfig\"\n (onUnfollow)=\"stopFollow()\"\n [buttonsConfig]=\"config.widgetInstanceGlobalTimeContext ? { realtime: { show: false } } : null\"\n></c8y-map-status>\n<c8y-cluster-map\n #mapWidget\n [rootNode]=\"rootNode\"\n [config]=\"mapConfig\"\n>\n <div\n class=\"map-marker\"\n *c8yMapPopup=\"let context\"\n >\n <a\n class=\"text-truncate deviceLink text-12\"\n routerLink=\"{{ context | assetLink }}\"\n >\n <strong>{{ context.name }}</strong>\n </a>\n <c8y-map-event-info [asset]=\"context\">\n <button\n class=\"btn btn-default btn-xs btn-block m-t-8\"\n [title]=\"'Activate realtime on this asset and follow it if it moves' | translate\"\n type=\"button\"\n (click)=\"startFollow(context)\"\n *ngIf=\"!mapConfig.follow\"\n translate\n >\n Follow\n </button>\n <button\n class=\"btn btn-default btn-xs btn-block m-t-8\"\n [title]=\"'Stop following this asset.' | translate\"\n type=\"button\"\n (click)=\"stopFollow()\"\n *ngIf=\"mapConfig.follow\"\n translate\n >\n Unfollow\n </button>\n </c8y-map-event-info>\n </div>\n</c8y-cluster-map>\n", dependencies: [{ kind: "component", type: MapEventInfoComponent, selector: "c8y-map-event-info", inputs: ["asset"] }, { kind: "ngmodule", type: NgCommonModule }, { kind: "directive", type:
|
|
128
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MapWidgetComponent, deps: [{ token: i1.DashboardChildComponent }, { token: i2.ContextDashboardComponent, optional: true }, { token: i3.InventoryService }, { token: i4.MapService }, { token: i1.WidgetsDashboardComponent, optional: true }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
129
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: MapWidgetComponent, isStandalone: true, selector: "c8y-map-widget", inputs: { config: "config" }, viewQueries: [{ propertyName: "clusterMap", first: true, predicate: ClusterMapComponent, descendants: true }], usesOnChanges: true, ngImport: i0, template: "<c8y-map-status\n [clusterMap]=\"mapWidget\"\n [(config)]=\"mapConfig\"\n (onUnfollow)=\"stopFollow()\"\n (fitAssetsToBounds)=\"fitToBounds()\"\n [buttonsConfig]=\"config.widgetInstanceGlobalTimeContext ? { realtime: { show: false } } : null\"\n [assets]=\"assets\"\n></c8y-map-status>\n<c8y-cluster-map\n #mapWidget\n [rootNode]=\"rootNode\"\n [config]=\"mapConfig\"\n>\n <div\n class=\"map-marker\"\n *c8yMapPopup=\"let context\"\n >\n <a\n class=\"text-truncate deviceLink text-12\"\n routerLink=\"{{ context | assetLink }}\"\n >\n <strong>{{ context.name }}</strong>\n </a>\n <c8y-map-event-info [asset]=\"context\">\n <button\n class=\"btn btn-default btn-xs btn-block m-t-8\"\n [title]=\"'Activate realtime on this asset and follow it if it moves' | translate\"\n type=\"button\"\n (click)=\"startFollow(context)\"\n *ngIf=\"!mapConfig.follow\"\n translate\n >\n Follow\n </button>\n <button\n class=\"btn btn-default btn-xs btn-block m-t-8\"\n [title]=\"'Stop following this asset.' | translate\"\n type=\"button\"\n (click)=\"stopFollow()\"\n *ngIf=\"mapConfig.follow\"\n translate\n >\n Unfollow\n </button>\n </c8y-map-event-info>\n </div>\n</c8y-cluster-map>\n", dependencies: [{ kind: "component", type: MapEventInfoComponent, selector: "c8y-map-event-info", inputs: ["asset"] }, { kind: "ngmodule", type: NgCommonModule }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: NgFormsModule }, { kind: "ngmodule", type: CommonModule }, { kind: "pipe", type: i1.C8yTranslatePipe, name: "translate" }, { kind: "directive", type: i1.C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "pipe", type: i1.AssetLinkPipe, name: "assetLink" }, { kind: "ngmodule", type: FormsModule }, { kind: "ngmodule", type: IconSelectorModule }, { kind: "ngmodule", type: MapModule }, { kind: "component", type: i4.MapStatusComponent, selector: "c8y-map-status", inputs: ["config", "assets", "clusterMap", "buttonsConfig"], outputs: ["configChange", "onUnfollow", "fitAssetsToBounds"] }, { kind: "component", type: i4.ClusterMapComponent, selector: "c8y-cluster-map", inputs: ["config", "rootNode", "asset", "showClusterColor"], outputs: ["mapChange"] }, { kind: "directive", type: i4.MapPopupDirective, selector: "[c8yMapPopup]" }, { kind: "ngmodule", type: TooltipModule }, { kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }] }); }
|
|
103
130
|
}
|
|
104
131
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MapWidgetComponent, decorators: [{
|
|
105
132
|
type: Component,
|
|
@@ -114,13 +141,15 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
|
|
|
114
141
|
AssetLinkPipe,
|
|
115
142
|
TooltipModule,
|
|
116
143
|
RouterLink
|
|
117
|
-
], template: "<c8y-map-status\n [clusterMap]=\"mapWidget\"\n [(config)]=\"mapConfig\"\n (onUnfollow)=\"stopFollow()\"\n [buttonsConfig]=\"config.widgetInstanceGlobalTimeContext ? { realtime: { show: false } } : null\"\n></c8y-map-status>\n<c8y-cluster-map\n #mapWidget\n [rootNode]=\"rootNode\"\n [config]=\"mapConfig\"\n>\n <div\n class=\"map-marker\"\n *c8yMapPopup=\"let context\"\n >\n <a\n class=\"text-truncate deviceLink text-12\"\n routerLink=\"{{ context | assetLink }}\"\n >\n <strong>{{ context.name }}</strong>\n </a>\n <c8y-map-event-info [asset]=\"context\">\n <button\n class=\"btn btn-default btn-xs btn-block m-t-8\"\n [title]=\"'Activate realtime on this asset and follow it if it moves' | translate\"\n type=\"button\"\n (click)=\"startFollow(context)\"\n *ngIf=\"!mapConfig.follow\"\n translate\n >\n Follow\n </button>\n <button\n class=\"btn btn-default btn-xs btn-block m-t-8\"\n [title]=\"'Stop following this asset.' | translate\"\n type=\"button\"\n (click)=\"stopFollow()\"\n *ngIf=\"mapConfig.follow\"\n translate\n >\n Unfollow\n </button>\n </c8y-map-event-info>\n </div>\n</c8y-cluster-map>\n" }]
|
|
144
|
+
], template: "<c8y-map-status\n [clusterMap]=\"mapWidget\"\n [(config)]=\"mapConfig\"\n (onUnfollow)=\"stopFollow()\"\n (fitAssetsToBounds)=\"fitToBounds()\"\n [buttonsConfig]=\"config.widgetInstanceGlobalTimeContext ? { realtime: { show: false } } : null\"\n [assets]=\"assets\"\n></c8y-map-status>\n<c8y-cluster-map\n #mapWidget\n [rootNode]=\"rootNode\"\n [config]=\"mapConfig\"\n>\n <div\n class=\"map-marker\"\n *c8yMapPopup=\"let context\"\n >\n <a\n class=\"text-truncate deviceLink text-12\"\n routerLink=\"{{ context | assetLink }}\"\n >\n <strong>{{ context.name }}</strong>\n </a>\n <c8y-map-event-info [asset]=\"context\">\n <button\n class=\"btn btn-default btn-xs btn-block m-t-8\"\n [title]=\"'Activate realtime on this asset and follow it if it moves' | translate\"\n type=\"button\"\n (click)=\"startFollow(context)\"\n *ngIf=\"!mapConfig.follow\"\n translate\n >\n Follow\n </button>\n <button\n class=\"btn btn-default btn-xs btn-block m-t-8\"\n [title]=\"'Stop following this asset.' | translate\"\n type=\"button\"\n (click)=\"stopFollow()\"\n *ngIf=\"mapConfig.follow\"\n translate\n >\n Unfollow\n </button>\n </c8y-map-event-info>\n </div>\n</c8y-cluster-map>\n" }]
|
|
118
145
|
}], ctorParameters: () => [{ type: i1.DashboardChildComponent }, { type: i2.ContextDashboardComponent, decorators: [{
|
|
119
146
|
type: Optional
|
|
120
|
-
}] }, { type: i3.InventoryService }
|
|
147
|
+
}] }, { type: i3.InventoryService }, { type: i4.MapService }, { type: i1.WidgetsDashboardComponent, decorators: [{
|
|
148
|
+
type: Optional
|
|
149
|
+
}] }], propDecorators: { config: [{
|
|
121
150
|
type: Input
|
|
122
151
|
}], clusterMap: [{
|
|
123
152
|
type: ViewChild,
|
|
124
153
|
args: [ClusterMapComponent]
|
|
125
154
|
}] } });
|
|
126
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFwLXdpZGdldC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi93aWRnZXRzL2ltcGxlbWVudGF0aW9ucy9tYXAvbWFwLXdpZGdldC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi93aWRnZXRzL2ltcGxlbWVudGF0aW9ucy9tYXAvbWFwLXdpZGdldC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsU0FBUyxFQUNULEtBQUssRUFJTCxRQUFRLEVBRVIsU0FBUyxFQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxZQUFZLElBQUksY0FBYyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDakUsT0FBTyxFQUFFLFdBQVcsSUFBSSxhQUFhLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM5RCxPQUFPLEVBQWtCLGdCQUFnQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQy9ELE9BQU8sRUFBRSxtQkFBbUIsRUFBb0IsU0FBUyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDM0YsT0FBTyxFQUNMLGFBQWEsRUFDYixZQUFZLEVBQ1osdUJBQXVCLEVBQ3ZCLG9CQUFvQixFQUVwQixxQkFBcUIsRUFFckIsV0FBVyxFQUNYLE9BQU8sRUFDUixNQUFNLHFCQUFxQixDQUFDO0FBRTdCLE9BQU8sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDbkQsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMvQixPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUNsRixPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNuRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUN2RSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFD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SUFDMUQsQ0FBQzsrR0FqSFUsa0JBQWtCO21HQUFsQixrQkFBa0Isb0pBT2xCLG1CQUFtQixxRUMzRGhDLHF3Q0E2Q0EsNENETEkscUJBQXFCLGlGQUNyQixjQUFjLGtJQUNkLGFBQWEsOEJBQ2IsWUFBWSwyUEFDWixXQUFXLDhCQUNYLGtCQUFrQiw4QkFDbEIsU0FBUywrYkFFVCxhQUFhLCtCQUNiLFVBQVU7OzRGQUdELGtCQUFrQjtrQkFqQjlCLFNBQVM7K0JBQ0UsZ0JBQWdCLGNBRWQsSUFBSSxXQUNQO3dCQUNQLHFCQUFxQjt3QkFDckIsY0FBYzt3QkFDZCxhQUFhO3dCQUNiLFlBQVk7d0JBQ1osV0FBVzt3QkFDWCxrQkFBa0I7d0JBQ2xCLFNBQVM7d0JBQ1QsYUFBYTt3QkFDYixhQUFhO3dCQUNiLFVBQVU7cUJBQ1g7OzBCQXNCRSxRQUFRO3dFQWZGLE1BQU07c0JBQWQsS0FBSztnQkFHTixVQUFVO3NCQURULFNBQVM7dUJBQUMsbUJBQW1CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgQ29tcG9uZW50LFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgT3B0aW9uYWwsXG4gIFNpbXBsZUNoYW5nZXMsXG4gIFZpZXdDaGlsZFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSBhcyBOZ0NvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBGb3Jtc01vZHVsZSBhcyBOZ0Zvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgSU1hbmFnZWRPYmplY3QsIEludmVudG9yeVNlcnZpY2UgfSBmcm9tICdAYzh5L2NsaWVudCc7XG5pbXBvcnQgeyBDbHVzdGVyTWFwQ29tcG9uZW50LCBDbHVzdGVyTWFwQ29uZmlnLCBNYXBNb2R1bGUgfSBmcm9tICdAYzh5L25neC1jb21wb25lbnRzL21hcCc7XG5pbXBvcnQge1xuICBBc3NldExpbmtQaXBlLFxuICBDb21tb25Nb2R1bGUsXG4gIERhc2hib2FyZENoaWxkQ29tcG9uZW50LFxuICBEaXNtaXNzQWxlcnRTdHJhdGVneSxcbiAgRHluYW1pY0NvbXBvbmVudCxcbiAgRHluYW1pY0NvbXBvbmVudEFsZXJ0LFxuICBEeW5hbWljQ29tcG9uZW50QWxlcnRBZ2dyZWdhdG9yLFxuICBGb3Jtc01vZHVsZSxcbiAgZ2V0dGV4dFxufSBmcm9tICdAYzh5L25neC1jb21wb25lbnRzJztcbmltcG9ydCB7IE1hcFdpZGdldENvbmZpZyB9IGZyb20gJy4vbWFwLXdpZGdldC5tb2RlbCc7XG5pbXBvcnQgeyBmaWx0ZXIsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IENvbnRleHREYXNoYm9hcmRDb21wb25lbnQgfSBmcm9tICdAYzh5L25neC1jb21wb25lbnRzL2NvbnRleHQtZGFzaGJvYXJkJztcbmltcG9ydCB7IE1hcEV2ZW50SW5mb0NvbXBvbmVudCB9IGZyb20gJy4vbWFwLWV2ZW50LWluZm8uY29tcG9uZW50JztcbmltcG9ydCB7IEljb25TZWxlY3Rvck1vZHVsZSB9IGZyb20gJ0BjOHkvbmd4LWNvbXBvbmVudHMvaWNvbi1zZWxlY3Rvcic7XG5pbXBvcnQgeyBUb29sdGlwTW9kdWxlIH0gZnJvbSAnbmd4LWJvb3RzdHJhcC90b29sdGlwJztcbmltcG9ydCB7IFJvdXRlckxpbmsgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjOHktbWFwLXdpZGdldCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9tYXAtd2lkZ2V0LmNvbXBvbmVudC5odG1sJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIE1hcEV2ZW50SW5mb0NvbXBvbmVudCxcbiAgICBOZ0NvbW1vbk1vZHVsZSxcbiAgICBOZ0Zvcm1zTW9kdWxlLFxuICAgIENvbW1vbk1vZHVsZSxcbiAgICBGb3Jtc01vZHVsZSxcbiAgICBJY29uU2VsZWN0b3JNb2R1bGUsXG4gICAgTWFwTW9kdWxlLFxuICAgIEFzc2V0TGlua1BpcGUsXG4gICAgVG9vbHRpcE1vZHVsZSxcbiAgICBSb3V0ZXJMaW5rXG4gIF1cbn0pXG5leHBvcnQgY2xhc3MgTWFwV2lkZ2V0Q29tcG9uZW50XG4gIGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMsIE9uRGVzdHJveSwgQWZ0ZXJWaWV3SW5pdCwgRHluYW1pY0NvbXBvbmVudFxue1xuICBtYXBDb25maWc6IENsdXN0ZXJNYXBDb25maWcgPSB7IGNlbnRlcjogWzAsIDBdIH07XG4gIHJvb3ROb2RlOiBJTWFuYWdlZE9iamVjdDtcbiAgQElucHV0KCkgY29uZmlnOiBNYXBXaWRnZXRDb25maWc7XG5cbiAgQFZpZXdDaGlsZChDbHVzdGVyTWFwQ29tcG9uZW50KVxuICBjbHVzdGVyTWFwOiBDbHVzdGVyTWFwQ29tcG9uZW50O1xuICBhbGVydHM6IER5bmFtaWNDb21wb25lbnRBbGVydEFnZ3JlZ2F0b3I7XG5cbiAgcHJpdmF0ZSBUSU1FT1VUX0VSUk9SX1RFWFQgPSBnZXR0ZXh0KFxuICAgICdUaGUgcmVxdWVzdCBpcyB0YWtpbmcgbG9uZ2VyIHRoYW4gdXN1YWwuIFdlIGFwb2xvZ2l6ZSBmb3IgdGhlIGluY29udmVuaWVuY2UuJ1xuICApO1xuICBwcml2YXRlIFNFUlZFUl9FUlJPUl9URVhUID0gZ2V0dGV4dCgnU2VydmVyIGVycm9yIG9jY3VycmVkLicpO1xuICBwcml2YXRlIHNhdmVkTm9kZTogSU1hbmFnZWRPYmplY3Q7XG4gIHByaXZhdGUgZGVzdHJveSQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIGRhc2hib2FyZENoaWxkOiBEYXNoYm9hcmRDaGlsZENvbXBvbmVudCxcbiAgICBAT3B0aW9uYWwoKSBwcml2YXRlIGRhc2hib2FyZENvbnRleHRDb21wb25lbnQ6IENvbnRleHREYXNoYm9hcmRDb21wb25lbnQsXG4gICAgcHJpdmF0ZSBpbnZlbnRvcnk6IEludmVudG9yeVNlcnZpY2VcbiAgKSB7XG4gICAgdGhpcy5saXN0ZW5Ub1dpZGdldFJlc2l6ZUV2ZW50KGRhc2hib2FyZENoaWxkKTtcbiAgfVxuXG4gIGFzeW5jIG5nT25Jbml0KCkge1xuICAgIHRoaXMuYWxlcnRzLnNldEFsZXJ0R3JvdXBEaXNtaXNzU3RyYXRlZ3koXG4gICAgICAnd2FybmluZycsXG4gICAgICBEaXNtaXNzQWxlcnRTdHJhdGVneS5URU1QT1JBUllfT1JfUEVSTUFORU5UXG4gICAgKTtcbiAgICBpZiAodGhpcy5kYXNoYm9hcmRDb250ZXh0Q29tcG9uZW50Py5kYXNoYm9hcmQ/LmRldmljZVR5cGUgJiYgIXRoaXMuY29uZmlnLmRldmljZSkge1xuICAgICAgY29uc3QgY29udGV4dCA9IHRoaXMuZGFzaGJvYXJkQ29udGV4dENvbXBvbmVudC5jb250ZXh0O1xuICAgICAgaWYgKGNvbnRleHQ/LmlkKSB7XG4gICAgICAgIGNvbnN0IHsgaWQgfSA9IGNvbnRleHQ7XG4gICAgICAgIHRoaXMuY29uZmlnLmRldmljZSA9IChhd2FpdCB0aGlzLmludmVudG9yeS5kZXRhaWwoaWQpKS5kYXRhO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAodGhpcy5jb25maWcuZGV2aWNlKSB7XG4gICAgICB0aGlzLnJvb3ROb2RlID0gdGhpcy5jb25maWcuZGV2aWNlO1xuICAgIH1cbiAgICB0aGlzLm1hcENvbmZpZyA9IHsgLi4udGhpcy5jb25maWcubWFwQ29uZmlnIH07XG4gICAgaWYgKHRoaXMuY29uZmlnLndpZGdldEluc3RhbmNlR2xvYmFsVGltZUNvbnRleHQpIHtcbiAgICAgIHRoaXMudXBkYXRlTWFwQ29uZmlnUmVhbHRpbWUoKTtcbiAgICB9XG4gICAgdGhpcy5zYXZlZE5vZGUgPSB0aGlzLnJvb3ROb2RlO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xuICAgIGlmIChjaGFuZ2VzLmNvbmZpZz8uY3VycmVudFZhbHVlPy53aWRnZXRJbnN0YW5jZUdsb2JhbFRpbWVDb250ZXh0KSB7XG4gICAgICB0aGlzLnVwZGF0ZU1hcENvbmZpZ1JlYWx0aW1lKCk7XG4gICAgfVxuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIHRoaXMuc3Vic2NyaWJlVG9FcnJvcnNPY2N1cnJlZCgpO1xuICB9XG5cbiAgc3RhcnRGb2xsb3coY29udGV4dCkge1xuICAgIGlmIChjb250ZXh0LmlkICE9PSB0aGlzLnJvb3ROb2RlPy5pZCkge1xuICAgICAgdGhpcy5yb290Tm9kZSA9IGNvbnRleHQ7XG4gICAgfVxuICAgIHRoaXMubWFwQ29uZmlnID0ge1xuICAgICAgLi4udGhpcy5jb25maWcubWFwQ29uZmlnLFxuICAgICAgZm9sbG93OiB0cnVlLFxuICAgICAgcmVhbHRpbWU6IHRydWVcbiAgICB9O1xuICB9XG5cbiAgc3RvcEZvbGxvdygpIHtcbiAgICB0aGlzLm1hcENvbmZpZyA9IHtcbiAgICAgIC4uLnRoaXMuY29uZmlnLm1hcENvbmZpZyxcbiAgICAgIGZvbGxvdzogZmFsc2VcbiAgICB9O1xuICAgIGlmICh0aGlzLmNvbmZpZy53aWRnZXRJbnN0YW5jZUdsb2JhbFRpbWVDb250ZXh0KSB7XG4gICAgICB0aGlzLnVwZGF0ZU1hcENvbmZpZ1JlYWx0aW1lKCk7XG4gICAgfVxuICAgIHRoaXMucm9vdE5vZGUgPSB0aGlzLnNhdmVkTm9kZTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuZGVzdHJveSQubmV4dCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBsaXN0ZW5Ub1dpZGdldFJlc2l6ZUV2ZW50KGRhc2hib2FyZENoaWxkOiBEYXNoYm9hcmRDaGlsZENvbXBvbmVudCkge1xuICAgIGRhc2hib2FyZENoaWxkLmNoYW5nZUVuZFxuICAgICAgLnBpcGUoXG4gICAgICAgIGZpbHRlcihjaGlsZCA9PiBjaGlsZC5sYXN0Q2hhbmdlID09PSAncmVzaXplJyksXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMuY2x1c3Rlck1hcC5yZXNldCgpO1xuICAgICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHN1YnNjcmliZVRvRXJyb3JzT2NjdXJyZWQoKSB7XG4gICAgdGhpcy5jbHVzdGVyTWFwLmVycm9yTm90aWZpZXJcbiAgICAgIC5waXBlKGZpbHRlcihCb29sZWFuKSwgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxuICAgICAgLnN1YnNjcmliZShlcnJvciA9PiB7XG4gICAgICAgIHRoaXMuYWxlcnRzLmFkZEFsZXJ0cyhcbiAgICAgICAgICBuZXcgRHluYW1pY0NvbXBvbmVudEFsZXJ0KHtcbiAgICAgICAgICAgIHR5cGU6ICd3YXJuaW5nJyxcbiAgICAgICAgICAgIHRleHQ6XG4gICAgICAgICAgICAgIGVycm9yPy5uYW1lID09PSAnVGltZW91dEVycm9yJ1xuICAgICAgICAgICAgICAgID8gdGhpcy5USU1FT1VUX0VSUk9SX1RFWFRcbiAgICAgICAgICAgICAgICA6IGVycm9yPy5tZXNzYWdlID8/IHRoaXMuU0VSVkVSX0VSUk9SX1RFWFRcbiAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZU1hcENvbmZpZ1JlYWx0aW1lKCkge1xuICAgIHRoaXMubWFwQ29uZmlnLnJlYWx0aW1lID0gdGhpcy5jb25maWcucmVhbHRpbWUgfHwgZmFsc2U7XG4gIH1cbn1cbiIsIjxjOHktbWFwLXN0YXR1c1xuICBbY2x1c3Rlck1hcF09XCJtYXBXaWRnZXRcIlxuICBbKGNvbmZpZyldPVwibWFwQ29uZmlnXCJcbiAgKG9uVW5mb2xsb3cpPVwic3RvcEZvbGxvdygpXCJcbiAgW2J1dHRvbnNDb25maWddPVwiY29uZmlnLndpZGdldEluc3RhbmNlR2xvYmFsVGltZUNvbnRleHQgPyB7IHJlYWx0aW1lOiB7IHNob3c6IGZhbHNlIH0gfSA6IG51bGxcIlxuPjwvYzh5LW1hcC1zdGF0dXM+XG48Yzh5LWNsdXN0ZXItbWFwXG4gICNtYXBXaWRnZXRcbiAgW3Jvb3ROb2RlXT1cInJvb3ROb2RlXCJcbiAgW2NvbmZpZ109XCJtYXBDb25maWdcIlxuPlxuICA8ZGl2XG4gICAgY2xhc3M9XCJtYXAtbWFya2VyXCJcbiAgICAqYzh5TWFwUG9wdXA9XCJsZXQgY29udGV4dFwiXG4gID5cbiAgICA8YVxuICAgICAgY2xhc3M9XCJ0ZXh0LXRydW5jYXRlIGRldmljZUxpbmsgdGV4dC0xMlwiXG4gICAgICByb3V0ZXJMaW5rPVwie3sgY29udGV4dCB8IGFzc2V0TGluayB9fVwiXG4gICAgPlxuICAgICAgPHN0cm9uZz57eyBjb250ZXh0Lm5hbWUgfX08L3N0cm9uZz5cbiAgICA8L2E+XG4gICAgPGM4eS1tYXAtZXZlbnQtaW5mbyBbYXNzZXRdPVwiY29udGV4dFwiPlxuICAgICAgPGJ1dHRvblxuICAgICAgICBjbGFzcz1cImJ0biBidG4tZGVmYXVsdCBidG4teHMgYnRuLWJsb2NrIG0tdC04XCJcbiAgICAgICAgW3RpdGxlXT1cIidBY3RpdmF0ZSByZWFsdGltZSBvbiB0aGlzIGFzc2V0IGFuZCBmb2xsb3cgaXQgaWYgaXQgbW92ZXMnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgIChjbGljayk9XCJzdGFydEZvbGxvdyhjb250ZXh0KVwiXG4gICAgICAgICpuZ0lmPVwiIW1hcENvbmZpZy5mb2xsb3dcIlxuICAgICAgICB0cmFuc2xhdGVcbiAgICAgID5cbiAgICAgICAgRm9sbG93XG4gICAgICA8L2J1dHRvbj5cbiAgICAgIDxidXR0b25cbiAgICAgICAgY2xhc3M9XCJidG4gYnRuLWRlZmF1bHQgYnRuLXhzIGJ0bi1ibG9jayBtLXQtOFwiXG4gICAgICAgIFt0aXRsZV09XCInU3RvcCBmb2xsb3dpbmcgdGhpcyBhc3NldC4nIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgIChjbGljayk9XCJzdG9wRm9sbG93KClcIlxuICAgICAgICAqbmdJZj1cIm1hcENvbmZpZy5mb2xsb3dcIlxuICAgICAgICB0cmFuc2xhdGVcbiAgICAgID5cbiAgICAgICAgVW5mb2xsb3dcbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvYzh5LW1hcC1ldmVudC1pbmZvPlxuICA8L2Rpdj5cbjwvYzh5LWNsdXN0ZXItbWFwPlxuIl19
|
|
155
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFwLXdpZGdldC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi93aWRnZXRzL2ltcGxlbWVudGF0aW9ucy9tYXAvbWFwLXdpZGdldC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi93aWRnZXRzL2ltcGxlbWVudGF0aW9ucy9tYXAvbWFwLXdpZGdldC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsU0FBUyxFQUNULEtBQUssRUFJTCxRQUFRLEVBRVIsU0FBUyxFQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxZQUFZLElBQUksY0FBYyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDakUsT0FBTyxFQUFFLFdBQVcsSUFBSSxhQUFhLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM5RCxPQUFPLEVBQWtCLGdCQUFnQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQy9ELE9BQU8sRUFDTCxtQkFBbUIsRUFFbkIsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxVQUFVLEVBRVgsTUFBTSx5QkFBeUIsQ0FBQztBQUNqQyxPQUFPLEVBQ0wsYUFBYSxFQUNiLFlBQVksRUFDWix1QkFBdUIsRUFDdkIsb0JBQW9CLEVBRXBCLHFCQUFxQixFQUVyQixXQUFXLEVBQ1gsT0FBTyxFQUNQLHlCQUF5QixFQUMxQixNQUFNLHFCQUFxQixDQUFDO0FBRTdCLE9BQU8sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDbkQsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMvQixPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUNsRixPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNuRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUN2RSxPQUFP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a0JBQWtCO29CQUN6QixDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsT0FBTyxJQUFJLElBQUksQ0FBQyxpQkFBaUIsQ0FBQzthQUNqRCxDQUFDLENBQ0gsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVPLHVCQUF1QjtRQUM3QixJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsSUFBSSxLQUFLLENBQUM7SUFDMUQsQ0FBQzsrR0FuSlUsa0JBQWtCO21HQUFsQixrQkFBa0Isb0pBT2xCLG1CQUFtQixxRUNwRWhDLHEwQ0ErQ0EsNENERUkscUJBQXFCLGlGQUNyQixjQUFjLGtJQUNkLGFBQWEsOEJBQ2IsWUFBWSwyUEFDWixXQUFXLDhCQUNYLGtCQUFrQiw4QkFDbEIsU0FBUyw4ZEFFVCxhQUFhLCtCQUNiLFVBQVU7OzRGQUdELGtCQUFrQjtrQkFqQjlCLFNBQVM7K0JBQ0UsZ0JBQWdCLGNBRWQsSUFBSSxXQUNQO3dCQUNQLHFCQUFxQjt3QkFDckIsY0FBYzt3QkFDZCxhQUFhO3dCQUNiLFlBQVk7d0JBQ1osV0FBVzt3QkFDWCxrQkFBa0I7d0JBQ2xCLFNBQVM7d0JBQ1QsYUFBYTt3QkFDYixhQUFhO3dCQUNiLFVBQVU7cUJBQ1g7OzBCQXdCRSxRQUFROzswQkFHUixRQUFRO3lDQXBCRixNQUFNO3NCQUFkLEtBQUs7Z0JBR04sVUFBVTtzQkFEVCxTQUFTO3VCQUFDLG1CQUFtQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEFmdGVyVmlld0luaXQsXG4gIENvbXBvbmVudCxcbiAgSW5wdXQsXG4gIE9uQ2hhbmdlcyxcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG4gIE9wdGlvbmFsLFxuICBTaW1wbGVDaGFuZ2VzLFxuICBWaWV3Q2hpbGRcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgYXMgTmdDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgRm9ybXNNb2R1bGUgYXMgTmdGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IElNYW5hZ2VkT2JqZWN0LCBJbnZlbnRvcnlTZXJ2aWNlIH0gZnJvbSAnQGM4eS9jbGllbnQnO1xuaW1wb3J0IHtcbiAgQ2x1c3Rlck1hcENvbXBvbmVudCxcbiAgQ2x1c3Rlck1hcENvbmZpZyxcbiAgZGVmYXVsdEZpdEJvdW5kc09wdGlvbnMsXG4gIE1hcE1vZHVsZSxcbiAgTWFwU2VydmljZSxcbiAgUG9zaXRpb25NYW5hZ2VkT2JqZWN0XG59IGZyb20gJ0BjOHkvbmd4LWNvbXBvbmVudHMvbWFwJztcbmltcG9ydCB7XG4gIEFzc2V0TGlua1BpcGUsXG4gIENvbW1vbk1vZHVsZSxcbiAgRGFzaGJvYXJkQ2hpbGRDb21wb25lbnQsXG4gIERpc21pc3NBbGVydFN0cmF0ZWd5LFxuICBEeW5hbWljQ29tcG9uZW50LFxuICBEeW5hbWljQ29tcG9uZW50QWxlcnQsXG4gIER5bmFtaWNDb21wb25lbnRBbGVydEFnZ3JlZ2F0b3IsXG4gIEZvcm1zTW9kdWxlLFxuICBnZXR0ZXh0LFxuICBXaWRnZXRzRGFzaGJvYXJkQ29tcG9uZW50XG59IGZyb20gJ0BjOHkvbmd4LWNvbXBvbmVudHMnO1xuaW1wb3J0IHsgTWFwV2lkZ2V0Q29uZmlnIH0gZnJvbSAnLi9tYXAtd2lkZ2V0Lm1vZGVsJztcbmltcG9ydCB7IGZpbHRlciwgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgQ29udGV4dERhc2hib2FyZENvbXBvbmVudCB9IGZyb20gJ0BjOHkvbmd4LWNvbXBvbmVudHMvY29udGV4dC1kYXNoYm9hcmQnO1xuaW1wb3J0IHsgTWFwRXZlbnRJbmZvQ29tcG9uZW50IH0gZnJvbSAnLi9tYXAtZXZlbnQtaW5mby5jb21wb25lbnQnO1xuaW1wb3J0IHsgSWNvblNlbGVjdG9yTW9kdWxlIH0gZnJvbSAnQGM4eS9uZ3gtY29tcG9uZW50cy9pY29uLXNlbGVjdG9yJztcbmltcG9ydCB7IFRvb2x0aXBNb2R1bGUgfSBmcm9tICduZ3gtYm9vdHN0cmFwL3Rvb2x0aXAnO1xuaW1wb3J0IHsgUm91dGVyTGluayB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBkZWJvdW5jZSB9IGZyb20gJ2xvZGFzaC1lcyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2M4eS1tYXAtd2lkZ2V0JyxcbiAgdGVtcGxhdGVVcmw6ICcuL21hcC13aWRnZXQuY29tcG9uZW50Lmh0bWwnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXG4gICAgTWFwRXZlbnRJbmZvQ29tcG9uZW50LFxuICAgIE5nQ29tbW9uTW9kdWxlLFxuICAgIE5nRm9ybXNNb2R1bGUsXG4gICAgQ29tbW9uTW9kdWxlLFxuICAgIEZvcm1zTW9kdWxlLFxuICAgIEljb25TZWxlY3Rvck1vZHVsZSxcbiAgICBNYXBNb2R1bGUsXG4gICAgQXNzZXRMaW5rUGlwZSxcbiAgICBUb29sdGlwTW9kdWxlLFxuICAgIFJvdXRlckxpbmtcbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBNYXBXaWRnZXRDb21wb25lbnRcbiAgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcywgT25EZXN0cm95LCBBZnRlclZpZXdJbml0LCBEeW5hbWljQ29tcG9uZW50XG57XG4gIG1hcENvbmZpZzogQ2x1c3Rlck1hcENvbmZpZyA9IHsgY2VudGVyOiBbMCwgMF0gfTtcbiAgcm9vdE5vZGU6IElNYW5hZ2VkT2JqZWN0O1xuICBASW5wdXQoKSBjb25maWc6IE1hcFdpZGdldENvbmZpZztcblxuICBAVmlld0NoaWxkKENsdXN0ZXJNYXBDb21wb25lbnQpXG4gIGNsdXN0ZXJNYXA6IENsdXN0ZXJNYXBDb21wb25lbnQ7XG4gIGFsZXJ0czogRHluYW1pY0NvbXBvbmVudEFsZXJ0QWdncmVnYXRvcjtcbiAgYXNzZXRzOiBQb3NpdGlvbk1hbmFnZWRPYmplY3RbXTtcblxuICBwcml2YXRlIFRJTUVPVVRfRVJST1JfVEVYVCA9IGdldHRleHQoXG4gICAgJ1RoZSByZXF1ZXN0IGlzIHRha2luZyBsb25nZXIgdGhhbiB1c3VhbC4gV2UgYXBvbG9naXplIGZvciB0aGUgaW5jb252ZW5pZW5jZS4nXG4gICk7XG4gIHByaXZhdGUgU0VSVkVSX0VSUk9SX1RFWFQgPSBnZXR0ZXh0KCdTZXJ2ZXIgZXJyb3Igb2NjdXJyZWQuJyk7XG4gIHByaXZhdGUgc2F2ZWROb2RlOiBJTWFuYWdlZE9iamVjdDtcbiAgcHJpdmF0ZSBkZXN0cm95JCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG4gIHByaXZhdGUgcmVzaXplT2JzZXJ2ZXI6IFJlc2l6ZU9ic2VydmVyO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIGRhc2hib2FyZENoaWxkOiBEYXNoYm9hcmRDaGlsZENvbXBvbmVudCxcbiAgICBAT3B0aW9uYWwoKSBwcml2YXRlIGRhc2hib2FyZENvbnRleHRDb21wb25lbnQ6IENvbnRleHREYXNoYm9hcmRDb21wb25lbnQsXG4gICAgcHJpdmF0ZSBpbnZlbnRvcnk6IEludmVudG9yeVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBtYXBTZXJ2aWNlOiBNYXBTZXJ2aWNlLFxuICAgIEBPcHRpb25hbCgpIHByaXZhdGUgd2lkZ2V0c0Rhc2hib2FyZENvbXBvbmVudDogV2lkZ2V0c0Rhc2hib2FyZENvbXBvbmVudFxuICApIHtcbiAgICB0aGlzLmxpc3RlblRvV2lkZ2V0UmVzaXplRXZlbnQoZGFzaGJvYXJkQ2hpbGQpO1xuICB9XG5cbiAgYXN5bmMgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5hbGVydHMuc2V0QWxlcnRHcm91cERpc21pc3NTdHJhdGVneShcbiAgICAgICd3YXJuaW5nJyxcbiAgICAgIERpc21pc3NBbGVydFN0cmF0ZWd5LlRFTVBPUkFSWV9PUl9QRVJNQU5FTlRcbiAgICApO1xuICAgIGlmICh0aGlzLmRhc2hib2FyZENvbnRleHRDb21wb25lbnQ/LmRhc2hib2FyZD8uZGV2aWNlVHlwZSAmJiAhdGhpcy5jb25maWcuZGV2aWNlKSB7XG4gICAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5kYXNoYm9hcmRDb250ZXh0Q29tcG9uZW50LmNvbnRleHQ7XG4gICAgICBpZiAoY29udGV4dD8uaWQpIHtcbiAgICAgICAgY29uc3QgeyBpZCB9ID0gY29udGV4dDtcbiAgICAgICAgdGhpcy5jb25maWcuZGV2aWNlID0gKGF3YWl0IHRoaXMuaW52ZW50b3J5LmRldGFpbChpZCkpLmRhdGE7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh0aGlzLmNvbmZpZy5kZXZpY2UpIHtcbiAgICAgIHRoaXMucm9vdE5vZGUgPSB0aGlzLmNvbmZpZy5kZXZpY2U7XG4gICAgfVxuICAgIHRoaXMubWFwQ29uZmlnID0geyAuLi50aGlzLmNvbmZpZy5tYXBDb25maWcgfTtcbiAgICBpZiAodGhpcy5jb25maWcud2lkZ2V0SW5zdGFuY2VHbG9iYWxUaW1lQ29udGV4dCkge1xuICAgICAgdGhpcy51cGRhdGVNYXBDb25maWdSZWFsdGltZSgpO1xuICAgIH1cbiAgICB0aGlzLnNhdmVkTm9kZSA9IHRoaXMucm9vdE5vZGU7XG4gICAgYXdhaXQgdGhpcy51cGRhdGVBc3NldHMoKTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcbiAgICBpZiAoY2hhbmdlcy5jb25maWc/LmN1cnJlbnRWYWx1ZT8ud2lkZ2V0SW5zdGFuY2VHbG9iYWxUaW1lQ29udGV4dCkge1xuICAgICAgdGhpcy51cGRhdGVNYXBDb25maWdSZWFsdGltZSgpO1xuICAgIH1cbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLnN1YnNjcmliZVRvRXJyb3JzT2NjdXJyZWQoKTtcblxuICAgIGlmICh0aGlzLndpZGdldHNEYXNoYm9hcmRDb21wb25lbnQpIHtcbiAgICAgIGNvbnN0IHJlc2l6ZUNhbGxiYWNrID0gZGVib3VuY2UoKCkgPT4ge1xuICAgICAgICAvLyBpbml0aWFsIHNpemUgb2YgbWFwIGlzIGFzc2lnbmVkIHdoZW4gbGVmdCBkcmF3ZXIgaXMgY2xvc2VkLCBidXQgaWYgaXQgaXMgb3BlbmVkIGFmdGVyIGluaXRpYWxpemF0aW9uXG4gICAgICAgIC8vIHRoZSBtYXAgc2l6ZSBpcyBub3QgdXBkYXRlZCwgc28gd2UgbmVlZCB0byBjYWxsIGludmFsaWRhdGVTaXplIHNvIHRoYXQgbWFwIHVzZSB0aGUgY29ycmVjdCBzaXplXG4gICAgICAgIHRoaXMuY2x1c3Rlck1hcC5tYXA/LmludmFsaWRhdGVTaXplKGZhbHNlKTtcbiAgICAgIH0sIDEwMCk7XG4gICAgICB0aGlzLnJlc2l6ZU9ic2VydmVyID0gbmV3IFJlc2l6ZU9ic2VydmVyKHJlc2l6ZUNhbGxiYWNrKTtcblxuICAgICAgdGhpcy5yZXNpemVPYnNlcnZlci5vYnNlcnZlKHRoaXMud2lkZ2V0c0Rhc2hib2FyZENvbXBvbmVudC5uYXRpdmVFbGVtZW50KTtcbiAgICB9XG4gIH1cblxuICBzdGFydEZvbGxvdyhjb250ZXh0KSB7XG4gICAgaWYgKGNvbnRleHQuaWQgIT09IHRoaXMucm9vdE5vZGU/LmlkKSB7XG4gICAgICB0aGlzLnJvb3ROb2RlID0gY29udGV4dDtcbiAgICB9XG4gICAgdGhpcy5tYXBDb25maWcgPSB7XG4gICAgICAuLi50aGlzLmNvbmZpZy5tYXBDb25maWcsXG4gICAgICBmb2xsb3c6IHRydWUsXG4gICAgICByZWFsdGltZTogdHJ1ZVxuICAgIH07XG4gIH1cblxuICBzdG9wRm9sbG93KCkge1xuICAgIHRoaXMubWFwQ29uZmlnID0ge1xuICAgICAgLi4udGhpcy5jb25maWcubWFwQ29uZmlnLFxuICAgICAgZm9sbG93OiBmYWxzZVxuICAgIH07XG4gICAgaWYgKHRoaXMuY29uZmlnLndpZGdldEluc3RhbmNlR2xvYmFsVGltZUNvbnRleHQpIHtcbiAgICAgIHRoaXMudXBkYXRlTWFwQ29uZmlnUmVhbHRpbWUoKTtcbiAgICB9XG4gICAgdGhpcy5yb290Tm9kZSA9IHRoaXMuc2F2ZWROb2RlO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucmVzaXplT2JzZXJ2ZXIpIHtcbiAgICAgIHRoaXMucmVzaXplT2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuICAgIH1cbiAgICB0aGlzLmRlc3Ryb3kkLm5leHQoKTtcbiAgfVxuXG4gIGFzeW5jIGZpdFRvQm91bmRzKCkge1xuICAgIGF3YWl0IHRoaXMudXBkYXRlQXNzZXRzKCk7XG4gICAgaWYgKHRoaXMuYXNzZXRzLmxlbmd0aCA9PT0gMCB8fCAhdGhpcy5jbHVzdGVyTWFwPy5tYXApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBib3VuZHMgPSBhd2FpdCB0aGlzLm1hcFNlcnZpY2UuZ2V0QXNzZXRzQm91bmRzKHRoaXMuYXNzZXRzKTtcblxuICAgIHRoaXMuY2x1c3Rlck1hcC5tYXAuZml0Qm91bmRzKGJvdW5kcywgZGVmYXVsdEZpdEJvdW5kc09wdGlvbnMpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyB1cGRhdGVBc3NldHMoKSB7XG4gICAgdGhpcy5hc3NldHMgPSAoYXdhaXQgdGhpcy5tYXBTZXJ2aWNlLmdldEFsbFBvc2l0aW9uTU9zKHRoaXMuY29uZmlnLmRldmljZSkpLmRhdGE7XG4gIH1cblxuICBwcml2YXRlIGxpc3RlblRvV2lkZ2V0UmVzaXplRXZlbnQoZGFzaGJvYXJkQ2hpbGQ6IERhc2hib2FyZENoaWxkQ29tcG9uZW50KSB7XG4gICAgZGFzaGJvYXJkQ2hpbGQuY2hhbmdlRW5kXG4gICAgICAucGlwZShcbiAgICAgICAgZmlsdGVyKGNoaWxkID0+IGNoaWxkLmxhc3RDaGFuZ2UgPT09ICdyZXNpemUnKSxcbiAgICAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy5jbHVzdGVyTWFwLnJlc2V0KCk7XG4gICAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgc3Vic2NyaWJlVG9FcnJvcnNPY2N1cnJlZCgpIHtcbiAgICB0aGlzLmNsdXN0ZXJNYXAuZXJyb3JOb3RpZmllclxuICAgICAgLnBpcGUoZmlsdGVyKEJvb2xlYW4pLCB0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXG4gICAgICAuc3Vic2NyaWJlKGVycm9yID0+IHtcbiAgICAgICAgdGhpcy5hbGVydHMuYWRkQWxlcnRzKFxuICAgICAgICAgIG5ldyBEeW5hbWljQ29tcG9uZW50QWxlcnQoe1xuICAgICAgICAgICAgdHlwZTogJ3dhcm5pbmcnLFxuICAgICAgICAgICAgdGV4dDpcbiAgICAgICAgICAgICAgZXJyb3I/Lm5hbWUgPT09ICdUaW1lb3V0RXJyb3InXG4gICAgICAgICAgICAgICAgPyB0aGlzLlRJTUVPVVRfRVJST1JfVEVYVFxuICAgICAgICAgICAgICAgIDogKGVycm9yPy5tZXNzYWdlID8/IHRoaXMuU0VSVkVSX0VSUk9SX1RFWFQpXG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVNYXBDb25maWdSZWFsdGltZSgpIHtcbiAgICB0aGlzLm1hcENvbmZpZy5yZWFsdGltZSA9IHRoaXMuY29uZmlnLnJlYWx0aW1lIHx8IGZhbHNlO1xuICB9XG59XG4iLCI8Yzh5LW1hcC1zdGF0dXNcbiAgW2NsdXN0ZXJNYXBdPVwibWFwV2lkZ2V0XCJcbiAgWyhjb25maWcpXT1cIm1hcENvbmZpZ1wiXG4gIChvblVuZm9sbG93KT1cInN0b3BGb2xsb3coKVwiXG4gIChmaXRBc3NldHNUb0JvdW5kcyk9XCJmaXRUb0JvdW5kcygpXCJcbiAgW2J1dHRvbnNDb25maWddPVwiY29uZmlnLndpZGdldEluc3RhbmNlR2xvYmFsVGltZUNvbnRleHQgPyB7IHJlYWx0aW1lOiB7IHNob3c6IGZhbHNlIH0gfSA6IG51bGxcIlxuICBbYXNzZXRzXT1cImFzc2V0c1wiXG4+PC9jOHktbWFwLXN0YXR1cz5cbjxjOHktY2x1c3Rlci1tYXBcbiAgI21hcFdpZGdldFxuICBbcm9vdE5vZGVdPVwicm9vdE5vZGVcIlxuICBbY29uZmlnXT1cIm1hcENvbmZpZ1wiXG4+XG4gIDxkaXZcbiAgICBjbGFzcz1cIm1hcC1tYXJrZXJcIlxuICAgICpjOHlNYXBQb3B1cD1cImxldCBjb250ZXh0XCJcbiAgPlxuICAgIDxhXG4gICAgICBjbGFzcz1cInRleHQtdHJ1bmNhdGUgZGV2aWNlTGluayB0ZXh0LTEyXCJcbiAgICAgIHJvdXRlckxpbms9XCJ7eyBjb250ZXh0IHwgYXNzZXRMaW5rIH19XCJcbiAgICA+XG4gICAgICA8c3Ryb25nPnt7IGNvbnRleHQubmFtZSB9fTwvc3Ryb25nPlxuICAgIDwvYT5cbiAgICA8Yzh5LW1hcC1ldmVudC1pbmZvIFthc3NldF09XCJjb250ZXh0XCI+XG4gICAgICA8YnV0dG9uXG4gICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1kZWZhdWx0IGJ0bi14cyBidG4tYmxvY2sgbS10LThcIlxuICAgICAgICBbdGl0bGVdPVwiJ0FjdGl2YXRlIHJlYWx0aW1lIG9uIHRoaXMgYXNzZXQgYW5kIGZvbGxvdyBpdCBpZiBpdCBtb3ZlcycgfCB0cmFuc2xhdGVcIlxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgKGNsaWNrKT1cInN0YXJ0Rm9sbG93KGNvbnRleHQpXCJcbiAgICAgICAgKm5nSWY9XCIhbWFwQ29uZmlnLmZvbGxvd1wiXG4gICAgICAgIHRyYW5zbGF0ZVxuICAgICAgPlxuICAgICAgICBGb2xsb3dcbiAgICAgIDwvYnV0dG9uPlxuICAgICAgPGJ1dHRvblxuICAgICAgICBjbGFzcz1cImJ0biBidG4tZGVmYXVsdCBidG4teHMgYnRuLWJsb2NrIG0tdC04XCJcbiAgICAgICAgW3RpdGxlXT1cIidTdG9wIGZvbGxvd2luZyB0aGlzIGFzc2V0LicgfCB0cmFuc2xhdGVcIlxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgKGNsaWNrKT1cInN0b3BGb2xsb3coKVwiXG4gICAgICAgICpuZ0lmPVwibWFwQ29uZmlnLmZvbGxvd1wiXG4gICAgICAgIHRyYW5zbGF0ZVxuICAgICAgPlxuICAgICAgICBVbmZvbGxvd1xuICAgICAgPC9idXR0b24+XG4gICAgPC9jOHktbWFwLWV2ZW50LWluZm8+XG4gIDwvZGl2PlxuPC9jOHktY2x1c3Rlci1tYXA+XG4iXX0=
|
|
@@ -18,10 +18,13 @@ class SupportsBrandingService {
|
|
|
18
18
|
this.node = new NavigatorNode({
|
|
19
19
|
featureId: 'branding-editor',
|
|
20
20
|
label: 'Branding',
|
|
21
|
-
|
|
21
|
+
// will be redirected to the branding-editor route
|
|
22
|
+
// TODO: change back to branding-editor when angular JS implementation is removed (1022.0.0)
|
|
23
|
+
path: 'branding',
|
|
22
24
|
icon: 'palette',
|
|
23
25
|
parent: 'Settings',
|
|
24
|
-
routerLinkExact: false
|
|
26
|
+
routerLinkExact: false,
|
|
27
|
+
preventDuplicates: true
|
|
25
28
|
});
|
|
26
29
|
}
|
|
27
30
|
get() {
|