UNPKG

survey-creator-angular

Version:

A white-label drag-and-drop form builder for Angular that lets you design complex, interactive forms and surveys without writing code. It generates JSON schemas used by the SurveyJS Form Library to render dynamic forms in your Angular app.

67 lines 18.2 kB
import { Component, ElementRef, Input, ViewChild } from "@angular/core"; import { AngularComponentFactory } from "survey-angular-ui"; import { ImageItemValueWrapperViewModel } from "survey-creator-core"; import { CreatorModelComponent } from "../creator-model.component"; import * as i0 from "@angular/core"; import * as i1 from "survey-angular-ui"; import * as i2 from "@angular/common"; export class ImageItemValueDesignerComponent extends CreatorModelComponent { get creator() { return this.componentData.data.creator; } get question() { return this.componentData.question; } get item() { return this.componentData.model; } createModel() { if (this.componentData) { this.adorner = new ImageItemValueWrapperViewModel(this.creator, this.question, this.item, null, null); } } getPropertiesToTrack() { return ["creator", "question", "item"]; } getModel() { return this.adorner; } get showDragDropGhostOnTop() { return this.adorner.ghostPosition === "top"; } get showDragDropGhostOnBottom() { return this.adorner.ghostPosition === "bottom"; } blockEvent(event) { event.stopPropagation(); } getNewItemStyle() { const needStyle = !this.adorner.getIsNewItemSingle(); return { width: needStyle ? this.question.renderedImageWidth + "px" : undefined, height: needStyle ? this.question.renderedImageHeight + "px" : undefined }; } ngAfterViewInit() { this.adorner.itemsRoot = this.container.nativeElement; } preventDragHandler(e) { e.preventDefault(); } } ImageItemValueDesignerComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: ImageItemValueDesignerComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); ImageItemValueDesignerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.17", type: ImageItemValueDesignerComponent, selector: "svc-image-item-value", inputs: { componentName: "componentName", componentData: "componentData" }, viewQueries: [{ propertyName: "container", first: true, predicate: ["container"], descendants: true, read: ElementRef }], usesInheritance: true, ngImport: i0, template: "<ng-template #template>\n <div (pointerdown)=\"adorner.onPointerDown($event)\" [class]=\"adorner.getRootCss()\"\n [attr.data-sv-drop-target-item-value]=\"adorner.isDraggable ? this.item.value : null\" #container\n (dragstart)=\"preventDragHandler($event)\" (dragenter)=\"adorner.onDragEnter($event)\"\n (dragover)=\"adorner.onDragOver($event)\" (dragleave)=\"adorner.onDragLeave($event)\" (drop)=\"adorner.onDrop($event)\">\n <div class=\"svc-image-item-value-wrapper__ghost\" [style]=\"getNewItemStyle()\"></div>\n\n <div class=\"svc-image-item-value-wrapper__content\">\n <input type=\"file\" aria-hidden=\"true\" tabindex=\"-1\" [accept]=\"adorner.acceptedTypes\"\n class=\"svc-choose-file-input\" />\n\n <ng-container *ngIf=\"!adorner.isNew && !adorner.isUploading\">\n <div *ngIf=\"!adorner.isNew\" class=\"svc-image-item-value__item\">\n <ng-template [component]=\"{ name: componentName, data: componentData }\"></ng-template>\n </div>\n <span *ngIf=\"adorner.isDraggable && adorner.canRenderControls\"\n class=\"svc-context-button svc-image-item-value-controls__drag-area-indicator\"\n (pointerdown)=\"adorner.onPointerDown($event)\" [attr.title]=\"undefined\" [attr.aria-label]=\"undefined\">\n <svg [iconName]=\"'icon-drag-24x24'\" [size]=\"'auto'\" sv-ng-svg-icon></svg>\n </span>\n <div *ngIf=\"adorner.canRenderControls\" class=\"svc-context-container svc-image-item-value-controls\">\n <ng-container *ngIf=\"adorner.allowRemove && !adorner.isUploading\">\n <span class=\"svc-context-button\" (click)=\"adorner.chooseFile(adorner)\" [key2click] [attr.title]=\"undefined\"\n [attr.aria-label]=\"undefined\">\n <svg role=\"button\" [iconName]=\"'icon-choosefile'\" [size]=\"'auto'\" [title]=\"adorner.selectFileTitle\"\n sv-ng-svg-icon></svg>\n </span>\n <span class=\"svc-context-button svc-context-button--danger\" (click)=\"adorner.remove(adorner)\" [key2click]\n [attr.title]=\"undefined\" [attr.aria-label]=\"undefined\">\n <svg role=\"button\" [iconName]=\"'icon-delete'\" [size]=\"'auto'\" [title]=\"adorner.removeFileTitle\"\n sv-ng-svg-icon></svg>\n </span>\n </ng-container>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"adorner.isNew || adorner.isUploading\">\n <div class=\"svc-image-item-value__item\">\n <div class=\"sd-imagepicker__item sd-imagepicker__item--inline\">\n <label class=\"sd-imagepicker__label\">\n <div [style]=\"getNewItemStyle()\" class=\"sd-imagepicker__image\">\n <div class=\"svc-image-item-value__loading\" *ngIf=\"adorner.isUploading\">\n <sv-ng-loading-indicator></sv-ng-loading-indicator>\n </div>\n </div>\n </label>\n </div>\n </div>\n <div class=\"svc-image-item-value-controls\" *ngIf=\"adorner.allowAdd && !adorner.isUploading\">\n <span class=\"svc-image-item-value__placeholder\"\n *ngIf=\"adorner.showPlaceholder\">{{adorner.placeholderText}}</span>\n <span [class]=\"adorner.addButtonCss\" (click)=\"adorner.chooseNewFile(adorner)\" [key2click]=\"{}\">\n <svg [iconName]=\"'icon-add-lg'\" [size]=\"'auto'\" [title]=\"adorner.addFileTitle\"\n *ngIf=\"adorner.showChooseButtonAsIcon\" sv-ng-svg-icon></svg>\n <span *ngIf=\"!adorner.showChooseButtonAsIcon\">{{adorner.chooseImageText}}</span>\n </span>\n </div>\n </ng-container>\n </div>\n </div>\n</ng-template>", styles: [":host { display: none; }"], components: [{ type: i1.SvgIconComponent, selector: "'[sv-ng-svg-icon]'", inputs: ["size", "width", "height", "iconName", "partCss", "css", "title"] }, { type: i1.LoadingIndicatorComponent, selector: "sv-ng-loading-indicator" }], directives: [{ type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i1.DynamicComponentDirective, selector: "[component]", inputs: ["component"] }, { type: i1.Key2ClickDirective, selector: "[key2click]", inputs: ["key2click"] }] }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: ImageItemValueDesignerComponent, decorators: [{ type: Component, args: [{ selector: "svc-image-item-value", templateUrl: "./image-item-value.component.html", styles: [":host { display: none; }"] }] }], propDecorators: { componentName: [{ type: Input }], componentData: [{ type: Input }], container: [{ type: ViewChild, args: ["container", { read: ElementRef }] }] } }); AngularComponentFactory.Instance.registerComponent("svc-image-item-value", ImageItemValueDesignerComponent); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1hZ2UtaXRlbS12YWx1ZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYWRvcm5lcnMvaW1hZ2UtaXRlbS12YWx1ZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi9zcmMvYWRvcm5lcnMvaW1hZ2UtaXRlbS12YWx1ZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3hFLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRTVELE9BQU8sRUFBc0IsOEJBQThCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN6RixPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQzs7OztBQU9uRSxNQUFNLE9BQU8sK0JBQWdDLFNBQVEscUJBQXFEO0lBS3hHLElBQVksT0FBTztRQUNqQixPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQztJQUN6QyxDQUFDO0lBQ0QsSUFBVyxRQUFRO1FBQ2pCLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUM7SUFDckMsQ0FBQztJQUNELElBQVcsSUFBSTtRQUNiLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUM7SUFDbEMsQ0FBQztJQUNTLFdBQVc7UUFDbkIsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFO1lBQ3RCLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSw4QkFBOEIsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBTyxJQUFJLEVBQU8sSUFBSSxDQUFDLENBQUM7U0FDakg7SUFDSCxDQUFDO0lBQ1Msb0JBQW9CO1FBQzVCLE9BQU8sQ0FBQyxTQUFTLEVBQUUsVUFBVSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ3pDLENBQUM7SUFDUyxRQUFRO1FBQ2hCLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQztJQUN0QixDQUFDO0lBRUQsSUFBSSxzQkFBc0I7UUFDeEIsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsS0FBSyxLQUFLLENBQUM7SUFDOUMsQ0FBQztJQUNELElBQUkseUJBQXlCO1FBQzNCLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLEtBQUssUUFBUSxDQUFDO0lBQ2pELENBQUM7SUFDTSxVQUFVLENBQUMsS0FBaUI7UUFDakMsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQzFCLENBQUM7SUFFRCxlQUFlO1FBQ2IsTUFBTSxTQUFTLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFDckQsT0FBTyxFQUFFLEtBQUssRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsTUFBTSxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQzlKLENBQUM7SUFDTSxlQUFlO1FBQ3BCLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDO0lBQ3hELENBQUM7SUFDRCxrQkFBa0IsQ0FBQyxDQUFRO1FBQ3pCLENBQUMsQ0FBQyxjQUFjLEVBQUUsQ0FBQztJQUNyQixDQUFDOzs2SEE3Q1UsK0JBQStCO2lIQUEvQiwrQkFBK0IsMk5BR1YsVUFBVSxvRENmNUMsbW9IQTREYzs0RkRoREQsK0JBQStCO2tCQUwzQyxTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSxzQkFBc0I7b0JBQ2hDLFdBQVcsRUFBRSxtQ0FBbUM7b0JBQ2hELE1BQU0sRUFBRSxDQUFDLDBCQUEwQixDQUFDO2lCQUNyQzs4QkFFVSxhQUFhO3NCQUFyQixLQUFLO2dCQUNHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBQ3dDLFNBQVM7c0JBQXRELFNBQVM7dUJBQUMsV0FBVyxFQUFFLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRTs7QUE2QzlDLHVCQUF1QixDQUFDLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxzQkFBc0IsRUFBRSwrQkFBK0IsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiXG5pbXBvcnQgeyBDb21wb25lbnQsIEVsZW1lbnRSZWYsIElucHV0LCBWaWV3Q2hpbGQgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHsgQW5ndWxhckNvbXBvbmVudEZhY3RvcnkgfSBmcm9tIFwic3VydmV5LWFuZ3VsYXItdWlcIjtcbmltcG9ydCB7IEltYWdlSXRlbVZhbHVlLCBRdWVzdGlvbkltYWdlUGlja2VyTW9kZWwgfSBmcm9tIFwic3VydmV5LWNvcmVcIjtcbmltcG9ydCB7IFN1cnZleUNyZWF0b3JNb2RlbCwgSW1hZ2VJdGVtVmFsdWVXcmFwcGVyVmlld01vZGVsIH0gZnJvbSBcInN1cnZleS1jcmVhdG9yLWNvcmVcIjtcbmltcG9ydCB7IENyZWF0b3JNb2RlbENvbXBvbmVudCB9IGZyb20gXCIuLi9jcmVhdG9yLW1vZGVsLmNvbXBvbmVudFwiO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6IFwic3ZjLWltYWdlLWl0ZW0tdmFsdWVcIixcbiAgdGVtcGxhdGVVcmw6IFwiLi9pbWFnZS1pdGVtLXZhbHVlLmNvbXBvbmVudC5odG1sXCIsXG4gIHN0eWxlczogW1wiOmhvc3QgeyBkaXNwbGF5OiBub25lOyB9XCJdXG59KVxuZXhwb3J0IGNsYXNzIEltYWdlSXRlbVZhbHVlRGVzaWduZXJDb21wb25lbnQgZXh0ZW5kcyBDcmVhdG9yTW9kZWxDb21wb25lbnQ8SW1hZ2VJdGVtVmFsdWVXcmFwcGVyVmlld01vZGVsPiB7XG4gIEBJbnB1dCgpIGNvbXBvbmVudE5hbWUhOiBzdHJpbmc7XG4gIEBJbnB1dCgpIGNvbXBvbmVudERhdGEhOiBhbnk7XG4gIEBWaWV3Q2hpbGQoXCJjb250YWluZXJcIiwgeyByZWFkOiBFbGVtZW50UmVmIH0pIGNvbnRhaW5lciE6IEVsZW1lbnRSZWY7XG4gIHB1YmxpYyBhZG9ybmVyITogSW1hZ2VJdGVtVmFsdWVXcmFwcGVyVmlld01vZGVsO1xuICBwcml2YXRlIGdldCBjcmVhdG9yKCk6IFN1cnZleUNyZWF0b3JNb2RlbCB7XG4gICAgcmV0dXJuIHRoaXMuY29tcG9uZW50RGF0YS5kYXRhLmNyZWF0b3I7XG4gIH1cbiAgcHVibGljIGdldCBxdWVzdGlvbigpOiBRdWVzdGlvbkltYWdlUGlja2VyTW9kZWwge1xuICAgIHJldHVybiB0aGlzLmNvbXBvbmVudERhdGEucXVlc3Rpb247XG4gIH1cbiAgcHVibGljIGdldCBpdGVtKCk6IEltYWdlSXRlbVZhbHVlIHtcbiAgICByZXR1cm4gdGhpcy5jb21wb25lbnREYXRhLm1vZGVsO1xuICB9XG4gIHByb3RlY3RlZCBjcmVhdGVNb2RlbCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5jb21wb25lbnREYXRhKSB7XG4gICAgICB0aGlzLmFkb3JuZXIgPSBuZXcgSW1hZ2VJdGVtVmFsdWVXcmFwcGVyVmlld01vZGVsKHRoaXMuY3JlYXRvciwgdGhpcy5xdWVzdGlvbiwgdGhpcy5pdGVtLCA8YW55Pm51bGwsIDxhbnk+bnVsbCk7XG4gICAgfVxuICB9XG4gIHByb3RlY3RlZCBnZXRQcm9wZXJ0aWVzVG9UcmFjaygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIFtcImNyZWF0b3JcIiwgXCJxdWVzdGlvblwiLCBcIml0ZW1cIl07XG4gIH1cbiAgcHJvdGVjdGVkIGdldE1vZGVsKCk6IEltYWdlSXRlbVZhbHVlV3JhcHBlclZpZXdNb2RlbCB7XG4gICAgcmV0dXJuIHRoaXMuYWRvcm5lcjtcbiAgfVxuXG4gIGdldCBzaG93RHJhZ0Ryb3BHaG9zdE9uVG9wKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmFkb3JuZXIuZ2hvc3RQb3NpdGlvbiA9PT0gXCJ0b3BcIjtcbiAgfVxuICBnZXQgc2hvd0RyYWdEcm9wR2hvc3RPbkJvdHRvbSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5hZG9ybmVyLmdob3N0UG9zaXRpb24gPT09IFwiYm90dG9tXCI7XG4gIH1cbiAgcHVibGljIGJsb2NrRXZlbnQoZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgfVxuXG4gIGdldE5ld0l0ZW1TdHlsZSgpOiBhbnkge1xuICAgIGNvbnN0IG5lZWRTdHlsZSA9ICF0aGlzLmFkb3JuZXIuZ2V0SXNOZXdJdGVtU2luZ2xlKCk7XG4gICAgcmV0dXJuIHsgd2lkdGg6IG5lZWRTdHlsZSA/IHRoaXMucXVlc3Rpb24ucmVuZGVyZWRJbWFnZVdpZHRoICsgXCJweFwiIDogdW5kZWZpbmVkLCBoZWlnaHQ6IG5lZWRTdHlsZSA/IHRoaXMucXVlc3Rpb24ucmVuZGVyZWRJbWFnZUhlaWdodCArIFwicHhcIiA6IHVuZGVmaW5lZCB9O1xuICB9XG4gIHB1YmxpYyBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgdGhpcy5hZG9ybmVyLml0ZW1zUm9vdCA9IHRoaXMuY29udGFpbmVyLm5hdGl2ZUVsZW1lbnQ7XG4gIH1cbiAgcHJldmVudERyYWdIYW5kbGVyKGU6IEV2ZW50KSB7XG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICB9XG59XG5cbkFuZ3VsYXJDb21wb25lbnRGYWN0b3J5Lkluc3RhbmNlLnJlZ2lzdGVyQ29tcG9uZW50KFwic3ZjLWltYWdlLWl0ZW0tdmFsdWVcIiwgSW1hZ2VJdGVtVmFsdWVEZXNpZ25lckNvbXBvbmVudCk7XG4iLCI8bmctdGVtcGxhdGUgI3RlbXBsYXRlPlxuICA8ZGl2IChwb2ludGVyZG93bik9XCJhZG9ybmVyLm9uUG9pbnRlckRvd24oJGV2ZW50KVwiIFtjbGFzc109XCJhZG9ybmVyLmdldFJvb3RDc3MoKVwiXG4gICAgW2F0dHIuZGF0YS1zdi1kcm9wLXRhcmdldC1pdGVtLXZhbHVlXT1cImFkb3JuZXIuaXNEcmFnZ2FibGUgPyB0aGlzLml0ZW0udmFsdWUgOiBudWxsXCIgI2NvbnRhaW5lclxuICAgIChkcmFnc3RhcnQpPVwicHJldmVudERyYWdIYW5kbGVyKCRldmVudClcIiAoZHJhZ2VudGVyKT1cImFkb3JuZXIub25EcmFnRW50ZXIoJGV2ZW50KVwiXG4gICAgKGRyYWdvdmVyKT1cImFkb3JuZXIub25EcmFnT3ZlcigkZXZlbnQpXCIgKGRyYWdsZWF2ZSk9XCJhZG9ybmVyLm9uRHJhZ0xlYXZlKCRldmVudClcIiAoZHJvcCk9XCJhZG9ybmVyLm9uRHJvcCgkZXZlbnQpXCI+XG4gICAgPGRpdiBjbGFzcz1cInN2Yy1pbWFnZS1pdGVtLXZhbHVlLXdyYXBwZXJfX2dob3N0XCIgW3N0eWxlXT1cImdldE5ld0l0ZW1TdHlsZSgpXCI+PC9kaXY+XG5cbiAgICA8ZGl2IGNsYXNzPVwic3ZjLWltYWdlLWl0ZW0tdmFsdWUtd3JhcHBlcl9fY29udGVudFwiPlxuICAgICAgPGlucHV0IHR5cGU9XCJmaWxlXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCIgdGFiaW5kZXg9XCItMVwiIFthY2NlcHRdPVwiYWRvcm5lci5hY2NlcHRlZFR5cGVzXCJcbiAgICAgICAgY2xhc3M9XCJzdmMtY2hvb3NlLWZpbGUtaW5wdXRcIiAvPlxuXG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWFkb3JuZXIuaXNOZXcgJiYgIWFkb3JuZXIuaXNVcGxvYWRpbmdcIj5cbiAgICAgICAgPGRpdiAqbmdJZj1cIiFhZG9ybmVyLmlzTmV3XCIgY2xhc3M9XCJzdmMtaW1hZ2UtaXRlbS12YWx1ZV9faXRlbVwiPlxuICAgICAgICAgIDxuZy10ZW1wbGF0ZSBbY29tcG9uZW50XT1cInsgbmFtZTogY29tcG9uZW50TmFtZSwgZGF0YTogY29tcG9uZW50RGF0YSB9XCI+PC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxzcGFuICpuZ0lmPVwiYWRvcm5lci5pc0RyYWdnYWJsZSAmJiBhZG9ybmVyLmNhblJlbmRlckNvbnRyb2xzXCJcbiAgICAgICAgICBjbGFzcz1cInN2Yy1jb250ZXh0LWJ1dHRvbiBzdmMtaW1hZ2UtaXRlbS12YWx1ZS1jb250cm9sc19fZHJhZy1hcmVhLWluZGljYXRvclwiXG4gICAgICAgICAgKHBvaW50ZXJkb3duKT1cImFkb3JuZXIub25Qb2ludGVyRG93bigkZXZlbnQpXCIgW2F0dHIudGl0bGVdPVwidW5kZWZpbmVkXCIgW2F0dHIuYXJpYS1sYWJlbF09XCJ1bmRlZmluZWRcIj5cbiAgICAgICAgICA8c3ZnIFtpY29uTmFtZV09XCInaWNvbi1kcmFnLTI0eDI0J1wiIFtzaXplXT1cIidhdXRvJ1wiIHN2LW5nLXN2Zy1pY29uPjwvc3ZnPlxuICAgICAgICA8L3NwYW4+XG4gICAgICAgIDxkaXYgKm5nSWY9XCJhZG9ybmVyLmNhblJlbmRlckNvbnRyb2xzXCIgY2xhc3M9XCJzdmMtY29udGV4dC1jb250YWluZXIgc3ZjLWltYWdlLWl0ZW0tdmFsdWUtY29udHJvbHNcIj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiYWRvcm5lci5hbGxvd1JlbW92ZSAmJiAhYWRvcm5lci5pc1VwbG9hZGluZ1wiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzdmMtY29udGV4dC1idXR0b25cIiAoY2xpY2spPVwiYWRvcm5lci5jaG9vc2VGaWxlKGFkb3JuZXIpXCIgW2tleTJjbGlja10gW2F0dHIudGl0bGVdPVwidW5kZWZpbmVkXCJcbiAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJ1bmRlZmluZWRcIj5cbiAgICAgICAgICAgICAgPHN2ZyByb2xlPVwiYnV0dG9uXCIgW2ljb25OYW1lXT1cIidpY29uLWNob29zZWZpbGUnXCIgW3NpemVdPVwiJ2F1dG8nXCIgW3RpdGxlXT1cImFkb3JuZXIuc2VsZWN0RmlsZVRpdGxlXCJcbiAgICAgICAgICAgICAgICBzdi1uZy1zdmctaWNvbj48L3N2Zz5cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3ZjLWNvbnRleHQtYnV0dG9uIHN2Yy1jb250ZXh0LWJ1dHRvbi0tZGFuZ2VyXCIgKGNsaWNrKT1cImFkb3JuZXIucmVtb3ZlKGFkb3JuZXIpXCIgW2tleTJjbGlja11cbiAgICAgICAgICAgICAgW2F0dHIudGl0bGVdPVwidW5kZWZpbmVkXCIgW2F0dHIuYXJpYS1sYWJlbF09XCJ1bmRlZmluZWRcIj5cbiAgICAgICAgICAgICAgPHN2ZyByb2xlPVwiYnV0dG9uXCIgW2ljb25OYW1lXT1cIidpY29uLWRlbGV0ZSdcIiBbc2l6ZV09XCInYXV0bydcIiBbdGl0bGVdPVwiYWRvcm5lci5yZW1vdmVGaWxlVGl0bGVcIlxuICAgICAgICAgICAgICAgIHN2LW5nLXN2Zy1pY29uPjwvc3ZnPlxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiYWRvcm5lci5pc05ldyB8fCBhZG9ybmVyLmlzVXBsb2FkaW5nXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzdmMtaW1hZ2UtaXRlbS12YWx1ZV9faXRlbVwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZC1pbWFnZXBpY2tlcl9faXRlbSBzZC1pbWFnZXBpY2tlcl9faXRlbS0taW5saW5lXCI+XG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJzZC1pbWFnZXBpY2tlcl9fbGFiZWxcIj5cbiAgICAgICAgICAgICAgPGRpdiBbc3R5bGVdPVwiZ2V0TmV3SXRlbVN0eWxlKClcIiBjbGFzcz1cInNkLWltYWdlcGlja2VyX19pbWFnZVwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdmMtaW1hZ2UtaXRlbS12YWx1ZV9fbG9hZGluZ1wiICpuZ0lmPVwiYWRvcm5lci5pc1VwbG9hZGluZ1wiPlxuICAgICAgICAgICAgICAgICAgPHN2LW5nLWxvYWRpbmctaW5kaWNhdG9yPjwvc3YtbmctbG9hZGluZy1pbmRpY2F0b3I+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzdmMtaW1hZ2UtaXRlbS12YWx1ZS1jb250cm9sc1wiICpuZ0lmPVwiYWRvcm5lci5hbGxvd0FkZCAmJiAhYWRvcm5lci5pc1VwbG9hZGluZ1wiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3ZjLWltYWdlLWl0ZW0tdmFsdWVfX3BsYWNlaG9sZGVyXCJcbiAgICAgICAgICAgICpuZ0lmPVwiYWRvcm5lci5zaG93UGxhY2Vob2xkZXJcIj57e2Fkb3JuZXIucGxhY2Vob2xkZXJUZXh0fX08L3NwYW4+XG4gICAgICAgICAgPHNwYW4gW2NsYXNzXT1cImFkb3JuZXIuYWRkQnV0dG9uQ3NzXCIgKGNsaWNrKT1cImFkb3JuZXIuY2hvb3NlTmV3RmlsZShhZG9ybmVyKVwiIFtrZXkyY2xpY2tdPVwie31cIj5cbiAgICAgICAgICAgIDxzdmcgW2ljb25OYW1lXT1cIidpY29uLWFkZC1sZydcIiBbc2l6ZV09XCInYXV0bydcIiBbdGl0bGVdPVwiYWRvcm5lci5hZGRGaWxlVGl0bGVcIlxuICAgICAgICAgICAgICAqbmdJZj1cImFkb3JuZXIuc2hvd0Nob29zZUJ1dHRvbkFzSWNvblwiIHN2LW5nLXN2Zy1pY29uPjwvc3ZnPlxuICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIhYWRvcm5lci5zaG93Q2hvb3NlQnV0dG9uQXNJY29uXCI+e3thZG9ybmVyLmNob29zZUltYWdlVGV4dH19PC9zcGFuPlxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPiJdfQ==