@c8y/ngx-components 1018.0.28 → 1018.0.30

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.
Files changed (22) hide show
  1. package/datapoint-library/details/datapoint-library-details.component.d.ts +6 -3
  2. package/datapoint-selector/datapoint-selector-modal/datapoint-selector-modal.component.d.ts +3 -0
  3. package/datapoint-selector/datapoint-selector.component.d.ts +2 -1
  4. package/esm2020/datapoint-library/details/datapoint-library-details.component.mjs +38 -10
  5. package/esm2020/datapoint-selector/datapoint-selector-modal/datapoint-selector-modal.component.mjs +14 -5
  6. package/esm2020/datapoint-selector/datapoint-selector.component.mjs +8 -5
  7. package/esm2020/sub-assets/asset-properties-item.component.mjs +3 -3
  8. package/esm2020/sub-assets/asset-properties.component.mjs +3 -3
  9. package/fesm2015/c8y-ngx-components-datapoint-library-details.mjs +39 -9
  10. package/fesm2015/c8y-ngx-components-datapoint-library-details.mjs.map +1 -1
  11. package/fesm2015/c8y-ngx-components-datapoint-selector.mjs +17 -6
  12. package/fesm2015/c8y-ngx-components-datapoint-selector.mjs.map +1 -1
  13. package/fesm2015/c8y-ngx-components-sub-assets.mjs +4 -4
  14. package/fesm2015/c8y-ngx-components-sub-assets.mjs.map +1 -1
  15. package/fesm2020/c8y-ngx-components-datapoint-library-details.mjs +37 -9
  16. package/fesm2020/c8y-ngx-components-datapoint-library-details.mjs.map +1 -1
  17. package/fesm2020/c8y-ngx-components-datapoint-selector.mjs +17 -6
  18. package/fesm2020/c8y-ngx-components-datapoint-selector.mjs.map +1 -1
  19. package/fesm2020/c8y-ngx-components-sub-assets.mjs +4 -4
  20. package/fesm2020/c8y-ngx-components-sub-assets.mjs.map +1 -1
  21. package/locales/locales.pot +3 -0
  22. package/package.json +1 -1
@@ -179,10 +179,10 @@ export class AssetPropertiesComponent {
179
179
  }
180
180
  }
181
181
  AssetPropertiesComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: AssetPropertiesComponent, deps: [{ token: i1.AssetTypesService }, { token: i2.InventoryService }, { token: i2.InventoryBinaryService }, { token: i1.AlertService }, { token: i1.ContextRouteService }, { token: i3.ActivatedRoute }], target: i0.ɵɵFactoryTarget.Component });
182
- AssetPropertiesComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.0.6", type: AssetPropertiesComponent, selector: "c8y-asset-properties", inputs: { asset: "asset", properties: "properties" }, outputs: { assetChange: "assetChange" }, usesOnChanges: true, ngImport: i0, template: "<ng-container>\n <div class=\"card-header bg-inherit separator sticky-top\">\n <h1\n class=\"card-title p-t-4 p-b-4\"\n ngNonBindable\n translate\n [translateParams]=\"{ label: assetType?.label || '' | humanize }\"\n >\n {{ label }} properties\n </h1>\n </div>\n <div class=\"card-block\">\n <div class=\"text-center\" *ngIf=\"isLoading\">\n <c8y-loading></c8y-loading>\n </div>\n\n <ng-container *ngIf=\"!isLoading\">\n <div\n class=\"card m-b-8\"\n *ngFor=\"let prop of customProperties\"\n [ngClass]=\"{ 'card-highlight': prop.isEdit }\"\n title=\"{{ prop.description | translate }}\"\n >\n <div class=\"card-block\" [ngClass]=\"{ 'p-b-0': prop.isEdit }\">\n <div class=\"d-flex p-b-8 a-i-center\" *ngIf=\"!prop.isEdit\">\n <p class=\"text-medium\">{{ prop?.label | humanize }}</p>\n <button\n class=\"btn btn-dot m-l-auto text-12\"\n type=\"button\"\n tooltip=\"{{ 'Edit' | translate }}\"\n [attr.aria-label]=\"'Edit' | translate\"\n [delay]=\"500\"\n (click)=\"toggleEdit(prop)\"\n >\n <i c8yIcon=\"pencil\"></i>\n </button>\n </div>\n <c8y-asset-properties-item\n #assetProps\n [file]=\"prop.file\"\n [key]=\"prop.key\"\n [type]=\"prop.type\"\n [value]=\"prop.value\"\n [complex]=\"prop.complex\"\n [isEdit]=\"prop.isEdit\"\n [jsonSchema]=\"prop.jsonSchema\"\n ></c8y-asset-properties-item>\n </div>\n <div class=\"card-footer p-t-0\" *ngIf=\"prop.isEdit\">\n <button\n class=\"btn btn-default btn-sm\"\n type=\"button\"\n title=\"{{ 'Cancel' | translate }}\"\n (click)=\"toggleEdit(prop)\"\n >\n {{ 'Cancel' | translate }}\n </button>\n <button\n class=\"btn btn-primary btn-sm\"\n type=\"button\"\n title=\"{{ 'Save' | translate }}\"\n [disabled]=\"!assetProps?.form?.valid\"\n (click)=\"save(assetProps.model, prop)\"\n >\n {{ 'Save' | translate }}\n </button>\n </div>\n </div>\n </ng-container>\n </div>\n</ng-container>\n", dependencies: [{ kind: "directive", type: i1.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: i1.C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i1.LoadingComponent, selector: "c8y-loading" }, { kind: "directive", type: i5.TooltipDirective, selector: "[tooltip], [tooltipHtml]", inputs: ["adaptivePosition", "tooltip", "placement", "triggers", "container", "containerClass", "boundariesElement", "isOpen", "isDisabled", "delay", "tooltipHtml", "tooltipPlacement", "tooltipIsOpen", "tooltipEnable", "tooltipAppendToBody", "tooltipAnimation", "tooltipClass", "tooltipContext", "tooltipPopupDelay", "tooltipFadeDuration", "tooltipTrigger"], outputs: ["tooltipChange", "onShown", "onHidden", "tooltipStateChanged"], exportAs: ["bs-tooltip"] }, { kind: "component", type: i6.AssetPropertiesItemComponent, selector: "c8y-asset-properties-item", inputs: ["key", "value", "label", "type", "file", "complex", "isEdit", "jsonSchema"] }, { kind: "pipe", type: i1.C8yTranslatePipe, name: "translate" }, { kind: "pipe", type: i1.HumanizePipe, name: "humanize" }] });
182
+ AssetPropertiesComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.0.6", type: AssetPropertiesComponent, selector: "c8y-asset-properties", inputs: { asset: "asset", properties: "properties" }, outputs: { assetChange: "assetChange" }, usesOnChanges: true, ngImport: i0, template: "<ng-container>\n <div class=\"card-header bg-inherit separator sticky-top\">\n <h1\n class=\"card-title p-t-4 p-b-4\"\n ngNonBindable\n translate\n [translateParams]=\"{ label: assetType?.label || '' | translate }\"\n >\n {{ label }} properties\n </h1>\n </div>\n <div class=\"card-block\">\n <div class=\"text-center\" *ngIf=\"isLoading\">\n <c8y-loading></c8y-loading>\n </div>\n\n <ng-container *ngIf=\"!isLoading\">\n <div\n class=\"card m-b-8\"\n *ngFor=\"let prop of customProperties\"\n [ngClass]=\"{ 'card-highlight': prop.isEdit }\"\n title=\"{{ prop.description | translate }}\"\n >\n <div class=\"card-block\" [ngClass]=\"{ 'p-b-0': prop.isEdit }\">\n <div class=\"d-flex p-b-8 a-i-center\" *ngIf=\"!prop.isEdit\">\n <p title=\"{{ prop?.label | translate }}\" class=\"text-medium text-truncate\">\n {{ prop?.label | translate }}\n </p>\n <button\n class=\"btn btn-dot m-l-auto text-12\"\n type=\"button\"\n tooltip=\"{{ 'Edit' | translate }}\"\n [attr.aria-label]=\"'Edit' | translate\"\n [delay]=\"500\"\n (click)=\"toggleEdit(prop)\"\n >\n <i c8yIcon=\"pencil\"></i>\n </button>\n </div>\n <c8y-asset-properties-item\n #assetProps\n [file]=\"prop.file\"\n [key]=\"prop.key\"\n [type]=\"prop.type\"\n [value]=\"prop.value\"\n [complex]=\"prop.complex\"\n [isEdit]=\"prop.isEdit\"\n [jsonSchema]=\"prop.jsonSchema\"\n ></c8y-asset-properties-item>\n </div>\n <div class=\"card-footer p-t-0\" *ngIf=\"prop.isEdit\">\n <button\n class=\"btn btn-default btn-sm\"\n type=\"button\"\n title=\"{{ 'Cancel' | translate }}\"\n (click)=\"toggleEdit(prop)\"\n >\n {{ 'Cancel' | translate }}\n </button>\n <button\n class=\"btn btn-primary btn-sm\"\n type=\"button\"\n title=\"{{ 'Save' | translate }}\"\n [disabled]=\"!assetProps?.form?.valid\"\n (click)=\"save(assetProps.model, prop)\"\n >\n {{ 'Save' | translate }}\n </button>\n </div>\n </div>\n </ng-container>\n </div>\n</ng-container>\n", dependencies: [{ kind: "directive", type: i1.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: i1.C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i1.LoadingComponent, selector: "c8y-loading" }, { kind: "directive", type: i5.TooltipDirective, selector: "[tooltip], [tooltipHtml]", inputs: ["adaptivePosition", "tooltip", "placement", "triggers", "container", "containerClass", "boundariesElement", "isOpen", "isDisabled", "delay", "tooltipHtml", "tooltipPlacement", "tooltipIsOpen", "tooltipEnable", "tooltipAppendToBody", "tooltipAnimation", "tooltipClass", "tooltipContext", "tooltipPopupDelay", "tooltipFadeDuration", "tooltipTrigger"], outputs: ["tooltipChange", "onShown", "onHidden", "tooltipStateChanged"], exportAs: ["bs-tooltip"] }, { kind: "component", type: i6.AssetPropertiesItemComponent, selector: "c8y-asset-properties-item", inputs: ["key", "value", "label", "type", "file", "complex", "isEdit", "jsonSchema"] }, { kind: "pipe", type: i1.C8yTranslatePipe, name: "translate" }] });
183
183
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: AssetPropertiesComponent, decorators: [{
184
184
  type: Component,
185
- args: [{ selector: 'c8y-asset-properties', template: "<ng-container>\n <div class=\"card-header bg-inherit separator sticky-top\">\n <h1\n class=\"card-title p-t-4 p-b-4\"\n ngNonBindable\n translate\n [translateParams]=\"{ label: assetType?.label || '' | humanize }\"\n >\n {{ label }} properties\n </h1>\n </div>\n <div class=\"card-block\">\n <div class=\"text-center\" *ngIf=\"isLoading\">\n <c8y-loading></c8y-loading>\n </div>\n\n <ng-container *ngIf=\"!isLoading\">\n <div\n class=\"card m-b-8\"\n *ngFor=\"let prop of customProperties\"\n [ngClass]=\"{ 'card-highlight': prop.isEdit }\"\n title=\"{{ prop.description | translate }}\"\n >\n <div class=\"card-block\" [ngClass]=\"{ 'p-b-0': prop.isEdit }\">\n <div class=\"d-flex p-b-8 a-i-center\" *ngIf=\"!prop.isEdit\">\n <p class=\"text-medium\">{{ prop?.label | humanize }}</p>\n <button\n class=\"btn btn-dot m-l-auto text-12\"\n type=\"button\"\n tooltip=\"{{ 'Edit' | translate }}\"\n [attr.aria-label]=\"'Edit' | translate\"\n [delay]=\"500\"\n (click)=\"toggleEdit(prop)\"\n >\n <i c8yIcon=\"pencil\"></i>\n </button>\n </div>\n <c8y-asset-properties-item\n #assetProps\n [file]=\"prop.file\"\n [key]=\"prop.key\"\n [type]=\"prop.type\"\n [value]=\"prop.value\"\n [complex]=\"prop.complex\"\n [isEdit]=\"prop.isEdit\"\n [jsonSchema]=\"prop.jsonSchema\"\n ></c8y-asset-properties-item>\n </div>\n <div class=\"card-footer p-t-0\" *ngIf=\"prop.isEdit\">\n <button\n class=\"btn btn-default btn-sm\"\n type=\"button\"\n title=\"{{ 'Cancel' | translate }}\"\n (click)=\"toggleEdit(prop)\"\n >\n {{ 'Cancel' | translate }}\n </button>\n <button\n class=\"btn btn-primary btn-sm\"\n type=\"button\"\n title=\"{{ 'Save' | translate }}\"\n [disabled]=\"!assetProps?.form?.valid\"\n (click)=\"save(assetProps.model, prop)\"\n >\n {{ 'Save' | translate }}\n </button>\n </div>\n </div>\n </ng-container>\n </div>\n</ng-container>\n" }]
185
+ args: [{ selector: 'c8y-asset-properties', template: "<ng-container>\n <div class=\"card-header bg-inherit separator sticky-top\">\n <h1\n class=\"card-title p-t-4 p-b-4\"\n ngNonBindable\n translate\n [translateParams]=\"{ label: assetType?.label || '' | translate }\"\n >\n {{ label }} properties\n </h1>\n </div>\n <div class=\"card-block\">\n <div class=\"text-center\" *ngIf=\"isLoading\">\n <c8y-loading></c8y-loading>\n </div>\n\n <ng-container *ngIf=\"!isLoading\">\n <div\n class=\"card m-b-8\"\n *ngFor=\"let prop of customProperties\"\n [ngClass]=\"{ 'card-highlight': prop.isEdit }\"\n title=\"{{ prop.description | translate }}\"\n >\n <div class=\"card-block\" [ngClass]=\"{ 'p-b-0': prop.isEdit }\">\n <div class=\"d-flex p-b-8 a-i-center\" *ngIf=\"!prop.isEdit\">\n <p title=\"{{ prop?.label | translate }}\" class=\"text-medium text-truncate\">\n {{ prop?.label | translate }}\n </p>\n <button\n class=\"btn btn-dot m-l-auto text-12\"\n type=\"button\"\n tooltip=\"{{ 'Edit' | translate }}\"\n [attr.aria-label]=\"'Edit' | translate\"\n [delay]=\"500\"\n (click)=\"toggleEdit(prop)\"\n >\n <i c8yIcon=\"pencil\"></i>\n </button>\n </div>\n <c8y-asset-properties-item\n #assetProps\n [file]=\"prop.file\"\n [key]=\"prop.key\"\n [type]=\"prop.type\"\n [value]=\"prop.value\"\n [complex]=\"prop.complex\"\n [isEdit]=\"prop.isEdit\"\n [jsonSchema]=\"prop.jsonSchema\"\n ></c8y-asset-properties-item>\n </div>\n <div class=\"card-footer p-t-0\" *ngIf=\"prop.isEdit\">\n <button\n class=\"btn btn-default btn-sm\"\n type=\"button\"\n title=\"{{ 'Cancel' | translate }}\"\n (click)=\"toggleEdit(prop)\"\n >\n {{ 'Cancel' | translate }}\n </button>\n <button\n class=\"btn btn-primary btn-sm\"\n type=\"button\"\n title=\"{{ 'Save' | translate }}\"\n [disabled]=\"!assetProps?.form?.valid\"\n (click)=\"save(assetProps.model, prop)\"\n >\n {{ 'Save' | translate }}\n </button>\n </div>\n </div>\n </ng-container>\n </div>\n</ng-container>\n" }]
186
186
  }], ctorParameters: function () { return [{ type: i1.AssetTypesService }, { type: i2.InventoryService }, { type: i2.InventoryBinaryService }, { type: i1.AlertService }, { type: i1.ContextRouteService }, { type: i3.ActivatedRoute }]; }, propDecorators: { asset: [{
187
187
  type: Input
188
188
  }], assetChange: [{
@@ -190,4 +190,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.6", ngImpor
190
190
  }], properties: [{
191
191
  type: Input
192
192
  }] } });
