@c8y/ngx-components 1017.0.109 → 1017.0.111
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/core/dashboard/widget-time-context.model.d.ts +1 -1
- package/core/plugins/plugins-resolve.service.d.ts +4 -1
- package/esm2020/core/dashboard/widget-time-context.model.mjs +2 -2
- package/esm2020/core/dashboard/widgets-dashboard.component.mjs +3 -3
- package/esm2020/core/plugins/plugins-resolve.service.mjs +10 -8
- package/fesm2015/c8y-ngx-components.mjs +12 -10
- package/fesm2015/c8y-ngx-components.mjs.map +1 -1
- package/fesm2020/c8y-ngx-components.mjs +12 -10
- package/fesm2020/c8y-ngx-components.mjs.map +1 -1
- package/package.json +2 -2
|
@@ -47,7 +47,10 @@ export declare class PluginsResolveService {
|
|
|
47
47
|
* Loads modules and handles hooking correctly.
|
|
48
48
|
* @param remoteNgModules The modules to load.
|
|
49
49
|
*/
|
|
50
|
-
loadModulesDynamically(
|
|
50
|
+
loadModulesDynamically(remoteModules: Array<{
|
|
51
|
+
factory: any;
|
|
52
|
+
name: any;
|
|
53
|
+
}>): void;
|
|
51
54
|
loadModule(remoteNgModule: NgModuleRef<unknown> | Type<unknown>): NgModuleRef<unknown>;
|
|
52
55
|
/**
|
|
53
56
|
* Will refresh all current registered hooks
|
|
@@ -5,9 +5,9 @@ export var DateContextQueryParams;
|
|
|
5
5
|
})(DateContextQueryParams || (DateContextQueryParams = {}));
|
|
6
6
|
export var TimeSpanInMs;
|
|
7
7
|
(function (TimeSpanInMs) {
|
|
8
|
-
TimeSpanInMs[TimeSpanInMs["MINUTE"] =
|
|
8
|
+
TimeSpanInMs[TimeSpanInMs["MINUTE"] = 60000] = "MINUTE";
|
|
9
9
|
TimeSpanInMs[TimeSpanInMs["HOUR"] = 3600000] = "HOUR";
|
|
10
10
|
TimeSpanInMs[TimeSpanInMs["DAY"] = 86400000] = "DAY";
|
|
11
11
|
TimeSpanInMs[TimeSpanInMs["WEEK"] = 604800000] = "WEEK"; // 1000 * 60 * 60 * 24 * 7
|
|
12
12
|
})(TimeSpanInMs || (TimeSpanInMs = {}));
|
|
13
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
13
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2lkZ2V0LXRpbWUtY29udGV4dC5tb2RlbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2NvcmUvZGFzaGJvYXJkL3dpZGdldC10aW1lLWNvbnRleHQubW9kZWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsTUFBTSxDQUFOLElBQVksc0JBR1g7QUFIRCxXQUFZLHNCQUFzQjtJQUNoQywrREFBcUMsQ0FBQTtJQUNyQywyREFBaUMsQ0FBQTtBQUNuQyxDQUFDLEVBSFcsc0JBQXNCLEtBQXRCLHNCQUFzQixRQUdqQztBQUlELE1BQU0sQ0FBTixJQUFZLFlBS1g7QUFMRCxXQUFZLFlBQVk7SUFDdEIsdURBQWlCLENBQUE7SUFDakIscURBQWtCLENBQUE7SUFDbEIsb0RBQWtCLENBQUE7SUFDbEIsdURBQW9CLENBQUEsQ0FBQywwQkFBMEI7QUFDakQsQ0FBQyxFQUxXLFlBQVksS0FBWixZQUFZLFFBS3ZCIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGVudW0gRGF0ZUNvbnRleHRRdWVyeVBhcmFtcyB7XG4gIERBVEVfQ09OVEVYVF9GUk9NID0gJ2RhdGVDb250ZXh0RnJvbScsXG4gIERBVEVfQ09OVEVYVF9UTyA9ICdkYXRlQ29udGV4dFRvJ1xufVxuXG5leHBvcnQgdHlwZSBQcmVkZWZpbmVkVGltZVNwYW4gPSB7IHRpdGxlOiBzdHJpbmc7IHRpbWVTcGFuSW5NczogbnVtYmVyIH07XG5cbmV4cG9ydCBlbnVtIFRpbWVTcGFuSW5NcyB7XG4gICdNSU5VVEUnID0gNjBfMDAwLCAvLyAxMDAwICogNjBcbiAgJ0hPVVInID0gM182MDBfMDAwLCAvLyAxMDAwICogNjAgKiA2MFxuICAnREFZJyA9IDg2XzQwMF8wMDAsIC8vIDEwMDAgKiA2MCAqIDYwICogMjRcbiAgJ1dFRUsnID0gNjA0XzgwMF8wMDAgLy8gMTAwMCAqIDYwICogNjAgKiAyNCAqIDdcbn1cbiJdfQ==
|
|
@@ -130,7 +130,7 @@ export class WidgetsDashboardComponent {
|
|
|
130
130
|
}
|
|
131
131
|
}
|
|
132
132
|
WidgetsDashboardComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: WidgetsDashboardComponent, deps: [{ token: i1.DynamicComponentService }], target: i0.ɵɵFactoryTarget.Component });
|
|
133
|
-
WidgetsDashboardComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.0.6", type: WidgetsDashboardComponent, selector: "c8y-widgets-dashboard", inputs: { widgets: "widgets", context: "context", contextDashboard: "contextDashboard", _settings: ["settings", "_settings"], breadcrumb: "breadcrumb" }, outputs: { onAddWidget: "onAddWidget", onEditWidget: "onEditWidget", onDeleteWidget: "onDeleteWidget", onChangeDashboard: "onChangeDashboard", onEditDashboard: "onEditDashboard", onCopyDashboard: "onCopyDashboard", onDeleteDashboard: "onDeleteDashboard", onFreeze: "onFreeze", onChangeStart: "onChangeStart", onChangeEnd: "onChangeEnd" }, 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 [placement]=\"'right'\" *ngIf=\"onAddWidget.observers.length\">\n <button\n title=\"{{ 'Add widget' | translate }}\"\n type=\"button\"\n class=\"btn btn-link\"\n [disabled]=\"settings.isFrozen || settings.isDisabled\"\n (click)=\"onAddWidget.emit()\"\n >\n <i c8yIcon=\"plus-circle\"></i>\n {{ 'Add widget' | translate }}\n </button>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item [placement]=\"'right'\" *ngIf=\"onEditDashboard.observers.length\">\n <button\n title=\"{{ 'Edit' | translate }}\"\n type=\"button\"\n class=\"btn btn-link\"\n [disabled]=\"settings.isFrozen || settings.isDisabled\"\n (click)=\"onEditDashboard.emit()\"\n >\n <i c8yIcon=\"pencil\"></i>\n {{ 'Edit' | translate }}\n </button>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item [placement]=\"'right'\" *ngIf=\"settings.allowFullscreen\">\n <button\n title=\"{{ 'Full screen' | translate }}\"\n type=\"button\"\n class=\"btn btn-link\"\n (click)=\"toggleFullscreen()\"\n >\n <i [c8yIcon]=\"fullScreen() ? 'compress' : 'expand'\"></i>\n {{ 'Full screen' | translate }}\n </button>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item\n [placement]=\"'right'\"\n itemClass=\"navbar-form\"\n *ngIf=\"onFreeze.observers.length\"\n>\n <button\n title=\"{{ 'Lock/unlock this dashboard' | translate }}\"\n type=\"button\"\n class=\"btn btn-default\"\n [ngClass]=\"{ active: settings.isFrozen }\"\n (click)=\"onFreeze.emit(settings)\"\n [disabled]=\"settings.isDisabled\"\n uib-btn-checkbox\n >\n <i [c8yIcon]=\"settings.isFrozen ? 'lock' : 'unlock'\"></i>\n </button>\n</c8y-action-bar-item>\n<c8y-action-bar-item [placement]=\"'more'\" [priority]=\"-2000\" *ngIf=\"settings.canCopy\">\n <button title=\"{{ 'Copy dashboard' | translate }}\" type=\"button\" (click)=\"onCopyDashboard.emit()\" class=\"btn btn-link\">\n <i c8yIcon=\"clone\"></i>\n <span class=\"m-l-4\" translate>Copy dashboard</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 title=\"{{ 'Delete dashboard' | translate }}\"\n type=\"button\"\n (click)=\"onDeleteDashboard.emit()\"\n [disabled]=\"settings.isFrozen || settings.isDisabled\"\n >\n <i c8yIcon=\"delete\"></i>\n <span class=\"m-l-4\" translate>Delete dashboard</span>\n </button>\n</c8y-action-bar-item>\n\n<ng-template #loadingIndicator>\n <c8y-loading class=\"col-xs-12 text-center\" *ngIf=\"isLoadingWidgets$ | async\"></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 *ngIf=\"widgetsToDisplay?.length === 0\"\n [icon]=\"'c8y-device'\"\n [title]=\"'No widgets to display.' | translate\"\n >\n <div *ngIf=\"!settings.isFrozen && onAddWidget.observers.length\">\n <p translate>Add widgets to this dashboard.</p>\n <div>\n <button\n title=\"{{ 'Add widget' | translate }}\"\n type=\"button\"\n [disabled]=\"settings.isFrozen || settings.isDisabled\"\n (click)=\"onAddWidget.emit()\"\n class=\"btn btn-primary m-t-16\"\n translate\n >\n Add widget\n </button>\n </div>\n <p c8y-guide-docs>\n <small translate ngNonBindable>\n Find out more in the\n <a c8y-guide-href=\"users-guide/cockpit/#dashboards\">User guide`KEEP_ORIGINAL`</a>\n .\n </small>\n </p>\n </div>\n </c8y-ui-empty-state>\n\n <c8y-dashboard\n (dashboardChange)=\"onChangeDashboard.emit($event)\"\n #dashboard\n >\n <c8y-dashboard-child\n *ngFor=\"let widget of widgetsToDisplay\"\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 [isFrozen]=\"settings.isFrozen || settings.isDisabled\"\n [class]=\"widget.classes\"\n [data]=\"widget\"\n [useIntersection]=\"true\"\n (changeStart)=\"onChangeStart.emit({ widget: widget, source: child, dashboard: dashboard })\"\n (changeEnd)=\"onChangeEnd.emit({ widget: widget, source: child, dashboard: dashboard })\"\n #child\n >\n <c8y-dashboard-child-title>\n <span *ngIf=\"settings.translateWidgetTitle\">\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 (click)=\"onEditWidget.emit({ widget: widget, source: child, dashboard: dashboard })\"\n >\n <i c8yIcon=\"pencil\"></i>\n <span class=\"m-l-4\" translate>Edit</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 (click)=\"onDeleteWidget.emit({ widget: widget, source: child, dashboard: dashboard })\"\n >\n <i c8yIcon=\"delete\"></i>\n <span class=\"m-l-4\" translate>Remove</span>\n </button>\n </c8y-dashboard-child-action>\n\n <c8y-widget-time-context\n *ngIf=\"widget.config?.displaySettings?.globalTimeContext\"\n (dateContextChange)=\"updateWidgetConfig({ date: $event }, widget)\"\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\n", dependencies: [{ kind: "component", type: i2.EmptyStateComponent, selector: "c8y-ui-empty-state", inputs: ["icon", "title", "subtitle", "horizontal"] }, { kind: "directive", type: i3.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: i4.C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i6.LoadingComponent, selector: "c8y-loading" }, { kind: "component", type: i7.ActionBarItemComponent, selector: "c8y-action-bar-item", inputs: ["placement", "priority", "itemClass", "injector", "groupId"] }, { kind: "component", type: i8.DynamicComponentComponent, selector: "c8y-dynamic-component", inputs: ["componentId", "config", "mode", "notFoundError", "executeResolvers"], outputs: ["updateWidgetClasses"] }, { kind: "component", type: i9.TitleComponent, selector: "c8y-title", inputs: ["pageTitleUpdate"] }, { kind: "directive", type: i10.GuideHrefDirective, selector: "[c8y-guide-href]", inputs: ["c8y-guide-href"] }, { kind: "component", type: i11.GuideDocsComponent, selector: "[c8y-guide-docs]" }, { kind: "component", type: i12.BreadcrumbComponent, selector: "c8y-breadcrumb" }, { kind: "component", type: i13.BreadcrumbItemComponent, selector: "c8y-breadcrumb-item", inputs: ["icon", "translate", "label", "path", "injector"] }, { kind: "component", type: i14.DashboardChildComponent, selector: "c8y-dashboard-child", inputs: ["x", "y", "width", "height", "data", "margin", "isFrozen", "useIntersection", "class"], outputs: ["changeStart", "changeEnd"] }, { kind: "component", type: i15.DashboardComponent, selector: "c8y-dashboard", inputs: ["columns", "gap", "rows"], outputs: ["dashboardChange"] }, { kind: "component", type: i16.DashboardChildTitleComponent, selector: "c8y-dashboard-child-title" }, { kind: "component", type: i17.DashboardChildActionComponent, selector: "c8y-dashboard-child-action" }, { kind: "component", type: i18.WidgetTimeContextComponent, selector: "c8y-widget-time-context", inputs: ["canDecouple"], outputs: ["dateContextChange"] }, { kind: "pipe", type: i19.C8yTranslatePipe, name: "translate" }, { kind: "pipe", type: i5.AsyncPipe, name: "async" }] });
|
|
133
|
+
WidgetsDashboardComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.0.6", type: WidgetsDashboardComponent, selector: "c8y-widgets-dashboard", inputs: { widgets: "widgets", context: "context", contextDashboard: "contextDashboard", _settings: ["settings", "_settings"], breadcrumb: "breadcrumb" }, outputs: { onAddWidget: "onAddWidget", onEditWidget: "onEditWidget", onDeleteWidget: "onDeleteWidget", onChangeDashboard: "onChangeDashboard", onEditDashboard: "onEditDashboard", onCopyDashboard: "onCopyDashboard", onDeleteDashboard: "onDeleteDashboard", onFreeze: "onFreeze", onChangeStart: "onChangeStart", onChangeEnd: "onChangeEnd" }, 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 [placement]=\"'right'\" *ngIf=\"onAddWidget.observers.length\">\n <button\n title=\"{{ 'Add widget' | translate }}\"\n type=\"button\"\n class=\"btn btn-link\"\n [disabled]=\"settings.isFrozen || settings.isDisabled\"\n (click)=\"onAddWidget.emit()\"\n >\n <i c8yIcon=\"plus-circle\"></i>\n {{ 'Add widget' | translate }}\n </button>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item [placement]=\"'right'\" *ngIf=\"onEditDashboard.observers.length\">\n <button\n title=\"{{ 'Edit' | translate }}\"\n type=\"button\"\n class=\"btn btn-link\"\n [disabled]=\"settings.isFrozen || settings.isDisabled\"\n (click)=\"onEditDashboard.emit()\"\n >\n <i c8yIcon=\"pencil\"></i>\n {{ 'Edit' | translate }}\n </button>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item [placement]=\"'right'\" *ngIf=\"settings.allowFullscreen\">\n <button\n title=\"{{ 'Full screen' | translate }}\"\n type=\"button\"\n class=\"btn btn-link\"\n (click)=\"toggleFullscreen()\"\n >\n <i [c8yIcon]=\"fullScreen() ? 'compress' : 'expand'\"></i>\n {{ 'Full screen' | translate }}\n </button>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item\n [placement]=\"'right'\"\n itemClass=\"navbar-form\"\n *ngIf=\"onFreeze.observers.length\"\n>\n <button\n title=\"{{ 'Lock/unlock this dashboard' | translate }}\"\n type=\"button\"\n class=\"btn btn-default\"\n [ngClass]=\"{ active: settings.isFrozen }\"\n (click)=\"onFreeze.emit(settings)\"\n [disabled]=\"settings.isDisabled\"\n uib-btn-checkbox\n >\n <i [c8yIcon]=\"settings.isFrozen ? 'lock' : 'unlock'\"></i>\n </button>\n</c8y-action-bar-item>\n<c8y-action-bar-item [placement]=\"'more'\" [priority]=\"-2000\" *ngIf=\"settings.canCopy\">\n <button title=\"{{ 'Copy dashboard' | translate }}\" type=\"button\" (click)=\"onCopyDashboard.emit()\" class=\"btn btn-link\">\n <i c8yIcon=\"clone\"></i>\n <span class=\"m-l-4\" translate>Copy dashboard</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 title=\"{{ 'Delete dashboard' | translate }}\"\n type=\"button\"\n (click)=\"onDeleteDashboard.emit()\"\n [disabled]=\"settings.isFrozen || settings.isDisabled\"\n >\n <i c8yIcon=\"delete\"></i>\n <span class=\"m-l-4\" translate>Delete dashboard</span>\n </button>\n</c8y-action-bar-item>\n\n<ng-template #loadingIndicator>\n <c8y-loading class=\"col-xs-12 text-center\" *ngIf=\"isLoadingWidgets$ | async\"></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 *ngIf=\"widgetsToDisplay?.length === 0\"\n [icon]=\"'c8y-device'\"\n [title]=\"'No widgets to display.' | translate\"\n >\n <div *ngIf=\"!settings.isFrozen && onAddWidget.observers.length\">\n <p translate>Add widgets to this dashboard.</p>\n <div>\n <button\n title=\"{{ 'Add widget' | translate }}\"\n type=\"button\"\n [disabled]=\"settings.isFrozen || settings.isDisabled\"\n (click)=\"onAddWidget.emit()\"\n class=\"btn btn-primary m-t-16\"\n translate\n >\n Add widget\n </button>\n </div>\n <p c8y-guide-docs>\n <small translate ngNonBindable>\n Find out more in the\n <a c8y-guide-href=\"users-guide/cockpit/#dashboards\">User guide`KEEP_ORIGINAL`</a>\n .\n </small>\n </p>\n </div>\n </c8y-ui-empty-state>\n\n <c8y-dashboard\n (dashboardChange)=\"onChangeDashboard.emit($event)\"\n #dashboard\n >\n <c8y-dashboard-child\n *ngFor=\"let widget of widgetsToDisplay\"\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 [isFrozen]=\"settings.isFrozen || settings.isDisabled\"\n [class]=\"widget.classes\"\n [data]=\"widget\"\n [useIntersection]=\"true\"\n (changeStart)=\"onChangeStart.emit({ widget: widget, source: child, dashboard: dashboard })\"\n (changeEnd)=\"onChangeEnd.emit({ widget: widget, source: child, dashboard: dashboard })\"\n #child\n >\n <c8y-dashboard-child-title>\n <span *ngIf=\"settings.translateWidgetTitle\">\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 (click)=\"onEditWidget.emit({ widget: widget, source: child, dashboard: dashboard })\"\n >\n <i c8yIcon=\"pencil\"></i>\n <span class=\"m-l-4\" translate>Edit</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 (click)=\"onDeleteWidget.emit({ widget: widget, source: child, dashboard: dashboard })\"\n >\n <i c8yIcon=\"delete\"></i>\n <span class=\"m-l-4\" translate>Remove</span>\n </button>\n </c8y-dashboard-child-action>\n\n <c8y-widget-time-context\n *ngIf=\"\n widget.config?.displaySettings?.globalTimeContext &&\n widget.config?.widgetInstanceGlobalTimeContext\n \"\n (dateContextChange)=\"updateWidgetConfig({ date: $event }, widget)\"\n [canDecouple]=\"widget.config.canDecoupleGlobalTimeContext\"\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\n", dependencies: [{ kind: "component", type: i2.EmptyStateComponent, selector: "c8y-ui-empty-state", inputs: ["icon", "title", "subtitle", "horizontal"] }, { kind: "directive", type: i3.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: i4.C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i6.LoadingComponent, selector: "c8y-loading" }, { kind: "component", type: i7.ActionBarItemComponent, selector: "c8y-action-bar-item", inputs: ["placement", "priority", "itemClass", "injector", "groupId"] }, { kind: "component", type: i8.DynamicComponentComponent, selector: "c8y-dynamic-component", inputs: ["componentId", "config", "mode", "notFoundError", "executeResolvers"], outputs: ["updateWidgetClasses"] }, { kind: "component", type: i9.TitleComponent, selector: "c8y-title", inputs: ["pageTitleUpdate"] }, { kind: "directive", type: i10.GuideHrefDirective, selector: "[c8y-guide-href]", inputs: ["c8y-guide-href"] }, { kind: "component", type: i11.GuideDocsComponent, selector: "[c8y-guide-docs]" }, { kind: "component", type: i12.BreadcrumbComponent, selector: "c8y-breadcrumb" }, { kind: "component", type: i13.BreadcrumbItemComponent, selector: "c8y-breadcrumb-item", inputs: ["icon", "translate", "label", "path", "injector"] }, { kind: "component", type: i14.DashboardChildComponent, selector: "c8y-dashboard-child", inputs: ["x", "y", "width", "height", "data", "margin", "isFrozen", "useIntersection", "class"], outputs: ["changeStart", "changeEnd"] }, { kind: "component", type: i15.DashboardComponent, selector: "c8y-dashboard", inputs: ["columns", "gap", "rows"], outputs: ["dashboardChange"] }, { kind: "component", type: i16.DashboardChildTitleComponent, selector: "c8y-dashboard-child-title" }, { kind: "component", type: i17.DashboardChildActionComponent, selector: "c8y-dashboard-child-action" }, { kind: "component", type: i18.WidgetTimeContextComponent, selector: "c8y-widget-time-context", inputs: ["canDecouple"], outputs: ["dateContextChange"] }, { kind: "pipe", type: i19.C8yTranslatePipe, name: "translate" }, { kind: "pipe", type: i5.AsyncPipe, name: "async" }] });
|
|
134
134
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: WidgetsDashboardComponent, decorators: [{
|
|
135
135
|
type: Component,
|
|
136
136
|
args: [{ selector: 'c8y-widgets-dashboard', host: {
|
|
@@ -138,7 +138,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.6", ngImpor
|
|
|
138
138
|
display: block;
|
|
139
139
|
`,
|
|
140
140
|
class: 'dashboard c8y-grid-dashboard'
|
|
141
|
-
}, 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 [placement]=\"'right'\" *ngIf=\"onAddWidget.observers.length\">\n <button\n title=\"{{ 'Add widget' | translate }}\"\n type=\"button\"\n class=\"btn btn-link\"\n [disabled]=\"settings.isFrozen || settings.isDisabled\"\n (click)=\"onAddWidget.emit()\"\n >\n <i c8yIcon=\"plus-circle\"></i>\n {{ 'Add widget' | translate }}\n </button>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item [placement]=\"'right'\" *ngIf=\"onEditDashboard.observers.length\">\n <button\n title=\"{{ 'Edit' | translate }}\"\n type=\"button\"\n class=\"btn btn-link\"\n [disabled]=\"settings.isFrozen || settings.isDisabled\"\n (click)=\"onEditDashboard.emit()\"\n >\n <i c8yIcon=\"pencil\"></i>\n {{ 'Edit' | translate }}\n </button>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item [placement]=\"'right'\" *ngIf=\"settings.allowFullscreen\">\n <button\n title=\"{{ 'Full screen' | translate }}\"\n type=\"button\"\n class=\"btn btn-link\"\n (click)=\"toggleFullscreen()\"\n >\n <i [c8yIcon]=\"fullScreen() ? 'compress' : 'expand'\"></i>\n {{ 'Full screen' | translate }}\n </button>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item\n [placement]=\"'right'\"\n itemClass=\"navbar-form\"\n *ngIf=\"onFreeze.observers.length\"\n>\n <button\n title=\"{{ 'Lock/unlock this dashboard' | translate }}\"\n type=\"button\"\n class=\"btn btn-default\"\n [ngClass]=\"{ active: settings.isFrozen }\"\n (click)=\"onFreeze.emit(settings)\"\n [disabled]=\"settings.isDisabled\"\n uib-btn-checkbox\n >\n <i [c8yIcon]=\"settings.isFrozen ? 'lock' : 'unlock'\"></i>\n </button>\n</c8y-action-bar-item>\n<c8y-action-bar-item [placement]=\"'more'\" [priority]=\"-2000\" *ngIf=\"settings.canCopy\">\n <button title=\"{{ 'Copy dashboard' | translate }}\" type=\"button\" (click)=\"onCopyDashboard.emit()\" class=\"btn btn-link\">\n <i c8yIcon=\"clone\"></i>\n <span class=\"m-l-4\" translate>Copy dashboard</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 title=\"{{ 'Delete dashboard' | translate }}\"\n type=\"button\"\n (click)=\"onDeleteDashboard.emit()\"\n [disabled]=\"settings.isFrozen || settings.isDisabled\"\n >\n <i c8yIcon=\"delete\"></i>\n <span class=\"m-l-4\" translate>Delete dashboard</span>\n </button>\n</c8y-action-bar-item>\n\n<ng-template #loadingIndicator>\n <c8y-loading class=\"col-xs-12 text-center\" *ngIf=\"isLoadingWidgets$ | async\"></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 *ngIf=\"widgetsToDisplay?.length === 0\"\n [icon]=\"'c8y-device'\"\n [title]=\"'No widgets to display.' | translate\"\n >\n <div *ngIf=\"!settings.isFrozen && onAddWidget.observers.length\">\n <p translate>Add widgets to this dashboard.</p>\n <div>\n <button\n title=\"{{ 'Add widget' | translate }}\"\n type=\"button\"\n [disabled]=\"settings.isFrozen || settings.isDisabled\"\n (click)=\"onAddWidget.emit()\"\n class=\"btn btn-primary m-t-16\"\n translate\n >\n Add widget\n </button>\n </div>\n <p c8y-guide-docs>\n <small translate ngNonBindable>\n Find out more in the\n <a c8y-guide-href=\"users-guide/cockpit/#dashboards\">User guide`KEEP_ORIGINAL`</a>\n .\n </small>\n </p>\n </div>\n </c8y-ui-empty-state>\n\n <c8y-dashboard\n (dashboardChange)=\"onChangeDashboard.emit($event)\"\n #dashboard\n >\n <c8y-dashboard-child\n *ngFor=\"let widget of widgetsToDisplay\"\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 [isFrozen]=\"settings.isFrozen || settings.isDisabled\"\n [class]=\"widget.classes\"\n [data]=\"widget\"\n [useIntersection]=\"true\"\n (changeStart)=\"onChangeStart.emit({ widget: widget, source: child, dashboard: dashboard })\"\n (changeEnd)=\"onChangeEnd.emit({ widget: widget, source: child, dashboard: dashboard })\"\n #child\n >\n <c8y-dashboard-child-title>\n <span *ngIf=\"settings.translateWidgetTitle\">\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 (click)=\"onEditWidget.emit({ widget: widget, source: child, dashboard: dashboard })\"\n >\n <i c8yIcon=\"pencil\"></i>\n <span class=\"m-l-4\" translate>Edit</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 (click)=\"onDeleteWidget.emit({ widget: widget, source: child, dashboard: dashboard })\"\n >\n <i c8yIcon=\"delete\"></i>\n <span class=\"m-l-4\" translate>Remove</span>\n </button>\n </c8y-dashboard-child-action>\n\n <c8y-widget-time-context\n *ngIf=\"widget.config?.displaySettings?.globalTimeContext\"\n (dateContextChange)=\"updateWidgetConfig({ date: $event }, widget)\"\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\n" }]
|
|
141
|
+
}, 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 [placement]=\"'right'\" *ngIf=\"onAddWidget.observers.length\">\n <button\n title=\"{{ 'Add widget' | translate }}\"\n type=\"button\"\n class=\"btn btn-link\"\n [disabled]=\"settings.isFrozen || settings.isDisabled\"\n (click)=\"onAddWidget.emit()\"\n >\n <i c8yIcon=\"plus-circle\"></i>\n {{ 'Add widget' | translate }}\n </button>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item [placement]=\"'right'\" *ngIf=\"onEditDashboard.observers.length\">\n <button\n title=\"{{ 'Edit' | translate }}\"\n type=\"button\"\n class=\"btn btn-link\"\n [disabled]=\"settings.isFrozen || settings.isDisabled\"\n (click)=\"onEditDashboard.emit()\"\n >\n <i c8yIcon=\"pencil\"></i>\n {{ 'Edit' | translate }}\n </button>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item [placement]=\"'right'\" *ngIf=\"settings.allowFullscreen\">\n <button\n title=\"{{ 'Full screen' | translate }}\"\n type=\"button\"\n class=\"btn btn-link\"\n (click)=\"toggleFullscreen()\"\n >\n <i [c8yIcon]=\"fullScreen() ? 'compress' : 'expand'\"></i>\n {{ 'Full screen' | translate }}\n </button>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item\n [placement]=\"'right'\"\n itemClass=\"navbar-form\"\n *ngIf=\"onFreeze.observers.length\"\n>\n <button\n title=\"{{ 'Lock/unlock this dashboard' | translate }}\"\n type=\"button\"\n class=\"btn btn-default\"\n [ngClass]=\"{ active: settings.isFrozen }\"\n (click)=\"onFreeze.emit(settings)\"\n [disabled]=\"settings.isDisabled\"\n uib-btn-checkbox\n >\n <i [c8yIcon]=\"settings.isFrozen ? 'lock' : 'unlock'\"></i>\n </button>\n</c8y-action-bar-item>\n<c8y-action-bar-item [placement]=\"'more'\" [priority]=\"-2000\" *ngIf=\"settings.canCopy\">\n <button title=\"{{ 'Copy dashboard' | translate }}\" type=\"button\" (click)=\"onCopyDashboard.emit()\" class=\"btn btn-link\">\n <i c8yIcon=\"clone\"></i>\n <span class=\"m-l-4\" translate>Copy dashboard</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 title=\"{{ 'Delete dashboard' | translate }}\"\n type=\"button\"\n (click)=\"onDeleteDashboard.emit()\"\n [disabled]=\"settings.isFrozen || settings.isDisabled\"\n >\n <i c8yIcon=\"delete\"></i>\n <span class=\"m-l-4\" translate>Delete dashboard</span>\n </button>\n</c8y-action-bar-item>\n\n<ng-template #loadingIndicator>\n <c8y-loading class=\"col-xs-12 text-center\" *ngIf=\"isLoadingWidgets$ | async\"></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 *ngIf=\"widgetsToDisplay?.length === 0\"\n [icon]=\"'c8y-device'\"\n [title]=\"'No widgets to display.' | translate\"\n >\n <div *ngIf=\"!settings.isFrozen && onAddWidget.observers.length\">\n <p translate>Add widgets to this dashboard.</p>\n <div>\n <button\n title=\"{{ 'Add widget' | translate }}\"\n type=\"button\"\n [disabled]=\"settings.isFrozen || settings.isDisabled\"\n (click)=\"onAddWidget.emit()\"\n class=\"btn btn-primary m-t-16\"\n translate\n >\n Add widget\n </button>\n </div>\n <p c8y-guide-docs>\n <small translate ngNonBindable>\n Find out more in the\n <a c8y-guide-href=\"users-guide/cockpit/#dashboards\">User guide`KEEP_ORIGINAL`</a>\n .\n </small>\n </p>\n </div>\n </c8y-ui-empty-state>\n\n <c8y-dashboard\n (dashboardChange)=\"onChangeDashboard.emit($event)\"\n #dashboard\n >\n <c8y-dashboard-child\n *ngFor=\"let widget of widgetsToDisplay\"\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 [isFrozen]=\"settings.isFrozen || settings.isDisabled\"\n [class]=\"widget.classes\"\n [data]=\"widget\"\n [useIntersection]=\"true\"\n (changeStart)=\"onChangeStart.emit({ widget: widget, source: child, dashboard: dashboard })\"\n (changeEnd)=\"onChangeEnd.emit({ widget: widget, source: child, dashboard: dashboard })\"\n #child\n >\n <c8y-dashboard-child-title>\n <span *ngIf=\"settings.translateWidgetTitle\">\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 (click)=\"onEditWidget.emit({ widget: widget, source: child, dashboard: dashboard })\"\n >\n <i c8yIcon=\"pencil\"></i>\n <span class=\"m-l-4\" translate>Edit</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 (click)=\"onDeleteWidget.emit({ widget: widget, source: child, dashboard: dashboard })\"\n >\n <i c8yIcon=\"delete\"></i>\n <span class=\"m-l-4\" translate>Remove</span>\n </button>\n </c8y-dashboard-child-action>\n\n <c8y-widget-time-context\n *ngIf=\"\n widget.config?.displaySettings?.globalTimeContext &&\n widget.config?.widgetInstanceGlobalTimeContext\n \"\n (dateContextChange)=\"updateWidgetConfig({ date: $event }, widget)\"\n [canDecouple]=\"widget.config.canDecoupleGlobalTimeContext\"\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\n" }]
|
|
142
142
|
}], ctorParameters: function () { return [{ type: i1.DynamicComponentService }]; }, propDecorators: { widgets: [{
|
|
143
143
|
type: Input
|
|
144
144
|
}], context: [{
|
|
@@ -171,4 +171,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.6", ngImpor
|
|
|
171
171
|
}], onChangeEnd: [{
|
|
172
172
|
type: Output
|
|
173
173
|
}] } });
|
|
174
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2lkZ2V0cy1kYXNoYm9hcmQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vY29yZS9kYXNoYm9hcmQvd2lkZ2V0cy1kYXNoYm9hcmQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vY29yZS9kYXNoYm9hcmQvd2lkZ2V0cy1kYXNoYm9hcmQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUl2RSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxnREFBZ0QsQ0FBQztBQUN6RixPQUFPLEVBQUUsZUFBZSxFQUFFLGFBQWEsRUFBRSxLQUFLLEVBQWMsTUFBTSxNQUFNLENBQUM7QUFDekUsT0FBTyxFQUFFLEdBQUcsRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0QsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNoQyxPQUFPLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBYWpGLE1BQU0sT0FBTyx5QkFBeUI7SUE0RXBDLFlBQW9CLE9BQWdDO1FBQWhDLFlBQU8sR0FBUCxPQUFPLENBQXlCO1FBOURwRCxxQkFBZ0IsR0FBUSxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUUsQ0FBQztRQVcvQyxhQUFRLEdBQXNCO1lBQzVCLFFBQVEsRUFBRSxLQUFLO1lBQ2YsVUFBVSxFQUFFLEtBQUs7WUFDakIsWUFBWSxFQUFFLEVBQUU7WUFDaEIsb0JBQW9CLEVBQUUsS0FBSztZQUMzQixhQUFhLEVBQUUsQ0FBQztZQUNoQixZQUFZLEVBQUUsQ0FBQztZQUNmLGVBQWUsRUFBRSxLQUFLO1lBQ3RCLE9BQU8sRUFBRSxJQUFJO1lBQ2IsU0FBUyxFQUFFLElBQUk7WUFDZixT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O2dCQUlGLFNBQVM7c0JBRFosS0FBSzt1QkFBQyxVQUFVO2dCQU9qQixVQUFVO3NCQURULEtBQUs7Z0JBaUJOLFdBQVc7c0JBRFYsTUFBTTtnQkFJUCxZQUFZO3NCQURYLE1BQU07Z0JBSVAsY0FBYztzQkFEYixNQUFNO2dCQUlQLGlCQUFpQjtzQkFEaEIsTUFBTTtnQkFJUCxlQUFlO3NCQURkLE1BQU07Z0JBSVAsZUFBZTtzQkFEZCxNQUFNO2dCQUlQLGlCQUFpQjtzQkFEaEIsTUFBTTtnQkFJUCxRQUFRO3NCQURQLE1BQU07Z0JBSVAsYUFBYTtzQkFEWixNQUFNO2dCQUlQLFdBQVc7c0JBRFYsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBCcmVhZGNydW1iSXRlbSB9IGZyb20gJy4uL2JyZWFkY3J1bWIvYnJlYWRjcnVtYi5tb2RlbCc7XG5pbXBvcnQgeyBEYXNoYm9hcmRDb21wb25lbnQgfSBmcm9tICcuL2Rhc2hib2FyZC5jb21wb25lbnQnO1xuaW1wb3J0IHsgRGFzaGJvYXJkQ2hhbmdlLCBEYXNoYm9hcmRTZXR0aW5ncywgV2lkZ2V0LCBXaWRnZXRDaGFuZ2UgfSBmcm9tICcuL2Rhc2hib2FyZC5tb2RlbCc7XG5pbXBvcnQgeyBEeW5hbWljQ29tcG9uZW50U2VydmljZSB9IGZyb20gJy4uL2R5bmFtaWMtY29tcG9uZW50L2R5bmFtaWMtY29tcG9uZW50LnNlcnZpY2UnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBjb21iaW5lTGF0ZXN0LCBtZXJnZSwgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgbWFwLCBzaGFyZVJlcGxheSwgc3dpdGNoTWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgc2V0IH0gZnJvbSAnbG9kYXNoLWVzJztcbmltcG9ydCB7IFdpZGdldHNEYXNoYm9hcmRFdmVudFNlcnZpY2UgfSBmcm9tICcuL3dpZGdldHMtZGFzaGJvYXJkLWV2ZW50LnNlcnZpY2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjOHktd2lkZ2V0cy1kYXNoYm9hcmQnLFxuICB0ZW1wbGF0ZVVybDogJy4vd2lkZ2V0cy1kYXNoYm9hcmQuY29tcG9uZW50Lmh0bWwnLFxuICBob3N0OiB7XG4gICAgc3R5bGU6IGBcbiAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgIGAsXG4gICAgY2xhc3M6ICdkYXNoYm9hcmQgYzh5LWdyaWQtZGFzaGJvYXJkJ1xuICB9LFxuICBwcm92aWRlcnM6IFtXaWRnZXRzRGFzaGJvYXJkRXZlbnRTZXJ2aWNlXVxufSlcbmV4cG9ydCBjbGFzcyBXaWRnZXRzRGFzaGJvYXJkQ29tcG9uZW50IHtcbiAgQElucHV0KClcbiAgc2V0IHdpZGdldHModmFsdWU6IFdpZGdldFtdKSB7XG4gICAgdGhpcy5fd2lkZ2V0cy5uZXh0KHZhbHVlKTtcbiAgfVxuXG4gIGdldCB3aWRnZXRzKCk6IFdpZGdldFtdIHtcbiAgICByZXR1cm4gdGhpcy5fd2lkZ2V0cy52YWx1ZTtcbiAgfVxuXG4gIEBJbnB1dCgpXG4gIGNvbnRleHQ6IGFueTtcblxuICBASW5wdXQoKVxuICBjb250ZXh0RGFzaGJvYXJkOiBhbnkgPSB7IHVwZGF0ZVRhcmdldDogdHJ1ZSB9O1xuXG4gIEBJbnB1dCgnc2V0dGluZ3MnKVxuICBzZXQgX3NldHRpbmdzKHNldHRpbmdzOiBQYXJ0aWFsPERhc2hib2FyZFNldHRpbmdzPikge1xuICAgIHRoaXMuc2V0dGluZ3MgPSB7IC4uLnRoaXMuc2V0dGluZ3MsIC4uLnNldHRpbmdzIH07XG4gICAgdGhpcy5pc0xvYWRpbmckLm5leHQoISF0aGlzLnNldHRpbmdzLmlzTG9hZGluZyk7XG4gIH1cblxuICBASW5wdXQoKVxuICBicmVhZGNydW1iOiBCcmVhZGNydW1iSXRlbTtcblxuICBzZXR0aW5nczogRGFzaGJvYXJkU2V0dGluZ3MgPSB7XG4gICAgaXNGcm96ZW46IGZhbHNlLFxuICAgIGlzRGlzYWJsZWQ6IGZhbHNlLFxuICAgIHdpZGdldE1hcmdpbjogMTIsXG4gICAgdHJhbnNsYXRlV2lkZ2V0VGl0bGU6IGZhbHNlLFxuICAgIGRlZmF1bHRIZWlnaHQ6IDQsXG4gICAgZGVmYXVsdFdpZHRoOiA0LFxuICAgIGFsbG93RnVsbHNjcmVlbjogZmFsc2UsXG4gICAgY2FuQ29weTogdHJ1ZSxcbiAgICBjYW5EZWxldGU6IHRydWUsXG4gICAgaXNMb2FkaW5nOiBmYWxzZVxuICB9O1xuXG4gIEBPdXRwdXQoKVxuICBvbkFkZFdpZGdldDogRXZlbnRFbWl0dGVyPERhc2hib2FyZENvbXBvbmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgQE91dHB1dCgpXG4gIG9uRWRpdFdpZGdldDogRXZlbnRFbWl0dGVyPFdpZGdldENoYW5nZT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgQE91dHB1dCgpXG4gIG9uRGVsZXRlV2lkZ2V0OiBFdmVudEVtaXR0ZXI8V2lkZ2V0Q2hhbmdlPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICBAT3V0cHV0KClcbiAgb25DaGFuZ2VEYXNoYm9hcmQ6IEV2ZW50RW1pdHRlcjxEYXNoYm9hcmRDaGFuZ2U+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIEBPdXRwdXQoKVxuICBvbkVkaXREYXNoYm9hcmQ6IEV2ZW50RW1pdHRlcjxEYXNoYm9hcmRDb21wb25lbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIEBPdXRwdXQoKVxuICBvbkNvcHlEYXNoYm9hcmQ6IEV2ZW50RW1pdHRlcjxEYXNoYm9hcmRDb21wb25lbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIEBPdXRwdXQoKVxuICBvbkRlbGV0ZURhc2hib2FyZDogRXZlbnRFbWl0dGVyPERhc2hib2FyZENvbXBvbmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgQE91dHB1dCgpXG4gIG9uRnJlZXplOiBFdmVudEVtaXR0ZXI8RGFzaGJvYXJkU2V0dGluZ3M+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIEBPdXRwdXQoKVxuICBvbkNoYW5nZVN0YXJ0OiBFdmVudEVtaXR0ZXI8V2lkZ2V0Q2hhbmdlPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICBAT3V0cHV0KClcbiAgb25DaGFuZ2VFbmQ6IEV2ZW50RW1pdHRlcjxXaWRnZXRDaGFuZ2U+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIHJlc29sdmVkV2lkZ2V0cyQ6IE9ic2VydmFibGU8V2lkZ2V0W10+O1xuXG4gIGlzTG9hZGluZ1dpZGdldHMkOiBPYnNlcnZhYmxlPGJvb2xlYW4+O1xuXG4gIHByaXZhdGUgX3dpZGdldHMgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFdpZGdldFtdPihbXSk7XG4gIHByaXZhdGUgaXNMb2FkaW5nJCA9IG5ldyBCZWhhdmlvclN1YmplY3QoISF0aGlzLl9zZXR0aW5ncz8uaXNMb2FkaW5nKTtcbiAgcHJpdmF0ZSBpc0V4ZWN1dGluZ1Jlc29sdmVycyQ6IE9ic2VydmFibGU8Ym9vbGVhbj47XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBkeW5hbWljOiBEeW5hbWljQ29tcG9uZW50U2VydmljZSkge1xuICAgIHRoaXMucmVzb2x2ZWRXaWRnZXRzJCA9IHRoaXMuX3dpZGdldHMucGlwZShcbiAgICAgIHN3aXRjaE1hcCh3aWRnZXRzID0+IHRoaXMuZXhlY3V0ZVJlc29sdmVyc09mV2lkZ2V0cyh3aWRnZXRzKSksXG4gICAgICBzaGFyZVJlcGxheSgxKVxuICAgICk7XG4gICAgdGhpcy5pc0V4ZWN1dGluZ1Jlc29sdmVycyQgPSBtZXJnZShcbiAgICAgIHRoaXMuX3dpZGdldHMucGlwZShtYXAoKCkgPT4gdHJ1ZSkpLFxuICAgICAgdGhpcy5yZXNvbHZlZFdpZGdldHMkLnBpcGUobWFwKCgpID0+IGZhbHNlKSlcbiAgICApO1xuICAgIHRoaXMuaXNMb2FkaW5nV2lkZ2V0cyQgPSBjb21iaW5lTGF0ZXN0KFt0aGlzLmlzTG9hZGluZyQsIHRoaXMuaXNFeGVjdXRpbmdSZXNvbHZlcnMkXSkucGlwZShcbiAgICAgIG1hcChsb2FkaW5ncyA9PiBsb2FkaW5ncy5zb21lKGxvYWRpbmcgPT4gbG9hZGluZykpLFxuICAgICAgc2hhcmVSZXBsYXkoMSlcbiAgICApO1xuICB9XG5cbiAgdG9nZ2xlRnVsbHNjcmVlbigpIHtcbiAgICBjb25zdCBlbGVtID0gZG9jdW1lbnQuYm9keSBhcyBhbnk7XG4gICAgY29uc3QgZG9jID0gZG9jdW1lbnQgYXMgYW55O1xuICAgIGlmICghdGhpcy5mdWxsU2NyZWVuKCkpIHtcbiAgICAgIGlmIChlbGVtLnJlcXVlc3RGdWxsc2NyZWVuKSB7XG4gICAgICAgIGVsZW0ucmVxdWVzdEZ1bGxzY3JlZW4oKTtcbiAgICAgIH0gZWxzZSBpZiAoZWxlbS5tc1JlcXVlc3RGdWxsc2NyZWVuKSB7XG4gICAgICAgIGVsZW0ubXNSZXF1ZXN0RnVsbHNjcmVlbigpO1xuICAgICAgfSBlbHNlIGlmIChlbGVtLm1velJlcXVlc3RGdWxsU2NyZWVuKSB7XG4gICAgICAgIGVsZW0ubW96UmVxdWVzdEZ1bGxTY3JlZW4oKTtcbiAgICAgIH0gZWxzZSBpZiAoZWxlbS53ZWJraXRSZXF1ZXN0RnVsbHNjcmVlbikge1xuICAgICAgICBlbGVtLndlYmtpdFJlcXVlc3RGdWxsc2NyZWVuKChFbGVtZW50IGFzIGFueSkuQUxMT1dfS0VZQk9BUkRfSU5QVVQpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZG9jLmV4aXRGdWxsc2NyZWVuKSB7XG4gICAgICBkb2MuZXhpdEZ1bGxzY3JlZW4oKTtcbiAgICB9IGVsc2UgaWYgKGRvYy5tc0V4aXRGdWxsc2NyZWVuKSB7XG4gICAgICBkb2MubXNFeGl0RnVsbHNjcmVlbigpO1xuICAgIH0gZWxzZSBpZiAoZG9jLm1vekNhbmNlbEZ1bGxTY3JlZW4pIHtcbiAgICAgIGRvYy5tb3pDYW5jZWxGdWxsU2NyZWVuKCk7XG4gICAgfSBlbHNlIGlmIChkb2Mud2Via2l0RXhpdEZ1bGxzY3JlZW4pIHtcbiAgICAgIGRvYy53ZWJraXRFeGl0RnVsbHNjcmVlbigpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bGxTY3JlZW4oKSB7XG4gICAgY29uc3QgZG9jOiBhbnkgPSBkb2N1bWVudDtcbiAgICByZXR1cm4gISEoXG4gICAgICBkb2MuZnVsbHNjcmVlbkVsZW1lbnQgfHxcbiAgICAgIGRvYy5tb3pGdWxsU2NyZWVuRWxlbWVudCB8fFxuICAgICAgZG9jLndlYmtpdEZ1bGxzY3JlZW5FbGVtZW50IHx8XG4gICAgICBkb2MubXNGdWxsc2NyZWVuRWxlbWVudFxuICAgICk7XG4gIH1cblxuICB1cGRhdGVXaWRnZXRDbGFzc2VzKHdpZGdldDogV2lkZ2V0LCBjbGFzc2VzOiB7IFtrZXk6IHN0cmluZ106IGJvb2xlYW4gfSkge1xuICAgIHdpZGdldC5jbGFzc2VzID0geyAuLi53aWRnZXQuY2xhc3NlcywgLi4uY2xhc3NlcyB9O1xuICB9XG5cbiAgdXBkYXRlV2lkZ2V0Q29uZmlnKGRhdGE6IGFueSwgd2lkZ2V0OiBXaWRnZXQpIHtcbiAgICB3aWRnZXQuY29uZmlnID0geyAuLi53aWRnZXQuY29uZmlnLCAuLi5kYXRhIH07XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGV4ZWN1dGVSZXNvbHZlcnNPZldpZGdldHMod2lkZ2V0czogV2lkZ2V0W10pOiBQcm9taXNlPFdpZGdldFtdPiB7XG4gICAgaWYgKCF3aWRnZXRzKSB7XG4gICAgICByZXR1cm4gd2lkZ2V0cztcbiAgICB9XG5cbiAgICBjb25zdCB0dXBsZSA9IHdpZGdldHMubWFwKHdpZGdldCA9PiAoe1xuICAgICAgY29tcG9uZW50SWQ6IHdpZGdldC5jb21wb25lbnRJZCB8fCB3aWRnZXQubmFtZSxcbiAgICAgIGNvbmZpZzogd2lkZ2V0LmNvbmZpZ1xuICAgIH0pKTtcblxuICAgIGNvbnN0IHJlc29sdmVkUmVzdWx0cyA9IGF3YWl0IHRoaXMuZHluYW1pYy5leGVjdXRlUmVzb2x2ZXJzKHR1cGxlKTtcbiAgICB3aWRnZXRzLmZvckVhY2goKHdpZGdldCwgaW5kZXgpID0+IHtcbiAgICAgIGlmIChyZXNvbHZlZFJlc3VsdHNbaW5kZXhdKSB7XG4gICAgICAgIGlmICghd2lkZ2V0LmNvbmZpZykge1xuICAgICAgICAgIHdpZGdldC5jb25maWcgPSB7fTtcbiAgICAgICAgfVxuICAgICAgICBPYmplY3QuZW50cmllcyhyZXNvbHZlZFJlc3VsdHNbaW5kZXhdKS5mb3JFYWNoKChba2V5LCB2YWx1ZV0pID0+XG4gICAgICAgICAgc2V0KHdpZGdldC5jb25maWcsIGtleSwgdmFsdWUpXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHdpZGdldHM7XG4gIH1cbn1cbiIsIjxjOHktdGl0bGUgKm5nSWY9XCIhIXNldHRpbmdzLnRpdGxlXCI+XG4gIHt7IHNldHRpbmdzLnRpdGxlIHwgdHJhbnNsYXRlIH19XG48L2M4eS10aXRsZT5cblxuPGM4eS1icmVhZGNydW1iICpuZ0lmPVwiISFicmVhZGNydW1iXCI+XG4gIDxjOHktYnJlYWRjcnVtYi1pdGVtXG4gICAgW2ljb25dPVwiYnJlYWRjcnVtYi5pY29uXCJcbiAgICBbbGFiZWxdPVwiYnJlYWRjcnVtYi5sYWJlbFwiXG4gICAgW3BhdGhdPVwiYnJlYWRjcnVtYi5wYXRoXCJcbiAgPjwvYzh5LWJyZWFkY3J1bWItaXRlbT5cbjwvYzh5LWJyZWFkY3J1bWI+XG5cbjxjOHktYWN0aW9uLWJhci1pdGVtIFtwbGFjZW1lbnRdPVwiJ3JpZ2h0J1wiICpuZ0lmPVwib25BZGRXaWRnZXQub2JzZXJ2ZXJzLmxlbmd0aFwiPlxuICA8YnV0dG9uXG4gICAgdGl0bGU9XCJ7eyAnQWRkIHdpZGdldCcgfCB0cmFuc2xhdGUgfX1cIlxuICAgIHR5cGU9XCJidXR0b25cIlxuICAgIGNsYXNzPVwiYnRuIGJ0bi1saW5rXCJcbiAgICBbZGlzYWJsZWRdPVwic2V0dGluZ3MuaXNGcm96ZW4gfHwgc2V0dGluZ3MuaXNEaXNhYmxlZFwiXG4gICAgKGNsaWNrKT1cIm9uQWRkV2lkZ2V0LmVtaXQoKVwiXG4gID5cbiAgICA8aSBjOHlJY29uPVwicGx1cy1jaXJjbGVcIj48L2k+XG4gICAge3sgJ0FkZCB3aWRnZXQnIHwgdHJhbnNsYXRlIH19XG4gIDwvYnV0dG9uPlxuPC9jOHktYWN0aW9uLWJhci1pdGVtPlxuXG48Yzh5LWFjdGlvbi1iYXItaXRlbSBbcGxhY2VtZW50XT1cIidyaWdodCdcIiAqbmdJZj1cIm9uRWRpdERhc2hib2FyZC5vYnNlcnZlcnMubGVuZ3RoXCI+XG4gIDxidXR0b25cbiAgICB0aXRsZT1cInt7ICdFZGl0JyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgdHlwZT1cImJ1dHRvblwiXG4gICAgY2xhc3M9XCJidG4gYnRuLWxpbmtcIlxuICAgIFtkaXNhYmxlZF09XCJzZXR0aW5ncy5pc0Zyb3plbiB8fCBzZXR0aW5ncy5pc0Rpc2FibGVkXCJcbiAgICAoY2xpY2spPVwib25FZGl0RGFzaGJvYXJkLmVtaXQoKVwiXG4gID5cbiAgICA8aSBjOHlJY29uPVwicGVuY2lsXCI+PC9pPlxuICAgIHt7ICdFZGl0JyB8IHRyYW5zbGF0ZSB9fVxuICA8L2J1dHRvbj5cbjwvYzh5LWFjdGlvbi1iYXItaXRlbT5cblxuPGM4eS1hY3Rpb24tYmFyLWl0ZW0gW3BsYWNlbWVudF09XCIncmlnaHQnXCIgKm5nSWY9XCJzZXR0aW5ncy5hbGxvd0Z1bGxzY3JlZW5cIj5cbiAgPGJ1dHRvblxuICAgIHRpdGxlPVwie3sgJ0Z1bGwgc2NyZWVuJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgdHlwZT1cImJ1dHRvblwiXG4gICAgY2xhc3M9XCJidG4gYnRuLWxpbmtcIlxuICAgIChjbGljayk9XCJ0b2dnbGVGdWxsc2NyZWVuKClcIlxuICA+XG4gICAgPGkgW2M4eUljb25dPVwiZnVsbFNjcmVlbigpID8gJ2NvbXByZXNzJyA6ICdleHBhbmQnXCI+PC9pPlxuICAgIHt7ICdGdWxsIHNjcmVlbicgfCB0cmFuc2xhdGUgfX1cbiAgPC9idXR0b24+XG48L2M4eS1hY3Rpb24tYmFyLWl0ZW0+XG5cbjxjOHktYWN0aW9uLWJhci1pdGVtXG4gIFtwbGFjZW1lbnRdPVwiJ3JpZ2h0J1wiXG4gIGl0ZW1DbGFzcz1cIm5hdmJhci1mb3JtXCJcbiAgKm5nSWY9XCJvbkZyZWV6ZS5vYnNlcnZlcnMubGVuZ3RoXCJcbj5cbiAgPGJ1dHRvblxuICAgIHRpdGxlPVwie3sgJ0xvY2svdW5sb2NrIHRoaXMgZGFzaGJvYXJkJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgdHlwZT1cImJ1dHRvblwiXG4gICAgY2xhc3M9XCJidG4gYnRuLWRlZmF1bHRcIlxuICAgIFtuZ0NsYXNzXT1cInsgYWN0aXZlOiBzZXR0aW5ncy5pc0Zyb3plbiB9XCJcbiAgICAoY2xpY2spPVwib25GcmVlemUuZW1pdChzZXR0aW5ncylcIlxuICAgIFtkaXNhYmxlZF09XCJzZXR0aW5ncy5pc0Rpc2FibGVkXCJcbiAgICB1aWItYnRuLWNoZWNrYm94XG4gID5cbiAgICA8aSBbYzh5SWNvbl09XCJzZXR0aW5ncy5pc0Zyb3plbiA/ICdsb2NrJyA6ICd1bmxvY2snXCI+PC9pPlxuICA8L2J1dHRvbj5cbjwvYzh5LWFjdGlvbi1iYXItaXRlbT5cbjxjOHktYWN0aW9uLWJhci1pdGVtIFtwbGFjZW1lbnRdPVwiJ21vcmUnXCIgW3ByaW9yaXR5XT1cIi0yMDAwXCIgKm5nSWY9XCJzZXR0aW5ncy5jYW5Db3B5XCI+XG4gIDxidXR0b24gdGl0bGU9XCJ7eyAnQ29weSBkYXNoYm9hcmQnIHwgdHJhbnNsYXRlIH19XCIgdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJvbkNvcHlEYXNoYm9hcmQuZW1pdCgpXCIgY2xhc3M9XCJidG4gYnRuLWxpbmtcIj5cbiAgICA8aSBjOHlJY29uPVwiY2xvbmVcIj48L2k+XG4gICAgPHNwYW4gY2xhc3M9XCJtLWwtNFwiIHRyYW5zbGF0ZT5Db3B5IGRhc2hib2FyZDwvc3Bhbj5cbiAgPC9idXR0b24+XG48L2M4eS1hY3Rpb24tYmFyLWl0ZW0+XG5cbjxjOHktYWN0aW9uLWJhci1pdGVtXG4gIFtwbGFjZW1lbnRdPVwiJ21vcmUnXCJcbiAgW3ByaW9yaXR5XT1cIi0zMDAwXCJcbiAgKm5nSWY9XCJzZXR0aW5ncy5jYW5EZWxldGUgJiYgb25EZWxldGVEYXNoYm9hcmQub2JzZXJ2ZXJzLmxlbmd0aFwiXG4+XG4gIDxidXR0b25cbiAgICB0aXRsZT1cInt7ICdEZWxldGUgZGFzaGJvYXJkJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgdHlwZT1cImJ1dHRvblwiXG4gICAgKGNsaWNrKT1cIm9uRGVsZXRlRGFzaGJvYXJkLmVtaXQoKVwiXG4gICAgW2Rpc2FibGVkXT1cInNldHRpbmdzLmlzRnJvemVuIHx8IHNldHRpbmdzLmlzRGlzYWJsZWRcIlxuICA+XG4gICAgPGkgYzh5SWNvbj1cImRlbGV0ZVwiPjwvaT5cbiAgICA8c3BhbiBjbGFzcz1cIm0tbC00XCIgdHJhbnNsYXRlPkRlbGV0ZSBkYXNoYm9hcmQ8L3NwYW4+XG4gIDwvYnV0dG9uPlxuPC9jOHktYWN0aW9uLWJhci1pdGVtPlxuXG48bmctdGVtcGxhdGUgI2xvYWRpbmdJbmRpY2F0b3I+XG4gIDxjOHktbG9hZGluZyBjbGFzcz1cImNvbC14cy0xMiB0ZXh0LWNlbnRlclwiICpuZ0lmPVwiaXNMb2FkaW5nV2lkZ2V0cyQgfCBhc3luY1wiPjwvYzh5LWxvYWRpbmc+XG48L25nLXRlbXBsYXRlPlxuXG48bmctY29udGFpbmVyICpuZ0lmPVwiIShpc0xvYWRpbmdXaWRnZXRzJCB8IGFzeW5jKTsgZWxzZSBsb2FkaW5nSW5kaWNhdG9yXCI+XG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJyZXNvbHZlZFdpZGdldHMkIHwgYXN5bmMgYXMgd2lkZ2V0c1RvRGlzcGxheVwiPlxuICAgIDwhLS0gZW1wdHkgc3RhdGUgLS0+XG4gICAgPGM4eS11aS1lbXB0eS1zdGF0ZVxuICAgICAgKm5nSWY9XCJ3aWRnZXRzVG9EaXNwbGF5Py5sZW5ndGggPT09IDBcIlxuICAgICAgW2ljb25dPVwiJ2M4eS1kZXZpY2UnXCJcbiAgICAgIFt0aXRsZV09XCInTm8gd2lkZ2V0cyB0byBkaXNwbGF5LicgfCB0cmFuc2xhdGVcIlxuICAgID5cbiAgICAgIDxkaXYgKm5nSWY9XCIhc2V0dGluZ3MuaXNGcm96ZW4gJiYgb25BZGRXaWRnZXQub2JzZXJ2ZXJzLmxlbmd0aFwiPlxuICAgICAgICA8cCB0cmFuc2xhdGU+QWRkIHdpZGdldHMgdG8gdGhpcyBkYXNoYm9hcmQuPC9wPlxuICAgICAgICA8ZGl2PlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIHRpdGxlPVwie3sgJ0FkZCB3aWRnZXQnIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cInNldHRpbmdzLmlzRnJvemVuIHx8IHNldHRpbmdzLmlzRGlzYWJsZWRcIlxuICAgICAgICAgICAgKGNsaWNrKT1cIm9uQWRkV2lkZ2V0LmVtaXQoKVwiXG4gICAgICAgICAgICBjbGFzcz1cImJ0biBidG4tcHJpbWFyeSBtLXQtMTZcIlxuICAgICAgICAgICAgdHJhbnNsYXRlXG4gICAgICAgICAgPlxuICAgICAgICAgICAgQWRkIHdpZGdldFxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPHAgYzh5LWd1aWRlLWRvY3M+XG4gICAgICAgICAgPHNtYWxsIHRyYW5zbGF0ZSBuZ05vbkJpbmRhYmxlPlxuICAgICAgICAgICAgRmluZCBvdXQgbW9yZSBpbiB0aGVcbiAgICAgICAgICAgIDxhIGM4eS1ndWlkZS1ocmVmPVwidXNlcnMtZ3VpZGUvY29ja3BpdC8jZGFzaGJvYXJkc1wiPlVzZXIgZ3VpZGVgS0VFUF9PUklHSU5BTGA8L2E+XG4gICAgICAgICAgICAuXG4gICAgICAgICAgPC9zbWFsbD5cbiAgICAgICAgPC9wPlxuICAgICAgPC9kaXY+XG4gICAgPC9jOHktdWktZW1wdHktc3RhdGU+XG5cbiAgICA8Yzh5LWRhc2hib2FyZFxuICAgICAgKGRhc2hib2FyZENoYW5nZSk9XCJvbkNoYW5nZURhc2hib2FyZC5lbWl0KCRldmVudClcIlxuICAgICAgI2Rhc2hib2FyZFxuICAgID5cbiAgICAgIDxjOHktZGFzaGJvYXJkLWNoaWxkXG4gICAgICAgICpuZ0Zvcj1cImxldCB3aWRnZXQgb2Ygd2lkZ2V0c1RvRGlzcGxheVwiXG4gICAgICAgIFt4XT1cIndpZGdldC5feFwiXG4gICAgICAgIFt5XT1cIndpZGdldC5feVwiXG4gICAgICAgIFt3aWR0aF09XCJ3aWRnZXQuX3dpZHRoIHx8IHNldHRpbmdzLmRlZmF1bHRXaWR0aFwiXG4gICAgICAgIFtoZWlnaHRdPVwid2lkZ2V0Ll9oZWlnaHQgfHwgc2V0dGluZ3MuZGVmYXVsdEhlaWdodFwiXG4gICAgICAgIFttYXJnaW5dPVwic2V0dGluZ3Mud2lkZ2V0TWFyZ2luXCJcbiAgICAgICAgW2lzRnJvemVuXT1cInNldHRpbmdzLmlzRnJvemVuIHx8IHNldHRpbmdzLmlzRGlzYWJsZWRcIlxuICAgICAgICBbY2xhc3NdPVwid2lkZ2V0LmNsYXNzZXNcIlxuICAgICAgICBbZGF0YV09XCJ3aWRnZXRcIlxuICAgICAgICBbdXNlSW50ZXJzZWN0aW9uXT1cInRydWVcIlxuICAgICAgICAoY2hhbmdlU3RhcnQpPVwib25DaGFuZ2VTdGFydC5lbWl0KHsgd2lkZ2V0OiB3aWRnZXQsIHNvdXJjZTogY2hpbGQsIGRhc2hib2FyZDogZGFzaGJvYXJkIH0pXCJcbiAgICAgICAgKGNoYW5nZUVuZCk9XCJvbkNoYW5nZUVuZC5lbWl0KHsgd2lkZ2V0OiB3aWRnZXQsIHNvdXJjZTogY2hpbGQsIGRhc2hib2FyZDogZGFzaGJvYXJkIH0pXCJcbiAgICAgICAgI2NoaWxkXG4gICAgICA+XG4gICAgICAgIDxjOHktZGFzaGJvYXJkLWNoaWxkLXRpdGxlPlxuICAgICAgICAgIDxzcGFuICpuZ0lmPVwic2V0dGluZ3MudHJhbnNsYXRlV2lkZ2V0VGl0bGVcIj5cbiAgICAgICAgICAgIHt7IHdpZGdldC50aXRsZSB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiAqbmdJZj1cIiFzZXR0aW5ncy50cmFuc2xhdGVXaWRnZXRUaXRsZVwiPlxuICAgICAgICAgICAge3sgd2lkZ2V0LnRpdGxlIH19XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICA8L2M4eS1kYXNoYm9hcmQtY2hpbGQtdGl0bGU+XG4gICAgICAgIDxjOHktZGFzaGJvYXJkLWNoaWxkLWFjdGlvbiAqbmdJZj1cIm9uRWRpdFdpZGdldC5vYnNlcnZlcnMubGVuZ3RoXCI+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgdGl0bGU9XCJ7eyAnRWRpdCB3aWRnZXQnIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgKGNsaWNrKT1cIm9uRWRpdFdpZGdldC5lbWl0KHsgd2lkZ2V0OiB3aWRnZXQsIHNvdXJjZTogY2hpbGQsIGRhc2hib2FyZDogZGFzaGJvYXJkIH0pXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8aSBjOHlJY29uPVwicGVuY2lsXCI+PC9pPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtLWwtNFwiIHRyYW5zbGF0ZT5FZGl0PC9zcGFuPlxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2M4eS1kYXNoYm9hcmQtY2hpbGQtYWN0aW9uPlxuICAgICAgICA8Yzh5LWRhc2hib2FyZC1jaGlsZC1hY3Rpb24gKm5nSWY9XCJvbkRlbGV0ZVdpZGdldC5vYnNlcnZlcnMubGVuZ3RoXCI+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgdGl0bGU9XCJ7eyAnUmVtb3ZlIHdpZGdldCcgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAoY2xpY2spPVwib25EZWxldGVXaWRnZXQuZW1pdCh7IHdpZGdldDogd2lkZ2V0LCBzb3VyY2U6IGNoaWxkLCBkYXNoYm9hcmQ6IGRhc2hib2FyZCB9KVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGkgYzh5SWNvbj1cImRlbGV0ZVwiPjwvaT5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibS1sLTRcIiB0cmFuc2xhdGU+UmVtb3ZlPC9zcGFuPlxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2M4eS1kYXNoYm9hcmQtY2hpbGQtYWN0aW9uPlxuXG4gICAgICAgIDxjOHktd2lkZ2V0LXRpbWUtY29udGV4dFxuICAgICAgICAgICpuZ0lmPVwid2lkZ2V0LmNvbmZpZz8uZGlzcGxheVNldHRpbmdzPy5nbG9iYWxUaW1lQ29udGV4dFwiXG4gICAgICAgICAgKGRhdGVDb250ZXh0Q2hhbmdlKT1cInVwZGF0ZVdpZGdldENvbmZpZyh7IGRhdGU6ICRldmVudCB9LCB3aWRnZXQpXCJcbiAgICAgICAgPjwvYzh5LXdpZGdldC10aW1lLWNvbnRleHQ+XG5cbiAgICAgICAgPGM4eS1keW5hbWljLWNvbXBvbmVudFxuICAgICAgICAgIFtjb21wb25lbnRJZF09XCJ3aWRnZXQuY29tcG9uZW50SWQgfHwgd2lkZ2V0Lm5hbWVcIlxuICAgICAgICAgIFtjb25maWddPVwiXG4gICAgICAgICAgICB3aWRnZXQudGVtcGxhdGVVcmwgfHwgd2lkZ2V0LndpZGdldENvbXBvbmVudFxuICAgICAgICAgICAgICA/IHsgY2hpbGQ6IHdpZGdldCwgZGFzaGJvYXJkOiBjb250ZXh0RGFzaGJvYXJkLCBjb250ZXh0OiBjb250ZXh0IH1cbiAgICAgICAgICAgICAgOiB3aWRnZXQuY29uZmlnXG4gICAgICAgICAgXCJcbiAgICAgICAgICAqbmdJZj1cImNoaWxkLmludGVyc2VjdGVkXCJcbiAgICAgICAgICAodXBkYXRlV2lkZ2V0Q2xhc3Nlcyk9XCJ1cGRhdGVXaWRnZXRDbGFzc2VzKHdpZGdldCwgJGV2ZW50KVwiXG4gICAgICAgID48L2M4eS1keW5hbWljLWNvbXBvbmVudD5cbiAgICAgIDwvYzh5LWRhc2hib2FyZC1jaGlsZD5cbiAgICA8L2M4eS1kYXNoYm9hcmQ+XG4gIDwvbmctY29udGFpbmVyPlxuPC9uZy1jb250YWluZXI+XG5cbiJdfQ==
|
|
174
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2lkZ2V0cy1kYXNoYm9hcmQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vY29yZS9kYXNoYm9hcmQvd2lkZ2V0cy1kYXNoYm9hcmQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vY29yZS9kYXNoYm9hcmQvd2lkZ2V0cy1kYXNoYm9hcmQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUl2RSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxnREFBZ0QsQ0FBQztBQUN6RixPQUFPLEVBQUUsZUFBZSxFQUFFLGFBQWEsRUFBRSxLQUFLLEVBQWMsTUFBTSxNQUFNLENBQUM7QUFDekUsT0FBTyxFQUFFLEdBQUcsRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0QsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNoQyxPQUFPLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBYWpGLE1BQU0sT0FBTyx5QkFBeUI7SUE0RXBDLFlBQW9CLE9BQWdDO1FBQWhDLFlBQU8sR0FBUCxPQUFPLENBQXlCO1FBOURwRCxxQkFBZ0IsR0FBUSxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUUsQ0FBQztRQVcvQyxhQUFRLEdBQXNCO1lBQzVCLFFBQVEsRUFBRSxLQUFLO1lBQ2YsVUFBVSxFQUFFLEtBQUs7WUFDakIsWUFBWSxFQUFFLEVBQUU7WUFDaEIsb0JBQW9CLEVBQUUsS0FBSztZQUMzQixhQUFhLEVBQUUsQ0FBQztZQUNoQixZQUFZLEVBQUUsQ0FBQztZQUNmLGVBQWUsRUFBRSxLQUFLO1lBQ3RCLE9BQU8sRUFBRSxJQUFJO1lBQ2IsU0FBUyxFQUFFLElBQUk7WUFDZixT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O2dCQUlGLFNBQVM7c0JBRFosS0FBSzt1QkFBQyxVQUFVO2dCQU9qQixVQUFVO3NCQURULEtBQUs7Z0JBaUJOLFdBQVc7c0JBRFYsTUFBTTtnQkFJUCxZQUFZO3NCQURYLE1BQU07Z0JBSVAsY0FBYztzQkFEYixNQUFNO2dCQUlQLGlCQUFpQjtzQkFEaEIsTUFBTTtnQkFJUCxlQUFlO3NCQURkLE1BQU07Z0JBSVAsZUFBZTtzQkFEZCxNQUFNO2dCQUlQLGlCQUFpQjtzQkFEaEIsTUFBTTtnQkFJUCxRQUFRO3NCQURQLE1BQU07Z0JBSVAsYUFBYTtzQkFEWixNQUFNO2dCQUlQLFdBQVc7c0JBRFYsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBCcmVhZGNydW1iSXRlbSB9IGZyb20gJy4uL2JyZWFkY3J1bWIvYnJlYWRjcnVtYi5tb2RlbCc7XG5pbXBvcnQgeyBEYXNoYm9hcmRDb21wb25lbnQgfSBmcm9tICcuL2Rhc2hib2FyZC5jb21wb25lbnQnO1xuaW1wb3J0IHsgRGFzaGJvYXJkQ2hhbmdlLCBEYXNoYm9hcmRTZXR0aW5ncywgV2lkZ2V0LCBXaWRnZXRDaGFuZ2UgfSBmcm9tICcuL2Rhc2hib2FyZC5tb2RlbCc7XG5pbXBvcnQgeyBEeW5hbWljQ29tcG9uZW50U2VydmljZSB9IGZyb20gJy4uL2R5bmFtaWMtY29tcG9uZW50L2R5bmFtaWMtY29tcG9uZW50LnNlcnZpY2UnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBjb21iaW5lTGF0ZXN0LCBtZXJnZSwgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgbWFwLCBzaGFyZVJlcGxheSwgc3dpdGNoTWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgc2V0IH0gZnJvbSAnbG9kYXNoLWVzJztcbmltcG9ydCB7IFdpZGdldHNEYXNoYm9hcmRFdmVudFNlcnZpY2UgfSBmcm9tICcuL3dpZGdldHMtZGFzaGJvYXJkLWV2ZW50LnNlcnZpY2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjOHktd2lkZ2V0cy1kYXNoYm9hcmQnLFxuICB0ZW1wbGF0ZVVybDogJy4vd2lkZ2V0cy1kYXNoYm9hcmQuY29tcG9uZW50Lmh0bWwnLFxuICBob3N0OiB7XG4gICAgc3R5bGU6IGBcbiAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgIGAsXG4gICAgY2xhc3M6ICdkYXNoYm9hcmQgYzh5LWdyaWQtZGFzaGJvYXJkJ1xuICB9LFxuICBwcm92aWRlcnM6IFtXaWRnZXRzRGFzaGJvYXJkRXZlbnRTZXJ2aWNlXVxufSlcbmV4cG9ydCBjbGFzcyBXaWRnZXRzRGFzaGJvYXJkQ29tcG9uZW50IHtcbiAgQElucHV0KClcbiAgc2V0IHdpZGdldHModmFsdWU6IFdpZGdldFtdKSB7XG4gICAgdGhpcy5fd2lkZ2V0cy5uZXh0KHZhbHVlKTtcbiAgfVxuXG4gIGdldCB3aWRnZXRzKCk6IFdpZGdldFtdIHtcbiAgICByZXR1cm4gdGhpcy5fd2lkZ2V0cy52YWx1ZTtcbiAgfVxuXG4gIEBJbnB1dCgpXG4gIGNvbnRleHQ6IGFueTtcblxuICBASW5wdXQoKVxuICBjb250ZXh0RGFzaGJvYXJkOiBhbnkgPSB7IHVwZGF0ZVRhcmdldDogdHJ1ZSB9O1xuXG4gIEBJbnB1dCgnc2V0dGluZ3MnKVxuICBzZXQgX3NldHRpbmdzKHNldHRpbmdzOiBQYXJ0aWFsPERhc2hib2FyZFNldHRpbmdzPikge1xuICAgIHRoaXMuc2V0dGluZ3MgPSB7IC4uLnRoaXMuc2V0dGluZ3MsIC4uLnNldHRpbmdzIH07XG4gICAgdGhpcy5pc0xvYWRpbmckLm5leHQoISF0aGlzLnNldHRpbmdzLmlzTG9hZGluZyk7XG4gIH1cblxuICBASW5wdXQoKVxuICBicmVhZGNydW1iOiBCcmVhZGNydW1iSXRlbTtcblxuICBzZXR0aW5nczogRGFzaGJvYXJkU2V0dGluZ3MgPSB7XG4gICAgaXNGcm96ZW46IGZhbHNlLFxuICAgIGlzRGlzYWJsZWQ6IGZhbHNlLFxuICAgIHdpZGdldE1hcmdpbjogMTIsXG4gICAgdHJhbnNsYXRlV2lkZ2V0VGl0bGU6IGZhbHNlLFxuICAgIGRlZmF1bHRIZWlnaHQ6IDQsXG4gICAgZGVmYXVsdFdpZHRoOiA0LFxuICAgIGFsbG93RnVsbHNjcmVlbjogZmFsc2UsXG4gICAgY2FuQ29weTogdHJ1ZSxcbiAgICBjYW5EZWxldGU6IHRydWUsXG4gICAgaXNMb2FkaW5nOiBmYWxzZVxuICB9O1xuXG4gIEBPdXRwdXQoKVxuICBvbkFkZFdpZGdldDogRXZlbnRFbWl0dGVyPERhc2hib2FyZENvbXBvbmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgQE91dHB1dCgpXG4gIG9uRWRpdFdpZGdldDogRXZlbnRFbWl0dGVyPFdpZGdldENoYW5nZT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgQE91dHB1dCgpXG4gIG9uRGVsZXRlV2lkZ2V0OiBFdmVudEVtaXR0ZXI8V2lkZ2V0Q2hhbmdlPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICBAT3V0cHV0KClcbiAgb25DaGFuZ2VEYXNoYm9hcmQ6IEV2ZW50RW1pdHRlcjxEYXNoYm9hcmRDaGFuZ2U+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIEBPdXRwdXQoKVxuICBvbkVkaXREYXNoYm9hcmQ6IEV2ZW50RW1pdHRlcjxEYXNoYm9hcmRDb21wb25lbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIEBPdXRwdXQoKVxuICBvbkNvcHlEYXNoYm9hcmQ6IEV2ZW50RW1pdHRlcjxEYXNoYm9hcmRDb21wb25lbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIEBPdXRwdXQoKVxuICBvbkRlbGV0ZURhc2hib2FyZDogRXZlbnRFbWl0dGVyPERhc2hib2FyZENvbXBvbmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgQE91dHB1dCgpXG4gIG9uRnJlZXplOiBFdmVudEVtaXR0ZXI8RGFzaGJvYXJkU2V0dGluZ3M+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIEBPdXRwdXQoKVxuICBvbkNoYW5nZVN0YXJ0OiBFdmVudEVtaXR0ZXI8V2lkZ2V0Q2hhbmdlPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICBAT3V0cHV0KClcbiAgb25DaGFuZ2VFbmQ6IEV2ZW50RW1pdHRlcjxXaWRnZXRDaGFuZ2U+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIHJlc29sdmVkV2lkZ2V0cyQ6IE9ic2VydmFibGU8V2lkZ2V0W10+O1xuXG4gIGlzTG9hZGluZ1dpZGdldHMkOiBPYnNlcnZhYmxlPGJvb2xlYW4+O1xuXG4gIHByaXZhdGUgX3dpZGdldHMgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFdpZGdldFtdPihbXSk7XG4gIHByaXZhdGUgaXNMb2FkaW5nJCA9IG5ldyBCZWhhdmlvclN1YmplY3QoISF0aGlzLl9zZXR0aW5ncz8uaXNMb2FkaW5nKTtcbiAgcHJpdmF0ZSBpc0V4ZWN1dGluZ1Jlc29sdmVycyQ6IE9ic2VydmFibGU8Ym9vbGVhbj47XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBkeW5hbWljOiBEeW5hbWljQ29tcG9uZW50U2VydmljZSkge1xuICAgIHRoaXMucmVzb2x2ZWRXaWRnZXRzJCA9IHRoaXMuX3dpZGdldHMucGlwZShcbiAgICAgIHN3aXRjaE1hcCh3aWRnZXRzID0+IHRoaXMuZXhlY3V0ZVJlc29sdmVyc09mV2lkZ2V0cyh3aWRnZXRzKSksXG4gICAgICBzaGFyZVJlcGxheSgxKVxuICAgICk7XG4gICAgdGhpcy5pc0V4ZWN1dGluZ1Jlc29sdmVycyQgPSBtZXJnZShcbiAgICAgIHRoaXMuX3dpZGdldHMucGlwZShtYXAoKCkgPT4gdHJ1ZSkpLFxuICAgICAgdGhpcy5yZXNvbHZlZFdpZGdldHMkLnBpcGUobWFwKCgpID0+IGZhbHNlKSlcbiAgICApO1xuICAgIHRoaXMuaXNMb2FkaW5nV2lkZ2V0cyQgPSBjb21iaW5lTGF0ZXN0KFt0aGlzLmlzTG9hZGluZyQsIHRoaXMuaXNFeGVjdXRpbmdSZXNvbHZlcnMkXSkucGlwZShcbiAgICAgIG1hcChsb2FkaW5ncyA9PiBsb2FkaW5ncy5zb21lKGxvYWRpbmcgPT4gbG9hZGluZykpLFxuICAgICAgc2hhcmVSZXBsYXkoMSlcbiAgICApO1xuICB9XG5cbiAgdG9nZ2xlRnVsbHNjcmVlbigpIHtcbiAgICBjb25zdCBlbGVtID0gZG9jdW1lbnQuYm9keSBhcyBhbnk7XG4gICAgY29uc3QgZG9jID0gZG9jdW1lbnQgYXMgYW55O1xuICAgIGlmICghdGhpcy5mdWxsU2NyZWVuKCkpIHtcbiAgICAgIGlmIChlbGVtLnJlcXVlc3RGdWxsc2NyZWVuKSB7XG4gICAgICAgIGVsZW0ucmVxdWVzdEZ1bGxzY3JlZW4oKTtcbiAgICAgIH0gZWxzZSBpZiAoZWxlbS5tc1JlcXVlc3RGdWxsc2NyZWVuKSB7XG4gICAgICAgIGVsZW0ubXNSZXF1ZXN0RnVsbHNjcmVlbigpO1xuICAgICAgfSBlbHNlIGlmIChlbGVtLm1velJlcXVlc3RGdWxsU2NyZWVuKSB7XG4gICAgICAgIGVsZW0ubW96UmVxdWVzdEZ1bGxTY3JlZW4oKTtcbiAgICAgIH0gZWxzZSBpZiAoZWxlbS53ZWJraXRSZXF1ZXN0RnVsbHNjcmVlbikge1xuICAgICAgICBlbGVtLndlYmtpdFJlcXVlc3RGdWxsc2NyZWVuKChFbGVtZW50IGFzIGFueSkuQUxMT1dfS0VZQk9BUkRfSU5QVVQpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZG9jLmV4aXRGdWxsc2NyZWVuKSB7XG4gICAgICBkb2MuZXhpdEZ1bGxzY3JlZW4oKTtcbiAgICB9IGVsc2UgaWYgKGRvYy5tc0V4aXRGdWxsc2NyZWVuKSB7XG4gICAgICBkb2MubXNFeGl0RnVsbHNjcmVlbigpO1xuICAgIH0gZWxzZSBpZiAoZG9jLm1vekNhbmNlbEZ1bGxTY3JlZW4pIHtcbiAgICAgIGRvYy5tb3pDYW5jZWxGdWxsU2NyZWVuKCk7XG4gICAgfSBlbHNlIGlmIChkb2Mud2Via2l0RXhpdEZ1bGxzY3JlZW4pIHtcbiAgICAgIGRvYy53ZWJraXRFeGl0RnVsbHNjcmVlbigpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bGxTY3JlZW4oKSB7XG4gICAgY29uc3QgZG9jOiBhbnkgPSBkb2N1bWVudDtcbiAgICByZXR1cm4gISEoXG4gICAgICBkb2MuZnVsbHNjcmVlbkVsZW1lbnQgfHxcbiAgICAgIGRvYy5tb3pGdWxsU2NyZWVuRWxlbWVudCB8fFxuICAgICAgZG9jLndlYmtpdEZ1bGxzY3JlZW5FbGVtZW50IHx8XG4gICAgICBkb2MubXNGdWxsc2NyZWVuRWxlbWVudFxuICAgICk7XG4gIH1cblxuICB1cGRhdGVXaWRnZXRDbGFzc2VzKHdpZGdldDogV2lkZ2V0LCBjbGFzc2VzOiB7IFtrZXk6IHN0cmluZ106IGJvb2xlYW4gfSkge1xuICAgIHdpZGdldC5jbGFzc2VzID0geyAuLi53aWRnZXQuY2xhc3NlcywgLi4uY2xhc3NlcyB9O1xuICB9XG5cbiAgdXBkYXRlV2lkZ2V0Q29uZmlnKGRhdGE6IGFueSwgd2lkZ2V0OiBXaWRnZXQpIHtcbiAgICB3aWRnZXQuY29uZmlnID0geyAuLi53aWRnZXQuY29uZmlnLCAuLi5kYXRhIH07XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGV4ZWN1dGVSZXNvbHZlcnNPZldpZGdldHMod2lkZ2V0czogV2lkZ2V0W10pOiBQcm9taXNlPFdpZGdldFtdPiB7XG4gICAgaWYgKCF3aWRnZXRzKSB7XG4gICAgICByZXR1cm4gd2lkZ2V0cztcbiAgICB9XG5cbiAgICBjb25zdCB0dXBsZSA9IHdpZGdldHMubWFwKHdpZGdldCA9PiAoe1xuICAgICAgY29tcG9uZW50SWQ6IHdpZGdldC5jb21wb25lbnRJZCB8fCB3aWRnZXQubmFtZSxcbiAgICAgIGNvbmZpZzogd2lkZ2V0LmNvbmZpZ1xuICAgIH0pKTtcblxuICAgIGNvbnN0IHJlc29sdmVkUmVzdWx0cyA9IGF3YWl0IHRoaXMuZHluYW1pYy5leGVjdXRlUmVzb2x2ZXJzKHR1cGxlKTtcbiAgICB3aWRnZXRzLmZvckVhY2goKHdpZGdldCwgaW5kZXgpID0+IHtcbiAgICAgIGlmIChyZXNvbHZlZFJlc3VsdHNbaW5kZXhdKSB7XG4gICAgICAgIGlmICghd2lkZ2V0LmNvbmZpZykge1xuICAgICAgICAgIHdpZGdldC5jb25maWcgPSB7fTtcbiAgICAgICAgfVxuICAgICAgICBPYmplY3QuZW50cmllcyhyZXNvbHZlZFJlc3VsdHNbaW5kZXhdKS5mb3JFYWNoKChba2V5LCB2YWx1ZV0pID0+XG4gICAgICAgICAgc2V0KHdpZGdldC5jb25maWcsIGtleSwgdmFsdWUpXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHdpZGdldHM7XG4gIH1cbn1cbiIsIjxjOHktdGl0bGUgKm5nSWY9XCIhIXNldHRpbmdzLnRpdGxlXCI+XG4gIHt7IHNldHRpbmdzLnRpdGxlIHwgdHJhbnNsYXRlIH19XG48L2M4eS10aXRsZT5cblxuPGM4eS1icmVhZGNydW1iICpuZ0lmPVwiISFicmVhZGNydW1iXCI+XG4gIDxjOHktYnJlYWRjcnVtYi1pdGVtXG4gICAgW2ljb25dPVwiYnJlYWRjcnVtYi5pY29uXCJcbiAgICBbbGFiZWxdPVwiYnJlYWRjcnVtYi5sYWJlbFwiXG4gICAgW3BhdGhdPVwiYnJlYWRjcnVtYi5wYXRoXCJcbiAgPjwvYzh5LWJyZWFkY3J1bWItaXRlbT5cbjwvYzh5LWJyZWFkY3J1bWI+XG5cbjxjOHktYWN0aW9uLWJhci1pdGVtIFtwbGFjZW1lbnRdPVwiJ3JpZ2h0J1wiICpuZ0lmPVwib25BZGRXaWRnZXQub2JzZXJ2ZXJzLmxlbmd0aFwiPlxuICA8YnV0dG9uXG4gICAgdGl0bGU9XCJ7eyAnQWRkIHdpZGdldCcgfCB0cmFuc2xhdGUgfX1cIlxuICAgIHR5cGU9XCJidXR0b25cIlxuICAgIGNsYXNzPVwiYnRuIGJ0bi1saW5rXCJcbiAgICBbZGlzYWJsZWRdPVwic2V0dGluZ3MuaXNGcm96ZW4gfHwgc2V0dGluZ3MuaXNEaXNhYmxlZFwiXG4gICAgKGNsaWNrKT1cIm9uQWRkV2lkZ2V0LmVtaXQoKVwiXG4gID5cbiAgICA8aSBjOHlJY29uPVwicGx1cy1jaXJjbGVcIj48L2k+XG4gICAge3sgJ0FkZCB3aWRnZXQnIHwgdHJhbnNsYXRlIH19XG4gIDwvYnV0dG9uPlxuPC9jOHktYWN0aW9uLWJhci1pdGVtPlxuXG48Yzh5LWFjdGlvbi1iYXItaXRlbSBbcGxhY2VtZW50XT1cIidyaWdodCdcIiAqbmdJZj1cIm9uRWRpdERhc2hib2FyZC5vYnNlcnZlcnMubGVuZ3RoXCI+XG4gIDxidXR0b25cbiAgICB0aXRsZT1cInt7ICdFZGl0JyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgdHlwZT1cImJ1dHRvblwiXG4gICAgY2xhc3M9XCJidG4gYnRuLWxpbmtcIlxuICAgIFtkaXNhYmxlZF09XCJzZXR0aW5ncy5pc0Zyb3plbiB8fCBzZXR0aW5ncy5pc0Rpc2FibGVkXCJcbiAgICAoY2xpY2spPVwib25FZGl0RGFzaGJvYXJkLmVtaXQoKVwiXG4gID5cbiAgICA8aSBjOHlJY29uPVwicGVuY2lsXCI+PC9pPlxuICAgIHt7ICdFZGl0JyB8IHRyYW5zbGF0ZSB9fVxuICA8L2J1dHRvbj5cbjwvYzh5LWFjdGlvbi1iYXItaXRlbT5cblxuPGM4eS1hY3Rpb24tYmFyLWl0ZW0gW3BsYWNlbWVudF09XCIncmlnaHQnXCIgKm5nSWY9XCJzZXR0aW5ncy5hbGxvd0Z1bGxzY3JlZW5cIj5cbiAgPGJ1dHRvblxuICAgIHRpdGxlPVwie3sgJ0Z1bGwgc2NyZWVuJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgdHlwZT1cImJ1dHRvblwiXG4gICAgY2xhc3M9XCJidG4gYnRuLWxpbmtcIlxuICAgIChjbGljayk9XCJ0b2dnbGVGdWxsc2NyZWVuKClcIlxuICA+XG4gICAgPGkgW2M4eUljb25dPVwiZnVsbFNjcmVlbigpID8gJ2NvbXByZXNzJyA6ICdleHBhbmQnXCI+PC9pPlxuICAgIHt7ICdGdWxsIHNjcmVlbicgfCB0cmFuc2xhdGUgfX1cbiAgPC9idXR0b24+XG48L2M4eS1hY3Rpb24tYmFyLWl0ZW0+XG5cbjxjOHktYWN0aW9uLWJhci1pdGVtXG4gIFtwbGFjZW1lbnRdPVwiJ3JpZ2h0J1wiXG4gIGl0ZW1DbGFzcz1cIm5hdmJhci1mb3JtXCJcbiAgKm5nSWY9XCJvbkZyZWV6ZS5vYnNlcnZlcnMubGVuZ3RoXCJcbj5cbiAgPGJ1dHRvblxuICAgIHRpdGxlPVwie3sgJ0xvY2svdW5sb2NrIHRoaXMgZGFzaGJvYXJkJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgdHlwZT1cImJ1dHRvblwiXG4gICAgY2xhc3M9XCJidG4gYnRuLWRlZmF1bHRcIlxuICAgIFtuZ0NsYXNzXT1cInsgYWN0aXZlOiBzZXR0aW5ncy5pc0Zyb3plbiB9XCJcbiAgICAoY2xpY2spPVwib25GcmVlemUuZW1pdChzZXR0aW5ncylcIlxuICAgIFtkaXNhYmxlZF09XCJzZXR0aW5ncy5pc0Rpc2FibGVkXCJcbiAgICB1aWItYnRuLWNoZWNrYm94XG4gID5cbiAgICA8aSBbYzh5SWNvbl09XCJzZXR0aW5ncy5pc0Zyb3plbiA/ICdsb2NrJyA6ICd1bmxvY2snXCI+PC9pPlxuICA8L2J1dHRvbj5cbjwvYzh5LWFjdGlvbi1iYXItaXRlbT5cbjxjOHktYWN0aW9uLWJhci1pdGVtIFtwbGFjZW1lbnRdPVwiJ21vcmUnXCIgW3ByaW9yaXR5XT1cIi0yMDAwXCIgKm5nSWY9XCJzZXR0aW5ncy5jYW5Db3B5XCI+XG4gIDxidXR0b24gdGl0bGU9XCJ7eyAnQ29weSBkYXNoYm9hcmQnIHwgdHJhbnNsYXRlIH19XCIgdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJvbkNvcHlEYXNoYm9hcmQuZW1pdCgpXCIgY2xhc3M9XCJidG4gYnRuLWxpbmtcIj5cbiAgICA8aSBjOHlJY29uPVwiY2xvbmVcIj48L2k+XG4gICAgPHNwYW4gY2xhc3M9XCJtLWwtNFwiIHRyYW5zbGF0ZT5Db3B5IGRhc2hib2FyZDwvc3Bhbj5cbiAgPC9idXR0b24+XG48L2M4eS1hY3Rpb24tYmFyLWl0ZW0+XG5cbjxjOHktYWN0aW9uLWJhci1pdGVtXG4gIFtwbGFjZW1lbnRdPVwiJ21vcmUnXCJcbiAgW3ByaW9yaXR5XT1cIi0zMDAwXCJcbiAgKm5nSWY9XCJzZXR0aW5ncy5jYW5EZWxldGUgJiYgb25EZWxldGVEYXNoYm9hcmQub2JzZXJ2ZXJzLmxlbmd0aFwiXG4+XG4gIDxidXR0b25cbiAgICB0aXRsZT1cInt7ICdEZWxldGUgZGFzaGJvYXJkJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgdHlwZT1cImJ1dHRvblwiXG4gICAgKGNsaWNrKT1cIm9uRGVsZXRlRGFzaGJvYXJkLmVtaXQoKVwiXG4gICAgW2Rpc2FibGVkXT1cInNldHRpbmdzLmlzRnJvemVuIHx8IHNldHRpbmdzLmlzRGlzYWJsZWRcIlxuICA+XG4gICAgPGkgYzh5SWNvbj1cImRlbGV0ZVwiPjwvaT5cbiAgICA8c3BhbiBjbGFzcz1cIm0tbC00XCIgdHJhbnNsYXRlPkRlbGV0ZSBkYXNoYm9hcmQ8L3NwYW4+XG4gIDwvYnV0dG9uPlxuPC9jOHktYWN0aW9uLWJhci1pdGVtPlxuXG48bmctdGVtcGxhdGUgI2xvYWRpbmdJbmRpY2F0b3I+XG4gIDxjOHktbG9hZGluZyBjbGFzcz1cImNvbC14cy0xMiB0ZXh0LWNlbnRlclwiICpuZ0lmPVwiaXNMb2FkaW5nV2lkZ2V0cyQgfCBhc3luY1wiPjwvYzh5LWxvYWRpbmc+XG48L25nLXRlbXBsYXRlPlxuXG48bmctY29udGFpbmVyICpuZ0lmPVwiIShpc0xvYWRpbmdXaWRnZXRzJCB8IGFzeW5jKTsgZWxzZSBsb2FkaW5nSW5kaWNhdG9yXCI+XG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJyZXNvbHZlZFdpZGdldHMkIHwgYXN5bmMgYXMgd2lkZ2V0c1RvRGlzcGxheVwiPlxuICAgIDwhLS0gZW1wdHkgc3RhdGUgLS0+XG4gICAgPGM4eS11aS1lbXB0eS1zdGF0ZVxuICAgICAgKm5nSWY9XCJ3aWRnZXRzVG9EaXNwbGF5Py5sZW5ndGggPT09IDBcIlxuICAgICAgW2ljb25dPVwiJ2M4eS1kZXZpY2UnXCJcbiAgICAgIFt0aXRsZV09XCInTm8gd2lkZ2V0cyB0byBkaXNwbGF5LicgfCB0cmFuc2xhdGVcIlxuICAgID5cbiAgICAgIDxkaXYgKm5nSWY9XCIhc2V0dGluZ3MuaXNGcm96ZW4gJiYgb25BZGRXaWRnZXQub2JzZXJ2ZXJzLmxlbmd0aFwiPlxuICAgICAgICA8cCB0cmFuc2xhdGU+QWRkIHdpZGdldHMgdG8gdGhpcyBkYXNoYm9hcmQuPC9wPlxuICAgICAgICA8ZGl2PlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIHRpdGxlPVwie3sgJ0FkZCB3aWRnZXQnIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cInNldHRpbmdzLmlzRnJvemVuIHx8IHNldHRpbmdzLmlzRGlzYWJsZWRcIlxuICAgICAgICAgICAgKGNsaWNrKT1cIm9uQWRkV2lkZ2V0LmVtaXQoKVwiXG4gICAgICAgICAgICBjbGFzcz1cImJ0biBidG4tcHJpbWFyeSBtLXQtMTZcIlxuICAgICAgICAgICAgdHJhbnNsYXRlXG4gICAgICAgICAgPlxuICAgICAgICAgICAgQWRkIHdpZGdldFxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPHAgYzh5LWd1aWRlLWRvY3M+XG4gICAgICAgICAgPHNtYWxsIHRyYW5zbGF0ZSBuZ05vbkJpbmRhYmxlPlxuICAgICAgICAgICAgRmluZCBvdXQgbW9yZSBpbiB0aGVcbiAgICAgICAgICAgIDxhIGM4eS1ndWlkZS1ocmVmPVwidXNlcnMtZ3VpZGUvY29ja3BpdC8jZGFzaGJvYXJkc1wiPlVzZXIgZ3VpZGVgS0VFUF9PUklHSU5BTGA8L2E+XG4gICAgICAgICAgICAuXG4gICAgICAgICAgPC9zbWFsbD5cbiAgICAgICAgPC9wPlxuICAgICAgPC9kaXY+XG4gICAgPC9jOHktdWktZW1wdHktc3RhdGU+XG5cbiAgICA8Yzh5LWRhc2hib2FyZFxuICAgICAgKGRhc2hib2FyZENoYW5nZSk9XCJvbkNoYW5nZURhc2hib2FyZC5lbWl0KCRldmVudClcIlxuICAgICAgI2Rhc2hib2FyZFxuICAgID5cbiAgICAgIDxjOHktZGFzaGJvYXJkLWNoaWxkXG4gICAgICAgICpuZ0Zvcj1cImxldCB3aWRnZXQgb2Ygd2lkZ2V0c1RvRGlzcGxheVwiXG4gICAgICAgIFt4XT1cIndpZGdldC5feFwiXG4gICAgICAgIFt5XT1cIndpZGdldC5feVwiXG4gICAgICAgIFt3aWR0aF09XCJ3aWRnZXQuX3dpZHRoIHx8IHNldHRpbmdzLmRlZmF1bHRXaWR0aFwiXG4gICAgICAgIFtoZWlnaHRdPVwid2lkZ2V0Ll9oZWlnaHQgfHwgc2V0dGluZ3MuZGVmYXVsdEhlaWdodFwiXG4gICAgICAgIFttYXJnaW5dPVwic2V0dGluZ3Mud2lkZ2V0TWFyZ2luXCJcbiAgICAgICAgW2lzRnJvemVuXT1cInNldHRpbmdzLmlzRnJvemVuIHx8IHNldHRpbmdzLmlzRGlzYWJsZWRcIlxuICAgICAgICBbY2xhc3NdPVwid2lkZ2V0LmNsYXNzZXNcIlxuICAgICAgICBbZGF0YV09XCJ3aWRnZXRcIlxuICAgICAgICBbdXNlSW50ZXJzZWN0aW9uXT1cInRydWVcIlxuICAgICAgICAoY2hhbmdlU3RhcnQpPVwib25DaGFuZ2VTdGFydC5lbWl0KHsgd2lkZ2V0OiB3aWRnZXQsIHNvdXJjZTogY2hpbGQsIGRhc2hib2FyZDogZGFzaGJvYXJkIH0pXCJcbiAgICAgICAgKGNoYW5nZUVuZCk9XCJvbkNoYW5nZUVuZC5lbWl0KHsgd2lkZ2V0OiB3aWRnZXQsIHNvdXJjZTogY2hpbGQsIGRhc2hib2FyZDogZGFzaGJvYXJkIH0pXCJcbiAgICAgICAgI2NoaWxkXG4gICAgICA+XG4gICAgICAgIDxjOHktZGFzaGJvYXJkLWNoaWxkLXRpdGxlPlxuICAgICAgICAgIDxzcGFuICpuZ0lmPVwic2V0dGluZ3MudHJhbnNsYXRlV2lkZ2V0VGl0bGVcIj5cbiAgICAgICAgICAgIHt7IHdpZGdldC50aXRsZSB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiAqbmdJZj1cIiFzZXR0aW5ncy50cmFuc2xhdGVXaWRnZXRUaXRsZVwiPlxuICAgICAgICAgICAge3sgd2lkZ2V0LnRpdGxlIH19XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICA8L2M4eS1kYXNoYm9hcmQtY2hpbGQtdGl0bGU+XG4gICAgICAgIDxjOHktZGFzaGJvYXJkLWNoaWxkLWFjdGlvbiAqbmdJZj1cIm9uRWRpdFdpZGdldC5vYnNlcnZlcnMubGVuZ3RoXCI+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgdGl0bGU9XCJ7eyAnRWRpdCB3aWRnZXQnIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgKGNsaWNrKT1cIm9uRWRpdFdpZGdldC5lbWl0KHsgd2lkZ2V0OiB3aWRnZXQsIHNvdXJjZTogY2hpbGQsIGRhc2hib2FyZDogZGFzaGJvYXJkIH0pXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8aSBjOHlJY29uPVwicGVuY2lsXCI+PC9pPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtLWwtNFwiIHRyYW5zbGF0ZT5FZGl0PC9zcGFuPlxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2M4eS1kYXNoYm9hcmQtY2hpbGQtYWN0aW9uPlxuICAgICAgICA8Yzh5LWRhc2hib2FyZC1jaGlsZC1hY3Rpb24gKm5nSWY9XCJvbkRlbGV0ZVdpZGdldC5vYnNlcnZlcnMubGVuZ3RoXCI+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgdGl0bGU9XCJ7eyAnUmVtb3ZlIHdpZGdldCcgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAoY2xpY2spPVwib25EZWxldGVXaWRnZXQuZW1pdCh7IHdpZGdldDogd2lkZ2V0LCBzb3VyY2U6IGNoaWxkLCBkYXNoYm9hcmQ6IGRhc2hib2FyZCB9KVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGkgYzh5SWNvbj1cImRlbGV0ZVwiPjwvaT5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibS1sLTRcIiB0cmFuc2xhdGU+UmVtb3ZlPC9zcGFuPlxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2M4eS1kYXNoYm9hcmQtY2hpbGQtYWN0aW9uPlxuXG4gICAgICAgIDxjOHktd2lkZ2V0LXRpbWUtY29udGV4dFxuICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICB3aWRnZXQuY29uZmlnPy5kaXNwbGF5U2V0dGluZ3M/Lmdsb2JhbFRpbWVDb250ZXh0ICYmXG4gICAgICAgICAgICB3aWRnZXQuY29uZmlnPy53aWRnZXRJbnN0YW5jZUdsb2JhbFRpbWVDb250ZXh0XG4gICAgICAgICAgXCJcbiAgICAgICAgICAoZGF0ZUNvbnRleHRDaGFuZ2UpPVwidXBkYXRlV2lkZ2V0Q29uZmlnKHsgZGF0ZTogJGV2ZW50IH0sIHdpZGdldClcIlxuICAgICAgICAgIFtjYW5EZWNvdXBsZV09XCJ3aWRnZXQuY29uZmlnLmNhbkRlY291cGxlR2xvYmFsVGltZUNvbnRleHRcIlxuICAgICAgICA+PC9jOHktd2lkZ2V0LXRpbWUtY29udGV4dD5cblxuICAgICAgICA8Yzh5LWR5bmFtaWMtY29tcG9uZW50XG4gICAgICAgICAgW2NvbXBvbmVudElkXT1cIndpZGdldC5jb21wb25lbnRJZCB8fCB3aWRnZXQubmFtZVwiXG4gICAgICAgICAgW2NvbmZpZ109XCJcbiAgICAgICAgICAgIHdpZGdldC50ZW1wbGF0ZVVybCB8fCB3aWRnZXQud2lkZ2V0Q29tcG9uZW50XG4gICAgICAgICAgICAgID8geyBjaGlsZDogd2lkZ2V0LCBkYXNoYm9hcmQ6IGNvbnRleHREYXNoYm9hcmQsIGNvbnRleHQ6IGNvbnRleHQgfVxuICAgICAgICAgICAgICA6IHdpZGdldC5jb25maWdcbiAgICAgICAgICBcIlxuICAgICAgICAgICpuZ0lmPVwiY2hpbGQuaW50ZXJzZWN0ZWRcIlxuICAgICAgICAgICh1cGRhdGVXaWRnZXRDbGFzc2VzKT1cInVwZGF0ZVdpZGdldENsYXNzZXMod2lkZ2V0LCAkZXZlbnQpXCJcbiAgICAgICAgPjwvYzh5LWR5bmFtaWMtY29tcG9uZW50PlxuICAgICAgPC9jOHktZGFzaGJvYXJkLWNoaWxkPlxuICAgIDwvYzh5LWRhc2hib2FyZD5cbiAgPC9uZy1jb250YWluZXI+XG48L25nLWNvbnRhaW5lcj5cblxuIl19
|
|
@@ -72,10 +72,7 @@ export class PluginsResolveService {
|
|
|
72
72
|
* @param remoteModules The remote plugins to load as factory name mapping array.
|
|
73
73
|
*/
|
|
74
74
|
resolveRemotePlugins(remoteModules) {
|
|
75
|
-
|
|
76
|
-
.filter(({ factory }) => factory)
|
|
77
|
-
.map(({ name, factory }) => factory[name]);
|
|
78
|
-
this.loadModulesDynamically(remoteNgModules);
|
|
75
|
+
this.loadModulesDynamically(remoteModules);
|
|
79
76
|
this.refreshHooks();
|
|
80
77
|
this.markPluginsAsLoaded();
|
|
81
78
|
}
|
|
@@ -83,9 +80,14 @@ export class PluginsResolveService {
|
|
|
83
80
|
* Loads modules and handles hooking correctly.
|
|
84
81
|
* @param remoteNgModules The modules to load.
|
|
85
82
|
*/
|
|
86
|
-
loadModulesDynamically(
|
|
87
|
-
for (const
|
|
88
|
-
|
|
83
|
+
loadModulesDynamically(remoteModules) {
|
|
84
|
+
for (const { factory, name } of remoteModules) {
|
|
85
|
+
try {
|
|
86
|
+
this.loadModule(factory[name]);
|
|
87
|
+
}
|
|
88
|
+
catch (ex) {
|
|
89
|
+
console.error(`Failed to load ${name}`, ex);
|
|
90
|
+
}
|
|
89
91
|
}
|
|
90
92
|
}
|
|
91
93
|
loadModule(remoteNgModule) {
|
|
@@ -284,4 +286,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.6", ngImpor
|
|
|
284
286
|
providedIn: 'root'
|
|
285
287
|
}]
|
|
286
288
|
}], ctorParameters: function () { return [{ type: i1.TabsService }, { type: i2.NavigatorService }, { type: i3.ActionService }, { type: i4.ActionBarService }, { type: i5.BreadcrumbService }, { type: i6.DynamicComponentService }, { type: i7.SearchService }, { type: i8.RouterService }, { type: i9.DocsService }, { type: i10.WizardService }, { type: i11.StepperService }, { type: i12.TranslateService }, { type: i13.FetchClient }, { type: i14.AppStateService }, { type: i0.EnvironmentInjector }]; } });
|
|
287
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2lucy1yZXNvbHZlLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9jb3JlL3BsdWdpbnMvcGx1Z2lucy1yZXNvbHZlLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUE0QixXQUFXLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDcEUsT0FBTyxFQUNMLFVBQVUsRUFFVixXQUFXLEVBQ1gsaUJBQWlCLEVBQ2pCLFdBQVcsRUFDWCxtQkFBbUIsRUFDbkIsbUJBQW1CLEVBRXBCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxlQUFlLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUNyRixPQUFPLEVBQUUsYUFBYSxFQUFFLFdBQVcsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3RFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxlQUFlLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUV0RixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDaEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSw4Q0FBOEMsQ0FBQztBQUMvRSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxnREFBZ0QsQ0FBQztBQUN6RixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUN4RixPQUFPLEVBQUUsVUFBVSxFQUFFLGFBQWEsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3JFLE9BQU8sRUFBRSxXQUFXLEVBQUUsYUFBYSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDdEUsT0FBTyxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUM5RCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDekQsT0FB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ZXRjaENsaWVudCB9IGZyb20gJ0BjOHkvY2xpZW50JztcbmltcG9ydCB7XG4gIEluamVjdGFibGUsXG4gIEluamVjdGlvblRva2VuLFxuICBOZ01vZHVsZVJlZixcbiAgY3JlYXRlTmdNb2R1bGVSZWYsXG4gIEluamVjdEZsYWdzLFxuICBFbnZpcm9ubWVudEluamVjdG9yLFxuICBpbXBvcnRQcm92aWRlcnNGcm9tLFxuICBUeXBlXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQWN0aW9uQmFyU2VydmljZSwgSE9PS19BQ1RJT05fQkFSIH0gZnJvbSAnLi4vYWN0aW9uLWJhci9hY3Rpb24tYmFyLnNlcnZpY2UnO1xuaW1wb3J0IHsgQWN0aW9uU2VydmljZSwgSE9PS19BQ1RJT04gfSBmcm9tICcuLi9hY3Rpb24vYWN0aW9uLnNlcnZpY2UnO1xuaW1wb3J0IHsgQnJlYWRjcnVtYlNlcnZpY2UsIEhPT0tfQlJFQURDUlVNQiB9IGZyb20gJy4uL2JyZWFkY3J1bWIvYnJlYWRjcnVtYi5zZXJ2aWNlJztcbmltcG9ydCB7IEV4dGVuc2lvblBvaW50IH0gZnJvbSAnLi4vY29tbW9uL2V4dGVuc2lvbi1ob29rcyc7XG5pbXBvcnQgeyBIT09LX0RPQ1MgfSBmcm9tICcuLi9kb2NzL2RvY3MubW9kZWxzJztcbmltcG9ydCB7IERvY3NTZXJ2aWNlIH0gZnJvbSAnLi4vZG9jcy9kb2NzLnNlcnZpY2UnO1xuaW1wb3J0IHsgSE9PS19DT01QT05FTlRTIH0gZnJvbSAnLi4vZHluYW1pYy1jb21wb25lbnQvZHluYW1pYy1jb21wb25lbnQubW9kZWwnO1xuaW1wb3J0IHsgRHluYW1pY0NvbXBvbmVudFNlcnZpY2UgfSBmcm9tICcuLi9keW5hbWljLWNvbXBvbmVudC9keW5hbWljLWNvbXBvbmVudC5zZXJ2aWNlJztcbmltcG9ydCB7IEhPT0tfTkFWSUdBVE9SX05PREVTLCBOYXZpZ2F0b3JTZXJ2aWNlIH0gZnJvbSAnLi4vbmF2aWdhdG9yL25hdmlnYXRvci5zZXJ2aWNlJztcbmltcG9ydCB7IEhPT0tfUk9VVEUsIFJvdXRlclNlcnZpY2UgfSBmcm9tICcuLi9yb3V0ZXIvcm91dGVyLnNlcnZpY2UnO1xuaW1wb3J0IHsgSE9PS19TRUFSQ0gsIFNlYXJjaFNlcnZpY2UgfSBmcm9tICcuLi9zZWFyY2gvc2VhcmNoLnNlcnZpY2UnO1xuaW1wb3J0IHsgSE9PS19UQUJTLCBUYWJzU2VydmljZSB9IGZyb20gJy4uL3RhYnMvdGFicy5zZXJ2aWNlJztcbmltcG9ydCB7IFdpemFyZFNlcnZpY2UgfSBmcm9tICcuLi93aXphcmQvd2l6YXJkLnNlcnZpY2UnO1xuaW1wb3J0IHsgSE9PS19XSVpBUkQgfSBmcm9tICcuLi93aXphcmQvd2l6YXJkLm1vZGVsJztcbmltcG9ydCB7IHJlZHVjZSwgZm9yRWFjaCwgZ2V0LCB1bmlvbiwgY2FtZWxDYXNlLCBmbGF0dGVuIH0gZnJvbSAnbG9kYXNoLWVzJztcbmltcG9ydCB7IEhPT0tfU1RFUFBFUiwgU3RlcHBlclNlcnZpY2UgfSBmcm9tICcuLi9zdGVwcGVyL3N0ZXBwZXIuc2VydmljZSc7XG5pbXBvcnQgeyBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQgeyBBcHBTdGF0ZVNlcnZpY2UgfSBmcm9tICcuLi9jb21tb24nO1xuaW1wb3J0IHsgUk9VVEVTIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcblxudHlwZSBTY29wZSA9IHVua25vd247XG50eXBlIEZhY3RvcnkgPSAoKSA9PiBhbnk7XG5cbmRlY2xhcmUgY29uc3QgX193ZWJwYWNrX2luaXRfc2hhcmluZ19fOiAoc2hhcmVTY29wZTogc3RyaW5nKSA9PiBQcm9taXNlPHZvaWQ+O1xuZGVjbGFyZSBjb25zdCBfX3dlYnBhY2tfc2hhcmVfc2NvcGVzX186IHsgZGVmYXVsdDogU2NvcGUgfTtcblxuaW50ZXJmYWNlIENvbnRhaW5lciB7XG4gIGluaXQoc2hhcmVTY29wZTogU2NvcGUpOiB2b2lkO1xuICBnZXQobW9kdWxlOiBzdHJpbmcpOiBGYWN0b3J5O1xufVxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgUGx1Z2luc1Jlc29sdmVTZXJ2aWNlIHtcbiAgcHJpdmF0ZSB1cmxSZW1vdGVzQ2FjaGU6IEFwcGxpY2F0aW9uUmVtb3RlUGx1Z2lucyA9IG51bGw7XG4gIHByaXZhdGUgcmVtb3RlU2NyaXB0U2V0ID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIHByaXZhdGUgYWxsSG9va3M6IEFycmF5PHtcbiAgICB0b2tlbjogSW5qZWN0aW9uVG9rZW48YW55PjtcbiAgICBzZXJ2aWNlOiBFeHRlbnNpb25Qb2ludDxhbnk+O1xuICB9PiA9IFtcbiAgICB7IHRva2VuOiBIT09LX0FDVElPTiwgc2VydmljZTogdGhpcy5hY3Rpb24gfSxcbiAgICB7IHRva2VuOiBIT09LX0FDVElPTl9CQVIsIHNlcnZpY2U6IHRoaXMuYWN0aW9uQmFyIH0sXG4gICAgeyB0b2tlbjogSE9PS19OQVZJR0FUT1JfTk9ERVMsIHNlcnZpY2U6IHRoaXMubmF2aWdhdG9yIH0sXG4gICAgeyB0b2tlbjogSE9PS19CUkVBRENSVU1CLCBzZXJ2aWNlOiB0aGlzLmJyZWFkY3J1bWIgfSxcbiAgICB7IHRva2VuOiBIT09LX0NPTVBPTkVOVFMsIHNlcnZpY2U6IHRoaXMuZHluYW1pY0NvbXBvbmVudCB9LFxuICAgIHsgdG9rZW46IEhPT0tfUk9VVEUsIHNlcnZpY2U6IHRoaXMuYzh5Um91dGVyIH0sXG4gICAgeyB0b2tlbjogSE9PS19TRUFSQ0gsIHNlcnZpY2U6IHRoaXMuc2VhcmNoIH0sXG4gICAgeyB0b2tlbjogSE9PS19UQUJTLCBzZXJ2aWNlOiB0aGlzLnRhYnMgfSxcbiAgICB7IHRva2VuOiBIT09LX0RPQ1MsIHNlcnZpY2U6IHRoaXMuZG9jcyB9LFxuICAgIHsgdG9rZW46IEhPT0tfV0laQVJELCBzZXJ2aWNlOiB0aGlzLndpemFyZCB9LFxuICAgIHsgdG9rZW46IEhPT0tfU1RFUFBFUiwgc2VydmljZTogdGhpcy5zdGVwcGVyIH1cbiAgXTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHRhYnM6IFRhYnNTZXJ2aWNlLFxuICAgIHByaXZhdGUgbmF2aWdhdG9yOiBOYXZpZ2F0b3JTZXJ2aWNlLFxuICAgIHByaXZhdGUgYWN0aW9uOiBBY3Rpb25TZXJ2aWNlLFxuICAgIHByaXZhdGUgYWN0aW9uQmFyOiBBY3Rpb25CYXJTZXJ2aWNlLFxuICAgIHByaXZhdGUgYnJlYWRjcnVtYjogQnJlYWRjcnVtYlNlcnZpY2UsXG4gICAgcHJpdmF0ZSBkeW5hbWljQ29tcG9uZW50OiBEeW5hbWljQ29tcG9uZW50U2VydmljZSxcbiAgICBwcml2YXRlIHNlYXJjaDogU2VhcmNoU2VydmljZSxcbiAgICBwcml2YXRlIGM4eVJvdXRlcjogUm91dGVyU2VydmljZSxcbiAgICBwcml2YXRlIGRvY3M6IERvY3NTZXJ2aWNlLFxuICAgIHByaXZhdGUgd2l6YXJkOiBXaXphcmRTZXJ2aWNlLFxuICAgIHByaXZhdGUgc3RlcHBlcjogU3RlcHBlclNlcnZpY2UsXG4gICAgcHJpdmF0ZSB0cmFuc2xhdGVTZXJ2aWNlOiBUcmFuc2xhdGVTZXJ2aWNlLFxuICAgIHByaXZhdGUgZmV0Y2hDbGllbnQ6IEZldGNoQ2xpZW50LFxuICAgIHByaXZhdGUgYXBwU3RhdGU6IEFwcFN0YXRlU2VydmljZSxcbiAgICBwcml2YXRlIGluamVjdG9yOiBFbnZpcm9ubWVudEluamVjdG9yXG4gICkge31cblxuICAvKipcbiAgICogTG9hZHMgcGx1Z2lucyBieSByZXNvbHZpbmcgdGhlIHJlbW90ZSBOZ01vZHVsZXMgYW5kIGluamVjdGluZyBpdC4gQWxzbyBhdHRhY2hpbmdcbiAgICogdGhlIGhvb2tzIG9udG8gdGhlIHJvb3QgaW5qZWN0b3IuXG4gICAqIEBwYXJhbSByZW1vdGVNb2R1bGVzIFRoZSByZW1vdGUgcGx1Z2lucyB0byBsb2FkIGFzIGZhY3RvcnkgbmFtZSBtYXBwaW5nIGFycmF5LlxuICAgKi9cbiAgcmVzb2x2ZVJlbW90ZVBsdWdpbnMocmVtb3RlTW9kdWxlczogQXJyYXk8eyBmYWN0b3J5OyBuYW1lIH0+KSB7XG4gICAgY29uc3QgcmVtb3RlTmdNb2R1bGVzID0gcmVtb3RlTW9kdWxlc1xuICAgICAgLmZpbHRlcigoeyBmYWN0b3J5IH0pID0+IGZhY3RvcnkpXG4gICAgICAubWFwKCh7IG5hbWUsIGZhY3RvcnkgfSkgPT4gZmFjdG9yeVtuYW1lXSk7XG5cbiAgICB0aGlzLmxvYWRNb2R1bGVzRHluYW1pY2FsbHkocmVtb3RlTmdNb2R1bGVzKTtcbiAgICB0aGlzLnJlZnJlc2hIb29rcygpO1xuICAgIHRoaXMubWFya1BsdWdpbnNBc0xvYWRlZCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIExvYWRzIG1vZHVsZXMgYW5kIGhhbmRsZXMgaG9va2luZyBjb3JyZWN0bHkuXG4gICAqIEBwYXJhbSByZW1vdGVOZ01vZHVsZXMgVGhlIG1vZHVsZXMgdG8gbG9hZC5cbiAgICovXG4gIGxvYWRNb2R1bGVzRHluYW1pY2FsbHkocmVtb3RlTmdNb2R1bGVzOiBOZ01vZHVsZVJlZjx1bmtub3duPltdIHwgVHlwZTx1bmtub3duPltdKSB7XG4gICAgZm9yIChjb25zdCByZW1vdGVOZ01vZHVsZSBvZiByZW1vdGVOZ01vZHVsZXMpIHtcbiAgICAgIHRoaXMubG9hZE1vZHVsZShyZW1vdGVOZ01vZHVsZSk7XG4gICAgfVxuICB9XG5cbiAgbG9hZE1vZHVsZShyZW1vdGVOZ01vZHVsZTogTmdNb2R1bGVSZWY8dW5rbm93bj4gfCBUeXBlPHVua25vd24+KSB7XG4gICAgbGV0IG1vZHVsZVJlZjogTmdNb2R1bGVSZWY8dW5rbm93bj47XG4gICAgaWYgKHJlbW90ZU5nTW9kdWxlIGluc3RhbmNlb2YgTmdNb2R1bGVSZWYpIHtcbiAgICAgIC8vIEFPVFxuICAgICAgbW9kdWxlUmVmID0gcmVtb3RlTmdNb2R1bGU7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEpJVFxuICAgICAgbW9kdWxlUmVmID0gY3JlYXRlTmdNb2R1bGVSZWYocmVtb3RlTmdNb2R1bGUsIHRoaXMuaW5qZWN0b3IpO1xuICAgIH1cbiAgICB0aGlzLnJlc29sdmVSb3V0ZXJGb3JDaGlsZFJvdXRlcyhtb2R1bGVSZWYsIHJlbW90ZU5nTW9kdWxlKTtcbiAgICB0aGlzLmFkZEluamVjdG9yVG9BbGxIb29rcyhtb2R1bGVSZWYpO1xuICAgIHJldHVybiBtb2R1bGVSZWY7XG4gIH1cblxuICAvKipcbiAgICogV2lsbCByZWZyZXNoIGFsbCBjdXJyZW50IHJlZ2lzdGVyZWQgaG9va3NcbiAgICogQHBhcmFtIGFsbEhvb2tzIElmIHNldCB0byB0cnVlLCBhbGwgaG9va3Mgd2lsbCBiZSByZWZyZXNoZWQuIERlZmF1bHRzIHRvIGZhbHNlLCB3aGljaCB3aWxsIG9ubHlcbiAgICogcmVmcmVzaCBzdWNoIGhvb2tzLCB0aGF0IHBvc3NpYmxlIGhhcyBhIHJlbW90ZSBwbHVnaW4gYXNzaWduZWQuXG4gICAqL1xuICByZWZyZXNoSG9va3MoYWxsSG9va3MgPSBmYWxzZSkge1xuICAgIHRoaXMuYWxsSG9va3MuZm9yRWFjaChob29rID0+IHtcbiAgICAgIGlmIChhbGxIb29rcyB8fCBob29rLnNlcnZpY2UuaW5qZWN0b3JzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgaG9vay5zZXJ2aWNlLnJlZnJlc2goKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIG1hcmtQbHVnaW5zQXNMb2FkZWQoKSB7XG4gICAgdGhpcy5keW5hbWljQ29tcG9uZW50Lm1hcmtQbHVnaW5zQXNMb2FkZWQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkcyBhIGxpc3Qgb2YgcmVtb3RlcyBzbyB0aGF0IGEgcGFydGljdWxhciBhcHBsaWNhdGlvbiBjYW4gdXNlIHRoZW0uXG4gICAqIFRoZSByZXF1ZXN0IGlzIG1hZGUgdG8gdGhlIGZvbGxvd2luZyBhZGRyZXNzOiAvYXBwcy88Y29udGV4dFBhdGg+L3JlbW90ZUVudHJ5LmpzXG4gICAqIEBwYXJhbSByZW1vdGVzIExpc3Qgb2YgcmVtb3RlcyB0byBiZSBsb2FkZWQuXG4gICAqIEByZXR1cm5zIFJldHVybnMgdGhlIGxpc3Qgb2YgbG9hZGVkIG1vZHVsZXMgZnJvbSByZW1vdGVzLlxuICAgKi9cbiAgYXN5bmMgbG9hZFJlbW90ZXMocmVtb3RlczogQXBwbGljYXRpb25SZW1vdGVQbHVnaW5zKSB7XG4gICAgaWYgKCFyZW1vdGVzKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSgpO1xuICAgIGNvbnN0IHJlbW90ZU1vZHVsZXMgPSBbXTtcbiAgICBmb3IgKGNvbnN0IHBsdWdpbklkIGluIHJlbW90ZXMpIHtcbiAgICAgIGlmIChyZW1vdGVzLmhhc093blByb3BlcnR5KHBsdWdpbklkKSkge1xuICAgICAgICBjb25zdCBtb2R1bGVOYW1lcyA9IHJlbW90ZXNbcGx1Z2luSWRdO1xuICAgICAgICBjb25zdCB1cmwgPSBgL2FwcHMvJHtwbHVnaW5JZH0vcmVtb3RlRW50cnkuanM/bm9jYWNoZT0ke2RhdGUuZ2V0VGltZSgpfWA7XG4gICAgICAgIGxldCBhdExlYXN0T25lTW9kdWxlTG9hZGVkU3VjY2Vzc2Z1bGx5ID0gZmFsc2U7XG4gICAgICAgIGZvciAoY29uc3QgbW9kdWxlTmFtZSBvZiBtb2R1bGVOYW1lcykge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZW1vdGVNb2R1bGVzLnB1c2goYXdhaXQgdGhpcy5sb2FkUmVtb3RlTW9kdWxlKHVybCwgcGx1Z2luSWQsIG1vZHVsZU5hbWUpKTtcbiAgICAgICAgICAgIGF0TGVhc3RPbmVNb2R1bGVMb2FkZWRTdWNjZXNzZnVsbHkgPSB0cnVlO1xuICAgICAgICAgIH0gY2F0Y2ggKGV4KSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oYENvdWxkIG5vdCBsb2FkIHJlbW90ZSBtb2R1bGUgJyR7bW9kdWxlTmFtZX0nIGZyb20gdXJsOmAsIHVybCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gbm8gbmVlZCB0byBsb2FkIHRyYW5zbGF0aW9ucyBpZiB3ZSB3ZXJlIHVuYWJsZSB0byBsb2FkIGEgc2luZ2xlIG1vZHVsZS4uXG4gICAgICAgIGlmIChhdExlYXN0T25lTW9kdWxlTG9hZGVkU3VjY2Vzc2Z1bGx5KSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5sb2FkUmVtb3RlVHJhbnNsYXRpb25zKHBsdWdpbklkKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVtb3RlTW9kdWxlcztcbiAgfVxuXG4gIC8qKlxuICAgKiBUYWtlcyBhIGxpc3Qgb2YgcmVtb3RlcyBhbmQgdHVybnMgaXQgaW50byBhbiBvYmplY3QgY29udGFpbmluZyB1bmlvbiBvZiBjb3JyZXNwb25kaW5nIHJlbW90ZXMuXG4gICAqIEBwYXJhbSBtZlJlbW90ZXMgTGlzdCBvZiB0aGUgcmVtb3Rlcy5cbiAgICogQHJldHVybnMgUmV0dXJucyBvYmplY3Qgd2l0aCBtZXJnZWQgcmVtb3Rlcy5cbiAgICpcbiAgICogKipFeGFtcGxlKipcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCByZW1vdGVzQTpBcHBsaWNhdGlvblJlbW90ZVBsdWdpbnMgPSB7IGNvbnRleHRQYXRoQTogWydtb2R1bGVBJywgJ21vZHVsZUInXSB9O1xuICAgKiBjb25zdCByZW1vdGVzQjpBcHBsaWNhdGlvblJlbW90ZVBsdWdpbnMgPSB7IGNvbnRleHRQYXRoQTogWydtb2R1bGVBJ10sIGNvbnRleHRQYXRoQjogWydtb2R1bGVaJ10gfTtcbiAgICogY29uc3QgbWVyZ2VkUmVtb3RlczpBcHBsaWNhdGlvblJlbW90ZVBsdWdpbnMgPSBtZXJnZU1GUmVtb3RlcyhbcmVtb3Rlc0EsIHJlbW90ZXNCXSk7XG4gICAqIC8vIFJlc3VsdFxuICAgKiB7XG4gICAqICBjb250ZXh0UGF0aEE6IFsnbW9kdWxlQScsICdtb2R1bGVCJ10sXG4gICAqICBjb250ZXh0UGF0aEI6IFsnbW9kdWxlWiddXG4gICAqIH1cbiAgICpcbiAgICogYGBgXG4gICAqL1xuICBtZXJnZU1GUmVtb3RlcyhtZlJlbW90ZXM6IEFwcGxpY2F0aW9uUmVtb3RlUGx1Z2luc1tdKTogQXBwbGljYXRpb25SZW1vdGVQbHVnaW5zIHtcbiAgICByZXR1cm4gcmVkdWNlKFxuICAgICAgbWZSZW1vdGVzLFxuICAgICAgKGFsbFJlbW90ZXM6IEFwcGxpY2F0aW9uUmVtb3RlUGx1Z2lucywgbWZSZW1vdGU6IEFwcGxpY2F0aW9uUmVtb3RlUGx1Z2lucykgPT4ge1xuICAgICAgICBmb3JFYWNoKG1mUmVtb3RlLCAocmVtb3RlTW9kdWxlczogc3RyaW5nW10sIHJlbW90ZUNvbnRleHRQYXRoOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICBjb25zdCBjdXJyZW50UmVtb3RlcyA9IGdldChhbGxSZW1vdGVzLCByZW1vdGVDb250ZXh0UGF0aCwgW10pO1xuICAgICAgICAgIGFsbFJlbW90ZXNbcmVtb3RlQ29udGV4dFBhdGhdID0gdW5pb24oY3VycmVudFJlbW90ZXMsIHJlbW90ZU1vZHVsZXMpO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gYWxsUmVtb3RlcztcbiAgICAgIH0sXG4gICAgICB7fVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQ2xlYXJzIFVSTCByZW1vdGVzIGNhY2hlLlxuICAgKi9cbiAgY2xlYXJVUkxSZW1vdGVzQ2FjaGUoKSB7XG4gICAgdGhpcy51cmxSZW1vdGVzQ2FjaGUgPSBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlcyB0aGUgcmVtb3RlcyBsaXN0IGZyb20gdGhlIFVSTC5cbiAgICogQHJldHVybnMgUmV0dXJucyB0aGUgbGlzdCBvZiByZW1vdGVzLlxuICAgKi9cbiAgbG9hZFVybFJlbW90ZXMoKSB7XG4gICAgaWYgKCF0aGlzLnVybFJlbW90ZXNDYWNoZSkge1xuICAgICAgY29uc3QgcGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh3aW5kb3cubG9jYXRpb24uc2VhcmNoKTtcbiAgICAgIGNvbnN0IHJlbW90ZXMgPSBwYXJhbXMuZ2V0KCdyZW1vdGVzJyk7XG4gICAgICBpZiAocmVtb3Rlcykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHRoaXMudXJsUmVtb3Rlc0NhY2hlID0gSlNPTi5wYXJzZShkZWNvZGVVUklDb21wb25lbnQocmVtb3RlcykpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGNvbnNvbGUud2FybihgRmFpbGVkIHRvIHBhcnNlIHJlbW90ZXM6ICR7ZXJyb3J9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXMudXJsUmVtb3Rlc0NhY2hlO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBsb2FkUmVtb3RlVHJhbnNsYXRpb25zKHBsdWdpbklkOiBzdHJpbmcpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgeyBsYW5nIH0gPSB0aGlzLmFwcFN0YXRlLnN0YXRlO1xuICAgICAgY29uc3QgcmVzcCA9IGF3YWl0IHRoaXMuZmV0Y2hDbGllbnQuZmV0Y2goYC9hcHBzLyR7cGx1Z2luSWR9LyR7bGFuZ30uanNvbmApO1xuICAgICAgaWYgKHJlc3Auc3RhdHVzIDwgNDAwKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlc3AuanNvbigpO1xuICAgICAgICB0aGlzLnRyYW5zbGF0ZVNlcnZpY2Uuc2V0VHJhbnNsYXRpb24obGFuZywgcmVzdWx0W2xhbmddLCB0cnVlKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChleCkge1xuICAgICAgY29uc29sZS53YXJuKGBGYWlsZWQgdG8gbG9hZCB0cmFuc2xhdGlvbnMgZm9yICR7cGx1Z2luSWR9YCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhZGRJbmplY3RvclRvQWxsSG9va3MobW9kdWxlUmVmOiBOZ01vZHVsZVJlZjx1bmtub3duPikge1xuICAgIHRoaXMuYWxsSG9va3MuZm9yRWFjaChob29rID0+IHtcbiAgICAgIGhvb2suc2VydmljZS5pbmplY3RvcnMucHVzaChtb2R1bGVSZWYuaW5qZWN0b3IpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSByZXNvbHZlUm91dGVyRm9yQ2hpbGRSb3V0ZXMobW9kdWxlUmVmOiBOZ01vZHVsZVJlZjx1bmtub3duPiwgcmVtb3RlTmdNb2R1bGU6IGFueSkge1xuICAgIC8vIE5PVEU6IHN0b2xlbiBmcm9tIGxhenkgbG9hZGVkIHJvdXRlcyBmcm9tIEFuZ3VsYXIgaXRzZWxmLlxuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIvYmxvYi9kYTU4ODAxZjk1YzY2YzIwMWUzMzIxODlhZjI1NzAyYmRkNzIyZjNmL3BhY2thZ2VzL3JvdXRlci9zcmMvcm91dGVyX2NvbmZpZ19sb2FkZXIudHMjTDEwMy1MMTA4XG4gICAgY29uc3QgcmF3Um91dGVzID0gZmxhdHRlbihcbiAgICAgIG1vZHVsZVJlZi5pbmplY3Rvci5nZXQoUk9VVEVTLCBbXSwgSW5qZWN0RmxhZ3MuU2VsZiB8IEluamVjdEZsYWdzLk9wdGlvbmFsKVxuICAgICk7XG5cbiAgICBpZiAocmF3Um91dGVzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IHJvdXRlV2l0aEluamVjdG9yID0gcmF3Um91dGVzLm1hcChyb3V0ZSA9PiB7XG4gICAgICAgIHJvdXRlLnByb3ZpZGVycyA9IFtpbXBvcnRQcm92aWRlcnNGcm9tKHJlbW90ZU5nTW9kdWxlKV07XG4gICAgICAgIHJldHVybiByb3V0ZTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5jOHlSb3V0ZXIuYWRkUm91dGUocm91dGVXaXRoSW5qZWN0b3IpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgbG9hZFJlbW90ZU1vZHVsZShcbiAgICByZW1vdGVFbnRyeVVybDogc3RyaW5nLFxuICAgIHJlbW90ZUNvbnRleHRQYXRoOiBzdHJpbmcsXG4gICAgZXhwb3NlZE1vZHVsZTogc3RyaW5nXG4gICk6IFByb21pc2U8eyBuYW1lOiBzdHJpbmc7IGZhY3Rvcnk6IEZhY3RvcnkgfT4ge1xuICAgIGlmICghdGhpcy5yZW1vdGVTY3JpcHRTZXQuaGFzKHJlbW90ZUVudHJ5VXJsKSkge1xuICAgICAgdGhpcy5yZW1vdGVTY3JpcHRTZXQuYWRkKHJlbW90ZUVudHJ5VXJsKTtcbiAgICAgIGF3YWl0IHRoaXMubG9hZFJlbW90ZUVudHJ5KHJlbW90ZUVudHJ5VXJsKTtcbiAgICB9XG4gICAgbGV0IGNvbnRleHRQYXRoOiBzdHJpbmcgPSByZW1vdGVDb250ZXh0UGF0aDtcbiAgICBpZiAoY29udGV4dFBhdGguaW5jbHVkZXMoJ0AnKSkge1xuICAgICAgY29udGV4dFBhdGggPSByZW1vdGVDb250ZXh0UGF0aC5zcGxpdCgnQCcpWzBdO1xuICAgIH1cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5sb29rdXBFeHBvc2VkTW9kdWxlKGNhbWVsQ2FzZShjb250ZXh0UGF0aCksIGV4cG9zZWRNb2R1bGUpO1xuICB9XG5cbiAgcHJpdmF0ZSBsb2FkUmVtb3RlRW50cnkocmVtb3RlRW50cnlVcmw6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCBzY3JpcHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTtcbiAgICAgIHNjcmlwdC5zcmMgPSByZW1vdGVFbnRyeVVybDtcblxuICAgICAgc2NyaXB0Lm9uZXJyb3IgPSByZWplY3Q7XG5cbiAgICAgIHNjcmlwdC5vbmxvYWQgPSAoKSA9PiB7XG4gICAgICAgIHJlc29sdmUoKTsgLy8gd2luZG93IGlzIHRoZSBnbG9iYWwgbmFtZXNwYWNlXG4gICAgICB9O1xuXG4gICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZChzY3JpcHQpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBsb29rdXBFeHBvc2VkTW9kdWxlKFxuICAgIHJlbW90ZU5hbWU6IHN0cmluZyxcbiAgICBleHBvc2VkTW9kdWxlOiBzdHJpbmdcbiAgKTogUHJvbWlzZTx7IG5hbWU6IHN0cmluZzsgZmFjdG9yeTogRmFjdG9yeSB9PiB7XG4gICAgLy8gSW5pdGlhbGl6ZXMgdGhlIHNoYXJlIHNjb3BlLiBUaGlzIGZpbGxzIGl0IHdpdGgga25vd24gcHJvdmlkZWQgbW9kdWxlcyBmcm9tIHRoaXMgYnVpbGQgYW5kIGFsbCByZW1vdGVzXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IF9fd2VicGFja19pbml0X3NoYXJpbmdfXygnZGVmYXVsdCcpO1xuICAgIH0gY2F0Y2ggKGV4KSB7XG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICBgTW9kdWxlICR7ZXhwb3NlZE1vZHVsZX0gY291bGQgbm90IGJlIGxvYWRlZC4gTW9kdWxlIEZlZGVyYXRpb24gaXMgbm90IGVuYWJsZWQgaW4gdGhpcyBhcHBsaWNhdGlvbi5gLFxuICAgICAgICBleFxuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3QgY29udGFpbmVyID0gd2luZG93W3JlbW90ZU5hbWVdIGFzIENvbnRhaW5lcjtcblxuICAgIC8vIEluaXRpYWxpemUgdGhlIGNvbnRhaW5lciwgaXQgbWF5IHByb3ZpZGUgc2hhcmVkIG1vZHVsZXNcbiAgICBsZXQgZmFjdG9yeTogRmFjdG9yeTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgY29udGFpbmVyLmluaXQoX193ZWJwYWNrX3NoYXJlX3Njb3Blc19fLmRlZmF1bHQpO1xuICAgICAgZmFjdG9yeSA9IChhd2FpdCBjb250YWluZXIuZ2V0KGV4cG9zZWRNb2R1bGUpKSgpO1xuICAgIH0gY2F0Y2ggKGV4KSB7XG4gICAgICBjb25zb2xlLmVycm9yKGBNb2R1bGUgJHtleHBvc2VkTW9kdWxlfSBjb3VsZCBub3QgYmUgbG9hZGVkLmAsIGV4KTtcbiAgICB9XG4gICAgcmV0dXJuIHsgbmFtZTogZXhwb3NlZE1vZHVsZSwgZmFjdG9yeSB9O1xuICB9XG59XG4iXX0=
|
|
289
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2lucy1yZXNvbHZlLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9jb3JlL3BsdWdpbnMvcGx1Z2lucy1yZXNvbHZlLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUE0QixXQUFXLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDcEUsT0FBTyxFQUNMLFVBQVUsRUFFVixXQUFXLEVBQ1gsaUJBQWlCLEVBQ2pCLFdBQVcsRUFDWCxtQkFBbUIsRUFDbkIsbUJBQW1CLEVBRXBCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxlQUFlLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUNyRixPQUFPLEVBQUUsYUFBYSxFQUFFLFdBQVcsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3RFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxlQUFlLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUV0RixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDaEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSw4Q0FBOEMsQ0FBQztBQUMvRSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxnREFBZ0QsQ0FBQztBQUN6RixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUN4RixPQUFPLEVBQUUsVUFBVSxFQUFFLGFBQWEsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3JFLE9BQU8sRUFBRSxXQUFXLEVBQUUsYUFBYSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDdEUsT0FBTyxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUM5RCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDekQsT0FB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O2dCQUNuQixPQUFPLEVBQUUsQ0FBQyxDQUFDLGlDQUFpQztZQUM5QyxDQUFDLENBQUM7WUFFRixRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUMvQixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTyxLQUFLLENBQUMsbUJBQW1CLENBQy9CLFVBQWtCLEVBQ2xCLGFBQXFCO1FBRXJCLHlHQUF5RztRQUN6RyxJQUFJO1lBQ0YsTUFBTSx3QkFBd0IsQ0FBQyxTQUFTLENBQUMsQ0FBQztTQUMzQztRQUFDLE9BQU8sRUFBRSxFQUFFO1lBQ1gsT0FBTyxDQUFDLEtBQUssQ0FDWCxVQUFVLGFBQWEsNkVBQTZFLEVBQ3BHLEVBQUUsQ0FDSCxDQUFDO1NBQ0g7UUFDRCxNQUFNLFNBQVMsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFjLENBQUM7UUFFbEQsMERBQTBEO1FBQzFELElBQUksT0FBZ0IsQ0FBQztRQUNyQixJQUFJO1lBQ0YsTUFBTSxTQUFTLENBQUMsSUFBSSxDQUFDLHdCQUF3QixDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3ZELE9BQU8sR0FBRyxDQUFDLE1BQU0sU0FBUyxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsQ0FBQyxFQUFFLENBQUM7U0FDbEQ7UUFBQyxPQUFPLEVBQUUsRUFBRTtZQUNYLE9BQU8sQ0FBQyxLQUFLLENBQUMsVUFBVSxhQUFhLHVCQUF1QixFQUFFLEVBQUUsQ0FBQyxDQUFDO1NBQ25FO1FBQ0QsT0FBTyxFQUFFLElBQUksRUFBRSxhQUFhLEVBQUUsT0FBTyxFQUFFLENBQUM7SUFDMUMsQ0FBQzs7a0hBdFJVLHFCQUFxQjtzSEFBckIscUJBQXFCLGNBRnBCLE1BQU07MkZBRVAscUJBQXFCO2tCQUhqQyxVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFwcGxpY2F0aW9uUmVtb3RlUGx1Z2lucywgRmV0Y2hDbGllbnQgfSBmcm9tICdAYzh5L2NsaWVudCc7XG5pbXBvcnQge1xuICBJbmplY3RhYmxlLFxuICBJbmplY3Rpb25Ub2tlbixcbiAgTmdNb2R1bGVSZWYsXG4gIGNyZWF0ZU5nTW9kdWxlUmVmLFxuICBJbmplY3RGbGFncyxcbiAgRW52aXJvbm1lbnRJbmplY3RvcixcbiAgaW1wb3J0UHJvdmlkZXJzRnJvbSxcbiAgVHlwZVxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFjdGlvbkJhclNlcnZpY2UsIEhPT0tfQUNUSU9OX0JBUiB9IGZyb20gJy4uL2FjdGlvbi1iYXIvYWN0aW9uLWJhci5zZXJ2aWNlJztcbmltcG9ydCB7IEFjdGlvblNlcnZpY2UsIEhPT0tfQUNUSU9OIH0gZnJvbSAnLi4vYWN0aW9uL2FjdGlvbi5zZXJ2aWNlJztcbmltcG9ydCB7IEJyZWFkY3J1bWJTZXJ2aWNlLCBIT09LX0JSRUFEQ1JVTUIgfSBmcm9tICcuLi9icmVhZGNydW1iL2JyZWFkY3J1bWIuc2VydmljZSc7XG5pbXBvcnQgeyBFeHRlbnNpb25Qb2ludCB9IGZyb20gJy4uL2NvbW1vbi9leHRlbnNpb24taG9va3MnO1xuaW1wb3J0IHsgSE9PS19ET0NTIH0gZnJvbSAnLi4vZG9jcy9kb2NzLm1vZGVscyc7XG5pbXBvcnQgeyBEb2NzU2VydmljZSB9IGZyb20gJy4uL2RvY3MvZG9jcy5zZXJ2aWNlJztcbmltcG9ydCB7IEhPT0tfQ09NUE9ORU5UUyB9IGZyb20gJy4uL2R5bmFtaWMtY29tcG9uZW50L2R5bmFtaWMtY29tcG9uZW50Lm1vZGVsJztcbmltcG9ydCB7IER5bmFtaWNDb21wb25lbnRTZXJ2aWNlIH0gZnJvbSAnLi4vZHluYW1pYy1jb21wb25lbnQvZHluYW1pYy1jb21wb25lbnQuc2VydmljZSc7XG5pbXBvcnQgeyBIT09LX05BVklHQVRPUl9OT0RFUywgTmF2aWdhdG9yU2VydmljZSB9IGZyb20gJy4uL25hdmlnYXRvci9uYXZpZ2F0b3Iuc2VydmljZSc7XG5pbXBvcnQgeyBIT09LX1JPVVRFLCBSb3V0ZXJTZXJ2aWNlIH0gZnJvbSAnLi4vcm91dGVyL3JvdXRlci5zZXJ2aWNlJztcbmltcG9ydCB7IEhPT0tfU0VBUkNILCBTZWFyY2hTZXJ2aWNlIH0gZnJvbSAnLi4vc2VhcmNoL3NlYXJjaC5zZXJ2aWNlJztcbmltcG9ydCB7IEhPT0tfVEFCUywgVGFic1NlcnZpY2UgfSBmcm9tICcuLi90YWJzL3RhYnMuc2VydmljZSc7XG5pbXBvcnQgeyBXaXphcmRTZXJ2aWNlIH0gZnJvbSAnLi4vd2l6YXJkL3dpemFyZC5zZXJ2aWNlJztcbmltcG9ydCB7IEhPT0tfV0laQVJEIH0gZnJvbSAnLi4vd2l6YXJkL3dpemFyZC5tb2RlbCc7XG5pbXBvcnQgeyByZWR1Y2UsIGZvckVhY2gsIGdldCwgdW5pb24sIGNhbWVsQ2FzZSwgZmxhdHRlbiB9IGZyb20gJ2xvZGFzaC1lcyc7XG5pbXBvcnQgeyBIT09LX1NURVBQRVIsIFN0ZXBwZXJTZXJ2aWNlIH0gZnJvbSAnLi4vc3RlcHBlci9zdGVwcGVyLnNlcnZpY2UnO1xuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHsgQXBwU3RhdGVTZXJ2aWNlIH0gZnJvbSAnLi4vY29tbW9uJztcbmltcG9ydCB7IFJPVVRFUyB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5cbnR5cGUgU2NvcGUgPSB1bmtub3duO1xudHlwZSBGYWN0b3J5ID0gKCkgPT4gYW55O1xuXG5kZWNsYXJlIGNvbnN0IF9fd2VicGFja19pbml0X3NoYXJpbmdfXzogKHNoYXJlU2NvcGU6IHN0cmluZykgPT4gUHJvbWlzZTx2b2lkPjtcbmRlY2xhcmUgY29uc3QgX193ZWJwYWNrX3NoYXJlX3Njb3Blc19fOiB7IGRlZmF1bHQ6IFNjb3BlIH07XG5cbmludGVyZmFjZSBDb250YWluZXIge1xuICBpbml0KHNoYXJlU2NvcGU6IFNjb3BlKTogdm9pZDtcbiAgZ2V0KG1vZHVsZTogc3RyaW5nKTogRmFjdG9yeTtcbn1cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIFBsdWdpbnNSZXNvbHZlU2VydmljZSB7XG4gIHByaXZhdGUgdXJsUmVtb3Rlc0NhY2hlOiBBcHBsaWNhdGlvblJlbW90ZVBsdWdpbnMgPSBudWxsO1xuICBwcml2YXRlIHJlbW90ZVNjcmlwdFNldCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBwcml2YXRlIGFsbEhvb2tzOiBBcnJheTx7XG4gICAgdG9rZW46IEluamVjdGlvblRva2VuPGFueT47XG4gICAgc2VydmljZTogRXh0ZW5zaW9uUG9pbnQ8YW55PjtcbiAgfT4gPSBbXG4gICAgeyB0b2tlbjogSE9PS19BQ1RJT04sIHNlcnZpY2U6IHRoaXMuYWN0aW9uIH0sXG4gICAgeyB0b2tlbjogSE9PS19BQ1RJT05fQkFSLCBzZXJ2aWNlOiB0aGlzLmFjdGlvbkJhciB9LFxuICAgIHsgdG9rZW46IEhPT0tfTkFWSUdBVE9SX05PREVTLCBzZXJ2aWNlOiB0aGlzLm5hdmlnYXRvciB9LFxuICAgIHsgdG9rZW46IEhPT0tfQlJFQURDUlVNQiwgc2VydmljZTogdGhpcy5icmVhZGNydW1iIH0sXG4gICAgeyB0b2tlbjogSE9PS19DT01QT05FTlRTLCBzZXJ2aWNlOiB0aGlzLmR5bmFtaWNDb21wb25lbnQgfSxcbiAgICB7IHRva2VuOiBIT09LX1JPVVRFLCBzZXJ2aWNlOiB0aGlzLmM4eVJvdXRlciB9LFxuICAgIHsgdG9rZW46IEhPT0tfU0VBUkNILCBzZXJ2aWNlOiB0aGlzLnNlYXJjaCB9LFxuICAgIHsgdG9rZW46IEhPT0tfVEFCUywgc2VydmljZTogdGhpcy50YWJzIH0sXG4gICAgeyB0b2tlbjogSE9PS19ET0NTLCBzZXJ2aWNlOiB0aGlzLmRvY3MgfSxcbiAgICB7IHRva2VuOiBIT09LX1dJWkFSRCwgc2VydmljZTogdGhpcy53aXphcmQgfSxcbiAgICB7IHRva2VuOiBIT09LX1NURVBQRVIsIHNlcnZpY2U6IHRoaXMuc3RlcHBlciB9XG4gIF07XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSB0YWJzOiBUYWJzU2VydmljZSxcbiAgICBwcml2YXRlIG5hdmlnYXRvcjogTmF2aWdhdG9yU2VydmljZSxcbiAgICBwcml2YXRlIGFjdGlvbjogQWN0aW9uU2VydmljZSxcbiAgICBwcml2YXRlIGFjdGlvbkJhcjogQWN0aW9uQmFyU2VydmljZSxcbiAgICBwcml2YXRlIGJyZWFkY3J1bWI6IEJyZWFkY3J1bWJTZXJ2aWNlLFxuICAgIHByaXZhdGUgZHluYW1pY0NvbXBvbmVudDogRHluYW1pY0NvbXBvbmVudFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBzZWFyY2g6IFNlYXJjaFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBjOHlSb3V0ZXI6IFJvdXRlclNlcnZpY2UsXG4gICAgcHJpdmF0ZSBkb2NzOiBEb2NzU2VydmljZSxcbiAgICBwcml2YXRlIHdpemFyZDogV2l6YXJkU2VydmljZSxcbiAgICBwcml2YXRlIHN0ZXBwZXI6IFN0ZXBwZXJTZXJ2aWNlLFxuICAgIHByaXZhdGUgdHJhbnNsYXRlU2VydmljZTogVHJhbnNsYXRlU2VydmljZSxcbiAgICBwcml2YXRlIGZldGNoQ2xpZW50OiBGZXRjaENsaWVudCxcbiAgICBwcml2YXRlIGFwcFN0YXRlOiBBcHBTdGF0ZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBpbmplY3RvcjogRW52aXJvbm1lbnRJbmplY3RvclxuICApIHt9XG5cbiAgLyoqXG4gICAqIExvYWRzIHBsdWdpbnMgYnkgcmVzb2x2aW5nIHRoZSByZW1vdGUgTmdNb2R1bGVzIGFuZCBpbmplY3RpbmcgaXQuIEFsc28gYXR0YWNoaW5nXG4gICAqIHRoZSBob29rcyBvbnRvIHRoZSByb290IGluamVjdG9yLlxuICAgKiBAcGFyYW0gcmVtb3RlTW9kdWxlcyBUaGUgcmVtb3RlIHBsdWdpbnMgdG8gbG9hZCBhcyBmYWN0b3J5IG5hbWUgbWFwcGluZyBhcnJheS5cbiAgICovXG4gIHJlc29sdmVSZW1vdGVQbHVnaW5zKHJlbW90ZU1vZHVsZXM6IEFycmF5PHsgZmFjdG9yeTsgbmFtZSB9Pikge1xuICAgIHRoaXMubG9hZE1vZHVsZXNEeW5hbWljYWxseShyZW1vdGVNb2R1bGVzKTtcbiAgICB0aGlzLnJlZnJlc2hIb29rcygpO1xuICAgIHRoaXMubWFya1BsdWdpbnNBc0xvYWRlZCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIExvYWRzIG1vZHVsZXMgYW5kIGhhbmRsZXMgaG9va2luZyBjb3JyZWN0bHkuXG4gICAqIEBwYXJhbSByZW1vdGVOZ01vZHVsZXMgVGhlIG1vZHVsZXMgdG8gbG9hZC5cbiAgICovXG4gIGxvYWRNb2R1bGVzRHluYW1pY2FsbHkocmVtb3RlTW9kdWxlczogQXJyYXk8eyBmYWN0b3J5OyBuYW1lIH0+KSB7XG4gICAgZm9yIChjb25zdCB7IGZhY3RvcnksIG5hbWUgfSBvZiByZW1vdGVNb2R1bGVzKSB7XG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLmxvYWRNb2R1bGUoZmFjdG9yeVtuYW1lXSk7XG4gICAgICB9IGNhdGNoIChleCkge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBGYWlsZWQgdG8gbG9hZCAke25hbWV9YCwgZXgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGxvYWRNb2R1bGUocmVtb3RlTmdNb2R1bGU6IE5nTW9kdWxlUmVmPHVua25vd24+IHwgVHlwZTx1bmtub3duPikge1xuICAgIGxldCBtb2R1bGVSZWY6IE5nTW9kdWxlUmVmPHVua25vd24+O1xuICAgIGlmIChyZW1vdGVOZ01vZHVsZSBpbnN0YW5jZW9mIE5nTW9kdWxlUmVmKSB7XG4gICAgICAvLyBBT1RcbiAgICAgIG1vZHVsZVJlZiA9IHJlbW90ZU5nTW9kdWxlO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBKSVRcbiAgICAgIG1vZHVsZVJlZiA9IGNyZWF0ZU5nTW9kdWxlUmVmKHJlbW90ZU5nTW9kdWxlLCB0aGlzLmluamVjdG9yKTtcbiAgICB9XG4gICAgdGhpcy5yZXNvbHZlUm91dGVyRm9yQ2hpbGRSb3V0ZXMobW9kdWxlUmVmLCByZW1vdGVOZ01vZHVsZSk7XG4gICAgdGhpcy5hZGRJbmplY3RvclRvQWxsSG9va3MobW9kdWxlUmVmKTtcbiAgICByZXR1cm4gbW9kdWxlUmVmO1xuICB9XG5cbiAgLyoqXG4gICAqIFdpbGwgcmVmcmVzaCBhbGwgY3VycmVudCByZWdpc3RlcmVkIGhvb2tzXG4gICAqIEBwYXJhbSBhbGxIb29rcyBJZiBzZXQgdG8gdHJ1ZSwgYWxsIGhvb2tzIHdpbGwgYmUgcmVmcmVzaGVkLiBEZWZhdWx0cyB0byBmYWxzZSwgd2hpY2ggd2lsbCBvbmx5XG4gICAqIHJlZnJlc2ggc3VjaCBob29rcywgdGhhdCBwb3NzaWJsZSBoYXMgYSByZW1vdGUgcGx1Z2luIGFzc2lnbmVkLlxuICAgKi9cbiAgcmVmcmVzaEhvb2tzKGFsbEhvb2tzID0gZmFsc2UpIHtcbiAgICB0aGlzLmFsbEhvb2tzLmZvckVhY2goaG9vayA9PiB7XG4gICAgICBpZiAoYWxsSG9va3MgfHwgaG9vay5zZXJ2aWNlLmluamVjdG9ycy5sZW5ndGggPiAxKSB7XG4gICAgICAgIGhvb2suc2VydmljZS5yZWZyZXNoKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBtYXJrUGx1Z2luc0FzTG9hZGVkKCkge1xuICAgIHRoaXMuZHluYW1pY0NvbXBvbmVudC5tYXJrUGx1Z2luc0FzTG9hZGVkKCk7XG4gIH1cblxuICAvKipcbiAgICogTG9hZHMgYSBsaXN0IG9mIHJlbW90ZXMgc28gdGhhdCBhIHBhcnRpY3VsYXIgYXBwbGljYXRpb24gY2FuIHVzZSB0aGVtLlxuICAgKiBUaGUgcmVxdWVzdCBpcyBtYWRlIHRvIHRoZSBmb2xsb3dpbmcgYWRkcmVzczogL2FwcHMvPGNvbnRleHRQYXRoPi9yZW1vdGVFbnRyeS5qc1xuICAgKiBAcGFyYW0gcmVtb3RlcyBMaXN0IG9mIHJlbW90ZXMgdG8gYmUgbG9hZGVkLlxuICAgKiBAcmV0dXJucyBSZXR1cm5zIHRoZSBsaXN0IG9mIGxvYWRlZCBtb2R1bGVzIGZyb20gcmVtb3Rlcy5cbiAgICovXG4gIGFzeW5jIGxvYWRSZW1vdGVzKHJlbW90ZXM6IEFwcGxpY2F0aW9uUmVtb3RlUGx1Z2lucykge1xuICAgIGlmICghcmVtb3Rlcykge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICBjb25zdCBkYXRlID0gbmV3IERhdGUoKTtcbiAgICBjb25zdCByZW1vdGVNb2R1bGVzID0gW107XG4gICAgZm9yIChjb25zdCBwbHVnaW5JZCBpbiByZW1vdGVzKSB7XG4gICAgICBpZiAocmVtb3Rlcy5oYXNPd25Qcm9wZXJ0eShwbHVnaW5JZCkpIHtcbiAgICAgICAgY29uc3QgbW9kdWxlTmFtZXMgPSByZW1vdGVzW3BsdWdpbklkXTtcbiAgICAgICAgY29uc3QgdXJsID0gYC9hcHBzLyR7cGx1Z2luSWR9L3JlbW90ZUVudHJ5LmpzP25vY2FjaGU9JHtkYXRlLmdldFRpbWUoKX1gO1xuICAgICAgICBsZXQgYXRMZWFzdE9uZU1vZHVsZUxvYWRlZFN1Y2Nlc3NmdWxseSA9IGZhbHNlO1xuICAgICAgICBmb3IgKGNvbnN0IG1vZHVsZU5hbWUgb2YgbW9kdWxlTmFtZXMpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmVtb3RlTW9kdWxlcy5wdXNoKGF3YWl0IHRoaXMubG9hZFJlbW90ZU1vZHVsZSh1cmwsIHBsdWdpbklkLCBtb2R1bGVOYW1lKSk7XG4gICAgICAgICAgICBhdExlYXN0T25lTW9kdWxlTG9hZGVkU3VjY2Vzc2Z1bGx5ID0gdHJ1ZTtcbiAgICAgICAgICB9IGNhdGNoIChleCkge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKGBDb3VsZCBub3QgbG9hZCByZW1vdGUgbW9kdWxlICcke21vZHVsZU5hbWV9JyBmcm9tIHVybDpgLCB1cmwpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIG5vIG5lZWQgdG8gbG9hZCB0cmFuc2xhdGlvbnMgaWYgd2Ugd2VyZSB1bmFibGUgdG8gbG9hZCBhIHNpbmdsZSBtb2R1bGUuLlxuICAgICAgICBpZiAoYXRMZWFzdE9uZU1vZHVsZUxvYWRlZFN1Y2Nlc3NmdWxseSkge1xuICAgICAgICAgIGF3YWl0IHRoaXMubG9hZFJlbW90ZVRyYW5zbGF0aW9ucyhwbHVnaW5JZCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlbW90ZU1vZHVsZXM7XG4gIH1cblxuICAvKipcbiAgICogVGFrZXMgYSBsaXN0IG9mIHJlbW90ZXMgYW5kIHR1cm5zIGl0IGludG8gYW4gb2JqZWN0IGNvbnRhaW5pbmcgdW5pb24gb2YgY29ycmVzcG9uZGluZyByZW1vdGVzLlxuICAgKiBAcGFyYW0gbWZSZW1vdGVzIExpc3Qgb2YgdGhlIHJlbW90ZXMuXG4gICAqIEByZXR1cm5zIFJldHVybnMgb2JqZWN0IHdpdGggbWVyZ2VkIHJlbW90ZXMuXG4gICAqXG4gICAqICoqRXhhbXBsZSoqXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgcmVtb3Rlc0E6QXBwbGljYXRpb25SZW1vdGVQbHVnaW5zID0geyBjb250ZXh0UGF0aEE6IFsnbW9kdWxlQScsICdtb2R1bGVCJ10gfTtcbiAgICogY29uc3QgcmVtb3Rlc0I6QXBwbGljYXRpb25SZW1vdGVQbHVnaW5zID0geyBjb250ZXh0UGF0aEE6IFsnbW9kdWxlQSddLCBjb250ZXh0UGF0aEI6IFsnbW9kdWxlWiddIH07XG4gICAqIGNvbnN0IG1lcmdlZFJlbW90ZXM6QXBwbGljYXRpb25SZW1vdGVQbHVnaW5zID0gbWVyZ2VNRlJlbW90ZXMoW3JlbW90ZXNBLCByZW1vdGVzQl0pO1xuICAgKiAvLyBSZXN1bHRcbiAgICoge1xuICAgKiAgY29udGV4dFBhdGhBOiBbJ21vZHVsZUEnLCAnbW9kdWxlQiddLFxuICAgKiAgY29udGV4dFBhdGhCOiBbJ21vZHVsZVonXVxuICAgKiB9XG4gICAqXG4gICAqIGBgYFxuICAgKi9cbiAgbWVyZ2VNRlJlbW90ZXMobWZSZW1vdGVzOiBBcHBsaWNhdGlvblJlbW90ZVBsdWdpbnNbXSk6IEFwcGxpY2F0aW9uUmVtb3RlUGx1Z2lucyB7XG4gICAgcmV0dXJuIHJlZHVjZShcbiAgICAgIG1mUmVtb3RlcyxcbiAgICAgIChhbGxSZW1vdGVzOiBBcHBsaWNhdGlvblJlbW90ZVBsdWdpbnMsIG1mUmVtb3RlOiBBcHBsaWNhdGlvblJlbW90ZVBsdWdpbnMpID0+IHtcbiAgICAgICAgZm9yRWFjaChtZlJlbW90ZSwgKHJlbW90ZU1vZHVsZXM6IHN0cmluZ1tdLCByZW1vdGVDb250ZXh0UGF0aDogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgY29uc3QgY3VycmVudFJlbW90ZXMgPSBnZXQoYWxsUmVtb3RlcywgcmVtb3RlQ29udGV4dFBhdGgsIFtdKTtcbiAgICAgICAgICBhbGxSZW1vdGVzW3JlbW90ZUNvbnRleHRQYXRoXSA9IHVuaW9uKGN1cnJlbnRSZW1vdGVzLCByZW1vdGVNb2R1bGVzKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIGFsbFJlbW90ZXM7XG4gICAgICB9LFxuICAgICAge31cbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIENsZWFycyBVUkwgcmVtb3RlcyBjYWNoZS5cbiAgICovXG4gIGNsZWFyVVJMUmVtb3Rlc0NhY2hlKCkge1xuICAgIHRoaXMudXJsUmVtb3Rlc0NhY2hlID0gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZXMgdGhlIHJlbW90ZXMgbGlzdCBmcm9tIHRoZSBVUkwuXG4gICAqIEByZXR1cm5zIFJldHVybnMgdGhlIGxpc3Qgb2YgcmVtb3Rlcy5cbiAgICovXG4gIGxvYWRVcmxSZW1vdGVzKCkge1xuICAgIGlmICghdGhpcy51cmxSZW1vdGVzQ2FjaGUpIHtcbiAgICAgIGNvbnN0IHBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMod2luZG93LmxvY2F0aW9uLnNlYXJjaCk7XG4gICAgICBjb25zdCByZW1vdGVzID0gcGFyYW1zLmdldCgncmVtb3RlcycpO1xuICAgICAgaWYgKHJlbW90ZXMpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB0aGlzLnVybFJlbW90ZXNDYWNoZSA9IEpTT04ucGFyc2UoZGVjb2RlVVJJQ29tcG9uZW50KHJlbW90ZXMpKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oYEZhaWxlZCB0byBwYXJzZSByZW1vdGVzOiAke2Vycm9yfWApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnVybFJlbW90ZXNDYWNoZTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgbG9hZFJlbW90ZVRyYW5zbGF0aW9ucyhwbHVnaW5JZDogc3RyaW5nKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHsgbGFuZyB9ID0gdGhpcy5hcHBTdGF0ZS5zdGF0ZTtcbiAgICAgIGNvbnN0IHJlc3AgPSBhd2FpdCB0aGlzLmZldGNoQ2xpZW50LmZldGNoKGAvYXBwcy8ke3BsdWdpbklkfS8ke2xhbmd9Lmpzb25gKTtcbiAgICAgIGlmIChyZXNwLnN0YXR1cyA8IDQwMCkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZXNwLmpzb24oKTtcbiAgICAgICAgdGhpcy50cmFuc2xhdGVTZXJ2aWNlLnNldFRyYW5zbGF0aW9uKGxhbmcsIHJlc3VsdFtsYW5nXSwgdHJ1ZSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXgpIHtcbiAgICAgIGNvbnNvbGUud2FybihgRmFpbGVkIHRvIGxvYWQgdHJhbnNsYXRpb25zIGZvciAke3BsdWdpbklkfWApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYWRkSW5qZWN0b3JUb0FsbEhvb2tzKG1vZHVsZVJlZjogTmdNb2R1bGVSZWY8dW5rbm93bj4pIHtcbiAgICB0aGlzLmFsbEhvb2tzLmZvckVhY2goaG9vayA9PiB7XG4gICAgICBob29rLnNlcnZpY2UuaW5qZWN0b3JzLnB1c2gobW9kdWxlUmVmLmluamVjdG9yKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgcmVzb2x2ZVJvdXRlckZvckNoaWxkUm91dGVzKG1vZHVsZVJlZjogTmdNb2R1bGVSZWY8dW5rbm93bj4sIHJlbW90ZU5nTW9kdWxlOiBhbnkpIHtcbiAgICAvLyBOT1RFOiBzdG9sZW4gZnJvbSBsYXp5IGxvYWRlZCByb3V0ZXMgZnJvbSBBbmd1bGFyIGl0c2VsZi5cbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyL2Jsb2IvZGE1ODgwMWY5NWM2NmMyMDFlMzMyMTg5YWYyNTcwMmJkZDcyMmYzZi9wYWNrYWdlcy9yb3V0ZXIvc3JjL3JvdXRlcl9jb25maWdfbG9hZGVyLnRzI0wxMDMtTDEwOFxuICAgIGNvbnN0IHJhd1JvdXRlcyA9IGZsYXR0ZW4oXG4gICAgICBtb2R1bGVSZWYuaW5qZWN0b3IuZ2V0KFJPVVRFUywgW10sIEluamVjdEZsYWdzLlNlbGYgfCBJbmplY3RGbGFncy5PcHRpb25hbClcbiAgICApO1xuXG4gICAgaWYgKHJhd1JvdXRlcy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCByb3V0ZVdpdGhJbmplY3RvciA9IHJhd1JvdXRlcy5tYXAocm91dGUgPT4ge1xuICAgICAgICByb3V0ZS5wcm92aWRlcnMgPSBbaW1wb3J0UHJvdmlkZXJzRnJvbShyZW1vdGVOZ01vZHVsZSldO1xuICAgICAgICByZXR1cm4gcm91dGU7XG4gICAgICB9KTtcbiAgICAgIHRoaXMuYzh5Um91dGVyLmFkZFJvdXRlKHJvdXRlV2l0aEluamVjdG9yKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGxvYWRSZW1vdGVNb2R1bGUoXG4gICAgcmVtb3RlRW50cnlVcmw6IHN0cmluZyxcbiAgICByZW1vdGVDb250ZXh0UGF0aDogc3RyaW5nLFxuICAgIGV4cG9zZWRNb2R1bGU6IHN0cmluZ1xuICApOiBQcm9taXNlPHsgbmFtZTogc3RyaW5nOyBmYWN0b3J5OiBGYWN0b3J5IH0+IHtcbiAgICBpZiAoIXRoaXMucmVtb3RlU2NyaXB0U2V0LmhhcyhyZW1vdGVFbnRyeVVybCkpIHtcbiAgICAgIHRoaXMucmVtb3RlU2NyaXB0U2V0LmFkZChyZW1vdGVFbnRyeVVybCk7XG4gICAgICBhd2FpdCB0aGlzLmxvYWRSZW1vdGVFbnRyeShyZW1vdGVFbnRyeVVybCk7XG4gICAgfVxuICAgIGxldCBjb250ZXh0UGF0aDogc3RyaW5nID0gcmVtb3RlQ29udGV4dFBhdGg7XG4gICAgaWYgKGNvbnRleHRQYXRoLmluY2x1ZGVzKCdAJykpIHtcbiAgICAgIGNvbnRleHRQYXRoID0gcmVtb3RlQ29udGV4dFBhdGguc3BsaXQoJ0AnKVswXTtcbiAgICB9XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMubG9va3VwRXhwb3NlZE1vZHVsZShjYW1lbENhc2UoY29udGV4dFBhdGgpLCBleHBvc2VkTW9kdWxlKTtcbiAgfVxuXG4gIHByaXZhdGUgbG9hZFJlbW90ZUVudHJ5KHJlbW90ZUVudHJ5VXJsOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgY29uc3Qgc2NyaXB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7XG4gICAgICBzY3JpcHQuc3JjID0gcmVtb3RlRW50cnlVcmw7XG5cbiAgICAgIHNjcmlwdC5vbmVycm9yID0gcmVqZWN0O1xuXG4gICAgICBzY3JpcHQub25sb2FkID0gKCkgPT4ge1xuICAgICAgICByZXNvbHZlKCk7IC8vIHdpbmRvdyBpcyB0aGUgZ2xvYmFsIG5hbWVzcGFjZVxuICAgICAgfTtcblxuICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmQoc2NyaXB0KTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgbG9va3VwRXhwb3NlZE1vZHVsZShcbiAgICByZW1vdGVOYW1lOiBzdHJpbmcsXG4gICAgZXhwb3NlZE1vZHVsZTogc3RyaW5nXG4gICk6IFByb21pc2U8eyBuYW1lOiBzdHJpbmc7IGZhY3Rvcnk6IEZhY3RvcnkgfT4ge1xuICAgIC8vIEluaXRpYWxpemVzIHRoZSBzaGFyZSBzY29wZS4gVGhpcyBmaWxscyBpdCB3aXRoIGtub3duIHByb3ZpZGVkIG1vZHVsZXMgZnJvbSB0aGlzIGJ1aWxkIGFuZCBhbGwgcmVtb3Rlc1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBfX3dlYnBhY2tfaW5pdF9zaGFyaW5nX18oJ2RlZmF1bHQnKTtcbiAgICB9IGNhdGNoIChleCkge1xuICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgYE1vZHVsZSAke2V4cG9zZWRNb2R1bGV9IGNvdWxkIG5vdCBiZSBsb2FkZWQuIE1vZHVsZSBGZWRlcmF0aW9uIGlzIG5vdCBlbmFibGVkIGluIHRoaXMgYXBwbGljYXRpb24uYCxcbiAgICAgICAgZXhcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnN0IGNvbnRhaW5lciA9IHdpbmRvd1tyZW1vdGVOYW1lXSBhcyBDb250YWluZXI7XG5cbiAgICAvLyBJbml0aWFsaXplIHRoZSBjb250YWluZXIsIGl0IG1heSBwcm92aWRlIHNoYXJlZCBtb2R1bGVzXG4gICAgbGV0IGZhY3Rvcnk6IEZhY3Rvcnk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGNvbnRhaW5lci5pbml0KF9fd2VicGFja19zaGFyZV9zY29wZXNfXy5kZWZhdWx0KTtcbiAgICAgIGZhY3RvcnkgPSAoYXdhaXQgY29udGFpbmVyLmdldChleHBvc2VkTW9kdWxlKSkoKTtcbiAgICB9IGNhdGNoIChleCkge1xuICAgICAgY29uc29sZS5lcnJvcihgTW9kdWxlICR7ZXhwb3NlZE1vZHVsZX0gY291bGQgbm90IGJlIGxvYWRlZC5gLCBleCk7XG4gICAgfVxuICAgIHJldHVybiB7IG5hbWU6IGV4cG9zZWRNb2R1bGUsIGZhY3RvcnkgfTtcbiAgfVxufVxuIl19
|
|
@@ -10236,10 +10236,7 @@ class PluginsResolveService {
|
|
|
10236
10236
|
* @param remoteModules The remote plugins to load as factory name mapping array.
|
|
10237
10237
|
*/
|
|
10238
10238
|
resolveRemotePlugins(remoteModules) {
|
|
10239
|
-
|
|
10240
|
-
.filter(({ factory }) => factory)
|
|
10241
|
-
.map(({ name, factory }) => factory[name]);
|
|
10242
|
-
this.loadModulesDynamically(remoteNgModules);
|
|
10239
|
+
this.loadModulesDynamically(remoteModules);
|
|
10243
10240
|
this.refreshHooks();
|
|
10244
10241
|
this.markPluginsAsLoaded();
|
|
10245
10242
|
}
|
|
@@ -10247,9 +10244,14 @@ class PluginsResolveService {
|
|
|
10247
10244
|
* Loads modules and handles hooking correctly.
|
|
10248
10245
|
* @param remoteNgModules The modules to load.
|
|
10249
10246
|
*/
|
|
10250
|
-
loadModulesDynamically(
|
|
10251
|
-
for (const
|
|
10252
|
-
|
|
10247
|
+
loadModulesDynamically(remoteModules) {
|
|
10248
|
+
for (const { factory, name } of remoteModules) {
|
|
10249
|
+
try {
|
|
10250
|
+
this.loadModule(factory[name]);
|
|
10251
|
+
}
|
|
10252
|
+
catch (ex) {
|
|
10253
|
+
console.error(`Failed to load ${name}`, ex);
|
|
10254
|
+
}
|
|
10253
10255
|
}
|
|
10254
10256
|
}
|
|
10255
10257
|
loadModule(remoteNgModule) {
|
|
@@ -23044,7 +23046,7 @@ var DateContextQueryParams;
|
|
|
23044
23046
|
})(DateContextQueryParams || (DateContextQueryParams = {}));
|
|
23045
23047
|
var TimeSpanInMs;
|
|
23046
23048
|
(function (TimeSpanInMs) {
|
|
23047
|
-
TimeSpanInMs[TimeSpanInMs["MINUTE"] =
|
|
23049
|
+
TimeSpanInMs[TimeSpanInMs["MINUTE"] = 60000] = "MINUTE";
|
|
23048
23050
|
TimeSpanInMs[TimeSpanInMs["HOUR"] = 3600000] = "HOUR";
|
|
23049
23051
|
TimeSpanInMs[TimeSpanInMs["DAY"] = 86400000] = "DAY";
|
|
23050
23052
|
TimeSpanInMs[TimeSpanInMs["WEEK"] = 604800000] = "WEEK"; // 1000 * 60 * 60 * 24 * 7
|
|
@@ -23450,7 +23452,7 @@ class WidgetsDashboardComponent {
|
|
|
23450
23452
|
}
|
|
23451
23453
|
}
|
|
23452
23454
|
WidgetsDashboardComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: WidgetsDashboardComponent, deps: [{ token: DynamicComponentService }], target: i0.ɵɵFactoryTarget.Component });
|
|
23453
|
-
WidgetsDashboardComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.0.6", type: WidgetsDashboardComponent, selector: "c8y-widgets-dashboard", inputs: { widgets: "widgets", context: "context", contextDashboard: "contextDashboard", _settings: ["settings", "_settings"], breadcrumb: "breadcrumb" }, outputs: { onAddWidget: "onAddWidget", onEditWidget: "onEditWidget", onDeleteWidget: "onDeleteWidget", onChangeDashboard: "onChangeDashboard", onEditDashboard: "onEditDashboard", onCopyDashboard: "onCopyDashboard", onDeleteDashboard: "onDeleteDashboard", onFreeze: "onFreeze", onChangeStart: "onChangeStart", onChangeEnd: "onChangeEnd" }, 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 [placement]=\"'right'\" *ngIf=\"onAddWidget.observers.length\">\n <button\n title=\"{{ 'Add widget' | translate }}\"\n type=\"button\"\n class=\"btn btn-link\"\n [disabled]=\"settings.isFrozen || settings.isDisabled\"\n (click)=\"onAddWidget.emit()\"\n >\n <i c8yIcon=\"plus-circle\"></i>\n {{ 'Add widget' | translate }}\n </button>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item [placement]=\"'right'\" *ngIf=\"onEditDashboard.observers.length\">\n <button\n title=\"{{ 'Edit' | translate }}\"\n type=\"button\"\n class=\"btn btn-link\"\n [disabled]=\"settings.isFrozen || settings.isDisabled\"\n (click)=\"onEditDashboard.emit()\"\n >\n <i c8yIcon=\"pencil\"></i>\n {{ 'Edit' | translate }}\n </button>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item [placement]=\"'right'\" *ngIf=\"settings.allowFullscreen\">\n <button\n title=\"{{ 'Full screen' | translate }}\"\n type=\"button\"\n class=\"btn btn-link\"\n (click)=\"toggleFullscreen()\"\n >\n <i [c8yIcon]=\"fullScreen() ? 'compress' : 'expand'\"></i>\n {{ 'Full screen' | translate }}\n </button>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item\n [placement]=\"'right'\"\n itemClass=\"navbar-form\"\n *ngIf=\"onFreeze.observers.length\"\n>\n <button\n title=\"{{ 'Lock/unlock this dashboard' | translate }}\"\n type=\"button\"\n class=\"btn btn-default\"\n [ngClass]=\"{ active: settings.isFrozen }\"\n (click)=\"onFreeze.emit(settings)\"\n [disabled]=\"settings.isDisabled\"\n uib-btn-checkbox\n >\n <i [c8yIcon]=\"settings.isFrozen ? 'lock' : 'unlock'\"></i>\n </button>\n</c8y-action-bar-item>\n<c8y-action-bar-item [placement]=\"'more'\" [priority]=\"-2000\" *ngIf=\"settings.canCopy\">\n <button title=\"{{ 'Copy dashboard' | translate }}\" type=\"button\" (click)=\"onCopyDashboard.emit()\" class=\"btn btn-link\">\n <i c8yIcon=\"clone\"></i>\n <span class=\"m-l-4\" translate>Copy dashboard</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 title=\"{{ 'Delete dashboard' | translate }}\"\n type=\"button\"\n (click)=\"onDeleteDashboard.emit()\"\n [disabled]=\"settings.isFrozen || settings.isDisabled\"\n >\n <i c8yIcon=\"delete\"></i>\n <span class=\"m-l-4\" translate>Delete dashboard</span>\n </button>\n</c8y-action-bar-item>\n\n<ng-template #loadingIndicator>\n <c8y-loading class=\"col-xs-12 text-center\" *ngIf=\"isLoadingWidgets$ | async\"></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 *ngIf=\"widgetsToDisplay?.length === 0\"\n [icon]=\"'c8y-device'\"\n [title]=\"'No widgets to display.' | translate\"\n >\n <div *ngIf=\"!settings.isFrozen && onAddWidget.observers.length\">\n <p translate>Add widgets to this dashboard.</p>\n <div>\n <button\n title=\"{{ 'Add widget' | translate }}\"\n type=\"button\"\n [disabled]=\"settings.isFrozen || settings.isDisabled\"\n (click)=\"onAddWidget.emit()\"\n class=\"btn btn-primary m-t-16\"\n translate\n >\n Add widget\n </button>\n </div>\n <p c8y-guide-docs>\n <small translate ngNonBindable>\n Find out more in the\n <a c8y-guide-href=\"users-guide/cockpit/#dashboards\">User guide`KEEP_ORIGINAL`</a>\n .\n </small>\n </p>\n </div>\n </c8y-ui-empty-state>\n\n <c8y-dashboard\n (dashboardChange)=\"onChangeDashboard.emit($event)\"\n #dashboard\n >\n <c8y-dashboard-child\n *ngFor=\"let widget of widgetsToDisplay\"\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 [isFrozen]=\"settings.isFrozen || settings.isDisabled\"\n [class]=\"widget.classes\"\n [data]=\"widget\"\n [useIntersection]=\"true\"\n (changeStart)=\"onChangeStart.emit({ widget: widget, source: child, dashboard: dashboard })\"\n (changeEnd)=\"onChangeEnd.emit({ widget: widget, source: child, dashboard: dashboard })\"\n #child\n >\n <c8y-dashboard-child-title>\n <span *ngIf=\"settings.translateWidgetTitle\">\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 (click)=\"onEditWidget.emit({ widget: widget, source: child, dashboard: dashboard })\"\n >\n <i c8yIcon=\"pencil\"></i>\n <span class=\"m-l-4\" translate>Edit</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 (click)=\"onDeleteWidget.emit({ widget: widget, source: child, dashboard: dashboard })\"\n >\n <i c8yIcon=\"delete\"></i>\n <span class=\"m-l-4\" translate>Remove</span>\n </button>\n </c8y-dashboard-child-action>\n\n <c8y-widget-time-context\n *ngIf=\"widget.config?.displaySettings?.globalTimeContext\"\n (dateContextChange)=\"updateWidgetConfig({ date: $event }, widget)\"\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\n", dependencies: [{ kind: "component", type: EmptyStateComponent, selector: "c8y-ui-empty-state", inputs: ["icon", "title", "subtitle", "horizontal"] }, { kind: "directive", type: IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "directive", type: i1$5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: LoadingComponent, selector: "c8y-loading" }, { kind: "component", type: ActionBarItemComponent, selector: "c8y-action-bar-item", inputs: ["placement", "priority", "itemClass", "injector", "groupId"] }, { kind: "component", type: DynamicComponentComponent, selector: "c8y-dynamic-component", inputs: ["componentId", "config", "mode", "notFoundError", "executeResolvers"], outputs: ["updateWidgetClasses"] }, { kind: "component", type: TitleComponent, selector: "c8y-title", inputs: ["pageTitleUpdate"] }, { kind: "directive", type: GuideHrefDirective, selector: "[c8y-guide-href]", inputs: ["c8y-guide-href"] }, { kind: "component", type: GuideDocsComponent, selector: "[c8y-guide-docs]" }, { kind: "component", type: BreadcrumbComponent, selector: "c8y-breadcrumb" }, { kind: "component", type: BreadcrumbItemComponent, selector: "c8y-breadcrumb-item", inputs: ["icon", "translate", "label", "path", "injector"] }, { kind: "component", type: DashboardChildComponent, selector: "c8y-dashboard-child", inputs: ["x", "y", "width", "height", "data", "margin", "isFrozen", "useIntersection", "class"], outputs: ["changeStart", "changeEnd"] }, { kind: "component", type: DashboardComponent, selector: "c8y-dashboard", inputs: ["columns", "gap", "rows"], outputs: ["dashboardChange"] }, { kind: "component", type: DashboardChildTitleComponent, selector: "c8y-dashboard-child-title" }, { kind: "component", type: DashboardChildActionComponent, selector: "c8y-dashboard-child-action" }, { kind: "component", type: WidgetTimeContextComponent, selector: "c8y-widget-time-context", inputs: ["canDecouple"], outputs: ["dateContextChange"] }, { kind: "pipe", type: C8yTranslatePipe, name: "translate" }, { kind: "pipe", type: i1$5.AsyncPipe, name: "async" }] });
|
|
23455
|
+
WidgetsDashboardComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.0.6", type: WidgetsDashboardComponent, selector: "c8y-widgets-dashboard", inputs: { widgets: "widgets", context: "context", contextDashboard: "contextDashboard", _settings: ["settings", "_settings"], breadcrumb: "breadcrumb" }, outputs: { onAddWidget: "onAddWidget", onEditWidget: "onEditWidget", onDeleteWidget: "onDeleteWidget", onChangeDashboard: "onChangeDashboard", onEditDashboard: "onEditDashboard", onCopyDashboard: "onCopyDashboard", onDeleteDashboard: "onDeleteDashboard", onFreeze: "onFreeze", onChangeStart: "onChangeStart", onChangeEnd: "onChangeEnd" }, 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 [placement]=\"'right'\" *ngIf=\"onAddWidget.observers.length\">\n <button\n title=\"{{ 'Add widget' | translate }}\"\n type=\"button\"\n class=\"btn btn-link\"\n [disabled]=\"settings.isFrozen || settings.isDisabled\"\n (click)=\"onAddWidget.emit()\"\n >\n <i c8yIcon=\"plus-circle\"></i>\n {{ 'Add widget' | translate }}\n </button>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item [placement]=\"'right'\" *ngIf=\"onEditDashboard.observers.length\">\n <button\n title=\"{{ 'Edit' | translate }}\"\n type=\"button\"\n class=\"btn btn-link\"\n [disabled]=\"settings.isFrozen || settings.isDisabled\"\n (click)=\"onEditDashboard.emit()\"\n >\n <i c8yIcon=\"pencil\"></i>\n {{ 'Edit' | translate }}\n </button>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item [placement]=\"'right'\" *ngIf=\"settings.allowFullscreen\">\n <button\n title=\"{{ 'Full screen' | translate }}\"\n type=\"button\"\n class=\"btn btn-link\"\n (click)=\"toggleFullscreen()\"\n >\n <i [c8yIcon]=\"fullScreen() ? 'compress' : 'expand'\"></i>\n {{ 'Full screen' | translate }}\n </button>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item\n [placement]=\"'right'\"\n itemClass=\"navbar-form\"\n *ngIf=\"onFreeze.observers.length\"\n>\n <button\n title=\"{{ 'Lock/unlock this dashboard' | translate }}\"\n type=\"button\"\n class=\"btn btn-default\"\n [ngClass]=\"{ active: settings.isFrozen }\"\n (click)=\"onFreeze.emit(settings)\"\n [disabled]=\"settings.isDisabled\"\n uib-btn-checkbox\n >\n <i [c8yIcon]=\"settings.isFrozen ? 'lock' : 'unlock'\"></i>\n </button>\n</c8y-action-bar-item>\n<c8y-action-bar-item [placement]=\"'more'\" [priority]=\"-2000\" *ngIf=\"settings.canCopy\">\n <button title=\"{{ 'Copy dashboard' | translate }}\" type=\"button\" (click)=\"onCopyDashboard.emit()\" class=\"btn btn-link\">\n <i c8yIcon=\"clone\"></i>\n <span class=\"m-l-4\" translate>Copy dashboard</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 title=\"{{ 'Delete dashboard' | translate }}\"\n type=\"button\"\n (click)=\"onDeleteDashboard.emit()\"\n [disabled]=\"settings.isFrozen || settings.isDisabled\"\n >\n <i c8yIcon=\"delete\"></i>\n <span class=\"m-l-4\" translate>Delete dashboard</span>\n </button>\n</c8y-action-bar-item>\n\n<ng-template #loadingIndicator>\n <c8y-loading class=\"col-xs-12 text-center\" *ngIf=\"isLoadingWidgets$ | async\"></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 *ngIf=\"widgetsToDisplay?.length === 0\"\n [icon]=\"'c8y-device'\"\n [title]=\"'No widgets to display.' | translate\"\n >\n <div *ngIf=\"!settings.isFrozen && onAddWidget.observers.length\">\n <p translate>Add widgets to this dashboard.</p>\n <div>\n <button\n title=\"{{ 'Add widget' | translate }}\"\n type=\"button\"\n [disabled]=\"settings.isFrozen || settings.isDisabled\"\n (click)=\"onAddWidget.emit()\"\n class=\"btn btn-primary m-t-16\"\n translate\n >\n Add widget\n </button>\n </div>\n <p c8y-guide-docs>\n <small translate ngNonBindable>\n Find out more in the\n <a c8y-guide-href=\"users-guide/cockpit/#dashboards\">User guide`KEEP_ORIGINAL`</a>\n .\n </small>\n </p>\n </div>\n </c8y-ui-empty-state>\n\n <c8y-dashboard\n (dashboardChange)=\"onChangeDashboard.emit($event)\"\n #dashboard\n >\n <c8y-dashboard-child\n *ngFor=\"let widget of widgetsToDisplay\"\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 [isFrozen]=\"settings.isFrozen || settings.isDisabled\"\n [class]=\"widget.classes\"\n [data]=\"widget\"\n [useIntersection]=\"true\"\n (changeStart)=\"onChangeStart.emit({ widget: widget, source: child, dashboard: dashboard })\"\n (changeEnd)=\"onChangeEnd.emit({ widget: widget, source: child, dashboard: dashboard })\"\n #child\n >\n <c8y-dashboard-child-title>\n <span *ngIf=\"settings.translateWidgetTitle\">\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 (click)=\"onEditWidget.emit({ widget: widget, source: child, dashboard: dashboard })\"\n >\n <i c8yIcon=\"pencil\"></i>\n <span class=\"m-l-4\" translate>Edit</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 (click)=\"onDeleteWidget.emit({ widget: widget, source: child, dashboard: dashboard })\"\n >\n <i c8yIcon=\"delete\"></i>\n <span class=\"m-l-4\" translate>Remove</span>\n </button>\n </c8y-dashboard-child-action>\n\n <c8y-widget-time-context\n *ngIf=\"\n widget.config?.displaySettings?.globalTimeContext &&\n widget.config?.widgetInstanceGlobalTimeContext\n \"\n (dateContextChange)=\"updateWidgetConfig({ date: $event }, widget)\"\n [canDecouple]=\"widget.config.canDecoupleGlobalTimeContext\"\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\n", dependencies: [{ kind: "component", type: EmptyStateComponent, selector: "c8y-ui-empty-state", inputs: ["icon", "title", "subtitle", "horizontal"] }, { kind: "directive", type: IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "directive", type: i1$5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: LoadingComponent, selector: "c8y-loading" }, { kind: "component", type: ActionBarItemComponent, selector: "c8y-action-bar-item", inputs: ["placement", "priority", "itemClass", "injector", "groupId"] }, { kind: "component", type: DynamicComponentComponent, selector: "c8y-dynamic-component", inputs: ["componentId", "config", "mode", "notFoundError", "executeResolvers"], outputs: ["updateWidgetClasses"] }, { kind: "component", type: TitleComponent, selector: "c8y-title", inputs: ["pageTitleUpdate"] }, { kind: "directive", type: GuideHrefDirective, selector: "[c8y-guide-href]", inputs: ["c8y-guide-href"] }, { kind: "component", type: GuideDocsComponent, selector: "[c8y-guide-docs]" }, { kind: "component", type: BreadcrumbComponent, selector: "c8y-breadcrumb" }, { kind: "component", type: BreadcrumbItemComponent, selector: "c8y-breadcrumb-item", inputs: ["icon", "translate", "label", "path", "injector"] }, { kind: "component", type: DashboardChildComponent, selector: "c8y-dashboard-child", inputs: ["x", "y", "width", "height", "data", "margin", "isFrozen", "useIntersection", "class"], outputs: ["changeStart", "changeEnd"] }, { kind: "component", type: DashboardComponent, selector: "c8y-dashboard", inputs: ["columns", "gap", "rows"], outputs: ["dashboardChange"] }, { kind: "component", type: DashboardChildTitleComponent, selector: "c8y-dashboard-child-title" }, { kind: "component", type: DashboardChildActionComponent, selector: "c8y-dashboard-child-action" }, { kind: "component", type: WidgetTimeContextComponent, selector: "c8y-widget-time-context", inputs: ["canDecouple"], outputs: ["dateContextChange"] }, { kind: "pipe", type: C8yTranslatePipe, name: "translate" }, { kind: "pipe", type: i1$5.AsyncPipe, name: "async" }] });
|
|
23454
23456
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: WidgetsDashboardComponent, decorators: [{
|
|
23455
23457
|
type: Component,
|
|
23456
23458
|
args: [{ selector: 'c8y-widgets-dashboard', host: {
|
|
@@ -23458,7 +23460,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.6", ngImpor
|
|
|
23458
23460
|
display: block;
|
|
23459
23461
|
`,
|
|
23460
23462
|
class: 'dashboard c8y-grid-dashboard'
|
|
23461
|
-
}, 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 [placement]=\"'right'\" *ngIf=\"onAddWidget.observers.length\">\n <button\n title=\"{{ 'Add widget' | translate }}\"\n type=\"button\"\n class=\"btn btn-link\"\n [disabled]=\"settings.isFrozen || settings.isDisabled\"\n (click)=\"onAddWidget.emit()\"\n >\n <i c8yIcon=\"plus-circle\"></i>\n {{ 'Add widget' | translate }}\n </button>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item [placement]=\"'right'\" *ngIf=\"onEditDashboard.observers.length\">\n <button\n title=\"{{ 'Edit' | translate }}\"\n type=\"button\"\n class=\"btn btn-link\"\n [disabled]=\"settings.isFrozen || settings.isDisabled\"\n (click)=\"onEditDashboard.emit()\"\n >\n <i c8yIcon=\"pencil\"></i>\n {{ 'Edit' | translate }}\n </button>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item [placement]=\"'right'\" *ngIf=\"settings.allowFullscreen\">\n <button\n title=\"{{ 'Full screen' | translate }}\"\n type=\"button\"\n class=\"btn btn-link\"\n (click)=\"toggleFullscreen()\"\n >\n <i [c8yIcon]=\"fullScreen() ? 'compress' : 'expand'\"></i>\n {{ 'Full screen' | translate }}\n </button>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item\n [placement]=\"'right'\"\n itemClass=\"navbar-form\"\n *ngIf=\"onFreeze.observers.length\"\n>\n <button\n title=\"{{ 'Lock/unlock this dashboard' | translate }}\"\n type=\"button\"\n class=\"btn btn-default\"\n [ngClass]=\"{ active: settings.isFrozen }\"\n (click)=\"onFreeze.emit(settings)\"\n [disabled]=\"settings.isDisabled\"\n uib-btn-checkbox\n >\n <i [c8yIcon]=\"settings.isFrozen ? 'lock' : 'unlock'\"></i>\n </button>\n</c8y-action-bar-item>\n<c8y-action-bar-item [placement]=\"'more'\" [priority]=\"-2000\" *ngIf=\"settings.canCopy\">\n <button title=\"{{ 'Copy dashboard' | translate }}\" type=\"button\" (click)=\"onCopyDashboard.emit()\" class=\"btn btn-link\">\n <i c8yIcon=\"clone\"></i>\n <span class=\"m-l-4\" translate>Copy dashboard</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 title=\"{{ 'Delete dashboard' | translate }}\"\n type=\"button\"\n (click)=\"onDeleteDashboard.emit()\"\n [disabled]=\"settings.isFrozen || settings.isDisabled\"\n >\n <i c8yIcon=\"delete\"></i>\n <span class=\"m-l-4\" translate>Delete dashboard</span>\n </button>\n</c8y-action-bar-item>\n\n<ng-template #loadingIndicator>\n <c8y-loading class=\"col-xs-12 text-center\" *ngIf=\"isLoadingWidgets$ | async\"></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 *ngIf=\"widgetsToDisplay?.length === 0\"\n [icon]=\"'c8y-device'\"\n [title]=\"'No widgets to display.' | translate\"\n >\n <div *ngIf=\"!settings.isFrozen && onAddWidget.observers.length\">\n <p translate>Add widgets to this dashboard.</p>\n <div>\n <button\n title=\"{{ 'Add widget' | translate }}\"\n type=\"button\"\n [disabled]=\"settings.isFrozen || settings.isDisabled\"\n (click)=\"onAddWidget.emit()\"\n class=\"btn btn-primary m-t-16\"\n translate\n >\n Add widget\n </button>\n </div>\n <p c8y-guide-docs>\n <small translate ngNonBindable>\n Find out more in the\n <a c8y-guide-href=\"users-guide/cockpit/#dashboards\">User guide`KEEP_ORIGINAL`</a>\n .\n </small>\n </p>\n </div>\n </c8y-ui-empty-state>\n\n <c8y-dashboard\n (dashboardChange)=\"onChangeDashboard.emit($event)\"\n #dashboard\n >\n <c8y-dashboard-child\n *ngFor=\"let widget of widgetsToDisplay\"\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 [isFrozen]=\"settings.isFrozen || settings.isDisabled\"\n [class]=\"widget.classes\"\n [data]=\"widget\"\n [useIntersection]=\"true\"\n (changeStart)=\"onChangeStart.emit({ widget: widget, source: child, dashboard: dashboard })\"\n (changeEnd)=\"onChangeEnd.emit({ widget: widget, source: child, dashboard: dashboard })\"\n #child\n >\n <c8y-dashboard-child-title>\n <span *ngIf=\"settings.translateWidgetTitle\">\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 (click)=\"onEditWidget.emit({ widget: widget, source: child, dashboard: dashboard })\"\n >\n <i c8yIcon=\"pencil\"></i>\n <span class=\"m-l-4\" translate>Edit</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 (click)=\"onDeleteWidget.emit({ widget: widget, source: child, dashboard: dashboard })\"\n >\n <i c8yIcon=\"delete\"></i>\n <span class=\"m-l-4\" translate>Remove</span>\n </button>\n </c8y-dashboard-child-action>\n\n <c8y-widget-time-context\n *ngIf=\"widget.config?.displaySettings?.globalTimeContext\"\n (dateContextChange)=\"updateWidgetConfig({ date: $event }, widget)\"\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\n" }]
|
|
23463
|
+
}, 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 [placement]=\"'right'\" *ngIf=\"onAddWidget.observers.length\">\n <button\n title=\"{{ 'Add widget' | translate }}\"\n type=\"button\"\n class=\"btn btn-link\"\n [disabled]=\"settings.isFrozen || settings.isDisabled\"\n (click)=\"onAddWidget.emit()\"\n >\n <i c8yIcon=\"plus-circle\"></i>\n {{ 'Add widget' | translate }}\n </button>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item [placement]=\"'right'\" *ngIf=\"onEditDashboard.observers.length\">\n <button\n title=\"{{ 'Edit' | translate }}\"\n type=\"button\"\n class=\"btn btn-link\"\n [disabled]=\"settings.isFrozen || settings.isDisabled\"\n (click)=\"onEditDashboard.emit()\"\n >\n <i c8yIcon=\"pencil\"></i>\n {{ 'Edit' | translate }}\n </button>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item [placement]=\"'right'\" *ngIf=\"settings.allowFullscreen\">\n <button\n title=\"{{ 'Full screen' | translate }}\"\n type=\"button\"\n class=\"btn btn-link\"\n (click)=\"toggleFullscreen()\"\n >\n <i [c8yIcon]=\"fullScreen() ? 'compress' : 'expand'\"></i>\n {{ 'Full screen' | translate }}\n </button>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item\n [placement]=\"'right'\"\n itemClass=\"navbar-form\"\n *ngIf=\"onFreeze.observers.length\"\n>\n <button\n title=\"{{ 'Lock/unlock this dashboard' | translate }}\"\n type=\"button\"\n class=\"btn btn-default\"\n [ngClass]=\"{ active: settings.isFrozen }\"\n (click)=\"onFreeze.emit(settings)\"\n [disabled]=\"settings.isDisabled\"\n uib-btn-checkbox\n >\n <i [c8yIcon]=\"settings.isFrozen ? 'lock' : 'unlock'\"></i>\n </button>\n</c8y-action-bar-item>\n<c8y-action-bar-item [placement]=\"'more'\" [priority]=\"-2000\" *ngIf=\"settings.canCopy\">\n <button title=\"{{ 'Copy dashboard' | translate }}\" type=\"button\" (click)=\"onCopyDashboard.emit()\" class=\"btn btn-link\">\n <i c8yIcon=\"clone\"></i>\n <span class=\"m-l-4\" translate>Copy dashboard</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 title=\"{{ 'Delete dashboard' | translate }}\"\n type=\"button\"\n (click)=\"onDeleteDashboard.emit()\"\n [disabled]=\"settings.isFrozen || settings.isDisabled\"\n >\n <i c8yIcon=\"delete\"></i>\n <span class=\"m-l-4\" translate>Delete dashboard</span>\n </button>\n</c8y-action-bar-item>\n\n<ng-template #loadingIndicator>\n <c8y-loading class=\"col-xs-12 text-center\" *ngIf=\"isLoadingWidgets$ | async\"></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 *ngIf=\"widgetsToDisplay?.length === 0\"\n [icon]=\"'c8y-device'\"\n [title]=\"'No widgets to display.' | translate\"\n >\n <div *ngIf=\"!settings.isFrozen && onAddWidget.observers.length\">\n <p translate>Add widgets to this dashboard.</p>\n <div>\n <button\n title=\"{{ 'Add widget' | translate }}\"\n type=\"button\"\n [disabled]=\"settings.isFrozen || settings.isDisabled\"\n (click)=\"onAddWidget.emit()\"\n class=\"btn btn-primary m-t-16\"\n translate\n >\n Add widget\n </button>\n </div>\n <p c8y-guide-docs>\n <small translate ngNonBindable>\n Find out more in the\n <a c8y-guide-href=\"users-guide/cockpit/#dashboards\">User guide`KEEP_ORIGINAL`</a>\n .\n </small>\n </p>\n </div>\n </c8y-ui-empty-state>\n\n <c8y-dashboard\n (dashboardChange)=\"onChangeDashboard.emit($event)\"\n #dashboard\n >\n <c8y-dashboard-child\n *ngFor=\"let widget of widgetsToDisplay\"\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 [isFrozen]=\"settings.isFrozen || settings.isDisabled\"\n [class]=\"widget.classes\"\n [data]=\"widget\"\n [useIntersection]=\"true\"\n (changeStart)=\"onChangeStart.emit({ widget: widget, source: child, dashboard: dashboard })\"\n (changeEnd)=\"onChangeEnd.emit({ widget: widget, source: child, dashboard: dashboard })\"\n #child\n >\n <c8y-dashboard-child-title>\n <span *ngIf=\"settings.translateWidgetTitle\">\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 (click)=\"onEditWidget.emit({ widget: widget, source: child, dashboard: dashboard })\"\n >\n <i c8yIcon=\"pencil\"></i>\n <span class=\"m-l-4\" translate>Edit</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 (click)=\"onDeleteWidget.emit({ widget: widget, source: child, dashboard: dashboard })\"\n >\n <i c8yIcon=\"delete\"></i>\n <span class=\"m-l-4\" translate>Remove</span>\n </button>\n </c8y-dashboard-child-action>\n\n <c8y-widget-time-context\n *ngIf=\"\n widget.config?.displaySettings?.globalTimeContext &&\n widget.config?.widgetInstanceGlobalTimeContext\n \"\n (dateContextChange)=\"updateWidgetConfig({ date: $event }, widget)\"\n [canDecouple]=\"widget.config.canDecoupleGlobalTimeContext\"\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\n" }]
|
|
23462
23464
|
}], ctorParameters: function () { return [{ type: DynamicComponentService }]; }, propDecorators: { widgets: [{
|
|
23463
23465
|
type: Input
|
|
23464
23466
|
}], context: [{
|