@c8y/ngx-components 1021.2.1 → 1021.4.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/assets-navigator/asset-selector/asset-selector-node.component.d.ts +2 -1
- package/assets-navigator/asset-selector/asset-selector-node.component.d.ts.map +1 -1
- package/assets-navigator/asset-selector/asset-selector.component.d.ts +2 -1
- package/assets-navigator/asset-selector/asset-selector.component.d.ts.map +1 -1
- package/auth-configuration/sso-configuration/template-parts/basic-configuration.component.d.ts +1 -0
- package/auth-configuration/sso-configuration/template-parts/basic-configuration.component.d.ts.map +1 -1
- package/cockpit-config/cockpit-config.service.d.ts.map +1 -1
- package/cockpit-config/cockpit-configuration.component.d.ts +1 -0
- package/cockpit-config/cockpit-configuration.component.d.ts.map +1 -1
- package/cockpit-config/root-node-config.component.d.ts +2 -1
- package/cockpit-config/root-node-config.component.d.ts.map +1 -1
- package/context-dashboard/context-dashboard.service.d.ts.map +1 -1
- package/core/common/get-group-icon.pipe.d.ts.map +1 -1
- package/core/common/global-config.service.d.ts +1 -1
- package/core/common/global-config.service.d.ts.map +1 -1
- package/core/login/login.component.d.ts.map +1 -1
- package/core/login/login.service.d.ts +1 -1
- package/core/login/login.service.d.ts.map +1 -1
- package/device-profile/device-profile-list.component.d.ts +31 -14
- package/device-profile/device-profile-list.component.d.ts.map +1 -1
- package/esm2022/assets-navigator/asset-selector/asset-selector-node.component.mjs +6 -3
- package/esm2022/assets-navigator/asset-selector/asset-selector.component.mjs +7 -4
- package/esm2022/assets-navigator/asset-selector/miller-view.component.mjs +1 -1
- package/esm2022/auth-configuration/sso-configuration/template-parts/access-mapping/inventory-roles-modal.component.mjs +1 -1
- package/esm2022/auth-configuration/sso-configuration/template-parts/basic-configuration.component.mjs +5 -3
- package/esm2022/cockpit-config/cockpit-config.service.mjs +7 -3
- package/esm2022/cockpit-config/cockpit-configuration.component.mjs +6 -3
- package/esm2022/cockpit-config/root-node-config.component.mjs +8 -4
- package/esm2022/cockpit-config/setup/cockpit-setup-step3.component.mjs +1 -1
- package/esm2022/context-dashboard/context-dashboard.service.mjs +3 -2
- package/esm2022/core/common/get-group-icon.pipe.mjs +4 -1
- package/esm2022/core/common/global-config.service.mjs +3 -2
- package/esm2022/core/login/login.component.mjs +8 -3
- package/esm2022/core/login/login.service.mjs +5 -2
- package/esm2022/device-grid/columns/group.filtering-form-renderer.component.mjs +1 -1
- package/esm2022/device-profile/device-profile-list.component.mjs +102 -27
- package/esm2022/protocol-lwm2m/components/configuration/typed-forms/firmware-settings.component.mjs +11 -2
- package/esm2022/repository/shared/repository.model.mjs +2 -1
- package/fesm2022/c8y-ngx-components-assets-navigator.mjs +12 -6
- package/fesm2022/c8y-ngx-components-assets-navigator.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-auth-configuration.mjs +5 -3
- package/fesm2022/c8y-ngx-components-auth-configuration.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-cockpit-config.mjs +19 -9
- package/fesm2022/c8y-ngx-components-cockpit-config.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-context-dashboard.mjs +2 -1
- package/fesm2022/c8y-ngx-components-context-dashboard.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-device-grid.mjs +1 -1
- package/fesm2022/c8y-ngx-components-device-grid.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-device-profile.mjs +110 -35
- package/fesm2022/c8y-ngx-components-device-profile.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-protocol-lwm2m-components-configuration.mjs +10 -1
- package/fesm2022/c8y-ngx-components-protocol-lwm2m-components-configuration.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-repository-shared.mjs +1 -0
- package/fesm2022/c8y-ngx-components-repository-shared.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components.mjs +16 -4
- package/fesm2022/c8y-ngx-components.mjs.map +1 -1
- package/locales/locales.pot +20 -2
- package/package.json +1 -1
- package/protocol-lwm2m/components/configuration/typed-forms/firmware-settings.component.d.ts +10 -0
- package/protocol-lwm2m/components/configuration/typed-forms/firmware-settings.component.d.ts.map +1 -1
- package/repository/shared/repository.model.d.ts +2 -1
- package/repository/shared/repository.model.d.ts.map +1 -1
- package/repository/shared/repository.service.d.ts +1 -1
|
@@ -57,6 +57,7 @@ export class AssetSelectorComponent extends AssetSelectorBase {
|
|
|
57
57
|
*/
|
|
58
58
|
this.selectedItems = [];
|
|
59
59
|
this.container = 'body';
|
|
60
|
+
this.disabled = false;
|
|
60
61
|
/**
|
|
61
62
|
* Emits if one item was selected (all currently selected nodes).
|
|
62
63
|
*/
|
|
@@ -294,7 +295,7 @@ export class AssetSelectorComponent extends AssetSelectorBase {
|
|
|
294
295
|
}
|
|
295
296
|
}
|
|
296
297
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: AssetSelectorComponent, deps: [{ token: i1.GroupNodeService }, { token: i2.InventoryService }, { token: i3.AssetSelectorService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
297
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.9", type: AssetSelectorComponent, selector: "c8y-asset-selector", inputs: { config: "config", active: "active", index: "index", asset: "asset", selectedDevice: "selectedDevice", selected: "selected", rootNode: "rootNode", selectedItems: "selectedItems", container: "container" }, outputs: { onSelected: "onSelected", onClearSelected: "onClearSelected", onRowSelected: "onRowSelected", onLoad: "onLoad" }, providers: [
|
|
298
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.9", type: AssetSelectorComponent, selector: "c8y-asset-selector", inputs: { config: "config", active: "active", index: "index", asset: "asset", selectedDevice: "selectedDevice", selected: "selected", rootNode: "rootNode", selectedItems: "selectedItems", container: "container", disabled: "disabled" }, outputs: { onSelected: "onSelected", onClearSelected: "onClearSelected", onRowSelected: "onRowSelected", onLoad: "onLoad" }, providers: [
|
|
298
299
|
{
|
|
299
300
|
provide: NG_VALUE_ACCESSOR,
|
|
300
301
|
multi: true,
|
|
@@ -305,7 +306,7 @@ export class AssetSelectorComponent extends AssetSelectorBase {
|
|
|
305
306
|
useExisting: forwardRef(() => AssetSelectorComponent),
|
|
306
307
|
multi: true
|
|
307
308
|
}
|
|
308
|
-
], viewQueries: [{ propertyName: "header", first: true, predicate: ["header"], descendants: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<div\n class=\"bg-inherit p-t-8 p-b-8 separator-bottom p-r-16 p-l-16 sticky-top\"\n [ngStyle]=\"{ 'z-index': config.singleColumn && config.search ? '30' : '20' }\"\n #header\n [ngClass]=\"{\n 'p-absolute miller-column__selection d-flex flex-wrap a-i-center': config.view === 'miller',\n 'miller-column__search': config.search,\n 'miller-column__multi': config.multi\n }\"\n *ngIf=\"\n !selectedDevice &&\n index === 0 &&\n (config.search || config.multi || config.label?.length || config.showSelected)\n \"\n>\n <p\n class=\"text-medium flex-no-shrink a-s-center\"\n [ngClass]=\"{\n 'm-b-4': config.search && root && config.singleColumn,\n 'm-r-8': !config.singleColumn && !config.search,\n 'fit-w': config.singleColumn\n }\"\n *ngIf=\"config.label?.length\"\n >\n {{ config.label | translate }}\n </p>\n <c8y-search-input\n [ngStyle]=\"{ 'min-width': !config.singleColumn && config.label.length ? '50%' : 'inherit' }\"\n *ngIf=\"config.search && root\"\n (onClick)=\"onSearchResultClick($event)\"\n (reset)=\"onSearchResultReset($event)\"\n [mode]=\"'select'\"\n [container]=\"container\"\n [groupsOnly]=\"config.groupsOnly\"\n [ngClass]=\"{\n 'm-l-auto': !config.singleColumn && config.label.length,\n 'fit-w': config.singleColumn || !config.label.length\n }\"\n ></c8y-search-input>\n <div\n class=\"bg-inherit d-flex gap-4 fit-w\"\n *ngIf=\"config.showSelected\"\n [ngClass]=\"{ 'm-t-4': config.search }\"\n >\n <span class=\"text-label-small m-r-4 a-s-center l-h-1\">{{ 'Selected' | translate }}</span>\n <div class=\"flex-grow inner-scroll d-flex gap-4 a-i-center\">\n <ng-container *ngIf=\"!selected.length\">\n <em class=\"text-12 text-muted d-flex a-i-center fit-h-20\">{{ 'None' | translate }}</em>\n </ng-container>\n <span\n class=\"tag tag--info chip\"\n *ngFor=\"let selectedItem of selected\"\n >\n <button\n class=\"btn btn-xs btn-clean text-10\"\n title=\"{{ selectedItem.name }}\"\n type=\"button\"\n (click)=\"config.multi ? deselect(selectedItem) : deselectAll()\"\n >\n <i c8yIcon=\"times\"></i>\n </button>\n {{ selectedItem.name || (ASSET_CONST | translate: { assetId: selectedItem.id }) }}\n </span>\n </div>\n </div>\n</div>\n\n<div\n class=\"p-r-16\"\n *ngIf=\"selectedDevice\"\n>\n <div class=\"d-flex p-b-4\">\n <p\n class=\"text-medium p-t-8 m-r-8\"\n *ngIf=\"selectedDevice; else multiAssets\"\n >\n {{ 'Selected asset' | translate }}\n </p>\n <ng-template #multiAssets>\n <p class=\"text-medium m-r-8\">{{ 'Selected assets' | translate }}</p>\n </ng-template>\n <button\n class=\"btn btn-default btn-xs a-s-center m-t-4 m-l-auto\"\n title=\"{{ 'Change' | translate }}\"\n type=\"button\"\n (click)=\"clearSelectedDevices()\"\n >\n {{ 'Change' | translate }}\n </button>\n </div>\n <div class=\"d-flex\">\n <i\n class=\"text-success p-l-0 p-r-8\"\n [c8yIcon]=\"'check-circle'\"\n ></i>\n <i\n class=\"m-r-4 icon-20\"\n [c8yIcon]=\"selectedDevice | getGroupIcon | async\"\n ></i>\n <span>{{ selectedDevice.name }}</span>\n </div>\n</div>\n\n<!-- miller columns header -->\n<div\n class=\"miller-column__header sticky-top bg-inherit separator-bottom\"\n *ngIf=\"\n config.view === 'miller' &&\n ((config.showFilter && !rootNode.root) || config.columnHeaders) &&\n !selectedDevice\n \"\n [ngClass]=\"{ 'p-t-8': config.search }\"\n>\n <p\n class=\"text-12 text-muted text-truncate m-b-4\"\n title=\"{{ rootNode.breadcrumb || rootNode.label | translate }}\"\n *ngIf=\"config.singleColumn && index !== 0\"\n >\n <i\n class=\"m-r-4\"\n c8yIcon=\"home\"\n ></i>\n {{ rootNode.breadcrumb || rootNode.label | translate }}\n </p>\n <div\n class=\"d-flex a-i-center\"\n *ngIf=\"config.columnHeaders || config.singleColumn\"\n >\n <button\n class=\"btn btn-default btn-xs m-r-8 p-t-0 p-b-0 p-l-4 p-r-4 l-h-1\"\n title=\"{{ 'Back' | translate }}\"\n type=\"button\"\n *ngIf=\"config.singleColumn && !rootNode.root && index !== 0\"\n (click)=\"back()\"\n >\n <i c8yIcon=\"angle-left\"></i>\n </button>\n <label\n class=\"c8y-radio checkbox-inline m-r-8\"\n *ngIf=\"!rootNode.root && index === 0 && (config.groupsSelectable || !rootNode.isGroup())\"\n >\n <input\n title=\"{{ 'Select group' | translate }}\"\n type=\"radio\"\n (change)=\"select(rootNode.mo)\"\n [checked]=\"isGroupSelected()\"\n />\n <span></span>\n </label>\n\n <i\n class=\"icon-20 c8y-icon-duocolor m-r-4\"\n [c8yIcon]=\"this.rootNode.mo | getGroupIcon: true : this.rootNode.icon | async\"\n *ngIf=\"config.columnHeaders && (config.singleColumn || (!rootNode.root && index === 0))\"\n ></i>\n <p\n class=\"text-truncate\"\n title=\"{{ rootNode.label | translate }}\"\n *ngIf=\"config.columnHeaders\"\n [ngClass]=\"{\n 'text-label-small': !config.singleColumn,\n 'text-medium': config.singleColumn\n }\"\n >\n {{ rootNode.label | translate }}\n </p>\n </div>\n\n <div\n *ngIf=\"!rootNode.root && config.showFilter\"\n [ngClass]=\"{ 'p-t-4': config.columnHeaders }\"\n >\n <div class=\"input-group input-group-sm input-group-search\">\n <input\n class=\"form-control\"\n placeholder=\"{{ 'Filter this column\u2026' | translate }}\"\n [(ngModel)]=\"filterText\"\n (keyup.enter)=\"applyFilter('*' + filterText + '*')\"\n />\n <span class=\"input-group-btn\">\n <button\n class=\"btn btn-dot p-r-8 p-l-4\"\n title=\"{{ 'Apply filter' | translate }}\"\n type=\"button\"\n (click)=\"applyFilter('*' + filterText + '*')\"\n >\n <i c8yIcon=\"filter\"></i>\n </button>\n <button\n class=\"btn btn-dot p-r-8 p-l-4\"\n title=\" {{ 'Clear filters' | translate }}\"\n type=\"button\"\n (click)=\"clearFilters()\"\n *ngIf=\"filterText.length\"\n >\n <i c8yIcon=\"times\"></i>\n </button>\n </span>\n </div>\n </div>\n</div>\n\n<c8y-asset-selector-node\n class=\"d-block bg-inherit p-relative\"\n style=\"z-index: 9\"\n *ngIf=\"rootNode && !selectedDevice\"\n [node]=\"rootNode\"\n [rootNode]=\"rootNode\"\n [preselected]=\"selected\"\n [multi]=\"config.multi\"\n [view]=\"config.view\"\n [index]=\"index\"\n [active]=\"active\"\n [handleNextMillerViewColumn]=\"handleNextMillerViewColumn.bind(this)\"\n (isLoadingState)=\"onLoading($event)\"\n (onSelect)=\"onSelect($event)\"\n (onDeselect)=\"onDeselect($event)\"\n [ngClass]=\"{ 'collapse show': !rootNode.root && !rootNode.hidden && config.view !== 'miller' }\"\n></c8y-asset-selector-node>\n", dependencies: [{ kind: "directive", type: i4.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { 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: "directive", type: i5.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: i4.SearchInputComponent, selector: "c8y-search-input", inputs: ["mode", "enableCustomTemplatePlaceholder", "customPlaceholder", "externalTerm", "customDataQuery", "container", "groupsOnly"], outputs: ["filter", "search", "reset", "onClick"] }, { kind: "directive", type: i6.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: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i7.AssetSelectorNodeComponent, selector: "c8y-asset-selector-node", inputs: ["node", "rootNode", "preselected", "showPath", "multi", "view", "index", "active", "handleNextMillerViewColumn"], outputs: ["isLoadingState", "onSelect", "onDeselect"] }, { kind: "pipe", type: i4.C8yTranslatePipe, name: "translate" }, { kind: "pipe", type: i5.AsyncPipe, name: "async" }, { kind: "pipe", type: i4.GetGroupIconPipe, name: "getGroupIcon" }] }); }
|
|
309
|
+
], viewQueries: [{ propertyName: "header", first: true, predicate: ["header"], descendants: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<div\n class=\"bg-inherit p-t-8 p-b-8 separator-bottom p-r-16 p-l-16 sticky-top\"\n [ngStyle]=\"{ 'z-index': config.singleColumn && config.search ? '30' : '20' }\"\n #header\n [ngClass]=\"{\n 'p-absolute miller-column__selection d-flex flex-wrap a-i-center': config.view === 'miller',\n 'miller-column__search': config.search,\n 'miller-column__multi': config.multi\n }\"\n *ngIf=\"\n !selectedDevice &&\n index === 0 &&\n (config.search || config.multi || config.label?.length || config.showSelected)\n \"\n>\n <p\n class=\"text-medium flex-no-shrink a-s-center\"\n [ngClass]=\"{\n 'm-b-4': config.search && root && config.singleColumn,\n 'm-r-8': !config.singleColumn && !config.search,\n 'fit-w': config.singleColumn\n }\"\n *ngIf=\"config.label?.length\"\n >\n {{ config.label | translate }}\n </p>\n <c8y-search-input\n [ngStyle]=\"{ 'min-width': !config.singleColumn && config.label.length ? '50%' : 'inherit' }\"\n *ngIf=\"config.search && root\"\n (onClick)=\"onSearchResultClick($event)\"\n (reset)=\"onSearchResultReset($event)\"\n [mode]=\"'select'\"\n [container]=\"container\"\n [groupsOnly]=\"config.groupsOnly\"\n [ngClass]=\"{\n 'm-l-auto': !config.singleColumn && config.label.length,\n 'fit-w': config.singleColumn || !config.label.length\n }\"\n ></c8y-search-input>\n <div\n class=\"bg-inherit d-flex gap-4 fit-w\"\n *ngIf=\"config.showSelected\"\n [ngClass]=\"{ 'm-t-4': config.search }\"\n >\n <span class=\"text-label-small m-r-4 a-s-center l-h-1\">{{ 'Selected' | translate }}</span>\n <div class=\"flex-grow inner-scroll d-flex gap-4 a-i-center\">\n <ng-container *ngIf=\"!selected.length\">\n <em class=\"text-12 text-muted d-flex a-i-center fit-h-20\">{{ 'None' | translate }}</em>\n </ng-container>\n <span\n class=\"tag tag--info chip\"\n *ngFor=\"let selectedItem of selected\"\n >\n <button\n class=\"btn btn-xs btn-clean text-10\"\n title=\"{{ selectedItem.name }}\"\n [disabled]=\"disabled\"\n type=\"button\"\n (click)=\"config.multi ? deselect(selectedItem) : deselectAll()\"\n >\n <i c8yIcon=\"times\"></i>\n </button>\n {{ selectedItem.name || (ASSET_CONST | translate: { assetId: selectedItem.id }) }}\n </span>\n </div>\n </div>\n</div>\n\n<div\n class=\"p-r-16\"\n *ngIf=\"selectedDevice\"\n>\n <div class=\"d-flex p-b-4\">\n <p\n class=\"text-medium p-t-8 m-r-8\"\n *ngIf=\"selectedDevice; else multiAssets\"\n >\n {{ 'Selected asset' | translate }}\n </p>\n <ng-template #multiAssets>\n <p class=\"text-medium m-r-8\">{{ 'Selected assets' | translate }}</p>\n </ng-template>\n <button\n class=\"btn btn-default btn-xs a-s-center m-t-4 m-l-auto\"\n title=\"{{ 'Change' | translate }}\"\n type=\"button\"\n (click)=\"clearSelectedDevices()\"\n >\n {{ 'Change' | translate }}\n </button>\n </div>\n <div class=\"d-flex\">\n <i\n class=\"text-success p-l-0 p-r-8\"\n [c8yIcon]=\"'check-circle'\"\n ></i>\n <i\n class=\"m-r-4 icon-20\"\n [c8yIcon]=\"selectedDevice | getGroupIcon | async\"\n ></i>\n <span>{{ selectedDevice.name }}</span>\n </div>\n</div>\n\n<!-- miller columns header -->\n<div\n class=\"miller-column__header sticky-top bg-inherit separator-bottom\"\n *ngIf=\"\n config.view === 'miller' &&\n ((config.showFilter && !rootNode.root) || config.columnHeaders) &&\n !selectedDevice\n \"\n [ngClass]=\"{ 'p-t-8': config.search }\"\n>\n <p\n class=\"text-12 text-muted text-truncate m-b-4\"\n title=\"{{ rootNode.breadcrumb || rootNode.label | translate }}\"\n *ngIf=\"config.singleColumn && index !== 0\"\n >\n <i\n class=\"m-r-4\"\n c8yIcon=\"home\"\n ></i>\n {{ rootNode.breadcrumb || rootNode.label | translate }}\n </p>\n <div\n class=\"d-flex a-i-center\"\n *ngIf=\"config.columnHeaders || config.singleColumn\"\n >\n <button\n class=\"btn btn-default btn-xs m-r-8 p-t-0 p-b-0 p-l-4 p-r-4 l-h-1\"\n title=\"{{ 'Back' | translate }}\"\n type=\"button\"\n *ngIf=\"config.singleColumn && !rootNode.root && index !== 0\"\n (click)=\"back()\"\n >\n <i c8yIcon=\"angle-left\"></i>\n </button>\n <label\n class=\"c8y-radio checkbox-inline m-r-8\"\n *ngIf=\"!rootNode.root && index === 0 && (config.groupsSelectable || !rootNode.isGroup())\"\n >\n <input\n title=\"{{ 'Select group' | translate }}\"\n type=\"radio\"\n (change)=\"select(rootNode.mo)\"\n [checked]=\"isGroupSelected()\"\n />\n <span></span>\n </label>\n\n <i\n class=\"icon-20 c8y-icon-duocolor m-r-4\"\n [c8yIcon]=\"this.rootNode.mo | getGroupIcon: true : this.rootNode.icon | async\"\n *ngIf=\"config.columnHeaders && (config.singleColumn || (!rootNode.root && index === 0))\"\n ></i>\n <p\n class=\"text-truncate\"\n title=\"{{ rootNode.label | translate }}\"\n *ngIf=\"config.columnHeaders\"\n [ngClass]=\"{\n 'text-label-small': !config.singleColumn,\n 'text-medium': config.singleColumn\n }\"\n >\n {{ rootNode.label | translate }}\n </p>\n </div>\n\n <div\n *ngIf=\"!rootNode.root && config.showFilter\"\n [ngClass]=\"{ 'p-t-4': config.columnHeaders }\"\n >\n <div class=\"input-group input-group-sm input-group-search\">\n <input\n class=\"form-control\"\n placeholder=\"{{ 'Filter this column\u2026' | translate }}\"\n [(ngModel)]=\"filterText\"\n (keyup.enter)=\"applyFilter('*' + filterText + '*')\"\n />\n <span class=\"input-group-btn\">\n <button\n class=\"btn btn-dot p-r-8 p-l-4\"\n title=\"{{ 'Apply filter' | translate }}\"\n type=\"button\"\n (click)=\"applyFilter('*' + filterText + '*')\"\n >\n <i c8yIcon=\"filter\"></i>\n </button>\n <button\n class=\"btn btn-dot p-r-8 p-l-4\"\n title=\" {{ 'Clear filters' | translate }}\"\n type=\"button\"\n (click)=\"clearFilters()\"\n *ngIf=\"filterText.length\"\n >\n <i c8yIcon=\"times\"></i>\n </button>\n </span>\n </div>\n </div>\n</div>\n\n<c8y-asset-selector-node\n class=\"d-block bg-inherit p-relative\"\n style=\"z-index: 9\"\n *ngIf=\"rootNode && !selectedDevice\"\n [node]=\"rootNode\"\n [rootNode]=\"rootNode\"\n [preselected]=\"selected\"\n [multi]=\"config.multi\"\n [view]=\"config.view\"\n [index]=\"index\"\n [active]=\"active\"\n [disabled]=\"disabled\"\n [handleNextMillerViewColumn]=\"handleNextMillerViewColumn.bind(this)\"\n (isLoadingState)=\"onLoading($event)\"\n (onSelect)=\"onSelect($event)\"\n (onDeselect)=\"onDeselect($event)\"\n [ngClass]=\"{ 'collapse show': !rootNode.root && !rootNode.hidden && config.view !== 'miller' }\"\n></c8y-asset-selector-node>\n", dependencies: [{ kind: "directive", type: i4.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { 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: "directive", type: i5.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: i4.SearchInputComponent, selector: "c8y-search-input", inputs: ["mode", "enableCustomTemplatePlaceholder", "customPlaceholder", "externalTerm", "customDataQuery", "container", "groupsOnly"], outputs: ["filter", "search", "reset", "onClick"] }, { kind: "directive", type: i6.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: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i7.AssetSelectorNodeComponent, selector: "c8y-asset-selector-node", inputs: ["node", "rootNode", "preselected", "showPath", "multi", "view", "index", "active", "handleNextMillerViewColumn", "disabled"], outputs: ["isLoadingState", "onSelect", "onDeselect"] }, { kind: "pipe", type: i4.C8yTranslatePipe, name: "translate" }, { kind: "pipe", type: i5.AsyncPipe, name: "async" }, { kind: "pipe", type: i4.GetGroupIconPipe, name: "getGroupIcon" }] }); }
|
|
309
310
|
}
|
|
310
311
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: AssetSelectorComponent, decorators: [{
|
|
311
312
|
type: Component,
|
|
@@ -320,7 +321,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImpor
|
|
|
320
321
|
useExisting: forwardRef(() => AssetSelectorComponent),
|
|
321
322
|
multi: true
|
|
322
323
|
}
|
|
323
|
-
], template: "<div\n class=\"bg-inherit p-t-8 p-b-8 separator-bottom p-r-16 p-l-16 sticky-top\"\n [ngStyle]=\"{ 'z-index': config.singleColumn && config.search ? '30' : '20' }\"\n #header\n [ngClass]=\"{\n 'p-absolute miller-column__selection d-flex flex-wrap a-i-center': config.view === 'miller',\n 'miller-column__search': config.search,\n 'miller-column__multi': config.multi\n }\"\n *ngIf=\"\n !selectedDevice &&\n index === 0 &&\n (config.search || config.multi || config.label?.length || config.showSelected)\n \"\n>\n <p\n class=\"text-medium flex-no-shrink a-s-center\"\n [ngClass]=\"{\n 'm-b-4': config.search && root && config.singleColumn,\n 'm-r-8': !config.singleColumn && !config.search,\n 'fit-w': config.singleColumn\n }\"\n *ngIf=\"config.label?.length\"\n >\n {{ config.label | translate }}\n </p>\n <c8y-search-input\n [ngStyle]=\"{ 'min-width': !config.singleColumn && config.label.length ? '50%' : 'inherit' }\"\n *ngIf=\"config.search && root\"\n (onClick)=\"onSearchResultClick($event)\"\n (reset)=\"onSearchResultReset($event)\"\n [mode]=\"'select'\"\n [container]=\"container\"\n [groupsOnly]=\"config.groupsOnly\"\n [ngClass]=\"{\n 'm-l-auto': !config.singleColumn && config.label.length,\n 'fit-w': config.singleColumn || !config.label.length\n }\"\n ></c8y-search-input>\n <div\n class=\"bg-inherit d-flex gap-4 fit-w\"\n *ngIf=\"config.showSelected\"\n [ngClass]=\"{ 'm-t-4': config.search }\"\n >\n <span class=\"text-label-small m-r-4 a-s-center l-h-1\">{{ 'Selected' | translate }}</span>\n <div class=\"flex-grow inner-scroll d-flex gap-4 a-i-center\">\n <ng-container *ngIf=\"!selected.length\">\n <em class=\"text-12 text-muted d-flex a-i-center fit-h-20\">{{ 'None' | translate }}</em>\n </ng-container>\n <span\n class=\"tag tag--info chip\"\n *ngFor=\"let selectedItem of selected\"\n >\n <button\n class=\"btn btn-xs btn-clean text-10\"\n title=\"{{ selectedItem.name }}\"\n type=\"button\"\n (click)=\"config.multi ? deselect(selectedItem) : deselectAll()\"\n >\n <i c8yIcon=\"times\"></i>\n </button>\n {{ selectedItem.name || (ASSET_CONST | translate: { assetId: selectedItem.id }) }}\n </span>\n </div>\n </div>\n</div>\n\n<div\n class=\"p-r-16\"\n *ngIf=\"selectedDevice\"\n>\n <div class=\"d-flex p-b-4\">\n <p\n class=\"text-medium p-t-8 m-r-8\"\n *ngIf=\"selectedDevice; else multiAssets\"\n >\n {{ 'Selected asset' | translate }}\n </p>\n <ng-template #multiAssets>\n <p class=\"text-medium m-r-8\">{{ 'Selected assets' | translate }}</p>\n </ng-template>\n <button\n class=\"btn btn-default btn-xs a-s-center m-t-4 m-l-auto\"\n title=\"{{ 'Change' | translate }}\"\n type=\"button\"\n (click)=\"clearSelectedDevices()\"\n >\n {{ 'Change' | translate }}\n </button>\n </div>\n <div class=\"d-flex\">\n <i\n class=\"text-success p-l-0 p-r-8\"\n [c8yIcon]=\"'check-circle'\"\n ></i>\n <i\n class=\"m-r-4 icon-20\"\n [c8yIcon]=\"selectedDevice | getGroupIcon | async\"\n ></i>\n <span>{{ selectedDevice.name }}</span>\n </div>\n</div>\n\n<!-- miller columns header -->\n<div\n class=\"miller-column__header sticky-top bg-inherit separator-bottom\"\n *ngIf=\"\n config.view === 'miller' &&\n ((config.showFilter && !rootNode.root) || config.columnHeaders) &&\n !selectedDevice\n \"\n [ngClass]=\"{ 'p-t-8': config.search }\"\n>\n <p\n class=\"text-12 text-muted text-truncate m-b-4\"\n title=\"{{ rootNode.breadcrumb || rootNode.label | translate }}\"\n *ngIf=\"config.singleColumn && index !== 0\"\n >\n <i\n class=\"m-r-4\"\n c8yIcon=\"home\"\n ></i>\n {{ rootNode.breadcrumb || rootNode.label | translate }}\n </p>\n <div\n class=\"d-flex a-i-center\"\n *ngIf=\"config.columnHeaders || config.singleColumn\"\n >\n <button\n class=\"btn btn-default btn-xs m-r-8 p-t-0 p-b-0 p-l-4 p-r-4 l-h-1\"\n title=\"{{ 'Back' | translate }}\"\n type=\"button\"\n *ngIf=\"config.singleColumn && !rootNode.root && index !== 0\"\n (click)=\"back()\"\n >\n <i c8yIcon=\"angle-left\"></i>\n </button>\n <label\n class=\"c8y-radio checkbox-inline m-r-8\"\n *ngIf=\"!rootNode.root && index === 0 && (config.groupsSelectable || !rootNode.isGroup())\"\n >\n <input\n title=\"{{ 'Select group' | translate }}\"\n type=\"radio\"\n (change)=\"select(rootNode.mo)\"\n [checked]=\"isGroupSelected()\"\n />\n <span></span>\n </label>\n\n <i\n class=\"icon-20 c8y-icon-duocolor m-r-4\"\n [c8yIcon]=\"this.rootNode.mo | getGroupIcon: true : this.rootNode.icon | async\"\n *ngIf=\"config.columnHeaders && (config.singleColumn || (!rootNode.root && index === 0))\"\n ></i>\n <p\n class=\"text-truncate\"\n title=\"{{ rootNode.label | translate }}\"\n *ngIf=\"config.columnHeaders\"\n [ngClass]=\"{\n 'text-label-small': !config.singleColumn,\n 'text-medium': config.singleColumn\n }\"\n >\n {{ rootNode.label | translate }}\n </p>\n </div>\n\n <div\n *ngIf=\"!rootNode.root && config.showFilter\"\n [ngClass]=\"{ 'p-t-4': config.columnHeaders }\"\n >\n <div class=\"input-group input-group-sm input-group-search\">\n <input\n class=\"form-control\"\n placeholder=\"{{ 'Filter this column\u2026' | translate }}\"\n [(ngModel)]=\"filterText\"\n (keyup.enter)=\"applyFilter('*' + filterText + '*')\"\n />\n <span class=\"input-group-btn\">\n <button\n class=\"btn btn-dot p-r-8 p-l-4\"\n title=\"{{ 'Apply filter' | translate }}\"\n type=\"button\"\n (click)=\"applyFilter('*' + filterText + '*')\"\n >\n <i c8yIcon=\"filter\"></i>\n </button>\n <button\n class=\"btn btn-dot p-r-8 p-l-4\"\n title=\" {{ 'Clear filters' | translate }}\"\n type=\"button\"\n (click)=\"clearFilters()\"\n *ngIf=\"filterText.length\"\n >\n <i c8yIcon=\"times\"></i>\n </button>\n </span>\n </div>\n </div>\n</div>\n\n<c8y-asset-selector-node\n class=\"d-block bg-inherit p-relative\"\n style=\"z-index: 9\"\n *ngIf=\"rootNode && !selectedDevice\"\n [node]=\"rootNode\"\n [rootNode]=\"rootNode\"\n [preselected]=\"selected\"\n [multi]=\"config.multi\"\n [view]=\"config.view\"\n [index]=\"index\"\n [active]=\"active\"\n [handleNextMillerViewColumn]=\"handleNextMillerViewColumn.bind(this)\"\n (isLoadingState)=\"onLoading($event)\"\n (onSelect)=\"onSelect($event)\"\n (onDeselect)=\"onDeselect($event)\"\n [ngClass]=\"{ 'collapse show': !rootNode.root && !rootNode.hidden && config.view !== 'miller' }\"\n></c8y-asset-selector-node>\n" }]
|
|
324
|
+
], template: "<div\n class=\"bg-inherit p-t-8 p-b-8 separator-bottom p-r-16 p-l-16 sticky-top\"\n [ngStyle]=\"{ 'z-index': config.singleColumn && config.search ? '30' : '20' }\"\n #header\n [ngClass]=\"{\n 'p-absolute miller-column__selection d-flex flex-wrap a-i-center': config.view === 'miller',\n 'miller-column__search': config.search,\n 'miller-column__multi': config.multi\n }\"\n *ngIf=\"\n !selectedDevice &&\n index === 0 &&\n (config.search || config.multi || config.label?.length || config.showSelected)\n \"\n>\n <p\n class=\"text-medium flex-no-shrink a-s-center\"\n [ngClass]=\"{\n 'm-b-4': config.search && root && config.singleColumn,\n 'm-r-8': !config.singleColumn && !config.search,\n 'fit-w': config.singleColumn\n }\"\n *ngIf=\"config.label?.length\"\n >\n {{ config.label | translate }}\n </p>\n <c8y-search-input\n [ngStyle]=\"{ 'min-width': !config.singleColumn && config.label.length ? '50%' : 'inherit' }\"\n *ngIf=\"config.search && root\"\n (onClick)=\"onSearchResultClick($event)\"\n (reset)=\"onSearchResultReset($event)\"\n [mode]=\"'select'\"\n [container]=\"container\"\n [groupsOnly]=\"config.groupsOnly\"\n [ngClass]=\"{\n 'm-l-auto': !config.singleColumn && config.label.length,\n 'fit-w': config.singleColumn || !config.label.length\n }\"\n ></c8y-search-input>\n <div\n class=\"bg-inherit d-flex gap-4 fit-w\"\n *ngIf=\"config.showSelected\"\n [ngClass]=\"{ 'm-t-4': config.search }\"\n >\n <span class=\"text-label-small m-r-4 a-s-center l-h-1\">{{ 'Selected' | translate }}</span>\n <div class=\"flex-grow inner-scroll d-flex gap-4 a-i-center\">\n <ng-container *ngIf=\"!selected.length\">\n <em class=\"text-12 text-muted d-flex a-i-center fit-h-20\">{{ 'None' | translate }}</em>\n </ng-container>\n <span\n class=\"tag tag--info chip\"\n *ngFor=\"let selectedItem of selected\"\n >\n <button\n class=\"btn btn-xs btn-clean text-10\"\n title=\"{{ selectedItem.name }}\"\n [disabled]=\"disabled\"\n type=\"button\"\n (click)=\"config.multi ? deselect(selectedItem) : deselectAll()\"\n >\n <i c8yIcon=\"times\"></i>\n </button>\n {{ selectedItem.name || (ASSET_CONST | translate: { assetId: selectedItem.id }) }}\n </span>\n </div>\n </div>\n</div>\n\n<div\n class=\"p-r-16\"\n *ngIf=\"selectedDevice\"\n>\n <div class=\"d-flex p-b-4\">\n <p\n class=\"text-medium p-t-8 m-r-8\"\n *ngIf=\"selectedDevice; else multiAssets\"\n >\n {{ 'Selected asset' | translate }}\n </p>\n <ng-template #multiAssets>\n <p class=\"text-medium m-r-8\">{{ 'Selected assets' | translate }}</p>\n </ng-template>\n <button\n class=\"btn btn-default btn-xs a-s-center m-t-4 m-l-auto\"\n title=\"{{ 'Change' | translate }}\"\n type=\"button\"\n (click)=\"clearSelectedDevices()\"\n >\n {{ 'Change' | translate }}\n </button>\n </div>\n <div class=\"d-flex\">\n <i\n class=\"text-success p-l-0 p-r-8\"\n [c8yIcon]=\"'check-circle'\"\n ></i>\n <i\n class=\"m-r-4 icon-20\"\n [c8yIcon]=\"selectedDevice | getGroupIcon | async\"\n ></i>\n <span>{{ selectedDevice.name }}</span>\n </div>\n</div>\n\n<!-- miller columns header -->\n<div\n class=\"miller-column__header sticky-top bg-inherit separator-bottom\"\n *ngIf=\"\n config.view === 'miller' &&\n ((config.showFilter && !rootNode.root) || config.columnHeaders) &&\n !selectedDevice\n \"\n [ngClass]=\"{ 'p-t-8': config.search }\"\n>\n <p\n class=\"text-12 text-muted text-truncate m-b-4\"\n title=\"{{ rootNode.breadcrumb || rootNode.label | translate }}\"\n *ngIf=\"config.singleColumn && index !== 0\"\n >\n <i\n class=\"m-r-4\"\n c8yIcon=\"home\"\n ></i>\n {{ rootNode.breadcrumb || rootNode.label | translate }}\n </p>\n <div\n class=\"d-flex a-i-center\"\n *ngIf=\"config.columnHeaders || config.singleColumn\"\n >\n <button\n class=\"btn btn-default btn-xs m-r-8 p-t-0 p-b-0 p-l-4 p-r-4 l-h-1\"\n title=\"{{ 'Back' | translate }}\"\n type=\"button\"\n *ngIf=\"config.singleColumn && !rootNode.root && index !== 0\"\n (click)=\"back()\"\n >\n <i c8yIcon=\"angle-left\"></i>\n </button>\n <label\n class=\"c8y-radio checkbox-inline m-r-8\"\n *ngIf=\"!rootNode.root && index === 0 && (config.groupsSelectable || !rootNode.isGroup())\"\n >\n <input\n title=\"{{ 'Select group' | translate }}\"\n type=\"radio\"\n (change)=\"select(rootNode.mo)\"\n [checked]=\"isGroupSelected()\"\n />\n <span></span>\n </label>\n\n <i\n class=\"icon-20 c8y-icon-duocolor m-r-4\"\n [c8yIcon]=\"this.rootNode.mo | getGroupIcon: true : this.rootNode.icon | async\"\n *ngIf=\"config.columnHeaders && (config.singleColumn || (!rootNode.root && index === 0))\"\n ></i>\n <p\n class=\"text-truncate\"\n title=\"{{ rootNode.label | translate }}\"\n *ngIf=\"config.columnHeaders\"\n [ngClass]=\"{\n 'text-label-small': !config.singleColumn,\n 'text-medium': config.singleColumn\n }\"\n >\n {{ rootNode.label | translate }}\n </p>\n </div>\n\n <div\n *ngIf=\"!rootNode.root && config.showFilter\"\n [ngClass]=\"{ 'p-t-4': config.columnHeaders }\"\n >\n <div class=\"input-group input-group-sm input-group-search\">\n <input\n class=\"form-control\"\n placeholder=\"{{ 'Filter this column\u2026' | translate }}\"\n [(ngModel)]=\"filterText\"\n (keyup.enter)=\"applyFilter('*' + filterText + '*')\"\n />\n <span class=\"input-group-btn\">\n <button\n class=\"btn btn-dot p-r-8 p-l-4\"\n title=\"{{ 'Apply filter' | translate }}\"\n type=\"button\"\n (click)=\"applyFilter('*' + filterText + '*')\"\n >\n <i c8yIcon=\"filter\"></i>\n </button>\n <button\n class=\"btn btn-dot p-r-8 p-l-4\"\n title=\" {{ 'Clear filters' | translate }}\"\n type=\"button\"\n (click)=\"clearFilters()\"\n *ngIf=\"filterText.length\"\n >\n <i c8yIcon=\"times\"></i>\n </button>\n </span>\n </div>\n </div>\n</div>\n\n<c8y-asset-selector-node\n class=\"d-block bg-inherit p-relative\"\n style=\"z-index: 9\"\n *ngIf=\"rootNode && !selectedDevice\"\n [node]=\"rootNode\"\n [rootNode]=\"rootNode\"\n [preselected]=\"selected\"\n [multi]=\"config.multi\"\n [view]=\"config.view\"\n [index]=\"index\"\n [active]=\"active\"\n [disabled]=\"disabled\"\n [handleNextMillerViewColumn]=\"handleNextMillerViewColumn.bind(this)\"\n (isLoadingState)=\"onLoading($event)\"\n (onSelect)=\"onSelect($event)\"\n (onDeselect)=\"onDeselect($event)\"\n [ngClass]=\"{ 'collapse show': !rootNode.root && !rootNode.hidden && config.view !== 'miller' }\"\n></c8y-asset-selector-node>\n" }]
|
|
324
325
|
}], ctorParameters: () => [{ type: i1.GroupNodeService }, { type: i2.InventoryService }, { type: i3.AssetSelectorService }, { type: i0.ChangeDetectorRef }], propDecorators: { config: [{
|
|
325
326
|
type: Input
|
|
326
327
|
}], active: [{
|
|
@@ -339,6 +340,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImpor
|
|
|
339
340
|
type: Input
|
|
340
341
|
}], container: [{
|
|
341
342
|
type: Input
|
|
343
|
+
}], disabled: [{
|
|
344
|
+
type: Input
|
|
342
345
|
}], onSelected: [{
|
|
343
346
|
type: Output
|
|
344
347
|
}], onClearSelected: [{
|
|
@@ -351,4 +354,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImpor
|
|
|
351
354
|
type: ViewChild,
|
|
352
355
|
args: ['header']
|
|
353
356
|
}] } });
|
|
354
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNzZXQtc2VsZWN0b3IuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vYXNzZXRzLW5hdmlnYXRvci9hc3NldC1zZWxlY3Rvci9hc3NldC1zZWxlY3Rvci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9hc3NldHMtbmF2aWdhdG9yL2Fzc2V0LXNlbGVjdG9yL2Fzc2V0LXNlbGVjdG9yLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxpQkFBaUIsRUFDakIsU0FBUyxFQUNULFVBQVUsRUFDVixZQUFZLEVBQ1osS0FBSyxFQUVMLE1BQU0sRUFFTixTQUFTLEVBQ1QsVUFBVSxFQUNYLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxhQUFhLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNsRSxPQUFPLEVBQStCLGdCQUFnQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzVFLE9BQU8sRUFBRSxlQUFlLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ2hELE9BQU8sRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDaEQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDMUQsT0FBTyxFQUdMLHNCQUFzQixFQUN2QixNQUFNLHdCQUF3QixDQUFDO0FBQ2hDLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDekMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDeEQsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDbEUsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLHFCQUFxQixDQUFDOzs7Ozs7Ozs7QUFFOUM7O0dBRUc7QUFp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RUFBRSxpQkFBaUI7Z0JBQzFCLEtBQUssRUFBRSxJQUFJO2dCQUNYLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsc0JBQXNCLENBQUM7YUFDdEQ7WUFDRDtnQkFDRSxPQUFPLEVBQUUsYUFBYTtnQkFDdEIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxzQkFBc0IsQ0FBQztnQkFDckQsS0FBSyxFQUFFLElBQUk7YUFDWjtTQUNGLHdLQzdDSCxpMk5BMk5BOzsyRkQ1S2Esc0JBQXNCO2tCQWhCbEMsU0FBUzsrQkFDRSxvQkFBb0IsYUFFbkI7d0JBQ1Q7NEJBQ0UsT0FBTyxFQUFFLGlCQUFpQjs0QkFDMUIsS0FBSyxFQUFFLElBQUk7NEJBQ1gsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsdUJBQXVCLENBQUM7eUJBQ3REO3dCQUNEOzRCQUNFLE9BQU8sRUFBRSxhQUFhOzRCQUN0QixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSx1QkFBdUIsQ0FBQzs0QkFDckQsS0FBSyxFQUFFLElBQUk7eUJBQ1o7cUJBQ0Y7dUxBTVEsTUFBTTtzQkFBZCxLQUFLO2dCQUlHLE1BQU07c0JBQWQsS0FBSztnQkFLRyxLQUFLO3NCQUFiLEtBQUs7Z0JBSUcsS0FBSztzQkFBYixLQUFLO2dCQUlHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBSUcsUUFBUTtzQkFBaEIsS0FBSztnQkFJRyxRQUFRO3NCQUFoQixLQUFLO2dCQUlHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBQ0csU0FBUztzQkFBakIsS0FBSztnQkFJSSxVQUFVO3NCQUFuQixNQUFNO2dCQUlHLGVBQWU7c0JBQXhCLE1BQU07Z0JBSUcsYUFBYTtzQkFBdEIsTUFBTTtnQkFJRyxNQUFNO3NCQUFmLE1BQU07Z0JBcUJDLE1BQU07c0JBRGIsU0FBUzt1QkFBQyxRQUFRIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT25Jbml0LFxuICBPdXRwdXQsXG4gIFNpbXBsZUNoYW5nZXMsXG4gIFZpZXdDaGlsZCxcbiAgZm9yd2FyZFJlZlxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE5HX1ZBTElEQVRPUlMsIE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgSUlkZW50aWZpZWQsIElNYW5hZ2VkT2JqZWN0LCBJbnZlbnRvcnlTZXJ2aWNlIH0gZnJvbSAnQGM4eS9jbGllbnQnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyB0YWtlVW50aWwsIHRhcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IEFzc2V0U2VsZWN0b3JCYXNlIH0gZnJvbSAnLi9hc3NldC1zZWxlY3Rvci1iYXNlJztcbmltcG9ydCB7XG4gIEFzc2V0U2VsZWN0aW9uQ2hhbmdlRXZlbnQsXG4gIEFzc2V0U2VsZWN0b3JPcHRpb25zLFxuICBDT05GSUdfT1BUSU9OU19ERUZBVUxUXG59IGZyb20gJy4vYXNzZXQtc2VsZWN0b3IubW9kZWwnO1xuaW1wb3J0IHsgQXNzZXRTZWxlY3RvclNlcnZpY2UgfSBmcm9tICcuL2Fzc2V0LXNlbGVjdG9yLnNlcnZpY2UnO1xuaW1wb3J0IHsgR3JvdXBOb2RlIH0gZnJvbSAnLi9ncm91cC1ub2RlJztcbmltcG9ydCB7IEdyb3VwTm9kZVNlcnZpY2UgfSBmcm9tICcuL2dyb3VwLW5vZGUuc2VydmljZSc7XG5pbXBvcnQgeyBVbmFzc2lnbmVkRGV2aWNlc05vZGUgfSBmcm9tICcuL3VuYXNzaWduZWQtZGV2aWNlcy1ub2RlJztcbmltcG9ydCB7IGdldHRleHQgfSBmcm9tICdAYzh5L25neC1jb21wb25lbnRzJztcblxuLyoqXG4gKiBEaXNwbGF5cyBhIGhpZXJhcmNoaWNhbCB0cmVlIHNlbGVjdG9yIGZvciBhc3NldHMuXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2M4eS1hc3NldC1zZWxlY3RvcicsXG4gIHRlbXBsYXRlVXJsOiAnLi9hc3NldC1zZWxlY3Rvci5jb21wb25lbnQuaHRtbCcsXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgbXVsdGk6IHRydWUsXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBBc3NldFNlbGVjdG9yQ29tcG9uZW50KVxuICAgIH0sXG4gICAge1xuICAgICAgcHJvdmlkZTogTkdfVkFMSURBVE9SUyxcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IEFzc2V0U2VsZWN0b3JDb21wb25lbnQpLFxuICAgICAgbXVsdGk6IHRydWVcbiAgICB9XG4gIF1cbn0pXG5leHBvcnQgY2xhc3MgQXNzZXRTZWxlY3RvckNvbXBvbmVudCBleHRlbmRzIEFzc2V0U2VsZWN0b3JCYXNlIGltcGxlbWVudHMgT25Jbml0IHtcbiAgLyoqXG4gICAqIENvbmZpZyBvYmplY3QgY29udGFpbmluZyBhbGwgb3B0aW9ucyBmb3IgdGhlIGFzc2V0IHNlbGVjdG9yLlxuICAgKi9cbiAgQElucHV0KCkgY29uZmlnOiBBc3NldFNlbGVjdG9yT3B0aW9ucyA9IHt9O1xuICAvKipcbiAgICogRGVmaW5lcyB0aGUgbm9kZSwgd2hpY2ggc2hvdWxkIGJlIGRpc3BsYXllZCBhcyBhY3RpdmUuXG4gICAqL1xuICBASW5wdXQoKSBhY3RpdmU6IEdyb3VwTm9kZTtcbiAgLyoqXG4gICAqIFVzZWQgb25seSBmb3IgbWlsbGVyLXZpZXcsIGRpc3BsYXlzIHRoZSBjb2x1bW4gbGV2ZWwgZm9yIHRoZSBjdXJyZW50IG5vZGUuXG4gICAqIEUuZyBpZiB0aGUgaW5kZXggaXMgb25lLCB0aGlzIHdpbGwgYmUgc2Vjb25kIGNvbHVtbi5cbiAgICovXG4gIEBJbnB1dCgpIGluZGV4ID0gMDtcbiAgLyoqXG4gICAqIFRoZSBhc3NldCB0byB1c2UgYXMgcm9vdC5cbiAgICovXG4gIEBJbnB1dCgpIGFzc2V0OiBJSWRlbnRpZmllZCA9IHVuZGVmaW5lZDtcbiAgLyoqXG4gICAqIFRoZSBzZWxlY3RlZCBkZXZpY2UuXG4gICAqL1xuICBASW5wdXQoKSBzZWxlY3RlZERldmljZTogSU1hbmFnZWRPYmplY3QgPSB1bmRlZmluZWQ7XG4gIC8qKlxuICAgKiBBbiBhcnJheSBvZiBwcmVkZWZpbmVkIG5vZGVzLlxuICAgKi9cbiAgQElucHV0KCkgc2VsZWN0ZWQ6IEFycmF5PFBhcnRpYWw8SU1hbmFnZWRPYmplY3Q+PiB8IElJZGVudGlmaWVkW10gfCBJSWRlbnRpZmllZCA9IFtdO1xuICAvKipcbiAgICogVGhlIG5vZGUgdG8gdXNlIGFzIHJvb3QuIFlvdSBjYW4gZWl0aGVyIHNldCB0aGlzLCBvciB0aGUgYXNzZXQgdG8gc3RhcnQgZnJvbS5cbiAgICovXG4gIEBJbnB1dCgpIHJvb3ROb2RlOiBHcm91cE5vZGU7XG4gIC8qKlxuICAgKiBBbGwgY3VycmVudGx5IHNlbGVjdGVkIGFzc2V0cy5cbiAgICovXG4gIEBJbnB1dCgpIHNlbGVjdGVkSXRlbXM6IElJZGVudGlmaWVkW10gfCBJSWRlbnRpZmllZCA9IFtdO1xuICBASW5wdXQoKSBjb250YWluZXI6ICcnIHwgJ2JvZHknID0gJ2JvZHknO1xuICAvKipcbiAgICogRW1pdHMgaWYgb25lIGl0ZW0gd2FzIHNlbGVjdGVkIChhbGwgY3VycmVudGx5IHNlbGVjdGVkIG5vZGVzKS5cbiAgICovXG4gIEBPdXRwdXQoKSBvblNlbGVjdGVkID0gbmV3IEV2ZW50RW1pdHRlcjxBc3NldFNlbGVjdGlvbkNoYW5nZUV2ZW50PigpO1xuICAvKipcbiAgICogRW1pdHMgaWYgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBhc3NldCBpcyBjbGVhcmVkLlxuICAgKi9cbiAgQE91dHB1dCgpIG9uQ2xlYXJTZWxlY3RlZCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgLyoqXG4gICAqIFVzZWQgb25seSBmb3IgbWlsbGVyIHZpZXcuIEVtaXQgdGhlIHNlbGVjdGVkIG5vZGUgYW5kIHVzZSBpdCBhcyBhICdyb290Tm9kZScgZm9yIHRoZSBuZXcgY29sdW1uLlxuICAgKi9cbiAgQE91dHB1dCgpIG9uUm93U2VsZWN0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgLyoqXG4gICAqIEVtaXRzIHRoZSBjdXJyZW50IGxvYWRpbmcgc3RhdGUgb2YgdGhlIG5vZGUuXG4gICAqL1xuICBAT3V0cHV0KCkgb25Mb2FkID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIC8qKlxuICAgKiBUaGUgY3VycmVudCBmaWx0ZXIgYXBwbGllZC5cbiAgICovXG4gIGZpbHRlclRleHQgPSAnJztcbiAgLyoqXG4gICAqIERpc3BsYXlzIHRoZSBnbG9iYWwgc2VhcmNoIGF0IGFsbCB0aW1lcyBpZiB0aGUgbWlsbGVyIHZpZXcgaXMgdXNlZFxuICAgKiBvbiByb290IGdyb3VwIGxldmVsLlxuICAgKi9cbiAgcm9vdCA9IGZhbHNlO1xuICAvKipcbiAgICogQGlnbm9yZVxuICAgKi9cbiAgdW5zdWJzY3JpYmUkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGN1cnJlbnQgaGVhZGVyIGhpZ2h0IGluIHBpeGVsLlxuICAgKi9cbiAgZ2V0SGVhZGVySGVpZ2h0JCA9IG5ldyBCZWhhdmlvclN1YmplY3QoMCk7XG4gIHJlYWRvbmx5IEFTU0VUX0NPTlNUID0gZ2V0dGV4dCgnQXNzZXQge3sgYXNzZXRJZCB9fScpO1xuXG4gIEBWaWV3Q2hpbGQoJ2hlYWRlcicpXG4gIHByaXZhdGUgaGVhZGVyOiBFbGVtZW50UmVmO1xuXG4gIC8qKlxuICAgKiBAaWdub3JlIG9ubHkgRElcbiAgICovXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByb3RlY3RlZCBncm91cE5vZGVTZXJ2aWNlOiBHcm91cE5vZGVTZXJ2aWNlLFxuICAgIHByb3RlY3RlZCBpbnZlbnRvcnk6IEludmVudG9yeVNlcnZpY2UsXG4gICAgcHJvdGVjdGVkIGFzc2V0U2VsZWN0b3JTZXJ2aWNlOiBBc3NldFNlbGVjdG9yU2VydmljZSxcbiAgICBwcm90ZWN0ZWQgY2Q6IENoYW5nZURldGVjdG9yUmVmXG4gICkge1xuICAgIHN1cGVyKGdyb3VwTm9kZVNlcnZpY2UsIGludmVudG9yeSwgYXNzZXRTZWxlY3RvclNlcnZpY2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyB3aGVuIGEgbm9kZSB3YXMgc2VsZWN0ZWQsIGlmIGEgbmV3IGNvbHVtbiBuZWVkcyB0byBiZSBhZGRlZC5cbiAgICogQHBhcmFtIG5vZGUgVGhlIG5vZGUgdGhhdCB3YXMgY2xpY2tlZC5cbiAgICogQHBhcmFtIGluZGV4IFRoZSBjdXJyZW50IGluZGV4IG9mIHRoaXMgbm9kZS5cbiAgICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgY2xpY2sgd2FzIGhhbmRsZWQgYW5kIGEgbmV3IGNvbHVtbiB3YXMgYWRkZWQuXG4gICAqL1xuICBoYW5kbGVOZXh0TWlsbGVyVmlld0NvbHVtbihub2RlOiBHcm91cE5vZGUsIGluZGV4OiBudW1iZXIpIHtcbiAgICBjb25zdCBub2RlQ29weSA9IE9iamVjdC5jcmVhdGUobm9kZSk7XG4gICAgY29uc3QgaXNTYW1lQXNSb290ID0gdGhpcy5yb290Tm9kZSA9PT0gbm9kZTtcbiAgICBjb25zdCBpc1VuYXNzaWduZWREZXZpY2VzTm9kZSA9IG5vZGUudG9TdHJpbmcoKSA9PT0gVW5hc3NpZ25lZERldmljZXNOb2RlLk5BTUU7XG4gICAgY29uc3QgaXNOZXdDb2x1bW5OZWVkZWQgPVxuICAgICAgIWlzU2FtZUFzUm9vdCAmJiAobm9kZS5pc0dyb3VwKCkgfHwgaXNVbmFzc2lnbmVkRGV2aWNlc05vZGUgfHwgbm9kZS5oYXNDaGlsZERldmljZXMoKSk7XG5cbiAgICBpZiAoaXNOZXdDb2x1bW5OZWVkZWQpIHtcbiAgICAgIHRoaXMub25Sb3dTZWxlY3RlZC5lbWl0KHsgbm9kZUNvcHksIGluZGV4IH0pO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaWdub3JlXG4gICAqL1xuICBhc3luYyBuZ09uSW5pdCgpIHtcbiAgICBpZiAodGhpcy5pbmRleCA9PT0gMCkge1xuICAgICAgdGhpcy5jb25maWcgPSB7IC4uLkNPTkZJR19PUFRJT05TX0RFRkFVTFQsIC4uLnRoaXMuY29uZmlnIH07XG4gICAgfVxuICAgIGNvbnN0IHNob3VsZFJlc2V0TmFtZUZpbHRlciA9XG4gICAgICB0aGlzLnJvb3ROb2RlICYmIHRoaXMucm9vdE5vZGUubW8gJiYgdGhpcy5jb25maWcudmlldyA9PT0gJ21pbGxlcic7XG4gICAgaWYgKHNob3VsZFJlc2V0TmFtZUZpbHRlcikge1xuICAgICAgYXdhaXQgdGhpcy5hcHBseUZpbHRlcignJyk7XG4gICAgfVxuXG4gICAgY29uc3QgaXNPbmx5QXNzZXROb2RlRGVmaW5lZCA9IHRoaXMuYXNzZXQ7XG4gICAgaWYgKGlzT25seUFzc2V0Tm9kZURlZmluZWQpIHtcbiAgICAgIHRoaXMucm9vdE5vZGUgPSBhd2FpdCB0aGlzLmNyZWF0ZU1hbmFnZWRPYmplY3RSb290Tm9kZSh0aGlzLmFzc2V0KTtcbiAgICB9XG5cbiAgICBjb25zdCBpc0FueU5vZGVEZWZpbmVkID1cbiAgICAgICF0aGlzLnJvb3ROb2RlICYmICghdGhpcy5hc3NldCB8fCBPYmplY3Qua2V5cyh0aGlzLmFzc2V0KS5sZW5ndGggPT09IDApO1xuICAgIGlmIChpc0FueU5vZGVEZWZpbmVkKSB7XG4gICAgICB0aGlzLnJvb3ROb2RlID0gdGhpcy5jcmVhdGVEZWZhdWx0Um9vdE5vZGUoKTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICB0aGlzLmNvbmZpZy5zaG93VW5hc3NpZ25lZERldmljZXMgJiZcbiAgICAgICghdGhpcy5hc3NldCB8fCBPYmplY3Qua2V5cyh0aGlzLmFzc2V0KS5sZW5ndGggPT09IDApICYmXG4gICAgICB0aGlzLnJvb3ROb2RlLnJvb3RcbiAgICApIHtcbiAgICAgIHRoaXMucm9vdE5vZGUuYWRkKFxuICAgICAgICBuZXcgVW5hc3NpZ25lZERldmljZXNOb2RlKHRoaXMuZ3JvdXBOb2RlU2VydmljZSwge1xuICAgICAgICAgIHNob3dDaGlsZERldmljZXM6IHRoaXMuY29uZmlnLnNob3dDaGlsZERldmljZXNcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfVxuICAgIHRoaXMucm9vdCA9IHRoaXMucm9vdE5vZGUucm9vdDtcbiAgfVxuXG4gIGFzeW5jIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcbiAgICBpZiAoXG4gICAgICBjaGFuZ2VzLmFzc2V0ICYmXG4gICAgICBjaGFuZ2VzLmFzc2V0LmN1cnJlbnRWYWx1ZSAmJlxuICAgICAgT2JqZWN0LmtleXMoY2hhbmdlcy5hc3NldC5jdXJyZW50VmFsdWUpLmxlbmd0aCAhPT0gMFxuICAgICkge1xuICAgICAgdGhpcy5yb290Tm9kZSA9IGF3YWl0IHRoaXMuY3JlYXRlTWFuYWdlZE9iamVjdFJvb3ROb2RlKGNoYW5nZXMuYXNzZXQuY3VycmVudFZhbHVlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGlnbm9yZVxuICAgKi9cbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICBpZiAodGhpcy5oZWFkZXI/Lm5hdGl2ZUVsZW1lbnQpIHtcbiAgICAgICAgdGhpcy5nZXRIZWFkZXJIZWlnaHQkLm5leHQodGhpcy5oZWFkZXIubmF0aXZlRWxlbWVudC5jbGllbnRIZWlnaHQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5nZXRIZWFkZXJIZWlnaHQkLm5leHQoMCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ2hhbmdlcyB0aGUgY3VycmVudCByb290IHRvIG9uZSBsZXZlbCBiYWNrLlxuICAgKi9cbiAgYmFjaygpIHtcbiAgICBjb25zdCBpbmRleCA9IHRoaXMuaW5kZXggLSAxO1xuICAgIGNvbnN0IG5vZGVDb3B5ID0gT2JqZWN0LmNyZWF0ZSh0aGlzLnJvb3ROb2RlLnBhcmVudHNbMF0pO1xuICAgIHRoaXMub25Sb3dTZWxlY3RlZC5lbWl0KHsgbm9kZUNvcHksIGluZGV4IH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENsZWFycyB0aGUgY3VycmVudCBmaWx0ZXIuXG4gICAqL1xuICBjbGVhckZpbHRlcnMoKSB7XG4gICAgdGhpcy5maWx0ZXJUZXh0ID0gJyc7XG4gICAgdGhpcy5hcHBseUZpbHRlcignJyk7XG4gIH1cblxuICBjbGVhclNlbGVjdGVkRGV2aWNlcygpIHtcbiAgICB0aGlzLnNlbGVjdGVkRGV2aWNlID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuYXBwbHlGaWx0ZXIoJycpO1xuICAgIHRoaXMub25DbGVhclNlbGVjdGVkLmVtaXQoKTtcbiAgfVxuXG4gIGlzR3JvdXBTZWxlY3RlZCgpIHtcbiAgICBpZiAodGhpcy5zZWxlY3RlZC5zb21lKHNlbGVjdGVkTm9kZSA9PiBzZWxlY3RlZE5vZGUuaWQgPT09IHRoaXMucm9vdE5vZGUubW8/LmlkKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGdyb3VwTmFtZUZpbHRlcihuYW1lRmlsdGVyOiBzdHJpbmcsIG1vSWQsIHNob3dVbmFzc2lnbmVkRGV2aWNlcz86IGJvb2xlYW4pIHtcbiAgICBpZiAobmFtZUZpbHRlcikge1xuICAgICAgY29uc3QgZmlsdGVyQnlOYW1lID0gc2hvd1VuYXNzaWduZWREZXZpY2VzXG4gICAgICAgID8ge1xuICAgICAgICAgICAgX19maWx0ZXI6IHtcbiAgICAgICAgICAgICAgbmFtZTogbmFtZUZpbHRlclxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF9fb3JkZXJieTogW3sgbmFtZTogMSB9XVxuICAgICAgICAgIH1cbiAgICAgICAgOiB7XG4gICAgICAgICAgICBfX2ZpbHRlcjoge1xuICAgICAgICAgICAgICBuYW1lOiBuYW1lRmlsdGVyLFxuICAgICAgICAgICAgICBfX2J5Z3JvdXBpZDogbW9JZFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH07XG4gICAgICByZXR1cm4gdGhpcy5hc3NldFNlbGVjdG9yU2VydmljZS5xdWVyaWVzVXRpbC5idWlsZFF1ZXJ5KGZpbHRlckJ5TmFtZSk7XG4gICAgfVxuICAgIGNvbnN0IGRlZmF1bHRGaWx0ZXIgPSB7XG4gICAgICBfX2ZpbHRlcjoge1xuICAgICAgICBfX2J5Z3JvdXBpZDogbW9JZFxuICAgICAgfSxcbiAgICAgIF9fb3JkZXJieTogW3sgbmFtZTogMSB9XVxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMuYXNzZXRTZWxlY3RvclNlcnZpY2UucXVlcmllc1V0aWwuYnVpbGRRdWVyeShkZWZhdWx0RmlsdGVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBsaWVzIGEgZmlsdGVyLlxuICAgKiBAcGFyYW0gZmlsdGVyIFRoZSBmaWx0ZXIgdG8gYXBwbHkuXG4gICAqL1xuICBhc3luYyBhcHBseUZpbHRlcihmaWx0ZXI6IHN0cmluZykge1xuICAgIHRoaXMucm9vdE5vZGUuZmlsdGVyUXVlcnkkLm5leHQoXG4gICAgICB0aGlzLmdyb3VwTmFtZUZpbHRlcihcbiAgICAgICAgZmlsdGVyLFxuICAgICAgICB0aGlzLnJvb3ROb2RlLm1vLmlkLFxuICAgICAgICB0aGlzLmlzVW5hc3NpZ25lZERldmljZXNOb2RlKCkgPyB0cnVlIDogZmFsc2VcbiAgICAgIClcbiAgICApO1xuICAgIHRoaXMucm9vdE5vZGUucmVmcmVzaCgpO1xuICAgIHRoaXMub25Mb2FkLmVtaXQoe1xuICAgICAgbG9hZGluZzogdHJ1ZSxcbiAgICAgIGZpbHRlclRleHQ6IHRoaXMuZmlsdGVyVGV4dCxcbiAgICAgIGluZGV4OiB0aGlzLmluZGV4LFxuICAgICAgc2VsZWN0ZWREZXZpY2U6IHRoaXMuc2VsZWN0ZWREZXZpY2VcbiAgICB9KTtcbiAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiB0aGUgVW5hc3NpZ25lZERldmljZSBub2RlIGlzIHRoZSByb290Tm9kZS5cbiAgICovXG4gIGlzVW5hc3NpZ25lZERldmljZXNOb2RlKCkge1xuICAgIHJldHVybiB0aGlzLnJvb3ROb2RlLnRvU3RyaW5nKCkgPT09IFVuYXNzaWduZWREZXZpY2VzTm9kZS5OQU1FO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIHRoZSB1c2VyIHJlc2V0cyB0aGUgc2VhcmNoIHJlc3VsdC5cbiAgICovXG4gIG9uU2VhcmNoUmVzdWx0UmVzZXQoc2VsZWN0ZWRJdGVtKSB7XG4gICAgaWYgKHNlbGVjdGVkSXRlbSkge1xuICAgICAgdGhpcy5yb290Tm9kZSA9IHRoaXMuY3JlYXRlRGVmYXVsdFJvb3ROb2RlKCk7XG4gICAgICBpZiAodGhpcy5jb25maWcuc2hvd1VuYXNzaWduZWREZXZpY2VzKSB7XG4gICAgICAgIHRoaXMucm9vdE5vZGUuYWRkKFxuICAgICAgICAgIG5ldyBVbmFzc2lnbmVkRGV2aWNlc05vZGUodGhpcy5ncm91cE5vZGVTZXJ2aWNlLCB7XG4gICAgICAgICAgICBzaG93Q2hpbGREZXZpY2VzOiB0aGlzLmNvbmZpZy5zaG93Q2hpbGREZXZpY2VzXG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmNvbmZpZy52aWV3ID09PSAnbWlsbGVyJykge1xuICAgICAgICB0aGlzLm9uUm93U2VsZWN0ZWQuZW1pdCh7IHJvb3Q6IHRydWUgfSk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMucm9vdE5vZGUuY2xpY2soeyBvcGVuOiB0cnVlIH0pO1xuICAgICAgdGhpcy5yb290Tm9kZS5ub2Rlc0ZldGNoZWRcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgdGFwKCgpID0+IHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpKSxcbiAgICAgICAgICB0YWtlVW50aWwodGhpcy51bnN1YnNjcmliZSQpXG4gICAgICAgIClcbiAgICAgICAgLnN1YnNjcmliZSgpO1xuXG4gICAgICBpZiAodGhpcy5jb25maWcudmlldyA9PT0gJ3RyZWUnKSB7XG4gICAgICAgIHRoaXMucm9vdE5vZGUub3BlbiA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENhbGxlZCBpZiB0aGUgdXNlciBjbGlja3Mgb24gYSBzZWFyY2ggcmVzdWx0LlxuICAgKi9cbiAgYXN5bmMgb25TZWFyY2hSZXN1bHRDbGljayhtbzogSU1hbmFnZWRPYmplY3QpIHtcbiAgICBjb25zdCBjYW5TZWxlY3ROb2RlID0gdGhpcy5jb25maWcuZ3JvdXBzU2VsZWN0YWJsZSB8fCAhdGhpcy5ncm91cE5vZGVTZXJ2aWNlLmlzR3JvdXAobW8pO1xuICAgIGlmICh0aGlzLmNvbmZpZy52aWV3ID09PSAnbWlsbGVyJykge1xuICAgICAgdGhpcy5yb290Tm9kZSA9IGF3YWl0IHRoaXMuY3JlYXRlTWFuYWdlZE9iamVjdFJvb3ROb2RlKG1vKTtcbiAgICAgIHRoaXMucm9vdE5vZGUuY2xpY2soeyBvcGVuOiB0cnVlIH0pO1xuICAgICAgY29uc3Qgbm9kZUNvcHkgPSBPYmplY3QuY3JlYXRlKHRoaXMucm9vdE5vZGUpO1xuICAgICAgdGhpcy5vblJvd1NlbGVjdGVkLmVtaXQoe1xuICAgICAgICBub2RlQ29weSxcbiAgICAgICAgaW5kZXg6IDAsXG4gICAgICAgIHNlbGVjdGVkRGV2aWNlczogdGhpcy5zZWxlY3RlZERldmljZSxcbiAgICAgICAgcm9vdDogdHJ1ZVxuICAgICAgfSk7XG4gICAgfVxuICAgIGlmICghdGhpcy5jb25maWcubXVsdGkpIHtcbiAgICAgIHRoaXMuZGVzZWxlY3RBbGwoKTtcbiAgICB9XG4gICAgaWYgKGNhblNlbGVjdE5vZGUpIHtcbiAgICAgIHRoaXMuc2VsZWN0KG1vKTtcbiAgICB9XG4gIH1cblxuICBvbkxvYWRpbmcoaXNMb2FkaW5nOiBib29sZWFuKSB7XG4gICAgdGhpcy5vbkxvYWQuZW1pdCh7IGxvYWRpbmc6IGlzTG9hZGluZywgZmlsdGVyVGV4dDogdGhpcy5maWx0ZXJUZXh0IH0pO1xuICAgIHRoaXMuY2QubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBvblNlbGVjdChtbzogSU1hbmFnZWRPYmplY3QpIHtcbiAgICB0aGlzLnNlbGVjdChtbyk7XG4gIH1cblxuICBvbkRlc2VsZWN0KGNvbmZpZzogeyBkZXNlbGVjdE1vZGU6ICdzaW5nbGUnIHwgJ2FsbCc7IG1vOiBJTWFuYWdlZE9iamVjdCB9KSB7XG4gICAgc3dpdGNoIChjb25maWc/LmRlc2VsZWN0TW9kZSkge1xuICAgICAgY2FzZSAnc2luZ2xlJzpcbiAgICAgICAgdGhpcy5kZXNlbGVjdChjb25maWcubW8pO1xuICAgICAgICB0aGlzLmNkLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2FsbCc6XG4gICAgICAgIHRoaXMuZGVzZWxlY3RBbGwoY29uZmlnLm1vKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG59XG4iLCI8ZGl2XG4gIGNsYXNzPVwiYmctaW5oZXJpdCBwLXQtOCBwLWItOCBzZXBhcmF0b3ItYm90dG9tIHAtci0xNiBwLWwtMTYgc3RpY2t5LXRvcFwiXG4gIFtuZ1N0eWxlXT1cInsgJ3otaW5kZXgnOiBjb25maWcuc2luZ2xlQ29sdW1uICYmIGNvbmZpZy5zZWFyY2ggPyAnMzAnIDogJzIwJyB9XCJcbiAgI2hlYWRlclxuICBbbmdDbGFzc109XCJ7XG4gICAgJ3AtYWJzb2x1dGUgbWlsbGVyLWNvbHVtbl9fc2VsZWN0aW9uIGQtZmxleCBmbGV4LXdyYXAgYS1pLWNlbnRlcic6IGNvbmZpZy52aWV3ID09PSAnbWlsbGVyJyxcbiAgICAnbWlsbGVyLWNvbHVtbl9fc2VhcmNoJzogY29uZmlnLnNlYXJjaCxcbiAgICAnbWlsbGVyLWNvbHVtbl9fbXVsdGknOiBjb25maWcubXVsdGlcbiAgfVwiXG4gICpuZ0lmPVwiXG4gICAgIXNlbGVjdGVkRGV2aWNlICYmXG4gICAgaW5kZXggPT09IDAgJiZcbiAgICAoY29uZmlnLnNlYXJjaCB8fCBjb25maWcubXVsdGkgfHwgY29uZmlnLmxhYmVsPy5sZW5ndGggfHwgY29uZmlnLnNob3dTZWxlY3RlZClcbiAgXCJcbj5cbiAgPHBcbiAgICBjbGFzcz1cInRleHQtbWVkaXVtIGZsZXgtbm8tc2hyaW5rIGEtcy1jZW50ZXJcIlxuICAgIFtuZ0NsYXNzXT1cIntcbiAgICAgICdtLWItNCc6IGNvbmZpZy5zZWFyY2ggJiYgcm9vdCAmJiBjb25maWcuc2luZ2xlQ29sdW1uLFxuICAgICAgJ20tci04JzogIWNvbmZpZy5zaW5nbGVDb2x1bW4gJiYgIWNvbmZpZy5zZWFyY2gsXG4gICAgICAnZml0LXcnOiBjb25maWcuc2luZ2xlQ29sdW1uXG4gICAgfVwiXG4gICAgKm5nSWY9XCJjb25maWcubGFiZWw/Lmxlbmd0aFwiXG4gID5cbiAgICB7eyBjb25maWcubGFiZWwgfCB0cmFuc2xhdGUgfX1cbiAgPC9wPlxuICA8Yzh5LXNlYXJjaC1pbnB1dFxuICAgIFtuZ1N0eWxlXT1cInsgJ21pbi13aWR0aCc6ICFjb25maWcuc2luZ2xlQ29sdW1uICYmIGNvbmZpZy5sYWJlbC5sZW5ndGggPyAnNTAlJyA6ICdpbmhlcml0JyB9XCJcbiAgICAqbmdJZj1cImNvbmZpZy5zZWFyY2ggJiYgcm9vdFwiXG4gICAgKG9uQ2xpY2spPVwib25TZWFyY2hSZXN1bHRDbGljaygkZXZlbnQpXCJcbiAgICAocmVzZXQpPVwib25TZWFyY2hSZXN1bHRSZXNldCgkZXZlbnQpXCJcbiAgICBbbW9kZV09XCInc2VsZWN0J1wiXG4gICAgW2NvbnRhaW5lcl09XCJjb250YWluZXJcIlxuICAgIFtncm91cHNPbmx5XT1cImNvbmZpZy5ncm91cHNPbmx5XCJcbiAgICBbbmdDbGFzc109XCJ7XG4gICAgICAnbS1sLWF1dG8nOiAhY29uZmlnLnNpbmdsZUNvbHVtbiAmJiBjb25maWcubGFiZWwubGVuZ3RoLFxuICAgICAgJ2ZpdC13JzogY29uZmlnLnNpbmdsZUNvbHVtbiB8fCAhY29uZmlnLmxhYmVsLmxlbmd0aFxuICAgIH1cIlxuICA+PC9jOHktc2VhcmNoLWlucHV0PlxuICA8ZGl2XG4gICAgY2xhc3M9XCJiZy1pbmhlcml0IGQtZmxleCBnYXAtNCBmaXQtd1wiXG4gICAgKm5nSWY9XCJjb25maWcuc2hvd1NlbGVjdGVkXCJcbiAgICBbbmdDbGFzc109XCJ7ICdtLXQtNCc6IGNvbmZpZy5zZWFyY2ggfVwiXG4gID5cbiAgICA8c3BhbiBjbGFzcz1cInRleHQtbGFiZWwtc21hbGwgbS1yLTQgYS1zLWNlbnRlciBsLWgtMVwiPnt7ICdTZWxlY3RlZCcgfCB0cmFuc2xhdGUgfX08L3NwYW4+XG4gICAgPGRpdiBjbGFzcz1cImZsZXgtZ3JvdyBpbm5lci1zY3JvbGwgZC1mbGV4IGdhcC00IGEtaS1jZW50ZXJcIj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhc2VsZWN0ZWQubGVuZ3RoXCI+XG4gICAgICAgIDxlbSBjbGFzcz1cInRleHQtMTIgdGV4dC1tdXRlZCBkLWZsZXggYS1pLWNlbnRlciBmaXQtaC0yMFwiPnt7ICdOb25lJyB8IHRyYW5zbGF0ZSB9fTwvZW0+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDxzcGFuXG4gICAgICAgIGNsYXNzPVwidGFnIHRhZy0taW5mbyBjaGlwXCJcbiAgICAgICAgKm5nRm9yPVwibGV0IHNlbGVjdGVkSXRlbSBvZiBzZWxlY3RlZFwiXG4gICAgICA+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICBjbGFzcz1cImJ0biBidG4teHMgYnRuLWNsZWFuIHRleHQtMTBcIlxuICAgICAgICAgIHRpdGxlPVwie3sgc2VsZWN0ZWRJdGVtLm5hbWUgfX1cIlxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgIChjbGljayk9XCJjb25maWcubXVsdGkgPyBkZXNlbGVjdChzZWxlY3RlZEl0ZW0pIDogZGVzZWxlY3RBbGwoKVwiXG4gICAgICAgID5cbiAgICAgICAgICA8aSBjOHlJY29uPVwidGltZXNcIj48L2k+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICB7eyBzZWxlY3RlZEl0ZW0ubmFtZSB8fCAoQVNTRVRfQ09OU1QgfCB0cmFuc2xhdGU6IHsgYXNzZXRJZDogc2VsZWN0ZWRJdGVtLmlkIH0pIH19XG4gICAgICA8L3NwYW4+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+XG5cbjxkaXZcbiAgY2xhc3M9XCJwLXItMTZcIlxuICAqbmdJZj1cInNlbGVjdGVkRGV2aWNlXCJcbj5cbiAgPGRpdiBjbGFzcz1cImQtZmxleCBwLWItNFwiPlxuICAgIDxwXG4gICAgICBjbGFzcz1cInRleHQtbWVkaXVtIHAtdC04IG0tci04XCJcbiAgICAgICpuZ0lmPVwic2VsZWN0ZWREZXZpY2U7IGVsc2UgbXVsdGlBc3NldHNcIlxuICAgID5cbiAgICAgIHt7ICdTZWxlY3RlZCBhc3NldCcgfCB0cmFuc2xhdGUgfX1cbiAgICA8L3A+XG4gICAgPG5nLXRlbXBsYXRlICNtdWx0aUFzc2V0cz5cbiAgICAgIDxwIGNsYXNzPVwidGV4dC1tZWRpdW0gbS1yLThcIj57eyAnU2VsZWN0ZWQgYXNzZXRzJyB8IHRyYW5zbGF0ZSB9fTwvcD5cbiAgICA8L25nLXRlbXBsYXRlPlxuICAgIDxidXR0b25cbiAgICAgIGNsYXNzPVwiYnRuIGJ0bi1kZWZhdWx0IGJ0bi14cyBhLXMtY2VudGVyIG0tdC00IG0tbC1hdXRvXCJcbiAgICAgIHRpdGxlPVwie3sgJ0NoYW5nZScgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAoY2xpY2spPVwiY2xlYXJTZWxlY3RlZERldmljZXMoKVwiXG4gICAgPlxuICAgICAge3sgJ0NoYW5nZScgfCB0cmFuc2xhdGUgfX1cbiAgICA8L2J1dHRvbj5cbiAgPC9kaXY+XG4gIDxkaXYgY2xhc3M9XCJkLWZsZXhcIj5cbiAgICA8aVxuICAgICAgY2xhc3M9XCJ0ZXh0LXN1Y2Nlc3MgcC1sLTAgcC1yLThcIlxuICAgICAgW2M4eUljb25dPVwiJ2NoZWNrLWNpcmNsZSdcIlxuICAgID48L2k+XG4gICAgPGlcbiAgICAgIGNsYXNzPVwibS1yLTQgaWNvbi0yMFwiXG4gICAgICBbYzh5SWNvbl09XCJzZWxlY3RlZERldmljZSB8IGdldEdyb3VwSWNvbiB8IGFzeW5jXCJcbiAgICA+PC9pPlxuICAgIDxzcGFuPnt7IHNlbGVjdGVkRGV2aWNlLm5hbWUgfX08L3NwYW4+XG4gIDwvZGl2PlxuPC9kaXY+XG5cbjwhLS0gbWlsbGVyIGNvbHVtbnMgaGVhZGVyIC0tPlxuPGRpdlxuICBjbGFzcz1cIm1pbGxlci1jb2x1bW5fX2hlYWRlciBzdGlja3ktdG9wIGJnLWluaGVyaXQgc2VwYXJhdG9yLWJvdHRvbVwiXG4gICpuZ0lmPVwiXG4gICAgY29uZmlnLnZpZXcgPT09ICdtaWxsZXInICYmXG4gICAgKChjb25maWcuc2hvd0ZpbHRlciAmJiAhcm9vdE5vZGUucm9vdCkgfHwgY29uZmlnLmNvbHVtbkhlYWRlcnMpICYmXG4gICAgIXNlbGVjdGVkRGV2aWNlXG4gIFwiXG4gIFtuZ0NsYXNzXT1cInsgJ3AtdC04JzogY29uZmlnLnNlYXJjaCB9XCJcbj5cbiAgPHBcbiAgICBjbGFzcz1cInRleHQtMTIgdGV4dC1tdXRlZCB0ZXh0LXRydW5jYXRlIG0tYi00XCJcbiAgICB0aXRsZT1cInt7IHJvb3ROb2RlLmJyZWFkY3J1bWIgfHwgcm9vdE5vZGUubGFiZWwgfCB0cmFuc2xhdGUgfX1cIlxuICAgICpuZ0lmPVwiY29uZmlnLnNpbmdsZUNvbHVtbiAmJiBpbmRleCAhPT0gMFwiXG4gID5cbiAgICA8aVxuICAgICAgY2xhc3M9XCJtLXItNFwiXG4gICAgICBjOHlJY29uPVwiaG9tZVwiXG4gICAgPjwvaT5cbiAgICB7eyByb290Tm9kZS5icmVhZGNydW1iIHx8IHJvb3ROb2RlLmxhYmVsIHwgdHJhbnNsYXRlIH19XG4gIDwvcD5cbiAgPGRpdlxuICAgIGNsYXNzPVwiZC1mbGV4IGEtaS1jZW50ZXJcIlxuICAgICpuZ0lmPVwiY29uZmlnLmNvbHVtbkhlYWRlcnMgfHwgY29uZmlnLnNpbmdsZUNvbHVtblwiXG4gID5cbiAgICA8YnV0dG9uXG4gICAgICBjbGFzcz1cImJ0biBidG4tZGVmYXVsdCBidG4teHMgbS1yLTggcC10LTAgcC1iLTAgcC1sLTQgcC1yLTQgbC1oLTFcIlxuICAgICAgdGl0bGU9XCJ7eyAnQmFjaycgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAqbmdJZj1cImNvbmZpZy5zaW5nbGVDb2x1bW4gJiYgIXJvb3ROb2RlLnJvb3QgJiYgaW5kZXggIT09IDBcIlxuICAgICAgKGNsaWNrKT1cImJhY2soKVwiXG4gICAgPlxuICAgICAgPGkgYzh5SWNvbj1cImFuZ2xlLWxlZnRcIj48L2k+XG4gICAgPC9idXR0b24+XG4gICAgPGxhYmVsXG4gICAgICBjbGFzcz1cImM4eS1yYWRpbyBjaGVja2JveC1pbmxpbmUgbS1yLThcIlxuICAgICAgKm5nSWY9XCIhcm9vdE5vZGUucm9vdCAmJiBpbmRleCA9PT0gMCAmJiAoY29uZmlnLmdyb3Vwc1NlbGVjdGFibGUgfHwgIXJvb3ROb2RlLmlzR3JvdXAoKSlcIlxuICAgID5cbiAgICAgIDxpbnB1dFxuICAgICAgICB0aXRsZT1cInt7ICdTZWxlY3QgZ3JvdXAnIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgdHlwZT1cInJhZGlvXCJcbiAgICAgICAgKGNoYW5nZSk9XCJzZWxlY3Qocm9vdE5vZGUubW8pXCJcbiAgICAgICAgW2NoZWNrZWRdPVwiaXNHcm91cFNlbGVjdGVkKClcIlxuICAgICAgLz5cbiAgICAgIDxzcGFuPjwvc3Bhbj5cbiAgICA8L2xhYmVsPlxuXG4gICAgPGlcbiAgICAgIGNsYXNzPVwiaWNvbi0yMCBjOHktaWNvbi1kdW9jb2xvciBtLXItNFwiXG4gICAgICBbYzh5SWNvbl09XCJ0aGlzLnJvb3ROb2RlLm1vIHwgZ2V0R3JvdXBJY29uOiB0cnVlIDogdGhpcy5yb290Tm9kZS5pY29uIHwgYXN5bmNcIlxuICAgICAgKm5nSWY9XCJjb25maWcuY29sdW1uSGVhZGVycyAmJiAoY29uZmlnLnNpbmdsZUNvbHVtbiB8fCAoIXJvb3ROb2RlLnJvb3QgJiYgaW5kZXggPT09IDApKVwiXG4gICAgPjwvaT5cbiAgICA8cFxuICAgICAgY2xhc3M9XCJ0ZXh0LXRydW5jYXRlXCJcbiAgICAgIHRpdGxlPVwie3sgcm9vdE5vZGUubGFiZWwgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgKm5nSWY9XCJjb25maWcuY29sdW1uSGVhZGVyc1wiXG4gICAgICBbbmdDbGFzc109XCJ7XG4gICAgICAgICd0ZXh0LWxhYmVsLXNtYWxsJzogIWNvbmZpZy5zaW5nbGVDb2x1bW4sXG4gICAgICAgICd0ZXh0LW1lZGl1bSc6IGNvbmZpZy5zaW5nbGVDb2x1bW5cbiAgICAgIH1cIlxuICAgID5cbiAgICAgIHt7IHJvb3ROb2RlLmxhYmVsIHwgdHJhbnNsYXRlIH19XG4gICAgPC9wPlxuICA8L2Rpdj5cblxuICA8ZGl2XG4gICAgKm5nSWY9XCIhcm9vdE5vZGUucm9vdCAmJiBjb25maWcuc2hvd0ZpbHRlclwiXG4gICAgW25nQ2xhc3NdPVwieyAncC10LTQnOiBjb25maWcuY29sdW1uSGVhZGVycyB9XCJcbiAgPlxuICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1ncm91cCBpbnB1dC1ncm91cC1zbSBpbnB1dC1ncm91cC1zZWFyY2hcIj5cbiAgICAgIDxpbnB1dFxuICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbFwiXG4gICAgICAgIHBsYWNlaG9sZGVyPVwie3sgJ0ZpbHRlciB0aGlzIGNvbHVtbuKApicgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICBbKG5nTW9kZWwpXT1cImZpbHRlclRleHRcIlxuICAgICAgICAoa2V5dXAuZW50ZXIpPVwiYXBwbHlGaWx0ZXIoJyonICsgZmlsdGVyVGV4dCArICcqJylcIlxuICAgICAgLz5cbiAgICAgIDxzcGFuIGNsYXNzPVwiaW5wdXQtZ3JvdXAtYnRuXCI+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICBjbGFzcz1cImJ0biBidG4tZG90IHAtci04IHAtbC00XCJcbiAgICAgICAgICB0aXRsZT1cInt7ICdBcHBseSBmaWx0ZXInIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAoY2xpY2spPVwiYXBwbHlGaWx0ZXIoJyonICsgZmlsdGVyVGV4dCArICcqJylcIlxuICAgICAgICA+XG4gICAgICAgICAgPGkgYzh5SWNvbj1cImZpbHRlclwiPjwvaT5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICBjbGFzcz1cImJ0biBidG4tZG90IHAtci04IHAtbC00XCJcbiAgICAgICAgICB0aXRsZT1cIiB7eyAnQ2xlYXIgZmlsdGVycycgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgIChjbGljayk9XCJjbGVhckZpbHRlcnMoKVwiXG4gICAgICAgICAgKm5nSWY9XCJmaWx0ZXJUZXh0Lmxlbmd0aFwiXG4gICAgICAgID5cbiAgICAgICAgICA8aSBjOHlJY29uPVwidGltZXNcIj48L2k+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9zcGFuPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PlxuXG48Yzh5LWFzc2V0LXNlbGVjdG9yLW5vZGVcbiAgY2xhc3M9XCJkLWJsb2NrIGJnLWluaGVyaXQgcC1yZWxhdGl2ZVwiXG4gIHN0eWxlPVwiei1pbmRleDogOVwiXG4gICpuZ0lmPVwicm9vdE5vZGUgJiYgIXNlbGVjdGVkRGV2aWNlXCJcbiAgW25vZGVdPVwicm9vdE5vZGVcIlxuICBbcm9vdE5vZGVdPVwicm9vdE5vZGVcIlxuICBbcHJlc2VsZWN0ZWRdPVwic2VsZWN0ZWRcIlxuICBbbXVsdGldPVwiY29uZmlnLm11bHRpXCJcbiAgW3ZpZXddPVwiY29uZmlnLnZpZXdcIlxuICBbaW5kZXhdPVwiaW5kZXhcIlxuICBbYWN0aXZlXT1cImFjdGl2ZVwiXG4gIFtoYW5kbGVOZXh0TWlsbGVyVmlld0NvbHVtbl09XCJoYW5kbGVOZXh0TWlsbGVyVmlld0NvbHVtbi5iaW5kKHRoaXMpXCJcbiAgKGlzTG9hZGluZ1N0YXRlKT1cIm9uTG9hZGluZygkZXZlbnQpXCJcbiAgKG9uU2VsZWN0KT1cIm9uU2VsZWN0KCRldmVudClcIlxuICAob25EZXNlbGVjdCk9XCJvbkRlc2VsZWN0KCRldmVudClcIlxuICBbbmdDbGFzc109XCJ7ICdjb2xsYXBzZSBzaG93JzogIXJvb3ROb2RlLnJvb3QgJiYgIXJvb3ROb2RlLmhpZGRlbiAmJiBjb25maWcudmlldyAhPT0gJ21pbGxlcicgfVwiXG4+PC9jOHktYXNzZXQtc2VsZWN0b3Itbm9kZT5cbiJdfQ==
|
|
357
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNzZXQtc2VsZWN0b3IuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vYXNzZXRzLW5hdmlnYXRvci9hc3NldC1zZWxlY3Rvci9hc3NldC1zZWxlY3Rvci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9hc3NldHMtbmF2aWdhdG9yL2Fzc2V0LXNlbGVjdG9yL2Fzc2V0LXNlbGVjdG9yLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxpQkFBaUIsRUFDakIsU0FBUyxFQUNULFVBQVUsRUFDVixZQUFZLEVBQ1osS0FBSyxFQUVMLE1BQU0sRUFFTixTQUFTLEVBQ1QsVUFBVSxFQUNYLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxhQUFhLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNsRSxPQUFPLEVBQStCLGdCQUFnQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzVFLE9BQU8sRUFBRSxlQUFlLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ2hELE9BQU8sRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDaEQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDMUQsT0FBTyxFQUdMLHNCQUFzQixFQUN2QixNQUFNLHdCQUF3QixDQUFDO0FBQ2hDLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDekMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDeEQsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDbEUsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLHFCQUFxQixDQUFDOzs7Ozs7Ozs7QUFFOUM7O0dBRUc7QUFp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dGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE9uSW5pdCxcbiAgT3V0cHV0LFxuICBTaW1wbGVDaGFuZ2VzLFxuICBWaWV3Q2hpbGQsXG4gIGZvcndhcmRSZWZcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBOR19WQUxJREFUT1JTLCBOR19WQUxVRV9BQ0NFU1NPUiB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IElJZGVudGlmaWVkLCBJTWFuYWdlZE9iamVjdCwgSW52ZW50b3J5U2VydmljZSB9IGZyb20gJ0BjOHkvY2xpZW50JztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgdGFrZVVudGlsLCB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBBc3NldFNlbGVjdG9yQmFzZSB9IGZyb20gJy4vYXNzZXQtc2VsZWN0b3ItYmFzZSc7XG5pbXBvcnQge1xuICBBc3NldFNlbGVjdGlvbkNoYW5nZUV2ZW50LFxuICBBc3NldFNlbGVjdG9yT3B0aW9ucyxcbiAgQ09ORklHX09QVElPTlNfREVGQVVMVFxufSBmcm9tICcuL2Fzc2V0LXNlbGVjdG9yLm1vZGVsJztcbmltcG9ydCB7IEFzc2V0U2VsZWN0b3JTZXJ2aWNlIH0gZnJvbSAnLi9hc3NldC1zZWxlY3Rvci5zZXJ2aWNlJztcbmltcG9ydCB7IEdyb3VwTm9kZSB9IGZyb20gJy4vZ3JvdXAtbm9kZSc7XG5pbXBvcnQgeyBHcm91cE5vZGVTZXJ2aWNlIH0gZnJvbSAnLi9ncm91cC1ub2RlLnNlcnZpY2UnO1xuaW1wb3J0IHsgVW5hc3NpZ25lZERldmljZXNOb2RlIH0gZnJvbSAnLi91bmFzc2lnbmVkLWRldmljZXMtbm9kZSc7XG5pbXBvcnQgeyBnZXR0ZXh0IH0gZnJvbSAnQGM4eS9uZ3gtY29tcG9uZW50cyc7XG5cbi8qKlxuICogRGlzcGxheXMgYSBoaWVyYXJjaGljYWwgdHJlZSBzZWxlY3RvciBmb3IgYXNzZXRzLlxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjOHktYXNzZXQtc2VsZWN0b3InLFxuICB0ZW1wbGF0ZVVybDogJy4vYXNzZXQtc2VsZWN0b3IuY29tcG9uZW50Lmh0bWwnLFxuICBwcm92aWRlcnM6IFtcbiAgICB7XG4gICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICAgIG11bHRpOiB0cnVlLFxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gQXNzZXRTZWxlY3RvckNvbXBvbmVudClcbiAgICB9LFxuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTElEQVRPUlMsXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBBc3NldFNlbGVjdG9yQ29tcG9uZW50KSxcbiAgICAgIG11bHRpOiB0cnVlXG4gICAgfVxuICBdXG59KVxuZXhwb3J0IGNsYXNzIEFzc2V0U2VsZWN0b3JDb21wb25lbnQgZXh0ZW5kcyBBc3NldFNlbGVjdG9yQmFzZSBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIC8qKlxuICAgKiBDb25maWcgb2JqZWN0IGNvbnRhaW5pbmcgYWxsIG9wdGlvbnMgZm9yIHRoZSBhc3NldCBzZWxlY3Rvci5cbiAgICovXG4gIEBJbnB1dCgpIGNvbmZpZzogQXNzZXRTZWxlY3Rvck9wdGlvbnMgPSB7fTtcbiAgLyoqXG4gICAqIERlZmluZXMgdGhlIG5vZGUsIHdoaWNoIHNob3VsZCBiZSBkaXNwbGF5ZWQgYXMgYWN0aXZlLlxuICAgKi9cbiAgQElucHV0KCkgYWN0aXZlOiBHcm91cE5vZGU7XG4gIC8qKlxuICAgKiBVc2VkIG9ubHkgZm9yIG1pbGxlci12aWV3LCBkaXNwbGF5cyB0aGUgY29sdW1uIGxldmVsIGZvciB0aGUgY3VycmVudCBub2RlLlxuICAgKiBFLmcgaWYgdGhlIGluZGV4IGlzIG9uZSwgdGhpcyB3aWxsIGJlIHNlY29uZCBjb2x1bW4uXG4gICAqL1xuICBASW5wdXQoKSBpbmRleCA9IDA7XG4gIC8qKlxuICAgKiBUaGUgYXNzZXQgdG8gdXNlIGFzIHJvb3QuXG4gICAqL1xuICBASW5wdXQoKSBhc3NldDogSUlkZW50aWZpZWQgPSB1bmRlZmluZWQ7XG4gIC8qKlxuICAgKiBUaGUgc2VsZWN0ZWQgZGV2aWNlLlxuICAgKi9cbiAgQElucHV0KCkgc2VsZWN0ZWREZXZpY2U6IElNYW5hZ2VkT2JqZWN0ID0gdW5kZWZpbmVkO1xuICAvKipcbiAgICogQW4gYXJyYXkgb2YgcHJlZGVmaW5lZCBub2Rlcy5cbiAgICovXG4gIEBJbnB1dCgpIHNlbGVjdGVkOiBBcnJheTxQYXJ0aWFsPElNYW5hZ2VkT2JqZWN0Pj4gfCBJSWRlbnRpZmllZFtdIHwgSUlkZW50aWZpZWQgPSBbXTtcbiAgLyoqXG4gICAqIFRoZSBub2RlIHRvIHVzZSBhcyByb290LiBZb3UgY2FuIGVpdGhlciBzZXQgdGhpcywgb3IgdGhlIGFzc2V0IHRvIHN0YXJ0IGZyb20uXG4gICAqL1xuICBASW5wdXQoKSByb290Tm9kZTogR3JvdXBOb2RlO1xuICAvKipcbiAgICogQWxsIGN1cnJlbnRseSBzZWxlY3RlZCBhc3NldHMuXG4gICAqL1xuICBASW5wdXQoKSBzZWxlY3RlZEl0ZW1zOiBJSWRlbnRpZmllZFtdIHwgSUlkZW50aWZpZWQgPSBbXTtcbiAgQElucHV0KCkgY29udGFpbmVyOiAnJyB8ICdib2R5JyA9ICdib2R5JztcblxuICBASW5wdXQoKSBkaXNhYmxlZCA9IGZhbHNlO1xuICAvKipcbiAgICogRW1pdHMgaWYgb25lIGl0ZW0gd2FzIHNlbGVjdGVkIChhbGwgY3VycmVudGx5IHNlbGVjdGVkIG5vZGVzKS5cbiAgICovXG4gIEBPdXRwdXQoKSBvblNlbGVjdGVkID0gbmV3IEV2ZW50RW1pdHRlcjxBc3NldFNlbGVjdGlvbkNoYW5nZUV2ZW50PigpO1xuICAvKipcbiAgICogRW1pdHMgaWYgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBhc3NldCBpcyBjbGVhcmVkLlxuICAgKi9cbiAgQE91dHB1dCgpIG9uQ2xlYXJTZWxlY3RlZCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgLyoqXG4gICAqIFVzZWQgb25seSBmb3IgbWlsbGVyIHZpZXcuIEVtaXQgdGhlIHNlbGVjdGVkIG5vZGUgYW5kIHVzZSBpdCBhcyBhICdyb290Tm9kZScgZm9yIHRoZSBuZXcgY29sdW1uLlxuICAgKi9cbiAgQE91dHB1dCgpIG9uUm93U2VsZWN0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgLyoqXG4gICAqIEVtaXRzIHRoZSBjdXJyZW50IGxvYWRpbmcgc3RhdGUgb2YgdGhlIG5vZGUuXG4gICAqL1xuICBAT3V0cHV0KCkgb25Mb2FkID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIC8qKlxuICAgKiBUaGUgY3VycmVudCBmaWx0ZXIgYXBwbGllZC5cbiAgICovXG4gIGZpbHRlclRleHQgPSAnJztcbiAgLyoqXG4gICAqIERpc3BsYXlzIHRoZSBnbG9iYWwgc2VhcmNoIGF0IGFsbCB0aW1lcyBpZiB0aGUgbWlsbGVyIHZpZXcgaXMgdXNlZFxuICAgKiBvbiByb290IGdyb3VwIGxldmVsLlxuICAgKi9cbiAgcm9vdCA9IGZhbHNlO1xuICAvKipcbiAgICogQGlnbm9yZVxuICAgKi9cbiAgdW5zdWJzY3JpYmUkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGN1cnJlbnQgaGVhZGVyIGhpZ2h0IGluIHBpeGVsLlxuICAgKi9cbiAgZ2V0SGVhZGVySGVpZ2h0JCA9IG5ldyBCZWhhdmlvclN1YmplY3QoMCk7XG4gIHJlYWRvbmx5IEFTU0VUX0NPTlNUID0gZ2V0dGV4dCgnQXNzZXQge3sgYXNzZXRJZCB9fScpO1xuXG4gIEBWaWV3Q2hpbGQoJ2hlYWRlcicpXG4gIHByaXZhdGUgaGVhZGVyOiBFbGVtZW50UmVmO1xuXG4gIC8qKlxuICAgKiBAaWdub3JlIG9ubHkgRElcbiAgICovXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByb3RlY3RlZCBncm91cE5vZGVTZXJ2aWNlOiBHcm91cE5vZGVTZXJ2aWNlLFxuICAgIHByb3RlY3RlZCBpbnZlbnRvcnk6IEludmVudG9yeVNlcnZpY2UsXG4gICAgcHJvdGVjdGVkIGFzc2V0U2VsZWN0b3JTZXJ2aWNlOiBBc3NldFNlbGVjdG9yU2VydmljZSxcbiAgICBwcm90ZWN0ZWQgY2Q6IENoYW5nZURldGVjdG9yUmVmXG4gICkge1xuICAgIHN1cGVyKGdyb3VwTm9kZVNlcnZpY2UsIGludmVudG9yeSwgYXNzZXRTZWxlY3RvclNlcnZpY2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyB3aGVuIGEgbm9kZSB3YXMgc2VsZWN0ZWQsIGlmIGEgbmV3IGNvbHVtbiBuZWVkcyB0byBiZSBhZGRlZC5cbiAgICogQHBhcmFtIG5vZGUgVGhlIG5vZGUgdGhhdCB3YXMgY2xpY2tlZC5cbiAgICogQHBhcmFtIGluZGV4IFRoZSBjdXJyZW50IGluZGV4IG9mIHRoaXMgbm9kZS5cbiAgICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgY2xpY2sgd2FzIGhhbmRsZWQgYW5kIGEgbmV3IGNvbHVtbiB3YXMgYWRkZWQuXG4gICAqL1xuICBoYW5kbGVOZXh0TWlsbGVyVmlld0NvbHVtbihub2RlOiBHcm91cE5vZGUsIGluZGV4OiBudW1iZXIpIHtcbiAgICBjb25zdCBub2RlQ29weSA9IE9iamVjdC5jcmVhdGUobm9kZSk7XG4gICAgY29uc3QgaXNTYW1lQXNSb290ID0gdGhpcy5yb290Tm9kZSA9PT0gbm9kZTtcbiAgICBjb25zdCBpc1VuYXNzaWduZWREZXZpY2VzTm9kZSA9IG5vZGUudG9TdHJpbmcoKSA9PT0gVW5hc3NpZ25lZERldmljZXNOb2RlLk5BTUU7XG4gICAgY29uc3QgaXNOZXdDb2x1bW5OZWVkZWQgPVxuICAgICAgIWlzU2FtZUFzUm9vdCAmJiAobm9kZS5pc0dyb3VwKCkgfHwgaXNVbmFzc2lnbmVkRGV2aWNlc05vZGUgfHwgbm9kZS5oYXNDaGlsZERldmljZXMoKSk7XG5cbiAgICBpZiAoaXNOZXdDb2x1bW5OZWVkZWQpIHtcbiAgICAgIHRoaXMub25Sb3dTZWxlY3RlZC5lbWl0KHsgbm9kZUNvcHksIGluZGV4IH0pO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaWdub3JlXG4gICAqL1xuICBhc3luYyBuZ09uSW5pdCgpIHtcbiAgICBpZiAodGhpcy5pbmRleCA9PT0gMCkge1xuICAgICAgdGhpcy5jb25maWcgPSB7IC4uLkNPTkZJR19PUFRJT05TX0RFRkFVTFQsIC4uLnRoaXMuY29uZmlnIH07XG4gICAgfVxuICAgIGNvbnN0IHNob3VsZFJlc2V0TmFtZUZpbHRlciA9XG4gICAgICB0aGlzLnJvb3ROb2RlICYmIHRoaXMucm9vdE5vZGUubW8gJiYgdGhpcy5jb25maWcudmlldyA9PT0gJ21pbGxlcic7XG4gICAgaWYgKHNob3VsZFJlc2V0TmFtZUZpbHRlcikge1xuICAgICAgYXdhaXQgdGhpcy5hcHBseUZpbHRlcignJyk7XG4gICAgfVxuXG4gICAgY29uc3QgaXNPbmx5QXNzZXROb2RlRGVmaW5lZCA9IHRoaXMuYXNzZXQ7XG4gICAgaWYgKGlzT25seUFzc2V0Tm9kZURlZmluZWQpIHtcbiAgICAgIHRoaXMucm9vdE5vZGUgPSBhd2FpdCB0aGlzLmNyZWF0ZU1hbmFnZWRPYmplY3RSb290Tm9kZSh0aGlzLmFzc2V0KTtcbiAgICB9XG5cbiAgICBjb25zdCBpc0FueU5vZGVEZWZpbmVkID1cbiAgICAgICF0aGlzLnJvb3ROb2RlICYmICghdGhpcy5hc3NldCB8fCBPYmplY3Qua2V5cyh0aGlzLmFzc2V0KS5sZW5ndGggPT09IDApO1xuICAgIGlmIChpc0FueU5vZGVEZWZpbmVkKSB7XG4gICAgICB0aGlzLnJvb3ROb2RlID0gdGhpcy5jcmVhdGVEZWZhdWx0Um9vdE5vZGUoKTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICB0aGlzLmNvbmZpZy5zaG93VW5hc3NpZ25lZERldmljZXMgJiZcbiAgICAgICghdGhpcy5hc3NldCB8fCBPYmplY3Qua2V5cyh0aGlzLmFzc2V0KS5sZW5ndGggPT09IDApICYmXG4gICAgICB0aGlzLnJvb3ROb2RlLnJvb3RcbiAgICApIHtcbiAgICAgIHRoaXMucm9vdE5vZGUuYWRkKFxuICAgICAgICBuZXcgVW5hc3NpZ25lZERldmljZXNOb2RlKHRoaXMuZ3JvdXBOb2RlU2VydmljZSwge1xuICAgICAgICAgIHNob3dDaGlsZERldmljZXM6IHRoaXMuY29uZmlnLnNob3dDaGlsZERldmljZXNcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfVxuICAgIHRoaXMucm9vdCA9IHRoaXMucm9vdE5vZGUucm9vdDtcbiAgfVxuXG4gIGFzeW5jIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcbiAgICBpZiAoXG4gICAgICBjaGFuZ2VzLmFzc2V0ICYmXG4gICAgICBjaGFuZ2VzLmFzc2V0LmN1cnJlbnRWYWx1ZSAmJlxuICAgICAgT2JqZWN0LmtleXMoY2hhbmdlcy5hc3NldC5jdXJyZW50VmFsdWUpLmxlbmd0aCAhPT0gMFxuICAgICkge1xuICAgICAgdGhpcy5yb290Tm9kZSA9IGF3YWl0IHRoaXMuY3JlYXRlTWFuYWdlZE9iamVjdFJvb3ROb2RlKGNoYW5nZXMuYXNzZXQuY3VycmVudFZhbHVlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGlnbm9yZVxuICAgKi9cbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICBpZiAodGhpcy5oZWFkZXI/Lm5hdGl2ZUVsZW1lbnQpIHtcbiAgICAgICAgdGhpcy5nZXRIZWFkZXJIZWlnaHQkLm5leHQodGhpcy5oZWFkZXIubmF0aXZlRWxlbWVudC5jbGllbnRIZWlnaHQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5nZXRIZWFkZXJIZWlnaHQkLm5leHQoMCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ2hhbmdlcyB0aGUgY3VycmVudCByb290IHRvIG9uZSBsZXZlbCBiYWNrLlxuICAgKi9cbiAgYmFjaygpIHtcbiAgICBjb25zdCBpbmRleCA9IHRoaXMuaW5kZXggLSAxO1xuICAgIGNvbnN0IG5vZGVDb3B5ID0gT2JqZWN0LmNyZWF0ZSh0aGlzLnJvb3ROb2RlLnBhcmVudHNbMF0pO1xuICAgIHRoaXMub25Sb3dTZWxlY3RlZC5lbWl0KHsgbm9kZUNvcHksIGluZGV4IH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENsZWFycyB0aGUgY3VycmVudCBmaWx0ZXIuXG4gICAqL1xuICBjbGVhckZpbHRlcnMoKSB7XG4gICAgdGhpcy5maWx0ZXJUZXh0ID0gJyc7XG4gICAgdGhpcy5hcHBseUZpbHRlcignJyk7XG4gIH1cblxuICBjbGVhclNlbGVjdGVkRGV2aWNlcygpIHtcbiAgICB0aGlzLnNlbGVjdGVkRGV2aWNlID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuYXBwbHlGaWx0ZXIoJycpO1xuICAgIHRoaXMub25DbGVhclNlbGVjdGVkLmVtaXQoKTtcbiAgfVxuXG4gIGlzR3JvdXBTZWxlY3RlZCgpIHtcbiAgICBpZiAodGhpcy5zZWxlY3RlZC5zb21lKHNlbGVjdGVkTm9kZSA9PiBzZWxlY3RlZE5vZGUuaWQgPT09IHRoaXMucm9vdE5vZGUubW8/LmlkKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGdyb3VwTmFtZUZpbHRlcihuYW1lRmlsdGVyOiBzdHJpbmcsIG1vSWQsIHNob3dVbmFzc2lnbmVkRGV2aWNlcz86IGJvb2xlYW4pIHtcbiAgICBpZiAobmFtZUZpbHRlcikge1xuICAgICAgY29uc3QgZmlsdGVyQnlOYW1lID0gc2hvd1VuYXNzaWduZWREZXZpY2VzXG4gICAgICAgID8ge1xuICAgICAgICAgICAgX19maWx0ZXI6IHtcbiAgICAgICAgICAgICAgbmFtZTogbmFtZUZpbHRlclxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF9fb3JkZXJieTogW3sgbmFtZTogMSB9XVxuICAgICAgICAgIH1cbiAgICAgICAgOiB7XG4gICAgICAgICAgICBfX2ZpbHRlcjoge1xuICAgICAgICAgICAgICBuYW1lOiBuYW1lRmlsdGVyLFxuICAgICAgICAgICAgICBfX2J5Z3JvdXBpZDogbW9JZFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH07XG4gICAgICByZXR1cm4gdGhpcy5hc3NldFNlbGVjdG9yU2VydmljZS5xdWVyaWVzVXRpbC5idWlsZFF1ZXJ5KGZpbHRlckJ5TmFtZSk7XG4gICAgfVxuICAgIGNvbnN0IGRlZmF1bHRGaWx0ZXIgPSB7XG4gICAgICBfX2ZpbHRlcjoge1xuICAgICAgICBfX2J5Z3JvdXBpZDogbW9JZFxuICAgICAgfSxcbiAgICAgIF9fb3JkZXJieTogW3sgbmFtZTogMSB9XVxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMuYXNzZXRTZWxlY3RvclNlcnZpY2UucXVlcmllc1V0aWwuYnVpbGRRdWVyeShkZWZhdWx0RmlsdGVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBsaWVzIGEgZmlsdGVyLlxuICAgKiBAcGFyYW0gZmlsdGVyIFRoZSBmaWx0ZXIgdG8gYXBwbHkuXG4gICAqL1xuICBhc3luYyBhcHBseUZpbHRlcihmaWx0ZXI6IHN0cmluZykge1xuICAgIHRoaXMucm9vdE5vZGUuZmlsdGVyUXVlcnkkLm5leHQoXG4gICAgICB0aGlzLmdyb3VwTmFtZUZpbHRlcihcbiAgICAgICAgZmlsdGVyLFxuICAgICAgICB0aGlzLnJvb3ROb2RlLm1vLmlkLFxuICAgICAgICB0aGlzLmlzVW5hc3NpZ25lZERldmljZXNOb2RlKCkgPyB0cnVlIDogZmFsc2VcbiAgICAgIClcbiAgICApO1xuICAgIHRoaXMucm9vdE5vZGUucmVmcmVzaCgpO1xuICAgIHRoaXMub25Mb2FkLmVtaXQoe1xuICAgICAgbG9hZGluZzogdHJ1ZSxcbiAgICAgIGZpbHRlclRleHQ6IHRoaXMuZmlsdGVyVGV4dCxcbiAgICAgIGluZGV4OiB0aGlzLmluZGV4LFxuICAgICAgc2VsZWN0ZWREZXZpY2U6IHRoaXMuc2VsZWN0ZWREZXZpY2VcbiAgICB9KTtcbiAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiB0aGUgVW5hc3NpZ25lZERldmljZSBub2RlIGlzIHRoZSByb290Tm9kZS5cbiAgICovXG4gIGlzVW5hc3NpZ25lZERldmljZXNOb2RlKCkge1xuICAgIHJldHVybiB0aGlzLnJvb3ROb2RlLnRvU3RyaW5nKCkgPT09IFVuYXNzaWduZWREZXZpY2VzTm9kZS5OQU1FO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIHRoZSB1c2VyIHJlc2V0cyB0aGUgc2VhcmNoIHJlc3VsdC5cbiAgICovXG4gIG9uU2VhcmNoUmVzdWx0UmVzZXQoc2VsZWN0ZWRJdGVtKSB7XG4gICAgaWYgKHNlbGVjdGVkSXRlbSkge1xuICAgICAgdGhpcy5yb290Tm9kZSA9IHRoaXMuY3JlYXRlRGVmYXVsdFJvb3ROb2RlKCk7XG4gICAgICBpZiAodGhpcy5jb25maWcuc2hvd1VuYXNzaWduZWREZXZpY2VzKSB7XG4gICAgICAgIHRoaXMucm9vdE5vZGUuYWRkKFxuICAgICAgICAgIG5ldyBVbmFzc2lnbmVkRGV2aWNlc05vZGUodGhpcy5ncm91cE5vZGVTZXJ2aWNlLCB7XG4gICAgICAgICAgICBzaG93Q2hpbGREZXZpY2VzOiB0aGlzLmNvbmZpZy5zaG93Q2hpbGREZXZpY2VzXG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmNvbmZpZy52aWV3ID09PSAnbWlsbGVyJykge1xuICAgICAgICB0aGlzLm9uUm93U2VsZWN0ZWQuZW1pdCh7IHJvb3Q6IHRydWUgfSk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMucm9vdE5vZGUuY2xpY2soeyBvcGVuOiB0cnVlIH0pO1xuICAgICAgdGhpcy5yb290Tm9kZS5ub2Rlc0ZldGNoZWRcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgdGFwKCgpID0+IHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpKSxcbiAgICAgICAgICB0YWtlVW50aWwodGhpcy51bnN1YnNjcmliZSQpXG4gICAgICAgIClcbiAgICAgICAgLnN1YnNjcmliZSgpO1xuXG4gICAgICBpZiAodGhpcy5jb25maWcudmlldyA9PT0gJ3RyZWUnKSB7XG4gICAgICAgIHRoaXMucm9vdE5vZGUub3BlbiA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENhbGxlZCBpZiB0aGUgdXNlciBjbGlja3Mgb24gYSBzZWFyY2ggcmVzdWx0LlxuICAgKi9cbiAgYXN5bmMgb25TZWFyY2hSZXN1bHRDbGljayhtbzogSU1hbmFnZWRPYmplY3QpIHtcbiAgICBjb25zdCBjYW5TZWxlY3ROb2RlID0gdGhpcy5jb25maWcuZ3JvdXBzU2VsZWN0YWJsZSB8fCAhdGhpcy5ncm91cE5vZGVTZXJ2aWNlLmlzR3JvdXAobW8pO1xuICAgIGlmICh0aGlzLmNvbmZpZy52aWV3ID09PSAnbWlsbGVyJykge1xuICAgICAgdGhpcy5yb290Tm9kZSA9IGF3YWl0IHRoaXMuY3JlYXRlTWFuYWdlZE9iamVjdFJvb3ROb2RlKG1vKTtcbiAgICAgIHRoaXMucm9vdE5vZGUuY2xpY2soeyBvcGVuOiB0cnVlIH0pO1xuICAgICAgY29uc3Qgbm9kZUNvcHkgPSBPYmplY3QuY3JlYXRlKHRoaXMucm9vdE5vZGUpO1xuICAgICAgdGhpcy5vblJvd1NlbGVjdGVkLmVtaXQoe1xuICAgICAgICBub2RlQ29weSxcbiAgICAgICAgaW5kZXg6IDAsXG4gICAgICAgIHNlbGVjdGVkRGV2aWNlczogdGhpcy5zZWxlY3RlZERldmljZSxcbiAgICAgICAgcm9vdDogdHJ1ZVxuICAgICAgfSk7XG4gICAgfVxuICAgIGlmICghdGhpcy5jb25maWcubXVsdGkpIHtcbiAgICAgIHRoaXMuZGVzZWxlY3RBbGwoKTtcbiAgICB9XG4gICAgaWYgKGNhblNlbGVjdE5vZGUpIHtcbiAgICAgIHRoaXMuc2VsZWN0KG1vKTtcbiAgICB9XG4gIH1cblxuICBvbkxvYWRpbmcoaXNMb2FkaW5nOiBib29sZWFuKSB7XG4gICAgdGhpcy5vbkxvYWQuZW1pdCh7IGxvYWRpbmc6IGlzTG9hZGluZywgZmlsdGVyVGV4dDogdGhpcy5maWx0ZXJUZXh0IH0pO1xuICAgIHRoaXMuY2QubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBvblNlbGVjdChtbzogSU1hbmFnZWRPYmplY3QpIHtcbiAgICB0aGlzLnNlbGVjdChtbyk7XG4gIH1cblxuICBvbkRlc2VsZWN0KGNvbmZpZzogeyBkZXNlbGVjdE1vZGU6ICdzaW5nbGUnIHwgJ2FsbCc7IG1vOiBJTWFuYWdlZE9iamVjdCB9KSB7XG4gICAgc3dpdGNoIChjb25maWc/LmRlc2VsZWN0TW9kZSkge1xuICAgICAgY2FzZSAnc2luZ2xlJzpcbiAgICAgICAgdGhpcy5kZXNlbGVjdChjb25maWcubW8pO1xuICAgICAgICB0aGlzLmNkLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2FsbCc6XG4gICAgICAgIHRoaXMuZGVzZWxlY3RBbGwoY29uZmlnLm1vKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG59XG4iLCI8ZGl2XG4gIGNsYXNzPVwiYmctaW5oZXJpdCBwLXQtOCBwLWItOCBzZXBhcmF0b3ItYm90dG9tIHAtci0xNiBwLWwtMTYgc3RpY2t5LXRvcFwiXG4gIFtuZ1N0eWxlXT1cInsgJ3otaW5kZXgnOiBjb25maWcuc2luZ2xlQ29sdW1uICYmIGNvbmZpZy5zZWFyY2ggPyAnMzAnIDogJzIwJyB9XCJcbiAgI2hlYWRlclxuICBbbmdDbGFzc109XCJ7XG4gICAgJ3AtYWJzb2x1dGUgbWlsbGVyLWNvbHVtbl9fc2VsZWN0aW9uIGQtZmxleCBmbGV4LXdyYXAgYS1pLWNlbnRlcic6IGNvbmZpZy52aWV3ID09PSAnbWlsbGVyJyxcbiAgICAnbWlsbGVyLWNvbHVtbl9fc2VhcmNoJzogY29uZmlnLnNlYXJjaCxcbiAgICAnbWlsbGVyLWNvbHVtbl9fbXVsdGknOiBjb25maWcubXVsdGlcbiAgfVwiXG4gICpuZ0lmPVwiXG4gICAgIXNlbGVjdGVkRGV2aWNlICYmXG4gICAgaW5kZXggPT09IDAgJiZcbiAgICAoY29uZmlnLnNlYXJjaCB8fCBjb25maWcubXVsdGkgfHwgY29uZmlnLmxhYmVsPy5sZW5ndGggfHwgY29uZmlnLnNob3dTZWxlY3RlZClcbiAgXCJcbj5cbiAgPHBcbiAgICBjbGFzcz1cInRleHQtbWVkaXVtIGZsZXgtbm8tc2hyaW5rIGEtcy1jZW50ZXJcIlxuICAgIFtuZ0NsYXNzXT1cIntcbiAgICAgICdtLWItNCc6IGNvbmZpZy5zZWFyY2ggJiYgcm9vdCAmJiBjb25maWcuc2luZ2xlQ29sdW1uLFxuICAgICAgJ20tci04JzogIWNvbmZpZy5zaW5nbGVDb2x1bW4gJiYgIWNvbmZpZy5zZWFyY2gsXG4gICAgICAnZml0LXcnOiBjb25maWcuc2luZ2xlQ29sdW1uXG4gICAgfVwiXG4gICAgKm5nSWY9XCJjb25maWcubGFiZWw/Lmxlbmd0aFwiXG4gID5cbiAgICB7eyBjb25maWcubGFiZWwgfCB0cmFuc2xhdGUgfX1cbiAgPC9wPlxuICA8Yzh5LXNlYXJjaC1pbnB1dFxuICAgIFtuZ1N0eWxlXT1cInsgJ21pbi13aWR0aCc6ICFjb25maWcuc2luZ2xlQ29sdW1uICYmIGNvbmZpZy5sYWJlbC5sZW5ndGggPyAnNTAlJyA6ICdpbmhlcml0JyB9XCJcbiAgICAqbmdJZj1cImNvbmZpZy5zZWFyY2ggJiYgcm9vdFwiXG4gICAgKG9uQ2xpY2spPVwib25TZWFyY2hSZXN1bHRDbGljaygkZXZlbnQpXCJcbiAgICAocmVzZXQpPVwib25TZWFyY2hSZXN1bHRSZXNldCgkZXZlbnQpXCJcbiAgICBbbW9kZV09XCInc2VsZWN0J1wiXG4gICAgW2NvbnRhaW5lcl09XCJjb250YWluZXJcIlxuICAgIFtncm91cHNPbmx5XT1cImNvbmZpZy5ncm91cHNPbmx5XCJcbiAgICBbbmdDbGFzc109XCJ7XG4gICAgICAnbS1sLWF1dG8nOiAhY29uZmlnLnNpbmdsZUNvbHVtbiAmJiBjb25maWcubGFiZWwubGVuZ3RoLFxuICAgICAgJ2ZpdC13JzogY29uZmlnLnNpbmdsZUNvbHVtbiB8fCAhY29uZmlnLmxhYmVsLmxlbmd0aFxuICAgIH1cIlxuICA+PC9jOHktc2VhcmNoLWlucHV0PlxuICA8ZGl2XG4gICAgY2xhc3M9XCJiZy1pbmhlcml0IGQtZmxleCBnYXAtNCBmaXQtd1wiXG4gICAgKm5nSWY9XCJjb25maWcuc2hvd1NlbGVjdGVkXCJcbiAgICBbbmdDbGFzc109XCJ7ICdtLXQtNCc6IGNvbmZpZy5zZWFyY2ggfVwiXG4gID5cbiAgICA8c3BhbiBjbGFzcz1cInRleHQtbGFiZWwtc21hbGwgbS1yLTQgYS1zLWNlbnRlciBsLWgtMVwiPnt7ICdTZWxlY3RlZCcgfCB0cmFuc2xhdGUgfX08L3NwYW4+XG4gICAgPGRpdiBjbGFzcz1cImZsZXgtZ3JvdyBpbm5lci1zY3JvbGwgZC1mbGV4IGdhcC00IGEtaS1jZW50ZXJcIj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhc2VsZWN0ZWQubGVuZ3RoXCI+XG4gICAgICAgIDxlbSBjbGFzcz1cInRleHQtMTIgdGV4dC1tdXRlZCBkLWZsZXggYS1pLWNlbnRlciBmaXQtaC0yMFwiPnt7ICdOb25lJyB8IHRyYW5zbGF0ZSB9fTwvZW0+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDxzcGFuXG4gICAgICAgIGNsYXNzPVwidGFnIHRhZy0taW5mbyBjaGlwXCJcbiAgICAgICAgKm5nRm9yPVwibGV0IHNlbGVjdGVkSXRlbSBvZiBzZWxlY3RlZFwiXG4gICAgICA+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICBjbGFzcz1cImJ0biBidG4teHMgYnRuLWNsZWFuIHRleHQtMTBcIlxuICAgICAgICAgIHRpdGxlPVwie3sgc2VsZWN0ZWRJdGVtLm5hbWUgfX1cIlxuICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgKGNsaWNrKT1cImNvbmZpZy5tdWx0aSA/IGRlc2VsZWN0KHNlbGVjdGVkSXRlbSkgOiBkZXNlbGVjdEFsbCgpXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxpIGM4eUljb249XCJ0aW1lc1wiPjwvaT5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIHt7IHNlbGVjdGVkSXRlbS5uYW1lIHx8IChBU1NFVF9DT05TVCB8IHRyYW5zbGF0ZTogeyBhc3NldElkOiBzZWxlY3RlZEl0ZW0uaWQgfSkgfX1cbiAgICAgIDwvc3Bhbj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj5cblxuPGRpdlxuICBjbGFzcz1cInAtci0xNlwiXG4gICpuZ0lmPVwic2VsZWN0ZWREZXZpY2VcIlxuPlxuICA8ZGl2IGNsYXNzPVwiZC1mbGV4IHAtYi00XCI+XG4gICAgPHBcbiAgICAgIGNsYXNzPVwidGV4dC1tZWRpdW0gcC10LTggbS1yLThcIlxuICAgICAgKm5nSWY9XCJzZWxlY3RlZERldmljZTsgZWxzZSBtdWx0aUFzc2V0c1wiXG4gICAgPlxuICAgICAge3sgJ1NlbGVjdGVkIGFzc2V0JyB8IHRyYW5zbGF0ZSB9fVxuICAgIDwvcD5cbiAgICA8bmctdGVtcGxhdGUgI211bHRpQXNzZXRzPlxuICAgICAgPHAgY2xhc3M9XCJ0ZXh0LW1lZGl1bSBtLXItOFwiPnt7ICdTZWxlY3RlZCBhc3NldHMnIHwgdHJhbnNsYXRlIH19PC9wPlxuICAgIDwvbmctdGVtcGxhdGU+XG4gICAgPGJ1dHRvblxuICAgICAgY2xhc3M9XCJidG4gYnRuLWRlZmF1bHQgYnRuLXhzIGEtcy1jZW50ZXIgbS10LTQgbS1sLWF1dG9cIlxuICAgICAgdGl0bGU9XCJ7eyAnQ2hhbmdlJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgIChjbGljayk9XCJjbGVhclNlbGVjdGVkRGV2aWNlcygpXCJcbiAgICA+XG4gICAgICB7eyAnQ2hhbmdlJyB8IHRyYW5zbGF0ZSB9fVxuICAgIDwvYnV0dG9uPlxuICA8L2Rpdj5cbiAgPGRpdiBjbGFzcz1cImQtZmxleFwiPlxuICAgIDxpXG4gICAgICBjbGFzcz1cInRleHQtc3VjY2VzcyBwLWwtMCBwLXItOFwiXG4gICAgICBbYzh5SWNvbl09XCInY2hlY2stY2lyY2xlJ1wiXG4gICAgPjwvaT5cbiAgICA8aVxuICAgICAgY2xhc3M9XCJtLXItNCBpY29uLTIwXCJcbiAgICAgIFtjOHlJY29uXT1cInNlbGVjdGVkRGV2aWNlIHwgZ2V0R3JvdXBJY29uIHwgYXN5bmNcIlxuICAgID48L2k+XG4gICAgPHNwYW4+e3sgc2VsZWN0ZWREZXZpY2UubmFtZSB9fTwvc3Bhbj5cbiAgPC9kaXY+XG48L2Rpdj5cblxuPCEtLSBtaWxsZXIgY29sdW1ucyBoZWFkZXIgLS0+XG48ZGl2XG4gIGNsYXNzPVwibWlsbGVyLWNvbHVtbl9faGVhZGVyIHN0aWNreS10b3AgYmctaW5oZXJpdCBzZXBhcmF0b3ItYm90dG9tXCJcbiAgKm5nSWY9XCJcbiAgICBjb25maWcudmlldyA9PT0gJ21pbGxlcicgJiZcbiAgICAoKGNvbmZpZy5zaG93RmlsdGVyICYmICFyb290Tm9kZS5yb290KSB8fCBjb25maWcuY29sdW1uSGVhZGVycykgJiZcbiAgICAhc2VsZWN0ZWREZXZpY2VcbiAgXCJcbiAgW25nQ2xhc3NdPVwieyAncC10LTgnOiBjb25maWcuc2VhcmNoIH1cIlxuPlxuICA8cFxuICAgIGNsYXNzPVwidGV4dC0xMiB0ZXh0LW11dGVkIHRleHQtdHJ1bmNhdGUgbS1iLTRcIlxuICAgIHRpdGxlPVwie3sgcm9vdE5vZGUuYnJlYWRjcnVtYiB8fCByb290Tm9kZS5sYWJlbCB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgKm5nSWY9XCJjb25maWcuc2luZ2xlQ29sdW1uICYmIGluZGV4ICE9PSAwXCJcbiAgPlxuICAgIDxpXG4gICAgICBjbGFzcz1cIm0tci00XCJcbiAgICAgIGM4eUljb249XCJob21lXCJcbiAgICA+PC9pPlxuICAgIHt7IHJvb3ROb2RlLmJyZWFkY3J1bWIgfHwgcm9vdE5vZGUubGFiZWwgfCB0cmFuc2xhdGUgfX1cbiAgPC9wPlxuICA8ZGl2XG4gICAgY2xhc3M9XCJkLWZsZXggYS1pLWNlbnRlclwiXG4gICAgKm5nSWY9XCJjb25maWcuY29sdW1uSGVhZGVycyB8fCBjb25maWcuc2luZ2xlQ29sdW1uXCJcbiAgPlxuICAgIDxidXR0b25cbiAgICAgIGNsYXNzPVwiYnRuIGJ0bi1kZWZhdWx0IGJ0bi14cyBtLXItOCBwLXQtMCBwLWItMCBwLWwtNCBwLXItNCBsLWgtMVwiXG4gICAgICB0aXRsZT1cInt7ICdCYWNrJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICpuZ0lmPVwiY29uZmlnLnNpbmdsZUNvbHVtbiAmJiAhcm9vdE5vZGUucm9vdCAmJiBpbmRleCAhPT0gMFwiXG4gICAgICAoY2xpY2spPVwiYmFjaygpXCJcbiAgICA+XG4gICAgICA8aSBjOHlJY29uPVwiYW5nbGUtbGVmdFwiPjwvaT5cbiAgICA8L2J1dHRvbj5cbiAgICA8bGFiZWxcbiAgICAgIGNsYXNzPVwiYzh5LXJhZGlvIGNoZWNrYm94LWlubGluZSBtLXItOFwiXG4gICAgICAqbmdJZj1cIiFyb290Tm9kZS5yb290ICYmIGluZGV4ID09PSAwICYmIChjb25maWcuZ3JvdXBzU2VsZWN0YWJsZSB8fCAhcm9vdE5vZGUuaXNHcm91cCgpKVwiXG4gICAgPlxuICAgICAgPGlucHV0XG4gICAgICAgIHRpdGxlPVwie3sgJ1NlbGVjdCBncm91cCcgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICB0eXBlPVwicmFkaW9cIlxuICAgICAgICAoY2hhbmdlKT1cInNlbGVjdChyb290Tm9kZS5tbylcIlxuICAgICAgICBbY2hlY2tlZF09XCJpc0dyb3VwU2VsZWN0ZWQoKVwiXG4gICAgICAvPlxuICAgICAgPHNwYW4+PC9zcGFuPlxuICAgIDwvbGFiZWw+XG5cbiAgICA8aVxuICAgICAgY2xhc3M9XCJpY29uLTIwIGM4eS1pY29uLWR1b2NvbG9yIG0tci00XCJcbiAgICAgIFtjOHlJY29uXT1cInRoaXMucm9vdE5vZGUubW8gfCBnZXRHcm91cEljb246IHRydWUgOiB0aGlzLnJvb3ROb2RlLmljb24gfCBhc3luY1wiXG4gICAgICAqbmdJZj1cImNvbmZpZy5jb2x1bW5IZWFkZXJzICYmIChjb25maWcuc2luZ2xlQ29sdW1uIHx8ICghcm9vdE5vZGUucm9vdCAmJiBpbmRleCA9PT0gMCkpXCJcbiAgICA+PC9pPlxuICAgIDxwXG4gICAgICBjbGFzcz1cInRleHQtdHJ1bmNhdGVcIlxuICAgICAgdGl0bGU9XCJ7eyByb290Tm9kZS5sYWJlbCB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAqbmdJZj1cImNvbmZpZy5jb2x1bW5IZWFkZXJzXCJcbiAgICAgIFtuZ0NsYXNzXT1cIntcbiAgICAgICAgJ3RleHQtbGFiZWwtc21hbGwnOiAhY29uZmlnLnNpbmdsZUNvbHVtbixcbiAgICAgICAgJ3RleHQtbWVkaXVtJzogY29uZmlnLnNpbmdsZUNvbHVtblxuICAgICAgfVwiXG4gICAgPlxuICAgICAge3sgcm9vdE5vZGUubGFiZWwgfCB0cmFuc2xhdGUgfX1cbiAgICA8L3A+XG4gIDwvZGl2PlxuXG4gIDxkaXZcbiAgICAqbmdJZj1cIiFyb290Tm9kZS5yb290ICYmIGNvbmZpZy5zaG93RmlsdGVyXCJcbiAgICBbbmdDbGFzc109XCJ7ICdwLXQtNCc6IGNvbmZpZy5jb2x1bW5IZWFkZXJzIH1cIlxuICA+XG4gICAgPGRpdiBjbGFzcz1cImlucHV0LWdyb3VwIGlucHV0LWdyb3VwLXNtIGlucHV0LWdyb3VwLXNlYXJjaFwiPlxuICAgICAgPGlucHV0XG4gICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sXCJcbiAgICAgICAgcGxhY2Vob2xkZXI9XCJ7eyAnRmlsdGVyIHRoaXMgY29sdW1u4oCmJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgIFsobmdNb2RlbCldPVwiZmlsdGVyVGV4dFwiXG4gICAgICAgIChrZXl1cC5lbnRlcik9XCJhcHBseUZpbHRlcignKicgKyBmaWx0ZXJUZXh0ICsgJyonKVwiXG4gICAgICAvPlxuICAgICAgPHNwYW4gY2xhc3M9XCJpbnB1dC1ncm91cC1idG5cIj5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1kb3QgcC1yLTggcC1sLTRcIlxuICAgICAgICAgIHRpdGxlPVwie3sgJ0FwcGx5IGZpbHRlcicgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgIChjbGljayk9XCJhcHBseUZpbHRlcignKicgKyBmaWx0ZXJUZXh0ICsgJyonKVwiXG4gICAgICAgID5cbiAgICAgICAgICA8aSBjOHlJY29uPVwiZmlsdGVyXCI+PC9pPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1kb3QgcC1yLTggcC1sLTRcIlxuICAgICAgICAgIHRpdGxlPVwiIHt7ICdDbGVhciBmaWx0ZXJzJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgKGNsaWNrKT1cImNsZWFyRmlsdGVycygpXCJcbiAgICAgICAgICAqbmdJZj1cImZpbHRlclRleHQubGVuZ3RoXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxpIGM4eUljb249XCJ0aW1lc1wiPjwvaT5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L3NwYW4+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+XG5cbjxjOHktYXNzZXQtc2VsZWN0b3Itbm9kZVxuICBjbGFzcz1cImQtYmxvY2sgYmctaW5oZXJpdCBwLXJlbGF0aXZlXCJcbiAgc3R5bGU9XCJ6LWluZGV4OiA5XCJcbiAgKm5nSWY9XCJyb290Tm9kZSAmJiAhc2VsZWN0ZWREZXZpY2VcIlxuICBbbm9kZV09XCJyb290Tm9kZVwiXG4gIFtyb290Tm9kZV09XCJyb290Tm9kZVwiXG4gIFtwcmVzZWxlY3RlZF09XCJzZWxlY3RlZFwiXG4gIFttdWx0aV09XCJjb25maWcubXVsdGlcIlxuICBbdmlld109XCJjb25maWcudmlld1wiXG4gIFtpbmRleF09XCJpbmRleFwiXG4gIFthY3RpdmVdPVwiYWN0aXZlXCJcbiAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgW2hhbmRsZU5leHRNaWxsZXJWaWV3Q29sdW1uXT1cImhhbmRsZU5leHRNaWxsZXJWaWV3Q29sdW1uLmJpbmQodGhpcylcIlxuICAoaXNMb2FkaW5nU3RhdGUpPVwib25Mb2FkaW5nKCRldmVudClcIlxuICAob25TZWxlY3QpPVwib25TZWxlY3QoJGV2ZW50KVwiXG4gIChvbkRlc2VsZWN0KT1cIm9uRGVzZWxlY3QoJGV2ZW50KVwiXG4gIFtuZ0NsYXNzXT1cInsgJ2NvbGxhcHNlIHNob3cnOiAhcm9vdE5vZGUucm9vdCAmJiAhcm9vdE5vZGUuaGlkZGVuICYmIGNvbmZpZy52aWV3ICE9PSAnbWlsbGVyJyB9XCJcbj48L2M4eS1hc3NldC1zZWxlY3Rvci1ub2RlPlxuIl19
|
|
@@ -165,7 +165,7 @@ export class MillerViewComponent extends AssetSelectorBase {
|
|
|
165
165
|
useExisting: forwardRef(() => MillerViewComponent),
|
|
166
166
|
multi: true
|
|
167
167
|
}
|
|
168
|
-
], viewQueries: [{ propertyName: "millerViewWrapper", first: true, predicate: ["millerViewWrapper"], descendants: true }, { propertyName: "assetSelectors", predicate: AssetSelectorComponent, descendants: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<div\n class=\"miller-view-wrapper {{ config.label }}\"\n [ngStyle]=\"{\n 'padding-top': selectedDevice ? '0px' : (assetSelectorHeaderHeight$ | async)\n }\"\n #millerViewWrapper\n [ngClass]=\"{\n 'single-column': config.singleColumn,\n }\"\n>\n <div\n class=\"miller-column bg-inherit\"\n *ngFor=\"let column of columns; index as i\"\n >\n <c8y-asset-selector\n class=\"bg-inherit\"\n #assetSelector\n [config]=\"config\"\n [index]=\"i\"\n [active]=\"columns[i + 1]\"\n [rootNode]=\"column\"\n [selected]=\"selected || []\"\n [selectedDevice]=\"selectedDevice\"\n (onSelected)=\"onSelectionChange($event)\"\n (onClearSelected)=\"onClearSelected.emit()\"\n (onRowSelected)=\"addNewColumn($event)\"\n (onLoad)=\"onLoad($event)\"\n [container]=\"container\"\n ></c8y-asset-selector>\n <div\n class=\"p-relative p-b-64\"\n *ngIf=\"isLoading && columnIndex === i && !selectedDevice\"\n >\n <c8y-loading></c8y-loading>\n </div>\n\n <div\n class=\"p-l-8 p-r-8\"\n *ngIf=\"!column.children.length && !isLoading\"\n >\n <c8y-ui-empty-state\n [icon]=\"'folder-open'\"\n [title]=\"'No results to display.' | translate\"\n [subtitle]=\"'The selected asset has no children.' | translate\"\n *ngIf=\"!filterText; else noSearchResults\"\n [horizontal]=\"true\"\n ></c8y-ui-empty-state>\n <ng-template #noSearchResults>\n <c8y-ui-empty-state\n [icon]=\"'folder-open'\"\n [title]=\"'No results to display for the current filter.' | translate\"\n [subtitle]=\"'There are no assets matching the filter.' | translate\"\n [horizontal]=\"true\"\n ></c8y-ui-empty-state>\n </ng-template>\n </div>\n </div>\n</div>\n", dependencies: [{ kind: "component", type: i4.EmptyStateComponent, selector: "c8y-ui-empty-state", inputs: ["icon", "title", "subtitle", "horizontal"] }, { 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: "directive", type: i5.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: i4.LoadingComponent, selector: "c8y-loading", inputs: ["layout", "progress", "message"] }, { kind: "component", type: i6.AssetSelectorComponent, selector: "c8y-asset-selector", inputs: ["config", "active", "index", "asset", "selectedDevice", "selected", "rootNode", "selectedItems", "container"], outputs: ["onSelected", "onClearSelected", "onRowSelected", "onLoad"] }, { kind: "pipe", type: i4.C8yTranslatePipe, name: "translate" }, { kind: "pipe", type: i5.AsyncPipe, name: "async" }] }); }
|
|
168
|
+
], viewQueries: [{ propertyName: "millerViewWrapper", first: true, predicate: ["millerViewWrapper"], descendants: true }, { propertyName: "assetSelectors", predicate: AssetSelectorComponent, descendants: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<div\n class=\"miller-view-wrapper {{ config.label }}\"\n [ngStyle]=\"{\n 'padding-top': selectedDevice ? '0px' : (assetSelectorHeaderHeight$ | async)\n }\"\n #millerViewWrapper\n [ngClass]=\"{\n 'single-column': config.singleColumn,\n }\"\n>\n <div\n class=\"miller-column bg-inherit\"\n *ngFor=\"let column of columns; index as i\"\n >\n <c8y-asset-selector\n class=\"bg-inherit\"\n #assetSelector\n [config]=\"config\"\n [index]=\"i\"\n [active]=\"columns[i + 1]\"\n [rootNode]=\"column\"\n [selected]=\"selected || []\"\n [selectedDevice]=\"selectedDevice\"\n (onSelected)=\"onSelectionChange($event)\"\n (onClearSelected)=\"onClearSelected.emit()\"\n (onRowSelected)=\"addNewColumn($event)\"\n (onLoad)=\"onLoad($event)\"\n [container]=\"container\"\n ></c8y-asset-selector>\n <div\n class=\"p-relative p-b-64\"\n *ngIf=\"isLoading && columnIndex === i && !selectedDevice\"\n >\n <c8y-loading></c8y-loading>\n </div>\n\n <div\n class=\"p-l-8 p-r-8\"\n *ngIf=\"!column.children.length && !isLoading\"\n >\n <c8y-ui-empty-state\n [icon]=\"'folder-open'\"\n [title]=\"'No results to display.' | translate\"\n [subtitle]=\"'The selected asset has no children.' | translate\"\n *ngIf=\"!filterText; else noSearchResults\"\n [horizontal]=\"true\"\n ></c8y-ui-empty-state>\n <ng-template #noSearchResults>\n <c8y-ui-empty-state\n [icon]=\"'folder-open'\"\n [title]=\"'No results to display for the current filter.' | translate\"\n [subtitle]=\"'There are no assets matching the filter.' | translate\"\n [horizontal]=\"true\"\n ></c8y-ui-empty-state>\n </ng-template>\n </div>\n </div>\n</div>\n", dependencies: [{ kind: "component", type: i4.EmptyStateComponent, selector: "c8y-ui-empty-state", inputs: ["icon", "title", "subtitle", "horizontal"] }, { 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: "directive", type: i5.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: i4.LoadingComponent, selector: "c8y-loading", inputs: ["layout", "progress", "message"] }, { kind: "component", type: i6.AssetSelectorComponent, selector: "c8y-asset-selector", inputs: ["config", "active", "index", "asset", "selectedDevice", "selected", "rootNode", "selectedItems", "container", "disabled"], outputs: ["onSelected", "onClearSelected", "onRowSelected", "onLoad"] }, { kind: "pipe", type: i4.C8yTranslatePipe, name: "translate" }, { kind: "pipe", type: i5.AsyncPipe, name: "async" }] }); }
|
|
169
169
|
}
|
|
170
170
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: MillerViewComponent, decorators: [{
|
|
171
171
|
type: Component,
|
|
@@ -20,7 +20,7 @@ export class InventoryRolesModalComponent {
|
|
|
20
20
|
this.modal.hide();
|
|
21
21
|
}
|
|
22
22
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: InventoryRolesModalComponent, deps: [{ token: i1.BsModalRef }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
23
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.9", type: InventoryRolesModalComponent, selector: "c8y-sso-inventory-roles-modal", ngImport: i0, template: "<div class=\"viewport-modal\">\n <div class=\"modal-header dialog-header\">\n <i c8yIcon=\"c8y-group-open\"></i>\n <h4 id=\"modal-title\">{{ 'Select from inventory' | translate }}</h4>\n </div>\n <div class=\"modal-inner-scroll\">\n <div\n id=\"modal-body\"\n class=\"bg-component\"\n >\n <c8y-asset-selector\n class=\"d-contents\"\n [(ngModel)]=\"selectedGroups\"\n [config]=\"{\n label: label,\n showFilter: true,\n multi: true,\n groupsSelectable: true,\n columnHeaders: false,\n singleColumn: true,\n groupsOnly: true\n }\"\n ></c8y-asset-selector>\n </div>\n </div>\n\n <div class=\"modal-footer\">\n <button\n class=\"btn btn-default\"\n type=\"button\"\n title=\"{{ 'Cancel' | translate }}\"\n (click)=\"dismiss()\"\n >\n {{ 'Cancel' | translate }}\n </button>\n <button\n class=\"btn btn-primary\"\n type=\"button\"\n title=\"{{ 'Select' | translate }}\"\n (click)=\"select()\"\n >\n {{ 'Select' | translate }}\n </button>\n </div>\n</div>\n", dependencies: [{ kind: "directive", type: i2.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i4.AssetSelectorComponent, selector: "c8y-asset-selector", inputs: ["config", "active", "index", "asset", "selectedDevice", "selected", "rootNode", "selectedItems", "container"], outputs: ["onSelected", "onClearSelected", "onRowSelected", "onLoad"] }, { kind: "pipe", type: i2.C8yTranslatePipe, name: "translate" }] }); }
|
|
23
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.9", type: InventoryRolesModalComponent, selector: "c8y-sso-inventory-roles-modal", ngImport: i0, template: "<div class=\"viewport-modal\">\n <div class=\"modal-header dialog-header\">\n <i c8yIcon=\"c8y-group-open\"></i>\n <h4 id=\"modal-title\">{{ 'Select from inventory' | translate }}</h4>\n </div>\n <div class=\"modal-inner-scroll\">\n <div\n id=\"modal-body\"\n class=\"bg-component\"\n >\n <c8y-asset-selector\n class=\"d-contents\"\n [(ngModel)]=\"selectedGroups\"\n [config]=\"{\n label: label,\n showFilter: true,\n multi: true,\n groupsSelectable: true,\n columnHeaders: false,\n singleColumn: true,\n groupsOnly: true\n }\"\n ></c8y-asset-selector>\n </div>\n </div>\n\n <div class=\"modal-footer\">\n <button\n class=\"btn btn-default\"\n type=\"button\"\n title=\"{{ 'Cancel' | translate }}\"\n (click)=\"dismiss()\"\n >\n {{ 'Cancel' | translate }}\n </button>\n <button\n class=\"btn btn-primary\"\n type=\"button\"\n title=\"{{ 'Select' | translate }}\"\n (click)=\"select()\"\n >\n {{ 'Select' | translate }}\n </button>\n </div>\n</div>\n", dependencies: [{ kind: "directive", type: i2.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i4.AssetSelectorComponent, selector: "c8y-asset-selector", inputs: ["config", "active", "index", "asset", "selectedDevice", "selected", "rootNode", "selectedItems", "container", "disabled"], outputs: ["onSelected", "onClearSelected", "onRowSelected", "onLoad"] }, { kind: "pipe", type: i2.C8yTranslatePipe, name: "translate" }] }); }
|
|
24
24
|
}
|
|
25
25
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: InventoryRolesModalComponent, decorators: [{
|
|
26
26
|
type: Component,
|