193
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNzZXQtcHJvcGVydGllcy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zdWItYXNzZXRzL2Fzc2V0LXByb3BlcnRpZXMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vc3ViLWFzc2V0cy9hc3NldC1wcm9wZXJ0aWVzLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBYSxNQUFNLEVBQWlCLE1BQU0sZUFBZSxDQUFDO0FBQ2pHLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNqRCxPQUFPLEVBR0wsc0JBQXNCLEVBQ3RCLGdCQUFnQixFQUNqQixNQUFNLGFBQWEsQ0FBQztBQUNyQixPQUFPLEVBQUUsWUFBWSxFQUFFLGlCQUFpQixFQUFFLG1CQUFtQixFQUFFLE9BQU8sRUFBRSxNQUFNLHFCQUFxQixDQUFDOzs7Ozs7OztBQVFwRyxNQUFNLE9BQU8sd0JBQXdCO0lBWW5DLFlBQ1UsVUFBNkIsRUFDN0IsU0FBMkIsRUFDM0IsZUFBdUMsRUFDdkMsS0FBbUIsRUFDbkIsbUJBQXdDLEVBQ3hDLGNBQThCO1FBTDlCLGVBQVUsR0FBVixVQUFVLENBQW1CO1FBQzdCLGNBQVMsR0FBVCxTQUFTLENBQWtCO1FBQzNCLG9CQUFlLEdBQWYsZUFBZSxDQUF3QjtRQUN2QyxVQUFLLEdBQUwsS0FBSyxDQUFjO1FBQ25CLHdCQUFtQixHQUFuQixtQkFBbUIsQ0FBcUI7UUFDeEMsbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBaEI5QixnQkFBVyxHQUFHLElBQUksWUFBWSxFQUFrQixDQUFDO1FBRzNELGVBQVUsR0FBcUIsRUFBRSxDQUFDO1FBR2xDLHFCQUFnQixHQUEwQixFQUFFLENBQUM7UUFDN0MsV0FBTSxHQUFHLEtBQUssQ0FBQztRQUNmLGNBQVMsR0FBRyxLQUFLLENBQUM7SUFTZixDQUFDO0lBRUosV0FBVyxD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QUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7U0FDL0Q7YUFBTTtZQUNMLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxHQUFHLENBQUMsRUFBRSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQztTQUNwRDtJQUNILENBQUM7O3FIQXZMVSx3QkFBd0I7eUdBQXhCLHdCQUF3QixnTENoQnJDLDIxRUF1RUE7MkZEdkRhLHdCQUF3QjtrQkFKcEMsU0FBUzsrQkFDRSxzQkFBc0I7c1FBSXZCLEtBQUs7c0JBQWIsS0FBSztnQkFDSSxXQUFXO3NCQUFwQixNQUFNO2dCQUdQLFVBQVU7c0JBRFQsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25DaGFuZ2VzLCBPdXRwdXQsIFNpbXBsZUNoYW5nZXMgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7XG4gIElNYW5hZ2VkT2JqZWN0LFxuICBJTWFuYWdlZE9iamVjdEJpbmFyeSxcbiAgSW52ZW50b3J5QmluYXJ5U2VydmljZSxcbiAgSW52ZW50b3J5U2VydmljZVxufSBmcm9tICdAYzh5L2NsaWVudCc7XG5pbXBvcnQgeyBBbGVydFNlcnZpY2UsIEFzc2V0VHlwZXNTZXJ2aWNlLCBDb250ZXh0Um91dGVTZXJ2aWNlLCBnZXR0ZXh0IH0gZnJvbSAnQGM4eS9uZ3gtY29tcG9uZW50cyc7XG5pbXBvcnQgeyBBc3NldFByb3BlcnRpZXNJdGVtIH0gZnJvbSAnLi9hc3NldC1wcm9wZXJ0aWVzLm1vZGVsJztcbmltcG9ydCB7IEpTT05TY2hlbWE3IH0gZnJvbSAnanNvbi1zY2hlbWEnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjOHktYXNzZXQtcHJvcGVydGllcycsXG4gIHRlbXBsYXRlVXJsOiAnLi9hc3NldC1wcm9wZXJ0aWVzLmNvbXBvbmVudC5odG1sJ1xufSlcbmV4cG9ydCBjbGFzcyBBc3NldFByb3BlcnRpZXNDb21wb25lbnQgaW1wbGVtZW50cyBPbkNoYW5nZXMge1xuICBASW5wdXQoKSBhc3NldDogSU1hbmFnZWRPYmplY3Q7XG4gIEBPdXRwdXQoKSBhc3NldENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8SU1hbmFnZWRPYmplY3Q+KCk7XG5cbiAgQElucHV0KClcbiAgcHJvcGVydGllczogSU1hbmFnZWRPYmplY3RbXSA9IFtdO1xuXG4gIGFzc2V0VHlwZTogSU1hbmFnZWRPYmplY3Q7XG4gIGN1c3RvbVByb3BlcnRpZXM6IEFzc2V0UHJvcGVydGllc0l0ZW1bXSA9IFtdO1xuICBpc0VkaXQgPSBmYWxzZTtcbiAgaXNMb2FkaW5nID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBhc3NldFR5cGVzOiBBc3NldFR5cGVzU2VydmljZSxcbiAgICBwcml2YXRlIGludmVudG9yeTogSW52ZW50b3J5U2VydmljZSxcbiAgICBwcml2YXRlIGludmVudG9yeUJpbmFyeTogSW52ZW50b3J5QmluYXJ5U2VydmljZSxcbiAgICBwcml2YXRlIGFsZXJ0OiBBbGVydFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBjb250ZXh0Um91dGVTZXJ2aWNlOiBDb250ZXh0Um91dGVTZXJ2aWNlLFxuICAgIHByaXZhdGUgYWN0aXZhdGVkUm91dGU6IEFjdGl2YXRlZFJvdXRlXG4gICkge31cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKGNoYW5nZXMuYXNzZXQpIHtcbiAgICAgIC8vIEJhY2sgYnV0dG9uIGhhbmRsaW5nLCBhcyBjb21wb25lbnQgaXMgbm90IGRlc3Ryb3llZFxuICAgICAgdGhpcy5hc3NldFR5cGUgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLmN1c3RvbVByb3BlcnRpZXMgPSBbXTtcbiAgICAgIHRoaXMubG9hZEFzc2V0KCk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgbG9hZEFzc2V0KCkge1xuICAgIHRoaXMuaXNMb2FkaW5nID0gdHJ1ZTtcbiAgICB0aGlzLmFzc2V0VHlwZSA9IHRoaXMuYXNzZXRUeXBlcy5nZXRBc3NldFR5cGVCeU5hbWUodGhpcy5hc3NldC50eXBlKTtcbiAgICB0cnkge1xuICAgICAgdGhpcy5wcm9wZXJ0aWVzID0gdGhpcy5rZWVwT3JkZXIoXG4gICAgICAgIHRoaXMuYXNzZXRUeXBlPy5jOHlfSXNBc3NldFR5cGU/LnByb3BlcnRpZXMsXG4gICAgICAgIHRoaXMucHJvcGVydGllc1xuICAgICAgKTtcbiAgICB9IGNhdGNoIChleCkge1xuICAgICAgY29uc29sZS53YXJuKGV4KTtcbiAgICB9XG4gICAgdGhpcy5jdXN0b21Qcm9wZXJ0aWVzID0gYXdhaXQgdGhpcy5yZXNvbHZlQ3VzdG9tUHJvcGVydGllcyh0aGlzLnByb3BlcnRpZXMpO1xuICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7XG4gIH1cblxuICBhc3luYyByZXNvbHZlQ3VzdG9tUHJvcGVydGllcyhtYW5hZ2VkT2JqZWN0czogSU1hbmFnZWRPYmplY3RbXSkge1xuICAgIGNvbnN0IHByb3BlcnRpZXMgPSBbXTtcbiAgICBmb3IgKGNvbnN0IG1vIG9mIG1hbmFnZWRPYmplY3RzKSB7XG4gICAgICBpZiAobW8uYzh5X0pzb25TY2hlbWEpIHtcbiAgICAgICAgY29uc3QgW2l0ZW1dID0gYXdhaXQgdGhpcy5wYXJzZUl0ZW0obW8sIG1vLmM4eV9Kc29uU2NoZW1hLnByb3BlcnRpZXMsIHRoaXMuYXNzZXQpO1xuICAgICAgICB0aGlzLnNldEl0ZW1SZXF1aXJlZChpdGVtLCBtbyk7XG4gICAgICAgIHByb3BlcnRpZXMucHVzaChpdGVtKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHByb3BlcnRpZXM7XG4gIH1cblxuICBhc3luYyBwYXJzZUl0ZW0obW86IElNYW5hZ2VkT2JqZWN0LCBwcm9wZXJ0aWVzLCBhc3NldCk6IFByb21pc2U8QXNzZXRQcm9wZXJ0aWVzSXRlbVtdPiB7XG4gICAgaWYgKCFhc3NldCkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMocHJvcGVydGllcyk7XG4gICAgY29uc3QgaXRlbXM6IEFzc2V0UHJvcGVydGllc0l0ZW1bXSA9IFtdO1xuICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcbiAgICAgIGxldCB2YWx1ZSA9IGFzc2V0W2tleV07XG4gICAgICBjb25zdCB0eXBlID0gcHJvcGVydGllc1trZXldLnR5cGU7XG4gICAgICBjb25zdCB0aXRsZSA9IHByb3BlcnRpZXNba2V5XS50aXRsZTtcbiAgICAgIGxldCBmaWxlO1xuICAgICAgaWYgKHR5cGUgPT09ICdmaWxlJyAmJiB2YWx1ZSkge1xuICAgICAgICBjb25zdCBmaWxlSWQgPSB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnID8gdmFsdWVbMF0/LmZpbGU/LmlkIDogdmFsdWU7XG4gICAgICAgIGNvbnN0IGZpbGVEYXRhID0gYXdhaXQgdGhpcy5nZXRGaWxlTWFuYWdlZE9iamVjdChmaWxlSWQpO1xuICAgICAgICBmaWxlID0gZmlsZURhdGE7XG4gICAgICAgIHZhbHVlID0gW2ZpbGVEYXRhXTtcbiAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ2RhdGUnKSB7XG4gICAgICAgIGNvbnN0IHZhbHVlRGF0ZSA9IG5ldyBEYXRlKHZhbHVlKTtcbiAgICAgICAgdmFsdWUgPSAhaXNOYU4odmFsdWVEYXRlLmdldFRpbWUoKSkgPyB2YWx1ZURhdGUgOiBudWxsO1xuICAgICAgfVxuICAgICAgaXRlbXMucHVzaCh7XG4gICAgICAgIGtleSxcbiAgICAgICAgdmFsdWUsXG4gICAgICAgIGxhYmVsOiB0aXRsZSB8fCBtby5sYWJlbCxcbiAgICAgICAgdHlwZSxcbiAgICAgICAgZGVzY3JpcHRpb246IG1vLmRlc2NyaXB0aW9uLFxuICAgICAgICBmaWxlLFxuICAgICAgICBjb21wbGV4OlxuICAgICAgICAgIHR5cGUgPT09ICdvYmplY3QnXG4gICAgICAgICAgICA/IGF3YWl0IHRoaXMucGFyc2VJdGVtKG1vLCBwcm9wZXJ0aWVzW2tleV0ucHJvcGVydGllcywgYXNzZXRba2V5XSlcbiAgICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICBpc0VkaXQ6IGZhbHNlLFxuICAgICAgICBqc29uU2NoZW1hOiBtby5jOHlfSnNvblNjaGVtYVxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBpdGVtcztcbiAgfVxuXG4gIHRvZ2dsZUVkaXQocHJvcDogQXNzZXRQcm9wZXJ0aWVzSXRlbSkge1xuICAgIHByb3AuaXNFZGl0ID0gIXByb3AuaXNFZGl0O1xuICB9XG5cbiAgYXN5bmMgZ2V0RmlsZU1hbmFnZWRPYmplY3QoaWQ6IHN0cmluZykge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB7IGRhdGEgfSA9IGF3YWl0IHRoaXMuaW52ZW50b3J5LmRldGFpbChpZCk7XG4gICAgICByZXR1cm4gZGF0YTtcbiAgICB9IGNhdGNoIChleCkge1xuICAgICAgdGhpcy5hbGVydC5hZGRTZXJ2ZXJGYWlsdXJlKGV4KTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBzYXZlKG1vZGVsLCBwcm9wOiBBc3NldFByb3BlcnRpZXNJdGVtKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGlmIChwcm9wLnR5cGUgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIG1vZGVsW3Byb3Aua2V5XSA9IGF3YWl0IHRoaXMudXBsb2FkRmlsZXMobW9kZWxbcHJvcC5rZXldLCBwcm9wLnZhbHVlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG1vZGVsID0gYXdhaXQgdGhpcy51cGxvYWRGaWxlcyhtb2RlbCwgcHJvcC52YWx1ZSk7XG4gICAgICB9XG5cbiAgICAgIC8vIEF2b2lkIG1ha2luZyBhIFBVVCByZXF1ZXN0IGNvbnRhaW5pbmcganVzdCB0aGUgaWQsIGFzIHJlc3BvbnNlIGJvZHkgbWlnaHQgYmUgaW5jb21wbGV0ZVxuICAgICAgY29uc3QgaGFzVmFsdWVzID0gT2JqZWN0LnZhbHVlcyhtb2RlbCkuc29tZSh2YWx1ZSA9PiB2YWx1ZSAhPT0gdW5kZWZpbmVkKTtcbiAgICAgIGlmICghaGFzVmFsdWVzKSB7XG4gICAgICAgIHRoaXMudG9nZ2xlRWRpdChwcm9wKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB1cGRhdGVkQXNzZXQgPSB7IGlkOiB0aGlzLmFzc2V0LmlkLCAuLi5tb2RlbCB9O1xuICAgICAgY29uc3QgeyBkYXRhIH0gPSBhd2FpdCB0aGlzLmludmVudG9yeS51cGRhdGUodXBkYXRlZEFzc2V0KTtcbiAgICAgIHRoaXMudG9nZ2xlRWRpdChwcm9wKTtcbiAgICAgIHRoaXMuYXNzZXQgPSBkYXRhO1xuICAgICAgdGhpcy5hc3NldENoYW5nZS5lbWl0KHRoaXMuYXNzZXQpO1xuICAgICAgYXdhaXQgdGhpcy5sb2FkQXNzZXQoKTtcbiAgICAgIHRoaXMuYWxlcnQuc3VjY2VzcyhnZXR0ZXh0KCdBc3NldCBwcm9wZXJ0aWVzIHVwZGF0ZWQuJykpO1xuICAgIH0gY2F0Y2ggKGV4KSB7XG4gICAgICB0aGlzLmFsZXJ0LmFkZFNlcnZlckZhaWx1cmUoZXgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUga2VlcE9yZGVyKGNvcnJlY3RPcmRlcmVkSWRzLCBwcm9wZXJ0aWVzKSB7XG4gICAgY29uc3Qgb3JkZXJlZFByb3BlcnRpZXMgPSBjb3JyZWN0T3JkZXJlZElkcy5tYXAoKHsgaWQgfSkgPT4ge1xuICAgICAgY29uc3QgZm91bmRQcm9wZXJ0eSA9IHByb3BlcnRpZXMuZmluZChwcm9wZXJ0eSA9PiBwcm9wZXJ0eS5pZCA9PT0gaWQpO1xuICAgICAgaWYgKCFmb3VuZFByb3BlcnR5KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignQ3VzdG9tIHByb3BlcnR5IG1pc21hdGNoJyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZm91bmRQcm9wZXJ0eTtcbiAgICB9KTtcbiAgICByZXR1cm4gb3JkZXJlZFByb3BlcnRpZXM7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHVwbG9hZEZpbGVzKG1vZGVsOiBvYmplY3QsIG1vSWQ/OiBJTWFuYWdlZE9iamVjdEJpbmFyeVtdKTogUHJvbWlzZTxvYmplY3Q+IHtcbiAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMobW9kZWwpO1xuICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KG1vZGVsW2tleV0pICYmIG1vZGVsW2tleV1bMF0/LmZpbGUgaW5zdGFuY2VvZiBGaWxlKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgdXBsb2FkID0gYXdhaXQgdGhpcy5pbnZlbnRvcnlCaW5hcnkuY3JlYXRlKG1vZGVsW2tleV1bMF0uZmlsZSk7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmIChtb0lkICYmIG1vSWRbMF0pIHtcbiAgICAgICAgICAgICAgYXdhaXQgdGhpcy5pbnZlbnRvcnkuY2hpbGRBZGRpdGlvbnNSZW1vdmUobW9JZFswXSwgdGhpcy5hc3NldC5pZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBjYXRjaCAoZXgpIHtcbiAgICAgICAgICAgIHRoaXMuYWxlcnQuYWRkU2VydmVyRmFpbHVyZShleCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIG1vZGVsW2tleV0gPSB1cGxvYWQuZGF0YS5pZDtcbiAgICAgICAgICBhd2FpdCB0aGlzLmludmVudG9yeS5jaGlsZEFkZGl0aW9uc0FkZCh1cGxvYWQuZGF0YS5pZCwgdGhpcy5hc3NldC5pZCk7XG4gICAgICAgIH0gY2F0Y2ggKGV4KSB7XG4gICAgICAgICAgdGhpcy5hbGVydC5hZGRTZXJ2ZXJGYWlsdXJlKGV4KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbW9kZWw7XG4gIH1cblxuICBwcml2YXRlIHNldEl0ZW1SZXF1aXJlZChpdGVtOiBBc3NldFByb3BlcnRpZXNJdGVtLCBtbzogSU1hbmFnZWRPYmplY3QpOiB2b2lkIHtcbiAgICBjb25zdCBpc0Fzc2V0UHJvcGVydHlSZXF1aXJlZCA9ICEhdGhpcy5hc3NldFR5cGU/LmM4eV9Jc0Fzc2V0VHlwZT8ucHJvcGVydGllcy5maW5kKFxuICAgICAgcCA9PiBwLmlkID09PSBtby5pZFxuICAgICk/LmlzUmVxdWlyZWQ7XG4gICAgaWYgKCFpc0Fzc2V0UHJvcGVydHlSZXF1aXJlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBpc0NvbXBsZXhQcm9wZXJ0eSA9ICEhaXRlbT8uY29tcGxleD8ubGVuZ3RoO1xuICAgIGlmIChpc0NvbXBsZXhQcm9wZXJ0eSkge1xuICAgICAgY29uc3QgY29tcGxleFByb3BlcnR5ID0gaXRlbS5qc29uU2NoZW1hPy5wcm9wZXJ0aWVzPy5bbW8uYzh5X0pzb25TY2hlbWEua2V5XSBhcyBKU09OU2NoZW1hNztcbiAgICAgIGNvbXBsZXhQcm9wZXJ0eS5yZXF1aXJlZCA9IGl0ZW0uY29tcGxleC5tYXAoKHsga2V5IH0pID0+IGtleSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGl0ZW0uanNvblNjaGVtYS5yZXF1aXJlZCA9IFttby5jOHlfSnNvblNjaGVtYS5rZXldO1xuICAgIH1cbiAgfVxufVxuIiwiPG5nLWNvbnRhaW5lcj5cbiAgPGRpdiBjbGFzcz1cImNhcmQtaGVhZGVyIGJnLWluaGVyaXQgc2VwYXJhdG9yIHN0aWNreS10b3BcIj5cbiAgICA8aDFcbiAgICAgIGNsYXNzPVwiY2FyZC10aXRsZSBwLXQtNCBwLWItNFwiXG4gICAgICBuZ05vbkJpbmRhYmxlXG4gICAgICB0cmFuc2xhdGVcbiAgICAgIFt0cmFuc2xhdGVQYXJhbXNdPVwieyBsYWJlbDogYXNzZXRUeXBlPy5sYWJlbCB8fCAnJyB8IGh1bWFuaXplIH1cIlxuICAgID5cbiAgICAgIHt7IGxhYmVsIH19IHByb3BlcnRpZXNcbiAgICA8L2gxPlxuICA8L2Rpdj5cbiAgPGRpdiBjbGFzcz1cImNhcmQtYmxvY2tcIj5cbiAgICA8ZGl2IGNsYXNzPVwidGV4dC1jZW50ZXJcIiAqbmdJZj1cImlzTG9hZGluZ1wiPlxuICAgICAgPGM4eS1sb2FkaW5nPjwvYzh5LWxvYWRpbmc+XG4gICAgPC9kaXY+XG5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWlzTG9hZGluZ1wiPlxuICAgICAgPGRpdlxuICAgICAgICBjbGFzcz1cImNhcmQgbS1iLThcIlxuICAgICAgICAqbmdGb3I9XCJsZXQgcHJvcCBvZiBjdXN0b21Qcm9wZXJ0aWVzXCJcbiAgICAgICAgW25nQ2xhc3NdPVwieyAnY2FyZC1oaWdobGlnaHQnOiBwcm9wLmlzRWRpdCB9XCJcbiAgICAgICAgdGl0bGU9XCJ7eyBwcm9wLmRlc2NyaXB0aW9uIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgID5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtYmxvY2tcIiBbbmdDbGFzc109XCJ7ICdwLWItMCc6IHByb3AuaXNFZGl0IH1cIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IHAtYi04IGEtaS1jZW50ZXJcIiAqbmdJZj1cIiFwcm9wLmlzRWRpdFwiPlxuICAgICAgICAgICAgPHAgY2xhc3M9XCJ0ZXh0LW1lZGl1bVwiPnt7IHByb3A/LmxhYmVsIHwgaHVtYW5pemUgfX08L3A+XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1kb3QgbS1sLWF1dG8gdGV4dC0xMlwiXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICB0b29sdGlwPVwie3sgJ0VkaXQnIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInRWRpdCcgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICBbZGVsYXldPVwiNTAwXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZUVkaXQocHJvcClcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8aSBjOHlJY29uPVwicGVuY2lsXCI+PC9pPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGM4eS1hc3NldC1wcm9wZXJ0aWVzLWl0ZW1cbiAgICAgICAgICAgICNhc3NldFByb3BzXG4gICAgICAgICAgICBbZmlsZV09XCJwcm9wLmZpbGVcIlxuICAgICAgICAgICAgW2tleV09XCJwcm9wLmtleVwiXG4gICAgICAgICAgICBbdHlwZV09XCJwcm9wLnR5cGVcIlxuICAgICAgICAgICAgW3ZhbHVlXT1cInByb3AudmFsdWVcIlxuICAgICAgICAgICAgW2NvbXBsZXhdPVwicHJvcC5jb21wbGV4XCJcbiAgICAgICAgICAgIFtpc0VkaXRdPVwicHJvcC5pc0VkaXRcIlxuICAgICAgICAgICAgW2pzb25TY2hlbWFdPVwicHJvcC5qc29uU2NoZW1hXCJcbiAgICAgICAgICA+PC9jOHktYXNzZXQtcHJvcGVydGllcy1pdGVtPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtZm9vdGVyIHAtdC0wXCIgKm5nSWY9XCJwcm9wLmlzRWRpdFwiPlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1kZWZhdWx0IGJ0bi1zbVwiXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIHRpdGxlPVwie3sgJ0NhbmNlbCcgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZUVkaXQocHJvcClcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIHt7ICdDYW5jZWwnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLXByaW1hcnkgYnRuLXNtXCJcbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgdGl0bGU9XCJ7eyAnU2F2ZScgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFhc3NldFByb3BzPy5mb3JtPy52YWxpZFwiXG4gICAgICAgICAgICAoY2xpY2spPVwic2F2ZShhc3NldFByb3BzLm1vZGVsLCBwcm9wKVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAge3sgJ1NhdmUnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9uZy1jb250YWluZXI+XG4gIDwvZGl2PlxuPC9uZy1jb250YWluZXI+XG4iXX0=
193
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNzZXQtcHJvcGVydGllcy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zdWItYXNzZXRzL2Fzc2V0LXByb3BlcnRpZXMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vc3ViLWFzc2V0cy9hc3NldC1wcm9wZXJ0aWVzLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBYSxNQUFNLEVBQWlCLE1BQU0sZUFBZSxDQUFDO0FBQ2pHLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNqRCxPQUFPLEVBR0wsc0JBQXNCLEVBQ3RCLGdCQUFnQixFQUNqQixNQUFNLGFBQWEsQ0FBQztBQUNyQixPQUFPLEVBQUUsWUFBWSxFQUFFLGlCQUFpQixFQUFFLG1CQUFtQixFQUFFLE9BQU8sRUFBRSxNQUFNLHFCQUFxQixDQUFDOzs7Ozs7OztBQVFwRyxNQUFNLE9BQU8sd0JBQXdCO0lBWW5DLFlBQ1UsVUFBNkIsRUFDN0IsU0FBMkIsRUFDM0IsZUFBdUMsRUFDdkMsS0FBbUIsRUFDbkIsbUJBQXdDLEVBQ3hDLGNBQThCO1FBTDlCLGVBQVUsR0FBVixVQUFVLENBQW1CO1FBQzdCLGNBQVMsR0FBVCxTQUFTLENBQWtCO1FBQzNCLG9CQUFlLEdBQWYsZUFBZSxDQUF3QjtRQUN2QyxVQUFLLEdBQUwsS0FBSyxDQUFjO1FBQ25CLHdCQUFtQixHQUFuQixtQkFBbUIsQ0FBcUI7UUFDeEMsbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBaEI5QixnQkFBVyxHQUFHLElBQUksWUFBWSxFQUFrQixDQUFDO1FBRzNELGVBQVUsR0FBcUIsRUFBRSxDQUFDO1FBR2xDLHFCQUFnQixHQUEwQixFQUFFLENBQUM7UUFDN0MsV0FBTSxHQUFHLEtBQUssQ0FBQztRQUNmLGNBQVMsR0FBRyxLQUFLLENBQUM7SUFTZixDQUFDO0lBRUosV0FBVyxD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QUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7U0FDL0Q7YUFBTTtZQUNMLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxHQUFHLENBQUMsRUFBRSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQztTQUNwRDtJQUNILENBQUM7O3FIQXZMVSx3QkFBd0I7eUdBQXhCLHdCQUF3QixnTENoQnJDLGk3RUF5RUE7MkZEekRhLHdCQUF3QjtrQkFKcEMsU0FBUzsrQkFDRSxzQkFBc0I7c1FBSXZCLEtBQUs7c0JBQWIsS0FBSztnQkFDSSxXQUFXO3NCQUFwQixNQUFNO2dCQUdQLFVBQVU7c0JBRFQsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25DaGFuZ2VzLCBPdXRwdXQsIFNpbXBsZUNoYW5nZXMgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7XG4gIElNYW5hZ2VkT2JqZWN0LFxuICBJTWFuYWdlZE9iamVjdEJpbmFyeSxcbiAgSW52ZW50b3J5QmluYXJ5U2VydmljZSxcbiAgSW52ZW50b3J5U2VydmljZVxufSBmcm9tICdAYzh5L2NsaWVudCc7XG5pbXBvcnQgeyBBbGVydFNlcnZpY2UsIEFzc2V0VHlwZXNTZXJ2aWNlLCBDb250ZXh0Um91dGVTZXJ2aWNlLCBnZXR0ZXh0IH0gZnJvbSAnQGM4eS9uZ3gtY29tcG9uZW50cyc7XG5pbXBvcnQgeyBBc3NldFByb3BlcnRpZXNJdGVtIH0gZnJvbSAnLi9hc3NldC1wcm9wZXJ0aWVzLm1vZGVsJztcbmltcG9ydCB7IEpTT05TY2hlbWE3IH0gZnJvbSAnanNvbi1zY2hlbWEnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjOHktYXNzZXQtcHJvcGVydGllcycsXG4gIHRlbXBsYXRlVXJsOiAnLi9hc3NldC1wcm9wZXJ0aWVzLmNvbXBvbmVudC5odG1sJ1xufSlcbmV4cG9ydCBjbGFzcyBBc3NldFByb3BlcnRpZXNDb21wb25lbnQgaW1wbGVtZW50cyBPbkNoYW5nZXMge1xuICBASW5wdXQoKSBhc3NldDogSU1hbmFnZWRPYmplY3Q7XG4gIEBPdXRwdXQoKSBhc3NldENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8SU1hbmFnZWRPYmplY3Q+KCk7XG5cbiAgQElucHV0KClcbiAgcHJvcGVydGllczogSU1hbmFnZWRPYmplY3RbXSA9IFtdO1xuXG4gIGFzc2V0VHlwZTogSU1hbmFnZWRPYmplY3Q7XG4gIGN1c3RvbVByb3BlcnRpZXM6IEFzc2V0UHJvcGVydGllc0l0ZW1bXSA9IFtdO1xuICBpc0VkaXQgPSBmYWxzZTtcbiAgaXNMb2FkaW5nID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBhc3NldFR5cGVzOiBBc3NldFR5cGVzU2VydmljZSxcbiAgICBwcml2YXRlIGludmVudG9yeTogSW52ZW50b3J5U2VydmljZSxcbiAgICBwcml2YXRlIGludmVudG9yeUJpbmFyeTogSW52ZW50b3J5QmluYXJ5U2VydmljZSxcbiAgICBwcml2YXRlIGFsZXJ0OiBBbGVydFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBjb250ZXh0Um91dGVTZXJ2aWNlOiBDb250ZXh0Um91dGVTZXJ2aWNlLFxuICAgIHByaXZhdGUgYWN0aXZhdGVkUm91dGU6IEFjdGl2YXRlZFJvdXRlXG4gICkge31cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKGNoYW5nZXMuYXNzZXQpIHtcbiAgICAgIC8vIEJhY2sgYnV0dG9uIGhhbmRsaW5nLCBhcyBjb21wb25lbnQgaXMgbm90IGRlc3Ryb3llZFxuICAgICAgdGhpcy5hc3NldFR5cGUgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLmN1c3RvbVByb3BlcnRpZXMgPSBbXTtcbiAgICAgIHRoaXMubG9hZEFzc2V0KCk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgbG9hZEFzc2V0KCkge1xuICAgIHRoaXMuaXNMb2FkaW5nID0gdHJ1ZTtcbiAgICB0aGlzLmFzc2V0VHlwZSA9IHRoaXMuYXNzZXRUeXBlcy5nZXRBc3NldFR5cGVCeU5hbWUodGhpcy5hc3NldC50eXBlKTtcbiAgICB0cnkge1xuICAgICAgdGhpcy5wcm9wZXJ0aWVzID0gdGhpcy5rZWVwT3JkZXIoXG4gICAgICAgIHRoaXMuYXNzZXRUeXBlPy5jOHlfSXNBc3NldFR5cGU/LnByb3BlcnRpZXMsXG4gICAgICAgIHRoaXMucHJvcGVydGllc1xuICAgICAgKTtcbiAgICB9IGNhdGNoIChleCkge1xuICAgICAgY29uc29sZS53YXJuKGV4KTtcbiAgICB9XG4gICAgdGhpcy5jdXN0b21Qcm9wZXJ0aWVzID0gYXdhaXQgdGhpcy5yZXNvbHZlQ3VzdG9tUHJvcGVydGllcyh0aGlzLnByb3BlcnRpZXMpO1xuICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7XG4gIH1cblxuICBhc3luYyByZXNvbHZlQ3VzdG9tUHJvcGVydGllcyhtYW5hZ2VkT2JqZWN0czogSU1hbmFnZWRPYmplY3RbXSkge1xuICAgIGNvbnN0IHByb3BlcnRpZXMgPSBbXTtcbiAgICBmb3IgKGNvbnN0IG1vIG9mIG1hbmFnZWRPYmplY3RzKSB7XG4gICAgICBpZiAobW8uYzh5X0pzb25TY2hlbWEpIHtcbiAgICAgICAgY29uc3QgW2l0ZW1dID0gYXdhaXQgdGhpcy5wYXJzZUl0ZW0obW8sIG1vLmM4eV9Kc29uU2NoZW1hLnByb3BlcnRpZXMsIHRoaXMuYXNzZXQpO1xuICAgICAgICB0aGlzLnNldEl0ZW1SZXF1aXJlZChpdGVtLCBtbyk7XG4gICAgICAgIHByb3BlcnRpZXMucHVzaChpdGVtKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHByb3BlcnRpZXM7XG4gIH1cblxuICBhc3luYyBwYXJzZUl0ZW0obW86IElNYW5hZ2VkT2JqZWN0LCBwcm9wZXJ0aWVzLCBhc3NldCk6IFByb21pc2U8QXNzZXRQcm9wZXJ0aWVzSXRlbVtdPiB7XG4gICAgaWYgKCFhc3NldCkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMocHJvcGVydGllcyk7XG4gICAgY29uc3QgaXRlbXM6IEFzc2V0UHJvcGVydGllc0l0ZW1bXSA9IFtdO1xuICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcbiAgICAgIGxldCB2YWx1ZSA9IGFzc2V0W2tleV07XG4gICAgICBjb25zdCB0eXBlID0gcHJvcGVydGllc1trZXldLnR5cGU7XG4gICAgICBjb25zdCB0aXRsZSA9IHByb3BlcnRpZXNba2V5XS50aXRsZTtcbiAgICAgIGxldCBmaWxlO1xuICAgICAgaWYgKHR5cGUgPT09ICdmaWxlJyAmJiB2YWx1ZSkge1xuICAgICAgICBjb25zdCBmaWxlSWQgPSB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnID8gdmFsdWVbMF0/LmZpbGU/LmlkIDogdmFsdWU7XG4gICAgICAgIGNvbnN0IGZpbGVEYXRhID0gYXdhaXQgdGhpcy5nZXRGaWxlTWFuYWdlZE9iamVjdChmaWxlSWQpO1xuICAgICAgICBmaWxlID0gZmlsZURhdGE7XG4gICAgICAgIHZhbHVlID0gW2ZpbGVEYXRhXTtcbiAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ2RhdGUnKSB7XG4gICAgICAgIGNvbnN0IHZhbHVlRGF0ZSA9IG5ldyBEYXRlKHZhbHVlKTtcbiAgICAgICAgdmFsdWUgPSAhaXNOYU4odmFsdWVEYXRlLmdldFRpbWUoKSkgPyB2YWx1ZURhdGUgOiBudWxsO1xuICAgICAgfVxuICAgICAgaXRlbXMucHVzaCh7XG4gICAgICAgIGtleSxcbiAgICAgICAgdmFsdWUsXG4gICAgICAgIGxhYmVsOiB0aXRsZSB8fCBtby5sYWJlbCxcbiAgICAgICAgdHlwZSxcbiAgICAgICAgZGVzY3JpcHRpb246IG1vLmRlc2NyaXB0aW9uLFxuICAgICAgICBmaWxlLFxuICAgICAgICBjb21wbGV4OlxuICAgICAgICAgIHR5cGUgPT09ICdvYmplY3QnXG4gICAgICAgICAgICA/IGF3YWl0IHRoaXMucGFyc2VJdGVtKG1vLCBwcm9wZXJ0aWVzW2tleV0ucHJvcGVydGllcywgYXNzZXRba2V5XSlcbiAgICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICBpc0VkaXQ6IGZhbHNlLFxuICAgICAgICBqc29uU2NoZW1hOiBtby5jOHlfSnNvblNjaGVtYVxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBpdGVtcztcbiAgfVxuXG4gIHRvZ2dsZUVkaXQocHJvcDogQXNzZXRQcm9wZXJ0aWVzSXRlbSkge1xuICAgIHByb3AuaXNFZGl0ID0gIXByb3AuaXNFZGl0O1xuICB9XG5cbiAgYXN5bmMgZ2V0RmlsZU1hbmFnZWRPYmplY3QoaWQ6IHN0cmluZykge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB7IGRhdGEgfSA9IGF3YWl0IHRoaXMuaW52ZW50b3J5LmRldGFpbChpZCk7XG4gICAgICByZXR1cm4gZGF0YTtcbiAgICB9IGNhdGNoIChleCkge1xuICAgICAgdGhpcy5hbGVydC5hZGRTZXJ2ZXJGYWlsdXJlKGV4KTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBzYXZlKG1vZGVsLCBwcm9wOiBBc3NldFByb3BlcnRpZXNJdGVtKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGlmIChwcm9wLnR5cGUgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIG1vZGVsW3Byb3Aua2V5XSA9IGF3YWl0IHRoaXMudXBsb2FkRmlsZXMobW9kZWxbcHJvcC5rZXldLCBwcm9wLnZhbHVlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG1vZGVsID0gYXdhaXQgdGhpcy51cGxvYWRGaWxlcyhtb2RlbCwgcHJvcC52YWx1ZSk7XG4gICAgICB9XG5cbiAgICAgIC8vIEF2b2lkIG1ha2luZyBhIFBVVCByZXF1ZXN0IGNvbnRhaW5pbmcganVzdCB0aGUgaWQsIGFzIHJlc3BvbnNlIGJvZHkgbWlnaHQgYmUgaW5jb21wbGV0ZVxuICAgICAgY29uc3QgaGFzVmFsdWVzID0gT2JqZWN0LnZhbHVlcyhtb2RlbCkuc29tZSh2YWx1ZSA9PiB2YWx1ZSAhPT0gdW5kZWZpbmVkKTtcbiAgICAgIGlmICghaGFzVmFsdWVzKSB7XG4gICAgICAgIHRoaXMudG9nZ2xlRWRpdChwcm9wKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB1cGRhdGVkQXNzZXQgPSB7IGlkOiB0aGlzLmFzc2V0LmlkLCAuLi5tb2RlbCB9O1xuICAgICAgY29uc3QgeyBkYXRhIH0gPSBhd2FpdCB0aGlzLmludmVudG9yeS51cGRhdGUodXBkYXRlZEFzc2V0KTtcbiAgICAgIHRoaXMudG9nZ2xlRWRpdChwcm9wKTtcbiAgICAgIHRoaXMuYXNzZXQgPSBkYXRhO1xuICAgICAgdGhpcy5hc3NldENoYW5nZS5lbWl0KHRoaXMuYXNzZXQpO1xuICAgICAgYXdhaXQgdGhpcy5sb2FkQXNzZXQoKTtcbiAgICAgIHRoaXMuYWxlcnQuc3VjY2VzcyhnZXR0ZXh0KCdBc3NldCBwcm9wZXJ0aWVzIHVwZGF0ZWQuJykpO1xuICAgIH0gY2F0Y2ggKGV4KSB7XG4gICAgICB0aGlzLmFsZXJ0LmFkZFNlcnZlckZhaWx1cmUoZXgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUga2VlcE9yZGVyKGNvcnJlY3RPcmRlcmVkSWRzLCBwcm9wZXJ0aWVzKSB7XG4gICAgY29uc3Qgb3JkZXJlZFByb3BlcnRpZXMgPSBjb3JyZWN0T3JkZXJlZElkcy5tYXAoKHsgaWQgfSkgPT4ge1xuICAgICAgY29uc3QgZm91bmRQcm9wZXJ0eSA9IHByb3BlcnRpZXMuZmluZChwcm9wZXJ0eSA9PiBwcm9wZXJ0eS5pZCA9PT0gaWQpO1xuICAgICAgaWYgKCFmb3VuZFByb3BlcnR5KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignQ3VzdG9tIHByb3BlcnR5IG1pc21hdGNoJyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZm91bmRQcm9wZXJ0eTtcbiAgICB9KTtcbiAgICByZXR1cm4gb3JkZXJlZFByb3BlcnRpZXM7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHVwbG9hZEZpbGVzKG1vZGVsOiBvYmplY3QsIG1vSWQ/OiBJTWFuYWdlZE9iamVjdEJpbmFyeVtdKTogUHJvbWlzZTxvYmplY3Q+IHtcbiAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMobW9kZWwpO1xuICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KG1vZGVsW2tleV0pICYmIG1vZGVsW2tleV1bMF0/LmZpbGUgaW5zdGFuY2VvZiBGaWxlKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgdXBsb2FkID0gYXdhaXQgdGhpcy5pbnZlbnRvcnlCaW5hcnkuY3JlYXRlKG1vZGVsW2tleV1bMF0uZmlsZSk7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmIChtb0lkICYmIG1vSWRbMF0pIHtcbiAgICAgICAgICAgICAgYXdhaXQgdGhpcy5pbnZlbnRvcnkuY2hpbGRBZGRpdGlvbnNSZW1vdmUobW9JZFswXSwgdGhpcy5hc3NldC5pZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBjYXRjaCAoZXgpIHtcbiAgICAgICAgICAgIHRoaXMuYWxlcnQuYWRkU2VydmVyRmFpbHVyZShleCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIG1vZGVsW2tleV0gPSB1cGxvYWQuZGF0YS5pZDtcbiAgICAgICAgICBhd2FpdCB0aGlzLmludmVudG9yeS5jaGlsZEFkZGl0aW9uc0FkZCh1cGxvYWQuZGF0YS5pZCwgdGhpcy5hc3NldC5pZCk7XG4gICAgICAgIH0gY2F0Y2ggKGV4KSB7XG4gICAgICAgICAgdGhpcy5hbGVydC5hZGRTZXJ2ZXJGYWlsdXJlKGV4KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbW9kZWw7XG4gIH1cblxuICBwcml2YXRlIHNldEl0ZW1SZXF1aXJlZChpdGVtOiBBc3NldFByb3BlcnRpZXNJdGVtLCBtbzogSU1hbmFnZWRPYmplY3QpOiB2b2lkIHtcbiAgICBjb25zdCBpc0Fzc2V0UHJvcGVydHlSZXF1aXJlZCA9ICEhdGhpcy5hc3NldFR5cGU/LmM4eV9Jc0Fzc2V0VHlwZT8ucHJvcGVydGllcy5maW5kKFxuICAgICAgcCA9PiBwLmlkID09PSBtby5pZFxuICAgICk/LmlzUmVxdWlyZWQ7XG4gICAgaWYgKCFpc0Fzc2V0UHJvcGVydHlSZXF1aXJlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBpc0NvbXBsZXhQcm9wZXJ0eSA9ICEhaXRlbT8uY29tcGxleD8ubGVuZ3RoO1xuICAgIGlmIChpc0NvbXBsZXhQcm9wZXJ0eSkge1xuICAgICAgY29uc3QgY29tcGxleFByb3BlcnR5ID0gaXRlbS5qc29uU2NoZW1hPy5wcm9wZXJ0aWVzPy5bbW8uYzh5X0pzb25TY2hlbWEua2V5XSBhcyBKU09OU2NoZW1hNztcbiAgICAgIGNvbXBsZXhQcm9wZXJ0eS5yZXF1aXJlZCA9IGl0ZW0uY29tcGxleC5tYXAoKHsga2V5IH0pID0+IGtleSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGl0ZW0uanNvblNjaGVtYS5yZXF1aXJlZCA9IFttby5jOHlfSnNvblNjaGVtYS5rZXldO1xuICAgIH1cbiAgfVxufVxuIiwiPG5nLWNvbnRhaW5lcj5cbiAgPGRpdiBjbGFzcz1cImNhcmQtaGVhZGVyIGJnLWluaGVyaXQgc2VwYXJhdG9yIHN0aWNreS10b3BcIj5cbiAgICA8aDFcbiAgICAgIGNsYXNzPVwiY2FyZC10aXRsZSBwLXQtNCBwLWItNFwiXG4gICAgICBuZ05vbkJpbmRhYmxlXG4gICAgICB0cmFuc2xhdGVcbiAgICAgIFt0cmFuc2xhdGVQYXJhbXNdPVwieyBsYWJlbDogYXNzZXRUeXBlPy5sYWJlbCB8fCAnJyB8IHRyYW5zbGF0ZSB9XCJcbiAgICA+XG4gICAgICB7eyBsYWJlbCB9fSBwcm9wZXJ0aWVzXG4gICAgPC9oMT5cbiAgPC9kaXY+XG4gIDxkaXYgY2xhc3M9XCJjYXJkLWJsb2NrXCI+XG4gICAgPGRpdiBjbGFzcz1cInRleHQtY2VudGVyXCIgKm5nSWY9XCJpc0xvYWRpbmdcIj5cbiAgICAgIDxjOHktbG9hZGluZz48L2M4eS1sb2FkaW5nPlxuICAgIDwvZGl2PlxuXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFpc0xvYWRpbmdcIj5cbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCJjYXJkIG0tYi04XCJcbiAgICAgICAgKm5nRm9yPVwibGV0IHByb3Agb2YgY3VzdG9tUHJvcGVydGllc1wiXG4gICAgICAgIFtuZ0NsYXNzXT1cInsgJ2NhcmQtaGlnaGxpZ2h0JzogcHJvcC5pc0VkaXQgfVwiXG4gICAgICAgIHRpdGxlPVwie3sgcHJvcC5kZXNjcmlwdGlvbiB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICA+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWJsb2NrXCIgW25nQ2xhc3NdPVwieyAncC1iLTAnOiBwcm9wLmlzRWRpdCB9XCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBwLWItOCBhLWktY2VudGVyXCIgKm5nSWY9XCIhcHJvcC5pc0VkaXRcIj5cbiAgICAgICAgICAgIDxwIHRpdGxlPVwie3sgcHJvcD8ubGFiZWwgfCB0cmFuc2xhdGUgfX1cIiBjbGFzcz1cInRleHQtbWVkaXVtIHRleHQtdHJ1bmNhdGVcIj5cbiAgICAgICAgICAgICAge3sgcHJvcD8ubGFiZWwgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLWRvdCBtLWwtYXV0byB0ZXh0LTEyXCJcbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIHRvb2x0aXA9XCJ7eyAnRWRpdCcgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidFZGl0JyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgIFtkZWxheV09XCI1MDBcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlRWRpdChwcm9wKVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxpIGM4eUljb249XCJwZW5jaWxcIj48L2k+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8Yzh5LWFzc2V0LXByb3BlcnRpZXMtaXRlbVxuICAgICAgICAgICAgI2Fzc2V0UHJvcHNcbiAgICAgICAgICAgIFtmaWxlXT1cInByb3AuZmlsZVwiXG4gICAgICAgICAgICBba2V5XT1cInByb3Aua2V5XCJcbiAgICAgICAgICAgIFt0eXBlXT1cInByb3AudHlwZVwiXG4gICAgICAgICAgICBbdmFsdWVdPVwicHJvcC52YWx1ZVwiXG4gICAgICAgICAgICBbY29tcGxleF09XCJwcm9wLmNvbXBsZXhcIlxuICAgICAgICAgICAgW2lzRWRpdF09XCJwcm9wLmlzRWRpdFwiXG4gICAgICAgICAgICBbanNvblNjaGVtYV09XCJwcm9wLmpzb25TY2hlbWFcIlxuICAgICAgICAgID48L2M4eS1hc3NldC1wcm9wZXJ0aWVzLWl0ZW0+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1mb290ZXIgcC10LTBcIiAqbmdJZj1cInByb3AuaXNFZGl0XCI+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLWRlZmF1bHQgYnRuLXNtXCJcbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgdGl0bGU9XCJ7eyAnQ2FuY2VsJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlRWRpdChwcm9wKVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAge3sgJ0NhbmNlbCcgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICBjbGFzcz1cImJ0biBidG4tcHJpbWFyeSBidG4tc21cIlxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICB0aXRsZT1cInt7ICdTYXZlJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiIWFzc2V0UHJvcHM/LmZvcm0/LnZhbGlkXCJcbiAgICAgICAgICAgIChjbGljayk9XCJzYXZlKGFzc2V0UHJvcHMubW9kZWwsIHByb3ApXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICB7eyAnU2F2ZScgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgPC9kaXY+XG48L25nLWNvbnRhaW5lcj5cbiJdfQ==
@@ -9,15 +9,19 @@ import * as i4 from '@c8y/ngx-components';
9
9
  import { gettext, HumanizePipe, C8yValidators, CoreModule } from '@c8y/ngx-components';
