ngx-antd-form-builder
Version:
Simple Drag&Drop form builder using ng-zorro-antd
239 lines • 27.4 kB
JavaScript
import { HttpClientModule } from '@angular/common/http';
import { Component, EventEmitter, Input, Output } from '@angular/core';
import { FormsModule } from '@angular/forms';
import { NzCollapseModule } from 'ng-zorro-antd/collapse';
import { NzTabsModule } from 'ng-zorro-antd/tabs';
import { NzToolTipModule } from 'ng-zorro-antd/tooltip';
import { DialogModule } from '@angular/cdk/dialog';
import { CollapseItemListComponent } from './components/collapse-item-list/collapse-item-list.component';
import { DesignFormChangeOptionComponent } from './components/design-form-change-option/design-form-change-option.component';
import { DesignFormComponentPanelComponent } from './components/design-form-component-panel/design-form-component-panel.component';
import { DesignFormItemPropertiesComponent } from './components/design-form-item-properties/design-form-item-properties.component';
import { DesignFormNodeComponent } from './components/design-form-node/design-form-node.component';
import { DesignFormPropertiesComponent } from './components/design-form-properties/design-form-properties.component';
import { LayoutItemComponent } from './components/layout-item/layout-item.component';
import { ComponentList, DefaultFields, LayoutList } from './utils/form-item.config';
import { CommonModule } from '@angular/common';
import { NzIconModule } from 'ng-zorro-antd/icon';
import { cloneDeep } from './utils/func';
import * as i0 from "@angular/core";
import * as i1 from "ng-zorro-antd/collapse";
import * as i2 from "ng-zorro-antd/tabs";
export class NgxAntdFormBuilderComponent {
constructor() {
this.fields = DefaultFields;
this.saveSchema = new EventEmitter();
//@ViewChild('appDesignFormItemProperties') public appDesignFormItemProperties: DesignFormItemPropertiesComponent;
//@Input() initData: any
this.basicArray = ComponentList.filter(item => this.fields.includes(item.type));
this.layoutArray = LayoutList.filter(item => this.fields.includes(item.type));
this.data = {
list: [],
config: {
"layout": "horizontal",
"labelCol": {
"xs": 4,
"sm": 4,
"md": 4,
"lg": 4,
"xl": 4,
"xxl": 4
},
"labelWidth": 100,
"labelLayout": "flex",
"wrapperCol": {
"xs": 18,
"sm": 18,
"md": 18,
"lg": 18,
"xl": 18,
"xxl": 18
},
}
};
this.selectItem = {
key: ""
};
this.activeKey = 0;
}
ngOnInit() {
}
ngOnChanges(changes) {
if (changes['fields']) {
this.basicArray = ComponentList.filter(item => this.fields.includes(item.type));
this.layoutArray = LayoutList.filter(item => this.fields.includes(item.type));
}
if (changes['json'] && changes['json'].currentValue) {
if (typeof changes['json'].currentValue === 'string') {
try {
this.init(JSON.parse(changes['json'].currentValue));
}
catch (e) {
console.error(e);
}
}
else {
this.init(this.json);
}
}
}
init(data) {
this.data = cloneDeep(data);
}
recursiveGetComponentList() {
const list = [];
const recursivePush = (item) => {
if ('card' == item.type) {
item.list.forEach(recursivePush);
}
else if (item.type == 'tabs' || item.type == 'grid' || item.type == 'collapse') {
item.columns.forEach(col => {
col.list.forEach(recursivePush);
});
}
else {
list.push(item);
}
};
this.data.list.forEach(recursivePush);
return list;
}
getData() {
return cloneDeep(this.data);
}
getJsonSchema() {
return JSON.stringify(this.data, null, "\t");
}
save() {
this.saveSchema.emit(this.getData());
}
generateKey(list, index) {
const key = list[index].type + "_" + new Date().getTime();
list[index].key = key;
}
handleSetSelectItem(record) {
this.selectItem = record;
if (record.key) {
this.changeTab(2);
}
else {
this.changeTab(1);
}
}
changeTab(e) {
this.activeKey = e;
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.10", ngImport: i0, type: NgxAntdFormBuilderComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.10", type: NgxAntdFormBuilderComponent, isStandalone: true, selector: "ngx-antd-form-builder", inputs: { fields: "fields", json: "json" }, outputs: { saveSchema: "saveSchema" }, usesOnChanges: true, ngImport: i0, template: `
<div class="content">
<aside class="left">
<nz-collapse>
<nz-collapse-panel
[nzHeader]="'Basic Components'"
[nzActive]="true"
>
<app-collapse-item-list
[fields]="basicArray"
(generateKey)="generateKey($event.list, $event.index)"
></app-collapse-item-list>
</nz-collapse-panel>
<nz-collapse-panel [nzHeader]="'Layout Components'" [nzActive]="true">
<app-collapse-item-list
[fields]="layoutArray"
(generateKey)="generateKey($event.list, $event.index)"
></app-collapse-item-list>
</nz-collapse-panel>
</nz-collapse>
</aside>
<section class="center">
<app-design-form-component-panel
[data]="data"
[selectItem]="selectItem"
(handleSetSelectItem)="handleSetSelectItem($event)"
(saveSchema)="save()"
></app-design-form-component-panel>
</section>
<aside class="right">
<nz-tabset [(nzSelectedIndex)]="activeKey">
<nz-tab nzTitle="Layout Properties">
<app-design-form-properties
[config]="data.config"
></app-design-form-properties>
</nz-tab>
<nz-tab nzTitle="Component Properties">
<app-design-form-item-properties
[selectItem]="selectItem"
[config]="data.config"
></app-design-form-item-properties>
</nz-tab>
</nz-tabset>
</aside>
</div>
`, isInline: true, styles: [".content{height:100%;display:flex}.left,.right{width:300px}.center{flex:1;margin:0 8px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: CollapseItemListComponent, selector: "app-collapse-item-list", inputs: ["fields"], outputs: ["handleStart", "generateKey"] }, { kind: "component", type: DesignFormComponentPanelComponent, selector: "app-design-form-component-panel", inputs: ["data", "selectItem"], outputs: ["handleSetSelectItem", "saveSchema"] }, { kind: "component", type: DesignFormPropertiesComponent, selector: "app-design-form-properties", inputs: ["previewOptions", "config"] }, { kind: "component", type: DesignFormItemPropertiesComponent, selector: "app-design-form-item-properties", inputs: ["selectItem", "hideModel", "config"] }, { kind: "ngmodule", type: FormsModule }, { kind: "ngmodule", type: HttpClientModule }, { kind: "ngmodule", type: DialogModule }, { kind: "ngmodule", type: NzCollapseModule }, { kind: "component", type: i1.NzCollapsePanelComponent, selector: "nz-collapse-panel", inputs: ["nzActive", "nzDisabled", "nzShowArrow", "nzExtra", "nzHeader", "nzExpandedIcon"], outputs: ["nzActiveChange"], exportAs: ["nzCollapsePanel"] }, { kind: "component", type: i1.NzCollapseComponent, selector: "nz-collapse", inputs: ["nzAccordion", "nzBordered", "nzGhost", "nzExpandIconPosition"], exportAs: ["nzCollapse"] }, { kind: "ngmodule", type: NzTabsModule }, { kind: "component", type: i2.NzTabSetComponent, selector: "nz-tabset", inputs: ["nzSelectedIndex", "nzTabPosition", "nzTabBarExtraContent", "nzCanDeactivate", "nzAddIcon", "nzTabBarStyle", "nzType", "nzSize", "nzAnimated", "nzTabBarGutter", "nzHideAdd", "nzCentered", "nzHideAll", "nzLinkRouter", "nzLinkExact"], outputs: ["nzSelectChange", "nzSelectedIndexChange", "nzTabListScroll", "nzClose", "nzAdd"], exportAs: ["nzTabset"] }, { kind: "component", type: i2.NzTabComponent, selector: "nz-tab", inputs: ["nzTitle", "nzClosable", "nzCloseIcon", "nzDisabled", "nzForceRender"], outputs: ["nzSelect", "nzDeselect", "nzClick", "nzContextmenu"], exportAs: ["nzTab"] }, { kind: "ngmodule", type: NzIconModule }, { kind: "ngmodule", type: NzToolTipModule }] }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.10", ngImport: i0, type: NgxAntdFormBuilderComponent, decorators: [{
type: Component,
args: [{ selector: 'ngx-antd-form-builder', standalone: true, imports: [
CommonModule,
DesignFormNodeComponent,
CollapseItemListComponent, DesignFormComponentPanelComponent, LayoutItemComponent,
DesignFormPropertiesComponent, DesignFormItemPropertiesComponent, DesignFormChangeOptionComponent,
FormsModule,
HttpClientModule,
DialogModule,
NzCollapseModule, NzTabsModule, NzIconModule,
NzToolTipModule,
], template: `
<div class="content">
<aside class="left">
<nz-collapse>
<nz-collapse-panel
[nzHeader]="'Basic Components'"
[nzActive]="true"
>
<app-collapse-item-list
[fields]="basicArray"
(generateKey)="generateKey($event.list, $event.index)"
></app-collapse-item-list>
</nz-collapse-panel>
<nz-collapse-panel [nzHeader]="'Layout Components'" [nzActive]="true">
<app-collapse-item-list
[fields]="layoutArray"
(generateKey)="generateKey($event.list, $event.index)"
></app-collapse-item-list>
</nz-collapse-panel>
</nz-collapse>
</aside>
<section class="center">
<app-design-form-component-panel
[data]="data"
[selectItem]="selectItem"
(handleSetSelectItem)="handleSetSelectItem($event)"
(saveSchema)="save()"
></app-design-form-component-panel>
</section>
<aside class="right">
<nz-tabset [(nzSelectedIndex)]="activeKey">
<nz-tab nzTitle="Layout Properties">
<app-design-form-properties
[config]="data.config"
></app-design-form-properties>
</nz-tab>
<nz-tab nzTitle="Component Properties">
<app-design-form-item-properties
[selectItem]="selectItem"
[config]="data.config"
></app-design-form-item-properties>
</nz-tab>
</nz-tabset>
</aside>
</div>
`, styles: [".content{height:100%;display:flex}.left,.right{width:300px}.center{flex:1;margin:0 8px}\n"] }]
}], ctorParameters: () => [], propDecorators: { fields: [{
type: Input
}], json: [{
type: Input
}], saveSchema: [{
type: Output
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LWFudGQtZm9ybS1idWlsZGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1hbnRkLWZvcm0tYnVpbGRlci9zcmMvbGliL25neC1hbnRkLWZvcm0tYnVpbGRlci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDeEQsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBaUIsTUFBTSxlQUFlLENBQUM7QUFDdEYsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzFELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNsRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDeEQsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLHFCQUFxQixDQUFBO0FBQ2hELE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLDhEQUE4RCxDQUFDO0FBQ3pHLE9BQU8sRUFBRSwrQkFBK0IsRUFBRSxNQUFNLDRFQUE0RSxDQUFDO0FBQzdILE9BQU8sRUFBRSxpQ0FBaUMsRUFBRSxNQUFNLGdGQUFnRixDQUFDO0FBQ25JLE9BQU8sRUFBRSxpQ0FBaUMsRUFBRSxNQUFNLGdGQUFnRixDQUFDO0FBQ25JLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLDBEQUEwRCxDQUFDO0FBQ25HLE9BQU8sRUFBRSw2QkFBNkIsRUFBRSxNQUFNLHNFQUFzRSxDQUFDO0FBQ3JILE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGdEQUFnRCxDQUFDO0FBQ3JGLE9BQU8sRUFBRSxhQUFhLEVBQUUsYUFBYSxFQUFFLFVBQVUsRUFBRSxNQUFNLDBCQUEw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Qy9GLFdBQVc7d0JBQ1gsZ0JBQWdCO3dCQUNoQixZQUFZO3dCQUNaLGdCQUFnQixFQUFDLFlBQVksRUFBQyxZQUFZO3dCQUMxQyxlQUFlO3FCQUNoQixZQUNTOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E2Q1Q7d0RBbUJRLE1BQU07c0JBQWQsS0FBSztnQkFDRyxJQUFJO3NCQUFaLEtBQUs7Z0JBQ2EsVUFBVTtzQkFBNUIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEh0dHBDbGllbnRNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XHJcbmltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT3V0cHV0LCBTaW1wbGVDaGFuZ2VzIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBOekNvbGxhcHNlTW9kdWxlIH0gZnJvbSAnbmctem9ycm8tYW50ZC9jb2xsYXBzZSc7XHJcbmltcG9ydCB7IE56VGFic01vZHVsZSB9IGZyb20gJ25nLXpvcnJvLWFudGQvdGFicyc7XHJcbmltcG9ydCB7IE56VG9vbFRpcE1vZHVsZSB9IGZyb20gJ25nLXpvcnJvLWFudGQvdG9vbHRpcCc7XHJcbmltcG9ydCB7RGlhbG9nTW9kdWxlfSBmcm9tICdAYW5ndWxhci9jZGsvZGlhbG9nJ1xyXG5pbXBvcnQgeyBDb2xsYXBzZUl0ZW1MaXN0Q29tcG9uZW50IH0gZnJvbSAnLi9jb21wb25lbnRzL2NvbGxhcHNlLWl0ZW0tbGlzdC9jb2xsYXBzZS1pdGVtLWxpc3QuY29tcG9uZW50JztcclxuaW1wb3J0IHsgRGVzaWduRm9ybUNoYW5nZU9wdGlvbkNvbXBvbmVudCB9IGZyb20gJy4vY29tcG9uZW50cy9kZXNpZ24tZm9ybS1jaGFuZ2Utb3B0aW9uL2Rlc2lnbi1mb3JtLWNoYW5nZS1vcHRpb24uY29tcG9uZW50JztcclxuaW1wb3J0IHsgRGVzaWduRm9ybUNvbXBvbmVudFBhbmVsQ29tcG9uZW50IH0gZnJvbSAnLi9jb21wb25lbnRzL2Rlc2lnbi1mb3JtLWNvbXBvbmVudC1wYW5lbC9kZXNpZ24tZm9ybS1jb21wb25lbnQtcGFuZWwuY29tcG9uZW50JztcclxuaW1wb3J0IHsgRGVzaWduRm9ybUl0ZW1Qcm9wZXJ0aWVzQ29tcG9uZW50IH0gZnJvbSAnLi9jb21wb25lbnRzL2Rlc2lnbi1mb3JtLWl0ZW0tcHJvcGVydGllcy9kZXNpZ24tZm9ybS1pdGVtLXByb3BlcnRpZXMuY29tcG9uZW50JztcclxuaW1wb3J0IHsgRGVzaWduRm9ybU5vZGVDb21wb25lbnQgfSBmcm9tICcuL2NvbXBvbmVudHMvZGVzaWduLWZvcm0tbm9kZS9kZXNpZ24tZm9ybS1ub2RlLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IERlc2lnbkZvcm1Qcm9wZXJ0aWVzQ29tcG9uZW50IH0gZnJvbSAnLi9jb21wb25lbnRzL2Rlc2lnbi1mb3JtLXByb3BlcnRpZXMvZGVzaWduLWZvcm0tcHJvcGVydGllcy5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBMYXlvdXRJdGVtQ29tcG9uZW50IH0gZnJvbSAnLi9jb21wb25lbnRzL2xheW91dC1pdGVtL2xheW91dC1pdGVtLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IENvbXBvbmVudExpc3QsIERlZmF1bHRGaWVsZHMsIExheW91dExpc3QgfSBmcm9tICcuL3V0aWxzL2Zvcm0taXRlbS5jb25maWcnO1xyXG5pbXBvcnQgeyBOZ3hBbnRkRm9ybUJ1aWxkZXIgfSBmcm9tICcuL25neC1hbnRkLWZvcm0tYnVpbGRlci5pbnRlcmZhY2UnO1xyXG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQgeyBOekljb25Nb2R1bGUgfSBmcm9tICduZy16b3Jyby1hbnRkL2ljb24nO1xyXG5pbXBvcnQgeyBjbG9uZURlZXAgfSBmcm9tICcuL3V0aWxzL2Z1bmMnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICduZ3gtYW50ZC1mb3JtLWJ1aWxkZXInLFxyXG4gIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgaW1wb3J0czogW1xyXG4gICAgQ29tbW9uTW9kdWxlLFxyXG4gICAgRGVzaWduRm9ybU5vZGVDb21wb25lbnQsXHJcbiAgICBDb2xsYXBzZUl0ZW1MaXN0Q29tcG9uZW50LERlc2lnbkZvcm1Db21wb25lbnRQYW5lbENvbXBvbmVudCxMYXlvdXRJdGVtQ29tcG9uZW50LFxyXG4gICAgRGVzaWduRm9ybVByb3BlcnRpZXNDb21wb25lbnQsRGVzaWduRm9ybUl0ZW1Qcm9wZXJ0aWVzQ29tcG9uZW50LERlc2lnbkZvcm1DaGFuZ2VPcHRpb25Db21wb25lbnQsXHJcbiAgICBGb3Jtc01vZHVsZSxcclxuICAgIEh0dHBDbGllbnRNb2R1bGUsXHJcbiAgICBEaWFsb2dNb2R1bGUsXHJcbiAgICBOekNvbGxhcHNlTW9kdWxlLE56VGFic01vZHVsZSxOekljb25Nb2R1bGUsXHJcbiAgICBOelRvb2xUaXBNb2R1bGUsXHJcbiAgXSxcclxuICB0ZW1wbGF0ZTogYFxyXG4gIDxkaXYgY2xhc3M9XCJjb250ZW50XCI+XHJcbiAgPGFzaWRlIGNsYXNzPVwibGVmdFwiPlxyXG4gICAgPG56LWNvbGxhcHNlPlxyXG4gICAgICA8bnotY29sbGFwc2UtcGFuZWxcclxuICAgICAgICBbbnpIZWFkZXJdPVwiJ0Jhc2ljIENvbXBvbmVudHMnXCJcclxuICAgICAgICBbbnpBY3RpdmVdPVwidHJ1ZVwiXHJcbiAgICAgID5cclxuICAgICAgICA8YXBwLWNvbGxhcHNlLWl0ZW0tbGlzdFxyXG4gICAgICAgICAgW2ZpZWxkc109XCJiYXNpY0FycmF5XCJcclxuICAgICAgICAgIChnZW5lcmF0ZUtleSk9XCJnZW5lcmF0ZUtleSgkZXZlbnQubGlzdCwgJGV2ZW50LmluZGV4KVwiXHJcbiAgICAgICAgPjwvYXBwLWNvbGxhcHNlLWl0ZW0tbGlzdD5cclxuICAgICAgPC9uei1jb2xsYXBzZS1wYW5lbD5cclxuICAgICAgPG56LWNvbGxhcHNlLXBhbmVsIFtuekhlYWRlcl09XCInTGF5b3V0IENvbXBvbmVudHMnXCIgW256QWN0aXZlXT1cInRydWVcIj5cclxuICAgICAgICA8YXBwLWNvbGxhcHNlLWl0ZW0tbGlzdFxyXG4gICAgICAgICAgW2ZpZWxkc109XCJsYXlvdXRBcnJheVwiXHJcbiAgICAgICAgICAoZ2VuZXJhdGVLZXkpPVwiZ2VuZXJhdGVLZXkoJGV2ZW50Lmxpc3QsICRldmVudC5pbmRleClcIlxyXG4gICAgICAgID48L2FwcC1jb2xsYXBzZS1pdGVtLWxpc3Q+XHJcbiAgICAgIDwvbnotY29sbGFwc2UtcGFuZWw+XHJcbiAgICA8L256LWNvbGxhcHNlPlxyXG4gIDwvYXNpZGU+XHJcbiAgPHNlY3Rpb24gY2xhc3M9XCJjZW50ZXJcIj5cclxuICAgIDxhcHAtZGVzaWduLWZvcm0tY29tcG9uZW50LXBhbmVsXHJcbiAgICAgIFtkYXRhXT1cImRhdGFcIlxyXG4gICAgICBbc2VsZWN0SXRlbV09XCJzZWxlY3RJdGVtXCJcclxuICAgICAgKGhhbmRsZVNldFNlbGVjdEl0ZW0pPVwiaGFuZGxlU2V0U2VsZWN0SXRlbSgkZXZlbnQpXCJcclxuICAgICAgKHNhdmVTY2hlbWEpPVwic2F2ZSgpXCJcclxuICAgID48L2FwcC1kZXNpZ24tZm9ybS1jb21wb25lbnQtcGFuZWw+XHJcbiAgPC9zZWN0aW9uPlxyXG4gIDxhc2lkZSBjbGFzcz1cInJpZ2h0XCI+XHJcbiAgICA8bnotdGFic2V0IFsobnpTZWxlY3RlZEluZGV4KV09XCJhY3RpdmVLZXlcIj5cclxuICAgICAgPG56LXRhYiBuelRpdGxlPVwiTGF5b3V0IFByb3BlcnRpZXNcIj5cclxuICAgICAgICA8YXBwLWRlc2lnbi1mb3JtLXByb3BlcnRpZXNcclxuICAgICAgICAgIFtjb25maWddPVwiZGF0YS5jb25maWdcIlxyXG4gICAgICAgID48L2FwcC1kZXNpZ24tZm9ybS1wcm9wZXJ0aWVzPlxyXG4gICAgICA8L256LXRhYj5cclxuICAgICAgPG56LXRhYiBuelRpdGxlPVwiQ29tcG9uZW50IFByb3BlcnRpZXNcIj5cclxuICAgICAgICA8YXBwLWRlc2lnbi1mb3JtLWl0ZW0tcHJvcGVydGllc1xyXG4gICAgICAgICAgW3NlbGVjdEl0ZW1dPVwic2VsZWN0SXRlbVwiXHJcbiAgICAgICAgICBbY29uZmlnXT1cImRhdGEuY29uZmlnXCJcclxuICAgICAgICA+PC9hcHAtZGVzaWduLWZvcm0taXRlbS1wcm9wZXJ0aWVzPlxyXG4gICAgICA8L256LXRhYj5cclxuICAgIDwvbnotdGFic2V0PlxyXG4gIDwvYXNpZGU+XHJcbjwvZGl2PlxyXG4gIGAsXHJcbiAgc3R5bGVzOiBgXHJcbiAgICAuY29udGVudCB7XHJcbiAgICAgIGhlaWdodDogMTAwJTtcclxuICAgICAgZGlzcGxheTogZmxleDtcclxuICAgIH1cclxuICAgIC5sZWZ0LCAucmlnaHQge1xyXG4gICAgICB3aWR0aDogMzAwcHg7XHJcbiAgICB9XHJcbiAgICAuY2VudGVyIHtcclxuICAgICAgZmxleDogMTtcclxuICAgICAgbWFyZ2luOiAwIDhweCAwO1xyXG4gICAgfVxyXG4gICAgLnJpZ2h0IHtcclxuXHJcbiAgICB9XHJcbiAgYFxyXG59KVxyXG5leHBvcnQgY2xhc3MgTmd4QW50ZEZvcm1CdWlsZGVyQ29tcG9uZW50IHtcclxuICBASW5wdXQoKSBmaWVsZHM6IEFycmF5PHN0cmluZz4gPSBEZWZhdWx0RmllbGRzXHJcbiAgQElucHV0KCkganNvbjogc3RyaW5nIHwgTmd4QW50ZEZvcm1CdWlsZGVyLkNvbmZpZyB8IHVuZGVmaW5lZCB8IG51bGxcclxuICBAT3V0cHV0KCkgcmVhZG9ubHkgc2F2ZVNjaGVtYTogRXZlbnRFbWl0dGVyPE5neEFudGRGb3JtQnVpbGRlci5Db25maWc+ID0gbmV3IEV2ZW50RW1pdHRlcigpXHJcbiAgLy9AVmlld0NoaWxkKCdhcHBEZXNpZ25Gb3JtSXRlbVByb3BlcnRpZXMnKSBwdWJsaWMgYXBwRGVzaWduRm9ybUl0ZW1Qcm9wZXJ0aWVzOiBEZXNpZ25Gb3JtSXRlbVByb3BlcnRpZXNDb21wb25lbnQ7XHJcbiAgLy9ASW5wdXQoKSBpbml0RGF0YTogYW55XHJcbiAgYmFzaWNBcnJheTogQXJyYXk8Tmd4QW50ZEZvcm1CdWlsZGVyLkFsbENvbXBvbmVudFR5cGU+ID0gQ29tcG9uZW50TGlzdC5maWx0ZXIoaXRlbSA9PiB0aGlzLmZpZWxkcy5pbmNsdWRlcyhpdGVtLnR5cGUpKTtcclxuICBsYXlvdXRBcnJheTogIEFycmF5PE5neEFudGRGb3JtQnVpbGRlci5BbGxMYXlvdXQ+ID0gTGF5b3V0TGlzdC5maWx0ZXIoaXRlbSA9PiB0aGlzLmZpZWxkcy5pbmNsdWRlcyhpdGVtLnR5cGUpKTtcclxuXHJcbiAgZGF0YTogTmd4QW50ZEZvcm1CdWlsZGVyLkNvbmZpZyA9IHtcclxuICAgIGxpc3Q6IFtdLFxyXG4gICAgY29uZmlnOiB7XHJcbiAgICAgIFwibGF5b3V0XCI6IFwiaG9yaXpvbnRhbFwiLFxyXG4gICAgICBcImxhYmVsQ29sXCI6IHtcclxuICAgICAgICBcInhzXCI6IDQsXHJcbiAgICAgICAgXCJzbVwiOiA0LFxyXG4gICAgICAgIFwibWRcIjogNCxcclxuICAgICAgICBcImxnXCI6IDQsXHJcbiAgICAgICAgXCJ4bFwiOiA0LFxyXG4gICAgICAgIFwieHhsXCI6IDRcclxuICAgICAgfSxcclxuICAgICAgXCJsYWJlbFdpZHRoXCI6IDEwMCxcclxuICAgICAgXCJsYWJlbExheW91dFwiOiBcImZsZXhcIixcclxuICAgICAgXCJ3cmFwcGVyQ29sXCI6IHtcclxuICAgICAgICBcInhzXCI6IDE4LFxyXG4gICAgICAgIFwic21cIjogMTgsXHJcbiAgICAgICAgXCJtZFwiOiAxOCxcclxuICAgICAgICBcImxnXCI6IDE4LFxyXG4gICAgICAgIFwieGxcIjogMTgsXHJcbiAgICAgICAgXCJ4eGxcIjogMThcclxuICAgICAgfSxcclxuICAgIH1cclxuICB9XHJcbiAgc2VsZWN0SXRlbTogYW55ID0ge1xyXG4gICAga2V5OiBcIlwiXHJcbiAgfVxyXG4gIGFjdGl2ZUtleTogbnVtYmVyID0gMDtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgKSB7XHJcbiAgfVxyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICB9XHJcblxyXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcclxuICAgIGlmIChjaGFuZ2VzWydmaWVsZHMnXSkge1xyXG4gICAgICB0aGlzLmJhc2ljQXJyYXkgPSBDb21wb25lbnRMaXN0LmZpbHRlcihpdGVtID0+IHRoaXMuZmllbGRzLmluY2x1ZGVzKGl0ZW0udHlwZSkpXHJcbiAgICAgIHRoaXMubGF5b3V0QXJyYXkgPSBMYXlvdXRMaXN0LmZpbHRlcihpdGVtID0+IHRoaXMuZmllbGRzLmluY2x1ZGVzKGl0ZW0udHlwZSkpO1xyXG4gICAgfVxyXG4gICAgaWYgKGNoYW5nZXNbJ2pzb24nXSAmJiBjaGFuZ2VzWydqc29uJ10uY3VycmVudFZhbHVlKSB7XHJcbiAgICAgIGlmICh0eXBlb2YgY2hhbmdlc1snanNvbiddLmN1cnJlbnRWYWx1ZSA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgdGhpcy5pbml0KEpTT04ucGFyc2UoY2hhbmdlc1snanNvbiddLmN1cnJlbnRWYWx1ZSkpXHJcbiAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgY29uc29sZS5lcnJvcihlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5pbml0KHRoaXMuanNvbilcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGluaXQoZGF0YSkge1xyXG4gICAgdGhpcy5kYXRhID0gY2xvbmVEZWVwKGRhdGEpXHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcmVjdXJzaXZlR2V0Q29tcG9uZW50TGlzdCgpIHtcclxuICAgIGNvbnN0IGxpc3Q6IEFycmF5PE5neEFudGRGb3JtQnVpbGRlci5BbGxUeXBlPiA9IFtdXHJcbiAgICBjb25zdCByZWN1cnNpdmVQdXNoID0gKGl0ZW06IE5neEFudGRGb3JtQnVpbGRlci5BbGxUeXBlKSA9PiB7XHJcbiAgICAgIGlmICggJ2NhcmQnID09IGl0ZW0udHlwZSkge1xyXG4gICAgICAgIGl0ZW0ubGlzdC5mb3JFYWNoKHJlY3Vyc2l2ZVB1c2gpXHJcbiAgICAgIH0gZWxzZSBpZiAoaXRlbS50eXBlID09ICd0YWJzJyB8fCBpdGVtLnR5cGUgPT0gJ2dyaWQnIHx8IGl0ZW0udHlwZSA9PSAnY29sbGFwc2UnKSB7XHJcbiAgICAgICAgaXRlbS5jb2x1bW5zLmZvckVhY2goY29sID0+IHtcclxuICAgICAgICAgIGNvbC5saXN0LmZvckVhY2gocmVjdXJzaXZlUHVzaClcclxuICAgICAgICB9KVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGxpc3QucHVzaChpdGVtKVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICB0aGlzLmRhdGEubGlzdC5mb3JFYWNoKHJlY3Vyc2l2ZVB1c2gpXHJcbiAgICByZXR1cm4gbGlzdFxyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldERhdGEoKSB7XHJcbiAgICByZXR1cm4gY2xvbmVEZWVwKHRoaXMuZGF0YSlcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRKc29uU2NoZW1hKCkge1xyXG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHRoaXMuZGF0YSwgbnVsbCwgXCJcXHRcIilcclxuICB9XHJcblxyXG4gIHNhdmUoKSB7XHJcbiAgICB0aGlzLnNhdmVTY2hlbWEuZW1pdCh0aGlzLmdldERhdGEoKSlcclxuICB9XHJcblxyXG4gIGdlbmVyYXRlS2V5KGxpc3QsIGluZGV4KSB7XHJcbiAgICBjb25zdCBrZXkgPSBsaXN0W2luZGV4XS50eXBlICsgXCJfXCIgKyBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcclxuICAgIGxpc3RbaW5kZXhdLmtleSAgPSBrZXlcclxuICB9XHJcblxyXG4gIGhhbmRsZVNldFNlbGVjdEl0ZW0ocmVjb3JkKSB7XHJcbiAgICB0aGlzLnNlbGVjdEl0ZW0gPSByZWNvcmQ7XHJcbiAgICBpZiAocmVjb3JkLmtleSkge1xyXG4gICAgICB0aGlzLmNoYW5nZVRhYigyKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuY2hhbmdlVGFiKDEpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY2hhbmdlVGFiKGUpIHtcclxuICAgIHRoaXMuYWN0aXZlS2V5ID0gZTtcclxuICB9XHJcbn1cclxuXHJcbiJdfQ==