@c8y/ngx-components 1020.28.11 → 1020.33.1
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/bookmarks/bookmarks.service.d.ts +3 -2
- package/bookmarks/bookmarks.service.d.ts.map +1 -1
- package/context-dashboard/context-dashboard.service.d.ts.map +1 -1
- package/context-dashboard/device-info-dashboard/device-info-dashboard.component.d.ts.map +1 -1
- package/core/common/common.module.d.ts +2 -2
- package/core/common/humanize-app-name.model.d.ts +2 -2
- package/core/common/humanize-app-name.pipe.d.ts.map +1 -1
- package/core/dashboard/dashboard.model.d.ts +1 -0
- package/core/dashboard/dashboard.model.d.ts.map +1 -1
- package/core/dashboard/widgets-dashboard.component.d.ts +1 -0
- package/core/dashboard/widgets-dashboard.component.d.ts.map +1 -1
- package/core/data-grid/data-grid.model.d.ts +1 -1
- package/core/data-grid/data-grid.model.d.ts.map +1 -1
- package/core/data-grid/visible-controls.pipe.d.ts +3 -2
- package/core/data-grid/visible-controls.pipe.d.ts.map +1 -1
- package/esm2022/bookmarks/bookmarks.service.mjs +9 -7
- package/esm2022/context-dashboard/context-dashboard.service.mjs +6 -3
- package/esm2022/context-dashboard/device-info-dashboard/device-info-dashboard.component.mjs +39 -3
- package/esm2022/core/common/common.module.mjs +3 -3
- package/esm2022/core/common/humanize-app-name.model.mjs +3 -3
- package/esm2022/core/common/humanize-app-name.pipe.mjs +6 -5
- package/esm2022/core/dashboard/dashboard.model.mjs +2 -2
- package/esm2022/core/dashboard/widgets-dashboard.component.mjs +12 -3
- package/esm2022/core/data-grid/data-grid.component.mjs +3 -3
- package/esm2022/core/data-grid/data-grid.model.mjs +1 -1
- package/esm2022/core/data-grid/visible-controls.pipe.mjs +5 -4
- package/esm2022/core/docs/defaults.items.mjs +2 -2
- package/esm2022/protocol-opcua/opcua-device-protocol-data-reporting.component.mjs +3 -3
- package/esm2022/repository/configuration/list/configuration-list.component.mjs +107 -60
- package/esm2022/repository/shared/columns/device-type.cell-renderer.component.mjs +7 -3
- package/esm2022/repository/shared/columns/device-type.grid-column.mjs +2 -2
- package/esm2022/repository/shared/columns/file.cell-renderer.component.mjs +39 -0
- package/esm2022/repository/shared/columns/file.grid-column.mjs +13 -0
- package/esm2022/repository/shared/columns/name.cell-renderer.component.mjs +26 -5
- package/esm2022/repository/shared/columns/name.grid-column.mjs +1 -1
- package/esm2022/repository/shared/columns/type.cell-renderer.component.mjs +18 -0
- package/esm2022/repository/shared/columns/type.filtering-form-renderer.component.mjs +115 -0
- package/esm2022/repository/shared/columns/type.grid-column.mjs +29 -0
- package/esm2022/repository/shared/index.mjs +10 -1
- package/esm2022/repository/software/list/software-list.component.mjs +9 -4
- package/esm2022/repository/software/list/software-repository-list.module.mjs +3 -15
- package/esm2022/widgets/definitions/device-management-welcome/index.mjs +2 -2
- package/esm2022/widgets/implementations/info-gauge/info-gauge-widget-view/info-gauge-widget-view.component.mjs +22 -5
- package/fesm2022/c8y-ngx-components-bookmarks.mjs +7 -5
- package/fesm2022/c8y-ngx-components-bookmarks.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-context-dashboard.mjs +43 -4
- package/fesm2022/c8y-ngx-components-context-dashboard.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-protocol-opcua.mjs +2 -2
- package/fesm2022/c8y-ngx-components-protocol-opcua.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-repository-configuration.mjs +118 -68
- package/fesm2022/c8y-ngx-components-repository-configuration.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-repository-shared.mjs +283 -81
- package/fesm2022/c8y-ngx-components-repository-shared.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-repository-software.mjs +31 -154
- package/fesm2022/c8y-ngx-components-repository-software.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-definitions-device-management-welcome.mjs +1 -1
- package/fesm2022/c8y-ngx-components-widgets-definitions-device-management-welcome.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-implementations-info-gauge.mjs +24 -9
- package/fesm2022/c8y-ngx-components-widgets-implementations-info-gauge.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components.mjs +27 -17
- package/fesm2022/c8y-ngx-components.mjs.map +1 -1
- package/locales/de.po +6 -0
- package/locales/es.po +6 -0
- package/locales/fr.po +6 -0
- package/locales/ja_JP.po +6 -0
- package/locales/locales.pot +38 -23
- package/locales/nl.po +6 -0
- package/locales/pl.po +6 -0
- package/locales/pt_BR.po +6 -0
- package/package.json +1 -1
- package/repository/configuration/list/configuration-list.component.d.ts +21 -17
- package/repository/configuration/list/configuration-list.component.d.ts.map +1 -1
- package/repository/shared/columns/device-type.cell-renderer.component.d.ts +4 -1
- package/repository/shared/columns/device-type.cell-renderer.component.d.ts.map +1 -1
- package/repository/shared/columns/device-type.grid-column.d.ts +1 -0
- package/repository/shared/columns/device-type.grid-column.d.ts.map +1 -1
- package/repository/shared/columns/file.cell-renderer.component.d.ts +15 -0
- package/repository/shared/columns/file.cell-renderer.component.d.ts.map +1 -0
- package/repository/shared/columns/file.grid-column.d.ts +8 -0
- package/repository/shared/columns/file.grid-column.d.ts.map +1 -0
- package/repository/shared/columns/name.cell-renderer.component.d.ts.map +1 -1
- package/repository/shared/columns/name.grid-column.d.ts +3 -1
- package/repository/shared/columns/name.grid-column.d.ts.map +1 -1
- package/repository/shared/columns/type.cell-renderer.component.d.ts +9 -0
- package/repository/shared/columns/type.cell-renderer.component.d.ts.map +1 -0
- package/repository/{software/list/columns/software-type.filtering-form-renderer.component.d.ts → shared/columns/type.filtering-form-renderer.component.d.ts} +9 -8
- package/repository/shared/columns/type.filtering-form-renderer.component.d.ts.map +1 -0
- package/repository/shared/columns/type.grid-column.d.ts +20 -0
- package/repository/shared/columns/type.grid-column.d.ts.map +1 -0
- package/repository/shared/index.d.ts +9 -0
- package/repository/shared/index.d.ts.map +1 -1
- package/repository/software/list/software-list.component.d.ts.map +1 -1
- package/repository/software/list/software-repository-list.module.d.ts +8 -10
- package/repository/software/list/software-repository-list.module.d.ts.map +1 -1
- package/widgets/definitions/device-management-welcome/index.d.ts +1 -1
- package/widgets/definitions/device-management-welcome/index.d.ts.map +1 -1
- package/widgets/device-management/index.d.ts +1 -1
- package/widgets/implementations/info-gauge/info-gauge-widget-view/info-gauge-widget-view.component.d.ts +5 -1
- package/widgets/implementations/info-gauge/info-gauge-widget-view/info-gauge-widget-view.component.d.ts.map +1 -1
- package/esm2022/repository/software/list/columns/software-type.cell-renderer.component.mjs +0 -17
- package/esm2022/repository/software/list/columns/software-type.filtering-form-renderer.component.mjs +0 -93
- package/esm2022/repository/software/list/columns/software-type.grid-column.mjs +0 -28
- package/repository/software/list/columns/software-type.cell-renderer.component.d.ts +0 -9
- package/repository/software/list/columns/software-type.cell-renderer.component.d.ts.map +0 -1
- package/repository/software/list/columns/software-type.filtering-form-renderer.component.d.ts.map +0 -1
- package/repository/software/list/columns/software-type.grid-column.d.ts +0 -5
- package/repository/software/list/columns/software-type.grid-column.d.ts.map +0 -1
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { Component, EventEmitter, Input, Output } from '@angular/core';
|
|
2
2
|
import { ActivatedRoute } from '@angular/router';
|
|
3
|
+
import { NEW_DASHBOARD_QUERY_PARAM } from './dashboard.model';
|
|
3
4
|
import { DynamicComponentService } from '../dynamic-component/dynamic-component.service';
|
|
4
5
|
import { BehaviorSubject, combineLatest, fromEvent, merge } from 'rxjs';
|
|
5
6
|
import { map, shareReplay, startWith, switchMap } from 'rxjs/operators';
|
|
@@ -92,6 +93,10 @@ export class WidgetsDashboardComponent {
|
|
|
92
93
|
const ctx = viewContext.split('/').shift();
|
|
93
94
|
this.copyDashboardWarningMessage = this.translateService.instant('Only dashboards with widgets referencing the current {{ ctx }} can be copied.', { ctx });
|
|
94
95
|
}
|
|
96
|
+
const isNewDashboard = this.route.snapshot.queryParams[NEW_DASHBOARD_QUERY_PARAM];
|
|
97
|
+
if (isNewDashboard === 'true') {
|
|
98
|
+
this.enableEditMode();
|
|
99
|
+
}
|
|
95
100
|
this.resolvedWidgets$ = this._widgets.pipe(switchMap(widgets => this.executeResolversOfWidgets(widgets)), shareReplay(1));
|
|
96
101
|
this.isExecutingResolvers$ = merge(this._widgets.pipe(map(() => true)), this.resolvedWidgets$.pipe(map(() => false)));
|
|
97
102
|
this.isLoadingWidgets$ = combineLatest([this.isLoading$, this.isExecutingResolvers$]).pipe(map(loadings => loadings.some(loading => loading)), shareReplay(1));
|
|
@@ -186,6 +191,10 @@ export class WidgetsDashboardComponent {
|
|
|
186
191
|
this.editMode = false;
|
|
187
192
|
this.onSaveDashboard.emit();
|
|
188
193
|
}
|
|
194
|
+
enableEditMode() {
|
|
195
|
+
this.editMode = true;
|
|
196
|
+
this.contextDashboard.historyDescription = {};
|
|
197
|
+
}
|
|
189
198
|
async confirmClosing() {
|
|
190
199
|
try {
|
|
191
200
|
await this.modal.confirm(gettext('Exit edit mode'), gettext('Are you sure you want to exit the edit mode? All unsaved changes will be lost.'), Status.WARNING, {
|
|
@@ -218,7 +227,7 @@ export class WidgetsDashboardComponent {
|
|
|
218
227
|
return widgets;
|
|
219
228
|
}
|
|
220
229
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.9", ngImport: i0, type: WidgetsDashboardComponent, deps: [{ token: i1.DynamicComponentService }, { token: i2.TranslateService }, { token: i3.ActivatedRoute }, { token: i4.ModalService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
221
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.9", type: WidgetsDashboardComponent, selector: "c8y-widgets-dashboard", inputs: { widgets: "widgets", context: "context", contextDashboard: "contextDashboard", _settings: ["settings", "_settings"], isCopyDisabled: "isCopyDisabled", breadcrumb: "breadcrumb", editModeButtons: "editModeButtons" }, outputs: { onAddWidget: "onAddWidget", onEditWidget: "onEditWidget", onDeleteWidget: "onDeleteWidget", onChangeDashboard: "onChangeDashboard", onResize: "onResize", onEditDashboard: "onEditDashboard", onCopyDashboard: "onCopyDashboard", onDeleteDashboard: "onDeleteDashboard", onChangeStart: "onChangeStart", onChangeEnd: "onChangeEnd", onSaveDashboard: "onSaveDashboard", onCancelDashboard: "onCancelDashboard", revertChange: "revertChange" }, host: { styleAttribute: "\n display: block;\n ", classAttribute: "dashboard c8y-grid-dashboard" }, providers: [WidgetsDashboardEventService], ngImport: i0, template: "<c8y-title *ngIf=\"!!settings.title\">\n {{ settings.title | translate }}\n</c8y-title>\n\n<c8y-breadcrumb *ngIf=\"!!breadcrumb\">\n <c8y-breadcrumb-item\n [icon]=\"breadcrumb.icon\"\n [label]=\"breadcrumb.label\"\n [path]=\"breadcrumb.path\"\n ></c8y-breadcrumb-item>\n</c8y-breadcrumb>\n\n<c8y-action-bar-item\n [placement]=\"'left'\"\n *ngIf=\"!editMode\"\n>\n <button\n class=\"btn btn-link animated fadeIn hidden-xs\"\n title=\"{{ 'Edit widgets' | translate }}\"\n type=\"button\"\n [disabled]=\"settings.isDisabled\"\n (click)=\"editMode = true; contextDashboard.historyDescription = {}\"\n data-cy=\"c8y-widget-dashboard--edit-widgets\"\n >\n <i c8yIcon=\"send-backward\"></i>\n <span class=\"m-l-4\">{{ 'Edit widgets' | translate }}</span>\n </button>\n <button\n class=\"btn btn-link visible-xs m-l-0\"\n tooltip=\"{{ 'Not available on mobile phone' | translate }}\"\n type=\"button\"\n [disabled]=\"true\"\n >\n <i c8yIcon=\"send-backward\"></i>\n <span class=\"m-l-4\">{{ 'Edit widgets' | translate }}</span>\n </button>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item\n [placement]=\"'left'\"\n *ngIf=\"editMode\"\n>\n <button\n class=\"btn btn-link animated fadeIn\"\n title=\"{{ 'Add widget' | translate }}\"\n type=\"button\"\n (click)=\"onAddWidget.emit()\"\n data-cy=\"widget-dashboard--Add-widget\"\n >\n <i c8yIcon=\"plus-circle\"></i>\n {{ 'Add widget' | translate }}\n </button>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item\n [placement]=\"'left'\"\n itemClass=\"d-flex a-i-center gap-8\"\n *ngIf=\"editMode\"\n>\n <div class=\"input-group input-group-sm animated fadeIn\">\n <div class=\"input-group-btn\">\n <button\n class=\"btn btn-default btn-sm btn-icon\"\n [attr.aria-label]=\"'Undo' | translate\"\n [tooltip]=\"\n editModeButtons.undoButtonDisabled\n ? ''\n : (undoMessage\n | translate: { changeToUndo: editModeButtons.changeToUndoName | translate })\n \"\n container=\"body\"\n (click)=\"revertChange.emit('undo')\"\n [disabled]=\"editModeButtons.undoButtonDisabled\"\n >\n <i [c8yIcon]=\"'undo'\"></i>\n </button>\n </div>\n <div class=\"input-group-btn\">\n <button\n class=\"btn btn-default btn-sm btn-icon\"\n [attr.aria-label]=\"'Redo' | translate\"\n [tooltip]=\"\n editModeButtons.redoButtonDisabled\n ? ''\n : (redoMessage\n | translate: { changeToRedo: editModeButtons.changeToRedoName | translate })\n \"\n container=\"body\"\n (click)=\"revertChange.emit('redo')\"\n [disabled]=\"editModeButtons.redoButtonDisabled\"\n >\n <i [c8yIcon]=\"'redo'\"></i>\n </button>\n </div>\n <span></span>\n </div>\n <div class=\"btn-group animated fadeIn\">\n <button\n class=\"btn btn-default btn-sm\"\n title=\"{{ 'Cancel' | translate }}\"\n type=\"button\"\n (click)=\"cancelDashboardSave()\"\n >\n {{ 'Cancel' | translate }}\n </button>\n <button\n class=\"btn btn-primary btn-sm m-l-8\"\n title=\"{{ 'Save' | translate }}\"\n type=\"button\"\n [disabled]=\"editModeButtons.undoButtonDisabled\"\n (click)=\"saveDashboard()\"\n data-cy=\"c8y-widgets-dashboard--save\"\n >\n {{ 'Save' | translate }}\n </button>\n </div>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item\n [placement]=\"'right'\"\n *ngIf=\"onEditDashboard.observers.length\"\n>\n <button\n class=\"btn btn-link hidden-xs m-l-0\"\n title=\"{{ 'Dashboard settings' | translate }}\"\n type=\"button\"\n [disabled]=\"settings.isDisabled || editMode\"\n (click)=\"onEditDashboard.emit()\"\n data-cy=\"c8y-widgets-dashboard--edit-dashboard\"\n >\n <i c8yIcon=\"sorting-slider\"></i>\n <span class=\"visible-xs-inline hidden-sm visible-md-inline visible-lg-inline\">\n {{ 'Dashboard settings' | translate }}\n </span>\n </button>\n <button\n class=\"btn btn-link visible-xs m-l-0\"\n tooltip=\"{{ 'Not available on mobile phone' | translate }}\"\n type=\"button\"\n [disabled]=\"true\"\n >\n <i c8yIcon=\"sorting-slider\"></i>\n <span class=\"visible-xs-inline hidden-sm visible-md-inline visible-lg-inline\">\n {{ 'Dashboard settings' | translate }}\n </span>\n </button>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item\n [placement]=\"'right'\"\n *ngIf=\"settings.allowFullscreen\"\n [priority]=\"-5000\"\n itemClass=\"pull-right\"\n>\n <button\n class=\"btn btn-link\"\n [attr.aria-label]=\"'Full screen' | translate\"\n tooltip=\"{{ 'Full screen' | translate }}\"\n placement=\"left\"\n container=\"body\"\n type=\"button\"\n [delay]=\"500\"\n (click)=\"toggleFullscreen()\"\n data-cy=\"widgets-dashboard--Full-screen\"\n >\n <i [c8yIcon]=\"(inFullScreen$ | async) ? 'compress' : 'expand'\"></i>\n <span class=\"visible-xs-inline hidden-sm visible-md-inline visibile-lg-inline\">\n {{ 'Full screen' | translate }}\n </span>\n </button>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item\n [placement]=\"'more'\"\n [priority]=\"-2000\"\n *ngIf=\"settings.canCopy\"\n>\n <button\n class=\"hidden-xs\"\n title=\"{{ isCopyDisabled ? copyDashboardWarningMessage : (copyDashboardLabel | translate) }}\"\n type=\"button\"\n [ngClass]=\"{ 'btn btn-link': !settings.canDelete }\"\n data-cy=\"widgets-dashboard--copy-dashboard\"\n (click)=\"onCopyDashboard.emit()\"\n [disabled]=\"isCopyDisabled || editMode\"\n >\n <i c8yIcon=\"clone\"></i>\n <span>{{ copyDashboardLabel | translate }}</span>\n </button>\n <button\n class=\"visible-xs m-l-0\"\n tooltip=\"{{ 'Not available on mobile phone' | translate }}\"\n type=\"button\"\n [ngClass]=\"{ 'btn btn-link': !settings.canDelete }\"\n [disabled]=\"true\"\n >\n <i c8yIcon=\"clone\"></i>\n <span>{{ copyDashboardLabel | translate }}</span>\n </button>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item\n [placement]=\"'more'\"\n [priority]=\"-3000\"\n *ngIf=\"settings.canDelete && onDeleteDashboard.observers.length\"\n>\n <button\n class=\"hidden-xs\"\n title=\"{{ 'Delete dashboard' | translate }}\"\n type=\"button\"\n [ngClass]=\"{ 'btn btn-link': !settings.canCopy }\"\n (click)=\"onDeleteDashboard.emit()\"\n [disabled]=\"settings.isDisabled || editMode\"\n >\n <i c8yIcon=\"delete\"></i>\n <span\n translate\n >\n Delete dashboard\n </span>\n </button>\n <button\n class=\"visible-xs m-l-0\"\n tooltip=\"{{ 'Not available on mobile phone' | translate }}\"\n type=\"button\"\n [ngClass]=\"{ 'btn btn-link': !settings.canCopy }\"\n [disabled]=\"true\"\n >\n <i c8yIcon=\"delete\"></i>\n <span\n translate\n >\n Delete dashboard\n </span>\n </button>\n</c8y-action-bar-item>\n\n<ng-template #loadingIndicator>\n <c8y-loading\n class=\"col-xs-12 text-center\"\n *ngIf=\"isLoadingWidgets$ | async\"\n ></c8y-loading>\n</ng-template>\n\n<ng-container *ngIf=\"!(isLoadingWidgets$ | async); else loadingIndicator\">\n <ng-container *ngIf=\"resolvedWidgets$ | async as widgetsToDisplay\">\n <!-- empty state -->\n <c8y-ui-empty-state\n [icon]=\"'c8y-device'\"\n [title]=\"'No widgets to display.' | translate\"\n *ngIf=\"widgetsToDisplay?.length === 0\"\n >\n <div *ngIf=\"onAddWidget.observers.length\">\n <p\n translate\n *ngIf=\"editMode\"\n >\n Add widgets to this dashboard.\n </p>\n <p\n translate\n *ngIf=\"!editMode\"\n >\n Click \"Edit widgets\" to unlock\n </p>\n <div>\n <button\n class=\"btn btn-primary m-t-16\"\n title=\"{{ 'Add widget' | translate }}\"\n type=\"button\"\n [disabled]=\"settings.isDisabled || !editMode\"\n (click)=\"onAddWidget.emit()\"\n data-cy=\"c8y-widgets-dashboard--add-widget\"\n translate\n >\n Add widget\n </button>\n </div>\n <p c8y-guide-docs>\n <small\n translate\n ngNonBindable\n >\n Find out more in the\n <a c8y-guide-href=\"/docs/cockpit/working-with-dashboards\">user documentation</a>\n .\n </small>\n </p>\n </div>\n </c8y-ui-empty-state>\n\n <c8y-dashboard\n [columns]=\"settings.columns\"\n (dashboardChange)=\"onChangeDashboard.emit($event)\"\n #dashboard\n >\n <c8y-dashboard-child\n *ngFor=\"let widget of widgetsToDisplay\"\n [class]=\"widget.classes\"\n [x]=\"widget._x\"\n [y]=\"widget._y\"\n [width]=\"widget._width || settings.defaultWidth\"\n [height]=\"widget._height || settings.defaultHeight\"\n [margin]=\"settings.widgetMargin\"\n [data]=\"widget\"\n [useIntersection]=\"true\"\n [editMode]=\"editMode\"\n (changeStart)=\"onChangeStart.emit({ widget: widget, source: child, dashboard: dashboard })\"\n (changeEnd)=\"onChangeEnd.emit({ widget: widget, source: child, dashboard: dashboard })\"\n (toggleFullscreen)=\"toggleFullscreenOnWidget(child)\"\n [canToggleFullscreen]=\"!(inFullScreen$ | async) || widgetInFullscreenMode\"\n #child\n >\n <c8y-dashboard-child-title>\n <span\n data-cy=\"c8y-dashboard-list--device-widget\"\n *ngIf=\"settings.translateWidgetTitle\"\n >\n {{ widget.title | translate }}\n </span>\n <span *ngIf=\"!settings.translateWidgetTitle\">\n {{ widget.title }}\n </span>\n </c8y-dashboard-child-title>\n <c8y-dashboard-child-action *ngIf=\"onEditWidget.observers.length\">\n <button\n title=\"{{ 'Edit widget' | translate }}\"\n type=\"button\"\n data-cy=\"widgets-dashboard--Edit-widget\"\n (click)=\"onEditWidget.emit({ widget: widget, source: child, dashboard: dashboard })\"\n >\n <i c8yIcon=\"pencil\"></i>\n <span\n translate\n >\n Edit\n </span>\n </button>\n </c8y-dashboard-child-action>\n <c8y-dashboard-child-action *ngIf=\"onDeleteWidget.observers.length\">\n <button\n title=\"{{ 'Remove widget' | translate }}\"\n type=\"button\"\n data-cy=\"c8y-widgets-dashboard--remove-widget\"\n (click)=\"onDeleteWidget.emit({ widget: widget, source: child, dashboard: dashboard })\"\n >\n <i c8yIcon=\"delete\"></i>\n <span\n translate\n >\n Remove\n </span>\n </button>\n </c8y-dashboard-child-action>\n\n <c8y-widget-time-context\n *ngIf=\"\n (widget.config?.displaySettings?.globalTimeContext ||\n widget.config?.displaySettings?.globalRealtimeContext) &&\n widget.config.widgetInstanceGlobalTimeContext\n \"\n (dateContextChange)=\"updateWidgetConfig($event, widget)\"\n [canDecouple]=\"widget.config.canDecoupleGlobalTimeContext\"\n [displaySettings]=\"widget.config.displaySettings\"\n [hidden]=\"editMode\"\n ></c8y-widget-time-context>\n\n <c8y-dynamic-component\n [componentId]=\"widget.componentId || widget.name\"\n [config]=\"\n widget.templateUrl || widget.widgetComponent\n ? { child: widget, dashboard: contextDashboard, context: context }\n : widget.config\n \"\n *ngIf=\"child.intersected\"\n (updateWidgetClasses)=\"updateWidgetClasses(widget, $event)\"\n ></c8y-dynamic-component>\n </c8y-dashboard-child>\n </c8y-dashboard>\n </ng-container>\n</ng-container>\n", dependencies: [{ kind: "component", type: i5.EmptyStateComponent, selector: "c8y-ui-empty-state", inputs: ["icon", "title", "subtitle", "horizontal"] }, { kind: "directive", type: i6.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: i7.C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "directive", type: i8.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i8.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i8.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i9.LoadingComponent, selector: "c8y-loading", inputs: ["layout", "progress", "message"] }, { kind: "component", type: i10.ActionBarItemComponent, selector: "c8y-action-bar-item", inputs: ["placement", "priority", "itemClass", "injector", "groupId", "inGroupPriority"] }, { kind: "component", type: i11.DynamicComponentComponent, selector: "c8y-dynamic-component", inputs: ["componentId", "config", "mode", "notFoundError", "executeResolvers"], outputs: ["updateWidgetClasses"] }, { kind: "directive", type: i12.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"] }, { kind: "component", type: i13.TitleComponent, selector: "c8y-title", inputs: ["pageTitleUpdate"] }, { kind: "directive", type: i14.GuideHrefDirective, selector: "[c8y-guide-href]", inputs: ["c8y-guide-href"] }, { kind: "component", type: i15.GuideDocsComponent, selector: "[c8y-guide-docs]" }, { kind: "component", type: i16.BreadcrumbComponent, selector: "c8y-breadcrumb" }, { kind: "component", type: i17.BreadcrumbItemComponent, selector: "c8y-breadcrumb-item", inputs: ["icon", "translate", "label", "path", "injector"] }, { kind: "component", type: i18.DashboardChildComponent, selector: "c8y-dashboard-child", inputs: ["x", "y", "width", "height", "data", "margin", "useIntersection", "isFrozen", "canToggleFullscreen", "editMode", "class"], outputs: ["changeStart", "changeEnd", "toggleFullscreen"] }, { kind: "component", type: i19.DashboardComponent, selector: "c8y-dashboard", inputs: ["columns", "gap", "rows"], outputs: ["dashboardChange"] }, { kind: "component", type: i20.DashboardChildTitleComponent, selector: "c8y-dashboard-child-title" }, { kind: "component", type: i21.DashboardChildActionComponent, selector: "c8y-dashboard-child-action" }, { kind: "component", type: i22.WidgetTimeContextComponent, selector: "c8y-widget-time-context", inputs: ["canDecouple", "displaySettings", "hidden"], outputs: ["dateContextChange"] }, { kind: "pipe", type: i23.C8yTranslatePipe, name: "translate" }, { kind: "pipe", type: i8.AsyncPipe, name: "async" }] }); }
|
|
230
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.9", type: WidgetsDashboardComponent, selector: "c8y-widgets-dashboard", inputs: { widgets: "widgets", context: "context", contextDashboard: "contextDashboard", _settings: ["settings", "_settings"], isCopyDisabled: "isCopyDisabled", breadcrumb: "breadcrumb", editModeButtons: "editModeButtons" }, outputs: { onAddWidget: "onAddWidget", onEditWidget: "onEditWidget", onDeleteWidget: "onDeleteWidget", onChangeDashboard: "onChangeDashboard", onResize: "onResize", onEditDashboard: "onEditDashboard", onCopyDashboard: "onCopyDashboard", onDeleteDashboard: "onDeleteDashboard", onChangeStart: "onChangeStart", onChangeEnd: "onChangeEnd", onSaveDashboard: "onSaveDashboard", onCancelDashboard: "onCancelDashboard", revertChange: "revertChange" }, host: { styleAttribute: "\n display: block;\n ", classAttribute: "dashboard c8y-grid-dashboard" }, providers: [WidgetsDashboardEventService], ngImport: i0, template: "<c8y-title *ngIf=\"!!settings.title\">\n {{ settings.title | translate }}\n</c8y-title>\n\n<c8y-breadcrumb *ngIf=\"!!breadcrumb\">\n <c8y-breadcrumb-item\n [icon]=\"breadcrumb.icon\"\n [label]=\"breadcrumb.label\"\n [path]=\"breadcrumb.path\"\n ></c8y-breadcrumb-item>\n</c8y-breadcrumb>\n\n<c8y-action-bar-item\n [placement]=\"'left'\"\n *ngIf=\"!editMode\"\n>\n <button\n class=\"btn btn-link animated fadeIn hidden-xs\"\n title=\"{{ 'Edit widgets' | translate }}\"\n type=\"button\"\n [disabled]=\"settings.isDisabled\"\n (click)=\"enableEditMode()\"\n data-cy=\"c8y-widget-dashboard--edit-widgets\"\n >\n <i c8yIcon=\"send-backward\"></i>\n <span class=\"m-l-4\">{{ 'Edit widgets' | translate }}</span>\n </button>\n <button\n class=\"btn btn-link visible-xs m-l-0\"\n tooltip=\"{{ 'Not available on mobile phone' | translate }}\"\n type=\"button\"\n [disabled]=\"true\"\n >\n <i c8yIcon=\"send-backward\"></i>\n <span class=\"m-l-4\">{{ 'Edit widgets' | translate }}</span>\n </button>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item\n [placement]=\"'left'\"\n *ngIf=\"editMode\"\n>\n <button\n class=\"btn btn-link animated fadeIn\"\n title=\"{{ 'Add widget' | translate }}\"\n type=\"button\"\n (click)=\"onAddWidget.emit()\"\n data-cy=\"widget-dashboard--Add-widget\"\n >\n <i c8yIcon=\"plus-circle\"></i>\n {{ 'Add widget' | translate }}\n </button>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item\n [placement]=\"'left'\"\n itemClass=\"d-flex a-i-center gap-8\"\n *ngIf=\"editMode\"\n>\n <div class=\"input-group input-group-sm animated fadeIn\">\n <div class=\"input-group-btn\">\n <button\n class=\"btn btn-default btn-sm btn-icon\"\n [attr.aria-label]=\"'Undo' | translate\"\n [tooltip]=\"\n editModeButtons.undoButtonDisabled\n ? ''\n : (undoMessage\n | translate: { changeToUndo: editModeButtons.changeToUndoName | translate })\n \"\n container=\"body\"\n (click)=\"revertChange.emit('undo')\"\n [disabled]=\"editModeButtons.undoButtonDisabled\"\n >\n <i [c8yIcon]=\"'undo'\"></i>\n </button>\n </div>\n <div class=\"input-group-btn\">\n <button\n class=\"btn btn-default btn-sm btn-icon\"\n [attr.aria-label]=\"'Redo' | translate\"\n [tooltip]=\"\n editModeButtons.redoButtonDisabled\n ? ''\n : (redoMessage\n | translate: { changeToRedo: editModeButtons.changeToRedoName | translate })\n \"\n container=\"body\"\n (click)=\"revertChange.emit('redo')\"\n [disabled]=\"editModeButtons.redoButtonDisabled\"\n >\n <i [c8yIcon]=\"'redo'\"></i>\n </button>\n </div>\n <span></span>\n </div>\n <div class=\"btn-group animated fadeIn\">\n <button\n class=\"btn btn-default btn-sm\"\n title=\"{{ 'Cancel' | translate }}\"\n type=\"button\"\n (click)=\"cancelDashboardSave()\"\n >\n {{ 'Cancel' | translate }}\n </button>\n <button\n class=\"btn btn-primary btn-sm m-l-8\"\n title=\"{{ 'Save' | translate }}\"\n type=\"button\"\n [disabled]=\"editModeButtons.undoButtonDisabled\"\n (click)=\"saveDashboard()\"\n data-cy=\"c8y-widgets-dashboard--save\"\n >\n {{ 'Save' | translate }}\n </button>\n </div>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item\n [placement]=\"'right'\"\n *ngIf=\"onEditDashboard.observers.length\"\n>\n <button\n class=\"btn btn-link hidden-xs m-l-0\"\n title=\"{{ 'Dashboard settings' | translate }}\"\n type=\"button\"\n [disabled]=\"settings.isDisabled || editMode\"\n (click)=\"onEditDashboard.emit()\"\n data-cy=\"c8y-widgets-dashboard--edit-dashboard\"\n >\n <i c8yIcon=\"sorting-slider\"></i>\n <span class=\"visible-xs-inline hidden-sm visible-md-inline visible-lg-inline\">\n {{ 'Dashboard settings' | translate }}\n </span>\n </button>\n <button\n class=\"btn btn-link visible-xs m-l-0\"\n tooltip=\"{{ 'Not available on mobile phone' | translate }}\"\n type=\"button\"\n [disabled]=\"true\"\n >\n <i c8yIcon=\"sorting-slider\"></i>\n <span class=\"visible-xs-inline hidden-sm visible-md-inline visible-lg-inline\">\n {{ 'Dashboard settings' | translate }}\n </span>\n </button>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item\n [placement]=\"'right'\"\n *ngIf=\"settings.allowFullscreen\"\n [priority]=\"-5000\"\n itemClass=\"pull-right\"\n>\n <button\n class=\"btn btn-link\"\n [attr.aria-label]=\"'Full screen' | translate\"\n tooltip=\"{{ 'Full screen' | translate }}\"\n placement=\"left\"\n container=\"body\"\n type=\"button\"\n [delay]=\"500\"\n (click)=\"toggleFullscreen()\"\n data-cy=\"widgets-dashboard--Full-screen\"\n >\n <i [c8yIcon]=\"(inFullScreen$ | async) ? 'compress' : 'expand'\"></i>\n <span class=\"visible-xs-inline hidden-sm visible-md-inline visibile-lg-inline\">\n {{ 'Full screen' | translate }}\n </span>\n </button>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item\n [placement]=\"'more'\"\n [priority]=\"-2000\"\n *ngIf=\"settings.canCopy\"\n>\n <button\n class=\"hidden-xs\"\n title=\"{{ isCopyDisabled ? copyDashboardWarningMessage : (copyDashboardLabel | translate) }}\"\n type=\"button\"\n [ngClass]=\"{ 'btn btn-link': !settings.canDelete }\"\n data-cy=\"widgets-dashboard--copy-dashboard\"\n (click)=\"onCopyDashboard.emit()\"\n [disabled]=\"isCopyDisabled || editMode\"\n >\n <i c8yIcon=\"clone\"></i>\n <span>{{ copyDashboardLabel | translate }}</span>\n </button>\n <button\n class=\"visible-xs m-l-0\"\n tooltip=\"{{ 'Not available on mobile phone' | translate }}\"\n type=\"button\"\n [ngClass]=\"{ 'btn btn-link': !settings.canDelete }\"\n [disabled]=\"true\"\n >\n <i c8yIcon=\"clone\"></i>\n <span>{{ copyDashboardLabel | translate }}</span>\n </button>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item\n [placement]=\"'more'\"\n [priority]=\"-3000\"\n *ngIf=\"settings.canDelete && onDeleteDashboard.observers.length\"\n>\n <button\n class=\"hidden-xs\"\n title=\"{{ 'Delete dashboard' | translate }}\"\n type=\"button\"\n [ngClass]=\"{ 'btn btn-link': !settings.canCopy }\"\n (click)=\"onDeleteDashboard.emit()\"\n [disabled]=\"settings.isDisabled || editMode\"\n >\n <i c8yIcon=\"delete\"></i>\n <span\n translate\n >\n Delete dashboard\n </span>\n </button>\n <button\n class=\"visible-xs m-l-0\"\n tooltip=\"{{ 'Not available on mobile phone' | translate }}\"\n type=\"button\"\n [ngClass]=\"{ 'btn btn-link': !settings.canCopy }\"\n [disabled]=\"true\"\n >\n <i c8yIcon=\"delete\"></i>\n <span\n translate\n >\n Delete dashboard\n </span>\n </button>\n</c8y-action-bar-item>\n\n<ng-template #loadingIndicator>\n <c8y-loading\n class=\"col-xs-12 text-center\"\n *ngIf=\"isLoadingWidgets$ | async\"\n ></c8y-loading>\n</ng-template>\n\n<ng-container *ngIf=\"!(isLoadingWidgets$ | async); else loadingIndicator\">\n <ng-container *ngIf=\"resolvedWidgets$ | async as widgetsToDisplay\">\n <!-- empty state -->\n <c8y-ui-empty-state\n [icon]=\"'c8y-device'\"\n [title]=\"'No widgets to display.' | translate\"\n *ngIf=\"widgetsToDisplay?.length === 0\"\n >\n <div *ngIf=\"onAddWidget.observers.length\">\n <p\n translate\n *ngIf=\"editMode\"\n >\n Add widgets to this dashboard.\n </p>\n <p\n translate\n *ngIf=\"!editMode\"\n >\n Click \"Edit widgets\" to unlock\n </p>\n <div>\n <button\n class=\"btn btn-primary m-t-16\"\n title=\"{{ 'Add widget' | translate }}\"\n type=\"button\"\n [disabled]=\"settings.isDisabled || !editMode\"\n (click)=\"onAddWidget.emit()\"\n data-cy=\"c8y-widgets-dashboard--add-widget\"\n translate\n >\n Add widget\n </button>\n </div>\n <p c8y-guide-docs>\n <small\n translate\n ngNonBindable\n >\n Find out more in the\n <a c8y-guide-href=\"/docs/cockpit/working-with-dashboards\">user documentation</a>\n .\n </small>\n </p>\n </div>\n </c8y-ui-empty-state>\n\n <c8y-dashboard\n [columns]=\"settings.columns\"\n (dashboardChange)=\"onChangeDashboard.emit($event)\"\n #dashboard\n >\n <c8y-dashboard-child\n *ngFor=\"let widget of widgetsToDisplay\"\n [class]=\"widget.classes\"\n [x]=\"widget._x\"\n [y]=\"widget._y\"\n [width]=\"widget._width || settings.defaultWidth\"\n [height]=\"widget._height || settings.defaultHeight\"\n [margin]=\"settings.widgetMargin\"\n [data]=\"widget\"\n [useIntersection]=\"true\"\n [editMode]=\"editMode\"\n (changeStart)=\"onChangeStart.emit({ widget: widget, source: child, dashboard: dashboard })\"\n (changeEnd)=\"onChangeEnd.emit({ widget: widget, source: child, dashboard: dashboard })\"\n (toggleFullscreen)=\"toggleFullscreenOnWidget(child)\"\n [canToggleFullscreen]=\"!(inFullScreen$ | async) || widgetInFullscreenMode\"\n #child\n >\n <c8y-dashboard-child-title>\n <span\n data-cy=\"c8y-dashboard-list--device-widget\"\n *ngIf=\"settings.translateWidgetTitle\"\n >\n {{ widget.title | translate }}\n </span>\n <span *ngIf=\"!settings.translateWidgetTitle\">\n {{ widget.title }}\n </span>\n </c8y-dashboard-child-title>\n <c8y-dashboard-child-action *ngIf=\"onEditWidget.observers.length\">\n <button\n title=\"{{ 'Edit widget' | translate }}\"\n type=\"button\"\n data-cy=\"widgets-dashboard--Edit-widget\"\n (click)=\"onEditWidget.emit({ widget: widget, source: child, dashboard: dashboard })\"\n >\n <i c8yIcon=\"pencil\"></i>\n <span\n translate\n >\n Edit\n </span>\n </button>\n </c8y-dashboard-child-action>\n <c8y-dashboard-child-action *ngIf=\"onDeleteWidget.observers.length\">\n <button\n title=\"{{ 'Remove widget' | translate }}\"\n type=\"button\"\n data-cy=\"c8y-widgets-dashboard--remove-widget\"\n (click)=\"onDeleteWidget.emit({ widget: widget, source: child, dashboard: dashboard })\"\n >\n <i c8yIcon=\"delete\"></i>\n <span\n translate\n >\n Remove\n </span>\n </button>\n </c8y-dashboard-child-action>\n\n <c8y-widget-time-context\n *ngIf=\"\n (widget.config?.displaySettings?.globalTimeContext ||\n widget.config?.displaySettings?.globalRealtimeContext) &&\n widget.config.widgetInstanceGlobalTimeContext\n \"\n (dateContextChange)=\"updateWidgetConfig($event, widget)\"\n [canDecouple]=\"widget.config.canDecoupleGlobalTimeContext\"\n [displaySettings]=\"widget.config.displaySettings\"\n [hidden]=\"editMode\"\n ></c8y-widget-time-context>\n\n <c8y-dynamic-component\n [componentId]=\"widget.componentId || widget.name\"\n [config]=\"\n widget.templateUrl || widget.widgetComponent\n ? { child: widget, dashboard: contextDashboard, context: context }\n : widget.config\n \"\n *ngIf=\"child.intersected\"\n (updateWidgetClasses)=\"updateWidgetClasses(widget, $event)\"\n ></c8y-dynamic-component>\n </c8y-dashboard-child>\n </c8y-dashboard>\n </ng-container>\n</ng-container>\n", dependencies: [{ kind: "component", type: i5.EmptyStateComponent, selector: "c8y-ui-empty-state", inputs: ["icon", "title", "subtitle", "horizontal"] }, { kind: "directive", type: i6.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: i7.C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "directive", type: i8.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i8.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i8.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i9.LoadingComponent, selector: "c8y-loading", inputs: ["layout", "progress", "message"] }, { kind: "component", type: i10.ActionBarItemComponent, selector: "c8y-action-bar-item", inputs: ["placement", "priority", "itemClass", "injector", "groupId", "inGroupPriority"] }, { kind: "component", type: i11.DynamicComponentComponent, selector: "c8y-dynamic-component", inputs: ["componentId", "config", "mode", "notFoundError", "executeResolvers"], outputs: ["updateWidgetClasses"] }, { kind: "directive", type: i12.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"] }, { kind: "component", type: i13.TitleComponent, selector: "c8y-title", inputs: ["pageTitleUpdate"] }, { kind: "directive", type: i14.GuideHrefDirective, selector: "[c8y-guide-href]", inputs: ["c8y-guide-href"] }, { kind: "component", type: i15.GuideDocsComponent, selector: "[c8y-guide-docs]" }, { kind: "component", type: i16.BreadcrumbComponent, selector: "c8y-breadcrumb" }, { kind: "component", type: i17.BreadcrumbItemComponent, selector: "c8y-breadcrumb-item", inputs: ["icon", "translate", "label", "path", "injector"] }, { kind: "component", type: i18.DashboardChildComponent, selector: "c8y-dashboard-child", inputs: ["x", "y", "width", "height", "data", "margin", "useIntersection", "isFrozen", "canToggleFullscreen", "editMode", "class"], outputs: ["changeStart", "changeEnd", "toggleFullscreen"] }, { kind: "component", type: i19.DashboardComponent, selector: "c8y-dashboard", inputs: ["columns", "gap", "rows"], outputs: ["dashboardChange"] }, { kind: "component", type: i20.DashboardChildTitleComponent, selector: "c8y-dashboard-child-title" }, { kind: "component", type: i21.DashboardChildActionComponent, selector: "c8y-dashboard-child-action" }, { kind: "component", type: i22.WidgetTimeContextComponent, selector: "c8y-widget-time-context", inputs: ["canDecouple", "displaySettings", "hidden"], outputs: ["dateContextChange"] }, { kind: "pipe", type: i23.C8yTranslatePipe, name: "translate" }, { kind: "pipe", type: i8.AsyncPipe, name: "async" }] }); }
|
|
222
231
|
}
|
|
223
232
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.9", ngImport: i0, type: WidgetsDashboardComponent, decorators: [{
|
|
224
233
|
type: Component,
|
|
@@ -227,7 +236,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.9", ngImpor
|
|
|
227
236
|
display: block;
|
|
228
237
|
`,
|
|
229
238
|
class: 'dashboard c8y-grid-dashboard'
|
|
230
|
-
}, providers: [WidgetsDashboardEventService], template: "<c8y-title *ngIf=\"!!settings.title\">\n {{ settings.title | translate }}\n</c8y-title>\n\n<c8y-breadcrumb *ngIf=\"!!breadcrumb\">\n <c8y-breadcrumb-item\n [icon]=\"breadcrumb.icon\"\n [label]=\"breadcrumb.label\"\n [path]=\"breadcrumb.path\"\n ></c8y-breadcrumb-item>\n</c8y-breadcrumb>\n\n<c8y-action-bar-item\n [placement]=\"'left'\"\n *ngIf=\"!editMode\"\n>\n <button\n class=\"btn btn-link animated fadeIn hidden-xs\"\n title=\"{{ 'Edit widgets' | translate }}\"\n type=\"button\"\n [disabled]=\"settings.isDisabled\"\n (click)=\"editMode = true; contextDashboard.historyDescription = {}\"\n data-cy=\"c8y-widget-dashboard--edit-widgets\"\n >\n <i c8yIcon=\"send-backward\"></i>\n <span class=\"m-l-4\">{{ 'Edit widgets' | translate }}</span>\n </button>\n <button\n class=\"btn btn-link visible-xs m-l-0\"\n tooltip=\"{{ 'Not available on mobile phone' | translate }}\"\n type=\"button\"\n [disabled]=\"true\"\n >\n <i c8yIcon=\"send-backward\"></i>\n <span class=\"m-l-4\">{{ 'Edit widgets' | translate }}</span>\n </button>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item\n [placement]=\"'left'\"\n *ngIf=\"editMode\"\n>\n <button\n class=\"btn btn-link animated fadeIn\"\n title=\"{{ 'Add widget' | translate }}\"\n type=\"button\"\n (click)=\"onAddWidget.emit()\"\n data-cy=\"widget-dashboard--Add-widget\"\n >\n <i c8yIcon=\"plus-circle\"></i>\n {{ 'Add widget' | translate }}\n </button>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item\n [placement]=\"'left'\"\n itemClass=\"d-flex a-i-center gap-8\"\n *ngIf=\"editMode\"\n>\n <div class=\"input-group input-group-sm animated fadeIn\">\n <div class=\"input-group-btn\">\n <button\n class=\"btn btn-default btn-sm btn-icon\"\n [attr.aria-label]=\"'Undo' | translate\"\n [tooltip]=\"\n editModeButtons.undoButtonDisabled\n ? ''\n : (undoMessage\n | translate: { changeToUndo: editModeButtons.changeToUndoName | translate })\n \"\n container=\"body\"\n (click)=\"revertChange.emit('undo')\"\n [disabled]=\"editModeButtons.undoButtonDisabled\"\n >\n <i [c8yIcon]=\"'undo'\"></i>\n </button>\n </div>\n <div class=\"input-group-btn\">\n <button\n class=\"btn btn-default btn-sm btn-icon\"\n [attr.aria-label]=\"'Redo' | translate\"\n [tooltip]=\"\n editModeButtons.redoButtonDisabled\n ? ''\n : (redoMessage\n | translate: { changeToRedo: editModeButtons.changeToRedoName | translate })\n \"\n container=\"body\"\n (click)=\"revertChange.emit('redo')\"\n [disabled]=\"editModeButtons.redoButtonDisabled\"\n >\n <i [c8yIcon]=\"'redo'\"></i>\n </button>\n </div>\n <span></span>\n </div>\n <div class=\"btn-group animated fadeIn\">\n <button\n class=\"btn btn-default btn-sm\"\n title=\"{{ 'Cancel' | translate }}\"\n type=\"button\"\n (click)=\"cancelDashboardSave()\"\n >\n {{ 'Cancel' | translate }}\n </button>\n <button\n class=\"btn btn-primary btn-sm m-l-8\"\n title=\"{{ 'Save' | translate }}\"\n type=\"button\"\n [disabled]=\"editModeButtons.undoButtonDisabled\"\n (click)=\"saveDashboard()\"\n data-cy=\"c8y-widgets-dashboard--save\"\n >\n {{ 'Save' | translate }}\n </button>\n </div>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item\n [placement]=\"'right'\"\n *ngIf=\"onEditDashboard.observers.length\"\n>\n <button\n class=\"btn btn-link hidden-xs m-l-0\"\n title=\"{{ 'Dashboard settings' | translate }}\"\n type=\"button\"\n [disabled]=\"settings.isDisabled || editMode\"\n (click)=\"onEditDashboard.emit()\"\n data-cy=\"c8y-widgets-dashboard--edit-dashboard\"\n >\n <i c8yIcon=\"sorting-slider\"></i>\n <span class=\"visible-xs-inline hidden-sm visible-md-inline visible-lg-inline\">\n {{ 'Dashboard settings' | translate }}\n </span>\n </button>\n <button\n class=\"btn btn-link visible-xs m-l-0\"\n tooltip=\"{{ 'Not available on mobile phone' | translate }}\"\n type=\"button\"\n [disabled]=\"true\"\n >\n <i c8yIcon=\"sorting-slider\"></i>\n <span class=\"visible-xs-inline hidden-sm visible-md-inline visible-lg-inline\">\n {{ 'Dashboard settings' | translate }}\n </span>\n </button>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item\n [placement]=\"'right'\"\n *ngIf=\"settings.allowFullscreen\"\n [priority]=\"-5000\"\n itemClass=\"pull-right\"\n>\n <button\n class=\"btn btn-link\"\n [attr.aria-label]=\"'Full screen' | translate\"\n tooltip=\"{{ 'Full screen' | translate }}\"\n placement=\"left\"\n container=\"body\"\n type=\"button\"\n [delay]=\"500\"\n (click)=\"toggleFullscreen()\"\n data-cy=\"widgets-dashboard--Full-screen\"\n >\n <i [c8yIcon]=\"(inFullScreen$ | async) ? 'compress' : 'expand'\"></i>\n <span class=\"visible-xs-inline hidden-sm visible-md-inline visibile-lg-inline\">\n {{ 'Full screen' | translate }}\n </span>\n </button>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item\n [placement]=\"'more'\"\n [priority]=\"-2000\"\n *ngIf=\"settings.canCopy\"\n>\n <button\n class=\"hidden-xs\"\n title=\"{{ isCopyDisabled ? copyDashboardWarningMessage : (copyDashboardLabel | translate) }}\"\n type=\"button\"\n [ngClass]=\"{ 'btn btn-link': !settings.canDelete }\"\n data-cy=\"widgets-dashboard--copy-dashboard\"\n (click)=\"onCopyDashboard.emit()\"\n [disabled]=\"isCopyDisabled || editMode\"\n >\n <i c8yIcon=\"clone\"></i>\n <span>{{ copyDashboardLabel | translate }}</span>\n </button>\n <button\n class=\"visible-xs m-l-0\"\n tooltip=\"{{ 'Not available on mobile phone' | translate }}\"\n type=\"button\"\n [ngClass]=\"{ 'btn btn-link': !settings.canDelete }\"\n [disabled]=\"true\"\n >\n <i c8yIcon=\"clone\"></i>\n <span>{{ copyDashboardLabel | translate }}</span>\n </button>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item\n [placement]=\"'more'\"\n [priority]=\"-3000\"\n *ngIf=\"settings.canDelete && onDeleteDashboard.observers.length\"\n>\n <button\n class=\"hidden-xs\"\n title=\"{{ 'Delete dashboard' | translate }}\"\n type=\"button\"\n [ngClass]=\"{ 'btn btn-link': !settings.canCopy }\"\n (click)=\"onDeleteDashboard.emit()\"\n [disabled]=\"settings.isDisabled || editMode\"\n >\n <i c8yIcon=\"delete\"></i>\n <span\n translate\n >\n Delete dashboard\n </span>\n </button>\n <button\n class=\"visible-xs m-l-0\"\n tooltip=\"{{ 'Not available on mobile phone' | translate }}\"\n type=\"button\"\n [ngClass]=\"{ 'btn btn-link': !settings.canCopy }\"\n [disabled]=\"true\"\n >\n <i c8yIcon=\"delete\"></i>\n <span\n translate\n >\n Delete dashboard\n </span>\n </button>\n</c8y-action-bar-item>\n\n<ng-template #loadingIndicator>\n <c8y-loading\n class=\"col-xs-12 text-center\"\n *ngIf=\"isLoadingWidgets$ | async\"\n ></c8y-loading>\n</ng-template>\n\n<ng-container *ngIf=\"!(isLoadingWidgets$ | async); else loadingIndicator\">\n <ng-container *ngIf=\"resolvedWidgets$ | async as widgetsToDisplay\">\n <!-- empty state -->\n <c8y-ui-empty-state\n [icon]=\"'c8y-device'\"\n [title]=\"'No widgets to display.' | translate\"\n *ngIf=\"widgetsToDisplay?.length === 0\"\n >\n <div *ngIf=\"onAddWidget.observers.length\">\n <p\n translate\n *ngIf=\"editMode\"\n >\n Add widgets to this dashboard.\n </p>\n <p\n translate\n *ngIf=\"!editMode\"\n >\n Click \"Edit widgets\" to unlock\n </p>\n <div>\n <button\n class=\"btn btn-primary m-t-16\"\n title=\"{{ 'Add widget' | translate }}\"\n type=\"button\"\n [disabled]=\"settings.isDisabled || !editMode\"\n (click)=\"onAddWidget.emit()\"\n data-cy=\"c8y-widgets-dashboard--add-widget\"\n translate\n >\n Add widget\n </button>\n </div>\n <p c8y-guide-docs>\n <small\n translate\n ngNonBindable\n >\n Find out more in the\n <a c8y-guide-href=\"/docs/cockpit/working-with-dashboards\">user documentation</a>\n .\n </small>\n </p>\n </div>\n </c8y-ui-empty-state>\n\n <c8y-dashboard\n [columns]=\"settings.columns\"\n (dashboardChange)=\"onChangeDashboard.emit($event)\"\n #dashboard\n >\n <c8y-dashboard-child\n *ngFor=\"let widget of widgetsToDisplay\"\n [class]=\"widget.classes\"\n [x]=\"widget._x\"\n [y]=\"widget._y\"\n [width]=\"widget._width || settings.defaultWidth\"\n [height]=\"widget._height || settings.defaultHeight\"\n [margin]=\"settings.widgetMargin\"\n [data]=\"widget\"\n [useIntersection]=\"true\"\n [editMode]=\"editMode\"\n (changeStart)=\"onChangeStart.emit({ widget: widget, source: child, dashboard: dashboard })\"\n (changeEnd)=\"onChangeEnd.emit({ widget: widget, source: child, dashboard: dashboard })\"\n (toggleFullscreen)=\"toggleFullscreenOnWidget(child)\"\n [canToggleFullscreen]=\"!(inFullScreen$ | async) || widgetInFullscreenMode\"\n #child\n >\n <c8y-dashboard-child-title>\n <span\n data-cy=\"c8y-dashboard-list--device-widget\"\n *ngIf=\"settings.translateWidgetTitle\"\n >\n {{ widget.title | translate }}\n </span>\n <span *ngIf=\"!settings.translateWidgetTitle\">\n {{ widget.title }}\n </span>\n </c8y-dashboard-child-title>\n <c8y-dashboard-child-action *ngIf=\"onEditWidget.observers.length\">\n <button\n title=\"{{ 'Edit widget' | translate }}\"\n type=\"button\"\n data-cy=\"widgets-dashboard--Edit-widget\"\n (click)=\"onEditWidget.emit({ widget: widget, source: child, dashboard: dashboard })\"\n >\n <i c8yIcon=\"pencil\"></i>\n <span\n translate\n >\n Edit\n </span>\n </button>\n </c8y-dashboard-child-action>\n <c8y-dashboard-child-action *ngIf=\"onDeleteWidget.observers.length\">\n <button\n title=\"{{ 'Remove widget' | translate }}\"\n type=\"button\"\n data-cy=\"c8y-widgets-dashboard--remove-widget\"\n (click)=\"onDeleteWidget.emit({ widget: widget, source: child, dashboard: dashboard })\"\n >\n <i c8yIcon=\"delete\"></i>\n <span\n translate\n >\n Remove\n </span>\n </button>\n </c8y-dashboard-child-action>\n\n <c8y-widget-time-context\n *ngIf=\"\n (widget.config?.displaySettings?.globalTimeContext ||\n widget.config?.displaySettings?.globalRealtimeContext) &&\n widget.config.widgetInstanceGlobalTimeContext\n \"\n (dateContextChange)=\"updateWidgetConfig($event, widget)\"\n [canDecouple]=\"widget.config.canDecoupleGlobalTimeContext\"\n [displaySettings]=\"widget.config.displaySettings\"\n [hidden]=\"editMode\"\n ></c8y-widget-time-context>\n\n <c8y-dynamic-component\n [componentId]=\"widget.componentId || widget.name\"\n [config]=\"\n widget.templateUrl || widget.widgetComponent\n ? { child: widget, dashboard: contextDashboard, context: context }\n : widget.config\n \"\n *ngIf=\"child.intersected\"\n (updateWidgetClasses)=\"updateWidgetClasses(widget, $event)\"\n ></c8y-dynamic-component>\n </c8y-dashboard-child>\n </c8y-dashboard>\n </ng-container>\n</ng-container>\n" }]
|
|
239
|
+
}, providers: [WidgetsDashboardEventService], template: "<c8y-title *ngIf=\"!!settings.title\">\n {{ settings.title | translate }}\n</c8y-title>\n\n<c8y-breadcrumb *ngIf=\"!!breadcrumb\">\n <c8y-breadcrumb-item\n [icon]=\"breadcrumb.icon\"\n [label]=\"breadcrumb.label\"\n [path]=\"breadcrumb.path\"\n ></c8y-breadcrumb-item>\n</c8y-breadcrumb>\n\n<c8y-action-bar-item\n [placement]=\"'left'\"\n *ngIf=\"!editMode\"\n>\n <button\n class=\"btn btn-link animated fadeIn hidden-xs\"\n title=\"{{ 'Edit widgets' | translate }}\"\n type=\"button\"\n [disabled]=\"settings.isDisabled\"\n (click)=\"enableEditMode()\"\n data-cy=\"c8y-widget-dashboard--edit-widgets\"\n >\n <i c8yIcon=\"send-backward\"></i>\n <span class=\"m-l-4\">{{ 'Edit widgets' | translate }}</span>\n </button>\n <button\n class=\"btn btn-link visible-xs m-l-0\"\n tooltip=\"{{ 'Not available on mobile phone' | translate }}\"\n type=\"button\"\n [disabled]=\"true\"\n >\n <i c8yIcon=\"send-backward\"></i>\n <span class=\"m-l-4\">{{ 'Edit widgets' | translate }}</span>\n </button>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item\n [placement]=\"'left'\"\n *ngIf=\"editMode\"\n>\n <button\n class=\"btn btn-link animated fadeIn\"\n title=\"{{ 'Add widget' | translate }}\"\n type=\"button\"\n (click)=\"onAddWidget.emit()\"\n data-cy=\"widget-dashboard--Add-widget\"\n >\n <i c8yIcon=\"plus-circle\"></i>\n {{ 'Add widget' | translate }}\n </button>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item\n [placement]=\"'left'\"\n itemClass=\"d-flex a-i-center gap-8\"\n *ngIf=\"editMode\"\n>\n <div class=\"input-group input-group-sm animated fadeIn\">\n <div class=\"input-group-btn\">\n <button\n class=\"btn btn-default btn-sm btn-icon\"\n [attr.aria-label]=\"'Undo' | translate\"\n [tooltip]=\"\n editModeButtons.undoButtonDisabled\n ? ''\n : (undoMessage\n | translate: { changeToUndo: editModeButtons.changeToUndoName | translate })\n \"\n container=\"body\"\n (click)=\"revertChange.emit('undo')\"\n [disabled]=\"editModeButtons.undoButtonDisabled\"\n >\n <i [c8yIcon]=\"'undo'\"></i>\n </button>\n </div>\n <div class=\"input-group-btn\">\n <button\n class=\"btn btn-default btn-sm btn-icon\"\n [attr.aria-label]=\"'Redo' | translate\"\n [tooltip]=\"\n editModeButtons.redoButtonDisabled\n ? ''\n : (redoMessage\n | translate: { changeToRedo: editModeButtons.changeToRedoName | translate })\n \"\n container=\"body\"\n (click)=\"revertChange.emit('redo')\"\n [disabled]=\"editModeButtons.redoButtonDisabled\"\n >\n <i [c8yIcon]=\"'redo'\"></i>\n </button>\n </div>\n <span></span>\n </div>\n <div class=\"btn-group animated fadeIn\">\n <button\n class=\"btn btn-default btn-sm\"\n title=\"{{ 'Cancel' | translate }}\"\n type=\"button\"\n (click)=\"cancelDashboardSave()\"\n >\n {{ 'Cancel' | translate }}\n </button>\n <button\n class=\"btn btn-primary btn-sm m-l-8\"\n title=\"{{ 'Save' | translate }}\"\n type=\"button\"\n [disabled]=\"editModeButtons.undoButtonDisabled\"\n (click)=\"saveDashboard()\"\n data-cy=\"c8y-widgets-dashboard--save\"\n >\n {{ 'Save' | translate }}\n </button>\n </div>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item\n [placement]=\"'right'\"\n *ngIf=\"onEditDashboard.observers.length\"\n>\n <button\n class=\"btn btn-link hidden-xs m-l-0\"\n title=\"{{ 'Dashboard settings' | translate }}\"\n type=\"button\"\n [disabled]=\"settings.isDisabled || editMode\"\n (click)=\"onEditDashboard.emit()\"\n data-cy=\"c8y-widgets-dashboard--edit-dashboard\"\n >\n <i c8yIcon=\"sorting-slider\"></i>\n <span class=\"visible-xs-inline hidden-sm visible-md-inline visible-lg-inline\">\n {{ 'Dashboard settings' | translate }}\n </span>\n </button>\n <button\n class=\"btn btn-link visible-xs m-l-0\"\n tooltip=\"{{ 'Not available on mobile phone' | translate }}\"\n type=\"button\"\n [disabled]=\"true\"\n >\n <i c8yIcon=\"sorting-slider\"></i>\n <span class=\"visible-xs-inline hidden-sm visible-md-inline visible-lg-inline\">\n {{ 'Dashboard settings' | translate }}\n </span>\n </button>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item\n [placement]=\"'right'\"\n *ngIf=\"settings.allowFullscreen\"\n [priority]=\"-5000\"\n itemClass=\"pull-right\"\n>\n <button\n class=\"btn btn-link\"\n [attr.aria-label]=\"'Full screen' | translate\"\n tooltip=\"{{ 'Full screen' | translate }}\"\n placement=\"left\"\n container=\"body\"\n type=\"button\"\n [delay]=\"500\"\n (click)=\"toggleFullscreen()\"\n data-cy=\"widgets-dashboard--Full-screen\"\n >\n <i [c8yIcon]=\"(inFullScreen$ | async) ? 'compress' : 'expand'\"></i>\n <span class=\"visible-xs-inline hidden-sm visible-md-inline visibile-lg-inline\">\n {{ 'Full screen' | translate }}\n </span>\n </button>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item\n [placement]=\"'more'\"\n [priority]=\"-2000\"\n *ngIf=\"settings.canCopy\"\n>\n <button\n class=\"hidden-xs\"\n title=\"{{ isCopyDisabled ? copyDashboardWarningMessage : (copyDashboardLabel | translate) }}\"\n type=\"button\"\n [ngClass]=\"{ 'btn btn-link': !settings.canDelete }\"\n data-cy=\"widgets-dashboard--copy-dashboard\"\n (click)=\"onCopyDashboard.emit()\"\n [disabled]=\"isCopyDisabled || editMode\"\n >\n <i c8yIcon=\"clone\"></i>\n <span>{{ copyDashboardLabel | translate }}</span>\n </button>\n <button\n class=\"visible-xs m-l-0\"\n tooltip=\"{{ 'Not available on mobile phone' | translate }}\"\n type=\"button\"\n [ngClass]=\"{ 'btn btn-link': !settings.canDelete }\"\n [disabled]=\"true\"\n >\n <i c8yIcon=\"clone\"></i>\n <span>{{ copyDashboardLabel | translate }}</span>\n </button>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item\n [placement]=\"'more'\"\n [priority]=\"-3000\"\n *ngIf=\"settings.canDelete && onDeleteDashboard.observers.length\"\n>\n <button\n class=\"hidden-xs\"\n title=\"{{ 'Delete dashboard' | translate }}\"\n type=\"button\"\n [ngClass]=\"{ 'btn btn-link': !settings.canCopy }\"\n (click)=\"onDeleteDashboard.emit()\"\n [disabled]=\"settings.isDisabled || editMode\"\n >\n <i c8yIcon=\"delete\"></i>\n <span\n translate\n >\n Delete dashboard\n </span>\n </button>\n <button\n class=\"visible-xs m-l-0\"\n tooltip=\"{{ 'Not available on mobile phone' | translate }}\"\n type=\"button\"\n [ngClass]=\"{ 'btn btn-link': !settings.canCopy }\"\n [disabled]=\"true\"\n >\n <i c8yIcon=\"delete\"></i>\n <span\n translate\n >\n Delete dashboard\n </span>\n </button>\n</c8y-action-bar-item>\n\n<ng-template #loadingIndicator>\n <c8y-loading\n class=\"col-xs-12 text-center\"\n *ngIf=\"isLoadingWidgets$ | async\"\n ></c8y-loading>\n</ng-template>\n\n<ng-container *ngIf=\"!(isLoadingWidgets$ | async); else loadingIndicator\">\n <ng-container *ngIf=\"resolvedWidgets$ | async as widgetsToDisplay\">\n <!-- empty state -->\n <c8y-ui-empty-state\n [icon]=\"'c8y-device'\"\n [title]=\"'No widgets to display.' | translate\"\n *ngIf=\"widgetsToDisplay?.length === 0\"\n >\n <div *ngIf=\"onAddWidget.observers.length\">\n <p\n translate\n *ngIf=\"editMode\"\n >\n Add widgets to this dashboard.\n </p>\n <p\n translate\n *ngIf=\"!editMode\"\n >\n Click \"Edit widgets\" to unlock\n </p>\n <div>\n <button\n class=\"btn btn-primary m-t-16\"\n title=\"{{ 'Add widget' | translate }}\"\n type=\"button\"\n [disabled]=\"settings.isDisabled || !editMode\"\n (click)=\"onAddWidget.emit()\"\n data-cy=\"c8y-widgets-dashboard--add-widget\"\n translate\n >\n Add widget\n </button>\n </div>\n <p c8y-guide-docs>\n <small\n translate\n ngNonBindable\n >\n Find out more in the\n <a c8y-guide-href=\"/docs/cockpit/working-with-dashboards\">user documentation</a>\n .\n </small>\n </p>\n </div>\n </c8y-ui-empty-state>\n\n <c8y-dashboard\n [columns]=\"settings.columns\"\n (dashboardChange)=\"onChangeDashboard.emit($event)\"\n #dashboard\n >\n <c8y-dashboard-child\n *ngFor=\"let widget of widgetsToDisplay\"\n [class]=\"widget.classes\"\n [x]=\"widget._x\"\n [y]=\"widget._y\"\n [width]=\"widget._width || settings.defaultWidth\"\n [height]=\"widget._height || settings.defaultHeight\"\n [margin]=\"settings.widgetMargin\"\n [data]=\"widget\"\n [useIntersection]=\"true\"\n [editMode]=\"editMode\"\n (changeStart)=\"onChangeStart.emit({ widget: widget, source: child, dashboard: dashboard })\"\n (changeEnd)=\"onChangeEnd.emit({ widget: widget, source: child, dashboard: dashboard })\"\n (toggleFullscreen)=\"toggleFullscreenOnWidget(child)\"\n [canToggleFullscreen]=\"!(inFullScreen$ | async) || widgetInFullscreenMode\"\n #child\n >\n <c8y-dashboard-child-title>\n <span\n data-cy=\"c8y-dashboard-list--device-widget\"\n *ngIf=\"settings.translateWidgetTitle\"\n >\n {{ widget.title | translate }}\n </span>\n <span *ngIf=\"!settings.translateWidgetTitle\">\n {{ widget.title }}\n </span>\n </c8y-dashboard-child-title>\n <c8y-dashboard-child-action *ngIf=\"onEditWidget.observers.length\">\n <button\n title=\"{{ 'Edit widget' | translate }}\"\n type=\"button\"\n data-cy=\"widgets-dashboard--Edit-widget\"\n (click)=\"onEditWidget.emit({ widget: widget, source: child, dashboard: dashboard })\"\n >\n <i c8yIcon=\"pencil\"></i>\n <span\n translate\n >\n Edit\n </span>\n </button>\n </c8y-dashboard-child-action>\n <c8y-dashboard-child-action *ngIf=\"onDeleteWidget.observers.length\">\n <button\n title=\"{{ 'Remove widget' | translate }}\"\n type=\"button\"\n data-cy=\"c8y-widgets-dashboard--remove-widget\"\n (click)=\"onDeleteWidget.emit({ widget: widget, source: child, dashboard: dashboard })\"\n >\n <i c8yIcon=\"delete\"></i>\n <span\n translate\n >\n Remove\n </span>\n </button>\n </c8y-dashboard-child-action>\n\n <c8y-widget-time-context\n *ngIf=\"\n (widget.config?.displaySettings?.globalTimeContext ||\n widget.config?.displaySettings?.globalRealtimeContext) &&\n widget.config.widgetInstanceGlobalTimeContext\n \"\n (dateContextChange)=\"updateWidgetConfig($event, widget)\"\n [canDecouple]=\"widget.config.canDecoupleGlobalTimeContext\"\n [displaySettings]=\"widget.config.displaySettings\"\n [hidden]=\"editMode\"\n ></c8y-widget-time-context>\n\n <c8y-dynamic-component\n [componentId]=\"widget.componentId || widget.name\"\n [config]=\"\n widget.templateUrl || widget.widgetComponent\n ? { child: widget, dashboard: contextDashboard, context: context }\n : widget.config\n \"\n *ngIf=\"child.intersected\"\n (updateWidgetClasses)=\"updateWidgetClasses(widget, $event)\"\n ></c8y-dynamic-component>\n </c8y-dashboard-child>\n </c8y-dashboard>\n </ng-container>\n</ng-container>\n" }]
|
|
231
240
|
}], ctorParameters: () => [{ type: i1.DynamicComponentService }, { type: i2.TranslateService }, { type: i3.ActivatedRoute }, { type: i4.ModalService }], propDecorators: { widgets: [{
|
|
232
241
|
type: Input
|
|
233
242
|
}], context: [{
|
|
@@ -270,4 +279,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.9", ngImpor
|
|
|
270
279
|
}], revertChange: [{
|
|
271
280
|
type: Output
|
|
272
281
|
}] } });
|
|
273
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2lkZ2V0cy1kYXNoYm9hcmQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vY29yZS9kYXNoYm9hcmQvd2lkZ2V0cy1kYXNoYm9hcmQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vY29yZS9kYXNoYm9hcmQvd2lkZ2V0cy1kYXNoYm9hcmQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN2RSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFJakQsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sZ0RBQWdELENBQUM7QUFDekYsT0FBTyxFQUFFLGVBQWUsRUFBRSxhQUFhLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBYyxNQUFNLE1BQU0sQ0FBQztBQUNwRixPQUFPLEVBQUUsR0FBRyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEUsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNoQyxPQUFPLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUVqRixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBRWxDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDeEMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLFdBQVcsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQWFuQyxNQUFNLE9BQU8seUJBQXlCO0lBQ3BDLElBQ0ksT0FBTyxDQUFDLEtBQWU7UUFDekIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFD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Q0gsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQzs4R0EvUVUseUJBQXlCO2tHQUF6Qix5QkFBeUIsd3pCQUZ6QixDQUFDLDRCQUE0QixDQUFDLDBCQzFCM0MsdzBYQTZYQTs7MkZEaldhLHlCQUF5QjtrQkFYckMsU0FBUzsrQkFDRSx1QkFBdUIsUUFFM0I7d0JBQ0osS0FBSyxFQUFFOztLQUVOO3dCQUNELEtBQUssRUFBRSw4QkFBOEI7cUJBQ3RDLGFBQ1UsQ0FBQyw0QkFBNEIsQ0FBQzttTEFJckMsT0FBTztzQkFEVixLQUFLO2dCQVVOLE9BQU87c0JBRE4sS0FBSztnQkFPTixnQkFBZ0I7c0JBRGYsS0FBSztnQkFJRixTQUFTO3NCQURaLEtBQUs7dUJBQUMsVUFBVTtnQkFNUixjQUFjO3NCQUF0QixLQUFLO2dCQUdOLFVBQVU7c0JBRFQsS0FBSztnQkFJTixlQUFlO3NCQURkLEtBQUs7Z0JBdUJOLFdBQVc7c0JBRFYsTUFBTTtnQkFJUCxZQUFZO3NCQURYLE1BQU07Z0JBSVAsY0FBYztzQkFEYixNQUFNO2dCQUlQLGlCQUFpQjtzQkFEaEIsTUFBTTtnQkFJUCxRQUFRO3NCQURQLE1BQU07Z0JBSVAsZUFBZTtzQkFEZCxNQUFNO2dCQUlQLGVBQWU7c0JBRGQsTUFBTTtnQkFJUCxpQkFBaUI7c0JBRGhCLE1BQU07Z0JBSVAsYUFBYTtzQkFEWixNQUFNO2dCQUlQLFdBQVc7c0JBRFYsTUFBTTtnQkFJUCxlQUFlO3NCQURkLE1BQU07Z0JBSVAsaUJBQWlCO3NCQURoQixNQUFNO2dCQUlQLFlBQVk7c0JBRFgsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZSB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBCcmVhZGNydW1iSXRlbSB9IGZyb20gJy4uL2JyZWFkY3J1bWIvYnJlYWRjcnVtYi5tb2RlbCc7XG5pbXBvcnQgeyBEYXNoYm9hcmRDb21wb25lbnQgfSBmcm9tICcuL2Rhc2hib2FyZC5jb21wb25lbnQnO1xuaW1wb3J0IHsgRGFzaGJvYXJkQ2hhbmdlLCBEYXNoYm9hcmRTZXR0aW5ncywgV2lkZ2V0LCBXaWRnZXRDaGFuZ2UgfSBmcm9tICcuL2Rhc2hib2FyZC5tb2RlbCc7XG5pbXBvcnQgeyBEeW5hbWljQ29tcG9uZW50U2VydmljZSB9IGZyb20gJy4uL2R5bmFtaWMtY29tcG9uZW50L2R5bmFtaWMtY29tcG9uZW50LnNlcnZpY2UnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBjb21iaW5lTGF0ZXN0LCBmcm9tRXZlbnQsIG1lcmdlLCBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBtYXAsIHNoYXJlUmVwbGF5LCBzdGFydFdpdGgsIHN3aXRjaE1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IHNldCB9IGZyb20gJ2xvZGFzaC1lcyc7XG5pbXBvcnQgeyBXaWRnZXRzRGFzaGJvYXJkRXZlbnRTZXJ2aWNlIH0gZnJvbSAnLi93aWRnZXRzLWRhc2hib2FyZC1ldmVudC5zZXJ2aWNlJztcbmltcG9ydCB7IERhc2hib2FyZENoaWxkQ29tcG9uZW50IH0gZnJvbSAnLi9kYXNoYm9hcmQtY2hpbGQuY29tcG9uZW50JztcbmltcG9ydCB7IFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7IGdldHRleHQgfSBmcm9tICcuLi9pMThuJztcbmltcG9ydCB7IFJldmVydENoYW5nZVR5cGUgfSBmcm9tICcuL3dpZGdldC1jaGFuZ2UtZXZlbnQubW9kZWwnO1xuaW1wb3J0IHsgTW9kYWxTZXJ2aWNlIH0gZnJvbSAnLi4vbW9kYWwnO1xuaW1wb3J0IHsgU3RhdHVzIH0gZnJvbSAnLi4vY29tbW9uJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYzh5LXdpZGdldHMtZGFzaGJvYXJkJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3dpZGdldHMtZGFzaGJvYXJkLmNvbXBvbmVudC5odG1sJyxcbiAgaG9zdDoge1xuICAgIHN0eWxlOiBgXG4gICAgICBkaXNwbGF5OiBibG9jaztcbiAgICBgLFxuICAgIGNsYXNzOiAnZGFzaGJvYXJkIGM4eS1ncmlkLWRhc2hib2FyZCdcbiAgfSxcbiAgcHJvdmlkZXJzOiBbV2lkZ2V0c0Rhc2hib2FyZEV2ZW50U2VydmljZV1cbn0pXG5leHBvcnQgY2xhc3MgV2lkZ2V0c0Rhc2hib2FyZENvbXBvbmVudCB7XG4gIEBJbnB1dCgpXG4gIHNldCB3aWRnZXRzKHZhbHVlOiBXaWRnZXRbXSkge1xuICAgIHRoaXMuX3dpZGdldHMubmV4dCh2YWx1ZSk7XG4gIH1cblxuICBnZXQgd2lkZ2V0cygpOiBXaWRnZXRbXSB7XG4gICAgcmV0dXJuIHRoaXMuX3dpZGdldHMudmFsdWU7XG4gIH1cblxuICBASW5wdXQoKVxuICBjb250ZXh0OiBhbnk7XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyBpZiBkZXZpY2UgaW5mbyBpbiBjb25maWcgc2hvdWxkIGJlIG92ZXJyaWRkZW4gd2l0aCB2YWx1ZXMgZnJvbSBjb250ZXh0IHByb3BlcnR5LlxuICAgKi9cbiAgQElucHV0KClcbiAgY29udGV4dERhc2hib2FyZDogYW55ID0geyB1cGRhdGVUYXJnZXQ6IHRydWUgfTtcblxuICBASW5wdXQoJ3NldHRpbmdzJylcbiAgc2V0IF9zZXR0aW5ncyhzZXR0aW5nczogUGFydGlhbDxEYXNoYm9hcmRTZXR0aW5ncz4pIHtcbiAgICB0aGlzLnNldHRpbmdzID0geyAuLi50aGlzLnNldHRpbmdzLCAuLi5zZXR0aW5ncyB9O1xuICAgIHRoaXMuaXNMb2FkaW5nJC5uZXh0KCEhdGhpcy5zZXR0aW5ncy5pc0xvYWRpbmcpO1xuICB9XG5cbiAgQElucHV0KCkgaXNDb3B5RGlzYWJsZWQ6IGJvb2xlYW47XG5cbiAgQElucHV0KClcbiAgYnJlYWRjcnVtYjogQnJlYWRjcnVtYkl0ZW07XG5cbiAgQElucHV0KClcbiAgZWRpdE1vZGVCdXR0b25zOiB7XG4gICAgdW5kb0J1dHRvbkRpc2FibGVkOiBib29sZWFuO1xuICAgIGNoYW5nZVRvVW5kb05hbWU6IHN0cmluZztcbiAgICByZWRvQnV0dG9uRGlzYWJsZWQ6IGJvb2xlYW47XG4gICAgY2hhbmdlVG9SZWRvTmFtZTogc3RyaW5nO1xuICB9O1xuXG4gIHNldHRpbmdzOiBEYXNoYm9hcmRTZXR0aW5ncyA9IHtcbiAgICBpc0Zyb3plbjogZmFsc2UsXG4gICAgaXNEaXNhYmxlZDogZmFsc2UsXG4gICAgd2lkZ2V0TWFyZ2luOiAxMixcbiAgICB0cmFuc2xhdGVXaWRnZXRUaXRsZTogZmFsc2UsXG4gICAgZGVmYXVsdEhlaWdodDogNCxcbiAgICBkZWZhdWx0V2lkdGg6IDQsXG4gICAgYWxsb3dGdWxsc2NyZWVuOiBmYWxzZSxcbiAgICBjYW5Db3B5OiB0cnVlLFxuICAgIGNhbkRlbGV0ZTogdHJ1ZSxcbiAgICBpc0xvYWRpbmc6IGZhbHNlLFxuICAgIGNvbHVtbnM6IDEyXG4gIH07XG5cbiAgQE91dHB1dCgpXG4gIG9uQWRkV2lkZ2V0OiBFdmVudEVtaXR0ZXI8RGFzaGJvYXJkQ29tcG9uZW50PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICBAT3V0cHV0KClcbiAgb25FZGl0V2lkZ2V0OiBFdmVudEVtaXR0ZXI8V2lkZ2V0Q2hhbmdlPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICBAT3V0cHV0KClcbiAgb25EZWxldGVXaWRnZXQ6IEV2ZW50RW1pdHRlcjxXaWRnZXRDaGFuZ2U+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIEBPdXRwdXQoKVxuICBvbkNoYW5nZURhc2hib2FyZDogRXZlbnRFbWl0dGVyPERhc2hib2FyZENoYW5nZT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgQE91dHB1dCgpXG4gIG9uUmVzaXplOiBFdmVudEVtaXR0ZXI8dm9pZD4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgQE91dHB1dCgpXG4gIG9uRWRpdERhc2hib2FyZDogRXZlbnRFbWl0dGVyPERhc2hib2FyZENvbXBvbmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgQE91dHB1dCgpXG4gIG9uQ29weURhc2hib2FyZDogRXZlbnRFbWl0dGVyPERhc2hib2FyZENvbXBvbmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgQE91dHB1dCgpXG4gIG9uRGVsZXRlRGFzaGJvYXJkOiBFdmVudEVtaXR0ZXI8RGFzaGJvYXJkQ29tcG9uZW50PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICBAT3V0cHV0KClcbiAgb25DaGFuZ2VTdGFydDogRXZlbnRFbWl0dGVyPFdpZGdldENoYW5nZT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgQE91dHB1dCgpXG4gIG9uQ2hhbmdlRW5kOiBFdmVudEVtaXR0ZXI8V2lkZ2V0Q2hhbmdlPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICBAT3V0cHV0KClcbiAgb25TYXZlRGFzaGJvYXJkOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICBAT3V0cHV0KClcbiAgb25DYW5jZWxEYXNoYm9hcmQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIEBPdXRwdXQoKVxuICByZXZlcnRDaGFuZ2U6IEV2ZW50RW1pdHRlcjxSZXZlcnRDaGFuZ2VUeXBlPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICByZXNvbHZlZFdpZGdldHMkOiBPYnNlcnZhYmxlPFdpZGdldFtdPjtcblxuICBpc0xvYWRpbmdXaWRnZXRzJDogT2JzZXJ2YWJsZTxib29sZWFuPjtcblxuICBjb3B5RGFzaGJvYXJkV2FybmluZ01lc3NhZ2U6IHN0cmluZztcblxuICBlZGl0TW9kZSA9IGZhbHNlO1xuICB3aWRnZXRJbkZ1bGxzY3JlZW5Nb2RlID0gZmFsc2U7XG5cbiAgaW5GdWxsU2NyZWVuJCA9IGZyb21FdmVudChkb2N1bWVudCwgJ2Z1bGxzY3JlZW5jaGFuZ2UnKS5waXBlKFxuICAgIG1hcCgoKSA9PiB0aGlzLmZ1bGxTY3JlZW4oKSksXG4gICAgc3RhcnRXaXRoKHRoaXMuZnVsbFNjcmVlbigpKVxuICApO1xuXG4gIHJlYWRvbmx5IGNvcHlEYXNoYm9hcmRMYWJlbCA9IGdldHRleHQoJ0NvcHkgZGFzaGJvYXJkJyk7XG4gIHJlYWRvbmx5IHVuZG9NZXNzYWdlID0gZ2V0dGV4dCgnVW5kbzogXCJ7eyBjaGFuZ2VUb1VuZG8gfX1cIicpO1xuICByZWFkb25seSByZWRvTWVzc2FnZSA9IGdldHRleHQoJ1JlZG86IFwie3sgY2hhbmdlVG9SZWRvIH19XCInKTtcblxuICBwcml2YXRlIF93aWRnZXRzID0gbmV3IEJlaGF2aW9yU3ViamVjdDxXaWRnZXRbXT4oW10pO1xuICBwcml2YXRlIGlzTG9hZGluZyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0KCEhdGhpcy5fc2V0dGluZ3M/LmlzTG9hZGluZyk7XG4gIHByaXZhdGUgaXNFeGVjdXRpbmdSZXNvbHZlcnMkOiBPYnNlcnZhYmxlPGJvb2xlYW4+O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgZHluYW1pYzogRHluYW1pY0NvbXBvbmVudFNlcnZpY2UsXG4gICAgcHJpdmF0ZSB0cmFuc2xhdGVTZXJ2aWNlOiBUcmFuc2xhdGVTZXJ2aWNlLFxuICAgIHByaXZhdGUgcm91dGU6IEFjdGl2YXRlZFJvdXRlLFxuICAgIHByaXZhdGUgbW9kYWw6IE1vZGFsU2VydmljZVxuICApIHtcbiAgICBjb25zdCB2aWV3Q29udGV4dCA9IHRoaXMucm91dGUucGFyZW50LnNuYXBzaG90LmRhdGE/LmNvbnRleHQ7XG4gICAgaWYgKHZpZXdDb250ZXh0KSB7XG4gICAgICBjb25zdCBjdHggPSB2aWV3Q29udGV4dC5zcGxpdCgnLycpLnNoaWZ0KCk7XG4gICAgICB0aGlzLmNvcHlEYXNoYm9hcmRXYXJuaW5nTWVzc2FnZSA9IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KFxuICAgICAgICAnT25seSBkYXNoYm9hcmRzIHdpdGggd2lkZ2V0cyByZWZlcmVuY2luZyB0aGUgY3VycmVudCB7eyBjdHggfX0gY2FuIGJlIGNvcGllZC4nLFxuICAgICAgICB7IGN0eCB9XG4gICAgICApO1xuICAgIH1cblxuICAgIHRoaXMucmVzb2x2ZWRXaWRnZXRzJCA9IHRoaXMuX3dpZGdldHMucGlwZShcbiAgICAgIHN3aXRjaE1hcCh3aWRnZXRzID0+IHRoaXMuZXhlY3V0ZVJlc29sdmVyc09mV2lkZ2V0cyh3aWRnZXRzKSksXG4gICAgICBzaGFyZVJlcGxheSgxKVxuICAgICk7XG4gICAgdGhpcy5pc0V4ZWN1dGluZ1Jlc29sdmVycyQgPSBtZXJnZShcbiAgICAgIHRoaXMuX3dpZGdldHMucGlwZShtYXAoKCkgPT4gdHJ1ZSkpLFxuICAgICAgdGhpcy5yZXNvbHZlZFdpZGdldHMkLnBpcGUobWFwKCgpID0+IGZhbHNlKSlcbiAgICApO1xuICAgIHRoaXMuaXNMb2FkaW5nV2lkZ2V0cyQgPSBjb21iaW5lTGF0ZXN0KFt0aGlzLmlzTG9hZGluZyQsIHRoaXMuaXNFeGVjdXRpbmdSZXNvbHZlcnMkXSkucGlwZShcbiAgICAgIG1hcChsb2FkaW5ncyA9PiBsb2FkaW5ncy5zb21lKGxvYWRpbmcgPT4gbG9hZGluZykpLFxuICAgICAgc2hhcmVSZXBsYXkoMSlcbiAgICApO1xuICB9XG5cbiAgYXN5bmMgY2FuRGVhY3RpdmF0ZShvbWl0Q29uZmlybSA9IGZhbHNlKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgaWYgKCF0aGlzLmVkaXRNb2RlIHx8IHRoaXMuZWRpdE1vZGVCdXR0b25zLnVuZG9CdXR0b25EaXNhYmxlZCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChvbWl0Q29uZmlybSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5jb25maXJtQ2xvc2luZygpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHRvZ2dsZUZ1bGxzY3JlZW4oaGFzV2lkZ2V0ID0gZmFsc2UpIHtcbiAgICBjb25zdCBlbGVtID0gZG9jdW1lbnQuYm9keSBhcyBhbnk7XG4gICAgY29uc3QgZG9jID0gZG9jdW1lbnQgYXMgYW55O1xuICAgIGlmIChoYXNXaWRnZXQpIHtcbiAgICAgIGVsZW0uY2xhc3NMaXN0LmFkZCgnc2luZ2xlV2lkZ2V0Jyk7XG4gICAgICB0aGlzLndpZGdldEluRnVsbHNjcmVlbk1vZGUgPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBlbGVtLmNsYXNzTGlzdC5yZW1vdmUoJ3NpbmdsZVdpZGdldCcpO1xuICAgICAgdGhpcy53aWRnZXRJbkZ1bGxzY3JlZW5Nb2RlID0gZmFsc2U7XG4gICAgfVxuICAgIGlmICghdGhpcy5mdWxsU2NyZWVuKCkpIHtcbiAgICAgIGlmIChlbGVtLnJlcXVlc3RGdWxsc2NyZWVuKSB7XG4gICAgICAgIGVsZW0ucmVxdWVzdEZ1bGxzY3JlZW4oKTtcbiAgICAgIH0gZWxzZSBpZiAoZWxlbS5tc1JlcXVlc3RGdWxsc2NyZWVuKSB7XG4gICAgICAgIGVsZW0ubXNSZXF1ZXN0RnVsbHNjcmVlbigpO1xuICAgICAgfSBlbHNlIGlmIChlbGVtLm1velJlcXVlc3RGdWxsU2NyZWVuKSB7XG4gICAgICAgIGVsZW0ubW96UmVxdWVzdEZ1bGxTY3JlZW4oKTtcbiAgICAgIH0gZWxzZSBpZiAoZWxlbS53ZWJraXRSZXF1ZXN0RnVsbHNjcmVlbikge1xuICAgICAgICBlbGVtLndlYmtpdFJlcXVlc3RGdWxsc2NyZWVuKChFbGVtZW50IGFzIGFueSkuQUxMT1dfS0VZQk9BUkRfSU5QVVQpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZG9jLmV4aXRGdWxsc2NyZWVuKSB7XG4gICAgICBkb2MuZXhpdEZ1bGxzY3JlZW4oKTtcbiAgICB9IGVsc2UgaWYgKGRvYy5tc0V4aXRGdWxsc2NyZWVuKSB7XG4gICAgICBkb2MubXNFeGl0RnVsbHNjcmVlbigpO1xuICAgIH0gZWxzZSBpZiAoZG9jLm1vekNhbmNlbEZ1bGxTY3JlZW4pIHtcbiAgICAgIGRvYy5tb3pDYW5jZWxGdWxsU2NyZWVuKCk7XG4gICAgfSBlbHNlIGlmIChkb2Mud2Via2l0RXhpdEZ1bGxzY3JlZW4pIHtcbiAgICAgIGRvYy53ZWJraXRFeGl0RnVsbHNjcmVlbigpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bGxTY3JlZW4oKSB7XG4gICAgY29uc3QgZG9jOiBhbnkgPSBkb2N1bWVudDtcbiAgICByZXR1cm4gISEoXG4gICAgICBkb2MuZnVsbHNjcmVlbkVsZW1lbnQgfHxcbiAgICAgIGRvYy5tb3pGdWxsU2NyZWVuRWxlbWVudCB8fFxuICAgICAgZG9jLndlYmtpdEZ1bGxzY3JlZW5FbGVtZW50IHx8XG4gICAgICBkb2MubXNGdWxsc2NyZWVuRWxlbWVudFxuICAgICk7XG4gIH1cblxuICB0b2dnbGVGdWxsc2NyZWVuT25XaWRnZXQoY2hpbGQ6IERhc2hib2FyZENoaWxkQ29tcG9uZW50KSB7XG4gICAgY2hpbGQuZnVsbHNjcmVlbiA9ICFjaGlsZC5mdWxsc2NyZWVuO1xuICAgIGlmIChjaGlsZC5mdWxsc2NyZWVuKSB7XG4gICAgICBjb25zdCBvbkZ1bGxTY3JlZW4gPSAoKSA9PiB7XG4gICAgICAgIGNoaWxkLmZ1bGxzY3JlZW4gPSAhIWRvY3VtZW50LmZ1bGxzY3JlZW5FbGVtZW50O1xuICAgICAgICBpZiAoIWNoaWxkLmZ1bGxzY3JlZW4pIHtcbiAgICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdmdWxsc2NyZWVuY2hhbmdlJywgb25GdWxsU2NyZWVuKTtcbiAgICAgICAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5yZW1vdmUoJ3NpbmdsZVdpZGdldCcpO1xuICAgICAgICAgIC8vIHJlcXVpcmVkIGluIGNhc2UgZnVsbHNjcmVlbiBpcyBleGl0ZWQgYnkgZS5nLiBwcmVzc2luZyBFU0NcbiAgICAgICAgICB0aGlzLm9uUmVzaXplLm5leHQoKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2Z1bGxzY3JlZW5jaGFuZ2UnLCBvbkZ1bGxTY3JlZW4pO1xuICAgIH1cbiAgICB0aGlzLnRvZ2dsZUZ1bGxzY3JlZW4oY2hpbGQuZnVsbHNjcmVlbik7XG4gICAgdGhpcy5vblJlc2l6ZS5uZXh0KCk7XG4gIH1cblxuICB1cGRhdGVXaWRnZXRDbGFzc2VzKHdpZGdldDogV2lkZ2V0LCBjbGFzc2VzOiBSZWNvcmQ8c3RyaW5nLCBib29sZWFuPikge1xuICAgIHdpZGdldC5jbGFzc2VzID0geyAuLi53aWRnZXQuY2xhc3NlcywgLi4uY2xhc3NlcyB9O1xuICB9XG5cbiAgdXBkYXRlV2lkZ2V0Q29uZmlnKGRhdGE6IGFueSwgd2lkZ2V0OiBXaWRnZXQpIHtcbiAgICB3aWRnZXQuY29uZmlnID0geyAuLi53aWRnZXQuY29uZmlnLCAuLi5kYXRhIH07XG4gIH1cblxuICBhc3luYyBjYW5jZWxEYXNoYm9hcmRTYXZlKCkge1xuICAgIGlmIChhd2FpdCB0aGlzLmNhbkRlYWN0aXZhdGUoKSkge1xuICAgICAgdGhpcy5vbkNhbmNlbERhc2hib2FyZC5lbWl0KCk7XG4gICAgfVxuICB9XG5cbiAgc2F2ZURhc2hib2FyZCgpIHtcbiAgICB0aGlzLmVkaXRNb2RlID0gZmFsc2U7XG4gICAgdGhpcy5vblNhdmVEYXNoYm9hcmQuZW1pdCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBjb25maXJtQ2xvc2luZygpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5tb2RhbC5jb25maXJtKFxuICAgICAgICBnZXR0ZXh0KCdFeGl0IGVkaXQgbW9kZScpLFxuICAgICAgICBnZXR0ZXh0KCdBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gZXhpdCB0aGUgZWRpdCBtb2RlPyBBbGwgdW5zYXZlZCBjaGFuZ2VzIHdpbGwgYmUgbG9zdC4nKSxcbiAgICAgICAgU3RhdHVzLldBUk5JTkcsXG4gICAgICAgIHtcbiAgICAgICAgICBvazogZ2V0dGV4dCgnRXhpdCcpLFxuICAgICAgICAgIGNhbmNlbDogZ2V0dGV4dCgnQ2FuY2VsJylcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGV4ZWN1dGVSZXNvbHZlcnNPZldpZGdldHMod2lkZ2V0czogV2lkZ2V0W10pOiBQcm9taXNlPFdpZGdldFtdPiB7XG4gICAgaWYgKCF3aWRnZXRzKSB7XG4gICAgICByZXR1cm4gd2lkZ2V0cztcbiAgICB9XG5cbiAgICBjb25zdCB0dXBsZSA9IHdpZGdldHMubWFwKHdpZGdldCA9PiAoe1xuICAgICAgY29tcG9uZW50SWQ6IHdpZGdldC5jb21wb25lbnRJZCB8fCB3aWRnZXQubmFtZSxcbiAgICAgIGNvbmZpZzogd2lkZ2V0LmNvbmZpZ1xuICAgIH0pKTtcblxuICAgIGNvbnN0IHJlc29sdmVkUmVzdWx0cyA9IGF3YWl0IHRoaXMuZHluYW1pYy5leGVjdXRlUmVzb2x2ZXJzKHR1cGxlKTtcbiAgICB3aWRnZXRzLmZvckVhY2goKHdpZGdldCwgaW5kZXgpID0+IHtcbiAgICAgIGlmIChyZXNvbHZlZFJlc3VsdHNbaW5kZXhdKSB7XG4gICAgICAgIGlmICghd2lkZ2V0LmNvbmZpZykge1xuICAgICAgICAgIHdpZGdldC5jb25maWcgPSB7fTtcbiAgICAgICAgfVxuICAgICAgICBPYmplY3QuZW50cmllcyhyZXNvbHZlZFJlc3VsdHNbaW5kZXhdKS5mb3JFYWNoKChba2V5LCB2YWx1ZV0pID0+XG4gICAgICAgICAgc2V0KHdpZGdldC5jb25maWcsIGtleSwgdmFsdWUpXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHdpZGdldHM7XG4gIH1cbn1cbiIsIjxjOHktdGl0bGUgKm5nSWY9XCIhIXNldHRpbmdzLnRpdGxlXCI+XG4gIHt7IHNldHRpbmdzLnRpdGxlIHwgdHJhbnNsYXRlIH19XG48L2M4eS10aXRsZT5cblxuPGM4eS1icmVhZGNydW1iICpuZ0lmPVwiISFicmVhZGNydW1iXCI+XG4gIDxjOHktYnJlYWRjcnVtYi1pdGVtXG4gICAgW2ljb25dPVwiYnJlYWRjcnVtYi5pY29uXCJcbiAgICBbbGFiZWxdPVwiYnJlYWRjcnVtYi5sYWJlbFwiXG4gICAgW3BhdGhdPVwiYnJlYWRjcnVtYi5wYXRoXCJcbiAgPjwvYzh5LWJyZWFkY3J1bWItaXRlbT5cbjwvYzh5LWJyZWFkY3J1bWI+XG5cbjxjOHktYWN0aW9uLWJhci1pdGVtXG4gIFtwbGFjZW1lbnRdPVwiJ2xlZnQnXCJcbiAgKm5nSWY9XCIhZWRpdE1vZGVcIlxuPlxuICA8YnV0dG9uXG4gICAgY2xhc3M9XCJidG4gYnRuLWxpbmsgYW5pbWF0ZWQgZmFkZUluIGhpZGRlbi14c1wiXG4gICAgdGl0bGU9XCJ7eyAnRWRpdCB3aWRnZXRzJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgdHlwZT1cImJ1dHRvblwiXG4gICAgW2Rpc2FibGVkXT1cInNldHRpbmdzLmlzRGlzYWJsZWRcIlxuICAgIChjbGljayk9XCJlZGl0TW9kZSA9IHRydWU7IGNvbnRleHREYXNoYm9hcmQuaGlzdG9yeURlc2NyaXB0aW9uID0ge31cIlxuICAgIGRhdGEtY3k9XCJjOHktd2lkZ2V0LWRhc2hib2FyZC0tZWRpdC13aWRnZXRzXCJcbiAgPlxuICAgIDxpIGM4eUljb249XCJzZW5kLWJhY2t3YXJkXCI+PC9pPlxuICAgIDxzcGFuIGNsYXNzPVwibS1sLTRcIj57eyAnRWRpdCB3aWRnZXRzJyB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgPC9idXR0b24+XG4gIDxidXR0b25cbiAgICBjbGFzcz1cImJ0biBidG4tbGluayB2aXNpYmxlLXhzIG0tbC0wXCJcbiAgICB0b29sdGlwPVwie3sgJ05vdCBhdmFpbGFibGUgb24gbW9iaWxlIHBob25lJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgdHlwZT1cImJ1dHRvblwiXG4gICAgW2Rpc2FibGVkXT1cInRydWVcIlxuICA+XG4gICAgPGkgYzh5SWNvbj1cInNlbmQtYmFja3dhcmRcIj48L2k+XG4gICAgPHNwYW4gY2xhc3M9XCJtLWwtNFwiPnt7ICdFZGl0IHdpZGdldHMnIHwgdHJhbnNsYXRlIH19PC9zcGFuPlxuICA8L2J1dHRvbj5cbjwvYzh5LWFjdGlvbi1iYXItaXRlbT5cblxuPGM4eS1hY3Rpb24tYmFyLWl0ZW1cbiAgW3BsYWNlbWVudF09XCInbGVmdCdcIlxuICAqbmdJZj1cImVkaXRNb2RlXCJcbj5cbiAgPGJ1dHRvblxuICAgIGNsYXNzPVwiYnRuIGJ0bi1saW5rIGFuaW1hdGVkIGZhZGVJblwiXG4gICAgdGl0bGU9XCJ7eyAnQWRkIHdpZGdldCcgfCB0cmFuc2xhdGUgfX1cIlxuICAgIHR5cGU9XCJidXR0b25cIlxuICAgIChjbGljayk9XCJvbkFkZFdpZGdldC5lbWl0KClcIlxuICAgIGRhdGEtY3k9XCJ3aWRnZXQtZGFzaGJvYXJkLS1BZGQtd2lkZ2V0XCJcbiAgPlxuICAgIDxpIGM4eUljb249XCJwbHVzLWNpcmNsZVwiPjwvaT5cbiAgICB7eyAnQWRkIHdpZGdldCcgfCB0cmFuc2xhdGUgfX1cbiAgPC9idXR0b24+XG48L2M4eS1hY3Rpb24tYmFyLWl0ZW0+XG5cbjxjOHktYWN0aW9uLWJhci1pdGVtXG4gIFtwbGFjZW1lbnRdPVwiJ2xlZnQnXCJcbiAgaXRlbUNsYXNzPVwiZC1mbGV4IGEtaS1jZW50ZXIgZ2FwLThcIlxuICAqbmdJZj1cImVkaXRNb2RlXCJcbj5cbiAgPGRpdiBjbGFzcz1cImlucHV0LWdyb3VwIGlucHV0LWdyb3VwLXNtIGFuaW1hdGVkIGZhZGVJblwiPlxuICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1ncm91cC1idG5cIj5cbiAgICAgIDxidXR0b25cbiAgICAgICAgY2xhc3M9XCJidG4gYnRuLWRlZmF1bHQgYnRuLXNtIGJ0bi1pY29uXCJcbiAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInVW5kbycgfCB0cmFuc2xhdGVcIlxuICAgICAgICBbdG9vbHRpcF09XCJcbiAgICAgICAgICBlZGl0TW9kZUJ1dHRvbnMudW5kb0J1dHRvbkRpc2FibGVkXG4gICAgICAgICAgICA/ICcnXG4gICAgICAgICAgICA6ICh1bmRvTWVzc2FnZVxuICAgICAgICAgICAgICB8IHRyYW5zbGF0ZTogeyBjaGFuZ2VUb1VuZG86IGVkaXRNb2RlQnV0dG9ucy5jaGFuZ2VUb1VuZG9OYW1lIHwgdHJhbnNsYXRlIH0pXG4gICAgICAgIFwiXG4gICAgICAgIGNvbnRhaW5lcj1cImJvZHlcIlxuICAgICAgICAoY2xpY2spPVwicmV2ZXJ0Q2hhbmdlLmVtaXQoJ3VuZG8nKVwiXG4gICAgICAgIFtkaXNhYmxlZF09XCJlZGl0TW9kZUJ1dHRvbnMudW5kb0J1dHRvbkRpc2FibGVkXCJcbiAgICAgID5cbiAgICAgICAgPGkgW2M4eUljb25dPVwiJ3VuZG8nXCI+PC9pPlxuICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImlucHV0LWdyb3VwLWJ0blwiPlxuICAgICAgPGJ1dHRvblxuICAgICAgICBjbGFzcz1cImJ0biBidG4tZGVmYXVsdCBidG4tc20gYnRuLWljb25cIlxuICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidSZWRvJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgIFt0b29sdGlwXT1cIlxuICAgICAgICAgIGVkaXRNb2RlQnV0dG9ucy5yZWRvQnV0dG9uRGlzYWJsZWRcbiAgICAgICAgICAgID8gJydcbiAgICAgICAgICAgIDogKHJlZG9NZXNzYWdlXG4gICAgICAgICAgICAgIHwgdHJhbnNsYXRlOiB7IGNoYW5nZVRvUmVkbzogZWRpdE1vZGVCdXR0b25zLmNoYW5nZVRvUmVkb05hbWUgfCB0cmFuc2xhdGUgfSlcbiAgICAgICAgXCJcbiAgICAgICAgY29udGFpbmVyPVwiYm9keVwiXG4gICAgICAgIChjbGljayk9XCJyZXZlcnRDaGFuZ2UuZW1pdCgncmVkbycpXCJcbiAgICAgICAgW2Rpc2FibGVkXT1cImVkaXRNb2RlQnV0dG9ucy5yZWRvQnV0dG9uRGlzYWJsZWRcIlxuICAgICAgPlxuICAgICAgICA8aSBbYzh5SWNvbl09XCIncmVkbydcIj48L2k+XG4gICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgICA8c3Bhbj48L3NwYW4+XG4gIDwvZGl2PlxuICA8ZGl2IGNsYXNzPVwiYnRuLWdyb3VwIGFuaW1hdGVkIGZhZGVJblwiPlxuICAgIDxidXR0b25cbiAgICAgIGNsYXNzPVwiYnRuIGJ0bi1kZWZhdWx0IGJ0bi1zbVwiXG4gICAgICB0aXRsZT1cInt7ICdDYW5jZWwnIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgKGNsaWNrKT1cImNhbmNlbERhc2hib2FyZFNhdmUoKVwiXG4gICAgPlxuICAgICAge3sgJ0NhbmNlbCcgfCB0cmFuc2xhdGUgfX1cbiAgICA8L2J1dHRvbj5cbiAgICA8YnV0dG9uXG4gICAgICBjbGFzcz1cImJ0biBidG4tcHJpbWFyeSBidG4tc20gbS1sLThcIlxuICAgICAgdGl0bGU9XCJ7eyAnU2F2ZScgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICBbZGlzYWJsZWRdPVwiZWRpdE1vZGVCdXR0b25zLnVuZG9CdXR0b25EaXNhYmxlZFwiXG4gICAgICAoY2xpY2spPVwic2F2ZURhc2hib2FyZCgpXCJcbiAgICAgIGRhdGEtY3k9XCJjOHktd2lkZ2V0cy1kYXNoYm9hcmQtLXNhdmVcIlxuICAgID5cbiAgICAgIHt7ICdTYXZlJyB8IHRyYW5zbGF0ZSB9fVxuICAgIDwvYnV0dG9uPlxuICA8L2Rpdj5cbjwvYzh5LWFjdGlvbi1iYXItaXRlbT5cblxuPGM4eS1hY3Rpb24tYmFyLWl0ZW1cbiAgW3BsYWNlbWVudF09XCIncmlnaHQnXCJcbiAgKm5nSWY9XCJvbkVkaXREYXNoYm9hcmQub2JzZXJ2ZXJzLmxlbmd0aFwiXG4+XG4gIDxidXR0b25cbiAgICBjbGFzcz1cImJ0biBidG4tbGluayBoaWRkZW4teHMgbS1sLTBcIlxuICAgIHRpdGxlPVwie3sgJ0Rhc2hib2FyZCBzZXR0aW5ncycgfCB0cmFuc2xhdGUgfX1cIlxuICAgIHR5cGU9XCJidXR0b25cIlxuICAgIFtkaXNhYmxlZF09XCJzZXR0aW5ncy5pc0Rpc2FibGVkIHx8IGVkaXRNb2RlXCJcbiAgICAoY2xpY2spPVwib25FZGl0RGFzaGJvYXJkLmVtaXQoKVwiXG4gICAgZGF0YS1jeT1cImM4eS13aWRnZXRzLWRhc2hib2FyZC0tZWRpdC1kYXNoYm9hcmRcIlxuICA+XG4gICAgPGkgYzh5SWNvbj1cInNvcnRpbmctc2xpZGVyXCI+PC9pPlxuICAgIDxzcGFuIGNsYXNzPVwidmlzaWJsZS14cy1pbmxpbmUgaGlkZGVuLXNtIHZpc2libGUtbWQtaW5saW5lIHZpc2libGUtbGctaW5saW5lXCI+XG4gICAgICB7eyAnRGFzaGJvYXJkIHNldHRpbmdzJyB8IHRyYW5zbGF0ZSB9fVxuICAgIDwvc3Bhbj5cbiAgPC9idXR0b24+XG4gIDxidXR0b25cbiAgICBjbGFzcz1cImJ0biBidG4tbGluayB2aXNpYmxlLXhzIG0tbC0wXCJcbiAgICB0b29sdGlwPVwie3sgJ05vdCBhdmFpbGFibGUgb24gbW9iaWxlIHBob25lJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgdHlwZT1cImJ1dHRvblwiXG4gICAgW2Rpc2FibGVkXT1cInRydWVcIlxuICA+XG4gICAgPGkgYzh5SWNvbj1cInNvcnRpbmctc2xpZGVyXCI+PC9pPlxuICAgIDxzcGFuIGNsYXNzPVwidmlzaWJsZS14cy1pbmxpbmUgaGlkZGVuLXNtIHZpc2libGUtbWQtaW5saW5lIHZpc2libGUtbGctaW5saW5lXCI+XG4gICAgICB7eyAnRGFzaGJvYXJkIHNldHRpbmdzJyB8IHRyYW5zbGF0ZSB9fVxuICAgIDwvc3Bhbj5cbiAgPC9idXR0b24+XG48L2M4eS1hY3Rpb24tYmFyLWl0ZW0+XG5cbjxjOHktYWN0aW9uLWJhci1pdGVtXG4gIFtwbGFjZW1lbnRdPVwiJ3JpZ2h0J1wiXG4gICpuZ0lmPVwic2V0dGluZ3MuYWxsb3dGdWxsc2NyZWVuXCJcbiAgW3ByaW9yaXR5XT1cIi01MDAwXCJcbiAgaXRlbUNsYXNzPVwicHVsbC1yaWdodFwiXG4+XG4gIDxidXR0b25cbiAgICBjbGFzcz1cImJ0biBidG4tbGlua1wiXG4gICAgW2F0dHIuYXJpYS1sYWJlbF09XCInRnVsbCBzY3JlZW4nIHwgdHJhbnNsYXRlXCJcbiAgICB0b29sdGlwPVwie3sgJ0Z1bGwgc2NyZWVuJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgcGxhY2VtZW50PVwibGVmdFwiXG4gICAgY29udGFpbmVyPVwiYm9keVwiXG4gICAgdHlwZT1cImJ1dHRvblwiXG4gICAgW2RlbGF5XT1cIjUwMFwiXG4gICAgKGNsaWNrKT1cInRvZ2dsZUZ1bGxzY3JlZW4oKVwiXG4gICAgZGF0YS1jeT1cIndpZGdldHMtZGFzaGJvYXJkLS1GdWxsLXNjcmVlblwiXG4gID5cbiAgICA8aSBbYzh5SWNvbl09XCIoaW5GdWxsU2NyZWVuJCB8IGFzeW5jKSA/ICdjb21wcmVzcycgOiAnZXhwYW5kJ1wiPjwvaT5cbiAgICA8c3BhbiBjbGFzcz1cInZpc2libGUteHMtaW5saW5lIGhpZGRlbi1zbSB2aXNpYmxlLW1kLWlubGluZSB2aXNpYmlsZS1sZy1pbmxpbmVcIj5cbiAgICAgIHt7ICdGdWxsIHNjcmVlbicgfCB0cmFuc2xhdGUgfX1cbiAgICA8L3NwYW4+XG4gIDwvYnV0dG9uPlxuPC9jOHktYWN0aW9uLWJhci1pdGVtPlxuXG48Yzh5LWFjdGlvbi1iYXItaXRlbVxuICBbcGxhY2VtZW50XT1cIidtb3JlJ1wiXG4gIFtwcmlvcml0eV09XCItMjAwMFwiXG4gICpuZ0lmPVwic2V0dGluZ3MuY2FuQ29weVwiXG4+XG4gIDxidXR0b25cbiAgICBjbGFzcz1cImhpZGRlbi14c1wiXG4gICAgdGl0bGU9XCJ7eyBpc0NvcHlEaXNhYmxlZCA/IGNvcHlEYXNoYm9hcmRXYXJuaW5nTWVzc2FnZSA6IChjb3B5RGFzaGJvYXJkTGFiZWwgfCB0cmFuc2xhdGUpIH19XCJcbiAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICBbbmdDbGFzc109XCJ7ICdidG4gYnRuLWxpbmsnOiAhc2V0dGluZ3MuY2FuRGVsZXRlIH1cIlxuICAgIGRhdGEtY3k9XCJ3aWRnZXRzLWRhc2hib2FyZC0tY29weS1kYXNoYm9hcmRcIlxuICAgIChjbGljayk9XCJvbkNvcHlEYXNoYm9hcmQuZW1pdCgpXCJcbiAgICBbZGlzYWJsZWRdPVwiaXNDb3B5RGlzYWJsZWQgfHwgZWRpdE1vZGVcIlxuICA+XG4gICAgPGkgYzh5SWNvbj1cImNsb25lXCI+PC9pPlxuICAgIDxzcGFuPnt7IGNvcHlEYXNoYm9hcmRMYWJlbCB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgPC9idXR0b24+XG4gIDxidXR0b25cbiAgICBjbGFzcz1cInZpc2libGUteHMgbS1sLTBcIlxuICAgIHRvb2x0aXA9XCJ7eyAnTm90IGF2YWlsYWJsZSBvbiBtb2JpbGUgcGhvbmUnIHwgdHJhbnNsYXRlIH19XCJcbiAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICBbbmdDbGFzc109XCJ7ICdidG4gYnRuLWxpbmsnOiAhc2V0dGluZ3MuY2FuRGVsZXRlIH1cIlxuICAgIFtkaXNhYmxlZF09XCJ0cnVlXCJcbiAgPlxuICAgIDxpIGM4eUljb249XCJjbG9uZVwiPjwvaT5cbiAgIDxzcGFuPnt7IGNvcHlEYXNoYm9hcmRMYWJlbCB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgPC9idXR0b24+XG48L2M4eS1hY3Rpb24tYmFyLWl0ZW0+XG5cbjxjOHktYWN0aW9uLWJhci1pdGVtXG4gIFtwbGFjZW1lbnRdPVwiJ21vcmUnXCJcbiAgW3ByaW9yaXR5XT1cIi0zMDAwXCJcbiAgKm5nSWY9XCJzZXR0aW5ncy5jYW5EZWxldGUgJiYgb25EZWxldGVEYXNoYm9hcmQub2JzZXJ2ZXJzLmxlbmd0aFwiXG4+XG4gIDxidXR0b25cbiAgICBjbGFzcz1cImhpZGRlbi14c1wiXG4gICAgdGl0bGU9XCJ7eyAnRGVsZXRlIGRhc2hib2FyZCcgfCB0cmFuc2xhdGUgfX1cIlxuICAgIHR5cGU9XCJidXR0b25cIlxuICAgIFtuZ0NsYXNzXT1cInsgJ2J0biBidG4tbGluayc6ICFzZXR0aW5ncy5jYW5Db3B5IH1cIlxuICAgIChjbGljayk9XCJvbkRlbGV0ZURhc2hib2FyZC5lbWl0KClcIlxuICAgIFtkaXNhYmxlZF09XCJzZXR0aW5ncy5pc0Rpc2FibGVkIHx8IGVkaXRNb2RlXCJcbiAgPlxuICAgIDxpIGM4eUljb249XCJkZWxldGVcIj48L2k+XG4gICAgPHNwYW5cbiAgICAgIHRyYW5zbGF0ZVxuICAgID5cbiAgICAgIERlbGV0ZSBkYXNoYm9hcmRcbiAgICA8L3NwYW4+XG4gIDwvYnV0dG9uPlxuICA8YnV0dG9uXG4gICAgY2xhc3M9XCJ2aXNpYmxlLXhzIG0tbC0wXCJcbiAgICB0b29sdGlwPVwie3sgJ05vdCBhdmFpbGFibGUgb24gbW9iaWxlIHBob25lJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgdHlwZT1cImJ1dHRvblwiXG4gICAgW25nQ2xhc3NdPVwieyAnYnRuIGJ0bi1saW5rJzogIXNldHRpbmdzLmNhbkNvcHkgfVwiXG4gICAgW2Rpc2FibGVkXT1cInRydWVcIlxuICA+XG4gICAgPGkgYzh5SWNvbj1cImRlbGV0ZVwiPjwvaT5cbiAgICA8c3BhblxuICAgICAgdHJhbnNsYXRlXG4gICAgPlxuICAgICAgRGVsZXRlIGRhc2hib2FyZFxuICAgIDwvc3Bhbj5cbiAgPC9idXR0b24+XG48L2M4eS1hY3Rpb24tYmFyLWl0ZW0+XG5cbjxuZy10ZW1wbGF0ZSAjbG9hZGluZ0luZGljYXRvcj5cbiAgPGM4eS1sb2FkaW5nXG4gICAgY2xhc3M9XCJjb2wteHMtMTIgdGV4dC1jZW50ZXJcIlxuICAgICpuZ0lmPVwiaXNMb2FkaW5nV2lkZ2V0cyQgfCBhc3luY1wiXG4gID48L2M4eS1sb2FkaW5nPlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLWNvbnRhaW5lciAqbmdJZj1cIiEoaXNMb2FkaW5nV2lkZ2V0cyQgfCBhc3luYyk7IGVsc2UgbG9hZGluZ0luZGljYXRvclwiPlxuICA8bmctY29udGFpbmVyICpuZ0lmPVwicmVzb2x2ZWRXaWRnZXRzJCB8IGFzeW5jIGFzIHdpZGdldHNUb0Rpc3BsYXlcIj5cbiAgICA8IS0tIGVtcHR5IHN0YXRlIC0tPlxuICAgIDxjOHktdWktZW1wdHktc3RhdGVcbiAgICAgIFtpY29uXT1cIidjOHktZGV2aWNlJ1wiXG4gICAgICBbdGl0bGVdPVwiJ05vIHdpZGdldHMgdG8gZGlzcGxheS4nIHwgdHJhbnNsYXRlXCJcbiAgICAgICpuZ0lmPVwid2lkZ2V0c1RvRGlzcGxheT8ubGVuZ3RoID09PSAwXCJcbiAgICA+XG4gICAgICA8ZGl2ICpuZ0lmPVwib25BZGRXaWRnZXQub2JzZXJ2ZXJzLmxlbmd0aFwiPlxuICAgICAgICA8cFxuICAgICAgICAgIHRyYW5zbGF0ZVxuICAgICAgICAgICpuZ0lmPVwiZWRpdE1vZGVcIlxuICAgICAgICA+XG4gICAgICAgICAgQWRkIHdpZGdldHMgdG8gdGhpcyBkYXNoYm9hcmQuXG4gICAgICAgIDwvcD5cbiAgICAgICAgPHBcbiAgICAgICAgICB0cmFuc2xhdGVcbiAgICAgICAgICAqbmdJZj1cIiFlZGl0TW9kZVwiXG4gICAgICAgID5cbiAgICAgICAgICBDbGljayBcIkVkaXQgd2lkZ2V0c1wiIHRvIHVubG9ja1xuICAgICAgICA8L3A+XG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLXByaW1hcnkgbS10LTE2XCJcbiAgICAgICAgICAgIHRpdGxlPVwie3sgJ0FkZCB3aWRnZXQnIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cInNldHRpbmdzLmlzRGlzYWJsZWQgfHwgIWVkaXRNb2RlXCJcbiAgICAgICAgICAgIChjbGljayk9XCJvbkFkZFdpZGdldC5lbWl0KClcIlxuICAgICAgICAgICAgZGF0YS1jeT1cImM4eS13aWRnZXRzLWRhc2hib2FyZC0tYWRkLXdpZGdldFwiXG4gICAgICAgICAgICB0cmFuc2xhdGVcbiAgICAgICAgICA+XG4gICAgICAgICAgICBBZGQgd2lkZ2V0XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8cCBjOHktZ3VpZGUtZG9jcz5cbiAgICAgICAgICA8c21hbGxcbiAgICAgICAgICAgIHRyYW5zbGF0ZVxuICAgICAgICAgICAgbmdOb25CaW5kYWJsZVxuICAgICAgICAgID5cbiAgICAgICAgICAgIEZpbmQgb3V0IG1vcmUgaW4gdGhlXG4gICAgICAgICAgICA8YSBjOHktZ3VpZGUtaHJlZj1cIi9kb2NzL2NvY2twaXQvd29ya2luZy13aXRoLWRhc2hib2FyZHNcIj51c2VyIGRvY3VtZW50YXRpb248L2E+XG4gICAgICAgICAgICAuXG4gICAgICAgICAgPC9zbWFsbD5cbiAgICAgICAgPC9wPlxuICAgICAgPC9kaXY+XG4gICAgPC9jOHktdWktZW1wdHktc3RhdGU+XG5cbiAgICA8Yzh5LWRhc2hib2FyZFxuICAgICAgW2NvbHVtbnNdPVwic2V0dGluZ3MuY29sdW1uc1wiXG4gICAgICAoZGFzaGJvYXJkQ2hhbmdlKT1cIm9uQ2hhbmdlRGFzaGJvYXJkLmVtaXQoJGV2ZW50KVwiXG4gICAgICAjZGFzaGJvYXJkXG4gICAgPlxuICAgICAgPGM4eS1kYXNoYm9hcmQtY2hpbGRcbiAgICAgICAgKm5nRm9yPVwibGV0IHdpZGdldCBvZiB3aWRnZXRzVG9EaXNwbGF5XCJcbiAgICAgICAgW2NsYXNzXT1cIndpZGdldC5jbGFzc2VzXCJcbiAgICAgICAgW3hdPVwid2lkZ2V0Ll94XCJcbiAgICAgICAgW3ldPVwid2lkZ2V0Ll95XCJcbiAgICAgICAgW3dpZHRoXT1cIndpZGdldC5fd2lkdGggfHwgc2V0dGluZ3MuZGVmYXVsdFdpZHRoXCJcbiAgICAgICAgW2hlaWdodF09XCJ3aWRnZXQuX2hlaWdodCB8fCBzZXR0aW5ncy5kZWZhdWx0SGVpZ2h0XCJcbiAgICAgICAgW21hcmdpbl09XCJzZXR0aW5ncy53aWRnZXRNYXJnaW5cIlxuICAgICAgICBbZGF0YV09XCJ3aWRnZXRcIlxuICAgICAgICBbdXNlSW50ZXJzZWN0aW9uXT1cInRydWVcIlxuICAgICAgICBbZWRpdE1vZGVdPVwiZWRpdE1vZGVcIlxuICAgICAgICAoY2hhbmdlU3RhcnQpPVwib25DaGFuZ2VTdGFydC5lbWl0KHsgd2lkZ2V0OiB3aWRnZXQsIHNvdXJjZTogY2hpbGQsIGRhc2hib2FyZDogZGFzaGJvYXJkIH0pXCJcbiAgICAgICAgKGNoYW5nZUVuZCk9XCJvbkNoYW5nZUVuZC5lbWl0KHsgd2lkZ2V0OiB3aWRnZXQsIHNvdXJjZTogY2hpbGQsIGRhc2hib2FyZDogZGFzaGJvYXJkIH0pXCJcbiAgICAgICAgKHRvZ2dsZUZ1bGxzY3JlZW4pPVwidG9nZ2xlRnVsbHNjcmVlbk9uV2lkZ2V0KGNoaWxkKVwiXG4gICAgICAgIFtjYW5Ub2dnbGVGdWxsc2NyZWVuXT1cIiEoaW5GdWxsU2NyZWVuJCB8IGFzeW5jKSB8fCB3aWRnZXRJbkZ1bGxzY3JlZW5Nb2RlXCJcbiAgICAgICAgI2NoaWxkXG4gICAgICA+XG4gICAgICAgIDxjOHktZGFzaGJvYXJkLWNoaWxkLXRpdGxlPlxuICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICBkYXRhLWN5PVwiYzh5LWRhc2hib2FyZC1saXN0LS1kZXZpY2Utd2lkZ2V0XCJcbiAgICAgICAgICAgICpuZ0lmPVwic2V0dGluZ3MudHJhbnNsYXRlV2lkZ2V0VGl0bGVcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIHt7IHdpZGdldC50aXRsZSB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiAqbmdJZj1cIiFzZXR0aW5ncy50cmFuc2xhdGVXaWRnZXRUaXRsZVwiPlxuICAgICAgICAgICAge3sgd2lkZ2V0LnRpdGxlIH19XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICA8L2M4eS1kYXNoYm9hcmQtY2hpbGQtdGl0bGU+XG4gICAgICAgIDxjOHktZGFzaGJvYXJkLWNoaWxkLWFjdGlvbiAqbmdJZj1cIm9uRWRpdFdpZGdldC5vYnNlcnZlcnMubGVuZ3RoXCI+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgdGl0bGU9XCJ7eyAnRWRpdCB3aWRnZXQnIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgZGF0YS1jeT1cIndpZGdldHMtZGFzaGJvYXJkLS1FZGl0LXdpZGdldFwiXG4gICAgICAgICAgICAoY2xpY2spPVwib25FZGl0V2lkZ2V0LmVtaXQoeyB3aWRnZXQ6IHdpZGdldCwgc291cmNlOiBjaGlsZCwgZGFzaGJvYXJkOiBkYXNoYm9hcmQgfSlcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxpIGM4eUljb249XCJwZW5jaWxcIj48L2k+XG4gICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICB0cmFuc2xhdGVcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgRWRpdFxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2M4eS1kYXNoYm9hcmQtY2hpbGQtYWN0aW9uPlxuICAgICAgICA8Yzh5LWRhc2hib2FyZC1jaGlsZC1hY3Rpb24gKm5nSWY9XCJvbkRlbGV0ZVdpZGdldC5vYnNlcnZlcnMubGVuZ3RoXCI+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgdGl0bGU9XCJ7eyAnUmVtb3ZlIHdpZGdldCcgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBkYXRhLWN5PVwiYzh5LXdpZGdldHMtZGFzaGJvYXJkLS1yZW1vdmUtd2lkZ2V0XCJcbiAgICAgICAgICAgIChjbGljayk9XCJvbkRlbGV0ZVdpZGdldC5lbWl0KHsgd2lkZ2V0OiB3aWRnZXQsIHNvdXJjZTogY2hpbGQsIGRhc2hib2FyZDogZGFzaGJvYXJkIH0pXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8aSBjOHlJY29uPVwiZGVsZXRlXCI+PC9pPlxuICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgdHJhbnNsYXRlXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIFJlbW92ZVxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2M4eS1kYXNoYm9hcmQtY2hpbGQtYWN0aW9uPlxuXG4gICAgICAgIDxjOHktd2lkZ2V0LXRpbWUtY29udGV4dFxuICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICAod2lkZ2V0LmNvbmZpZz8uZGlzcGxheVNldHRpbmdzPy5nbG9iYWxUaW1lQ29udGV4dCB8fFxuICAgICAgICAgICAgICB3aWRnZXQuY29uZmlnPy5kaXNwbGF5U2V0dGluZ3M/Lmdsb2JhbFJlYWx0aW1lQ29udGV4dCkgJiZcbiAgICAgICAgICAgIHdpZGdldC5jb25maWcud2lkZ2V0SW5zdGFuY2VHbG9iYWxUaW1lQ29udGV4dFxuICAgICAgICAgIFwiXG4gICAgICAgICAgKGRhdGVDb250ZXh0Q2hhbmdlKT1cInVwZGF0ZVdpZGdldENvbmZpZygkZXZlbnQsIHdpZGdldClcIlxuICAgICAgICAgIFtjYW5EZWNvdXBsZV09XCJ3aWRnZXQuY29uZmlnLmNhbkRlY291cGxlR2xvYmFsVGltZUNvbnRleHRcIlxuICAgICAgICAgIFtkaXNwbGF5U2V0dGluZ3NdPVwid2lkZ2V0LmNvbmZpZy5kaXNwbGF5U2V0dGluZ3NcIlxuICAgICAgICAgIFtoaWRkZW5dPVwiZWRpdE1vZGVcIlxuICAgICAgICA+PC9jOHktd2lkZ2V0LXRpbWUtY29udGV4dD5cblxuICAgICAgICA8Yzh5LWR5bmFtaWMtY29tcG9uZW50XG4gICAgICAgICAgW2NvbXBvbmVudElkXT1cIndpZGdldC5jb21wb25lbnRJZCB8fCB3aWRnZXQubmFtZVwiXG4gICAgICAgICAgW2NvbmZpZ109XCJcbiAgICAgICAgICAgIHdpZGdldC50ZW1wbGF0ZVVybCB8fCB3aWRnZXQud2lkZ2V0Q29tcG9uZW50XG4gICAgICAgICAgICAgID8geyBjaGlsZDogd2lkZ2V0LCBkYXNoYm9hcmQ6IGNvbnRleHREYXNoYm9hcmQsIGNvbnRleHQ6IGNvbnRleHQgfVxuICAgICAgICAgICAgICA6IHdpZGdldC5jb25maWdcbiAgICAgICAgICBcIlxuICAgICAgICAgICpuZ0lmPVwiY2hpbGQuaW50ZXJzZWN0ZWRcIlxuICAgICAgICAgICh1cGRhdGVXaWRnZXRDbGFzc2VzKT1cInVwZGF0ZVdpZGdldENsYXNzZXMod2lkZ2V0LCAkZXZlbnQpXCJcbiAgICAgICAgPjwvYzh5LWR5bmFtaWMtY29tcG9uZW50PlxuICAgICAgPC9jOHktZGFzaGJvYXJkLWNoaWxkPlxuICAgIDwvYzh5LWRhc2hib2FyZD5cbiAgPC9uZy1jb250YWluZXI+XG48L25nLWNvbnRhaW5lcj5cbiJdfQ==
|
|
282
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2lkZ2V0cy1kYXNoYm9hcmQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vY29yZS9kYXNoYm9hcmQvd2lkZ2V0cy1kYXNoYm9hcmQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vY29yZS9kYXNoYm9hcmQvd2lkZ2V0cy1kYXNoYm9hcmQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN2RSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFHakQsT0FBTyxFQUdMLHlCQUF5QixFQUcxQixNQUFNLG1CQUFtQixDQUFDO0FBQzNCLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLGdEQUFnRCxDQUFDO0FBQ3pGLE9BQU8sRUFBRSxlQUFlLEVBQUUsYUFBYSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQWMsTUFBTSxNQUFNLENBQUM7QUFDcEYsT0FBTyxFQUFFLEdBQUcsRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3hFLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDaEMsT0FBTyxFQUFFLDRCQUE0QixFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFFakYsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdkQsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUVsQyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxXQUFXLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFhbkMsTUFBTSxPQUFPLHlCQUF5QjtJQUNwQyxJQUNJLE9BQU8sQ0FBQyxLQUFl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QkFJUCxXQUFXO3NCQURWLE1BQU07Z0JBSVAsZUFBZTtzQkFEZCxNQUFNO2dCQUlQLGlCQUFpQjtzQkFEaEIsTUFBTTtnQkFJUCxZQUFZO3NCQURYLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE91dHB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgQnJlYWRjcnVtYkl0ZW0gfSBmcm9tICcuLi9icmVhZGNydW1iL2JyZWFkY3J1bWIubW9kZWwnO1xuaW1wb3J0IHsgRGFzaGJvYXJkQ29tcG9uZW50IH0gZnJvbSAnLi9kYXNoYm9hcmQuY29tcG9uZW50JztcbmltcG9ydCB7XG4gIERhc2hib2FyZENoYW5nZSxcbiAgRGFzaGJvYXJkU2V0dGluZ3MsXG4gIE5FV19EQVNIQk9BUkRfUVVFUllfUEFSQU0sXG4gIFdpZGdldCxcbiAgV2lkZ2V0Q2hhbmdlXG59IGZyb20gJy4vZGFzaGJvYXJkLm1vZGVsJztcbmltcG9ydCB7IER5bmFtaWNDb21wb25lbnRTZXJ2aWNlIH0gZnJvbSAnLi4vZHluYW1pYy1jb21wb25lbnQvZHluYW1pYy1jb21wb25lbnQuc2VydmljZSc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIGNvbWJpbmVMYXRlc3QsIGZyb21FdmVudCwgbWVyZ2UsIE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IG1hcCwgc2hhcmVSZXBsYXksIHN0YXJ0V2l0aCwgc3dpdGNoTWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgc2V0IH0gZnJvbSAnbG9kYXNoLWVzJztcbmltcG9ydCB7IFdpZGdldHNEYXNoYm9hcmRFdmVudFNlcnZpY2UgfSBmcm9tICcuL3dpZGdldHMtZGFzaGJvYXJkLWV2ZW50LnNlcnZpY2UnO1xuaW1wb3J0IHsgRGFzaGJvYXJkQ2hpbGRDb21wb25lbnQgfSBmcm9tICcuL2Rhc2hib2FyZC1jaGlsZC5jb21wb25lbnQnO1xuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHsgZ2V0dGV4dCB9IGZyb20gJy4uL2kxOG4nO1xuaW1wb3J0IHsgUmV2ZXJ0Q2hhbmdlVHlwZSB9IGZyb20gJy4vd2lkZ2V0LWNoYW5nZS1ldmVudC5tb2RlbCc7XG5pbXBvcnQgeyBNb2RhbFNlcnZpY2UgfSBmcm9tICcuLi9tb2RhbCc7XG5pbXBvcnQgeyBTdGF0dXMgfSBmcm9tICcuLi9jb21tb24nO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjOHktd2lkZ2V0cy1kYXNoYm9hcmQnLFxuICB0ZW1wbGF0ZVVybDogJy4vd2lkZ2V0cy1kYXNoYm9hcmQuY29tcG9uZW50Lmh0bWwnLFxuICBob3N0OiB7XG4gICAgc3R5bGU6IGBcbiAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgIGAsXG4gICAgY2xhc3M6ICdkYXNoYm9hcmQgYzh5LWdyaWQtZGFzaGJvYXJkJ1xuICB9LFxuICBwcm92aWRlcnM6IFtXaWRnZXRzRGFzaGJvYXJkRXZlbnRTZXJ2aWNlXVxufSlcbmV4cG9ydCBjbGFzcyBXaWRnZXRzRGFzaGJvYXJkQ29tcG9uZW50IHtcbiAgQElucHV0KClcbiAgc2V0IHdpZGdldHModmFsdWU6IFdpZGdldFtdKSB7XG4gICAgdGhpcy5fd2lkZ2V0cy5uZXh0KHZhbHVlKTtcbiAgfVxuXG4gIGdldCB3aWRnZXRzKCk6IFdpZGdldFtdIHtcbiAgICByZXR1cm4gdGhpcy5fd2lkZ2V0cy52YWx1ZTtcbiAgfVxuXG4gIEBJbnB1dCgpXG4gIGNvbnRleHQ6IGFueTtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIGlmIGRldmljZSBpbmZvIGluIGNvbmZpZyBzaG91bGQgYmUgb3ZlcnJpZGRlbiB3aXRoIHZhbHVlcyBmcm9tIGNvbnRleHQgcHJvcGVydHkuXG4gICAqL1xuICBASW5wdXQoKVxuICBjb250ZXh0RGFzaGJvYXJkOiBhbnkgPSB7IHVwZGF0ZVRhcmdldDogdHJ1ZSB9O1xuXG4gIEBJbnB1dCgnc2V0dGluZ3MnKVxuICBzZXQgX3NldHRpbmdzKHNldHRpbmdzOiBQYXJ0aWFsPERhc2hib2FyZFNldHRpbmdzPikge1xuICAgIHRoaXMuc2V0dGluZ3MgPSB7IC4uLnRoaXMuc2V0dGluZ3MsIC4uLnNldHRpbmdzIH07XG4gICAgdGhpcy5pc0xvYWRpbmckLm5leHQoISF0aGlzLnNldHRpbmdzLmlzTG9hZGluZyk7XG4gIH1cblxuICBASW5wdXQoKSBpc0NvcHlEaXNhYmxlZDogYm9vbGVhbjtcblxuICBASW5wdXQoKVxuICBicmVhZGNydW1iOiBCcmVhZGNydW1iSXRlbTtcblxuICBASW5wdXQoKVxuICBlZGl0TW9kZUJ1dHRvbnM6IHtcbiAgICB1bmRvQnV0dG9uRGlzYWJsZWQ6IGJvb2xlYW47XG4gICAgY2hhbmdlVG9VbmRvTmFtZTogc3RyaW5nO1xuICAgIHJlZG9CdXR0b25EaXNhYmxlZDogYm9vbGVhbjtcbiAgICBjaGFuZ2VUb1JlZG9OYW1lOiBzdHJpbmc7XG4gIH07XG5cbiAgc2V0dGluZ3M6IERhc2hib2FyZFNldHRpbmdzID0ge1xuICAgIGlzRnJvemVuOiBmYWxzZSxcbiAgICBpc0Rpc2FibGVkOiBmYWxzZSxcbiAgICB3aWRnZXRNYXJnaW46IDEyLFxuICAgIHRyYW5zbGF0ZVdpZGdldFRpdGxlOiBmYWxzZSxcbiAgICBkZWZhdWx0SGVpZ2h0OiA0LFxuICAgIGRlZmF1bHRXaWR0aDogNCxcbiAgICBhbGxvd0Z1bGxzY3JlZW46IGZhbHNlLFxuICAgIGNhbkNvcHk6IHRydWUsXG4gICAgY2FuRGVsZXRlOiB0cnVlLFxuICAgIGlzTG9hZGluZzogZmFsc2UsXG4gICAgY29sdW1uczogMTJcbiAgfTtcblxuICBAT3V0cHV0KClcbiAgb25BZGRXaWRnZXQ6IEV2ZW50RW1pdHRlcjxEYXNoYm9hcmRDb21wb25lbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIEBPdXRwdXQoKVxuICBvbkVkaXRXaWRnZXQ6IEV2ZW50RW1pdHRlcjxXaWRnZXRDaGFuZ2U+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIEBPdXRwdXQoKVxuICBvbkRlbGV0ZVdpZGdldDogRXZlbnRFbWl0dGVyPFdpZGdldENoYW5nZT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgQE91dHB1dCgpXG4gIG9uQ2hhbmdlRGFzaGJvYXJkOiBFdmVudEVtaXR0ZXI8RGFzaGJvYXJkQ2hhbmdlPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICBAT3V0cHV0KClcbiAgb25SZXNpemU6IEV2ZW50RW1pdHRlcjx2b2lkPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICBAT3V0cHV0KClcbiAgb25FZGl0RGFzaGJvYXJkOiBFdmVudEVtaXR0ZXI8RGFzaGJvYXJkQ29tcG9uZW50PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICBAT3V0cHV0KClcbiAgb25Db3B5RGFzaGJvYXJkOiBFdmVudEVtaXR0ZXI8RGFzaGJvYXJkQ29tcG9uZW50PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICBAT3V0cHV0KClcbiAgb25EZWxldGVEYXNoYm9hcmQ6IEV2ZW50RW1pdHRlcjxEYXNoYm9hcmRDb21wb25lbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIEBPdXRwdXQoKVxuICBvbkNoYW5nZVN0YXJ0OiBFdmVudEVtaXR0ZXI8V2lkZ2V0Q2hhbmdlPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICBAT3V0cHV0KClcbiAgb25DaGFuZ2VFbmQ6IEV2ZW50RW1pdHRlcjxXaWRnZXRDaGFuZ2U+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIEBPdXRwdXQoKVxuICBvblNhdmVEYXNoYm9hcmQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIEBPdXRwdXQoKVxuICBvbkNhbmNlbERhc2hib2FyZDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgQE91dHB1dCgpXG4gIHJldmVydENoYW5nZTogRXZlbnRFbWl0dGVyPFJldmVydENoYW5nZVR5cGU+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIHJlc29sdmVkV2lkZ2V0cyQ6IE9ic2VydmFibGU8V2lkZ2V0W10+O1xuXG4gIGlzTG9hZGluZ1dpZGdldHMkOiBPYnNlcnZhYmxlPGJvb2xlYW4+O1xuXG4gIGNvcHlEYXNoYm9hcmRXYXJuaW5nTWVzc2FnZTogc3RyaW5nO1xuXG4gIGVkaXRNb2RlID0gZmFsc2U7XG4gIHdpZGdldEluRnVsbHNjcmVlbk1vZGUgPSBmYWxzZTtcblxuICBpbkZ1bGxTY3JlZW4kID0gZnJvbUV2ZW50KGRvY3VtZW50LCAnZnVsbHNjcmVlbmNoYW5nZScpLnBpcGUoXG4gICAgbWFwKCgpID0+IHRoaXMuZnVsbFNjcmVlbigpKSxcbiAgICBzdGFydFdpdGgodGhpcy5mdWxsU2NyZWVuKCkpXG4gICk7XG5cbiAgcmVhZG9ubHkgY29weURhc2hib2FyZExhYmVsID0gZ2V0dGV4dCgnQ29weSBkYXNoYm9hcmQnKTtcbiAgcmVhZG9ubHkgdW5kb01lc3NhZ2UgPSBnZXR0ZXh0KCdVbmRvOiBcInt7IGNoYW5nZVRvVW5kbyB9fVwiJyk7XG4gIHJlYWRvbmx5IHJlZG9NZXNzYWdlID0gZ2V0dGV4dCgnUmVkbzogXCJ7eyBjaGFuZ2VUb1JlZG8gfX1cIicpO1xuXG4gIHByaXZhdGUgX3dpZGdldHMgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFdpZGdldFtdPihbXSk7XG4gIHByaXZhdGUgaXNMb2FkaW5nJCA9IG5ldyBCZWhhdmlvclN1YmplY3QoISF0aGlzLl9zZXR0aW5ncz8uaXNMb2FkaW5nKTtcbiAgcHJpdmF0ZSBpc0V4ZWN1dGluZ1Jlc29sdmVycyQ6IE9ic2VydmFibGU8Ym9vbGVhbj47XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBkeW5hbWljOiBEeW5hbWljQ29tcG9uZW50U2VydmljZSxcbiAgICBwcml2YXRlIHRyYW5zbGF0ZVNlcnZpY2U6IFRyYW5zbGF0ZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSByb3V0ZTogQWN0aXZhdGVkUm91dGUsXG4gICAgcHJpdmF0ZSBtb2RhbDogTW9kYWxTZXJ2aWNlXG4gICkge1xuICAgIGNvbnN0IHZpZXdDb250ZXh0ID0gdGhpcy5yb3V0ZS5wYXJlbnQuc25hcHNob3QuZGF0YT8uY29udGV4dDtcbiAgICBpZiAodmlld0NvbnRleHQpIHtcbiAgICAgIGNvbnN0IGN0eCA9IHZpZXdDb250ZXh0LnNwbGl0KCcvJykuc2hpZnQoKTtcbiAgICAgIHRoaXMuY29weURhc2hib2FyZFdhcm5pbmdNZXNzYWdlID0gdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoXG4gICAgICAgICdPbmx5IGRhc2hib2FyZHMgd2l0aCB3aWRnZXRzIHJlZmVyZW5jaW5nIHRoZSBjdXJyZW50IHt7IGN0eCB9fSBjYW4gYmUgY29waWVkLicsXG4gICAgICAgIHsgY3R4IH1cbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnN0IGlzTmV3RGFzaGJvYXJkID0gdGhpcy5yb3V0ZS5zbmFwc2hvdC5xdWVyeVBhcmFtc1tORVdfREFTSEJPQVJEX1FVRVJZX1BBUkFNXTtcbiAgICBpZiAoaXNOZXdEYXNoYm9hcmQgPT09ICd0cnVlJykge1xuICAgICAgdGhpcy5lbmFibGVFZGl0TW9kZSgpO1xuICAgIH1cblxuICAgIHRoaXMucmVzb2x2ZWRXaWRnZXRzJCA9IHRoaXMuX3dpZGdldHMucGlwZShcbiAgICAgIHN3aXRjaE1hcCh3aWRnZXRzID0+IHRoaXMuZXhlY3V0ZVJlc29sdmVyc09mV2lkZ2V0cyh3aWRnZXRzKSksXG4gICAgICBzaGFyZVJlcGxheSgxKVxuICAgICk7XG4gICAgdGhpcy5pc0V4ZWN1dGluZ1Jlc29sdmVycyQgPSBtZXJnZShcbiAgICAgIHRoaXMuX3dpZGdldHMucGlwZShtYXAoKCkgPT4gdHJ1ZSkpLFxuICAgICAgdGhpcy5yZXNvbHZlZFdpZGdldHMkLnBpcGUobWFwKCgpID0+IGZhbHNlKSlcbiAgICApO1xuICAgIHRoaXMuaXNMb2FkaW5nV2lkZ2V0cyQgPSBjb21iaW5lTGF0ZXN0KFt0aGlzLmlzTG9hZGluZyQsIHRoaXMuaXNFeGVjdXRpbmdSZXNvbHZlcnMkXSkucGlwZShcbiAgICAgIG1hcChsb2FkaW5ncyA9PiBsb2FkaW5ncy5zb21lKGxvYWRpbmcgPT4gbG9hZGluZykpLFxuICAgICAgc2hhcmVSZXBsYXkoMSlcbiAgICApO1xuICB9XG5cbiAgYXN5bmMgY2FuRGVhY3RpdmF0ZShvbWl0Q29uZmlybSA9IGZhbHNlKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgaWYgKCF0aGlzLmVkaXRNb2RlIHx8IHRoaXMuZWRpdE1vZGVCdXR0b25zLnVuZG9CdXR0b25EaXNhYmxlZCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChvbWl0Q29uZmlybSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5jb25maXJtQ2xvc2luZygpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHRvZ2dsZUZ1bGxzY3JlZW4oaGFzV2lkZ2V0ID0gZmFsc2UpIHtcbiAgICBjb25zdCBlbGVtID0gZG9jdW1lbnQuYm9keSBhcyBhbnk7XG4gICAgY29uc3QgZG9jID0gZG9jdW1lbnQgYXMgYW55O1xuICAgIGlmIChoYXNXaWRnZXQpIHtcbiAgICAgIGVsZW0uY2xhc3NMaXN0LmFkZCgnc2luZ2xlV2lkZ2V0Jyk7XG4gICAgICB0aGlzLndpZGdldEluRnVsbHNjcmVlbk1vZGUgPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBlbGVtLmNsYXNzTGlzdC5yZW1vdmUoJ3NpbmdsZVdpZGdldCcpO1xuICAgICAgdGhpcy53aWRnZXRJbkZ1bGxzY3JlZW5Nb2RlID0gZmFsc2U7XG4gICAgfVxuICAgIGlmICghdGhpcy5mdWxsU2NyZWVuKCkpIHtcbiAgICAgIGlmIChlbGVtLnJlcXVlc3RGdWxsc2NyZWVuKSB7XG4gICAgICAgIGVsZW0ucmVxdWVzdEZ1bGxzY3JlZW4oKTtcbiAgICAgIH0gZWxzZSBpZiAoZWxlbS5tc1JlcXVlc3RGdWxsc2NyZWVuKSB7XG4gICAgICAgIGVsZW0ubXNSZXF1ZXN0RnVsbHNjcmVlbigpO1xuICAgICAgfSBlbHNlIGlmIChlbGVtLm1velJlcXVlc3RGdWxsU2NyZWVuKSB7XG4gICAgICAgIGVsZW0ubW96UmVxdWVzdEZ1bGxTY3JlZW4oKTtcbiAgICAgIH0gZWxzZSBpZiAoZWxlbS53ZWJraXRSZXF1ZXN0RnVsbHNjcmVlbikge1xuICAgICAgICBlbGVtLndlYmtpdFJlcXVlc3RGdWxsc2NyZWVuKChFbGVtZW50IGFzIGFueSkuQUxMT1dfS0VZQk9BUkRfSU5QVVQpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZG9jLmV4aXRGdWxsc2NyZWVuKSB7XG4gICAgICBkb2MuZXhpdEZ1bGxzY3JlZW4oKTtcbiAgICB9IGVsc2UgaWYgKGRvYy5tc0V4aXRGdWxsc2NyZWVuKSB7XG4gICAgICBkb2MubXNFeGl0RnVsbHNjcmVlbigpO1xuICAgIH0gZWxzZSBpZiAoZG9jLm1vekNhbmNlbEZ1bGxTY3JlZW4pIHtcbiAgICAgIGRvYy5tb3pDYW5jZWxGdWxsU2NyZWVuKCk7XG4gICAgfSBlbHNlIGlmIChkb2Mud2Via2l0RXhpdEZ1bGxzY3JlZW4pIHtcbiAgICAgIGRvYy53ZWJraXRFeGl0RnVsbHNjcmVlbigpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bGxTY3JlZW4oKSB7XG4gICAgY29uc3QgZG9jOiBhbnkgPSBkb2N1bWVudDtcbiAgICByZXR1cm4gISEoXG4gICAgICBkb2MuZnVsbHNjcmVlbkVsZW1lbnQgfHxcbiAgICAgIGRvYy5tb3pGdWxsU2NyZWVuRWxlbWVudCB8fFxuICAgICAgZG9jLndlYmtpdEZ1bGxzY3JlZW5FbGVtZW50IHx8XG4gICAgICBkb2MubXNGdWxsc2NyZWVuRWxlbWVudFxuICAgICk7XG4gIH1cblxuICB0b2dnbGVGdWxsc2NyZWVuT25XaWRnZXQoY2hpbGQ6IERhc2hib2FyZENoaWxkQ29tcG9uZW50KSB7XG4gICAgY2hpbGQuZnVsbHNjcmVlbiA9ICFjaGlsZC5mdWxsc2NyZWVuO1xuICAgIGlmIChjaGlsZC5mdWxsc2NyZWVuKSB7XG4gICAgICBjb25zdCBvbkZ1bGxTY3JlZW4gPSAoKSA9PiB7XG4gICAgICAgIGNoaWxkLmZ1bGxzY3JlZW4gPSAhIWRvY3VtZW50LmZ1bGxzY3JlZW5FbGVtZW50O1xuICAgICAgICBpZiAoIWNoaWxkLmZ1bGxzY3JlZW4pIHtcbiAgICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdmdWxsc2NyZWVuY2hhbmdlJywgb25GdWxsU2NyZWVuKTtcbiAgICAgICAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5yZW1vdmUoJ3NpbmdsZVdpZGdldCcpO1xuICAgICAgICAgIC8vIHJlcXVpcmVkIGluIGNhc2UgZnVsbHNjcmVlbiBpcyBleGl0ZWQgYnkgZS5nLiBwcmVzc2luZyBFU0NcbiAgICAgICAgICB0aGlzLm9uUmVzaXplLm5leHQoKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2Z1bGxzY3JlZW5jaGFuZ2UnLCBvbkZ1bGxTY3JlZW4pO1xuICAgIH1cbiAgICB0aGlzLnRvZ2dsZUZ1bGxzY3JlZW4oY2hpbGQuZnVsbHNjcmVlbik7XG4gICAgdGhpcy5vblJlc2l6ZS5uZXh0KCk7XG4gIH1cblxuICB1cGRhdGVXaWRnZXRDbGFzc2VzKHdpZGdldDogV2lkZ2V0LCBjbGFzc2VzOiBSZWNvcmQ8c3RyaW5nLCBib29sZWFuPikge1xuICAgIHdpZGdldC5jbGFzc2VzID0geyAuLi53aWRnZXQuY2xhc3NlcywgLi4uY2xhc3NlcyB9O1xuICB9XG5cbiAgdXBkYXRlV2lkZ2V0Q29uZmlnKGRhdGE6IGFueSwgd2lkZ2V0OiBXaWRnZXQpIHtcbiAgICB3aWRnZXQuY29uZmlnID0geyAuLi53aWRnZXQuY29uZmlnLCAuLi5kYXRhIH07XG4gIH1cblxuICBhc3luYyBjYW5jZWxEYXNoYm9hcmRTYXZlKCkge1xuICAgIGlmIChhd2FpdCB0aGlzLmNhbkRlYWN0aXZhdGUoKSkge1xuICAgICAgdGhpcy5vbkNhbmNlbERhc2hib2FyZC5lbWl0KCk7XG4gICAgfVxuICB9XG5cbiAgc2F2ZURhc2hib2FyZCgpIHtcbiAgICB0aGlzLmVkaXRNb2RlID0gZmFsc2U7XG4gICAgdGhpcy5vblNhdmVEYXNoYm9hcmQuZW1pdCgpO1xuICB9XG5cbiAgZW5hYmxlRWRpdE1vZGUoKSB7XG4gICAgdGhpcy5lZGl0TW9kZSA9IHRydWU7XG4gICAgdGhpcy5jb250ZXh0RGFzaGJvYXJkLmhpc3RvcnlEZXNjcmlwdGlvbiA9IHt9O1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBjb25maXJtQ2xvc2luZygpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5tb2RhbC5jb25maXJtKFxuICAgICAgICBnZXR0ZXh0KCdFeGl0IGVkaXQgbW9kZScpLFxuICAgICAgICBnZXR0ZXh0KCdBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gZXhpdCB0aGUgZWRpdCBtb2RlPyBBbGwgdW5zYXZlZCBjaGFuZ2VzIHdpbGwgYmUgbG9zdC4nKSxcbiAgICAgICAgU3RhdHVzLldBUk5JTkcsXG4gICAgICAgIHtcbiAgICAgICAgICBvazogZ2V0dGV4dCgnRXhpdCcpLFxuICAgICAgICAgIGNhbmNlbDogZ2V0dGV4dCgnQ2FuY2VsJylcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGV4ZWN1dGVSZXNvbHZlcnNPZldpZGdldHMod2lkZ2V0czogV2lkZ2V0W10pOiBQcm9taXNlPFdpZGdldFtdPiB7XG4gICAgaWYgKCF3aWRnZXRzKSB7XG4gICAgICByZXR1cm4gd2lkZ2V0cztcbiAgICB9XG5cbiAgICBjb25zdCB0dXBsZSA9IHdpZGdldHMubWFwKHdpZGdldCA9PiAoe1xuICAgICAgY29tcG9uZW50SWQ6IHdpZGdldC5jb21wb25lbnRJZCB8fCB3aWRnZXQubmFtZSxcbiAgICAgIGNvbmZpZzogd2lkZ2V0LmNvbmZpZ1xuICAgIH0pKTtcblxuICAgIGNvbnN0IHJlc29sdmVkUmVzdWx0cyA9IGF3YWl0IHRoaXMuZHluYW1pYy5leGVjdXRlUmVzb2x2ZXJzKHR1cGxlKTtcbiAgICB3aWRnZXRzLmZvckVhY2goKHdpZGdldCwgaW5kZXgpID0+IHtcbiAgICAgIGlmIChyZXNvbHZlZFJlc3VsdHNbaW5kZXhdKSB7XG4gICAgICAgIGlmICghd2lkZ2V0LmNvbmZpZykge1xuICAgICAgICAgIHdpZGdldC5jb25maWcgPSB7fTtcbiAgICAgICAgfVxuICAgICAgICBPYmplY3QuZW50cmllcyhyZXNvbHZlZFJlc3VsdHNbaW5kZXhdKS5mb3JFYWNoKChba2V5LCB2YWx1ZV0pID0+XG4gICAgICAgICAgc2V0KHdpZGdldC5jb25maWcsIGtleSwgdmFsdWUpXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHdpZGdldHM7XG4gIH1cbn1cbiIsIjxjOHktdGl0bGUgKm5nSWY9XCIhIXNldHRpbmdzLnRpdGxlXCI+XG4gIHt7IHNldHRpbmdzLnRpdGxlIHwgdHJhbnNsYXRlIH19XG48L2M4eS10aXRsZT5cblxuPGM4eS1icmVhZGNydW1iICpuZ0lmPVwiISFicmVhZGNydW1iXCI+XG4gIDxjOHktYnJlYWRjcnVtYi1pdGVtXG4gICAgW2ljb25dPVwiYnJlYWRjcnVtYi5pY29uXCJcbiAgICBbbGFiZWxdPVwiYnJlYWRjcnVtYi5sYWJlbFwiXG4gICAgW3BhdGhdPVwiYnJlYWRjcnVtYi5wYXRoXCJcbiAgPjwvYzh5LWJyZWFkY3J1bWItaXRlbT5cbjwvYzh5LWJyZWFkY3J1bWI+XG5cbjxjOHktYWN0aW9uLWJhci1pdGVtXG4gIFtwbGFjZW1lbnRdPVwiJ2xlZnQnXCJcbiAgKm5nSWY9XCIhZWRpdE1vZGVcIlxuPlxuICA8YnV0dG9uXG4gICAgY2xhc3M9XCJidG4gYnRuLWxpbmsgYW5pbWF0ZWQgZmFkZUluIGhpZGRlbi14c1wiXG4gICAgdGl0bGU9XCJ7eyAnRWRpdCB3aWRnZXRzJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgdHlwZT1cImJ1dHRvblwiXG4gICAgW2Rpc2FibGVkXT1cInNldHRpbmdzLmlzRGlzYWJsZWRcIlxuICAgIChjbGljayk9XCJlbmFibGVFZGl0TW9kZSgpXCJcbiAgICBkYXRhLWN5PVwiYzh5LXdpZGdldC1kYXNoYm9hcmQtLWVkaXQtd2lkZ2V0c1wiXG4gID5cbiAgICA8aSBjOHlJY29uPVwic2VuZC1iYWNrd2FyZFwiPjwvaT5cbiAgICA8c3BhbiBjbGFzcz1cIm0tbC00XCI+e3sgJ0VkaXQgd2lkZ2V0cycgfCB0cmFuc2xhdGUgfX08L3NwYW4+XG4gIDwvYnV0dG9uPlxuICA8YnV0dG9uXG4gICAgY2xhc3M9XCJidG4gYnRuLWxpbmsgdmlzaWJsZS14cyBtLWwtMFwiXG4gICAgdG9vbHRpcD1cInt7ICdOb3QgYXZhaWxhYmxlIG9uIG1vYmlsZSBwaG9uZScgfCB0cmFuc2xhdGUgfX1cIlxuICAgIHR5cGU9XCJidXR0b25cIlxuICAgIFtkaXNhYmxlZF09XCJ0cnVlXCJcbiAgPlxuICAgIDxpIGM4eUljb249XCJzZW5kLWJhY2t3YXJkXCI+PC9pPlxuICAgIDxzcGFuIGNsYXNzPVwibS1sLTRcIj57eyAnRWRpdCB3aWRnZXRzJyB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgPC9idXR0b24+XG48L2M4eS1hY3Rpb24tYmFyLWl0ZW0+XG5cbjxjOHktYWN0aW9uLWJhci1pdGVtXG4gIFtwbGFjZW1lbnRdPVwiJ2xlZnQnXCJcbiAgKm5nSWY9XCJlZGl0TW9kZVwiXG4+XG4gIDxidXR0b25cbiAgICBjbGFzcz1cImJ0biBidG4tbGluayBhbmltYXRlZCBmYWRlSW5cIlxuICAgIHRpdGxlPVwie3sgJ0FkZCB3aWRnZXQnIHwgdHJhbnNsYXRlIH19XCJcbiAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAoY2xpY2spPVwib25BZGRXaWRnZXQuZW1pdCgpXCJcbiAgICBkYXRhLWN5PVwid2lkZ2V0LWRhc2hib2FyZC0tQWRkLXdpZGdldFwiXG4gID5cbiAgICA8aSBjOHlJY29uPVwicGx1cy1jaXJjbGVcIj48L2k+XG4gICAge3sgJ0FkZCB3aWRnZXQnIHwgdHJhbnNsYXRlIH19XG4gIDwvYnV0dG9uPlxuPC9jOHktYWN0aW9uLWJhci1pdGVtPlxuXG48Yzh5LWFjdGlvbi1iYXItaXRlbVxuICBbcGxhY2VtZW50XT1cIidsZWZ0J1wiXG4gIGl0ZW1DbGFzcz1cImQtZmxleCBhLWktY2VudGVyIGdhcC04XCJcbiAgKm5nSWY9XCJlZGl0TW9kZVwiXG4+XG4gIDxkaXYgY2xhc3M9XCJpbnB1dC1ncm91cCBpbnB1dC1ncm91cC1zbSBhbmltYXRlZCBmYWRlSW5cIj5cbiAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtZ3JvdXAtYnRuXCI+XG4gICAgICA8YnV0dG9uXG4gICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1kZWZhdWx0IGJ0bi1zbSBidG4taWNvblwiXG4gICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ1VuZG8nIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgW3Rvb2x0aXBdPVwiXG4gICAgICAgICAgZWRpdE1vZGVCdXR0b25zLnVuZG9CdXR0b25EaXNhYmxlZFxuICAgICAgICAgICAgPyAnJ1xuICAgICAgICAgICAgOiAodW5kb01lc3NhZ2VcbiAgICAgICAgICAgICAgfCB0cmFuc2xhdGU6IHsgY2hhbmdlVG9VbmRvOiBlZGl0TW9kZUJ1dHRvbnMuY2hhbmdlVG9VbmRvTmFtZSB8IHRyYW5zbGF0ZSB9KVxuICAgICAgICBcIlxuICAgICAgICBjb250YWluZXI9XCJib2R5XCJcbiAgICAgICAgKGNsaWNrKT1cInJldmVydENoYW5nZS5lbWl0KCd1bmRvJylcIlxuICAgICAgICBbZGlzYWJsZWRdPVwiZWRpdE1vZGVCdXR0b25zLnVuZG9CdXR0b25EaXNhYmxlZFwiXG4gICAgICA+XG4gICAgICAgIDxpIFtjOHlJY29uXT1cIid1bmRvJ1wiPjwvaT5cbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1ncm91cC1idG5cIj5cbiAgICAgIDxidXR0b25cbiAgICAgICAgY2xhc3M9XCJidG4gYnRuLWRlZmF1bHQgYnRuLXNtIGJ0bi1pY29uXCJcbiAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInUmVkbycgfCB0cmFuc2xhdGVcIlxuICAgICAgICBbdG9vbHRpcF09XCJcbiAgICAgICAgICBlZGl0TW9kZUJ1dHRvbnMucmVkb0J1dHRvbkRpc2FibGVkXG4gICAgICAgICAgICA/ICcnXG4gICAgICAgICAgICA6IChyZWRvTWVzc2FnZVxuICAgICAgICAgICAgICB8IHRyYW5zbGF0ZTogeyBjaGFuZ2VUb1JlZG86IGVkaXRNb2RlQnV0dG9ucy5jaGFuZ2VUb1JlZG9OYW1lIHwgdHJhbnNsYXRlIH0pXG4gICAgICAgIFwiXG4gICAgICAgIGNvbnRhaW5lcj1cImJvZHlcIlxuICAgICAgICAoY2xpY2spPVwicmV2ZXJ0Q2hhbmdlLmVtaXQoJ3JlZG8nKVwiXG4gICAgICAgIFtkaXNhYmxlZF09XCJlZGl0TW9kZUJ1dHRvbnMucmVkb0J1dHRvbkRpc2FibGVkXCJcbiAgICAgID5cbiAgICAgICAgPGkgW2M4eUljb25dPVwiJ3JlZG8nXCI+PC9pPlxuICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG4gICAgPHNwYW4+PC9zcGFuPlxuICA8L2Rpdj5cbiAgPGRpdiBjbGFzcz1cImJ0bi1ncm91cCBhbmltYXRlZCBmYWRlSW5cIj5cbiAgICA8YnV0dG9uXG4gICAgICBjbGFzcz1cImJ0biBidG4tZGVmYXVsdCBidG4tc21cIlxuICAgICAgdGl0bGU9XCJ7eyAnQ2FuY2VsJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgIChjbGljayk9XCJjYW5jZWxEYXNoYm9hcmRTYXZlKClcIlxuICAgID5cbiAgICAgIHt7ICdDYW5jZWwnIHwgdHJhbnNsYXRlIH19XG4gICAgPC9idXR0b24+XG4gICAgPGJ1dHRvblxuICAgICAgY2xhc3M9XCJidG4gYnRuLXByaW1hcnkgYnRuLXNtIG0tbC04XCJcbiAgICAgIHRpdGxlPVwie3sgJ1NhdmUnIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgW2Rpc2FibGVkXT1cImVkaXRNb2RlQnV0dG9ucy51bmRvQnV0dG9uRGlzYWJsZWRcIlxuICAgICAgKGNsaWNrKT1cInNhdmVEYXNoYm9hcmQoKVwiXG4gICAgICBkYXRhLWN5PVwiYzh5LXdpZGdldHMtZGFzaGJvYXJkLS1zYXZlXCJcbiAgICA+XG4gICAgICB7eyAnU2F2ZScgfCB0cmFuc2xhdGUgfX1cbiAgICA8L2J1dHRvbj5cbiAgPC9kaXY+XG48L2M4eS1hY3Rpb24tYmFyLWl0ZW0+XG5cbjxjOHktYWN0aW9uLWJhci1pdGVtXG4gIFtwbGFjZW1lbnRdPVwiJ3JpZ2h0J1wiXG4gICpuZ0lmPVwib25FZGl0RGFzaGJvYXJkLm9ic2VydmVycy5sZW5ndGhcIlxuPlxuICA8YnV0dG9uXG4gICAgY2xhc3M9XCJidG4gYnRuLWxpbmsgaGlkZGVuLXhzIG0tbC0wXCJcbiAgICB0aXRsZT1cInt7ICdEYXNoYm9hcmQgc2V0dGluZ3MnIHwgdHJhbnNsYXRlIH19XCJcbiAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICBbZGlzYWJsZWRdPVwic2V0dGluZ3MuaXNEaXNhYmxlZCB8fCBlZGl0TW9kZVwiXG4gICAgKGNsaWNrKT1cIm9uRWRpdERhc2hib2FyZC5lbWl0KClcIlxuICAgIGRhdGEtY3k9XCJjOHktd2lkZ2V0cy1kYXNoYm9hcmQtLWVkaXQtZGFzaGJvYXJkXCJcbiAgPlxuICAgIDxpIGM4eUljb249XCJzb3J0aW5nLXNsaWRlclwiPjwvaT5cbiAgICA8c3BhbiBjbGFzcz1cInZpc2libGUteHMtaW5saW5lIGhpZGRlbi1zbSB2aXNpYmxlLW1kLWlubGluZSB2aXNpYmxlLWxnLWlubGluZVwiPlxuICAgICAge3sgJ0Rhc2hib2FyZCBzZXR0aW5ncycgfCB0cmFuc2xhdGUgfX1cbiAgICA8L3NwYW4+XG4gIDwvYnV0dG9uPlxuICA8YnV0dG9uXG4gICAgY2xhc3M9XCJidG4gYnRuLWxpbmsgdmlzaWJsZS14cyBtLWwtMFwiXG4gICAgdG9vbHRpcD1cInt7ICdOb3QgYXZhaWxhYmxlIG9uIG1vYmlsZSBwaG9uZScgfCB0cmFuc2xhdGUgfX1cIlxuICAgIHR5cGU9XCJidXR0b25cIlxuICAgIFtkaXNhYmxlZF09XCJ0cnVlXCJcbiAgPlxuICAgIDxpIGM4eUljb249XCJzb3J0aW5nLXNsaWRlclwiPjwvaT5cbiAgICA8c3BhbiBjbGFzcz1cInZpc2libGUteHMtaW5saW5lIGhpZGRlbi1zbSB2aXNpYmxlLW1kLWlubGluZSB2aXNpYmxlLWxnLWlubGluZVwiPlxuICAgICAge3sgJ0Rhc2hib2FyZCBzZXR0aW5ncycgfCB0cmFuc2xhdGUgfX1cbiAgICA8L3NwYW4+XG4gIDwvYnV0dG9uPlxuPC9jOHktYWN0aW9uLWJhci1pdGVtPlxuXG48Yzh5LWFjdGlvbi1iYXItaXRlbVxuICBbcGxhY2VtZW50XT1cIidyaWdodCdcIlxuICAqbmdJZj1cInNldHRpbmdzLmFsbG93RnVsbHNjcmVlblwiXG4gIFtwcmlvcml0eV09XCItNTAwMFwiXG4gIGl0ZW1DbGFzcz1cInB1bGwtcmlnaHRcIlxuPlxuICA8YnV0dG9uXG4gICAgY2xhc3M9XCJidG4gYnRuLWxpbmtcIlxuICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ0Z1bGwgc2NyZWVuJyB8IHRyYW5zbGF0ZVwiXG4gICAgdG9vbHRpcD1cInt7ICdGdWxsIHNjcmVlbicgfCB0cmFuc2xhdGUgfX1cIlxuICAgIHBsYWNlbWVudD1cImxlZnRcIlxuICAgIGNvbnRhaW5lcj1cImJvZHlcIlxuICAgIHR5cGU9XCJidXR0b25cIlxuICAgIFtkZWxheV09XCI1MDBcIlxuICAgIChjbGljayk9XCJ0b2dnbGVGdWxsc2NyZWVuKClcIlxuICAgIGRhdGEtY3k9XCJ3aWRnZXRzLWRhc2hib2FyZC0tRnVsbC1zY3JlZW5cIlxuICA+XG4gICAgPGkgW2M4eUljb25dPVwiKGluRnVsbFNjcmVlbiQgfCBhc3luYykgPyAnY29tcHJlc3MnIDogJ2V4cGFuZCdcIj48L2k+XG4gICAgPHNwYW4gY2xhc3M9XCJ2aXNpYmxlLXhzLWlubGluZSBoaWRkZW4tc20gdmlzaWJsZS1tZC1pbmxpbmUgdmlzaWJpbGUtbGctaW5saW5lXCI+XG4gICAgICB7eyAnRnVsbCBzY3JlZW4nIHwgdHJhbnNsYXRlIH19XG4gICAgPC9zcGFuPlxuICA8L2J1dHRvbj5cbjwvYzh5LWFjdGlvbi1iYXItaXRlbT5cblxuPGM4eS1hY3Rpb24tYmFyLWl0ZW1cbiAgW3BsYWNlbWVudF09XCInbW9yZSdcIlxuICBbcHJpb3JpdHldPVwiLTIwMDBcIlxuICAqbmdJZj1cInNldHRpbmdzLmNhbkNvcHlcIlxuPlxuICA8YnV0dG9uXG4gICAgY2xhc3M9XCJoaWRkZW4teHNcIlxuICAgIHRpdGxlPVwie3sgaXNDb3B5RGlzYWJsZWQgPyBjb3B5RGFzaGJvYXJkV2FybmluZ01lc3NhZ2UgOiAoY29weURhc2hib2FyZExhYmVsIHwgdHJhbnNsYXRlKSB9fVwiXG4gICAgdHlwZT1cImJ1dHRvblwiXG4gICAgW25nQ2xhc3NdPVwieyAnYnRuIGJ0bi1saW5rJzogIXNldHRpbmdzLmNhbkRlbGV0ZSB9XCJcbiAgICBkYXRhLWN5PVwid2lkZ2V0cy1kYXNoYm9hcmQtLWNvcHktZGFzaGJvYXJkXCJcbiAgICAoY2xpY2spPVwib25Db3B5RGFzaGJvYXJkLmVtaXQoKVwiXG4gICAgW2Rpc2FibGVkXT1cImlzQ29weURpc2FibGVkIHx8IGVkaXRNb2RlXCJcbiAgPlxuICAgIDxpIGM4eUljb249XCJjbG9uZVwiPjwvaT5cbiAgICA8c3Bhbj57eyBjb3B5RGFzaGJvYXJkTGFiZWwgfCB0cmFuc2xhdGUgfX08L3NwYW4+XG4gIDwvYnV0dG9uPlxuICA8YnV0dG9uXG4gICAgY2xhc3M9XCJ2aXNpYmxlLXhzIG0tbC0wXCJcbiAgICB0b29sdGlwPVwie3sgJ05vdCBhdmFpbGFibGUgb24gbW9iaWxlIHBob25lJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgdHlwZT1cImJ1dHRvblwiXG4gICAgW25nQ2xhc3NdPVwieyAnYnRuIGJ0bi1saW5rJzogIXNldHRpbmdzLmNhbkRlbGV0ZSB9XCJcbiAgICBbZGlzYWJsZWRdPVwidHJ1ZVwiXG4gID5cbiAgICA8aSBjOHlJY29uPVwiY2xvbmVcIj48L2k+XG4gICA8c3Bhbj57eyBjb3B5RGFzaGJvYXJkTGFiZWwgfCB0cmFuc2xhdGUgfX08L3NwYW4+XG4gIDwvYnV0dG9uPlxuPC9jOHktYWN0aW9uLWJhci1pdGVtPlxuXG48Yzh5LWFjdGlvbi1iYXItaXRlbVxuICBbcGxhY2VtZW50XT1cIidtb3JlJ1wiXG4gIFtwcmlvcml0eV09XCItMzAwMFwiXG4gICpuZ0lmPVwic2V0dGluZ3MuY2FuRGVsZXRlICYmIG9uRGVsZXRlRGFzaGJvYXJkLm9ic2VydmVycy5sZW5ndGhcIlxuPlxuICA8YnV0dG9uXG4gICAgY2xhc3M9XCJoaWRkZW4teHNcIlxuICAgIHRpdGxlPVwie3sgJ0RlbGV0ZSBkYXNoYm9hcmQnIHwgdHJhbnNsYXRlIH19XCJcbiAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICBbbmdDbGFzc109XCJ7ICdidG4gYnRuLWxpbmsnOiAhc2V0dGluZ3MuY2FuQ29weSB9XCJcbiAgICAoY2xpY2spPVwib25EZWxldGVEYXNoYm9hcmQuZW1pdCgpXCJcbiAgICBbZGlzYWJsZWRdPVwic2V0dGluZ3MuaXNEaXNhYmxlZCB8fCBlZGl0TW9kZVwiXG4gID5cbiAgICA8aSBjOHlJY29uPVwiZGVsZXRlXCI+PC9pPlxuICAgIDxzcGFuXG4gICAgICB0cmFuc2xhdGVcbiAgICA+XG4gICAgICBEZWxldGUgZGFzaGJvYXJkXG4gICAgPC9zcGFuPlxuICA8L2J1dHRvbj5cbiAgPGJ1dHRvblxuICAgIGNsYXNzPVwidmlzaWJsZS14cyBtLWwtMFwiXG4gICAgdG9vbHRpcD1cInt7ICdOb3QgYXZhaWxhYmxlIG9uIG1vYmlsZSBwaG9uZScgfCB0cmFuc2xhdGUgfX1cIlxuICAgIHR5cGU9XCJidXR0b25cIlxuICAgIFtuZ0NsYXNzXT1cInsgJ2J0biBidG4tbGluayc6ICFzZXR0aW5ncy5jYW5Db3B5IH1cIlxuICAgIFtkaXNhYmxlZF09XCJ0cnVlXCJcbiAgPlxuICAgIDxpIGM4eUljb249XCJkZWxldGVcIj48L2k+XG4gICAgPHNwYW5cbiAgICAgIHRyYW5zbGF0ZVxuICAgID5cbiAgICAgIERlbGV0ZSBkYXNoYm9hcmRcbiAgICA8L3NwYW4+XG4gIDwvYnV0dG9uPlxuPC9jOHktYWN0aW9uLWJhci1pdGVtPlxuXG48bmctdGVtcGxhdGUgI2xvYWRpbmdJbmRpY2F0b3I+XG4gIDxjOHktbG9hZGluZ1xuICAgIGNsYXNzPVwiY29sLXhzLTEyIHRleHQtY2VudGVyXCJcbiAgICAqbmdJZj1cImlzTG9hZGluZ1dpZGdldHMkIHwgYXN5bmNcIlxuICA+PC9jOHktbG9hZGluZz5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy1jb250YWluZXIgKm5nSWY9XCIhKGlzTG9hZGluZ1dpZGdldHMkIHwgYXN5bmMpOyBlbHNlIGxvYWRpbmdJbmRpY2F0b3JcIj5cbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInJlc29sdmVkV2lkZ2V0cyQgfCBhc3luYyBhcyB3aWRnZXRzVG9EaXNwbGF5XCI+XG4gICAgPCEtLSBlbXB0eSBzdGF0ZSAtLT5cbiAgICA8Yzh5LXVpLWVtcHR5LXN0YXRlXG4gICAgICBbaWNvbl09XCInYzh5LWRldmljZSdcIlxuICAgICAgW3RpdGxlXT1cIidObyB3aWRnZXRzIHRvIGRpc3BsYXkuJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAqbmdJZj1cIndpZGdldHNUb0Rpc3BsYXk/Lmxlbmd0aCA9PT0gMFwiXG4gICAgPlxuICAgICAgPGRpdiAqbmdJZj1cIm9uQWRkV2lkZ2V0Lm9ic2VydmVycy5sZW5ndGhcIj5cbiAgICAgICAgPHBcbiAgICAgICAgICB0cmFuc2xhdGVcbiAgICAgICAgICAqbmdJZj1cImVkaXRNb2RlXCJcbiAgICAgICAgPlxuICAgICAgICAgIEFkZCB3aWRnZXRzIHRvIHRoaXMgZGFzaGJvYXJkLlxuICAgICAgICA8L3A+XG4gICAgICAgIDxwXG4gICAgICAgICAgdHJhbnNsYXRlXG4gICAgICAgICAgKm5nSWY9XCIhZWRpdE1vZGVcIlxuICAgICAgICA+XG4gICAgICAgICAgQ2xpY2sgXCJFZGl0IHdpZGdldHNcIiB0byB1bmxvY2tcbiAgICAgICAgPC9wPlxuICAgICAgICA8ZGl2PlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5IG0tdC0xNlwiXG4gICAgICAgICAgICB0aXRsZT1cInt7ICdBZGQgd2lkZ2V0JyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJzZXR0aW5ncy5pc0Rpc2FibGVkIHx8ICFlZGl0TW9kZVwiXG4gICAgICAgICAgICAoY2xpY2spPVwib25BZGRXaWRnZXQuZW1pdCgpXCJcbiAgICAgICAgICAgIGRhdGEtY3k9XCJjOHktd2lkZ2V0cy1kYXNoYm9hcmQtLWFkZC13aWRnZXRcIlxuICAgICAgICAgICAgdHJhbnNsYXRlXG4gICAgICAgICAgPlxuICAgICAgICAgICAgQWRkIHdpZGdldFxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPHAgYzh5LWd1aWRlLWRvY3M+XG4gICAgICAgICAgPHNtYWxsXG4gICAgICAgICAgICB0cmFuc2xhdGVcbiAgICAgICAgICAgIG5nTm9uQmluZGFibGVcbiAgICAgICAgICA+XG4gICAgICAgICAgICBGaW5kIG91dCBtb3JlIGluIHRoZVxuICAgICAgICAgICAgPGEgYzh5LWd1aWRlLWhyZWY9XCIvZG9jcy9jb2NrcGl0L3dvcmtpbmctd2l0aC1kYXNoYm9hcmRzXCI+dXNlciBkb2N1bWVudGF0aW9uPC9hPlxuICAgICAgICAgICAgLlxuICAgICAgICAgIDwvc21hbGw+XG4gICAgICAgIDwvcD5cbiAgICAgIDwvZGl2PlxuICAgIDwvYzh5LXVpLWVtcHR5LXN0YXRlPlxuXG4gICAgPGM4eS1kYXNoYm9hcmRcbiAgICAgIFtjb2x1bW5zXT1cInNldHRpbmdzLmNvbHVtbnNcIlxuICAgICAgKGRhc2hib2FyZENoYW5nZSk9XCJvbkNoYW5nZURhc2hib2FyZC5lbWl0KCRldmVudClcIlxuICAgICAgI2Rhc2hib2FyZFxuICAgID5cbiAgICAgIDxjOHktZGFzaGJvYXJkLWNoaWxkXG4gICAgICAgICpuZ0Zvcj1cImxldCB3aWRnZXQgb2Ygd2lkZ2V0c1RvRGlzcGxheVwiXG4gICAgICAgIFtjbGFzc109XCJ3aWRnZXQuY2xhc3Nlc1wiXG4gICAgICAgIFt4XT1cIndpZGdldC5feFwiXG4gICAgICAgIFt5XT1cIndpZGdldC5feVwiXG4gICAgICAgIFt3aWR0aF09XCJ3aWRnZXQuX3dpZHRoIHx8IHNldHRpbmdzLmRlZmF1bHRXaWR0aFwiXG4gICAgICAgIFtoZWlnaHRdPVwid2lkZ2V0Ll9oZWlnaHQgfHwgc2V0dGluZ3MuZGVmYXVsdEhlaWdodFwiXG4gICAgICAgIFttYXJnaW5dPVwic2V0dGluZ3Mud2lkZ2V0TWFyZ2luXCJcbiAgICAgICAgW2RhdGFdPVwid2lkZ2V0XCJcbiAgICAgICAgW3VzZUludGVyc2VjdGlvbl09XCJ0cnVlXCJcbiAgICAgICAgW2VkaXRNb2RlXT1cImVkaXRNb2RlXCJcbiAgICAgICAgKGNoYW5nZVN0YXJ0KT1cIm9uQ2hhbmdlU3RhcnQuZW1pdCh7IHdpZGdldDogd2lkZ2V0LCBzb3VyY2U6IGNoaWxkLCBkYXNoYm9hcmQ6IGRhc2hib2FyZCB9KVwiXG4gICAgICAgIChjaGFuZ2VFbmQpPVwib25DaGFuZ2VFbmQuZW1pdCh7IHdpZGdldDogd2lkZ2V0LCBzb3VyY2U6IGNoaWxkLCBkYXNoYm9hcmQ6IGRhc2hib2FyZCB9KVwiXG4gICAgICAgICh0b2dnbGVGdWxsc2NyZWVuKT1cInRvZ2dsZUZ1bGxzY3JlZW5PbldpZGdldChjaGlsZClcIlxuICAgICAgICBbY2FuVG9nZ2xlRnVsbHNjcmVlbl09XCIhKGluRnVsbFNjcmVlbiQgfCBhc3luYykgfHwgd2lkZ2V0SW5GdWxsc2NyZWVuTW9kZVwiXG4gICAgICAgICNjaGlsZFxuICAgICAgPlxuICAgICAgICA8Yzh5LWRhc2hib2FyZC1jaGlsZC10aXRsZT5cbiAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgZGF0YS1jeT1cImM4eS1kYXNoYm9hcmQtbGlzdC0tZGV2aWNlLXdpZGdldFwiXG4gICAgICAgICAgICAqbmdJZj1cInNldHRpbmdzLnRyYW5zbGF0ZVdpZGdldFRpdGxlXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICB7eyB3aWRnZXQudGl0bGUgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPHNwYW4gKm5nSWY9XCIhc2V0dGluZ3MudHJhbnNsYXRlV2lkZ2V0VGl0bGVcIj5cbiAgICAgICAgICAgIHt7IHdpZGdldC50aXRsZSB9fVxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPC9jOHktZGFzaGJvYXJkLWNoaWxkLXRpdGxlPlxuICAgICAgICA8Yzh5LWRhc2hib2FyZC1jaGlsZC1hY3Rpb24gKm5nSWY9XCJvbkVkaXRXaWRnZXQub2JzZXJ2ZXJzLmxlbmd0aFwiPlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIHRpdGxlPVwie3sgJ0VkaXQgd2lkZ2V0JyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIGRhdGEtY3k9XCJ3aWRnZXRzLWRhc2hib2FyZC0tRWRpdC13aWRnZXRcIlxuICAgICAgICAgICAgKGNsaWNrKT1cIm9uRWRpdFdpZGdldC5lbWl0KHsgd2lkZ2V0OiB3aWRnZXQsIHNvdXJjZTogY2hpbGQsIGRhc2hib2FyZDogZGFzaGJvYXJkIH0pXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8aSBjOHlJY29uPVwicGVuY2lsXCI+PC9pPlxuICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgdHJhbnNsYXRlXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIEVkaXRcbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9jOHktZGFzaGJvYXJkLWNoaWxkLWFjdGlvbj5cbiAgICAgICAgPGM4eS1kYXNoYm9hcmQtY2hpbGQtYWN0aW9uICpuZ0lmPVwib25EZWxldGVXaWRnZXQub2JzZXJ2ZXJzLmxlbmd0aFwiPlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIHRpdGxlPVwie3sgJ1JlbW92ZSB3aWRnZXQnIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgZGF0YS1jeT1cImM4eS13aWRnZXRzLWRhc2hib2FyZC0tcmVtb3ZlLXdpZGdldFwiXG4gICAgICAgICAgICAoY2xpY2spPVwib25EZWxldGVXaWRnZXQuZW1pdCh7IHdpZGdldDogd2lkZ2V0LCBzb3VyY2U6IGNoaWxkLCBkYXNoYm9hcmQ6IGRhc2hib2FyZCB9KVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGkgYzh5SWNvbj1cImRlbGV0ZVwiPjwvaT5cbiAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgIHRyYW5zbGF0ZVxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICBSZW1vdmVcbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9jOHktZGFzaGJvYXJkLWNoaWxkLWFjdGlvbj5cblxuICAgICAgICA8Yzh5LXdpZGdldC10aW1lLWNvbnRleHRcbiAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgKHdpZGdldC5jb25maWc/LmRpc3BsYXlTZXR0aW5ncz8uZ2xvYmFsVGltZUNvbnRleHQgfHxcbiAgICAgICAgICAgICAgd2lkZ2V0LmNvbmZpZz8uZGlzcGxheVNldHRpbmdzPy5nbG9iYWxSZWFsdGltZUNvbnRleHQpICYmXG4gICAgICAgICAgICB3aWRnZXQuY29uZmlnLndpZGdldEluc3RhbmNlR2xvYmFsVGltZUNvbnRleHRcbiAgICAgICAgICBcIlxuICAgICAgICAgIChkYXRlQ29udGV4dENoYW5nZSk9XCJ1cGRhdGVXaWRnZXRDb25maWcoJGV2ZW50LCB3aWRnZXQpXCJcbiAgICAgICAgICBbY2FuRGVjb3VwbGVdPVwid2lkZ2V0LmNvbmZpZy5jYW5EZWNvdXBsZUdsb2JhbFRpbWVDb250ZXh0XCJcbiAgICAgICAgICBbZGlzcGxheVNldHRpbmdzXT1cIndpZGdldC5jb25maWcuZGlzcGxheVNldHRpbmdzXCJcbiAgICAgICAgICBbaGlkZGVuXT1cImVkaXRNb2RlXCJcbiAgICAgICAgPjwvYzh5LXdpZGdldC10aW1lLWNvbnRleHQ+XG5cbiAgICAgICAgPGM4eS1keW5hbWljLWNvbXBvbmVudFxuICAgICAgICAgIFtjb21wb25lbnRJZF09XCJ3aWRnZXQuY29tcG9uZW50SWQgfHwgd2lkZ2V0Lm5hbWVcIlxuICAgICAgICAgIFtjb25maWddPVwiXG4gICAgICAgICAgICB3aWRnZXQudGVtcGxhdGVVcmwgfHwgd2lkZ2V0LndpZGdldENvbXBvbmVudFxuICAgICAgICAgICAgICA/IHsgY2hpbGQ6IHdpZGdldCwgZGFzaGJvYXJkOiBjb250ZXh0RGFzaGJvYXJkLCBjb250ZXh0OiBjb250ZXh0IH1cbiAgICAgICAgICAgICAgOiB3aWRnZXQuY29uZmlnXG4gICAgICAgICAgXCJcbiAgICAgICAgICAqbmdJZj1cImNoaWxkLmludGVyc2VjdGVkXCJcbiAgICAgICAgICAodXBkYXRlV2lkZ2V0Q2xhc3Nlcyk9XCJ1cGRhdGVXaWRnZXRDbGFzc2VzKHdpZGdldCwgJGV2ZW50KVwiXG4gICAgICAgID48L2M4eS1keW5hbWljLWNvbXBvbmVudD5cbiAgICAgIDwvYzh5LWRhc2hib2FyZC1jaGlsZD5cbiAgICA8L2M4eS1kYXNoYm9hcmQ+XG4gIDwvbmctY29udGFpbmVyPlxuPC9uZy1jb250YWluZXI+XG4iXX0=
|