10
10
  import { get, isEmpty } from 'lodash-es';
11
11
  import { pathToDatapointLibrary, DATAPOINT_LIBRARY_CONFIG } from '@c8y/ngx-components/datapoint-library/model';
12
- import * as i8 from 'ngx-bootstrap/popover';
12
+ import * as i9 from 'ngx-bootstrap/popover';
13
13
  import { PopoverModule } from 'ngx-bootstrap/popover';
14
+ import * as i10 from 'ngx-bootstrap/tooltip';
15
+ import { TooltipModule } from 'ngx-bootstrap/tooltip';
16
+ import * as i7 from '@c8y/ngx-components/datapoint-selector';
17
+ import { DatapointSelectorModule } from '@c8y/ngx-components/datapoint-selector';
14
18
  import * as i2 from '@c8y/client';
15
19
  import * as i5 from '@ngx-translate/core';
16
20
  import * as i6 from '@c8y/ngx-components/datapoint-library/services';
17
- import * as i7 from '@angular/common';
21
+ import * as i8 from '@angular/common';
18
22
 
19
23
  class DatapointLibraryDetailsComponent {
20
- constructor(activatedRoute, inventory, formBuilder, alertService, router, translate, colorService, parser, config) {
24
+ constructor(activatedRoute, inventory, formBuilder, alertService, router, translate, colorService, parser, datapointSelectorService, config) {
21
25
  this.activatedRoute = activatedRoute;
22
26
  this.inventory = inventory;
23
27
  this.formBuilder = formBuilder;
@@ -26,11 +30,12 @@ class DatapointLibraryDetailsComponent {
26
30
  this.translate = translate;
27
31
  this.colorService = colorService;
28
32
  this.parser = parser;
33
+ this.datapointSelectorService = datapointSelectorService;
29
34
  this.config = config;
30
35
  this.path = pathToDatapointLibrary;
31
36
  this.isLoading = true;
32
37
  this.rangeConfig = {};
33
- this.initForm();
38
+ this.formGroup = this.initForm();
34
39
  }
35
40
  ngOnInit() {
36
41
  this.routeSub = this.activatedRoute.parent.data.subscribe(data => {
@@ -81,6 +86,31 @@ class DatapointLibraryDetailsComponent {
81
86
  const kpiValues = this.extractKpiValuesFromFormValue(this.formGroup.value);
82
87
  this.rangeConfig = Object.assign({ orientation: 'horizontal' }, kpiValues);
83
88
  }
89
+ pickDatapoint() {
90
+ return __awaiter(this, void 0, void 0, function* () {
91
+ try {
92
+ const datapoints = yield this.datapointSelectorService.selectDataPoints({
93
+ finishWithFirstSelection: true,
94
+ ignoreDatapointTemplates: true,
95
+ guessDatapointUnit: false
96
+ });
97
+ if (datapoints.length) {
98
+ const datapoint = datapoints[0];
99
+ this.formGroup.patchValue({
100
+ fragment: datapoint.fragment,
101
+ series: datapoint.series,
102
+ color: datapoint.color,
103
+ label: datapoint.label
104
+ });
105
+ this.formGroup.markAsTouched();
106
+ this.formGroup.markAsDirty();
107
+ }
108
+ }
109
+ catch (_e) {
110
+ // modal closed
111
+ }
112
+ });
113
+ }
84
114
  navigateBackToList() {
85
115
  return this.router.navigate([pathToDatapointLibrary]);
86
116
  }
@@ -170,7 +200,7 @@ class DatapointLibraryDetailsComponent {
170
200
  min: [undefined, []],
171
201
  max: [undefined, []]
172
202
  }, { validators: [C8yValidators.minMaxValidator(), C8yValidators.requireBothMinAndMax()] });
173
- this.formGroup = this.formBuilder.group({
203
+ return this.formBuilder.group({
174
204
  color: ['', [Validators.required, Validators.minLength(4)]],
175
205
  label: ['', [Validators.required, Validators.minLength(1), Validators.maxLength(120)]],
176
206
  description: ['', []],
@@ -219,13 +249,13 @@ class DatapointLibraryDetailsComponent {
219
249
  return cleanedupValues;
220
250
  }
221
251
  }
222
- DatapointLibraryDetailsComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: DatapointLibraryDetailsComponent, deps: [{ token: i1.ActivatedRoute }, { token: i2.InventoryService }, { token: i3.FormBuilder }, { token: i4.AlertService }, { token: i1.Router }, { token: i5.TranslateService }, { token: i4.ColorService }, { token: i6.DatapointParserService }, { token: DATAPOINT_LIBRARY_CONFIG, optional: true }], target: i0.ɵɵFactoryTarget.Component });
223
- DatapointLibraryDetailsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.0.6", type: DatapointLibraryDetailsComponent, isStandalone: true, selector: "c8y-datapoint-library-details", ngImport: i0, template: "<c8y-title *ngIf=\"!isLoading\">\n {{ formGroup.value?.label }}\n <small *ngIf=\"formGroup.value?.fragment && formGroup.value?.series\">\n {{ formGroup.value?.fragment }} / {{ formGroup.value?.series }}\n </small>\n</c8y-title>\n\n<c8y-breadcrumb>\n <c8y-breadcrumb-item\n [icon]=\"'c8y-tools'\"\n [label]=\"'Configuration' | translate\"\n ></c8y-breadcrumb-item>\n <c8y-breadcrumb-item\n [icon]=\"'c8y-data-points'\"\n [label]=\"'Data point library' | translate\"\n [path]=\"path\"\n ></c8y-breadcrumb-item>\n <c8y-breadcrumb-item\n [icon]=\"'c8y-data-points'\"\n [label]=\"formGroup.value?.label\"\n ></c8y-breadcrumb-item>\n</c8y-breadcrumb>\n\n<form\n (ngSubmit)=\"formGroup.valid && save(formGroup.value)\"\n (change)=\"formChange()\"\n [formGroup]=\"formGroup\"\n class=\"card content-fullpage card--grid grid__col--6-6--md grid__row--fit-auto\"\n novalidate\n>\n <div class=\"card-header large-padding separator grid__col--fullspan\">\n <div class=\"card-title\">\n {{ formGroup.value?.label }}\n </div>\n </div>\n <div *ngIf=\"!isLoading\" class=\"d-contents\">\n <div class=\"inner-scroll bg-level-0 flex-grow\">\n <div class=\"card-block large-padding\">\n <div class=\"d-flex\">\n <c8y-form-group>\n <label translate>Color</label>\n <div class=\"data-point-color form-control\">\n <div class=\"c8y-colorpicker\">\n <input\n [attr.aria-label]=\"'Color picker' | translate\"\n type=\"color\"\n name=\"color\"\n formControlName=\"color\"\n />\n <span [style.background-color]=\"formGroup.value?.color\"></span>\n </div>\n </div>\n </c8y-form-group>\n <c8y-form-group class=\"flex-grow p-l-8\">\n <label translate>Label</label>\n <input\n class=\"form-control\"\n formControlName=\"label\"\n name=\"label\"\n [placeholder]=\"'e.g. Temperature' | translate\"\n type=\"text\"\n />\n <c8y-messages\n [show]=\"formGroup.controls?.label?.touched && formGroup.controls?.label?.errors\"\n ></c8y-messages>\n </c8y-form-group>\n </div>\n <!-- TODO: add description to data point library templates -->\n <c8y-form-group>\n <label translate>Description</label>\n <textarea\n class=\"form-control\"\n formControlName=\"description\"\n name=\"description\"\n [placeholder]=\"'e.g. Ambient Temperature in Celsius' | translate\"\n rows=\"3\"\n ></textarea>\n </c8y-form-group>\n\n <div class=\"row\">\n <div class=\"col-sm-6\">\n <c8y-form-group>\n <label translate>Fragment</label>\n <input\n class=\"form-control\"\n name=\"fragment\"\n formControlName=\"fragment\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: 'c8y_Temperature' }\"\n type=\"text\"\n />\n <c8y-messages\n [show]=\"\n formGroup.controls?.fragment?.touched && formGroup.controls?.fragment?.errors\n \"\n ></c8y-messages>\n </c8y-form-group>\n </div>\n\n <div class=\"col-sm-6\">\n <c8y-form-group>\n <label translate>Series</label>\n <input\n class=\"form-control\"\n formControlName=\"series\"\n name=\"series\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: 'T' }\"\n type=\"text\"\n />\n <c8y-messages\n [show]=\"formGroup.controls?.series?.touched && formGroup.controls?.series?.errors\"\n ></c8y-messages>\n </c8y-form-group>\n </div>\n </div>\n <div class=\"row\" *ngIf=\"config?.showCheckboxForGlobalFragment\">\n <div class=\"col-sm-6\">\n <c8y-form-group>\n <label class=\"c8y-checkbox\">\n <input name=\"c8y_Global\" formControlName=\"c8y_Global\" type=\"checkbox\" />\n <span></span>\n <span translate>Globally available</span>\n <button\n class=\"btn btn-clean\"\n type=\"button\"\n [attr.aria-label]=\"'Help' | translate\"\n [popover]=\"\n 'Will make this entry available to all users on the tenant if checked.'\n | translate\n \"\n placement=\"right\"\n triggers=\"focus\"\n container=\"body\"\n ></button>\n </label>\n </c8y-form-group>\n </div>\n </div>\n </div>\n </div>\n <div class=\"inner-scroll bg-level-1\">\n <div class=\"card-block large-padding\">\n <fieldset class=\"c8y-fieldset\">\n <legend translate>Preview</legend>\n <c8y-range-display [config]=\"rangeConfig\" class=\"m-b-16 d-block\"></c8y-range-display>\n </fieldset>\n <fieldset class=\"c8y-fieldset\">\n <legend translate>Range</legend>\n <div class=\"row\" formGroupName=\"range\">\n <div class=\"col-md-6\">\n <c8y-form-group\n [ngClass]=\"{ 'has-error': range?.touched && range?.controls?.min?.errors }\"\n >\n <label translate>Min</label>\n <input\n type=\"number\"\n class=\"form-control\"\n name=\"min\"\n formControlName=\"min\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: 0 }\"\n />\n <c8y-messages [show]=\"range?.touched && range.controls?.min?.errors\"></c8y-messages>\n </c8y-form-group>\n </div>\n <div class=\"col-md-6\">\n <c8y-form-group\n [ngClass]=\"{ 'has-error': range?.touched && range?.controls?.max?.errors }\"\n >\n <label translate>Max</label>\n <input\n type=\"number\"\n class=\"form-control\"\n name=\"max\"\n formControlName=\"max\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: 100 }\"\n />\n <c8y-messages [show]=\"range?.touched && range.controls?.max?.errors\"></c8y-messages>\n </c8y-form-group>\n </div>\n </div>\n <div class=\"row\">\n <div class=\"col-md-6\">\n <c8y-form-group>\n <label translate>Unit</label>\n <input\n class=\"form-control\"\n name=\"unit\"\n formControlName=\"unit\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: '\u00BAC' }\"\n />\n <c8y-messages\n [show]=\"formGroup.controls?.unit?.touched && formGroup.controls?.unit?.errors\"\n ></c8y-messages>\n </c8y-form-group>\n </div>\n\n <div class=\"col-md-6\">\n <c8y-form-group\n [ngClass]=\"{\n 'has-error':\n (range?.touched || formGroup.controls?.target?.touched) &&\n formGroup.controls?.target?.errors\n }\"\n >\n <label translate>Target</label>\n <input\n type=\"number\"\n class=\"form-control\"\n name=\"target\"\n formControlName=\"target\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: 25 }\"\n />\n <c8y-messages\n [show]=\"\n (range?.touched || formGroup.controls?.target?.touched) &&\n formGroup.controls?.target?.errors\n \"\n ></c8y-messages>\n </c8y-form-group>\n </div>\n </div>\n </fieldset>\n\n <fieldset class=\"c8y-fieldset\" formGroupName=\"yellowRange\">\n <legend translate>Yellow range</legend>\n <div class=\"row\">\n <div class=\"col-md-6\">\n <c8y-form-group\n [ngClass]=\"{\n 'has-error':\n (range?.touched || yellowRange?.touched) && yellowRange?.controls?.min?.errors\n }\"\n >\n <label translate>Min</label>\n <input\n type=\"number\"\n class=\"form-control\"\n name=\"min\"\n formControlName=\"min\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: 50 }\"\n />\n <c8y-messages\n [show]=\"\n (range?.touched || yellowRange?.touched) && yellowRange.controls?.min?.errors\n \"\n ></c8y-messages>\n </c8y-form-group>\n </div>\n\n <div class=\"col-md-6\">\n <c8y-form-group\n [ngClass]=\"{\n 'has-error':\n (range?.touched || yellowRange?.touched) && yellowRange?.controls?.max?.errors\n }\"\n >\n <label translate>Max</label>\n <input\n type=\"number\"\n class=\"form-control\"\n name=\"max\"\n formControlName=\"max\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: 75 }\"\n />\n <c8y-messages\n [show]=\"\n (range?.touched || yellowRange?.touched) && yellowRange.controls?.max?.errors\n \"\n ></c8y-messages>\n </c8y-form-group>\n </div>\n </div>\n </fieldset>\n\n <fieldset class=\"c8y-fieldset\" formGroupName=\"redRange\">\n <legend translate>Red range</legend>\n <div class=\"row\">\n <div class=\"col-md-6\">\n <c8y-form-group\n [ngClass]=\"{\n 'has-error':\n (range?.touched || redRange?.touched) && redRange?.controls?.min?.errors\n }\"\n >\n <label translate>Min</label>\n <input\n type=\"number\"\n class=\"form-control\"\n name=\"min\"\n formControlName=\"min\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: 75 }\"\n />\n <c8y-messages\n [show]=\"(range?.touched || redRange?.touched) && redRange.controls?.min?.errors\"\n ></c8y-messages>\n </c8y-form-group>\n </div>\n\n <div class=\"col-md-6\">\n <c8y-form-group\n [ngClass]=\"{\n 'has-error':\n (range?.touched || redRange?.touched) && redRange?.controls?.max?.errors\n }\"\n >\n <label translate>Max</label>\n <input\n type=\"number\"\n class=\"form-control\"\n name=\"max\"\n formControlName=\"max\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: 100 }\"\n />\n <c8y-messages\n [show]=\"(range?.touched || redRange?.touched) && redRange.controls?.max?.errors\"\n ></c8y-messages>\n </c8y-form-group>\n </div>\n </div>\n </fieldset>\n </div>\n </div>\n </div>\n <div class=\"card-footer separator grid__col--fullspan\">\n <button class=\"btn btn-default\" type=\"button\" [title]=\"'Cancel' | translate\" (click)=\"cancel()\">\n {{ 'Cancel' | translate }}\n </button>\n <button\n class=\"btn btn-primary btn-form\"\n type=\"submit\"\n [title]=\"'Save' | translate\"\n *c8yIfAllowed=\"['ROLE_INVENTORY_ADMIN', 'ROLE_INVENTORY_UPDATE']; allowAny: true\"\n [disabled]=\"formGroup.invalid || formGroup.pristine\"\n >\n {{ 'Save' | translate }}\n </button>\n </div>\n</form>\n", dependencies: [{ kind: "ngmodule", type: CoreModule }, { kind: "component", type: i4.BreadcrumbComponent, selector: "c8y-breadcrumb" }, { kind: "component", type: i4.BreadcrumbItemComponent, selector: "c8y-breadcrumb-item", inputs: ["icon", "translate", "label", "path", "injector"] }, { kind: "pipe", type: i4.C8yTranslatePipe, name: "translate" }, { kind: "directive", type: i4.C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "directive", type: i7.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.IfAllowedDirective, selector: "[c8yIfAllowed]", inputs: ["c8yIfAllowed", "c8yIfAllowedAllowAny"] }, { kind: "component", type: i4.TitleComponent, selector: "c8y-title", inputs: ["pageTitleUpdate"] }, { kind: "directive", type: i3.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i3.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "component", type: i4.FormGroupComponent, selector: "c8y-form-group", inputs: ["hasError", "hasWarning", "hasSuccess", "novalidation", "status"] }, { kind: "component", type: i4.MessagesComponent, selector: "c8y-messages", inputs: ["show", "defaults"] }, { kind: "directive", type: i4.RequiredInputPlaceholderDirective, selector: "input[required], input[formControlName]" }, { kind: "component", type: i4.RangeDisplayComponent, selector: "c8y-range-display", inputs: ["config", "display"] }, { kind: "directive", type: i3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i3.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i3.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { kind: "ngmodule", type: RouterModule }, { kind: "ngmodule", type: PopoverModule }, { kind: "directive", type: i8.PopoverDirective, selector: "[popover]", inputs: ["adaptivePosition", "boundariesElement", "popover", "popoverContext", "popoverTitle", "placement", "outsideClick", "triggers", "container", "containerClass", "isOpen", "delay"], outputs: ["onShown", "onHidden"], exportAs: ["bs-popover"] }] });
252
+ DatapointLibraryDetailsComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: DatapointLibraryDetailsComponent, deps: [{ token: i1.ActivatedRoute }, { token: i2.InventoryService }, { token: i3.FormBuilder }, { token: i4.AlertService }, { token: i1.Router }, { token: i5.TranslateService }, { token: i4.ColorService }, { token: i6.DatapointParserService }, { token: i7.DatapointSelectorService }, { token: DATAPOINT_LIBRARY_CONFIG, optional: true }], target: i0.ɵɵFactoryTarget.Component });
253
+ DatapointLibraryDetailsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.0.6", type: DatapointLibraryDetailsComponent, isStandalone: true, selector: "c8y-datapoint-library-details", ngImport: i0, template: "<c8y-title *ngIf=\"!isLoading\">\n {{ formGroup.value?.label }}\n <small *ngIf=\"formGroup.value?.fragment && formGroup.value?.series\">\n {{ formGroup.value?.fragment }} / {{ formGroup.value?.series }}\n </small>\n</c8y-title>\n\n<c8y-breadcrumb>\n <c8y-breadcrumb-item\n [icon]=\"'c8y-tools'\"\n [label]=\"'Configuration' | translate\"\n ></c8y-breadcrumb-item>\n <c8y-breadcrumb-item\n [icon]=\"'c8y-data-points'\"\n [label]=\"'Data point library' | translate\"\n [path]=\"path\"\n ></c8y-breadcrumb-item>\n <c8y-breadcrumb-item\n [icon]=\"'c8y-data-points'\"\n [label]=\"formGroup.value?.label\"\n ></c8y-breadcrumb-item>\n</c8y-breadcrumb>\n\n<form\n (ngSubmit)=\"formGroup.valid && save(formGroup.value)\"\n (change)=\"formChange()\"\n [formGroup]=\"formGroup\"\n class=\"card content-fullpage card--grid grid__col--6-6--md grid__row--fit-auto\"\n novalidate\n>\n <div class=\"card-header large-padding separator grid__col--fullspan\">\n <div class=\"card-title\">\n {{ formGroup.value?.label }}\n </div>\n </div>\n <div *ngIf=\"!isLoading\" class=\"d-contents\">\n <div class=\"inner-scroll bg-level-0 flex-grow\">\n <div class=\"card-block large-padding\">\n <div class=\"d-flex\">\n <c8y-form-group>\n <label translate>Color</label>\n <div class=\"data-point-color form-control\">\n <div class=\"c8y-colorpicker\">\n <input\n [attr.aria-label]=\"'Color picker' | translate\"\n type=\"color\"\n name=\"color\"\n formControlName=\"color\"\n />\n <span [style.background-color]=\"formGroup.value?.color\"></span>\n </div>\n </div>\n </c8y-form-group>\n <c8y-form-group class=\"flex-grow p-l-8\">\n <label translate>Label</label>\n <input\n class=\"form-control\"\n formControlName=\"label\"\n name=\"label\"\n [placeholder]=\"'e.g. Temperature' | translate\"\n type=\"text\"\n />\n <c8y-messages\n [show]=\"formGroup.controls?.label?.touched && formGroup.controls?.label?.errors\"\n ></c8y-messages>\n </c8y-form-group>\n </div>\n <c8y-form-group>\n <label translate>Description</label>\n <textarea\n class=\"form-control\"\n formControlName=\"description\"\n name=\"description\"\n [placeholder]=\"'e.g. Ambient Temperature in Celsius' | translate\"\n rows=\"3\"\n ></textarea>\n </c8y-form-group>\n\n <div class=\"d-flex a-i-center gap-8\">\n <c8y-form-group class=\"flex-grow\">\n <label translate>Fragment</label>\n <input\n class=\"form-control\"\n name=\"fragment\"\n formControlName=\"fragment\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: 'c8y_Temperature' }\"\n type=\"text\"\n />\n <c8y-messages\n [show]=\"formGroup.controls?.fragment?.touched && formGroup.controls?.fragment?.errors\"\n ></c8y-messages>\n </c8y-form-group>\n\n <c8y-form-group class=\"flex-grow\">\n <label translate>Series</label>\n <input\n class=\"form-control\"\n formControlName=\"series\"\n name=\"series\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: 'T' }\"\n type=\"text\"\n />\n <c8y-messages\n [show]=\"formGroup.controls?.series?.touched && formGroup.controls?.series?.errors\"\n ></c8y-messages>\n </c8y-form-group>\n <div class=\"flex-no-grow\">\n <button\n class=\"btn btn-default p-l-8 p-r-8\"\n (click)=\"pickDatapoint()\"\n type=\"button\"\n [tooltip]=\"'Load fragment and series from an existing data point' | translate\"\n [delay]=\"500\"\n [attr.aria-label]=\"'Load fragment and series from an existing data point' | translate\"\n >\n <i c8yIcon=\"eyedropper\"></i>\n </button>\n </div>\n </div>\n\n <div class=\"row\" *ngIf=\"config?.showCheckboxForGlobalFragment\">\n <div class=\"col-sm-6\">\n <c8y-form-group>\n <label class=\"c8y-checkbox\">\n <input name=\"c8y_Global\" formControlName=\"c8y_Global\" type=\"checkbox\" />\n <span></span>\n <span translate>Globally available</span>\n <button\n class=\"btn-help\"\n type=\"button\"\n [attr.aria-label]=\"'Help' | translate\"\n [popover]=\"\n 'Will make this entry available to all users on the tenant if checked.'\n | translate\n \"\n placement=\"right\"\n triggers=\"focus\"\n container=\"body\"\n ></button>\n </label>\n </c8y-form-group>\n </div>\n </div>\n </div>\n </div>\n <div class=\"inner-scroll bg-level-1\">\n <div class=\"card-block large-padding\">\n <fieldset class=\"c8y-fieldset\">\n <legend translate>Preview</legend>\n <c8y-range-display [config]=\"rangeConfig\" class=\"m-b-16 d-block\"></c8y-range-display>\n </fieldset>\n\n <fieldset class=\"c8y-fieldset\">\n <legend translate>Range</legend>\n <div class=\"row\" formGroupName=\"range\">\n <div class=\"col-md-6\">\n <c8y-form-group\n [ngClass]=\"{ 'has-error': range?.touched && range?.controls?.min?.errors }\"\n >\n <label translate>Min</label>\n <input\n type=\"number\"\n class=\"form-control\"\n name=\"min\"\n formControlName=\"min\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: 0 }\"\n />\n <c8y-messages [show]=\"range?.touched && range.controls?.min?.errors\"></c8y-messages>\n </c8y-form-group>\n </div>\n <div class=\"col-md-6\">\n <c8y-form-group\n [ngClass]=\"{ 'has-error': range?.touched && range?.controls?.max?.errors }\"\n >\n <label translate>Max</label>\n <input\n type=\"number\"\n class=\"form-control\"\n name=\"max\"\n formControlName=\"max\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: 100 }\"\n />\n <c8y-messages [show]=\"range?.touched && range.controls?.max?.errors\"></c8y-messages>\n </c8y-form-group>\n </div>\n </div>\n <div class=\"row\">\n <div class=\"col-md-6\">\n <c8y-form-group>\n <label translate>Unit</label>\n <input\n class=\"form-control\"\n name=\"unit\"\n formControlName=\"unit\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: '\u00BAC' }\"\n />\n <c8y-messages\n [show]=\"formGroup.controls?.unit?.touched && formGroup.controls?.unit?.errors\"\n ></c8y-messages>\n </c8y-form-group>\n </div>\n\n <div class=\"col-md-6\">\n <c8y-form-group\n [ngClass]=\"{\n 'has-error':\n (range?.touched || formGroup.controls?.target?.touched) &&\n formGroup.controls?.target?.errors\n }\"\n >\n <label translate>Target</label>\n <input\n type=\"number\"\n class=\"form-control\"\n name=\"target\"\n formControlName=\"target\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: 25 }\"\n />\n <c8y-messages\n [show]=\"\n (range?.touched || formGroup.controls?.target?.touched) &&\n formGroup.controls?.target?.errors\n \"\n ></c8y-messages>\n </c8y-form-group>\n </div>\n </div>\n </fieldset>\n\n <fieldset class=\"c8y-fieldset\" formGroupName=\"yellowRange\">\n <legend translate>Yellow range</legend>\n <div class=\"row\">\n <div class=\"col-md-6\">\n <c8y-form-group\n [ngClass]=\"{\n 'has-error':\n (range?.touched || yellowRange?.touched) && yellowRange?.controls?.min?.errors\n }\"\n >\n <label translate>Min</label>\n <input\n type=\"number\"\n class=\"form-control\"\n name=\"min\"\n formControlName=\"min\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: 50 }\"\n />\n <c8y-messages\n [show]=\"\n (range?.touched || yellowRange?.touched) && yellowRange.controls?.min?.errors\n \"\n ></c8y-messages>\n </c8y-form-group>\n </div>\n\n <div class=\"col-md-6\">\n <c8y-form-group\n [ngClass]=\"{\n 'has-error':\n (range?.touched || yellowRange?.touched) && yellowRange?.controls?.max?.errors\n }\"\n >\n <label translate>Max</label>\n <input\n type=\"number\"\n class=\"form-control\"\n name=\"max\"\n formControlName=\"max\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: 75 }\"\n />\n <c8y-messages\n [show]=\"\n (range?.touched || yellowRange?.touched) && yellowRange.controls?.max?.errors\n \"\n ></c8y-messages>\n </c8y-form-group>\n </div>\n </div>\n </fieldset>\n\n <fieldset class=\"c8y-fieldset\" formGroupName=\"redRange\">\n <legend translate>Red range</legend>\n <div class=\"row\">\n <div class=\"col-md-6\">\n <c8y-form-group\n [ngClass]=\"{\n 'has-error':\n (range?.touched || redRange?.touched) && redRange?.controls?.min?.errors\n }\"\n >\n <label translate>Min</label>\n <input\n type=\"number\"\n class=\"form-control\"\n name=\"min\"\n formControlName=\"min\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: 75 }\"\n />\n <c8y-messages\n [show]=\"(range?.touched || redRange?.touched) && redRange.controls?.min?.errors\"\n ></c8y-messages>\n </c8y-form-group>\n </div>\n\n <div class=\"col-md-6\">\n <c8y-form-group\n [ngClass]=\"{\n 'has-error':\n (range?.touched || redRange?.touched) && redRange?.controls?.max?.errors\n }\"\n >\n <label translate>Max</label>\n <input\n type=\"number\"\n class=\"form-control\"\n name=\"max\"\n formControlName=\"max\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: 100 }\"\n />\n <c8y-messages\n [show]=\"(range?.touched || redRange?.touched) && redRange.controls?.max?.errors\"\n ></c8y-messages>\n </c8y-form-group>\n </div>\n </div>\n </fieldset>\n </div>\n </div>\n </div>\n <div class=\"card-footer separator grid__col--fullspan\">\n <button class=\"btn btn-default\" type=\"button\" [title]=\"'Cancel' | translate\" (click)=\"cancel()\">\n {{ 'Cancel' | translate }}\n </button>\n <button\n class=\"btn btn-primary btn-form\"\n type=\"submit\"\n [title]=\"'Save' | translate\"\n *c8yIfAllowed=\"['ROLE_INVENTORY_ADMIN', 'ROLE_INVENTORY_UPDATE']; allowAny: true\"\n [disabled]=\"formGroup.invalid || formGroup.pristine\"\n >\n {{ 'Save' | translate }}\n </button>\n </div>\n</form>\n", dependencies: [{ kind: "ngmodule", type: CoreModule }, { kind: "component", type: i4.BreadcrumbComponent, selector: "c8y-breadcrumb" }, { kind: "component", type: i4.BreadcrumbItemComponent, selector: "c8y-breadcrumb-item", inputs: ["icon", "translate", "label", "path", "injector"] }, { kind: "directive", type: i4.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "pipe", type: i4.C8yTranslatePipe, name: "translate" }, { kind: "directive", type: i4.C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "directive", type: i8.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i8.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.IfAllowedDirective, selector: "[c8yIfAllowed]", inputs: ["c8yIfAllowed", "c8yIfAllowedAllowAny"] }, { kind: "component", type: i4.TitleComponent, selector: "c8y-title", inputs: ["pageTitleUpdate"] }, { kind: "directive", type: i3.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i3.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "component", type: i4.FormGroupComponent, selector: "c8y-form-group", inputs: ["hasError", "hasWarning", "hasSuccess", "novalidation", "status"] }, { kind: "component", type: i4.MessagesComponent, selector: "c8y-messages", inputs: ["show", "defaults"] }, { kind: "directive", type: i4.RequiredInputPlaceholderDirective, selector: "input[required], input[formControlName]" }, { kind: "component", type: i4.RangeDisplayComponent, selector: "c8y-range-display", inputs: ["config", "display"] }, { kind: "directive", type: i3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i3.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i3.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { kind: "ngmodule", type: RouterModule }, { kind: "ngmodule", type: PopoverModule }, { kind: "directive", type: i9.PopoverDirective, selector: "[popover]", inputs: ["adaptivePosition", "boundariesElement", "popover", "popoverContext", "popoverTitle", "placement", "outsideClick", "triggers", "container", "containerClass", "isOpen", "delay"], outputs: ["onShown", "onHidden"], exportAs: ["bs-popover"] }, { kind: "ngmodule", type: TooltipModule }, { kind: "directive", type: i10.TooltipDirective, selector: "[tooltip], [tooltipHtml]", inputs: ["adaptivePosition", "tooltip", "placement", "triggers", "container", "containerClass", "boundariesElement", "isOpen", "isDisabled", "delay", "tooltipHtml", "tooltipPlacement", "tooltipIsOpen", "tooltipEnable", "tooltipAppendToBody", "tooltipAnimation", "tooltipClass", "tooltipContext", "tooltipPopupDelay", "tooltipFadeDuration", "tooltipTrigger"], outputs: ["tooltipChange", "onShown", "onHidden", "tooltipStateChanged"], exportAs: ["bs-tooltip"] }, { kind: "ngmodule", type: DatapointSelectorModule }] });
224
254
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: DatapointLibraryDetailsComponent, decorators: [{
225
255
  type: Component,
226
- args: [{ selector: 'c8y-datapoint-library-details', standalone: true, imports: [CoreModule, RouterModule, PopoverModule], template: "<c8y-title *ngIf=\"!isLoading\">\n {{ formGroup.value?.label }}\n <small *ngIf=\"formGroup.value?.fragment && formGroup.value?.series\">\n {{ formGroup.value?.fragment }} / {{ formGroup.value?.series }}\n </small>\n</c8y-title>\n\n<c8y-breadcrumb>\n <c8y-breadcrumb-item\n [icon]=\"'c8y-tools'\"\n [label]=\"'Configuration' | translate\"\n ></c8y-breadcrumb-item>\n <c8y-breadcrumb-item\n [icon]=\"'c8y-data-points'\"\n [label]=\"'Data point library' | translate\"\n [path]=\"path\"\n ></c8y-breadcrumb-item>\n <c8y-breadcrumb-item\n [icon]=\"'c8y-data-points'\"\n [label]=\"formGroup.value?.label\"\n ></c8y-breadcrumb-item>\n</c8y-breadcrumb>\n\n<form\n (ngSubmit)=\"formGroup.valid && save(formGroup.value)\"\n (change)=\"formChange()\"\n [formGroup]=\"formGroup\"\n class=\"card content-fullpage card--grid grid__col--6-6--md grid__row--fit-auto\"\n novalidate\n>\n <div class=\"card-header large-padding separator grid__col--fullspan\">\n <div class=\"card-title\">\n {{ formGroup.value?.label }}\n </div>\n </div>\n <div *ngIf=\"!isLoading\" class=\"d-contents\">\n <div class=\"inner-scroll bg-level-0 flex-grow\">\n <div class=\"card-block large-padding\">\n <div class=\"d-flex\">\n <c8y-form-group>\n <label translate>Color</label>\n <div class=\"data-point-color form-control\">\n <div class=\"c8y-colorpicker\">\n <input\n [attr.aria-label]=\"'Color picker' | translate\"\n type=\"color\"\n name=\"color\"\n formControlName=\"color\"\n />\n <span [style.background-color]=\"formGroup.value?.color\"></span>\n </div>\n </div>\n </c8y-form-group>\n <c8y-form-group class=\"flex-grow p-l-8\">\n <label translate>Label</label>\n <input\n class=\"form-control\"\n formControlName=\"label\"\n name=\"label\"\n [placeholder]=\"'e.g. Temperature' | translate\"\n type=\"text\"\n />\n <c8y-messages\n [show]=\"formGroup.controls?.label?.touched && formGroup.controls?.label?.errors\"\n ></c8y-messages>\n </c8y-form-group>\n </div>\n <!-- TODO: add description to data point library templates -->\n <c8y-form-group>\n <label translate>Description</label>\n <textarea\n class=\"form-control\"\n formControlName=\"description\"\n name=\"description\"\n [placeholder]=\"'e.g. Ambient Temperature in Celsius' | translate\"\n rows=\"3\"\n ></textarea>\n </c8y-form-group>\n\n <div class=\"row\">\n <div class=\"col-sm-6\">\n <c8y-form-group>\n <label translate>Fragment</label>\n <input\n class=\"form-control\"\n name=\"fragment\"\n formControlName=\"fragment\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: 'c8y_Temperature' }\"\n type=\"text\"\n />\n <c8y-messages\n [show]=\"\n formGroup.controls?.fragment?.touched && formGroup.controls?.fragment?.errors\n \"\n ></c8y-messages>\n </c8y-form-group>\n </div>\n\n <div class=\"col-sm-6\">\n <c8y-form-group>\n <label translate>Series</label>\n <input\n class=\"form-control\"\n formControlName=\"series\"\n name=\"series\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: 'T' }\"\n type=\"text\"\n />\n <c8y-messages\n [show]=\"formGroup.controls?.series?.touched && formGroup.controls?.series?.errors\"\n ></c8y-messages>\n </c8y-form-group>\n </div>\n </div>\n <div class=\"row\" *ngIf=\"config?.showCheckboxForGlobalFragment\">\n <div class=\"col-sm-6\">\n <c8y-form-group>\n <label class=\"c8y-checkbox\">\n <input name=\"c8y_Global\" formControlName=\"c8y_Global\" type=\"checkbox\" />\n <span></span>\n <span translate>Globally available</span>\n <button\n class=\"btn btn-clean\"\n type=\"button\"\n [attr.aria-label]=\"'Help' | translate\"\n [popover]=\"\n 'Will make this entry available to all users on the tenant if checked.'\n | translate\n \"\n placement=\"right\"\n triggers=\"focus\"\n container=\"body\"\n ></button>\n </label>\n </c8y-form-group>\n </div>\n </div>\n </div>\n </div>\n <div class=\"inner-scroll bg-level-1\">\n <div class=\"card-block large-padding\">\n <fieldset class=\"c8y-fieldset\">\n <legend translate>Preview</legend>\n <c8y-range-display [config]=\"rangeConfig\" class=\"m-b-16 d-block\"></c8y-range-display>\n </fieldset>\n <fieldset class=\"c8y-fieldset\">\n <legend translate>Range</legend>\n <div class=\"row\" formGroupName=\"range\">\n <div class=\"col-md-6\">\n <c8y-form-group\n [ngClass]=\"{ 'has-error': range?.touched && range?.controls?.min?.errors }\"\n >\n <label translate>Min</label>\n <input\n type=\"number\"\n class=\"form-control\"\n name=\"min\"\n formControlName=\"min\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: 0 }\"\n />\n <c8y-messages [show]=\"range?.touched && range.controls?.min?.errors\"></c8y-messages>\n </c8y-form-group>\n </div>\n <div class=\"col-md-6\">\n <c8y-form-group\n [ngClass]=\"{ 'has-error': range?.touched && range?.controls?.max?.errors }\"\n >\n <label translate>Max</label>\n <input\n type=\"number\"\n class=\"form-control\"\n name=\"max\"\n formControlName=\"max\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: 100 }\"\n />\n <c8y-messages [show]=\"range?.touched && range.controls?.max?.errors\"></c8y-messages>\n </c8y-form-group>\n </div>\n </div>\n <div class=\"row\">\n <div class=\"col-md-6\">\n <c8y-form-group>\n <label translate>Unit</label>\n <input\n class=\"form-control\"\n name=\"unit\"\n formControlName=\"unit\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: '\u00BAC' }\"\n />\n <c8y-messages\n [show]=\"formGroup.controls?.unit?.touched && formGroup.controls?.unit?.errors\"\n ></c8y-messages>\n </c8y-form-group>\n </div>\n\n <div class=\"col-md-6\">\n <c8y-form-group\n [ngClass]=\"{\n 'has-error':\n (range?.touched || formGroup.controls?.target?.touched) &&\n formGroup.controls?.target?.errors\n }\"\n >\n <label translate>Target</label>\n <input\n type=\"number\"\n class=\"form-control\"\n name=\"target\"\n formControlName=\"target\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: 25 }\"\n />\n <c8y-messages\n [show]=\"\n (range?.touched || formGroup.controls?.target?.touched) &&\n formGroup.controls?.target?.errors\n \"\n ></c8y-messages>\n </c8y-form-group>\n </div>\n </div>\n </fieldset>\n\n <fieldset class=\"c8y-fieldset\" formGroupName=\"yellowRange\">\n <legend translate>Yellow range</legend>\n <div class=\"row\">\n <div class=\"col-md-6\">\n <c8y-form-group\n [ngClass]=\"{\n 'has-error':\n (range?.touched || yellowRange?.touched) && yellowRange?.controls?.min?.errors\n }\"\n >\n <label translate>Min</label>\n <input\n type=\"number\"\n class=\"form-control\"\n name=\"min\"\n formControlName=\"min\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: 50 }\"\n />\n <c8y-messages\n [show]=\"\n (range?.touched || yellowRange?.touched) && yellowRange.controls?.min?.errors\n \"\n ></c8y-messages>\n </c8y-form-group>\n </div>\n\n <div class=\"col-md-6\">\n <c8y-form-group\n [ngClass]=\"{\n 'has-error':\n (range?.touched || yellowRange?.touched) && yellowRange?.controls?.max?.errors\n }\"\n >\n <label translate>Max</label>\n <input\n type=\"number\"\n class=\"form-control\"\n name=\"max\"\n formControlName=\"max\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: 75 }\"\n />\n <c8y-messages\n [show]=\"\n (range?.touched || yellowRange?.touched) && yellowRange.controls?.max?.errors\n \"\n ></c8y-messages>\n </c8y-form-group>\n </div>\n </div>\n </fieldset>\n\n <fieldset class=\"c8y-fieldset\" formGroupName=\"redRange\">\n <legend translate>Red range</legend>\n <div class=\"row\">\n <div class=\"col-md-6\">\n <c8y-form-group\n [ngClass]=\"{\n 'has-error':\n (range?.touched || redRange?.touched) && redRange?.controls?.min?.errors\n }\"\n >\n <label translate>Min</label>\n <input\n type=\"number\"\n class=\"form-control\"\n name=\"min\"\n formControlName=\"min\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: 75 }\"\n />\n <c8y-messages\n [show]=\"(range?.touched || redRange?.touched) && redRange.controls?.min?.errors\"\n ></c8y-messages>\n </c8y-form-group>\n </div>\n\n <div class=\"col-md-6\">\n <c8y-form-group\n [ngClass]=\"{\n 'has-error':\n (range?.touched || redRange?.touched) && redRange?.controls?.max?.errors\n }\"\n >\n <label translate>Max</label>\n <input\n type=\"number\"\n class=\"form-control\"\n name=\"max\"\n formControlName=\"max\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: 100 }\"\n />\n <c8y-messages\n [show]=\"(range?.touched || redRange?.touched) && redRange.controls?.max?.errors\"\n ></c8y-messages>\n </c8y-form-group>\n </div>\n </div>\n </fieldset>\n </div>\n </div>\n </div>\n <div class=\"card-footer separator grid__col--fullspan\">\n <button class=\"btn btn-default\" type=\"button\" [title]=\"'Cancel' | translate\" (click)=\"cancel()\">\n {{ 'Cancel' | translate }}\n </button>\n <button\n class=\"btn btn-primary btn-form\"\n type=\"submit\"\n [title]=\"'Save' | translate\"\n *c8yIfAllowed=\"['ROLE_INVENTORY_ADMIN', 'ROLE_INVENTORY_UPDATE']; allowAny: true\"\n [disabled]=\"formGroup.invalid || formGroup.pristine\"\n >\n {{ 'Save' | translate }}\n </button>\n </div>\n</form>\n" }]
256
+ args: [{ selector: 'c8y-datapoint-library-details', standalone: true, imports: [CoreModule, RouterModule, PopoverModule, TooltipModule, DatapointSelectorModule], template: "<c8y-title *ngIf=\"!isLoading\">\n {{ formGroup.value?.label }}\n <small *ngIf=\"formGroup.value?.fragment && formGroup.value?.series\">\n {{ formGroup.value?.fragment }} / {{ formGroup.value?.series }}\n </small>\n</c8y-title>\n\n<c8y-breadcrumb>\n <c8y-breadcrumb-item\n [icon]=\"'c8y-tools'\"\n [label]=\"'Configuration' | translate\"\n ></c8y-breadcrumb-item>\n <c8y-breadcrumb-item\n [icon]=\"'c8y-data-points'\"\n [label]=\"'Data point library' | translate\"\n [path]=\"path\"\n ></c8y-breadcrumb-item>\n <c8y-breadcrumb-item\n [icon]=\"'c8y-data-points'\"\n [label]=\"formGroup.value?.label\"\n ></c8y-breadcrumb-item>\n</c8y-breadcrumb>\n\n<form\n (ngSubmit)=\"formGroup.valid && save(formGroup.value)\"\n (change)=\"formChange()\"\n [formGroup]=\"formGroup\"\n class=\"card content-fullpage card--grid grid__col--6-6--md grid__row--fit-auto\"\n novalidate\n>\n <div class=\"card-header large-padding separator grid__col--fullspan\">\n <div class=\"card-title\">\n {{ formGroup.value?.label }}\n </div>\n </div>\n <div *ngIf=\"!isLoading\" class=\"d-contents\">\n <div class=\"inner-scroll bg-level-0 flex-grow\">\n <div class=\"card-block large-padding\">\n <div class=\"d-flex\">\n <c8y-form-group>\n <label translate>Color</label>\n <div class=\"data-point-color form-control\">\n <div class=\"c8y-colorpicker\">\n <input\n [attr.aria-label]=\"'Color picker' | translate\"\n type=\"color\"\n name=\"color\"\n formControlName=\"color\"\n />\n <span [style.background-color]=\"formGroup.value?.color\"></span>\n </div>\n </div>\n </c8y-form-group>\n <c8y-form-group class=\"flex-grow p-l-8\">\n <label translate>Label</label>\n <input\n class=\"form-control\"\n formControlName=\"label\"\n name=\"label\"\n [placeholder]=\"'e.g. Temperature' | translate\"\n type=\"text\"\n />\n <c8y-messages\n [show]=\"formGroup.controls?.label?.touched && formGroup.controls?.label?.errors\"\n ></c8y-messages>\n </c8y-form-group>\n </div>\n <c8y-form-group>\n <label translate>Description</label>\n <textarea\n class=\"form-control\"\n formControlName=\"description\"\n name=\"description\"\n [placeholder]=\"'e.g. Ambient Temperature in Celsius' | translate\"\n rows=\"3\"\n ></textarea>\n </c8y-form-group>\n\n <div class=\"d-flex a-i-center gap-8\">\n <c8y-form-group class=\"flex-grow\">\n <label translate>Fragment</label>\n <input\n class=\"form-control\"\n name=\"fragment\"\n formControlName=\"fragment\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: 'c8y_Temperature' }\"\n type=\"text\"\n />\n <c8y-messages\n [show]=\"formGroup.controls?.fragment?.touched && formGroup.controls?.fragment?.errors\"\n ></c8y-messages>\n </c8y-form-group>\n\n <c8y-form-group class=\"flex-grow\">\n <label translate>Series</label>\n <input\n class=\"form-control\"\n formControlName=\"series\"\n name=\"series\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: 'T' }\"\n type=\"text\"\n />\n <c8y-messages\n [show]=\"formGroup.controls?.series?.touched && formGroup.controls?.series?.errors\"\n ></c8y-messages>\n </c8y-form-group>\n <div class=\"flex-no-grow\">\n <button\n class=\"btn btn-default p-l-8 p-r-8\"\n (click)=\"pickDatapoint()\"\n type=\"button\"\n [tooltip]=\"'Load fragment and series from an existing data point' | translate\"\n [delay]=\"500\"\n [attr.aria-label]=\"'Load fragment and series from an existing data point' | translate\"\n >\n <i c8yIcon=\"eyedropper\"></i>\n </button>\n </div>\n </div>\n\n <div class=\"row\" *ngIf=\"config?.showCheckboxForGlobalFragment\">\n <div class=\"col-sm-6\">\n <c8y-form-group>\n <label class=\"c8y-checkbox\">\n <input name=\"c8y_Global\" formControlName=\"c8y_Global\" type=\"checkbox\" />\n <span></span>\n <span translate>Globally available</span>\n <button\n class=\"btn-help\"\n type=\"button\"\n [attr.aria-label]=\"'Help' | translate\"\n [popover]=\"\n 'Will make this entry available to all users on the tenant if checked.'\n | translate\n \"\n placement=\"right\"\n triggers=\"focus\"\n container=\"body\"\n ></button>\n </label>\n </c8y-form-group>\n </div>\n </div>\n </div>\n </div>\n <div class=\"inner-scroll bg-level-1\">\n <div class=\"card-block large-padding\">\n <fieldset class=\"c8y-fieldset\">\n <legend translate>Preview</legend>\n <c8y-range-display [config]=\"rangeConfig\" class=\"m-b-16 d-block\"></c8y-range-display>\n </fieldset>\n\n <fieldset class=\"c8y-fieldset\">\n <legend translate>Range</legend>\n <div class=\"row\" formGroupName=\"range\">\n <div class=\"col-md-6\">\n <c8y-form-group\n [ngClass]=\"{ 'has-error': range?.touched && range?.controls?.min?.errors }\"\n >\n <label translate>Min</label>\n <input\n type=\"number\"\n class=\"form-control\"\n name=\"min\"\n formControlName=\"min\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: 0 }\"\n />\n <c8y-messages [show]=\"range?.touched && range.controls?.min?.errors\"></c8y-messages>\n </c8y-form-group>\n </div>\n <div class=\"col-md-6\">\n <c8y-form-group\n [ngClass]=\"{ 'has-error': range?.touched && range?.controls?.max?.errors }\"\n >\n <label translate>Max</label>\n <input\n type=\"number\"\n class=\"form-control\"\n name=\"max\"\n formControlName=\"max\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: 100 }\"\n />\n <c8y-messages [show]=\"range?.touched && range.controls?.max?.errors\"></c8y-messages>\n </c8y-form-group>\n </div>\n </div>\n <div class=\"row\">\n <div class=\"col-md-6\">\n <c8y-form-group>\n <label translate>Unit</label>\n <input\n class=\"form-control\"\n name=\"unit\"\n formControlName=\"unit\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: '\u00BAC' }\"\n />\n <c8y-messages\n [show]=\"formGroup.controls?.unit?.touched && formGroup.controls?.unit?.errors\"\n ></c8y-messages>\n </c8y-form-group>\n </div>\n\n <div class=\"col-md-6\">\n <c8y-form-group\n [ngClass]=\"{\n 'has-error':\n (range?.touched || formGroup.controls?.target?.touched) &&\n formGroup.controls?.target?.errors\n }\"\n >\n <label translate>Target</label>\n <input\n type=\"number\"\n class=\"form-control\"\n name=\"target\"\n formControlName=\"target\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: 25 }\"\n />\n <c8y-messages\n [show]=\"\n (range?.touched || formGroup.controls?.target?.touched) &&\n formGroup.controls?.target?.errors\n \"\n ></c8y-messages>\n </c8y-form-group>\n </div>\n </div>\n </fieldset>\n\n <fieldset class=\"c8y-fieldset\" formGroupName=\"yellowRange\">\n <legend translate>Yellow range</legend>\n <div class=\"row\">\n <div class=\"col-md-6\">\n <c8y-form-group\n [ngClass]=\"{\n 'has-error':\n (range?.touched || yellowRange?.touched) && yellowRange?.controls?.min?.errors\n }\"\n >\n <label translate>Min</label>\n <input\n type=\"number\"\n class=\"form-control\"\n name=\"min\"\n formControlName=\"min\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: 50 }\"\n />\n <c8y-messages\n [show]=\"\n (range?.touched || yellowRange?.touched) && yellowRange.controls?.min?.errors\n \"\n ></c8y-messages>\n </c8y-form-group>\n </div>\n\n <div class=\"col-md-6\">\n <c8y-form-group\n [ngClass]=\"{\n 'has-error':\n (range?.touched || yellowRange?.touched) && yellowRange?.controls?.max?.errors\n }\"\n >\n <label translate>Max</label>\n <input\n type=\"number\"\n class=\"form-control\"\n name=\"max\"\n formControlName=\"max\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: 75 }\"\n />\n <c8y-messages\n [show]=\"\n (range?.touched || yellowRange?.touched) && yellowRange.controls?.max?.errors\n \"\n ></c8y-messages>\n </c8y-form-group>\n </div>\n </div>\n </fieldset>\n\n <fieldset class=\"c8y-fieldset\" formGroupName=\"redRange\">\n <legend translate>Red range</legend>\n <div class=\"row\">\n <div class=\"col-md-6\">\n <c8y-form-group\n [ngClass]=\"{\n 'has-error':\n (range?.touched || redRange?.touched) && redRange?.controls?.min?.errors\n }\"\n >\n <label translate>Min</label>\n <input\n type=\"number\"\n class=\"form-control\"\n name=\"min\"\n formControlName=\"min\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: 75 }\"\n />\n <c8y-messages\n [show]=\"(range?.touched || redRange?.touched) && redRange.controls?.min?.errors\"\n ></c8y-messages>\n </c8y-form-group>\n </div>\n\n <div class=\"col-md-6\">\n <c8y-form-group\n [ngClass]=\"{\n 'has-error':\n (range?.touched || redRange?.touched) && redRange?.controls?.max?.errors\n }\"\n >\n <label translate>Max</label>\n <input\n type=\"number\"\n class=\"form-control\"\n name=\"max\"\n formControlName=\"max\"\n [placeholder]=\"'e.g. {{ example }}' | translate: { example: 100 }\"\n />\n <c8y-messages\n [show]=\"(range?.touched || redRange?.touched) && redRange.controls?.max?.errors\"\n ></c8y-messages>\n </c8y-form-group>\n </div>\n </div>\n </fieldset>\n </div>\n </div>\n </div>\n <div class=\"card-footer separator grid__col--fullspan\">\n <button class=\"btn btn-default\" type=\"button\" [title]=\"'Cancel' | translate\" (click)=\"cancel()\">\n {{ 'Cancel' | translate }}\n </button>\n <button\n class=\"btn btn-primary btn-form\"\n type=\"submit\"\n [title]=\"'Save' | translate\"\n *c8yIfAllowed=\"['ROLE_INVENTORY_ADMIN', 'ROLE_INVENTORY_UPDATE']; allowAny: true\"\n [disabled]=\"formGroup.invalid || formGroup.pristine\"\n >\n {{ 'Save' | translate }}\n </button>\n </div>\n</form>\n" }]
227
257
  }], ctorParameters: function () {
228
- return [{ type: i1.ActivatedRoute }, { type: i2.InventoryService }, { type: i3.FormBuilder }, { type: i4.AlertService }, { type: i1.Router }, { type: i5.TranslateService }, { type: i4.ColorService }, { type: i6.DatapointParserService }, { type: undefined, decorators: [{
258
+ return [{ type: i1.ActivatedRoute }, { type: i2.InventoryService }, { type: i3.FormBuilder }, { type: i4.AlertService }, { type: i1.Router }, { type: i5.TranslateService }, { type: i4.ColorService }, { type: i6.DatapointParserService }, { type: i7.DatapointSelectorService }, { type: undefined, decorators: [{
229
259
  type: Optional
230
260
  }, {
231
261
  type: Inject,