UNPKG

@yoyoboot/l-52abp-ng-form-generator

Version:

This library was generated with [Angular CLI](https://github.com/angular/angular-cli) version 12.2.0.

146 lines 36.3 kB
import { Component, Inject } from '@angular/core'; import { DOCUMENT } from '@angular/common'; import { componentGroups } from '../config'; import * as i0 from "@angular/core"; import * as i1 from "ng-zorro-antd/layout"; import * as i2 from "ng-zorro-antd/button"; import * as i3 from "./common-component/d-widget-form-render/d-widget-form-render.component"; import * as i4 from "ng-zorro-antd/tabs"; import * as i5 from "./widget-config/widget-config.component"; import * as i6 from "./form-config/form-config.component"; import * as i7 from "ng-zorro-antd/drawer"; import * as i8 from "../form-render/r-widget-form/r-widget-form.component"; import * as i9 from "@angular/common"; import * as i10 from "../ngx-drag-drop/dnd-dropzone.directive"; import * as i11 from "../ngx-drag-drop/dnd-draggable.directive"; import * as i12 from "ng-zorro-antd/core/transition-patch"; import * as i13 from "ng-zorro-antd/input"; import * as i14 from "@angular/forms"; export class FormDesignerComponent { constructor(document) { this.document = document; this.logo = 'assets/logo.png'; /** 所有控件 */ this.componentGroups = []; /** 表单控件 */ this.rootComponent = { id: 'widget-form', type: 'form', widget: 'layout-form', labelPosition: 'left', labelSuffix: ':', gutter: 0, children: [], // 表单独有配置 formLayout: 'horizontal', formSize: 'default', formBtn: true, formBtnSubmit: true, formBtnSubmitText: '提交', formBtnReset: true, formBtnResetText: '重置', bordered: false }; /** 历史记录 */ this.history = { index: 0, maxStep: 20, steps: [] }; /** 工具条 */ this.toolbar = ['import', 'generate', 'preview', 'previewBorderd', 'clear']; } ngOnInit() { this.componentGroups = [...componentGroups]; } /** 运行 */ run() { } /** 显示json */ showJson() { } /** 导出vue文件 */ download() { } /** 复制代码 */ copy() { } /** 清空 */ empty() { } handleSelectWidget(widget, i) { this.selectComponent = widget; } /** 撤销 */ handleUndo() { } /** 重做 */ handleRedo() { } /** 导入JSON */ handleImportJson() { this.importJsonVisible = true; } /** 生成JSON */ handleGenerateJson() { this.previewJson = null; this.selectComponent = null; this.previewJsonVisible = true; this.previewJson = JSON.stringify(this.rootComponent, null, '\t'); } /** 预览 */ handlePreview() { this.previewJson = null; this.selectComponent = null; this.previewFormVisible = true; this.previewJson = JSON.stringify(this.rootComponent, null, '\t'); } /** 清空 */ handleClear() { this.selectComponent = null; this.rootComponent.children = []; } /** 关闭导入json面板 */ closeImportJson() { try { const component = JSON.parse(this.importJson); if (component) { this.rootComponent = component; } } catch (_a) { } this.importJsonVisible = false; } /** 获取当前json */ getJson() { return (this.previewJson = JSON.stringify(this.rootComponent, null, '\t')); } /** 使用接口返回值渲染form组件 */ importJsonByApi(val) { this.importJson = val; this.closeImportJson(); } /** 关闭预览表单json面板 */ closePreviewJson() { this.previewJsonVisible = false; this.previewJson = null; } /** 关闭预览表单面板 */ closePreviewForm() { this.previewForm = null; this.previewFormVisible = false; } sfSubmit(value) { console.log(value, 'sfSubmit'); } sfReset(value) { console.log(value, 'sfReset'); } } FormDesignerComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.13", ngImport: i0, type: FormDesignerComponent, deps: [{ token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Component }); FormDesignerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.13", type: FormDesignerComponent, selector: "app-form-designer", ngImport: i0, template: "<div class=\"form-designer\">\n <nz-layout>\n <!-- \u5DE6\u4FA7\u63A7\u4EF6 -->\n <nz-sider [nzWidth]=\"260\">\n <div class=\"fields-list\">\n <div\n *ngFor=\"let componentGroup of componentGroups; let listIndex = index\"\n id=\"components_{{ listIndex }}\"\n dndDropZone\n [dndAllowExternal]=\"true\"\n >\n <div class=\"field-title\">{{ componentGroup.label }}</div>\n\n <div\n *ngFor=\"let component of componentGroup.components; let index\"\n class=\"ghost field-label\"\n [dndDraggable]=\"component\"\n dndEffectAllowed=\"copy\"\n >\n <a>\n <i class=\"modules\" [ngClass]=\"component.icon\"></i>\n <span>{{ component.label }}</span>\n </a>\n </div>\n </div>\n </div>\n </nz-sider>\n\n <!-- \u4E2D\u95F4\u5185\u5BB9 -->\n <nz-layout class=\"widget-container\">\n <!-- \u9876\u90E8\u5DE5\u5177\u6761 -->\n <nz-header class=\"widget-container-header\">\n <div *ngIf=\"undoRedo\">\n <a nz-button nzType=\"link\" [disabled]=\"history.index === 0\" (click)=\"handleUndo()\">\u64A4\u9500</a>\n <a nz-button nzType=\"link\" [disabled]=\"history.index === history.steps.length - 1\" (click)=\"handleUndo()\">\u91CD\u505A</a>\n </div>\n <div style=\"display: flex; align-items: center\">\n <a *ngIf=\"toolbar.includes('import')\" nz-button nzType=\"link\" (click)=\"handleImportJson()\">\u5BFC\u5165JSON</a>\n <a *ngIf=\"toolbar.includes('generate')\" nz-button nzType=\"link\" (click)=\"handleGenerateJson()\">\u751F\u6210JOSN</a>\n <a *ngIf=\"toolbar.includes('preview')\" nz-button nzType=\"link\" (click)=\"handlePreview()\">\u9884\u89C8</a>\n <a *ngIf=\"toolbar.includes('clear')\" nz-button nzType=\"link\" (click)=\"handleClear()\">\u6E05\u7A7A</a>\n </div>\n </nz-header>\n <!-- \u4E2D\u95F4\u753B\u677F -->\n <nz-content>\n <!-- \u6E32\u67D3 -->\n <div d-widget-form-render [component]=\"rootComponent\" [(selectComponent)]=\"selectComponent\" class=\"widget-form-container\"> </div>\n </nz-content>\n </nz-layout>\n\n <!-- \u53F3\u4FA7\u914D\u7F6E -->\n <nz-sider class=\"right-sider\" [nzWidth]=\"320\">\n <nz-tabset>\n <nz-tab nzTitle=\"\u7EC4\u4EF6\u5C5E\u6027\" nzActive>\n <app-widget-config class=\"p-20\" [data]=\"selectComponent\" [defaultValues]=\"defaultValues\"></app-widget-config>\n </nz-tab>\n <nz-tab nzTitle=\"\u8868\u5355\u5C5E\u6027\"><app-form-config class=\"p-20\" [data]=\"rootComponent\"></app-form-config></nz-tab>\n </nz-tabset>\n </nz-sider>\n </nz-layout>\n\n <!-- \u5BFC\u5165json -->\n <nz-drawer\n [nzClosable]=\"true\"\n [nzVisible]=\"importJsonVisible\"\n [nzWidth]=\"'100%'\"\n [nzBodyStyle]=\"{ overflow: 'auto' }\"\n nzPlacement=\"right\"\n nzTitle=\"\u5BFC\u5165JSON\"\n (nzOnClose)=\"closeImportJson()\"\n >\n <ng-container *nzDrawerContent>\n <textarea *ngIf=\"importJsonVisible\" nz-input [(ngModel)]=\"importJson\" [nzAutosize]=\"{ minRows: 10, maxRows: 50 }\"></textarea>\n </ng-container>\n </nz-drawer>\n\n <!-- \u9884\u89C8json -->\n <nz-drawer\n [nzClosable]=\"true\"\n [nzVisible]=\"previewJsonVisible\"\n [nzWidth]=\"'100%'\"\n [nzBodyStyle]=\"{ overflow: 'auto' }\"\n nzPlacement=\"right\"\n nzTitle=\"\u9884\u89C8JSON\"\n (nzOnClose)=\"closePreviewJson()\"\n >\n <ng-container *nzDrawerContent>\n <textarea *ngIf=\"previewJson\" nz-input [ngModel]=\"previewJson\" readonly [nzAutosize]=\"{ minRows: 10, maxRows: 50 }\"></textarea>\n </ng-container>\n </nz-drawer>\n\n <!-- \u9884\u89C8\u8868\u5355 -->\n <nz-drawer\n [nzClosable]=\"true\"\n [nzVisible]=\"previewFormVisible\"\n [nzWidth]=\"'100%'\"\n [nzBodyStyle]=\"{ overflow: 'auto' }\"\n nzPlacement=\"right\"\n nzTitle=\"\u9884\u89C8\u8868\u5355\"\n (nzOnClose)=\"closePreviewForm()\"\n >\n <ng-container *nzDrawerContent>\n <r-widget-form [previewJson]=\"previewJson\" (submitForm)=\"sfSubmit($event)\" (resetForm)=\"sfReset($event)\"></r-widget-form>\n </ng-container>\n </nz-drawer>\n</div>\n", styles: ["app-form-designer ::-webkit-scrollbar{width:0!important;height:0!important}app-form-designer ::-webkit-scrollbar-thumb{background-color:#fff!important}app-form-designer ::-webkit-scrollbar-thumb,app-form-designer ::-webkit-scrollbar-track{border-radius:10px!important;-webkit-box-shadow:inset 0 0 6px transparent!important}app-form-designer ::-webkit-scrollbar-track{background-color:transparent!important}app-form-designer nz-header,app-form-designer nz-content,app-form-designer nz-footer,app-form-designer nz-sider{background-color:#fff!important}app-form-designer nz-content{min-height:120px}app-form-designer nz-layout:last-child{margin:0}app-form-designer .right-sider .ant-tabs>.ant-tabs-nav .ant-tabs-nav-list{width:100%}app-form-designer .right-sider .ant-tabs>.ant-tabs-nav .ant-tabs-nav-list .ant-tabs-tab{width:50%}app-form-designer .right-sider .ant-tabs-tab .ant-tabs-tab-btn{margin:0 auto}app-form-designer .right-sider .p-20{display:block;padding:20px}app-form-designer .ant-tabs-nav{margin-bottom:0!important}app-form-designer .components-list{box-sizing:border-box;height:100%;padding:8px}app-form-designer .components-list .components-item{display:inline-block;width:48%;margin:1%;transition:transform 0ms!important}app-form-designer .form-designer .fields-list{text-align:left}app-form-designer .form-designer .fields-list .field-title{display:flex;width:100%;padding:8px 12px;font-size:13px}app-form-designer .form-designer .fields-list .field-label.w100{width:98%}app-form-designer .form-designer .fields-list .field-label{position:relative;left:0;display:block;float:left;width:48%;margin:1%;overflow:hidden;color:#333;font-size:12px;line-height:26px;white-space:nowrap;text-overflow:ellipsis;border:1px solid #f4f6fc}app-form-designer .form-designer .fields-list .field-label .modules{padding-right:5px}app-form-designer .form-designer .fields-list .field-label a{display:block;padding:0 10px;color:#333;background:#f4f6fc;border:1px solid #f4f6fc;cursor:move}app-form-designer .form-designer .fields-list .field-label:hover{color:#409eff;border:1px dashed #409eff}app-form-designer .form-designer .widget-container{border-right:1px solid #e0e0e0;border-left:1px solid #e0e0e0}app-form-designer .form-designer .widget-container .widget-container-header{display:flex;align-items:center;justify-content:space-between;height:46px!important;border-bottom:solid 2px #e4e7ed;-webkit-box-pack:justify;-ms-flex-pack:justify;-webkit-box-align:center;-ms-flex-align:center}app-form-designer .form-designer .d-groups{position:relative;z-index:101;min-height:150px;padding-bottom:20px;overflow:auto;background:#fff;border:1px dashed #ccc}app-form-designer .widget-form-container{height:100%}app-form-designer .widget-form-container>.ant-form{height:100%}app-form-designer .widget-form-container .edit-label{width:100%}app-form-designer .widget-form-container .widget-form-list{height:100%;min-height:calc(100% - 45px);padding-bottom:50px;overflow:hidden;overflow-y:scroll}app-form-designer .widget-form-container .widget-form-list .widget-form-item{position:relative;min-height:55px;margin:0;padding:5px 10px 18px}app-form-designer .widget-form-container .widget-form-list .widget-form-item .widget-mask{position:absolute;top:0;z-index:100;width:100%;height:100%}app-form-designer .widget-form-container .widget-form-list .widget-form-item .widget-action-clone{position:absolute;right:80px;bottom:-8px;z-index:102}app-form-designer .widget-form-container .widget-form-list .widget-form-item .widget-action-delete{position:absolute;right:40px;bottom:-8px;z-index:102}app-form-designer .widget-form-container .widget-form-list .widget-form-item.active{background:#ecf5ff;border-left:3px solid #409eff}app-form-designer .widget-form-container .widget-form-list .widget-form-table{position:relative;float:left;width:100%;padding:2px}app-form-designer .widget-form-container .widget-form-list .widget-form-table:hover{background:#ecf8ff;cursor:move}app-form-designer .widget-form-container .widget-form-list .widget-form-table.active{background:#ecf5ff;border-left:3px solid #409eff}app-form-designer .widget-form-container .widget-form-table__content{width:100%;min-height:103px;padding:10px 5px;overflow-y:hidden;outline:1px dashed #ccc;outline-offset:-1px}app-form-designer .widget-form-container .widget-form-table__content .widget-action-clone{position:absolute;right:75px;bottom:-8px;z-index:102}app-form-designer .widget-form-container .widget-form-table__content .widget-action-delete{position:absolute;right:5px;bottom:-8px;z-index:102}app-form-designer .widget-form-container .widget-form-table__content .widget-action-clear{position:absolute;right:40px;bottom:-8px;z-index:102}app-form-designer .widget-form-container .widget-form-table__content .widget-form-table__item{position:relative;height:100%;padding:1px}app-form-designer .widget-form-container .widget-form-table__content .widget-form-table__item .ant-card{margin-bottom:0}app-form-designer .widget-form-container .widget-form-table__content .widget-form-table__item .ant-card .ant-card-head{padding:0;color:#909399;font-weight:500}app-form-designer .widget-form-container .widget-form-table__content .widget-form-table__item .ant-card .ant-card-head .ant-card-head-title{padding:12px 0}app-form-designer .widget-form-container .widget-form-table__content .widget-form-table__item .ant-card .ant-card-body{padding:12px 10px}app-form-designer .widget-form-container .widget-form-table__content .widget-form-table__item .widget-mask{position:absolute;top:0;z-index:100;width:100%;height:100%}app-form-designer .widget-form-container .widget-form-table__content .widget-form-table__item .widget-action-clone{position:absolute;right:40px;bottom:-8px;z-index:102}app-form-designer .widget-form-container .widget-form-table__content .widget-form-table__item .widget-action-delete{position:absolute;right:5px;bottom:-8px;z-index:102}app-form-designer .widget-form-container .widget-form-table__content .widget-form-table__item.active{outline:1px solid #409eff;outline-offset:-1px}.widget-form-item-placeholder{display:inline-block;width:100%;min-height:2px;background-color:#8bbb11}r-widget-form .formBordered .widget-form-list{border:1px solid rgba(0,0,0,.5)}r-widget-form .formBordered .widget-form-list .widget-form-item{margin-bottom:0}r-widget-form .widget-form-list{overflow:hidden}r-widget-form .widget-form-list .widget-form-item{position:relative;margin-bottom:10px}r-widget-form .widget-form-list .widget-form-item .ant-form-item-control:first-child:not([class^=\"ant-col-\"]):not([class*=\" ant-col-\"]){width:100%;padding:10px}r-widget-form .widget-form-list .widget-form-item.bordered .line-top{position:absolute;top:0;width:10000px;height:0;border-top:1px solid rgba(0,0,0,.5);transform:translateY(-50%)}r-widget-form .widget-form-list .widget-form-item.bordered .line-right{position:absolute;right:0;width:1px;height:10000px;border-left:1px solid rgba(0,0,0,.5);transform:translate(-50%)}r-widget-form .widget-form-list .widget-form-item.bordered .line-bottom{position:absolute;bottom:0;width:10000px;height:0;border-top:1px solid rgba(0,0,0,.5);transform:translateY(-50%)}r-widget-form .widget-form-list .widget-form-item.bordered .line-left{position:absolute;left:0;width:0;height:10000px;border-left:1px solid rgba(0,0,0,.5);transform:translate(-50%)}r-widget-form .widget-form-list .widget-form-item.bordered.parentGroup:before{border-color:transparent}r-widget-form .widget-form-list .widget-form-item.bordered.parentGroup:after{border-color:transparent}r-widget-form .widget-form-list nz-form-control{position:relative}r-widget-form .widget-form-list .r-d-groups{position:relative;background:#fff}r-widget-form .widget-form-list .r-d-title{position:relative;background:#fff}r-widget-form .widget-form-list .r-d-title.bordered{background:none}\n"], components: [{ type: i1.NzLayoutComponent, selector: "nz-layout", exportAs: ["nzLayout"] }, { type: i1.NzSiderComponent, selector: "nz-sider", inputs: ["nzWidth", "nzTheme", "nzCollapsedWidth", "nzBreakpoint", "nzZeroTrigger", "nzTrigger", "nzReverseArrow", "nzCollapsible", "nzCollapsed"], outputs: ["nzCollapsedChange"], exportAs: ["nzSider"] }, { type: i1.NzHeaderComponent, selector: "nz-header", exportAs: ["nzHeader"] }, { type: i2.NzButtonComponent, selector: "button[nz-button], a[nz-button]", inputs: ["nzBlock", "nzGhost", "nzSearch", "nzLoading", "nzDanger", "disabled", "tabIndex", "nzType", "nzShape", "nzSize"], exportAs: ["nzButton"] }, { type: i1.NzContentComponent, selector: "nz-content", exportAs: ["nzContent"] }, { type: i3.DWidgetFormRenderComponent, selector: "[d-widget-form-render]" }, { type: i4.NzTabSetComponent, selector: "nz-tabset", inputs: ["nzTabPosition", "nzCanDeactivate", "nzAddIcon", "nzTabBarStyle", "nzType", "nzSize", "nzAnimated", "nzTabBarGutter", "nzHideAdd", "nzCentered", "nzHideAll", "nzLinkRouter", "nzLinkExact", "nzSelectedIndex", "nzTabBarExtraContent"], outputs: ["nzSelectChange", "nzSelectedIndexChange", "nzTabListScroll", "nzClose", "nzAdd"], exportAs: ["nzTabset"] }, { type: i4.NzTabComponent, selector: "nz-tab", inputs: ["nzTitle", "nzClosable", "nzCloseIcon", "nzDisabled", "nzForceRender"], outputs: ["nzSelect", "nzDeselect", "nzClick", "nzContextmenu"], exportAs: ["nzTab"] }, { type: i5.WidgetConfigComponent, selector: "app-widget-config", inputs: ["data", "defaultValues"] }, { type: i6.FormConfigComponent, selector: "app-form-config", inputs: ["data"] }, { type: i7.NzDrawerComponent, selector: "nz-drawer", inputs: ["nzCloseIcon", "nzClosable", "nzMaskClosable", "nzMask", "nzCloseOnNavigation", "nzNoAnimation", "nzKeyboard", "nzPlacement", "nzMaskStyle", "nzBodyStyle", "nzWidth", "nzHeight", "nzZIndex", "nzOffsetX", "nzOffsetY", "nzVisible", "nzContent", "nzTitle", "nzFooter", "nzWrapClassName"], outputs: ["nzOnViewInit", "nzOnClose", "nzVisibleChange"], exportAs: ["nzDrawer"] }, { type: i8.RWidgetFormComponent, selector: "r-widget-form", inputs: ["previewJson", "formData", "showButton", "disabled"], outputs: ["submitForm", "resetForm"] }], directives: [{ type: i9.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i10.DndDropzoneDirective, selector: "[dndDropZone]", inputs: ["dndDropzone", "dndEffectAllowed", "dndAllowExternal", "dndHorizontal", "dndDragoverClass", "dndDropzoneDisabledClass", "dndDisableIf", "dndDisableDropIf"], outputs: ["dndDragover", "dndDrop"] }, { type: i11.DndDraggableDirective, selector: "[dndDraggable]", inputs: ["dndDraggable", "dndEffectAllowed", "dndType", "dndDraggingClass", "dndDraggingSourceClass", "dndDraggableDisabledClass", "dndDragImageOffsetFunction", "dndDisableIf", "dndDisableDragIf"], outputs: ["dndStart", "dndDrag", "dndEnd", "dndMoved", "dndCopied", "dndLinked", "dndCanceled"] }, { type: i9.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i9.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i12.ɵNzTransitionPatchDirective, selector: "[nz-button], nz-button-group, [nz-icon], [nz-menu-item], [nz-submenu], nz-select-top-control, nz-select-placeholder, nz-input-group", inputs: ["hidden"] }, { type: i7.NzDrawerContentDirective, selector: "[nzDrawerContent]", exportAs: ["nzDrawerContent"] }, { type: i13.NzInputDirective, selector: "input[nz-input],textarea[nz-input]", inputs: ["nzBorderless", "nzSize", "disabled"], exportAs: ["nzInput"] }, { type: i14.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i13.NzAutosizeDirective, selector: "textarea[nzAutosize]", inputs: ["nzAutosize"], exportAs: ["nzAutosize"] }, { type: i14.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i14.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }] }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.13", ngImport: i0, type: FormDesignerComponent, decorators: [{ type: Component, args: [{ selector: 'app-form-designer', templateUrl: './form-designer.component.html', styleUrls: ['form-designer.component.less'] }] }], ctorParameters: function () { return [{ type: Document, decorators: [{ type: Inject, args: [DOCUMENT] }] }]; } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1kZXNpZ25lci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9sLTUyYWJwLW5nLWZvcm0tZ2VuZXJhdG9yL3NyYy9mb3JtLWRlc2lnbmVyL2Zvcm0tZGVzaWduZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vcHJvamVjdHMvbC01MmFicC1uZy1mb3JtLWdlbmVyYXRvci9zcmMvZm9ybS1kZXNpZ25lci9mb3JtLWRlc2lnbmVyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFVLE1BQU0sZUFBZSxDQUFDO0FBQzFELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMzQyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sV0FBVyxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7O0FBUzVDLE1BQU0sT0FBTyxxQkFBcUI7SUF5RGhDLFlBQXNDLFFBQWtCO1FBQWxCLGFBQVEsR0FBUixRQUFRLENBQVU7UUF4RHhELFNBQUksR0FBRyxpQkFBaUIsQ0FBQztRQUV6QixXQUFXO1FBQ1gsb0JBQWUsR0FBc0IsRUFBRSxDQUFDO1FBRXhDLFdBQVc7UUFDWCxrQkFBYSxHQUFrQjtZQUM3QixFQUFFLEVBQUUsYUFBYTtZQUNqQixJQUFJLEVBQUUsTUFBTTtZQUNaLE1BQU0sRUFBRSxhQUFhO1lBQ3JCLGFBQWEsRUFBRSxNQUFNO1lBQ3JCLFdBQVcsRUFBRSxHQUFHO1lBQ2hCLE1BQU0sRUFBRSxDQUFDO1lBQ1QsUUFBUSxFQUFFLEVBQUU7WUFDWixTQUFTO1lBQ1QsVUFBVSxFQUFFLFlBQVk7WUFDeEIsUUFBUSxFQUFFLFNBQVM7WUFDbkIsT0FBTyxFQUFFLElBQUk7WUFDYixhQUFhLEVBQUUsSUFBSTtZQUNuQixpQkFBaUIsRUFBRSxJQUFJO1lBQ3ZCLFlBQVksRUFBRSxJQUFJO1lBQ2xCLGdCQUFnQixFQUFF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LEdBQUcsSUFBSSxDQUFDO0lBQzFCLENBQUM7SUFFRCxlQUFlO0lBQ2YsZ0JBQWdCO1FBQ2QsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7UUFDeEIsSUFBSSxDQUFDLGtCQUFrQixHQUFHLEtBQUssQ0FBQztJQUNsQyxDQUFDO0lBRUQsUUFBUSxDQUFDLEtBQUs7UUFDWixPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxVQUFVLENBQUMsQ0FBQztJQUNqQyxDQUFDO0lBQ0QsT0FBTyxDQUFDLEtBQUs7UUFDWCxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxTQUFTLENBQUMsQ0FBQztJQUNoQyxDQUFDOzttSEF4SlUscUJBQXFCLGtCQXlEWixRQUFRO3VHQXpEakIscUJBQXFCLHlEQ1hsQyw4c0lBMEdBOzRGRC9GYSxxQkFBcUI7a0JBTGpDLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLG1CQUFtQjtvQkFDN0IsV0FBVyxFQUFFLGdDQUFnQztvQkFDN0MsU0FBUyxFQUFFLENBQUMsOEJBQThCLENBQUM7aUJBQzVDOzBEQTBEaUQsUUFBUTswQkFBM0MsTUFBTTsyQkFBQyxRQUFRIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbmplY3QsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRE9DVU1FTlQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgY29tcG9uZW50R3JvdXBzIH0gZnJvbSAnLi4vY29uZmlnJztcbmltcG9ydCB7IElDb21wb25lbnRHcm91cCwgSUNvbXBvbmVudERlZiB9IGZyb20gJy4uL3NoYXJlZC9pbnRlcmZhY2VzJztcbmltcG9ydCB7IFNGU2NoZW1hIH0gZnJvbSAnQGRlbG9uL2Zvcm0nO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtZm9ybS1kZXNpZ25lcicsXG4gIHRlbXBsYXRlVXJsOiAnLi9mb3JtLWRlc2lnbmVyLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJ2Zvcm0tZGVzaWduZXIuY29tcG9uZW50Lmxlc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBGb3JtRGVzaWduZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICBsb2dvID0gJ2Fzc2V0cy9sb2dvLnBuZyc7XG5cbiAgLyoqIOaJgOacieaOp+S7tiAqL1xuICBjb21wb25lbnRHcm91cHM6IElDb21wb25lbnRHcm91cFtdID0gW107XG5cbiAgLyoqIOihqOWNleaOp+S7tiAqL1xuICByb290Q29tcG9uZW50OiBJQ29tcG9uZW50RGVmID0ge1xuICAgIGlkOiAnd2lkZ2V0LWZvcm0nLFxuICAgIHR5cGU6ICdmb3JtJyxcbiAgICB3aWRnZXQ6ICdsYXlvdXQtZm9ybScsXG4gICAgbGFiZWxQb3NpdGlvbjogJ2xlZnQnLFxuICAgIGxhYmVsU3VmZml4OiAn77yaJyxcbiAgICBndXR0ZXI6IDAsXG4gICAgY2hpbGRyZW46IFtdLFxuICAgIC8vIOihqOWNleeLrOaciemFjee9rlxuICAgIGZvcm1MYXlvdXQ6ICdob3Jpem9udGFsJyxcbiAgICBmb3JtU2l6ZTogJ2RlZmF1bHQnLFxuICAgIGZvcm1CdG46IHRydWUsXG4gICAgZm9ybUJ0blN1Ym1pdDogdHJ1ZSxcbiAgICBmb3JtQnRuU3VibWl0VGV4dDogJ+aPkOS6pCcsXG4gICAgZm9ybUJ0blJlc2V0OiB0cnVlLFxuICAgIGZvcm1CdG5SZXNldFRleHQ6ICfph43nva4nLFxuICAgIGJvcmRlcmVkOiBmYWxzZVxuICB9O1xuXG4gIC8qKiDlvZPliY3pgInkuK3mjqfku7YgKi9cbiAgc2VsZWN0Q29tcG9uZW50OiBJQ29tcG9uZW50RGVmIHwgbnVsbDtcblxuICAvKiog6buY6K6k5YC8ICovXG4gIGRlZmF1bHRWYWx1ZXM6IGFueTtcblxuICAvKiog5pKk6ZSA5ZKM6YeN5YGaICovXG4gIHVuZG9SZWRvOiBib29sZWFuO1xuXG4gIC8qKiDljoblj7LorrDlvZUgKi9cbiAgaGlzdG9yeSA9IHtcbiAgICBpbmRleDogMCxcbiAgICBtYXhTdGVwOiAyMCxcbiAgICBzdGVwczogW11cbiAgfTtcblxuICAvKiog5bel5YW35p2hICovXG4gIHRvb2xiYXI6IHN0cmluZ1tdID0gWydpbXBvcnQnLCAnZ2VuZXJhdGUnLCAncHJldmlldycsICdwcmV2aWV3Qm9yZGVyZCcsICdjbGVhciddO1xuXG4gIC8qKiDlr7zlhaVqc29uICovXG4gIGltcG9ydEpzb246IHN0cmluZztcbiAgaW1wb3J0SnNvblZpc2libGU6IGJvb2xlYW47XG5cbiAgLyoqIGpzb27pooTop4ggKi9cbiAgcHJldmlld0pzb246IHN0cmluZztcbiAgcHJldmlld0pzb25WaXNpYmxlOiBib29sZWFuO1xuXG4gIC8qKiDpooTop4jooajljZUgKi9cbiAgcHJldmlld0Zvcm06IFNGU2NoZW1hO1xuICBwcmV2aWV3Rm9ybVZpc2libGU6IGJvb2xlYW47XG5cbiAgY29uc3RydWN0b3IoQEluamVjdChET0NVTUVOVCkgcHJpdmF0ZSBkb2N1bWVudDogRG9jdW1lbnQpIHsgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuY29tcG9uZW50R3JvdXBzID0gWy4uLmNvbXBvbmVudEdyb3Vwc107XG4gIH1cblxuICAvKiog6L+Q6KGMICovXG4gIHJ1bigpIHsgfVxuXG4gIC8qKiDmmL7npLpqc29uICovXG4gIHNob3dKc29uKCkgeyB9XG5cbiAgLyoqIOWvvOWHunZ1ZeaWh+S7tiAqL1xuICBkb3dubG9hZCgpIHsgfVxuXG4gIC8qKiDlpI3liLbku6PnoIEgKi9cbiAgY29weSgpIHsgfVxuXG4gIC8qKiDmuIXnqbogKi9cbiAgZW1wdHkoKSB7IH1cblxuICBoYW5kbGVTZWxlY3RXaWRnZXQod2lkZ2V0OiBJQ29tcG9uZW50RGVmLCBpOiBudW1iZXIpIHtcbiAgICB0aGlzLnNlbGVjdENvbXBvbmVudCA9IHdpZGdldDtcbiAgfVxuXG4gIC8qKiDmkqTplIAgKi9cbiAgaGFuZGxlVW5kbygpIHsgfVxuXG4gIC8qKiDph43lgZogKi9cbiAgaGFuZGxlUmVkbygpIHsgfVxuXG4gIC8qKiDlr7zlhaVKU09OICovXG4gIGhhbmRsZUltcG9ydEpzb24oKSB7XG4gICAgdGhpcy5pbXBvcnRKc29uVmlzaWJsZSA9IHRydWU7XG4gIH1cblxuICAvKiog55Sf5oiQSlNPTiAqL1xuICBoYW5kbGVHZW5lcmF0ZUpzb24oKSB7XG4gICAgdGhpcy5wcmV2aWV3SnNvbiA9IG51bGw7XG4gICAgdGhpcy5zZWxlY3RDb21wb25lbnQgPSBudWxsO1xuICAgIHRoaXMucHJldmlld0pzb25WaXNpYmxlID0gdHJ1ZTtcbiAgICB0aGlzLnByZXZpZXdKc29uID0gSlNPTi5zdHJpbmdpZnkodGhpcy5yb290Q29tcG9uZW50LCBudWxsLCAnXFx0Jyk7XG4gIH1cblxuICAvKiog6aKE6KeIICovXG4gIGhhbmRsZVByZXZpZXcoKSB7XG4gICAgdGhpcy5wcmV2aWV3SnNvbiA9IG51bGw7XG4gICAgdGhpcy5zZWxlY3RDb21wb25lbnQgPSBudWxsO1xuICAgIHRoaXMucHJldmlld0Zvcm1WaXNpYmxlID0gdHJ1ZTtcbiAgICB0aGlzLnByZXZpZXdKc29uID0gSlNPTi5zdHJpbmdpZnkodGhpcy5yb290Q29tcG9uZW50LCBudWxsLCAnXFx0Jyk7XG4gIH1cblxuICAvKiog5riF56m6ICovXG4gIGhhbmRsZUNsZWFyKCkge1xuICAgIHRoaXMuc2VsZWN0Q29tcG9uZW50ID0gbnVsbDtcbiAgICB0aGlzLnJvb3RDb21wb25lbnQuY2hpbGRyZW4gPSBbXTtcbiAgfVxuXG4gIC8qKiDlhbPpl63lr7zlhaVqc29u6Z2i5p2/ICovXG4gIGNsb3NlSW1wb3J0SnNvbigpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgY29tcG9uZW50ID0gSlNPTi5wYXJzZSh0aGlzLmltcG9ydEpzb24pO1xuICAgICAgaWYgKGNvbXBvbmVudCkge1xuICAgICAgICB0aGlzLnJvb3RDb21wb25lbnQgPSBjb21wb25lbnQ7XG4gICAgICB9XG4gICAgfSBjYXRjaCB7IH1cbiAgICB0aGlzLmltcG9ydEpzb25WaXNpYmxlID0gZmFsc2U7XG4gIH1cblxuICAvKiog6I635Y+W5b2T5YmNanNvbiAqL1xuICBnZXRKc29uKCkge1xuICAgIHJldHVybiAodGhpcy5wcmV2aWV3SnNvbiA9IEpTT04uc3RyaW5naWZ5KHRoaXMucm9vdENvbXBvbmVudCwgbnVsbCwgJ1xcdCcpKTtcbiAgfVxuICAvKiog5L2/55So5o6l5Y+j6L+U5Zue5YC85riy5p+TZm9ybee7hOS7tiAqL1xuICBpbXBvcnRKc29uQnlBcGkodmFsKSB7XG4gICAgdGhpcy5pbXBvcnRKc29uID0gdmFsO1xuICAgIHRoaXMuY2xvc2VJbXBvcnRKc29uKCk7XG4gIH1cbiAgLyoqIOWFs+mXremihOiniOihqOWNlWpzb27pnaLmnb8gKi9cbiAgY2xvc2VQcmV2aWV3SnNvbigpIHtcbiAgICB0aGlzLnByZXZpZXdKc29uVmlzaWJsZSA9IGZhbHNlO1xuICAgIHRoaXMucHJldmlld0pzb24gPSBudWxsO1xuICB9XG5cbiAgLyoqIOWFs+mXremihOiniOihqOWNlemdouadvyAqL1xuICBjbG9zZVByZXZpZXdGb3JtKCkge1xuICAgIHRoaXMucHJldmlld0Zvcm0gPSBudWxsO1xuICAgIHRoaXMucHJldmlld0Zvcm1WaXNpYmxlID0gZmFsc2U7XG4gIH1cblxuICBzZlN1Ym1pdCh2YWx1ZSkge1xuICAgIGNvbnNvbGUubG9nKHZhbHVlLCAnc2ZTdWJtaXQnKTtcbiAgfVxuICBzZlJlc2V0KHZhbHVlKSB7XG4gICAgY29uc29sZS5sb2codmFsdWUsICdzZlJlc2V0Jyk7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJmb3JtLWRlc2lnbmVyXCI+XG4gIDxuei1sYXlvdXQ+XG4gICAgPCEtLSDlt6bkvqfmjqfku7YgLS0+XG4gICAgPG56LXNpZGVyIFtueldpZHRoXT1cIjI2MFwiPlxuICAgICAgPGRpdiBjbGFzcz1cImZpZWxkcy1saXN0XCI+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICAqbmdGb3I9XCJsZXQgY29tcG9uZW50R3JvdXAgb2YgY29tcG9uZW50R3JvdXBzOyBsZXQgbGlzdEluZGV4ID0gaW5kZXhcIlxuICAgICAgICAgIGlkPVwiY29tcG9uZW50c197eyBsaXN0SW5kZXggfX1cIlxuICAgICAgICAgIGRuZERyb3Bab25lXG4gICAgICAgICAgW2RuZEFsbG93RXh0ZXJuYWxdPVwidHJ1ZVwiXG4gICAgICAgID5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQtdGl0bGVcIj57eyBjb21wb25lbnRHcm91cC5sYWJlbCB9fTwvZGl2PlxuXG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgKm5nRm9yPVwibGV0IGNvbXBvbmVudCBvZiBjb21wb25lbnRHcm91cC5jb21wb25lbnRzOyBsZXQgaW5kZXhcIlxuICAgICAgICAgICAgY2xhc3M9XCJnaG9zdCBmaWVsZC1sYWJlbFwiXG4gICAgICAgICAgICBbZG5kRHJhZ2dhYmxlXT1cImNvbXBvbmVudFwiXG4gICAgICAgICAgICBkbmRFZmZlY3RBbGxvd2VkPVwiY29weVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGE+XG4gICAgICAgICAgICAgIDxpIGNsYXNzPVwibW9kdWxlc1wiIFtuZ0NsYXNzXT1cImNvbXBvbmVudC5pY29uXCI+PC9pPlxuICAgICAgICAgICAgICA8c3Bhbj57eyBjb21wb25lbnQubGFiZWwgfX08L3NwYW4+XG4gICAgICAgICAgICA8L2E+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9uei1zaWRlcj5cblxuICAgIDwhLS0g5Lit6Ze05YaF5a65IC0tPlxuICAgIDxuei1sYXlvdXQgY2xhc3M9XCJ3aWRnZXQtY29udGFpbmVyXCI+XG4gICAgICA8IS0tIOmhtumDqOW3peWFt+adoSAtLT5cbiAgICAgIDxuei1oZWFkZXIgY2xhc3M9XCJ3aWRnZXQtY29udGFpbmVyLWhlYWRlclwiPlxuICAgICAgICA8ZGl2ICpuZ0lmPVwidW5kb1JlZG9cIj5cbiAgICAgICAgICA8YSBuei1idXR0b24gbnpUeXBlPVwibGlua1wiIFtkaXNhYmxlZF09XCJoaXN0b3J5LmluZGV4ID09PSAwXCIgKGNsaWNrKT1cImhhbmRsZVVuZG8oKVwiPuaSpOmUgDwvYT5cbiAgICAgICAgICA8YSBuei1idXR0b24gbnpUeXBlPVwibGlua1wiIFtkaXNhYmxlZF09XCJoaXN0b3J5LmluZGV4ID09PSBoaXN0b3J5LnN0ZXBzLmxlbmd0aCAtIDFcIiAoY2xpY2spPVwiaGFuZGxlVW5kbygpXCI+6YeN5YGaPC9hPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXJcIj5cbiAgICAgICAgICA8YSAqbmdJZj1cInRvb2xiYXIuaW5jbHVkZXMoJ2ltcG9ydCcpXCIgbnotYnV0dG9uIG56VHlwZT1cImxpbmtcIiAoY2xpY2spPVwiaGFuZGxlSW1wb3J0SnNvbigpXCI+5a+85YWlSlNPTjwvYT5cbiAgICAgICAgICA8YSAqbmdJZj1cInRvb2xiYXIuaW5jbHVkZXMoJ2dlbmVyYXRlJylcIiBuei1idXR0b24gbnpUeXBlPVwibGlua1wiIChjbGljayk9XCJoYW5kbGVHZW5lcmF0ZUpzb24oKVwiPueUn+aIkEpPU048L2E+XG4gICAgICAgICAgPGEgKm5nSWY9XCJ0b29sYmFyLmluY2x1ZGVzKCdwcmV2aWV3JylcIiBuei1idXR0b24gbnpUeXBlPVwibGlua1wiIChjbGljayk9XCJoYW5kbGVQcmV2aWV3KClcIj7pooTop4g8L2E+XG4gICAgICAgICAgPGEgKm5nSWY9XCJ0b29sYmFyLmluY2x1ZGVzKCdjbGVhcicpXCIgbnotYnV0dG9uIG56VHlwZT1cImxpbmtcIiAoY2xpY2spPVwiaGFuZGxlQ2xlYXIoKVwiPua4heepujwvYT5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L256LWhlYWRlcj5cbiAgICAgIDwhLS0g5Lit6Ze055S75p2/IC0tPlxuICAgICAgPG56LWNvbnRlbnQ+XG4gICAgICAgIDwhLS0g5riy5p+TIC0tPlxuICAgICAgICA8ZGl2IGQtd2lkZ2V0LWZvcm0tcmVuZGVyIFtjb21wb25lbnRdPVwicm9vdENvbXBvbmVudFwiIFsoc2VsZWN0Q29tcG9uZW50KV09XCJzZWxlY3RDb21wb25lbnRcIiBjbGFzcz1cIndpZGdldC1mb3JtLWNvbnRhaW5lclwiPiA8L2Rpdj5cbiAgICAgIDwvbnotY29udGVudD5cbiAgICA8L256LWxheW91dD5cblxuICAgIDwhLS0g5Y+z5L6n6YWN572uIC0tPlxuICAgIDxuei1zaWRlciBjbGFzcz1cInJpZ2h0LXNpZGVyXCIgW256V2lkdGhdPVwiMzIwXCI+XG4gICAgICA8bnotdGFic2V0PlxuICAgICAgICA8bnotdGFiIG56VGl0bGU9XCLnu4Tku7blsZ7mgKdcIiBuekFjdGl2ZT5cbiAgICAgICAgICA8YXBwLXdpZGdldC1jb25maWcgY2xhc3M9XCJwLTIwXCIgW2RhdGFdPVwic2VsZWN0Q29tcG9uZW50XCIgW2RlZmF1bHRWYWx1ZXNdPVwiZGVmYXVsdFZhbHVlc1wiPjwvYXBwLXdpZGdldC1jb25maWc+XG4gICAgICAgIDwvbnotdGFiPlxuICAgICAgICA8bnotdGFiIG56VGl0bGU9XCLooajljZXlsZ7mgKdcIj48YXBwLWZvcm0tY29uZmlnIGNsYXNzPVwicC0yMFwiIFtkYXRhXT1cInJvb3RDb21wb25lbnRcIj48L2FwcC1mb3JtLWNvbmZpZz48L256LXRhYj5cbiAgICAgIDwvbnotdGFic2V0PlxuICAgIDwvbnotc2lkZXI+XG4gIDwvbnotbGF5b3V0PlxuXG4gIDwhLS0g5a+85YWlanNvbiAtLT5cbiAgPG56LWRyYXdlclxuICAgIFtuekNsb3NhYmxlXT1cInRydWVcIlxuICAgIFtuelZpc2libGVdPVwiaW1wb3J0SnNvblZpc2libGVcIlxuICAgIFtueldpZHRoXT1cIicxMDAlJ1wiXG4gICAgW256Qm9keVN0eWxlXT1cInsgb3ZlcmZsb3c6ICdhdXRvJyB9XCJcbiAgICBuelBsYWNlbWVudD1cInJpZ2h0XCJcbiAgICBuelRpdGxlPVwi5a+85YWlSlNPTlwiXG4gICAgKG56T25DbG9zZSk9XCJjbG9zZUltcG9ydEpzb24oKVwiXG4gID5cbiAgICA8bmctY29udGFpbmVyICpuekRyYXdlckNvbnRlbnQ+XG4gICAgICA8dGV4dGFyZWEgKm5nSWY9XCJpbXBvcnRKc29uVmlzaWJsZVwiIG56LWlucHV0IFsobmdNb2RlbCldPVwiaW1wb3J0SnNvblwiIFtuekF1dG9zaXplXT1cInsgbWluUm93czogMTAsIG1heFJvd3M6IDUwIH1cIj48L3RleHRhcmVhPlxuICAgIDwvbmctY29udGFpbmVyPlxuICA8L256LWRyYXdlcj5cblxuICA8IS0tIOmihOiniGpzb24gLS0+XG4gIDxuei1kcmF3ZXJcbiAgICBbbnpDbG9zYWJsZV09XCJ0cnVlXCJcbiAgICBbbnpWaXNpYmxlXT1cInByZXZpZXdKc29uVmlzaWJsZVwiXG4gICAgW256V2lkdGhdPVwiJzEwMCUnXCJcbiAgICBbbnpCb2R5U3R5bGVdPVwieyBvdmVyZmxvdzogJ2F1dG8nIH1cIlxuICAgIG56UGxhY2VtZW50PVwicmlnaHRcIlxuICAgIG56VGl0bGU9XCLpooTop4hKU09OXCJcbiAgICAobnpPbkNsb3NlKT1cImNsb3NlUHJldmlld0pzb24oKVwiXG4gID5cbiAgICA8bmctY29udGFpbmVyICpuekRyYXdlckNvbnRlbnQ+XG4gICAgICA8dGV4dGFyZWEgKm5nSWY9XCJwcmV2aWV3SnNvblwiIG56LWlucHV0IFtuZ01vZGVsXT1cInByZXZpZXdKc29uXCIgcmVhZG9ubHkgW256QXV0b3NpemVdPVwieyBtaW5Sb3dzOiAxMCwgbWF4Um93czogNTAgfVwiPjwvdGV4dGFyZWE+XG4gICAgPC9uZy1jb250YWluZXI+XG4gIDwvbnotZHJhd2VyPlxuXG4gIDwhLS0g6aKE6KeI6KGo5Y2VIC0tPlxuICA8bnotZHJhd2VyXG4gICAgW256Q2xvc2FibGVdPVwidHJ1ZVwiXG4gICAgW256VmlzaWJsZV09XCJwcmV2aWV3Rm9ybVZpc2libGVcIlxuICAgIFtueldpZHRoXT1cIicxMDAlJ1wiXG4gICAgW256Qm9keVN0eWxlXT1cInsgb3ZlcmZsb3c6ICdhdXRvJyB9XCJcbiAgICBuelBsYWNlbWVudD1cInJpZ2h0XCJcbiAgICBuelRpdGxlPVwi6aKE6KeI6KGo5Y2VXCJcbiAgICAobnpPbkNsb3NlKT1cImNsb3NlUHJldmlld0Zvcm0oKVwiXG4gID5cbiAgICA8bmctY29udGFpbmVyICpuekRyYXdlckNvbnRlbnQ+XG4gICAgICA8ci13aWRnZXQtZm9ybSBbcHJldmlld0pzb25dPVwicHJldmlld0pzb25cIiAoc3VibWl0Rm9ybSk9XCJzZlN1Ym1pdCgkZXZlbnQpXCIgKHJlc2V0Rm9ybSk9XCJzZlJlc2V0KCRldmVudClcIj48L3Itd2lkZ2V0LWZvcm0+XG4gICAgPC9uZy1jb250YWluZXI+XG4gIDwvbnotZHJhd2VyPlxuPC9kaXY+XG4iXX0=