@c8y/ngx-components
Version:
Angular modules for Cumulocity IoT applications
49 lines • 19.9 kB
JavaScript
import { Component, ViewChild } from '@angular/core';
import { ApplicationService } from '@c8y/client';
import { C8yStepper, WizardComponent } from '@c8y/ngx-components';
import { BehaviorSubject } from 'rxjs';
import { EcosystemService } from '../ecosystem.service';
import * as i0 from "@angular/core";
import * as i1 from "../ecosystem.service";
import * as i2 from "@c8y/client";
import * as i3 from "@c8y/ngx-components";
import * as i4 from "@angular/common";
import * as i5 from "@angular/cdk/stepper";
import * as i6 from "./duplicate-application-list/duplicate-application-list.component";
import * as i7 from "./duplicate-application-properties/duplicate-application-properties.component";
export class DuplicateApplicationComponent {
constructor(ecosystemService, applicationService, wizardComponent) {
this.ecosystemService = ecosystemService;
this.applicationService = applicationService;
this.wizardComponent = wizardComponent;
this.selectedApp = new BehaviorSubject(null);
this.existingApps = [];
this.directlyMoveToSecondStep = false;
this.noBackButton = false;
}
async ngOnInit() {
this.existingApps = await this.ecosystemService.getWebApplications();
if (this.selectedApp.value) {
this.directlyMoveToSecondStep = true;
}
}
onSelectedApp(app) {
this.selectedApp.next(app);
}
getHref(app) {
return this.applicationService.getHref(app);
}
done() {
this.wizardComponent.close();
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DuplicateApplicationComponent, deps: [{ token: i1.EcosystemService }, { token: i2.ApplicationService }, { token: i3.WizardComponent }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: DuplicateApplicationComponent, selector: "c8y-duplicate-application", viewQueries: [{ propertyName: "stepper", first: true, predicate: C8yStepper, descendants: true, static: true }], ngImport: i0, template: "<c8y-wizard-header>\n <i [c8yIcon]=\"'copy'\"></i>\n <h4\n id=\"modal-title\"\n translate\n >\n Duplicate application\n </h4>\n</c8y-wizard-header>\n\n<c8y-wizard-body id=\"modal-body\">\n <c8y-stepper\n [disableDefaultIcons]=\"{ edit: true, done: false }\"\n [customClasses]=\"['hidden']\"\n linear\n >\n <!-- 1st step -->\n <cdk-step *ngIf=\"!directlyMoveToSecondStep\">\n <p class=\"p-16 text-center text-medium separator-bottom sticky-top bg-level-0\">\n {{ 'Select application to duplicate' | translate }}\n </p>\n <c8y-duplicate-application-list\n class=\"d-block\"\n style=\"min-height: 257px\"\n (onSelectedApp)=\"onSelectedApp($event)\"\n *ngIf=\"stepper.selectedIndex === 0\"\n [existingApps]=\"existingApps\"\n [stepper]=\"stepper\"\n ></c8y-duplicate-application-list>\n </cdk-step>\n <!-- 2nd step -->\n <cdk-step>\n <c8y-duplicate-application-properties\n class=\"d-flex d-col j-c-center a-i-center\"\n style=\"min-height: 257px\"\n (duplicatedApp)=\"duplicatedApp = $event\"\n *ngIf=\"\n stepper.selectedIndex === 1 || (stepper.selectedIndex === 0 && directlyMoveToSecondStep)\n \"\n [existingApps]=\"existingApps\"\n [selectedApp]=\"selectedApp\"\n [stepper]=\"stepper\"\n [isFirstStep]=\"directlyMoveToSecondStep\"\n ></c8y-duplicate-application-properties>\n </cdk-step>\n <!-- Final step -->\n <cdk-step>\n <ng-container\n *ngIf=\"\n stepper.selectedIndex === 2 || (stepper.selectedIndex === 1 && directlyMoveToSecondStep)\n \"\n >\n <div\n class=\"d-flex a-i-center j-c-center\"\n style=\"min-height: 257px\"\n *ngIf=\"duplicatedApp; else duplicateAppFailed\"\n >\n <c8y-operation-result\n type=\"success\"\n text=\"{{ 'Application created' | translate }}\"\n [size]=\"84\"\n [vertical]=\"true\"\n ></c8y-operation-result>\n </div>\n <ng-template #duplicateAppFailed>\n <div\n class=\"d-flex a-i-center j-c-center\"\n style=\"min-height: 257px\"\n >\n <c8y-operation-result\n type=\"error\"\n text=\"{{ 'Application creation failed' | translate }}\"\n [size]=\"84\"\n [vertical]=\"true\"\n ></c8y-operation-result>\n </div>\n </ng-template>\n </ng-container>\n </cdk-step>\n </c8y-stepper>\n</c8y-wizard-body>\n\n<c8y-wizard-footer *ngIf=\"stepper.selectedIndex === 0 && noBackButton\">\n <button\n class=\"btn btn-default\"\n title=\"{{ 'Cancel' | translate }}\"\n type=\"button\"\n (click)=\"done()\"\n >\n {{ 'Cancel' | translate }}\n </button>\n</c8y-wizard-footer>\n\n<c8y-wizard-footer\n *ngIf=\"stepper.selectedIndex === 2 || (stepper.selectedIndex === 1 && directlyMoveToSecondStep)\"\n>\n <button\n class=\"btn btn-default\"\n title=\"{{ 'Done' | translate }}\"\n type=\"button\"\n (click)=\"done()\"\n >\n {{ 'Done' | translate }}\n </button>\n <a\n class=\"btn btn-primary\"\n title=\"{{ 'Open' | translate }}\"\n target=\"_blank\"\n (click)=\"$event.stopPropagation()\"\n [href]=\"getHref(duplicatedApp)\"\n rel=\"noopener noreferrer\"\n >\n <i\n class=\"m-r-4\"\n c8yIcon=\"external-link\"\n ></i>\n {{ 'Open' | translate }}\n </a>\n</c8y-wizard-footer>\n", dependencies: [{ kind: "directive", type: i3.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: i3.C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i3.OperationResultComponent, selector: "c8y-operation-result", inputs: ["text", "vertical", "size", "type"] }, { 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.WizardHeaderComponent, selector: "c8y-wizard-header" }, { kind: "component", type: i3.WizardBodyComponent, selector: "c8y-wizard-body" }, { kind: "component", type: i3.WizardFooterComponent, selector: "c8y-wizard-footer" }, { kind: "component", type: i6.DuplicateApplicationListComponent, selector: "c8y-duplicate-application-list", inputs: ["stepper", "existingApps"], outputs: ["onSelectedApp"] }, { kind: "component", type: i7.DuplicateApplicationPropertiesComponent, selector: "c8y-duplicate-application-properties", inputs: ["stepper", "existingApps", "selectedApp", "isFirstStep"], outputs: ["duplicatedApp"] }, { kind: "pipe", type: i3.C8yTranslatePipe, name: "translate" }] }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DuplicateApplicationComponent, decorators: [{
type: Component,
args: [{ selector: 'c8y-duplicate-application', template: "<c8y-wizard-header>\n <i [c8yIcon]=\"'copy'\"></i>\n <h4\n id=\"modal-title\"\n translate\n >\n Duplicate application\n </h4>\n</c8y-wizard-header>\n\n<c8y-wizard-body id=\"modal-body\">\n <c8y-stepper\n [disableDefaultIcons]=\"{ edit: true, done: false }\"\n [customClasses]=\"['hidden']\"\n linear\n >\n <!-- 1st step -->\n <cdk-step *ngIf=\"!directlyMoveToSecondStep\">\n <p class=\"p-16 text-center text-medium separator-bottom sticky-top bg-level-0\">\n {{ 'Select application to duplicate' | translate }}\n </p>\n <c8y-duplicate-application-list\n class=\"d-block\"\n style=\"min-height: 257px\"\n (onSelectedApp)=\"onSelectedApp($event)\"\n *ngIf=\"stepper.selectedIndex === 0\"\n [existingApps]=\"existingApps\"\n [stepper]=\"stepper\"\n ></c8y-duplicate-application-list>\n </cdk-step>\n <!-- 2nd step -->\n <cdk-step>\n <c8y-duplicate-application-properties\n class=\"d-flex d-col j-c-center a-i-center\"\n style=\"min-height: 257px\"\n (duplicatedApp)=\"duplicatedApp = $event\"\n *ngIf=\"\n stepper.selectedIndex === 1 || (stepper.selectedIndex === 0 && directlyMoveToSecondStep)\n \"\n [existingApps]=\"existingApps\"\n [selectedApp]=\"selectedApp\"\n [stepper]=\"stepper\"\n [isFirstStep]=\"directlyMoveToSecondStep\"\n ></c8y-duplicate-application-properties>\n </cdk-step>\n <!-- Final step -->\n <cdk-step>\n <ng-container\n *ngIf=\"\n stepper.selectedIndex === 2 || (stepper.selectedIndex === 1 && directlyMoveToSecondStep)\n \"\n >\n <div\n class=\"d-flex a-i-center j-c-center\"\n style=\"min-height: 257px\"\n *ngIf=\"duplicatedApp; else duplicateAppFailed\"\n >\n <c8y-operation-result\n type=\"success\"\n text=\"{{ 'Application created' | translate }}\"\n [size]=\"84\"\n [vertical]=\"true\"\n ></c8y-operation-result>\n </div>\n <ng-template #duplicateAppFailed>\n <div\n class=\"d-flex a-i-center j-c-center\"\n style=\"min-height: 257px\"\n >\n <c8y-operation-result\n type=\"error\"\n text=\"{{ 'Application creation failed' | translate }}\"\n [size]=\"84\"\n [vertical]=\"true\"\n ></c8y-operation-result>\n </div>\n </ng-template>\n </ng-container>\n </cdk-step>\n </c8y-stepper>\n</c8y-wizard-body>\n\n<c8y-wizard-footer *ngIf=\"stepper.selectedIndex === 0 && noBackButton\">\n <button\n class=\"btn btn-default\"\n title=\"{{ 'Cancel' | translate }}\"\n type=\"button\"\n (click)=\"done()\"\n >\n {{ 'Cancel' | translate }}\n </button>\n</c8y-wizard-footer>\n\n<c8y-wizard-footer\n *ngIf=\"stepper.selectedIndex === 2 || (stepper.selectedIndex === 1 && directlyMoveToSecondStep)\"\n>\n <button\n class=\"btn btn-default\"\n title=\"{{ 'Done' | translate }}\"\n type=\"button\"\n (click)=\"done()\"\n >\n {{ 'Done' | translate }}\n </button>\n <a\n class=\"btn btn-primary\"\n title=\"{{ 'Open' | translate }}\"\n target=\"_blank\"\n (click)=\"$event.stopPropagation()\"\n [href]=\"getHref(duplicatedApp)\"\n rel=\"noopener noreferrer\"\n >\n <i\n class=\"m-r-4\"\n c8yIcon=\"external-link\"\n ></i>\n {{ 'Open' | translate }}\n </a>\n</c8y-wizard-footer>\n" }]
}], ctorParameters: () => [{ type: i1.EcosystemService }, { type: i2.ApplicationService }, { type: i3.WizardComponent }], propDecorators: { stepper: [{
type: ViewChild,
args: [C8yStepper, { static: true }]
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHVwbGljYXRlLWFwcGxpY2F0aW9uLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2Vjb3N5c3RlbS9zaGFyZWQvZHVwbGljYXRlLWFwcGxpY2F0aW9uL2R1cGxpY2F0ZS1hcHBsaWNhdGlvbi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9lY29zeXN0ZW0vc2hhcmVkL2R1cGxpY2F0ZS1hcHBsaWNhdGlvbi9kdXBsaWNhdGUtYXBwbGljYXRpb24uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBVSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDN0QsT0FBTyxFQUFFLGtCQUFrQixFQUFnQixNQUFNLGFBQWEsQ0FBQztBQUMvRCxPQUFPLEVBQUUsVUFBVSxFQUFFLGVBQWUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDdkMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7Ozs7Ozs7OztBQU14RCxNQUFNLE9BQU8sNkJBQTZCO0lBU3hDLFlBQ1UsZ0JBQWtDLEVBQ2xDLGtCQUFzQyxFQUN0QyxlQUFnQztRQUZoQyxxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO1FBQ2xDLHVCQUFrQixHQUFsQixrQkFBa0IsQ0FBb0I7UUFDdEMsb0JBQWUsR0FBZixlQUFlLENBQWlCO1FBUjFDLGdCQUFXLEdBQWtDLElBQUksZUFBZSxDQUFlLElBQUksQ0FBQyxDQUFDO1FBQ3JGLGlCQUFZLEdBQW1CLEVBQUUsQ0FBQztRQUNsQyw2QkFBd0IsR0FBRyxLQUFLLENBQUM7UUFDakMsaUJBQVksR0FBRyxLQUFLLENBQUM7SUFNbEIsQ0FBQztJQUVKLEtBQUssQ0FBQyxRQUFRO1FBQ1osSUFBSSxDQUFDLFlBQVksR0FBRyxNQUFNLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1FBQ3JFLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUMzQixJQUFJLENBQUMsd0JBQXdCLEdBQUcsSUFBSSxDQUFDO1FBQ3ZDLENBQUM7SUFDSCxDQUFDO0lBRUQsYUFBYSxDQUFDLEdBQWlCO1FBQzdCLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzdCLENBQUM7SUFFRCxPQUFPLENBQUMsR0FBaUI7UUFDdkIsT0FBTyxJQUFJLENBQUMsa0JBQWtCLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFFRCxJQUFJO1FBQ0YsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUMvQixDQUFDOytHQWhDVSw2QkFBNkI7bUdBQTdCLDZCQUE2QiwwR0FDN0IsVUFBVSw4RENYdkIsbStHQXVIQTs7NEZEN0dhLDZCQUE2QjtrQkFKekMsU0FBUzsrQkFDRSwyQkFBMkI7b0pBS3JDLE9BQU87c0JBRE4sU0FBUzt1QkFBQyxVQUFVLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQXBwbGljYXRpb25TZXJ2aWNlLCBJQXBwbGljYXRpb24gfSBmcm9tICdAYzh5L2NsaWVudCc7XG5pbXBvcnQgeyBDOHlTdGVwcGVyLCBXaXphcmRDb21wb25lbnQgfSBmcm9tICdAYzh5L25neC1jb21wb25lbnRzJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgRWNvc3lzdGVtU2VydmljZSB9IGZyb20gJy4uL2Vjb3N5c3RlbS5zZXJ2aWNlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYzh5LWR1cGxpY2F0ZS1hcHBsaWNhdGlvbicsXG4gIHRlbXBsYXRlVXJsOiAnLi9kdXBsaWNhdGUtYXBwbGljYXRpb24uY29tcG9uZW50Lmh0bWwnXG59KVxuZXhwb3J0IGNsYXNzIER1cGxpY2F0ZUFwcGxpY2F0aW9uQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgQFZpZXdDaGlsZChDOHlTdGVwcGVyLCB7IHN0YXRpYzogdHJ1ZSB9KVxuICBzdGVwcGVyOiBDOHlTdGVwcGVyO1xuICBkdXBsaWNhdGVkQXBwOiBJQXBwbGljYXRpb247XG4gIHNlbGVjdGVkQXBwOiBCZWhhdmlvclN1YmplY3Q8SUFwcGxpY2F0aW9uPiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8SUFwcGxpY2F0aW9uPihudWxsKTtcbiAgZXhpc3RpbmdBcHBzOiBJQXBwbGljYXRpb25bXSA9IFtdO1xuICBkaXJlY3RseU1vdmVUb1NlY29uZFN0ZXAgPSBmYWxzZTtcbiAgbm9CYWNrQnV0dG9uID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBlY29zeXN0ZW1TZXJ2aWNlOiBFY29zeXN0ZW1TZXJ2aWNlLFxuICAgIHByaXZhdGUgYXBwbGljYXRpb25TZXJ2aWNlOiBBcHBsaWNhdGlvblNlcnZpY2UsXG4gICAgcHJpdmF0ZSB3aXphcmRDb21wb25lbnQ6IFdpemFyZENvbXBvbmVudFxuICApIHt9XG5cbiAgYXN5bmMgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5leGlzdGluZ0FwcHMgPSBhd2FpdCB0aGlzLmVjb3N5c3RlbVNlcnZpY2UuZ2V0V2ViQXBwbGljYXRpb25zKCk7XG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRBcHAudmFsdWUpIHtcbiAgICAgIHRoaXMuZGlyZWN0bHlNb3ZlVG9TZWNvbmRTdGVwID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICBvblNlbGVjdGVkQXBwKGFwcDogSUFwcGxpY2F0aW9uKSB7XG4gICAgdGhpcy5zZWxlY3RlZEFwcC5uZXh0KGFwcCk7XG4gIH1cblxuICBnZXRIcmVmKGFwcDogSUFwcGxpY2F0aW9uKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5hcHBsaWNhdGlvblNlcnZpY2UuZ2V0SHJlZihhcHApO1xuICB9XG5cbiAgZG9uZSgpIHtcbiAgICB0aGlzLndpemFyZENvbXBvbmVudC5jbG9zZSgpO1xuICB9XG59XG4iLCI8Yzh5LXdpemFyZC1oZWFkZXI+XG4gIDxpIFtjOHlJY29uXT1cIidjb3B5J1wiPjwvaT5cbiAgPGg0XG4gICAgaWQ9XCJtb2RhbC10aXRsZVwiXG4gICAgdHJhbnNsYXRlXG4gID5cbiAgICBEdXBsaWNhdGUgYXBwbGljYXRpb25cbiAgPC9oND5cbjwvYzh5LXdpemFyZC1oZWFkZXI+XG5cbjxjOHktd2l6YXJkLWJvZHkgaWQ9XCJtb2RhbC1ib2R5XCI+XG4gIDxjOHktc3RlcHBlclxuICAgIFtkaXNhYmxlRGVmYXVsdEljb25zXT1cInsgZWRpdDogdHJ1ZSwgZG9uZTogZmFsc2UgfVwiXG4gICAgW2N1c3RvbUNsYXNzZXNdPVwiWydoaWRkZW4nXVwiXG4gICAgbGluZWFyXG4gID5cbiAgICA8IS0tIDFzdCBzdGVwIC0tPlxuICAgIDxjZGstc3RlcCAqbmdJZj1cIiFkaXJlY3RseU1vdmVUb1NlY29uZFN0ZXBcIj5cbiAgICAgIDxwIGNsYXNzPVwicC0xNiB0ZXh0LWNlbnRlciB0ZXh0LW1lZGl1bSBzZXBhcmF0b3ItYm90dG9tIHN0aWNreS10b3AgYmctbGV2ZWwtMFwiPlxuICAgICAgICB7eyAnU2VsZWN0IGFwcGxpY2F0aW9uIHRvIGR1cGxpY2F0ZScgfCB0cmFuc2xhdGUgfX1cbiAgICAgIDwvcD5cbiAgICAgIDxjOHktZHVwbGljYXRlLWFwcGxpY2F0aW9uLWxpc3RcbiAgICAgICAgY2xhc3M9XCJkLWJsb2NrXCJcbiAgICAgICAgc3R5bGU9XCJtaW4taGVpZ2h0OiAyNTdweFwiXG4gICAgICAgIChvblNlbGVjdGVkQXBwKT1cIm9uU2VsZWN0ZWRBcHAoJGV2ZW50KVwiXG4gICAgICAgICpuZ0lmPVwic3RlcHBlci5zZWxlY3RlZEluZGV4ID09PSAwXCJcbiAgICAgICAgW2V4aXN0aW5nQXBwc109XCJleGlzdGluZ0FwcHNcIlxuICAgICAgICBbc3RlcHBlcl09XCJzdGVwcGVyXCJcbiAgICAgID48L2M4eS1kdXBsaWNhdGUtYXBwbGljYXRpb24tbGlzdD5cbiAgICA8L2Nkay1zdGVwPlxuICAgIDwhLS0gMm5kIHN0ZXAgLS0+XG4gICAgPGNkay1zdGVwPlxuICAgICAgPGM4eS1kdXBsaWNhdGUtYXBwbGljYXRpb24tcHJvcGVydGllc1xuICAgICAgICBjbGFzcz1cImQtZmxleCBkLWNvbCBqLWMtY2VudGVyIGEtaS1jZW50ZXJcIlxuICAgICAgICBzdHlsZT1cIm1pbi1oZWlnaHQ6IDI1N3B4XCJcbiAgICAgICAgKGR1cGxpY2F0ZWRBcHApPVwiZHVwbGljYXRlZEFwcCA9ICRldmVudFwiXG4gICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgc3RlcHBlci5zZWxlY3RlZEluZGV4ID09PSAxIHx8IChzdGVwcGVyLnNlbGVjdGVkSW5kZXggPT09IDAgJiYgZGlyZWN0bHlNb3ZlVG9TZWNvbmRTdGVwKVxuICAgICAgICBcIlxuICAgICAgICBbZXhpc3RpbmdBcHBzXT1cImV4aXN0aW5nQXBwc1wiXG4gICAgICAgIFtzZWxlY3RlZEFwcF09XCJzZWxlY3RlZEFwcFwiXG4gICAgICAgIFtzdGVwcGVyXT1cInN0ZXBwZXJcIlxuICAgICAgICBbaXNGaXJzdFN0ZXBdPVwiZGlyZWN0bHlNb3ZlVG9TZWNvbmRTdGVwXCJcbiAgICAgID48L2M4eS1kdXBsaWNhdGUtYXBwbGljYXRpb24tcHJvcGVydGllcz5cbiAgICA8L2Nkay1zdGVwPlxuICAgIDwhLS0gRmluYWwgc3RlcCAtLT5cbiAgICA8Y2RrLXN0ZXA+XG4gICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgc3RlcHBlci5zZWxlY3RlZEluZGV4ID09PSAyIHx8IChzdGVwcGVyLnNlbGVjdGVkSW5kZXggPT09IDEgJiYgZGlyZWN0bHlNb3ZlVG9TZWNvbmRTdGVwKVxuICAgICAgICBcIlxuICAgICAgPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgY2xhc3M9XCJkLWZsZXggYS1pLWNlbnRlciBqLWMtY2VudGVyXCJcbiAgICAgICAgICBzdHlsZT1cIm1pbi1oZWlnaHQ6IDI1N3B4XCJcbiAgICAgICAgICAqbmdJZj1cImR1cGxpY2F0ZWRBcHA7IGVsc2UgZHVwbGljYXRlQXBwRmFpbGVkXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxjOHktb3BlcmF0aW9uLXJlc3VsdFxuICAgICAgICAgICAgdHlwZT1cInN1Y2Nlc3NcIlxuICAgICAgICAgICAgdGV4dD1cInt7ICdBcHBsaWNhdGlvbiBjcmVhdGVkJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICBbc2l6ZV09XCI4NFwiXG4gICAgICAgICAgICBbdmVydGljYWxdPVwidHJ1ZVwiXG4gICAgICAgICAgPjwvYzh5LW9wZXJhdGlvbi1yZXN1bHQ+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8bmctdGVtcGxhdGUgI2R1cGxpY2F0ZUFwcEZhaWxlZD5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICBjbGFzcz1cImQtZmxleCBhLWktY2VudGVyIGotYy1jZW50ZXJcIlxuICAgICAgICAgICAgc3R5bGU9XCJtaW4taGVpZ2h0OiAyNTdweFwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGM4eS1vcGVyYXRpb24tcmVzdWx0XG4gICAgICAgICAgICAgIHR5cGU9XCJlcnJvclwiXG4gICAgICAgICAgICAgIHRleHQ9XCJ7eyAnQXBwbGljYXRpb24gY3JlYXRpb24gZmFpbGVkJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICAgIFtzaXplXT1cIjg0XCJcbiAgICAgICAgICAgICAgW3ZlcnRpY2FsXT1cInRydWVcIlxuICAgICAgICAgICAgPjwvYzh5LW9wZXJhdGlvbi1yZXN1bHQ+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L2Nkay1zdGVwPlxuICA8L2M4eS1zdGVwcGVyPlxuPC9jOHktd2l6YXJkLWJvZHk+XG5cbjxjOHktd2l6YXJkLWZvb3RlciAqbmdJZj1cInN0ZXBwZXIuc2VsZWN0ZWRJbmRleCA9PT0gMCAmJiBub0JhY2tCdXR0b25cIj5cbiAgPGJ1dHRvblxuICAgIGNsYXNzPVwiYnRuIGJ0bi1kZWZhdWx0XCJcbiAgICB0aXRsZT1cInt7ICdDYW5jZWwnIHwgdHJhbnNsYXRlIH19XCJcbiAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAoY2xpY2spPVwiZG9uZSgpXCJcbiAgPlxuICAgIHt7ICdDYW5jZWwnIHwgdHJhbnNsYXRlIH19XG4gIDwvYnV0dG9uPlxuPC9jOHktd2l6YXJkLWZvb3Rlcj5cblxuPGM4eS13aXphcmQtZm9vdGVyXG4gICpuZ0lmPVwic3RlcHBlci5zZWxlY3RlZEluZGV4ID09PSAyIHx8IChzdGVwcGVyLnNlbGVjdGVkSW5kZXggPT09IDEgJiYgZGlyZWN0bHlNb3ZlVG9TZWNvbmRTdGVwKVwiXG4+XG4gIDxidXR0b25cbiAgICBjbGFzcz1cImJ0biBidG4tZGVmYXVsdFwiXG4gICAgdGl0bGU9XCJ7eyAnRG9uZScgfCB0cmFuc2xhdGUgfX1cIlxuICAgIHR5cGU9XCJidXR0b25cIlxuICAgIChjbGljayk9XCJkb25lKClcIlxuICA+XG4gICAge3sgJ0RvbmUnIHwgdHJhbnNsYXRlIH19XG4gIDwvYnV0dG9uPlxuICA8YVxuICAgIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5XCJcbiAgICB0aXRsZT1cInt7ICdPcGVuJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgdGFyZ2V0PVwiX2JsYW5rXCJcbiAgICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcbiAgICBbaHJlZl09XCJnZXRIcmVmKGR1cGxpY2F0ZWRBcHApXCJcbiAgICByZWw9XCJub29wZW5lciBub3JlZmVycmVyXCJcbiAgPlxuICAgIDxpXG4gICAgICBjbGFzcz1cIm0tci00XCJcbiAgICAgIGM4eUljb249XCJleHRlcm5hbC1saW5rXCJcbiAgICA+PC9pPlxuICAgIHt7ICdPcGVuJyB8IHRyYW5zbGF0ZSB9fVxuICA8L2E+XG48L2M4eS13aXphcmQtZm9vdGVyPlxuIl19