@c8y/ngx-components
Version:
Angular modules for Cumulocity IoT applications
142 lines • 26.5 kB
JavaScript
import { Component, EventEmitter, forwardRef, Input, Output } from '@angular/core';
import { gettext, InterAppService, SupportedApps } from '@c8y/ngx-components';
import { InventoryService } from '@c8y/client';
import { NG_VALUE_ACCESSOR } from '@angular/forms';
import { ActivatedRoute } from '@angular/router';
import * as i0 from "@angular/core";
import * as i1 from "@c8y/client";
import * as i2 from "@c8y/ngx-components";
import * as i3 from "@angular/router";
import * as i4 from "@angular/common";
import * as i5 from "../type-dashboard-info/type-dashboard-info.component";
export class TypedDashboardSettingsComponent {
constructor(inventory, interAppService, route) {
this.inventory = inventory;
this.interAppService = interAppService;
this.route = route;
this.touched = false;
this.disabled = false;
this.onDuplicateWithoutType = new EventEmitter();
this.deviceManagementAppKey = SupportedApps.devicemanagement;
this.deviceManagementLinkTitle = gettext('Device Info page in {{ deviceManagementAppName }}');
// eslint-disable-next-line @typescript-eslint/no-empty-function
this.onChange = _ => { };
// eslint-disable-next-line @typescript-eslint/no-empty-function
this.onTouched = () => { };
}
async ngOnInit() {
this.userDeviceManagementApp$ = this.interAppService.getApp$(this.deviceManagementAppKey);
this.context = this.route.parent.snapshot.data.contextData;
this.showSourceNavigationLink$ = this.interAppService.shouldShowAppLink$(this.deviceManagementAppKey);
}
async goToDeviceView() {
await this.interAppService.navigateToApp(this.deviceManagementAppKey, `#/device/${this.context.id}/device-info`);
}
writeValue(value) {
this.value = value;
this.updateTexts();
if (value) {
this.updateDeviceTypeCount();
}
}
registerOnChange(fn) {
this.onChange = fn;
}
registerOnTouched(onTouched) {
this.onTouched = onTouched;
}
markAsTouched() {
if (!this.touched) {
this.onTouched();
this.touched = true;
}
}
setDisabledState(disabled) {
this.disabled = disabled;
}
async toggle() {
this.value = !this.value;
this.onChange(this.value);
if (this.value && this.deviceTypeInstancesCount == null) {
this.setDisabledState(true);
await this.updateDeviceTypeCount();
}
this.updateTexts();
this.setDisabledState(false);
}
updateTexts() {
this.typedDashboardStatus = this.value
? gettext('Enabled`typed dashboard`')
: gettext('Disabled`typed dashboard`');
if (this.allowTypeDashboard === 'allow_if_type_filled') {
this.infoText = gettext(`<p class="p-b-8">Enabling this option uses the layout and configuration of this dashboard to create dashboard instances for all devices based on the device type.</p>
<p class="p-b-16">The current device doesn't have a device type assigned to it. Assign a device type to the device via the "Asset properties" widget in the <strong>Info</strong> tab of the device.</p>`);
return;
}
if (this.value) {
if (this.isDevice) {
this.infoText = gettext(`<p class="p-b-8">
The layout and configuration of this dashboard is used by all devices based on device type <span class="tag tag--info text-12">{{ displayDeviceTypeValue }}</span>.
</p>
<p class="p-b-16">
Disabling this option removes it from all devices based on the same type and makes it available only for the current instance.
</p>`);
}
else {
this.infoText = gettext(`<p class="p-b-8">
The layout and configuration of this dashboard is used by all assets based on asset model <span class="tag tag--info text-12">{{ displayDeviceTypeValue }}</span>.
</p>
<p class="p-b-16">
Disabling this option removes it from all assets based on the same model and makes it available only for the current instance.
</p>`);
}
}
else {
if (this.isDevice) {
this.infoText = gettext(`<p>Enabling this option uses the layout and configuration of this dashboard to create dashboard instances for all devices based on the type <span class="tag tag--info text-12">{{ displayDeviceTypeValue }}</span>.</p>`);
}
else {
this.infoText = gettext(`<p>Enabling this option uses the layout and configuration of this dashboard to create dashboard instances for all assets based on the model <span class="tag tag--info text-12">{{ displayDeviceTypeValue }}</span>.</p>`);
}
}
}
async updateDeviceTypeCount() {
const count = await this.inventory.count({
type: this.deviceTypeValue
});
this.deviceTypeInstancesCount = count.data;
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TypedDashboardSettingsComponent, deps: [{ token: i1.InventoryService }, { token: i2.InterAppService }, { token: i3.ActivatedRoute }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: TypedDashboardSettingsComponent, selector: "c8y-typed-dashboard-settings", inputs: { deviceTypeValue: "deviceTypeValue", displayDeviceTypeValue: "displayDeviceTypeValue", formInvalid: "formInvalid", mo: "mo", isDevice: "isDevice", allowTypeDashboard: "allowTypeDashboard" }, outputs: { onDuplicateWithoutType: "onDuplicateWithoutType" }, providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => TypedDashboardSettingsComponent),
multi: true
}
], ngImport: i0, template: "<fieldset class=\"c8y-fieldset c8y-fieldset--lg\">\n <legend>{{ 'Dashboard template' | translate }}</legend>\n <div class=\"d-flex p-b-16 gap-16\">\n <label class=\"c8y-switch flex-no-shrink\">\n <input\n type=\"checkbox\"\n [checked]=\"value\"\n [disabled]=\"disabled\"\n (click)=\"toggle()\"\n />\n <span></span>\n <span>{{ typedDashboardStatus | translate }}</span>\n </label>\n <div class=\"flex-grow d-flex d-col\">\n <div\n class=\"flex-grow\"\n [innerHtml]=\"infoText | translate: { displayDeviceTypeValue: displayDeviceTypeValue }\"\n ></div>\n <button\n class=\"btn-link p-0 m-r-auto\"\n type=\"button\"\n *ngIf=\"allowTypeDashboard === 'allow_if_type_filled' && showSourceNavigationLink$ | async\"\n (click)=\"goToDeviceView()\"\n >\n {{\n deviceManagementLinkTitle\n | translate\n : {\n deviceManagementAppName:\n userDeviceManagementApp$ | async | humanizeAppName | async\n }\n }}\n <i c8yIcon=\"external-link\"></i>\n </button>\n </div>\n </div>\n\n <c8y-type-dashboard-info\n *ngIf=\"allowTypeDashboard === 'allow'\"\n [context]=\"mo\"\n [deviceTypeValue]=\"deviceTypeValue\"\n [displayDeviceTypeValue]=\"displayDeviceTypeValue\"\n ></c8y-type-dashboard-info>\n\n <div\n class=\"p-t-8 p-b-16\"\n *ngIf=\"mo?.c8y_Dashboard && value\"\n >\n <button\n class=\"btn btn-default btn-sm\"\n type=\"button\"\n (click)=\"onDuplicateWithoutType.emit()\"\n [disabled]=\"formInvalid\"\n >\n {{ 'Duplicate as regular dashboard' | translate }}\n </button>\n </div>\n</fieldset>\n", dependencies: [{ kind: "directive", type: i2.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i5.TypeDashboardInfoComponent, selector: "c8y-type-dashboard-info", inputs: ["deviceTypeValue", "displayDeviceTypeValue", "context", "asyncRenderSuccess", "asyncRenderFail"] }, { kind: "pipe", type: i2.C8yTranslatePipe, name: "translate" }, { kind: "pipe", type: i4.AsyncPipe, name: "async" }, { kind: "pipe", type: i2.HumanizeAppNamePipe, name: "humanizeAppName" }] }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TypedDashboardSettingsComponent, decorators: [{
type: Component,
args: [{ selector: 'c8y-typed-dashboard-settings', providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => TypedDashboardSettingsComponent),
multi: true
}
], template: "<fieldset class=\"c8y-fieldset c8y-fieldset--lg\">\n <legend>{{ 'Dashboard template' | translate }}</legend>\n <div class=\"d-flex p-b-16 gap-16\">\n <label class=\"c8y-switch flex-no-shrink\">\n <input\n type=\"checkbox\"\n [checked]=\"value\"\n [disabled]=\"disabled\"\n (click)=\"toggle()\"\n />\n <span></span>\n <span>{{ typedDashboardStatus | translate }}</span>\n </label>\n <div class=\"flex-grow d-flex d-col\">\n <div\n class=\"flex-grow\"\n [innerHtml]=\"infoText | translate: { displayDeviceTypeValue: displayDeviceTypeValue }\"\n ></div>\n <button\n class=\"btn-link p-0 m-r-auto\"\n type=\"button\"\n *ngIf=\"allowTypeDashboard === 'allow_if_type_filled' && showSourceNavigationLink$ | async\"\n (click)=\"goToDeviceView()\"\n >\n {{\n deviceManagementLinkTitle\n | translate\n : {\n deviceManagementAppName:\n userDeviceManagementApp$ | async | humanizeAppName | async\n }\n }}\n <i c8yIcon=\"external-link\"></i>\n </button>\n </div>\n </div>\n\n <c8y-type-dashboard-info\n *ngIf=\"allowTypeDashboard === 'allow'\"\n [context]=\"mo\"\n [deviceTypeValue]=\"deviceTypeValue\"\n [displayDeviceTypeValue]=\"displayDeviceTypeValue\"\n ></c8y-type-dashboard-info>\n\n <div\n class=\"p-t-8 p-b-16\"\n *ngIf=\"mo?.c8y_Dashboard && value\"\n >\n <button\n class=\"btn btn-default btn-sm\"\n type=\"button\"\n (click)=\"onDuplicateWithoutType.emit()\"\n [disabled]=\"formInvalid\"\n >\n {{ 'Duplicate as regular dashboard' | translate }}\n </button>\n </div>\n</fieldset>\n" }]
}], ctorParameters: () => [{ type: i1.InventoryService }, { type: i2.InterAppService }, { type: i3.ActivatedRoute }], propDecorators: { deviceTypeValue: [{
type: Input
}], displayDeviceTypeValue: [{
type: Input
}], formInvalid: [{
type: Input
}], mo: [{
type: Input
}], isDevice: [{
type: Input
}], allowTypeDashboard: [{
type: Input
}], onDuplicateWithoutType: [{
type: Output
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZWQtZGFzaGJvYXJkLXNldHRpbmdzLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2NvbnRleHQtZGFzaGJvYXJkL2Rhc2hib2FyZC1zZXR0aW5ncy90eXBlZC1kYXNoYm9hcmQtc2V0dGluZ3MuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vY29udGV4dC1kYXNoYm9hcmQvZGFzaGJvYXJkLXNldHRpbmdzL3R5cGVkLWRhc2hib2FyZC1zZXR0aW5ncy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFVLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzRixPQUFPLEVBQUUsT0FBTyxFQUFFLGVBQWUsRUFBRSxhQUFhLEVBQW1CLE1BQU0scUJBQXFCLENBQUM7QUFDL0YsT0FBTyxFQUFnQixnQkFBZ0IsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUM3RCxPQUFPLEVBQXdCLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFHekUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGlCQUFpQixDQUFDOzs7Ozs7O0FBYWpELE1BQU0sT0FBTywrQkFBK0I7SUFxQjFDLFlBQ1UsU0FBMkIsRUFDM0IsZUFBZ0MsRUFDaEMsS0FBcUI7UUFGckIsY0FBUyxHQUFULFNBQVMsQ0FBa0I7UUFDM0Isb0JBQWUsR0FBZixlQUFlLENBQWlCO1FBQ2hDLFVBQUssR0FBTCxLQUFLLENBQWdCO1FBdEIvQixZQUFPLEdBQUcsS0FBSyxDQUFDO1FBQ2hCLGFBQVEsR0FBRyxLQUFLLENBQUM7UUFRUCwyQkFBc0IsR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDO1FBTzVELDJCQUFzQixHQUFvQixhQUFhLENBQUMsZ0JBQWdCLENBQUM7UUFDekUsOEJBQXlCLEdBQUcsT0FBTyxDQUFDLG1EQUFtRCxDQUFDLENBQUM7UUF1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Q0csRUFBRTtzQkFBVixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csa0JBQWtCO3NCQUExQixLQUFLO2dCQUNJLHNCQUFzQjtzQkFBL0IsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBmb3J3YXJkUmVmLCBJbnB1dCwgT25Jbml0LCBPdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGdldHRleHQsIEludGVyQXBwU2VydmljZSwgU3VwcG9ydGVkQXBwcywgU3VwcG9ydGVkQXBwS2V5IH0gZnJvbSAnQGM4eS9uZ3gtY29tcG9uZW50cyc7XG5pbXBvcnQgeyBJQXBwbGljYXRpb24sIEludmVudG9yeVNlcnZpY2UgfSBmcm9tICdAYzh5L2NsaWVudCc7XG5pbXBvcnQgeyBDb250cm9sVmFsdWVBY2Nlc3NvciwgTkdfVkFMVUVfQUNDRVNTT1IgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBBbGxvd1R5cGVEYXNoYm9hcmQsIENvbnRleHREYXNoYm9hcmRNYW5hZ2VkT2JqZWN0IH0gZnJvbSAnLi4vY29udGV4dC1kYXNoYm9hcmQubW9kZWwnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjOHktdHlwZWQtZGFzaGJvYXJkLXNldHRpbmdzJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3R5cGVkLWRhc2hib2FyZC1zZXR0aW5ncy5jb21wb25lbnQuaHRtbCcsXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gVHlwZWREYXNoYm9hcmRTZXR0aW5nc0NvbXBvbmVudCksXG4gICAgICBtdWx0aTogdHJ1ZVxuICAgIH1cbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBUeXBlZERhc2hib2FyZFNldHRpbmdzQ29tcG9uZW50IGltcGxlbWVudHMgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE9uSW5pdCB7XG4gIHZhbHVlOiBib29sZWFuO1xuICB0b3VjaGVkID0gZmFsc2U7XG4gIGRpc2FibGVkID0gZmFsc2U7XG5cbiAgQElucHV0KCkgZGV2aWNlVHlwZVZhbHVlOiBzdHJpbmc7XG4gIEBJbnB1dCgpIGRpc3BsYXlEZXZpY2VUeXBlVmFsdWU6IHN0cmluZztcbiAgQElucHV0KCkgZm9ybUludmFsaWQ6IGJvb2xlYW47XG4gIEBJbnB1dCgpIG1vOiBDb250ZXh0RGFzaGJvYXJkTWFuYWdlZE9iamVjdDtcbiAgQElucHV0KCkgaXNEZXZpY2U6IGJvb2xlYW47XG4gIEBJbnB1dCgpIGFsbG93VHlwZURhc2hib2FyZDogQWxsb3dUeXBlRGFzaGJvYXJkO1xuICBAT3V0cHV0KCkgb25EdXBsaWNhdGVXaXRob3V0VHlwZSA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgdHlwZWREYXNoYm9hcmRTdGF0dXM6IHN0cmluZztcbiAgaW5mb1RleHQ6IHN0cmluZztcbiAgZGV2aWNlVHlwZUluc3RhbmNlc0NvdW50OiBudW1iZXI7XG4gIHNob3dTb3VyY2VOYXZpZ2F0aW9uTGluayQ6IE9ic2VydmFibGU8Ym9vbGVhbj47XG4gIHVzZXJEZXZpY2VNYW5hZ2VtZW50QXBwJDogT2JzZXJ2YWJsZTxJQXBwbGljYXRpb24+O1xuICBjb250ZXh0OiBhbnk7XG4gIGRldmljZU1hbmFnZW1lbnRBcHBLZXk6IFN1cHBvcnRlZEFwcEtleSA9IFN1cHBvcnRlZEFwcHMuZGV2aWNlbWFuYWdlbWVudDtcbiAgZGV2aWNlTWFuYWdlbWVudExpbmtUaXRsZSA9IGdldHRleHQoJ0RldmljZSBJbmZvIHBhZ2UgaW4ge3sgZGV2aWNlTWFuYWdlbWVudEFwcE5hbWUgfX0nKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGludmVudG9yeTogSW52ZW50b3J5U2VydmljZSxcbiAgICBwcml2YXRlIGludGVyQXBwU2VydmljZTogSW50ZXJBcHBTZXJ2aWNlLFxuICAgIHByaXZhdGUgcm91dGU6IEFjdGl2YXRlZFJvdXRlXG4gICkge31cblxuICBhc3luYyBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLnVzZXJEZXZpY2VNYW5hZ2VtZW50QXBwJCA9IHRoaXMuaW50ZXJBcHBTZXJ2aWNlLmdldEFwcCQodGhpcy5kZXZpY2VNYW5hZ2VtZW50QXBwS2V5KTtcbiAgICB0aGlzLmNvbnRleHQgPSB0aGlzLnJvdXRlLnBhcmVudC5zbmFwc2hvdC5kYXRhLmNvbnRleHREYXRhO1xuICAgIHRoaXMuc2hvd1NvdXJjZU5hdmlnYXRpb25MaW5rJCA9IHRoaXMuaW50ZXJBcHBTZXJ2aWNlLnNob3VsZFNob3dBcHBMaW5rJChcbiAgICAgIHRoaXMuZGV2aWNlTWFuYWdlbWVudEFwcEtleVxuICAgICk7XG4gIH1cblxuICBhc3luYyBnb1RvRGV2aWNlVmlldygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmludGVyQXBwU2VydmljZS5uYXZpZ2F0ZVRvQXBwKFxuICAgICAgdGhpcy5kZXZpY2VNYW5hZ2VtZW50QXBwS2V5LFxuICAgICAgYCMvZGV2aWNlLyR7dGhpcy5jb250ZXh0LmlkfS9kZXZpY2UtaW5mb2BcbiAgICApO1xuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1lbXB0eS1mdW5jdGlvblxuICBvbkNoYW5nZSA9IF8gPT4ge307XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZW1wdHktZnVuY3Rpb25cbiAgb25Ub3VjaGVkID0gKCkgPT4ge307XG5cbiAgd3JpdGVWYWx1ZSh2YWx1ZTogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICB0aGlzLnVwZGF0ZVRleHRzKCk7XG4gICAgaWYgKHZhbHVlKSB7XG4gICAgICB0aGlzLnVwZGF0ZURldmljZVR5cGVDb3VudCgpO1xuICAgIH1cbiAgfVxuXG4gIHJlZ2lzdGVyT25DaGFuZ2UoZm46IGFueSk6IHZvaWQge1xuICAgIHRoaXMub25DaGFuZ2UgPSBmbjtcbiAgfVxuXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKG9uVG91Y2hlZDogYW55KTogdm9pZCB7XG4gICAgdGhpcy5vblRvdWNoZWQgPSBvblRvdWNoZWQ7XG4gIH1cblxuICBtYXJrQXNUb3VjaGVkKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy50b3VjaGVkKSB7XG4gICAgICB0aGlzLm9uVG91Y2hlZCgpO1xuICAgICAgdGhpcy50b3VjaGVkID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICBzZXREaXNhYmxlZFN0YXRlKGRpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5kaXNhYmxlZCA9IGRpc2FibGVkO1xuICB9XG5cbiAgYXN5bmMgdG9nZ2xlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMudmFsdWUgPSAhdGhpcy52YWx1ZTtcbiAgICB0aGlzLm9uQ2hhbmdlKHRoaXMudmFsdWUpO1xuICAgIGlmICh0aGlzLnZhbHVlICYmIHRoaXMuZGV2aWNlVHlwZUluc3RhbmNlc0NvdW50ID09IG51bGwpIHtcbiAgICAgIHRoaXMuc2V0RGlzYWJsZWRTdGF0ZSh0cnVlKTtcbiAgICAgIGF3YWl0IHRoaXMudXBkYXRlRGV2aWNlVHlwZUNvdW50KCk7XG4gICAgfVxuICAgIHRoaXMudXBkYXRlVGV4dHMoKTtcbiAgICB0aGlzLnNldERpc2FibGVkU3RhdGUoZmFsc2UpO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVUZXh0cygpOiB2b2lkIHtcbiAgICB0aGlzLnR5cGVkRGFzaGJvYXJkU3RhdHVzID0gdGhpcy52YWx1ZVxuICAgICAgPyBnZXR0ZXh0KCdFbmFibGVkYHR5cGVkIGRhc2hib2FyZGAnKVxuICAgICAgOiBnZXR0ZXh0KCdEaXNhYmxlZGB0eXBlZCBkYXNoYm9hcmRgJyk7XG5cbiAgICBpZiAodGhpcy5hbGxvd1R5cGVEYXNoYm9hcmQgPT09ICdhbGxvd19pZl90eXBlX2ZpbGxlZCcpIHtcbiAgICAgIHRoaXMuaW5mb1RleHQgPSBnZXR0ZXh0KFxuICAgICAgICBgPHAgY2xhc3M9XCJwLWItOFwiPkVuYWJsaW5nIHRoaXMgb3B0aW9uIHVzZXMgdGhlIGxheW91dCBhbmQgY29uZmlndXJhdGlvbiBvZiB0aGlzIGRhc2hib2FyZCB0byBjcmVhdGUgZGFzaGJvYXJkIGluc3RhbmNlcyBmb3IgYWxsIGRldmljZXMgYmFzZWQgb24gdGhlIGRldmljZSB0eXBlLjwvcD5cbiAgICAgICAgICAgICA8cCBjbGFzcz1cInAtYi0xNlwiPlRoZSBjdXJyZW50IGRldmljZSBkb2Vzbid0IGhhdmUgYSBkZXZpY2UgdHlwZSBhc3NpZ25lZCB0byBpdC4gQXNzaWduIGEgZGV2aWNlIHR5cGUgdG8gdGhlIGRldmljZSB2aWEgdGhlIFwiQXNzZXQgcHJvcGVydGllc1wiIHdpZGdldCBpbiB0aGUgPHN0cm9uZz5JbmZvPC9zdHJvbmc+IHRhYiBvZiB0aGUgZGV2aWNlLjwvcD5gXG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnZhbHVlKSB7XG4gICAgICBpZiAodGhpcy5pc0RldmljZSkge1xuICAgICAgICB0aGlzLmluZm9UZXh0ID0gZ2V0dGV4dChcbiAgICAgICAgICBgPHAgY2xhc3M9XCJwLWItOFwiPlxuICAgICAgICAgICAgVGhlIGxheW91dCBhbmQgY29uZmlndXJhdGlvbiBvZiB0aGlzIGRhc2hib2FyZCBpcyB1c2VkIGJ5IGFsbCBkZXZpY2VzIGJhc2VkIG9uIGRldmljZSB0eXBlIDxzcGFuIGNsYXNzPVwidGFnIHRhZy0taW5mbyB0ZXh0LTEyXCI+e3sgZGlzcGxheURldmljZVR5cGVWYWx1ZSB9fTwvc3Bhbj4uXG4gICAgICAgICAgPC9wPlxuICAgICAgICAgIDxwIGNsYXNzPVwicC1iLTE2XCI+XG4gICAgICAgICAgICBEaXNhYmxpbmcgdGhpcyBvcHRpb24gcmVtb3ZlcyBpdCBmcm9tIGFsbCBkZXZpY2VzIGJhc2VkIG9uIHRoZSBzYW1lIHR5cGUgYW5kIG1ha2VzIGl0IGF2YWlsYWJsZSBvbmx5IGZvciB0aGUgY3VycmVudCBpbnN0YW5jZS5cbiAgICAgICAgICA8L3A+YFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5pbmZvVGV4dCA9IGdldHRleHQoXG4gICAgICAgICAgYDxwIGNsYXNzPVwicC1iLThcIj5cbiAgICAgICAgICAgICAgVGhlIGxheW91dCBhbmQgY29uZmlndXJhdGlvbiBvZiB0aGlzIGRhc2hib2FyZCBpcyB1c2VkIGJ5IGFsbCBhc3NldHMgYmFzZWQgb24gYXNzZXQgbW9kZWwgPHNwYW4gY2xhc3M9XCJ0YWcgdGFnLS1pbmZvIHRleHQtMTJcIj57eyBkaXNwbGF5RGV2aWNlVHlwZVZhbHVlIH19PC9zcGFuPi5cbiAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgIDxwIGNsYXNzPVwicC1iLTE2XCI+XG4gICAgICAgICAgICAgIERpc2FibGluZyB0aGlzIG9wdGlvbiByZW1vdmVzIGl0IGZyb20gYWxsIGFzc2V0cyBiYXNlZCBvbiB0aGUgc2FtZSBtb2RlbCBhbmQgbWFrZXMgaXQgYXZhaWxhYmxlIG9ubHkgZm9yIHRoZSBjdXJyZW50IGluc3RhbmNlLlxuICAgICAgICAgICAgPC9wPmBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHRoaXMuaXNEZXZpY2UpIHtcbiAgICAgICAgdGhpcy5pbmZvVGV4dCA9IGdldHRleHQoXG4gICAgICAgICAgYDxwPkVuYWJsaW5nIHRoaXMgb3B0aW9uIHVzZXMgdGhlIGxheW91dCBhbmQgY29uZmlndXJhdGlvbiBvZiB0aGlzIGRhc2hib2FyZCB0byBjcmVhdGUgZGFzaGJvYXJkIGluc3RhbmNlcyBmb3IgYWxsIGRldmljZXMgYmFzZWQgb24gdGhlIHR5cGUgPHNwYW4gY2xhc3M9XCJ0YWcgdGFnLS1pbmZvIHRleHQtMTJcIj57eyBkaXNwbGF5RGV2aWNlVHlwZVZhbHVlIH19PC9zcGFuPi48L3A+YFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5pbmZvVGV4dCA9IGdldHRleHQoXG4gICAgICAgICAgYDxwPkVuYWJsaW5nIHRoaXMgb3B0aW9uIHVzZXMgdGhlIGxheW91dCBhbmQgY29uZmlndXJhdGlvbiBvZiB0aGlzIGRhc2hib2FyZCB0byBjcmVhdGUgZGFzaGJvYXJkIGluc3RhbmNlcyBmb3IgYWxsIGFzc2V0cyBiYXNlZCBvbiB0aGUgbW9kZWwgPHNwYW4gY2xhc3M9XCJ0YWcgdGFnLS1pbmZvIHRleHQtMTJcIj57eyBkaXNwbGF5RGV2aWNlVHlwZVZhbHVlIH19PC9zcGFuPi48L3A+YFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgdXBkYXRlRGV2aWNlVHlwZUNvdW50KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGNvdW50ID0gYXdhaXQgdGhpcy5pbnZlbnRvcnkuY291bnQoe1xuICAgICAgdHlwZTogdGhpcy5kZXZpY2VUeXBlVmFsdWVcbiAgICB9KTtcbiAgICB0aGlzLmRldmljZVR5cGVJbnN0YW5jZXNDb3VudCA9IGNvdW50LmRhdGE7XG4gIH1cbn1cbiIsIjxmaWVsZHNldCBjbGFzcz1cImM4eS1maWVsZHNldCBjOHktZmllbGRzZXQtLWxnXCI+XG4gIDxsZWdlbmQ+e3sgJ0Rhc2hib2FyZCB0ZW1wbGF0ZScgfCB0cmFuc2xhdGUgfX08L2xlZ2VuZD5cbiAgPGRpdiBjbGFzcz1cImQtZmxleCBwLWItMTYgZ2FwLTE2XCI+XG4gICAgPGxhYmVsIGNsYXNzPVwiYzh5LXN3aXRjaCBmbGV4LW5vLXNocmlua1wiPlxuICAgICAgPGlucHV0XG4gICAgICAgIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgIFtjaGVja2VkXT1cInZhbHVlXCJcbiAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICAgICAgKGNsaWNrKT1cInRvZ2dsZSgpXCJcbiAgICAgIC8+XG4gICAgICA8c3Bhbj48L3NwYW4+XG4gICAgICA8c3Bhbj57eyB0eXBlZERhc2hib2FyZFN0YXR1cyB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgICA8L2xhYmVsPlxuICAgIDxkaXYgY2xhc3M9XCJmbGV4LWdyb3cgZC1mbGV4IGQtY29sXCI+XG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwiZmxleC1ncm93XCJcbiAgICAgICAgW2lubmVySHRtbF09XCJpbmZvVGV4dCB8IHRyYW5zbGF0ZTogeyBkaXNwbGF5RGV2aWNlVHlwZVZhbHVlOiBkaXNwbGF5RGV2aWNlVHlwZVZhbHVlIH1cIlxuICAgICAgPjwvZGl2PlxuICAgICAgPGJ1dHRvblxuICAgICAgICBjbGFzcz1cImJ0bi1saW5rIHAtMCBtLXItYXV0b1wiXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAqbmdJZj1cImFsbG93VHlwZURhc2hib2FyZCA9PT0gJ2FsbG93X2lmX3R5cGVfZmlsbGVkJyAmJiBzaG93U291cmNlTmF2aWdhdGlvbkxpbmskIHwgYXN5bmNcIlxuICAgICAgICAoY2xpY2spPVwiZ29Ub0RldmljZVZpZXcoKVwiXG4gICAgICA+XG4gICAgICAgIHt7XG4gICAgICAgICAgZGV2aWNlTWFuYWdlbWVudExpbmtUaXRsZVxuICAgICAgICAgICAgfCB0cmFuc2xhdGVcbiAgICAgICAgICAgICAgOiB7XG4gICAgICAgICAgICAgICAgICBkZXZpY2VNYW5hZ2VtZW50QXBwTmFtZTpcbiAgICAgICAgICAgICAgICAgICAgdXNlckRldmljZU1hbmFnZW1lbnRBcHAkIHwgYXN5bmMgfCBodW1hbml6ZUFwcE5hbWUgfCBhc3luY1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgfX1cbiAgICAgICAgPGkgYzh5SWNvbj1cImV4dGVybmFsLWxpbmtcIj48L2k+XG4gICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG5cbiAgPGM4eS10eXBlLWRhc2hib2FyZC1pbmZvXG4gICAgKm5nSWY9XCJhbGxvd1R5cGVEYXNoYm9hcmQgPT09ICdhbGxvdydcIlxuICAgIFtjb250ZXh0XT1cIm1vXCJcbiAgICBbZGV2aWNlVHlwZVZhbHVlXT1cImRldmljZVR5cGVWYWx1ZVwiXG4gICAgW2Rpc3BsYXlEZXZpY2VUeXBlVmFsdWVdPVwiZGlzcGxheURldmljZVR5cGVWYWx1ZVwiXG4gID48L2M4eS10eXBlLWRhc2hib2FyZC1pbmZvPlxuXG4gIDxkaXZcbiAgICBjbGFzcz1cInAtdC04IHAtYi0xNlwiXG4gICAgKm5nSWY9XCJtbz8uYzh5X0Rhc2hib2FyZCAmJiB2YWx1ZVwiXG4gID5cbiAgICA8YnV0dG9uXG4gICAgICBjbGFzcz1cImJ0biBidG4tZGVmYXVsdCBidG4tc21cIlxuICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAoY2xpY2spPVwib25EdXBsaWNhdGVXaXRob3V0VHlwZS5lbWl0KClcIlxuICAgICAgW2Rpc2FibGVkXT1cImZvcm1JbnZhbGlkXCJcbiAgICA+XG4gICAgICB7eyAnRHVwbGljYXRlIGFzIHJlZ3VsYXIgZGFzaGJvYXJkJyB8IHRyYW5zbGF0ZSB9fVxuICAgIDwvYnV0dG9uPlxuICA8L2Rpdj5cbjwvZmllbGRzZXQ+XG4iXX0=