UNPKG

@c8y/ngx-components

Version:

Angular modules for Cumulocity IoT applications

127 lines 50 kB
import { Component, HostBinding, Input, Optional, ViewChild } from '@angular/core'; import { BottomDrawerRef, C8yStepper, CoreModule, DATA_GRID_CONFIGURATION_CONTEXT_PROVIDER, DATA_GRID_CONFIGURATION_STRATEGY, gettext, ModalService, Status, UserPreferencesConfigurationStrategy } from '@c8y/ngx-components'; import { DeviceGridModule, DeviceGridService } from '@c8y/ngx-components/device-grid'; import { DeviceSelectorModule } from '@c8y/ngx-components/operations/device-selector'; import { CollapseModule } from 'ngx-bootstrap/collapse'; import { PopoverModule } from 'ngx-bootstrap/popover'; import { TooltipModule } from 'ngx-bootstrap/tooltip'; import { map } from 'rxjs/operators'; import { REPLACE_DEVICE_STEP_STATES_MAP } from './replace-device-wizard.model'; import { ReplaceDeviceWizardService } from './replace-device-wizard.service'; import * as i0 from "@angular/core"; import * as i1 from "./replace-device-wizard.service"; import * as i2 from "@c8y/ngx-components/device-grid"; import * as i3 from "@c8y/ngx-components"; import * as i4 from "@angular/common"; import * as i5 from "@angular/cdk/stepper"; import * as i6 from "ngx-bootstrap/tooltip"; import * as i7 from "ngx-bootstrap/collapse"; import * as i8 from "ngx-bootstrap/popover"; export class ReplaceDeviceWizardComponent { static { this.DEFAULT_VISIBLE_COLUMNS = [ 'status', 'name', 'serialNumber', 'registrationDate', 'systemId', 'imei' ]; } set deviceToReplace(deviceToReplace) { this.service.forDevice(deviceToReplace); } constructor(service, deviceGridService, modal, drawerRef) { this.service = service; this.deviceGridService = deviceGridService; this.modal = modal; this.drawerRef = drawerRef; this.REPLACE_DEVICE_STEP_STATES_MAP = REPLACE_DEVICE_STEP_STATES_MAP; this.classes = 'd-contents'; this.baseQuery$ = this.service.deviceToReplace$.pipe(map(device => ({ __not: { id: { __eq: device?.id } } }))); this.columns = this.deviceGridService.getDefaultColumns().map(column => { column.visible = ReplaceDeviceWizardComponent.DEFAULT_VISIBLE_COLUMNS.includes(column.name); return column; }); } getGridConfigContext() { return { key: 'replace-device-wizard-grid', configFilter: { filter: false } }; } async replace() { try { await this.modal.confirm(gettext('Replace device'), gettext('You are about to replace a device. When the process is finished, the replacement device and its data will be deleted. Do you want to proceed?'), Status.DANGER, { ok: gettext('Replace'), cancel: gettext('Cancel') }); this.service.replaceDevice(); this.continue(); } catch (ex) { // Intentionally empty } } continue() { this.stepper.selected.completed = true; this.stepper.next(); } cancel() { this.close(); } close() { if (this.drawerRef) { this.drawerRef.close(); } } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ReplaceDeviceWizardComponent, deps: [{ token: i1.ReplaceDeviceWizardService }, { token: i2.DeviceGridService }, { token: i3.ModalService }, { token: i3.BottomDrawerRef, optional: true }], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: ReplaceDeviceWizardComponent, isStandalone: true, selector: "c8y-replace-device-wizard", inputs: { deviceToReplace: "deviceToReplace" }, host: { properties: { "class": "this.classes" } }, providers: [ DeviceGridService, ReplaceDeviceWizardService, { provide: DATA_GRID_CONFIGURATION_STRATEGY, useClass: UserPreferencesConfigurationStrategy }, { provide: DATA_GRID_CONFIGURATION_CONTEXT_PROVIDER, useExisting: ReplaceDeviceWizardComponent } ], viewQueries: [{ propertyName: "stepper", first: true, predicate: C8yStepper, descendants: true, static: true }], ngImport: i0, template: "<c8y-stepper\n class=\"d-contents c8y-stepper--no-btns\"\n [disableDefaultIcons]=\"{ edit: true, done: false }\"\n id=\"modal-body\"\n [customClasses]=\"[\n 'col-xs-10',\n 'col-xs-offset-1',\n 'col-sm-8',\n 'col-sm-offset-2',\n 'm-t-24',\n 'm-b-40',\n 'p-0',\n 'flex-no-shrink'\n ]\"\n linear\n>\n <cdk-step [label]=\"'Replacement device' | translate\">\n <div class=\"p-16 p-t-0 flex-no-shrink separator-bottom col-xs-12\">\n <div class=\"row\">\n <div class=\"col-md-6 col-md-offset-3 col-lg-4 col-lg-offset-4\">\n <div class=\"h4 text-center text-medium\">\n {{ 'Replacement device' | translate }}\n </div>\n </div>\n </div>\n </div>\n <c8y-device-grid\n class=\"flex-grow col-xs-12 no-gutter\"\n [title]=\"'Select replacement device' | translate\"\n [infiniteScroll]=\"'auto'\"\n [actionControls]=\"[]\"\n [columns]=\"columns\"\n [selectable]=\"true\"\n [singleSelection]=\"true\"\n [baseQuery]=\"baseQuery$ | async\"\n (itemsSelect)=\"replacementDeviceId = $event[0]\"\n ></c8y-device-grid>\n <c8y-stepper-buttons\n class=\"d-block card-footer p-24 separator\"\n [disabled]=\"!replacementDeviceId\"\n (onCancel)=\"cancel()\"\n (onNext)=\"service.changeReplacementDeviceId(replacementDeviceId); continue()\"\n ></c8y-stepper-buttons>\n </cdk-step>\n\n <cdk-step [label]=\"'Select external IDs' | translate\">\n <div class=\"p-16 p-t-0 flex-no-shrink col-xs-12\">\n <div class=\"row\">\n <div class=\"col-md-6 col-md-offset-3 col-lg-4 col-lg-offset-4\">\n <div class=\"h4 text-center text-medium\">\n {{ 'Select external IDs' | translate }}\n </div>\n </div>\n </div>\n </div>\n <c8y-li class=\"page-sticky-header hidden-sm hidden-xs\">\n <c8y-li-icon><i class=\"p-l-24\"></i></c8y-li-icon>\n <c8y-li-body class=\"content-flex-40\">\n <div class=\"col-4\">\n <span\n class=\"text-medium text-truncate\"\n title=\" {{ 'Type' | translate }} \"\n >\n {{ 'Type' | translate }}\n </span>\n </div>\n <div class=\"col-6\">\n <span\n class=\"text-medium text-truncate\"\n title=\"{{ 'External ID' | translate }}\"\n >\n {{ 'External ID' | translate }}\n </span>\n </div>\n </c8y-li-body>\n </c8y-li>\n <div\n class=\"col-xs-12 flex-grow no-gutter\"\n *ngIf=\"!(service.externalIdsLoading$ | async); else loading\"\n >\n <div\n class=\"card-inner-scroll fit-h\"\n *ngIf=\"(service.externalIdsWithSelection$ | async)?.length > 0; else noIds\"\n >\n <div class=\"card-block p-t-0 p-b-0\">\n <c8y-list-group>\n <c8y-li *ngFor=\"let extId of service.externalIdsWithSelection$ | async\">\n <c8y-li-checkbox\n [selected]=\"extId.selected\"\n (onSelect)=\"service.checkExternalId(extId.id, $event)\"\n ></c8y-li-checkbox>\n <c8y-li-body class=\"content-flex-40\">\n <div class=\"col-4 m-b-xs-8\">\n <div\n class=\"text-truncate\"\n title=\"{{ 'Type' | translate }}\"\n >\n <span\n class=\"text-label-small m-r-8 visible-xs visible-sm\"\n translate\n >\n Type\n </span>\n {{ extId.id.type }}\n </div>\n </div>\n <div class=\"col-6 m-b-xs-8\">\n <div\n class=\"text-truncate\"\n title=\"{{ 'External ID' | translate }}\"\n >\n <span\n class=\"text-label-small m-r-8 visible-xs visible-sm\"\n translate\n >\n External ID\n </span>\n {{ extId.id.externalId }}\n </div>\n </div>\n </c8y-li-body>\n </c8y-li>\n </c8y-list-group>\n </div>\n </div>\n <ng-template #noIds>\n <c8y-ui-empty-state\n [icon]=\"'barcode'\"\n [title]=\"'No external IDs assigned.'\"\n [subtitle]=\"\n 'The selected replacement device does not have external IDs assigned. Go back to &quot;Replacement device&quot; and select a different device.'\n | translate\n \"\n *ngIf=\"true\"\n ></c8y-ui-empty-state>\n </ng-template>\n </div>\n <ng-template #loading>\n <div class=\"d-flex d-col a-i-center j-c-center fit-h\">\n <c8y-loading></c8y-loading>\n </div>\n </ng-template>\n <c8y-stepper-buttons\n class=\"d-block card-footer p-24 separator\"\n [disabled]=\"\n (service.externalIdsLoading$ | async) || !(service.selectedExternalIds$ | async)?.length\n \"\n (onCancel)=\"cancel()\"\n (onNext)=\"replace()\"\n [labels]=\"{ next: ('Replace' | translate) }\"\n ></c8y-stepper-buttons>\n </cdk-step>\n\n <cdk-step [label]=\"'Replace' | translate\">\n <div class=\"p-16 p-t-0 flex-no-shrink col-xs-12 separator-bottom\">\n <div class=\"row\">\n <div class=\"col-md-6 col-md-offset-3 col-lg-4 col-lg-offset-4\">\n <div class=\"h4 text-center text-medium\">\n {{ 'Replace' | translate }}\n </div>\n </div>\n </div>\n </div>\n <div class=\"d-flex d-col a-i-center j-c-center inner-scroll\">\n <c8y-list-group class=\"col-sm-8 col-md-6\">\n <c8y-li\n *ngFor=\"let step of service.steps\"\n [attr.data-cy]=\"'c8y-replace-device-wizard--step-' + step.label\"\n >\n <c8y-li-icon>\n <i\n [c8yIcon]=\"REPLACE_DEVICE_STEP_STATES_MAP[step.state || 'Pending']?.icon\"\n [tooltip]=\"(step.state || 'Pending').toString() | translate\"\n [ngClass]=\"REPLACE_DEVICE_STEP_STATES_MAP[step.state || 'Pending']?.styleClass\"\n ></i>\n </c8y-li-icon>\n <c8y-li-body>\n <span [ngClass]=\"{ 'text-bold': !!step.error }\">{{ step.label | translate }}</span>\n <button\n class=\"btn-help btn-help--sm pull-right\"\n [attr.aria-label]=\"'Help' | translate\"\n [attr.aria-label]=\"step.info.msg | translate\"\n [popover]=\"step.info.msg | translate\"\n placement=\"right\"\n triggers=\"focus\"\n type=\"button\"\n *ngIf=\"!!step.info?.msg\"\n >\n <i c8yIcon=\"question-circle-o\"></i>\n </button>\n </c8y-li-body>\n <c8y-li-collapse\n #alert\n *ngIf=\"step.error\"\n >\n <span class=\"message\">{{ step.error?.text | translate }}</span>\n <p\n class=\"text-muted m-t-8\"\n *ngIf=\"step?.error?.detailedData\"\n >\n <button\n class=\"btn btn-clean\"\n (click)=\"alert.expanded = !alert.expanded\"\n >\n <i c8yIcon=\"chevron-down\"></i>\n <span *ngIf=\"!alert.expanded\">Show details</span>\n <span *ngIf=\"alert.expanded\">Hide details</span>\n </button>\n </p>\n <div\n [collapse]=\"!alert.expanded\"\n [isAnimated]=\"true\"\n >\n {{ step.error.detailedData | json }}\n </div>\n </c8y-li-collapse>\n <c8y-li-action\n icon=\"play\"\n label=\"{{ 'Retry this step`button`' | translate }}\"\n *ngIf=\"step.state === 'Failed' && !step.overrideContext\"\n (click)=\"service.retryStep(step)\"\n data-cy=\"c8y-replace-device-wizard--retry-step\"\n ></c8y-li-action>\n </c8y-li>\n </c8y-list-group>\n </div>\n\n <c8y-stepper-buttons\n class=\"d-block card-footer p-24 separator\"\n [pending]=\"service.deviceReplacementInProgress$ | async\"\n (onBack)=\"close()\"\n [labels]=\"{ back: 'Close' | translate }\"\n >\n <button\n class=\"btn btn-primary\"\n [title]=\"'Retry' | translate\"\n type=\"button\"\n *ngIf=\"(service.deviceReplaced$ | async) === false\"\n (click)=\"service.retryStep()\"\n [ngClass]=\"{ 'btn-pending': service.deviceReplacementInProgress$ | async }\"\n [disabled]=\"service.deviceReplacementInProgress$ | async\"\n data-cy=\"c8y-replace-device-wizard--btn-retry\"\n >\n {{ 'Retry' | translate }}\n </button>\n </c8y-stepper-buttons>\n </cdk-step>\n</c8y-stepper>\n", dependencies: [{ kind: "ngmodule", type: CoreModule }, { kind: "component", type: i3.EmptyStateComponent, selector: "c8y-ui-empty-state", inputs: ["icon", "title", "subtitle", "horizontal"] }, { kind: "directive", type: i3.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "pipe", type: i3.C8yTranslatePipe, name: "translate" }, { kind: "directive", type: i3.C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i4.AsyncPipe, name: "async" }, { kind: "pipe", type: i4.JsonPipe, name: "json" }, { kind: "component", type: i3.LoadingComponent, selector: "c8y-loading", inputs: ["layout", "progress", "message"] }, { kind: "component", type: i3.C8yStepper, selector: "c8y-stepper", inputs: ["disableDefaultIcons", "disableProgressButtons", "customClasses", "hideStepProgress", "useStepLabelsAsTitlesOnly"], outputs: ["onStepChange"] }, { kind: "component", type: i5.CdkStep, selector: "cdk-step", inputs: ["stepControl", "label", "errorMessage", "aria-label", "aria-labelledby", "state", "editable", "optional", "completed", "hasError"], outputs: ["interacted"], exportAs: ["cdkStep"] }, { kind: "component", type: i3.C8yStepperButtons, selector: "c8y-stepper-buttons", inputs: ["labels", "pending", "disabled", "showButtons"], outputs: ["onCancel", "onNext", "onBack", "onCustom"] }, { kind: "component", type: i3.ListGroupComponent, selector: "c8y-list-group" }, { kind: "component", type: i3.ListItemComponent, selector: "c8y-list-item, c8y-li", inputs: ["active", "highlighted", "emptyActions", "dense", "collapsed", "selectable"], outputs: ["collapsedChange"] }, { kind: "component", type: i3.ListItemIconComponent, selector: "c8y-list-item-icon, c8y-li-icon", inputs: ["icon", "status"] }, { kind: "component", type: i3.ListItemBodyComponent, selector: "c8y-list-item-body, c8y-li-body", inputs: ["body"] }, { kind: "component", type: i3.ListItemActionComponent, selector: "c8y-list-item-action, c8y-li-action", inputs: ["label", "icon", "disabled"], outputs: ["click"] }, { kind: "component", type: i3.ListItemCollapseComponent, selector: "c8y-list-item-collapse, c8y-li-collapse", inputs: ["collapseWay"] }, { kind: "component", type: i3.ListItemCheckboxComponent, selector: "c8y-list-item-checkbox, c8y-li-checkbox", inputs: ["selected", "indeterminate", "disabled", "displayAsSwitch"], outputs: ["onSelect"] }, { kind: "ngmodule", type: DeviceGridModule }, { kind: "component", type: i2.DeviceGridComponent, selector: "c8y-device-grid", inputs: ["dataCallback", "refresh", "title", "loadMoreItemsLabel", "loadingItemsLabel", "legacyConfigKey", "legacyFilterKey", "columns", "pagination", "infiniteScroll", "actionControls", "selectable", "singleSelection", "baseQuery", "bulkActionControls", "headerActionControls", "childDeviceGrid", "parentDeviceId", "withChildren", "showSearch", "activeClassName"], outputs: ["onColumnsChange", "onFilterChange", "onDeviceQueryStringChange", "itemsSelect"] }, { kind: "ngmodule", type: DeviceSelectorModule }, { kind: "ngmodule", type: TooltipModule }, { kind: "directive", type: i6.TooltipDirective, selector: "[tooltip], [tooltipHtml]", inputs: ["adaptivePosition", "tooltip", "placement", "triggers", "container", "containerClass", "boundariesElement", "isOpen", "isDisabled", "delay", "tooltipHtml", "tooltipPlacement", "tooltipIsOpen", "tooltipEnable", "tooltipAppendToBody", "tooltipAnimation", "tooltipClass", "tooltipContext", "tooltipPopupDelay", "tooltipFadeDuration", "tooltipTrigger"], outputs: ["tooltipChange", "onShown", "onHidden", "tooltipStateChanged"], exportAs: ["bs-tooltip"] }, { kind: "ngmodule", type: CollapseModule }, { kind: "directive", type: i7.CollapseDirective, selector: "[collapse]", inputs: ["display", "isAnimated", "collapse"], outputs: ["collapsed", "collapses", "expanded", "expands"], exportAs: ["bs-collapse"] }, { kind: "ngmodule", type: PopoverModule }, { kind: "directive", type: i8.PopoverDirective, selector: "[popover]", inputs: ["adaptivePosition", "boundariesElement", "popover", "popoverContext", "popoverTitle", "placement", "outsideClick", "triggers", "container", "containerClass", "isOpen", "delay"], outputs: ["onShown", "onHidden"], exportAs: ["bs-popover"] }] }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ReplaceDeviceWizardComponent, decorators: [{ type: Component, args: [{ standalone: true, selector: 'c8y-replace-device-wizard', imports: [ CoreModule, DeviceGridModule, DeviceSelectorModule, TooltipModule, CollapseModule, PopoverModule ], providers: [ DeviceGridService, ReplaceDeviceWizardService, { provide: DATA_GRID_CONFIGURATION_STRATEGY, useClass: UserPreferencesConfigurationStrategy }, { provide: DATA_GRID_CONFIGURATION_CONTEXT_PROVIDER, useExisting: ReplaceDeviceWizardComponent } ], template: "<c8y-stepper\n class=\"d-contents c8y-stepper--no-btns\"\n [disableDefaultIcons]=\"{ edit: true, done: false }\"\n id=\"modal-body\"\n [customClasses]=\"[\n 'col-xs-10',\n 'col-xs-offset-1',\n 'col-sm-8',\n 'col-sm-offset-2',\n 'm-t-24',\n 'm-b-40',\n 'p-0',\n 'flex-no-shrink'\n ]\"\n linear\n>\n <cdk-step [label]=\"'Replacement device' | translate\">\n <div class=\"p-16 p-t-0 flex-no-shrink separator-bottom col-xs-12\">\n <div class=\"row\">\n <div class=\"col-md-6 col-md-offset-3 col-lg-4 col-lg-offset-4\">\n <div class=\"h4 text-center text-medium\">\n {{ 'Replacement device' | translate }}\n </div>\n </div>\n </div>\n </div>\n <c8y-device-grid\n class=\"flex-grow col-xs-12 no-gutter\"\n [title]=\"'Select replacement device' | translate\"\n [infiniteScroll]=\"'auto'\"\n [actionControls]=\"[]\"\n [columns]=\"columns\"\n [selectable]=\"true\"\n [singleSelection]=\"true\"\n [baseQuery]=\"baseQuery$ | async\"\n (itemsSelect)=\"replacementDeviceId = $event[0]\"\n ></c8y-device-grid>\n <c8y-stepper-buttons\n class=\"d-block card-footer p-24 separator\"\n [disabled]=\"!replacementDeviceId\"\n (onCancel)=\"cancel()\"\n (onNext)=\"service.changeReplacementDeviceId(replacementDeviceId); continue()\"\n ></c8y-stepper-buttons>\n </cdk-step>\n\n <cdk-step [label]=\"'Select external IDs' | translate\">\n <div class=\"p-16 p-t-0 flex-no-shrink col-xs-12\">\n <div class=\"row\">\n <div class=\"col-md-6 col-md-offset-3 col-lg-4 col-lg-offset-4\">\n <div class=\"h4 text-center text-medium\">\n {{ 'Select external IDs' | translate }}\n </div>\n </div>\n </div>\n </div>\n <c8y-li class=\"page-sticky-header hidden-sm hidden-xs\">\n <c8y-li-icon><i class=\"p-l-24\"></i></c8y-li-icon>\n <c8y-li-body class=\"content-flex-40\">\n <div class=\"col-4\">\n <span\n class=\"text-medium text-truncate\"\n title=\" {{ 'Type' | translate }} \"\n >\n {{ 'Type' | translate }}\n </span>\n </div>\n <div class=\"col-6\">\n <span\n class=\"text-medium text-truncate\"\n title=\"{{ 'External ID' | translate }}\"\n >\n {{ 'External ID' | translate }}\n </span>\n </div>\n </c8y-li-body>\n </c8y-li>\n <div\n class=\"col-xs-12 flex-grow no-gutter\"\n *ngIf=\"!(service.externalIdsLoading$ | async); else loading\"\n >\n <div\n class=\"card-inner-scroll fit-h\"\n *ngIf=\"(service.externalIdsWithSelection$ | async)?.length > 0; else noIds\"\n >\n <div class=\"card-block p-t-0 p-b-0\">\n <c8y-list-group>\n <c8y-li *ngFor=\"let extId of service.externalIdsWithSelection$ | async\">\n <c8y-li-checkbox\n [selected]=\"extId.selected\"\n (onSelect)=\"service.checkExternalId(extId.id, $event)\"\n ></c8y-li-checkbox>\n <c8y-li-body class=\"content-flex-40\">\n <div class=\"col-4 m-b-xs-8\">\n <div\n class=\"text-truncate\"\n title=\"{{ 'Type' | translate }}\"\n >\n <span\n class=\"text-label-small m-r-8 visible-xs visible-sm\"\n translate\n >\n Type\n </span>\n {{ extId.id.type }}\n </div>\n </div>\n <div class=\"col-6 m-b-xs-8\">\n <div\n class=\"text-truncate\"\n title=\"{{ 'External ID' | translate }}\"\n >\n <span\n class=\"text-label-small m-r-8 visible-xs visible-sm\"\n translate\n >\n External ID\n </span>\n {{ extId.id.externalId }}\n </div>\n </div>\n </c8y-li-body>\n </c8y-li>\n </c8y-list-group>\n </div>\n </div>\n <ng-template #noIds>\n <c8y-ui-empty-state\n [icon]=\"'barcode'\"\n [title]=\"'No external IDs assigned.'\"\n [subtitle]=\"\n 'The selected replacement device does not have external IDs assigned. Go back to &quot;Replacement device&quot; and select a different device.'\n | translate\n \"\n *ngIf=\"true\"\n ></c8y-ui-empty-state>\n </ng-template>\n </div>\n <ng-template #loading>\n <div class=\"d-flex d-col a-i-center j-c-center fit-h\">\n <c8y-loading></c8y-loading>\n </div>\n </ng-template>\n <c8y-stepper-buttons\n class=\"d-block card-footer p-24 separator\"\n [disabled]=\"\n (service.externalIdsLoading$ | async) || !(service.selectedExternalIds$ | async)?.length\n \"\n (onCancel)=\"cancel()\"\n (onNext)=\"replace()\"\n [labels]=\"{ next: ('Replace' | translate) }\"\n ></c8y-stepper-buttons>\n </cdk-step>\n\n <cdk-step [label]=\"'Replace' | translate\">\n <div class=\"p-16 p-t-0 flex-no-shrink col-xs-12 separator-bottom\">\n <div class=\"row\">\n <div class=\"col-md-6 col-md-offset-3 col-lg-4 col-lg-offset-4\">\n <div class=\"h4 text-center text-medium\">\n {{ 'Replace' | translate }}\n </div>\n </div>\n </div>\n </div>\n <div class=\"d-flex d-col a-i-center j-c-center inner-scroll\">\n <c8y-list-group class=\"col-sm-8 col-md-6\">\n <c8y-li\n *ngFor=\"let step of service.steps\"\n [attr.data-cy]=\"'c8y-replace-device-wizard--step-' + step.label\"\n >\n <c8y-li-icon>\n <i\n [c8yIcon]=\"REPLACE_DEVICE_STEP_STATES_MAP[step.state || 'Pending']?.icon\"\n [tooltip]=\"(step.state || 'Pending').toString() | translate\"\n [ngClass]=\"REPLACE_DEVICE_STEP_STATES_MAP[step.state || 'Pending']?.styleClass\"\n ></i>\n </c8y-li-icon>\n <c8y-li-body>\n <span [ngClass]=\"{ 'text-bold': !!step.error }\">{{ step.label | translate }}</span>\n <button\n class=\"btn-help btn-help--sm pull-right\"\n [attr.aria-label]=\"'Help' | translate\"\n [attr.aria-label]=\"step.info.msg | translate\"\n [popover]=\"step.info.msg | translate\"\n placement=\"right\"\n triggers=\"focus\"\n type=\"button\"\n *ngIf=\"!!step.info?.msg\"\n >\n <i c8yIcon=\"question-circle-o\"></i>\n </button>\n </c8y-li-body>\n <c8y-li-collapse\n #alert\n *ngIf=\"step.error\"\n >\n <span class=\"message\">{{ step.error?.text | translate }}</span>\n <p\n class=\"text-muted m-t-8\"\n *ngIf=\"step?.error?.detailedData\"\n >\n <button\n class=\"btn btn-clean\"\n (click)=\"alert.expanded = !alert.expanded\"\n >\n <i c8yIcon=\"chevron-down\"></i>\n <span *ngIf=\"!alert.expanded\">Show details</span>\n <span *ngIf=\"alert.expanded\">Hide details</span>\n </button>\n </p>\n <div\n [collapse]=\"!alert.expanded\"\n [isAnimated]=\"true\"\n >\n {{ step.error.detailedData | json }}\n </div>\n </c8y-li-collapse>\n <c8y-li-action\n icon=\"play\"\n label=\"{{ 'Retry this step`button`' | translate }}\"\n *ngIf=\"step.state === 'Failed' && !step.overrideContext\"\n (click)=\"service.retryStep(step)\"\n data-cy=\"c8y-replace-device-wizard--retry-step\"\n ></c8y-li-action>\n </c8y-li>\n </c8y-list-group>\n </div>\n\n <c8y-stepper-buttons\n class=\"d-block card-footer p-24 separator\"\n [pending]=\"service.deviceReplacementInProgress$ | async\"\n (onBack)=\"close()\"\n [labels]=\"{ back: 'Close' | translate }\"\n >\n <button\n class=\"btn btn-primary\"\n [title]=\"'Retry' | translate\"\n type=\"button\"\n *ngIf=\"(service.deviceReplaced$ | async) === false\"\n (click)=\"service.retryStep()\"\n [ngClass]=\"{ 'btn-pending': service.deviceReplacementInProgress$ | async }\"\n [disabled]=\"service.deviceReplacementInProgress$ | async\"\n data-cy=\"c8y-replace-device-wizard--btn-retry\"\n >\n {{ 'Retry' | translate }}\n </button>\n </c8y-stepper-buttons>\n </cdk-step>\n</c8y-stepper>\n" }] }], ctorParameters: () => [{ type: i1.ReplaceDeviceWizardService }, { type: i2.DeviceGridService }, { type: i3.ModalService }, { type: i3.BottomDrawerRef, decorators: [{ type: Optional }] }], propDecorators: { classes: [{ type: HostBinding, args: ['class'] }], stepper: [{ type: ViewChild, args: [C8yStepper, { static: true }] }], deviceToReplace: [{ type: Input }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwbGFjZS1kZXZpY2Utd2l6YXJkLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3JlcGxhY2UtZGV2aWNlL3JlcGxhY2UtZGV2aWNlLXdpemFyZC9yZXBsYWNlLWRldmljZS13aXphcmQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vcmVwbGFjZS1kZXZpY2UvcmVwbGFjZS1kZXZpY2Utd2l6YXJkL3JlcGxhY2UtZGV2aWNlLXdpemFyZC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUVuRixPQUFPLEVBQ0wsZUFBZSxFQUNmLFVBQVUsRUFFVixVQUFVLEVBQ1Ysd0NBQXdDLEVBQ3hDLGdDQUFnQyxFQUNoQyxPQUFPLEVBRVAsWUFBWSxFQUNaLE1BQU0sRUFDTixvQ0FBb0MsRUFFckMsTUFBTSxxQkFBcUIsQ0FBQztBQUM3QixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUN0RixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxnREFBZ0QsQ0FBQztBQUN0RixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDeEQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3RELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUV0RCxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDckMsT0FBTyxFQUFFLDhCQUE4QixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDL0UsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0saUNBQWlDLENBQUM7Ozs7Ozs7Ozs7QUEyQjdFLE1BQU0sT0FBTyw0QkFBNEI7YUFDZiw0QkFB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RkFDVixnQkFBZ0IsMGpCQUNoQixvQkFBb0IsOEJBQ3BCLGFBQWEsaWtCQUNiLGNBQWMsK09BQ2QsYUFBYTs7NEZBZ0JKLDRCQUE0QjtrQkF6QnhDLFNBQVM7aUNBQ0ksSUFBSSxZQUNOLDJCQUEyQixXQUM1Qjt3QkFDUCxVQUFVO3dCQUNWLGdCQUFnQjt3QkFDaEIsb0JBQW9CO3dCQUNwQixhQUFhO3dCQUNiLGNBQWM7d0JBQ2QsYUFBYTtxQkFDZCxhQUNVO3dCQUNULGlCQUFpQjt3QkFDakIsMEJBQTBCO3dCQUMxQjs0QkFDRSxPQUFPLEVBQUUsZ0NBQWdDOzRCQUN6QyxRQUFRLEVBQUUsb0NBQW9DO3lCQUMvQzt3QkFDRDs0QkFDRSxPQUFPLEVBQUUsd0NBQXdDOzRCQUNqRCxXQUFXLDhCQUE4Qjt5QkFDMUM7cUJBQ0Y7OzBCQTJDRSxRQUFRO3lDQTNCWCxPQUFPO3NCQUROLFdBQVc7dUJBQUMsT0FBTztnQkFJcEIsT0FBTztzQkFETixTQUFTO3VCQUFDLFVBQVUsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBSW5DLGVBQWU7c0JBRGxCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEhvc3RCaW5kaW5nLCBJbnB1dCwgT3B0aW9uYWwsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSU1hbmFnZWRPYmplY3QgfSBmcm9tICdAYzh5L2NsaWVudCc7XG5pbXBvcnQge1xuICBCb3R0b21EcmF3ZXJSZWYsXG4gIEM4eVN0ZXBwZXIsXG4gIENvbHVtbixcbiAgQ29yZU1vZHVsZSxcbiAgREFUQV9HUklEX0NPTkZJR1VSQVRJT05fQ09OVEVYVF9QUk9WSURFUixcbiAgREFUQV9HUklEX0NPTkZJR1VSQVRJT05fU1RSQVRFR1ksXG4gIGdldHRleHQsXG4gIEdyaWRDb25maWdDb250ZXh0UHJvdmlkZXIsXG4gIE1vZGFsU2VydmljZSxcbiAgU3RhdHVzLFxuICBVc2VyUHJlZmVyZW5jZXNDb25maWd1cmF0aW9uU3RyYXRlZ3ksXG4gIFVzZXJQcmVmZXJlbmNlc0dyaWRDb25maWdDb250ZXh0XG59IGZyb20gJ0BjOHkvbmd4LWNvbXBvbmVudHMnO1xuaW1wb3J0IHsgRGV2aWNlR3JpZE1vZHVsZSwgRGV2aWNlR3JpZFNlcnZpY2UgfSBmcm9tICdAYzh5L25neC1jb21wb25lbnRzL2RldmljZS1ncmlkJztcbmltcG9ydCB7IERldmljZVNlbGVjdG9yTW9kdWxlIH0gZnJvbSAnQGM4eS9uZ3gtY29tcG9uZW50cy9vcGVyYXRpb25zL2RldmljZS1zZWxlY3Rvcic7XG5pbXBvcnQgeyBDb2xsYXBzZU1vZHVsZSB9IGZyb20gJ25neC1ib290c3RyYXAvY29sbGFwc2UnO1xuaW1wb3J0IHsgUG9wb3Zlck1vZHVsZSB9IGZyb20gJ25neC1ib290c3RyYXAvcG9wb3Zlcic7XG5pbXBvcnQgeyBUb29sdGlwTW9kdWxlIH0gZnJvbSAnbmd4LWJvb3RzdHJhcC90b29sdGlwJztcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IG1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IFJFUExBQ0VfREVWSUNFX1NURVBfU1RBVEVTX01BUCB9IGZyb20gJy4vcmVwbGFjZS1kZXZpY2Utd2l6YXJkLm1vZGVsJztcbmltcG9ydCB7IFJlcGxhY2VEZXZpY2VXaXphcmRTZXJ2aWNlIH0gZnJvbSAnLi9yZXBsYWNlLWRldmljZS13aXphcmQuc2VydmljZSc7XG5cbkBDb21wb25lbnQoe1xuICBzdGFuZGFsb25lOiB0cnVlLFxuICBzZWxlY3RvcjogJ2M4eS1yZXBsYWNlLWRldmljZS13aXphcmQnLFxuICBpbXBvcnRzOiBbXG4gICAgQ29yZU1vZHVsZSxcbiAgICBEZXZpY2VHcmlkTW9kdWxlLFxuICAgIERldmljZVNlbGVjdG9yTW9kdWxlLFxuICAgIFRvb2x0aXBNb2R1bGUsXG4gICAgQ29sbGFwc2VNb2R1bGUsXG4gICAgUG9wb3Zlck1vZHVsZVxuICBdLFxuICBwcm92aWRlcnM6IFtcbiAgICBEZXZpY2VHcmlkU2VydmljZSxcbiAgICBSZXBsYWNlRGV2aWNlV2l6YXJkU2VydmljZSxcbiAgICB7XG4gICAgICBwcm92aWRlOiBEQVRBX0dSSURfQ09ORklHVVJBVElPTl9TVFJBVEVHWSxcbiAgICAgIHVzZUNsYXNzOiBVc2VyUHJlZmVyZW5jZXNDb25maWd1cmF0aW9uU3RyYXRlZ3lcbiAgICB9LFxuICAgIHtcbiAgICAgIHByb3ZpZGU6IERBVEFfR1JJRF9DT05GSUdVUkFUSU9OX0NPTlRFWFRfUFJPVklERVIsXG4gICAgICB1c2VFeGlzdGluZzogUmVwbGFjZURldmljZVdpemFyZENvbXBvbmVudFxuICAgIH1cbiAgXSxcbiAgdGVtcGxhdGVVcmw6ICcuL3JlcGxhY2UtZGV2aWNlLXdpemFyZC5jb21wb25lbnQuaHRtbCdcbn0pXG5leHBvcnQgY2xhc3MgUmVwbGFjZURldmljZVdpemFyZENvbXBvbmVudCBpbXBsZW1lbnRzIEdyaWRDb25maWdDb250ZXh0UHJvdmlkZXIge1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBERUZBVUxUX1ZJU0lCTEVfQ09MVU1OUyA9IFtcbiAgICAnc3RhdHVzJyxcbiAgICAnbmFtZScsXG4gICAgJ3NlcmlhbE51bWJlcicsXG4gICAgJ3JlZ2lzdHJhdGlvbkRhdGUnLFxuICAgICdzeXN0ZW1JZCcsXG4gICAgJ2ltZWknXG4gIF07XG5cbiAgUkVQTEFDRV9ERVZJQ0VfU1RFUF9TVEFURVNfTUFQID0gUkVQTEFDRV9ERVZJQ0VfU1RFUF9TVEFURVNfTUFQO1xuXG4gIEBIb3N0QmluZGluZygnY2xhc3MnKVxuICBjbGFzc2VzID0gJ2QtY29udGVudHMnO1xuXG4gIEBWaWV3Q2hpbGQoQzh5U3RlcHBlciwgeyBzdGF0aWM6IHRydWUgfSlcbiAgc3RlcHBlcjogQzh5U3RlcHBlcjtcblxuICBASW5wdXQoKVxuICBzZXQgZGV2aWNlVG9SZXBsYWNlKGRldmljZVRvUmVwbGFjZTogSU1hbmFnZWRPYmplY3QpIHtcbiAgICB0aGlzLnNlcnZpY2UuZm9yRGV2aWNlKGRldmljZVRvUmVwbGFjZSk7XG4gIH1cblxuICByZXBsYWNlbWVudERldmljZUlkOiBzdHJpbmc7XG5cbiAgYmFzZVF1ZXJ5JDogT2JzZXJ2YWJsZTxvYmplY3Q+ID0gdGhpcy5zZXJ2aWNlLmRldmljZVRvUmVwbGFjZSQucGlwZShcbiAgICBtYXAoZGV2aWNlID0+ICh7XG4gICAgICBfX25vdDoge1xuICAgICAgICBpZDoge1xuICAgICAgICAgIF9fZXE6IGRldmljZT8uaWRcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pKVxuICApO1xuICBjb2x1bW5zOiBDb2x1bW5bXTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgc2VydmljZTogUmVwbGFjZURldmljZVdpemFyZFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBkZXZpY2VHcmlkU2VydmljZTogRGV2aWNlR3JpZFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBtb2RhbDogTW9kYWxTZXJ2aWNlLFxuICAgIEBPcHRpb25hbCgpIHByaXZhdGUgZHJhd2VyUmVmOiBCb3R0b21EcmF3ZXJSZWY8UmVwbGFjZURldmljZVdpemFyZENvbXBvbmVudD5cbiAgKSB7XG4gICAgdGhpcy5jb2x1bW5zID0gdGhpcy5kZXZpY2VHcmlkU2VydmljZS5nZXREZWZhdWx0Q29sdW1ucygpLm1hcChjb2x1bW4gPT4ge1xuICAgICAgY29sdW1uLnZpc2libGUgPSBSZXBsYWNlRGV2aWNlV2l6YXJkQ29tcG9uZW50LkRFRkFVTFRfVklTSUJMRV9DT0xVTU5TLmluY2x1ZGVzKGNvbHVtbi5uYW1lKTtcbiAgICAgIHJldHVybiBjb2x1bW47XG4gICAgfSk7XG4gIH1cblxuICBnZXRHcmlkQ29uZmlnQ29udGV4dCgpOiBVc2VyUHJlZmVyZW5jZXNHcmlkQ29uZmlnQ29udGV4dCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGtleTogJ3JlcGxhY2UtZGV2aWNlLXdpemFyZC1ncmlkJyxcbiAgICAgIGNvbmZpZ0ZpbHRlcjoge1xuICAgICAgICBmaWx0ZXI6IGZhbHNlXG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIHJlcGxhY2UoKSB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMubW9kYWwuY29uZmlybShcbiAgICAgICAgZ2V0dGV4dCgnUmVwbGFjZSBkZXZpY2UnKSxcbiAgICAgICAgZ2V0dGV4dChcbiAgICAgICAgICAnWW91IGFyZSBhYm91dCB0byByZXBsYWNlIGEgZGV2aWNlLiBXaGVuIHRoZSBwcm9jZXNzIGlzIGZpbmlzaGVkLCB0aGUgcmVwbGFjZW1lbnQgZGV2aWNlIGFuZCBpdHMgZGF0YSB3aWxsIGJlIGRlbGV0ZWQuIERvIHlvdSB3YW50IHRvIHByb2NlZWQ/J1xuICAgICAgICApLFxuICAgICAgICBTdGF0dXMuREFOR0VSLFxuICAgICAgICB7IG9rOiBnZXR0ZXh0KCdSZXBsYWNlJyksIGNhbmNlbDogZ2V0dGV4dCgnQ2FuY2VsJykgfVxuICAgICAgKTtcbiAgICAgIHRoaXMuc2VydmljZS5yZXBsYWNlRGV2aWNlKCk7XG4gICAgICB0aGlzLmNvbnRpbnVlKCk7XG4gICAgfSBjYXRjaCAoZXgpIHtcbiAgICAgIC8vIEludGVudGlvbmFsbHkgZW1wdHlcbiAgICB9XG4gIH1cblxuICBjb250aW51ZSgpIHtcbiAgICB0aGlzLnN0ZXBwZXIuc2VsZWN0ZWQuY29tcGxldGVkID0gdHJ1ZTtcbiAgICB0aGlzLnN0ZXBwZXIubmV4dCgpO1xuICB9XG5cbiAgY2FuY2VsKCkge1xuICAgIHRoaXMuY2xvc2UoKTtcbiAgfVxuXG4gIGNsb3NlKCkge1xuICAgIGlmICh0aGlzLmRyYXdlclJlZikge1xuICAgICAgdGhpcy5kcmF3ZXJSZWYuY2xvc2UoKTtcbiAgICB9XG4gIH1cbn1cbiIsIjxjOHktc3RlcHBlclxuICBjbGFzcz1cImQtY29udGVudHMgYzh5LXN0ZXBwZXItLW5vLWJ0bnNcIlxuICBbZGlzYWJsZURlZmF1bHRJY29uc109XCJ7IGVkaXQ6IHRydWUsIGRvbmU6IGZhbHNlIH1cIlxuICBpZD1cIm1vZGFsLWJvZHlcIlxuICBbY3VzdG9tQ2xhc3Nlc109XCJbXG4gICAgJ2NvbC14cy0xMCcsXG4gICAgJ2NvbC14cy1vZmZzZXQtMScsXG4gICAgJ2NvbC1zbS04JyxcbiAgICAnY29sLXNtLW9mZnNldC0yJyxcbiAgICAnbS10LTI0JyxcbiAgICAnbS1iLTQwJyxcbiAgICAncC0wJyxcbiAgICAnZmxleC1uby1zaHJpbmsnXG4gIF1cIlxuICBsaW5lYXJcbj5cbiAgPGNkay1zdGVwIFtsYWJlbF09XCInUmVwbGFjZW1lbnQgZGV2aWNlJyB8IHRyYW5zbGF0ZVwiPlxuICAgIDxkaXYgY2xhc3M9XCJwLTE2IHAtdC0wIGZsZXgtbm8tc2hyaW5rIHNlcGFyYXRvci1ib3R0b20gY29sLXhzLTEyXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNiBjb2wtbWQtb2Zmc2V0LTMgY29sLWxnLTQgY29sLWxnLW9mZnNldC00XCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImg0IHRleHQtY2VudGVyIHRleHQtbWVkaXVtXCI+XG4gICAgICAgICAgICB7eyAnUmVwbGFjZW1lbnQgZGV2aWNlJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDxjOHktZGV2aWNlLWdyaWRcbiAgICAgIGNsYXNzPVwiZmxleC1ncm93IGNvbC14cy0xMiBuby1ndXR0ZXJcIlxuICAgICAgW3RpdGxlXT1cIidTZWxlY3QgcmVwbGFjZW1lbnQgZGV2aWNlJyB8IHRyYW5zbGF0ZVwiXG4gICAgICBbaW5maW5pdGVTY3JvbGxdPVwiJ2F1dG8nXCJcbiAgICAgIFthY3Rpb25Db250cm9sc109XCJbXVwiXG4gICAgICBbY29sdW1uc109XCJjb2x1bW5zXCJcbiAgICAgIFtzZWxlY3RhYmxlXT1cInRydWVcIlxuICAgICAgW3NpbmdsZVNlbGVjdGlvbl09XCJ0cnVlXCJcbiAgICAgIFtiYXNlUXVlcnldPVwiYmFzZVF1ZXJ5JCB8IGFzeW5jXCJcbiAgICAgIChpdGVtc1NlbGVjdCk9XCJyZXBsYWNlbWVudERldmljZUlkID0gJGV2ZW50WzBdXCJcbiAgICA+PC9jOHktZGV2aWNlLWdyaWQ+XG4gICAgPGM4eS1zdGVwcGVyLWJ1dHRvbnNcbiAgICAgIGNsYXNzPVwiZC1ibG9jayBjYXJkLWZvb3RlciBwLTI0IHNlcGFyYXRvclwiXG4gICAgICBbZGlzYWJsZWRdPVwiIXJlcGxhY2VtZW50RGV2aWNlSWRcIlxuICAgICAgKG9uQ2FuY2VsKT1cImNhbmNlbCgpXCJcbiAgICAgIChvbk5leHQpPVwic2VydmljZS5jaGFuZ2VSZXBsYWNlbWVudERldmljZUlkKHJlcGxhY2VtZW50RGV2aWNlSWQpOyBjb250aW51ZSgpXCJcbiAgICA+PC9jOHktc3RlcHBlci1idXR0b25zPlxuICA8L2Nkay1zdGVwPlxuXG4gIDxjZGstc3RlcCBbbGFiZWxdPVwiJ1NlbGVjdCBleHRlcm5hbCBJRHMnIHwgdHJhbnNsYXRlXCI+XG4gICAgPGRpdiBjbGFzcz1cInAtMTYgcC10LTAgZmxleC1uby1zaHJpbmsgY29sLXhzLTEyXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNiBjb2wtbWQtb2Zmc2V0LTMgY29sLWxnLTQgY29sLWxnLW9mZnNldC00XCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImg0IHRleHQtY2VudGVyIHRleHQtbWVkaXVtXCI+XG4gICAgICAgICAgICB7eyAnU2VsZWN0IGV4dGVybmFsIElEcycgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8Yzh5LWxpIGNsYXNzPVwicGFnZS1zdGlja3ktaGVhZGVyIGhpZGRlbi1zbSBoaWRkZW4teHNcIj5cbiAgICAgIDxjOHktbGktaWNvbj48aSBjbGFzcz1cInAtbC0yNFwiPjwvaT48L2M4eS1saS1pY29uPlxuICAgICAgPGM4eS1saS1ib2R5IGNsYXNzPVwiY29udGVudC1mbGV4LTQwXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtNFwiPlxuICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICBjbGFzcz1cInRleHQtbWVkaXVtIHRleHQtdHJ1bmNhdGVcIlxuICAgICAgICAgICAgdGl0bGU9XCIge3sgJ1R5cGUnIHwgdHJhbnNsYXRlIH19IFwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAge3sgJ1R5cGUnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbC02XCI+XG4gICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgIGNsYXNzPVwidGV4dC1tZWRpdW0gdGV4dC10cnVuY2F0ZVwiXG4gICAgICAgICAgICB0aXRsZT1cInt7ICdFeHRlcm5hbCBJRCcgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIHt7ICdFeHRlcm5hbCBJRCcgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9jOHktbGktYm9keT5cbiAgICA8L2M4eS1saT5cbiAgICA8ZGl2XG4gICAgICBjbGFzcz1cImNvbC14cy0xMiBmbGV4LWdyb3cgbm8tZ3V0dGVyXCJcbiAgICAgICpuZ0lmPVwiIShzZXJ2aWNlLmV4dGVybmFsSWRzTG9hZGluZyQgfCBhc3luYyk7IGVsc2UgbG9hZGluZ1wiXG4gICAgPlxuICAgICAgPGRpdlxuICAgICAgICBjbGFzcz1cImNhcmQtaW5uZXItc2Nyb2xsIGZpdC1oXCJcbiAgICAgICAgKm5nSWY9XCIoc2VydmljZS5leHRlcm5hbElkc1dpdGhTZWxlY3Rpb24kIHwgYXN5bmMpPy5sZW5ndGggPiAwOyBlbHNlIG5vSWRzXCJcbiAgICAgID5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtYmxvY2sgcC10LTAgcC1iLTBcIj5cbiAgICAgICAgICA8Yzh5LWxpc3QtZ3JvdXA+XG4gICAgICAgICAgICA8Yzh5LWxpICpuZ0Zvcj1cImxldCBleHRJZCBvZiBzZXJ2aWNlLmV4dGVybmFsSWRzV2l0aFNlbGVjdGlvbiQgfCBhc3luY1wiPlxuICAgICAgICAgICAgICA8Yzh5LWxpLWNoZWNrYm94XG4gICAgICAgICAgICAgICAgW3NlbGVjdGVkXT1cImV4dElkLnNlbGVjdGVkXCJcbiAgICAgICAgICAgICAgICAob25TZWxlY3QpPVwic2VydmljZS5jaGVja0V4dGVybmFsSWQoZXh0SWQuaWQsICRldmVudClcIlxuICAgICAgICAgICAgICA+PC9jOHktbGktY2hlY2tib3g+XG4gICAgICAgICAgICAgIDxjOHktbGktYm9keSBjbGFzcz1cImNvbnRlbnQtZmxleC00MFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtNCBtLWIteHMtOFwiPlxuICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInRleHQtdHJ1bmNhdGVcIlxuICAgICAgICAgICAgICAgICAgICB0aXRsZT1cInt7ICdUeXBlJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ0ZXh0LWxhYmVsLXNtYWxsIG0tci04IHZpc2libGUteHMgdmlzaWJsZS1zbVwiXG4gICAgICAgICAgICAgICAgICAgICAgdHJhbnNsYXRlXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICBUeXBlXG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAge3sgZXh0SWQuaWQudHlwZSB9fVxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC02IG0tYi14cy04XCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidGV4dC10cnVuY2F0ZVwiXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlPVwie3sgJ0V4dGVybmFsIElEJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ0ZXh0LWxhYmVsLXNtYWxsIG0tci04IHZpc2libGUteHMgdmlzaWJsZS1zbVwiXG4gICAgICAgICAgICAgICAgICAgICAgdHJhbnNsYXRlXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICBFeHRlcm5hbCBJRFxuICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIHt7IGV4dElkLmlkLmV4dGVybmFsSWQgfX1cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2M4eS1saS1ib2R5PlxuICAgICAgICAgICAgPC9jOHktbGk+XG4gICAgICAgICAgPC9jOHktbGlzdC1ncm91cD5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxuZy10ZW1wbGF0ZSAjbm9JZHM+XG4gICAgICAgIDxjOHktdWktZW1wdHktc3RhdGVcbiAgICAgICAgICBbaWNvbl09XCInYmFyY29kZSdcIlxuICAgICAgICAgIFt0aXRsZV09XCInTm8gZXh0ZXJuYWwgSURzIGFzc2lnbmVkLidcIlxuICAgICAgICAgIFtzdWJ0aXRsZV09XCJcbiAgICAgICAgICAgICdUaGUgc2VsZWN0ZWQgcmVwbGFjZW1lbnQgZGV2aWNlIGRvZXMgbm90IGhhdmUgZXh0ZXJuYWwgSURzIGFzc2lnbmVkLiBHbyBiYWNrIHRvICZxdW90O1JlcGxhY2VtZW50IGRldmljZSZxdW90OyBhbmQgc2VsZWN0IGEgZGlmZmVyZW50IGRldmljZS4nXG4gICAgICAgICAgICAgIHwgdHJhbnNsYXRlXG4gICAgICAgICAgXCJcbiAgICAgICAgICAqbmdJZj1cInRydWVcIlxuICAgICAgICA+PC9jOHktdWktZW1wdHktc3RhdGU+XG4gICAgICA8L25nLXRlbXBsYXRlPlxuICAgIDwvZGl2PlxuICAgIDxuZy10ZW1wbGF0ZSAjbG9hZGluZz5cbiAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggZC1jb2wgYS1pLWNlbnRlciBqLWMtY2VudGVyIGZpdC1oXCI+XG4gICAgICAgIDxjOHktbG9hZGluZz48L2M4eS1sb2FkaW5nPlxuICAgICAgPC9kaXY+XG4gICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8Yzh5LXN0ZXBwZXItYnV0dG9uc1xuICAgICAgY2xhc3M9XCJkLWJsb2NrIGNhcmQtZm9vdGVyIHAtMjQgc2VwYXJhdG9yXCJcbiAgICAgIFtkaXNhYmxlZF09XCJcbiAgICAgICAgKHNlcnZpY2UuZXh0ZXJuYWxJZHNMb2FkaW5nJCB8IGFzeW5jKSB8fCAhKHNlcnZpY2Uuc2VsZWN0ZWRFeHRlcm5hbElkcyQgfCBhc3luYyk/Lmxlbmd0aFxuICAgICAgXCJcbiAgICAgIChvbkNhbmNlbCk9XCJjYW5jZWwoKVwiXG4gICAgICAob25OZXh0KT1cInJlcGxhY2UoKVwiXG4gICAgICBbbGFiZWxzXT1cInsgbmV4dDogKCdSZXBsYWNlJyB8IHRyYW5zbGF0ZSkgfVwiXG4gICAgPjwvYzh5LXN0ZXBwZXItYnV0dG9ucz5cbiAgPC9jZGstc3RlcD5cblxuICA8Y2RrLXN0ZXAgW2xhYmVsXT1cIidSZXBsYWNlJyB8IHRyYW5zbGF0ZVwiPlxuICAgIDxkaXYgY2xhc3M9XCJwLTE2IHAtdC0wIGZsZXgtbm8tc2hyaW5rIGNvbC14cy0xMiBzZXBhcmF0b3ItYm90dG9tXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNiBjb2wtbWQtb2Zmc2V0LTMgY29sLWxnLTQgY29sLWxnLW9mZnNldC00XCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImg0IHRleHQtY2VudGVyIHRleHQtbWVkaXVtXCI+XG4gICAgICAgICAgICB7eyAnUmVwbGFjZScgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGQtY29sIGEtaS1jZW50ZXIgai1jLWNlbnRlciBpbm5lci1zY3JvbGxcIj5cbiAgICAgIDxjOHktbGlzdC1ncm91cCBjbGFzcz1cImNvbC1zbS04IGNvbC1tZC02XCI+XG4gICAgICAgIDxjOHktbGlcbiAgICAgICAgICAqbmdGb3I9XCJsZXQgc3RlcCBvZiBzZXJ2aWNlLnN0ZXBzXCJcbiAgICAgICAgICBbYXR0ci5kYXRhLWN5XT1cIidjOHktcmVwbGFjZS1kZXZpY2Utd2l6YXJkLS1zdGVwLScgKyBzdGVwLmxhYmVsXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxjOHktbGktaWNvbj5cbiAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgIFtjOHlJY29uXT1cIlJFUExBQ0VfREVWSUNFX1NURVBfU1RBVEVTX01BUFtzdGVwLnN0YXRlIHx8ICdQZW5kaW5nJ10/Lmljb25cIlxuICAgICAgICAgICAgICBbdG9vbHRpcF09XCIoc3RlcC5zdGF0ZSB8fCAnUGVuZGluZycpLnRvU3RyaW5nKCkgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICBbbmdDbGFzc109XCJSRVBMQUNFX0RFVklDRV9TVEVQX1NUQVRFU19NQVBbc3RlcC5zdGF0ZSB8fCAnUGVuZGluZyddPy5zdHlsZUNsYXNzXCJcbiAgICAgICAgICAgID48L2k+XG4gICAgICAgICAgPC9jOHktbGktaWNvbj5cbiAgICAgICAgICA8Yzh5LWxpLWJvZHk+XG4gICAgICAgICAgICA8c3BhbiBbbmdDbGFzc109XCJ7ICd0ZXh0LWJvbGQnOiAhIXN0ZXAuZXJyb3IgfVwiPnt7IHN0ZXAubGFiZWwgfCB0cmFuc2xhdGUgfX08L3NwYW4+XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgIGNsYXNzPVwiYnRuLWhlbHAgYnRuLWhlbHAtLXNtIHB1bGwtcmlnaHRcIlxuICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidIZWxwJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwic3RlcC5pbmZvLm1zZyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgIFtwb3BvdmVyXT1cInN0ZXAuaW5mby5tc2cgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICBwbGFjZW1lbnQ9XCJyaWdodFwiXG4gICAgICAgICAgICAgIHRyaWdnZXJzPVwiZm9jdXNcIlxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgKm5nSWY9XCIhIXN0ZXAuaW5mbz8ubXNnXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPGkgYzh5SWNvbj1cInF1ZXN0aW9uLWNpcmNsZS1vXCI+PC9pPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPC9jOHktbGktYm9keT5cbiAgICAgICAgICA8Yzh5LWxpLWNvbGxhcHNlXG4gICAgICAgICAgICAjYWxlcnRcbiAgICAgICAgICAgICpuZ0lmPVwic3RlcC5lcnJvclwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtZXNzYWdlXCI+e3sgc3RlcC5lcnJvcj8udGV4dCB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgIDxwXG4gICAgICAgICAgICAgIGNsYXNzPVwidGV4dC1tdXRlZCBtLXQtOFwiXG4gICAgICAgICAgICAgICpuZ0lmPVwic3RlcD8uZXJyb3I/LmRldGFpbGVkRGF0YVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICBjbGFzcz1cImJ0biBidG4tY2xlYW5cIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJhbGVydC5leHBhbmRlZCA9ICFhbGVydC5leHBhbmRlZFwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8aSBjOHlJY29uPVwiY2hldnJvbi1kb3duXCI+PC9pPlxuICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIWFsZXJ0LmV4cGFuZGVkXCI+U2hvdyBkZXRhaWxzPC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiYWxlcnQuZXhwYW5kZWRcIj5IaWRlIGRldGFpbHM8L3NwYW4+XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICBbY29sbGFwc2VdPVwiIWFsZXJ0LmV4cGFuZGVkXCJcbiAgICAgICAgICAgICAgW2lzQW5pbWF0ZWRdPVwidHJ1ZVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIHt7IHN0ZXAuZXJyb3IuZGV0YWlsZWREYXRhIHwganNvbiB9fVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9jOHktbGktY29sbGFwc2U+XG4gICAgICAgICAgPGM4eS1saS1hY3Rpb25cbiAgICAgICAgICAgIGljb249XCJwbGF5XCJcbiAgICAgICAgICAgIGxhYmVsPVwie3sgJ1JldHJ5IHRoaXMgc3RlcGBidXR0b25gJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICAqbmdJZj1cInN0ZXAuc3RhdGUgPT09ICdGYWlsZWQnICYmICFzdGVwLm92ZXJyaWRlQ29udGV4dFwiXG4gICAgICAgICAgICAoY2xpY2spPVwic2VydmljZS5yZXRyeVN0ZXAoc3RlcClcIlxuICAgICAgICAgICAgZGF0YS1jeT1cImM4eS1yZXBsYWNlLWRldmljZS13aXphcmQtLXJldHJ5LXN0ZXBcIlxuICAgICAgICAgID48L2M4eS1saS1hY3Rpb24+XG4gICAgICAgIDwvYzh5LWxpPlxuICAgICAgPC9jOHktbGlzdC1ncm91cD5cbiAgICA8L2Rpdj5cblxuICAgIDxjOHktc3RlcHBlci1idXR0b25zXG4gICAgICBjbGFzcz1cImQtYmxvY2sgY2FyZC1mb290ZXIgcC0yNCBzZXBhcmF0b3JcIlxuICAgICAgW3BlbmRpbmddPVwic2VydmljZS5kZXZpY2VSZXBsYWNlbWVudEluUHJvZ3Jlc3MkIHwgYXN5bmNcIlxuICAgICAgKG9uQmFjayk9XCJjbG9zZSgpXCJcbiAgICAgIFtsYWJlbHNdPVwieyBiYWNrOiAnQ2xvc2UnIHwgdHJhbnNsYXRlIH1cIlxuICAgID5cbiAgICAgIDxidXR0b25cbiAgICAgICAgY2xhc3M9XCJidG4gYnRuLXByaW1hcnlcIlxuICAgICAgICBbdGl0bGVdPVwiJ1JldHJ5JyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAqbmdJZj1cIihzZXJ2aWNlLmRldmljZVJlcGxhY2VkJCB8IGFzeW5jKSA9PT0gZmFsc2VcIlxuICAgICAgICAoY2xpY2spPVwic2VydmljZS5yZXRyeVN0ZXAoKVwiXG4gICAgICAgIFtuZ0NsYXNzXT1cInsgJ2J0bi1wZW5kaW5nJzogc2VydmljZS5kZXZpY2VSZXBsYWNlbWVudEluUHJvZ3Jlc3MkIHwgYXN5bmMgfVwiXG4gICAgICAgIFtkaXNhYmxlZF09XCJzZXJ2aWNlLmRldmljZVJlcGxhY2VtZW50SW5Qcm9ncmVzcyQgfCBhc3luY1wiXG4gICAgICAgIGRhdGEtY3k9XCJjOHktcmVwbGFjZS1kZXZpY2Utd2l6YXJkLS1idG4tcmV0cnlcIlxuICAgICAgPlxuICAgICAgICB7eyAnUmV0cnknIHwgdHJhbnNsYXRlIH19XG4gICAgICA8L2J1dHRvbj5cbiAgICA8L2M4eS1zdGVwcGVyLWJ1dHRvbnM+XG4gIDwvY2RrLXN0