kwikid-forms 0.3.20 → 0.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bundles/kwikid-forms.umd.js +8985 -7725
- package/bundles/kwikid-forms.umd.js.map +1 -1
- package/esm2015/lib/builder/builder.component.js +2 -2
- package/esm2015/lib/builder/builder.module.js +8 -11
- package/esm2015/lib/builder/element-config-editor/editors/basic/radio-config.editor.component.js +10 -10
- package/esm2015/lib/builder/element-config-editor/editors/basic/select-config.editor.component.js +302 -0
- package/esm2015/lib/builder/element-config-editor/editors/basic/text-config.editor.component.js +6 -6
- package/esm2015/lib/builder/element-config-editor/editors/basic-element-config.editor.component.js +25 -25
- package/esm2015/lib/builder/element-config-editor/editors/document/pan-number-config.editor.component.js +6 -6
- package/esm2015/lib/builder/element-config-editor/editors/document-element-config.editor.component.js +18 -18
- package/esm2015/lib/builder/shared/elements.js +12 -3
- package/esm2015/lib/builder2/builder-form-editor/builder-form-editor.component.js +268 -0
- package/esm2015/lib/builder2/builder-form-editor/builder-form-editor.module.js +38 -0
- package/esm2015/lib/builder2/builder-form-editor/builder-form-editor.pipe.js +19 -0
- package/esm2015/lib/builder2/builder-form-editor/builder.form-editor.constants.js +178 -0
- package/esm2015/lib/builder2/builder-form-list/builder-forms-list.component.js +85 -0
- package/esm2015/lib/builder2/builder-form-list/builder-forms-list.module.js +37 -0
- package/esm2015/lib/builder2/builder2.component.js +169 -0
- package/esm2015/lib/builder2/builder2.module.js +46 -0
- package/esm2015/lib/kwikid-forms.module.js +16 -4
- package/esm2015/lib/renderer/config-converter.helper.js +86 -9
- package/esm2015/lib/renderer/form-view/definitions/form-view.fields.definition.js +4 -1
- package/esm2015/lib/renderer/form-view/form-view.component.js +200 -31
- package/esm2015/lib/renderer/form-view/helpers/form-view.fields.helper.js +17 -2
- package/esm2015/lib/renderer/forms-list/forms-list.component.js +6 -4
- package/esm2015/lib/renderer/renderer.component.js +73 -25
- package/esm2015/lib/renderer/renderer.definitions.js +6 -0
- package/esm2015/public_api.js +3 -1
- package/fesm2015/kwikid-forms.js +1304 -181
- package/fesm2015/kwikid-forms.js.map +1 -1
- package/lib/builder/builder.module.d.ts +2 -2
- package/lib/builder/element-config-editor/editors/basic/{dropdown-with-search-config.editor.component.d.ts → select-config.editor.component.d.ts} +5 -5
- package/lib/builder2/builder-form-editor/builder-form-editor.component.d.ts +48 -0
- package/lib/builder2/builder-form-editor/builder-form-editor.module.d.ts +12 -0
- package/lib/builder2/builder-form-editor/builder-form-editor.pipe.d.ts +7 -0
- package/lib/builder2/builder-form-editor/builder.form-editor.constants.d.ts +620 -0
- package/lib/builder2/builder-form-list/builder-forms-list.component.d.ts +19 -0
- package/lib/builder2/builder-form-list/builder-forms-list.module.d.ts +11 -0
- package/lib/builder2/builder2.component.d.ts +37 -0
- package/lib/builder2/builder2.module.d.ts +13 -0
- package/lib/kwikid-forms.module.d.ts +3 -2
- package/lib/renderer/form-view/definitions/form-view.fields.definition.d.ts +10 -7
- package/lib/renderer/form-view/form-view.component.d.ts +20 -3
- package/lib/renderer/form-view/helpers/form-view.fields.helper.d.ts +1 -0
- package/lib/renderer/renderer.definitions.d.ts +5 -0
- package/package.json +3 -16
- package/public_api.d.ts +2 -0
- package/esm2015/lib/builder/element-config-editor/editors/basic/dropdown-with-search-config.editor.component.js +0 -302
|
@@ -0,0 +1,268 @@
|
|
|
1
|
+
import { __decorate } from "tslib";
|
|
2
|
+
import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output } from "@angular/core";
|
|
3
|
+
import { FormControl, FormGroup } from "@angular/forms";
|
|
4
|
+
import { checkObjectKeyExists, getObjectValueFromPath, logMethod, mergeObjects, setValueToObjectPath } from "kwikid-toolkit";
|
|
5
|
+
import _ from "lodash";
|
|
6
|
+
import { FIELD_PROPERTIES_CONFIG, FIELD_VALIDATORS_CONFIG, OPTIONS, TABLE_COLUMNS } from "./builder.form-editor.constants";
|
|
7
|
+
import { animate, style, transition, trigger } from "@angular/animations";
|
|
8
|
+
import * as i0 from "@angular/core";
|
|
9
|
+
import * as i1 from "@angular/common";
|
|
10
|
+
import * as i2 from "@angular/forms";
|
|
11
|
+
export class KwikIDBuilderFormEditorComponent {
|
|
12
|
+
constructor() {
|
|
13
|
+
this.activeFormConfig = {};
|
|
14
|
+
this.onClickSaveActiveFormConfig = new EventEmitter();
|
|
15
|
+
this.activeEditor = "fields";
|
|
16
|
+
this.activeFormConfig_Fields = [];
|
|
17
|
+
this.activeFormConfig_NoFields = {};
|
|
18
|
+
this.loader = false;
|
|
19
|
+
this.rows = [];
|
|
20
|
+
this.columns = TABLE_COLUMNS;
|
|
21
|
+
this.showPreview = false;
|
|
22
|
+
// Constants
|
|
23
|
+
this.options = OPTIONS;
|
|
24
|
+
this.fieldValidators = FIELD_VALIDATORS_CONFIG;
|
|
25
|
+
this.fieldProperties = FIELD_PROPERTIES_CONFIG;
|
|
26
|
+
// Forms
|
|
27
|
+
this.formGroup = {};
|
|
28
|
+
}
|
|
29
|
+
ngOnInit() { }
|
|
30
|
+
ngOnChanges(changes) {
|
|
31
|
+
const verifyChange = (key) => {
|
|
32
|
+
return checkObjectKeyExists(changes, key) && !changes[key].firstChange;
|
|
33
|
+
};
|
|
34
|
+
if (verifyChange("activeFormConfig")) {
|
|
35
|
+
this.activeFormConfig = changes.activeFormConfig.currentValue;
|
|
36
|
+
this.initializeActiveFormConfig(this.activeFormConfig);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
initializeActiveFormConfig(activeFormConfig) {
|
|
40
|
+
this.loader = true;
|
|
41
|
+
this.activeFormConfig_Fields = JSON.parse(JSON.stringify(activeFormConfig.fields));
|
|
42
|
+
this.activeFormConfig_NoFields = JSON.parse(JSON.stringify(activeFormConfig));
|
|
43
|
+
delete this.activeFormConfig_NoFields.fields;
|
|
44
|
+
this.rows = this.activeFormConfig_Fields.map((field) => {
|
|
45
|
+
return {
|
|
46
|
+
key: field.key,
|
|
47
|
+
label: field.label,
|
|
48
|
+
type: field.type,
|
|
49
|
+
disabled: field.disabled,
|
|
50
|
+
validators: Object.assign(Object.assign({}, this.fieldValidators), field.validators),
|
|
51
|
+
properties: Object.assign(Object.assign({}, this.fieldProperties[field.type]), field.properties)
|
|
52
|
+
};
|
|
53
|
+
});
|
|
54
|
+
// Create the nested FormGroup dynamically
|
|
55
|
+
this.formGroup = this.createNestedFormGroup(this.rows);
|
|
56
|
+
console.log(this.formGroup);
|
|
57
|
+
this.loader = false;
|
|
58
|
+
}
|
|
59
|
+
createNestedFormGroup(object) {
|
|
60
|
+
const formGroup = {};
|
|
61
|
+
for (let index in object) {
|
|
62
|
+
formGroup[index] = new FormControl(object[index]);
|
|
63
|
+
}
|
|
64
|
+
return new FormGroup(formGroup);
|
|
65
|
+
}
|
|
66
|
+
handleOnClickChangeEditor(editorType) {
|
|
67
|
+
this.activeEditor = editorType;
|
|
68
|
+
}
|
|
69
|
+
handleOnClickSaveActiveFormConfig_NoFields(e) {
|
|
70
|
+
this.activeFormConfig_NoFields = JSON.parse(e);
|
|
71
|
+
}
|
|
72
|
+
handleOnInput(e) {
|
|
73
|
+
const fieldConfig = this.formGroup.getRawValue()[e.index];
|
|
74
|
+
const finalPath = e.path !== "" ? `${e.path}.${e.key}` : e.key;
|
|
75
|
+
let newFieldConfig = setValueToObjectPath(fieldConfig, finalPath, e.value.new);
|
|
76
|
+
// Update properties config if type is changed
|
|
77
|
+
if (e.key === "type") {
|
|
78
|
+
this.loader = true;
|
|
79
|
+
const updatedPropertiesConfig = Object.assign({}, FIELD_PROPERTIES_CONFIG[e.value.new]);
|
|
80
|
+
newFieldConfig = Object.assign(Object.assign({}, newFieldConfig), { properties: updatedPropertiesConfig });
|
|
81
|
+
// Update properties config in this.rows as well
|
|
82
|
+
const rowIndex = this.rows.findIndex((row) => row.key === fieldConfig.key);
|
|
83
|
+
if (rowIndex !== -1) {
|
|
84
|
+
this.rows[rowIndex].properties = updatedPropertiesConfig;
|
|
85
|
+
}
|
|
86
|
+
this.loader = false;
|
|
87
|
+
}
|
|
88
|
+
this.formGroup.controls[e.index].setValue(newFieldConfig, {
|
|
89
|
+
emitEvent: false
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
handleOnClickPreview() {
|
|
93
|
+
this.showPreview = true;
|
|
94
|
+
}
|
|
95
|
+
handleOnClickAddField() { }
|
|
96
|
+
handleOnClickDeleteField(e) {
|
|
97
|
+
this.rows = this.rows.filter((row) => {
|
|
98
|
+
if (row.key !== e.key) {
|
|
99
|
+
return row;
|
|
100
|
+
}
|
|
101
|
+
});
|
|
102
|
+
console.log(JSON.parse(JSON.stringify(this.rows)));
|
|
103
|
+
// Create the nested FormGroup dynamically
|
|
104
|
+
this.formGroup = this.createNestedFormGroup(this.rows);
|
|
105
|
+
console.log(this.formGroup);
|
|
106
|
+
this.formGroup.updateValueAndValidity();
|
|
107
|
+
}
|
|
108
|
+
handleOnClickSaveActiveFormConfig() {
|
|
109
|
+
// print deep copies of rows and activeFormFields_Fields
|
|
110
|
+
this.activeFormConfig_Fields = this.activeFormConfig_Fields
|
|
111
|
+
.filter((field) => _.some(this.rows, { key: field.key }))
|
|
112
|
+
.map((field) => {
|
|
113
|
+
const matchingRow = _.find(this.rows, { key: field.key });
|
|
114
|
+
return _.merge({}, field, matchingRow);
|
|
115
|
+
});
|
|
116
|
+
this.activeFormConfig = mergeObjects(this.activeFormConfig_NoFields, {
|
|
117
|
+
fields: this.activeFormConfig_Fields
|
|
118
|
+
});
|
|
119
|
+
this.onClickSaveActiveFormConfig.emit(this.activeFormConfig);
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Other Methods
|
|
123
|
+
*/
|
|
124
|
+
copyToClipboard() {
|
|
125
|
+
navigator.clipboard.writeText(JSON.stringify(this.activeFormConfig));
|
|
126
|
+
}
|
|
127
|
+
downloadJSON() {
|
|
128
|
+
const DATA = JSON.stringify(this.activeFormConfig); // Convert object to JSON string
|
|
129
|
+
const type = "application/json";
|
|
130
|
+
const FILE_NAME = `${this.activeFormConfig.key}.json`;
|
|
131
|
+
const blob = new Blob([DATA], { type });
|
|
132
|
+
const url = window.URL.createObjectURL(blob);
|
|
133
|
+
const link = document.createElement("a");
|
|
134
|
+
link.download = FILE_NAME;
|
|
135
|
+
link.href = url;
|
|
136
|
+
link.click();
|
|
137
|
+
window.URL.revokeObjectURL(url);
|
|
138
|
+
}
|
|
139
|
+
closeJSONPopup() {
|
|
140
|
+
this.showPreview = false;
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Misc Methods
|
|
144
|
+
*/
|
|
145
|
+
trackByFn(index, item) {
|
|
146
|
+
const key = (item === null || item === void 0 ? void 0 : item.key) || "";
|
|
147
|
+
const value = (item === null || item === void 0 ? void 0 : item.value) || "";
|
|
148
|
+
if (typeof item === "string") {
|
|
149
|
+
return `${String(index)}_${item}_${new Date().getTime()}`;
|
|
150
|
+
}
|
|
151
|
+
else {
|
|
152
|
+
return `${String(index)}_${key}_${value}_${new Date().getTime()}`;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
getOptions(index, value, key, path) {
|
|
156
|
+
if (path.includes("properties")) {
|
|
157
|
+
const fieldType = this.rows[index].type;
|
|
158
|
+
const finalPath = `${path}['${fieldType}'].${key}`;
|
|
159
|
+
return getObjectValueFromPath(this.options, finalPath);
|
|
160
|
+
}
|
|
161
|
+
else {
|
|
162
|
+
const finalPath = path !== "" ? `${path}.${key}` : key;
|
|
163
|
+
return getObjectValueFromPath(this.options, finalPath);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
isOptions(index, value, key, path) {
|
|
167
|
+
if (path.includes("properties")) {
|
|
168
|
+
const fieldType = this.rows[index].type;
|
|
169
|
+
const finalPath = `${path}['${fieldType}'].${key}`;
|
|
170
|
+
return Array.isArray(getObjectValueFromPath(this.options, finalPath));
|
|
171
|
+
}
|
|
172
|
+
else {
|
|
173
|
+
const finalPath = path !== "" ? `${path}.${key}` : key;
|
|
174
|
+
return Array.isArray(getObjectValueFromPath(this.options, finalPath));
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
isBoolean(value) {
|
|
178
|
+
return typeof value === "boolean";
|
|
179
|
+
}
|
|
180
|
+
isString(value) {
|
|
181
|
+
return typeof value === "string";
|
|
182
|
+
}
|
|
183
|
+
isNumber(value) {
|
|
184
|
+
return typeof value === "number";
|
|
185
|
+
}
|
|
186
|
+
isObject(value) {
|
|
187
|
+
return typeof value === "object" && value !== null;
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
/** @nocollapse */ KwikIDBuilderFormEditorComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: KwikIDBuilderFormEditorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
191
|
+
/** @nocollapse */ KwikIDBuilderFormEditorComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.17", type: KwikIDBuilderFormEditorComponent, selector: "kwikid-builder-form-editor", inputs: { activeFormConfig: "activeFormConfig" }, outputs: { onClickSaveActiveFormConfig: "onClickSaveActiveFormConfig" }, usesOnChanges: true, ngImport: i0, template: "<div\n ngClass=\"container\"\n *ngIf=\"activeFormConfig\"\n>\n <header>\n <div>{{ activeFormConfig.title }} Form Editor</div>\n <div ngClass=\"header-form-editor-btns\">\n <button (click)=\"handleOnClickChangeEditor('non-fields')\">\n Edit Non-Fields\n </button>\n <button (click)=\"handleOnClickChangeEditor('fields')\">Edit Fields</button>\n </div>\n </header>\n <main>\n <div\n ngClass=\"form-config-no-fields\"\n *ngIf=\"activeEditor != 'fields'\"\n >\n <pre\n contenteditable=\"true\"\n (keyup)=\"\n handleOnClickSaveActiveFormConfig_NoFields($event.target.innerHTML)\n \"\n >{{ activeFormConfig_NoFields | json }}</pre\n >\n </div>\n <div\n ngClass=\"form-config-fields\"\n *ngIf=\"activeEditor == 'fields'\"\n >\n <table>\n <thead>\n <tr>\n <th *ngFor=\"let column of columns; trackBy: trackByFn\">{{\n column\n }}</th>\n </tr>\n </thead>\n <tbody>\n <ng-container\n *ngFor=\"let row of rows; let i = index; trackBy: trackByFn\"\n >\n <tr>\n <ng-container\n *ngFor=\"\n let column of columns;\n let j = index;\n trackBy: trackByFn\n \"\n >\n <td>\n <div [ngClass]=\"column\">\n <ng-container\n *ngIf=\"column !== 'delete'\"\n [ngTemplateOutlet]=\"getFieldTemplate\"\n [ngTemplateOutletContext]=\"{\n index: i,\n fieldValue: row[column],\n fieldKey: column,\n parentPath: ''\n }\"\n ></ng-container>\n <ng-container *ngIf=\"column === 'delete'\">\n <button\n (click)=\"\n handleOnClickDeleteField({\n index: i,\n key: row['key']\n })\n \"\n [disabled]=\"rows.length === 1\"\n >\n Delete\n </button>\n </ng-container>\n </div>\n </td>\n </ng-container>\n </tr>\n </ng-container>\n </tbody>\n </table>\n </div>\n </main>\n <footer>\n <button (click)=\"handleOnClickPreview()\">Preview</button>\n <button (click)=\"handleOnClickAddField()\">Add Field</button>\n <button (click)=\"handleOnClickSaveActiveFormConfig()\">Save</button>\n </footer>\n</div>\n<div\n ngClass=\"container\"\n *ngIf=\"!activeFormConfig\"\n>\n <h1 ngClass=\"no-form-selected\">Please select a form</h1>\n</div>\n\n<!-- Template for rendering different field types -->\n<ng-template\n #getFieldTemplate\n let-index=\"index\"\n let-value=\"fieldValue\"\n let-key=\"fieldKey\"\n let-path=\"parentPath\"\n>\n <div>\n <ng-container\n [ngTemplateOutlet]=\"\n isObject(value) ? objectFieldTemplate : notObjectFieldTemplate\n \"\n [ngTemplateOutletContext]=\"{\n index: index,\n fieldValue: value,\n fieldKey: key,\n parentPath: path\n }\"\n >\n </ng-container>\n </div>\n</ng-template>\n\n<ng-template\n #objectFieldTemplate\n let-index=\"index\"\n let-value=\"fieldValue\"\n let-key=\"fieldKey\"\n let-path=\"parentPath\"\n>\n <ng-container *ngFor=\"let item of value | keyvalue; trackBy: trackByFn\">\n <ng-container\n [ngTemplateOutlet]=\"getFieldTemplate\"\n [ngTemplateOutletContext]=\"{\n index: index,\n fieldValue: item.value,\n fieldKey: item.key,\n parentPath: path === '' ? key : path + '.' + key\n }\"\n >\n </ng-container>\n </ng-container>\n</ng-template>\n\n<ng-template\n #notObjectFieldTemplate\n let-index=\"index\"\n let-value=\"fieldValue\"\n let-key=\"fieldKey\"\n let-path=\"parentPath\"\n>\n <div>\n <ng-container *ngIf=\"isOptions(index, value, key, path)\">\n <ng-container\n [ngTemplateOutlet]=\"optionFieldTemplate\"\n [ngTemplateOutletContext]=\"{\n index: index,\n key: key,\n value: value,\n path: path,\n options: getOptions(index, value, key, path)\n }\"\n ></ng-container>\n </ng-container>\n <ng-container\n *ngIf=\"!isOptions(index, value, key, path) && isString(value)\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n textFieldTemplate;\n context: { index: index, key: key, value: value, path: path }\n \"\n ></ng-container>\n </ng-container>\n <ng-container\n *ngIf=\"!isOptions(index, value, key, path) && isNumber(value)\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n numberFieldTemplate;\n context: { index: index, key: key, value: value, path: path }\n \"\n ></ng-container>\n </ng-container>\n </div>\n</ng-template>\n\n<ng-template\n #optionFieldTemplate\n let-index=\"index\"\n let-key=\"key\"\n let-value=\"value\"\n let-path=\"path\"\n let-options=\"options\"\n>\n <div class=\"field-container options\">\n <label for=\"\">{{ path }}.{{ key }}</label>\n <select\n (change)=\"handleOnInput({ index, key, value: { previous: value, new: $event.target.value }, path })\"\n >\n <option\n *ngFor=\"let option of options; trackBy: trackByFn\"\n [value]=\"option\"\n [selected]=\"option === value\"\n >{{ option }}</option\n >\n </select>\n </div>\n</ng-template>\n\n<ng-template\n #booleanFieldTemplate\n let-index=\"index\"\n let-key=\"key\"\n let-value=\"value\"\n let-path=\"path\"\n>\n <div class=\"field-container checkbox\">\n <input\n type=\"checkbox\"\n [checked]=\"value\"\n (change)=\"handleOnInput({ index, key, value: { previous: value, new: $event.target.checked }, path })\"\n />\n <span>{{ path }}.{{ key }}</span>\n </div>\n</ng-template>\n\n<ng-template\n #textFieldTemplate\n let-index=\"index\"\n let-key=\"key\"\n let-value=\"value\"\n let-path=\"path\"\n>\n <div class=\"field-container text\">\n <label for=\"\">{{ path }}.{{ key }}</label>\n <input\n placeholder=\"Enter {{ key }}\"\n type=\"text\"\n [value]=\"value\"\n (keyup)=\"handleOnInput({ index, key, value: { previous: value, new: $event.target.value }, path })\"\n />\n </div>\n</ng-template>\n\n<ng-template\n #numberFieldTemplate\n let-index=\"index\"\n let-key=\"key\"\n let-value=\"value\"\n let-path=\"path\"\n>\n <div class=\"field-container number\">\n <label>{{ path }}.{{ key }}</label>\n <input\n placeholder=\"Enter {{ key }}\"\n type=\"number\"\n [value]=\"value\"\n (keyup)=\"handleOnInput({ index, key, value: { previous: value, new: $event.target.value }, path })\"\n />\n </div>\n</ng-template>\n\n<div\n ngClass=\"kwikid-forms-builder-loader\"\n *ngIf=\"loader\"\n>\n <div class=\"loader-container\">\n <span class=\"loader\"></span>\n <div class=\"loader-text\">Please wait</div>\n </div>\n</div>\n\n<div\n class=\"modal\"\n *ngIf=\"showPreview\"\n [@panelInOut]\n>\n <div class=\"modal-box\">\n <div class=\"modal-content\">\n <div class=\"modal-heading\">\n <div class=\"modal-title\">\n {{ activeFormConfig.title }}'s Config Preview\n </div>\n <div class=\"modal-actions\">\n <button (click)=\"downloadJSON()\">Download Config</button>\n <button (click)=\"copyToClipboard()\">Copy Config to Clipboard</button>\n <button (click)=\"closeJSONPopup()\">Close</button>\n </div>\n </div>\n <div class=\"modal-body\">\n <pre>\n <code>{{ activeFormConfig | json }}</code>\n </pre>\n </div>\n </div>\n </div>\n</div>\n", styles: ["input[type=text],input[type=number]{width:100%;padding:6px;border:1px solid #ccc;border-radius:4px;box-sizing:border-box;-webkit-appearance:auto!important;appearance:auto!important}input[type=checkbox]{margin-right:5px;-webkit-appearance:auto!important;appearance:auto!important}select{width:100%;padding:6px;border:1px solid #ccc;border-radius:4px;box-sizing:border-box}textarea{overflow-wrap:anywhere;resize:none;unicode-bidi:embed;white-space:pre-wrap}button{display:inline-block;padding:10px 20px;background-color:#007bff;color:#fff;text-decoration:none;border-radius:4px;border:none;cursor:pointer}button:hover{background-color:#0069d9}button:active{background-color:#0056b3}button:focus{outline:none}.field-container{display:flex;margin-bottom:10px}.field-container label{color:gray}.field-container.checkbox{flex-direction:row;align-items:center}.field-container.options,.field-container.number,.field-container.text{flex-direction:column}.kwikid-forms-builder-loader{position:absolute;top:0;left:0;width:100%;height:100%;background:rgba(211,211,211,.5);display:flex;flex-direction:row;align-content:center;justify-content:center;align-items:center;grid-gap:1rem;gap:1rem;z-index:100}.kwikid-forms-builder-loader .loader-container{display:flex;flex-direction:row;align-content:center;justify-content:center;align-items:center;padding:2em 1.5em;grid-gap:1rem;gap:1rem;background-color:#fff;box-shadow:#959da533 0 8px 24px;border-radius:.5rem}.kwikid-forms-builder-loader .loader-container .loader{width:28px;height:28px;border-radius:50%;display:inline-block;position:relative;border:3px solid;box-sizing:border-box;border-color:var(--tui-primary) transparent transparent;animation:rotation 1s ease-out infinite}@keyframes rotation{0%{transform:rotate(0);animation-timing-function:ease-in}25%{animation-timing-function:linear}50%{transform:rotate(180deg);animation-timing-function:ease-out}75%{animation-timing-function:linear}to{transform:rotate(360deg);animation-timing-function:ease-in}}.kwikid-forms-builder-loader .loader-container .loader-text{font-size:1rem;color:#000;margin:0}.kwikid-forms-builder-loader .t-loader{display:none!important}\n", "::-webkit-scrollbar{width:8px;height:8px}::-webkit-scrollbar-track{border-radius:10px}::-webkit-scrollbar-thumb{background:lightgray;border-radius:10px}::-webkit-scrollbar-thumb:hover{background:gray}:host{all:unset;position:relative;width:100%;height:100%;overflow:auto}.container{display:flex;flex-direction:column;justify-content:space-between;align-items:stretch;height:100%}.container header{padding:.5rem;display:flex;flex-direction:row;align-content:center;justify-content:space-between;align-items:center;border-bottom:1px solid lightgray}.container header .header-form-editor-btns{display:flex;flex-direction:row;align-content:center;justify-content:space-between;align-items:center;grid-gap:1rem;gap:1rem}.container main{padding:.5rem;flex-grow:1;overflow:auto;display:flex;flex-direction:row;justify-content:flex-start;align-items:stretch;grid-gap:1rem;gap:1rem;white-space:nowrap}.container main .form-config-no-fields{overflow:auto;width:100%}.container main .form-config-fields{overflow:auto;width:100%}.container main .validators,.container main .properties{display:flex;flex-direction:column;justify-content:flex-start;align-items:stretch;grid-gap:.5rem;gap:.5rem}.container main .input-checkbox-container{display:flex;flex-direction:row}.container footer{padding:.5rem;display:flex;flex-direction:row;justify-content:flex-end;align-items:stretch;grid-gap:1rem;gap:1rem;border-top:1px solid lightgray}.container .no-form-selected{display:flex;flex-direction:column;align-items:center;justify-content:center;grid-gap:1rem;gap:1rem;flex-grow:1}.modal{position:absolute;top:0;background-color:#0000004d;width:100%;height:100%;display:flex;justify-content:center;align-items:center;left:0;flex-direction:row}.modal-box{width:75%;height:75%;margin:auto;background-color:#fff;border-radius:1rem;box-shadow:#64646f33 0 7px 29px}.modal-content{display:flex;flex-direction:column;align-content:center;justify-content:flex-start;align-items:stretch;width:100%;height:100%}.modal-heading{padding:.5rem 1rem;width:100%;display:flex;flex-direction:row;justify-content:space-between;border-bottom:1px solid lightgray;align-items:center}.modal-title{font-weight:bold;font-size:1rem}.modal-actions{display:flex;flex-direction:row;grid-gap:1rem;gap:1rem;cursor:pointer}.modal-body{overflow:auto}.modal-body pre{padding:1rem}pre{white-space:pre-wrap;overflow:auto}table{width:100%;border-collapse:collapse;margin-bottom:20px}table th,table td{padding:8px;text-align:left;border:1px solid #ccc;vertical-align:top}table th{background-color:#f2f2f2}table tr:nth-child(even){background-color:#f9f9f9}table tr:hover{background-color:#eaeaea}\n"], directives: [{ type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }, { type: i2.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { type: i2.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }], pipes: { "json": i1.JsonPipe, "keyvalue": i1.KeyValuePipe }, animations: [
|
|
192
|
+
trigger("panelInOut", [
|
|
193
|
+
transition(":enter", [
|
|
194
|
+
style({ transform: "translateY(100%)" }),
|
|
195
|
+
animate(150)
|
|
196
|
+
]),
|
|
197
|
+
transition(":leave", [
|
|
198
|
+
animate(100, style({ transform: "translateY(100%)" }))
|
|
199
|
+
])
|
|
200
|
+
])
|
|
201
|
+
], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
202
|
+
__decorate([
|
|
203
|
+
logMethod
|
|
204
|
+
], KwikIDBuilderFormEditorComponent.prototype, "ngOnChanges", null);
|
|
205
|
+
__decorate([
|
|
206
|
+
logMethod
|
|
207
|
+
], KwikIDBuilderFormEditorComponent.prototype, "initializeActiveFormConfig", null);
|
|
208
|
+
__decorate([
|
|
209
|
+
logMethod
|
|
210
|
+
], KwikIDBuilderFormEditorComponent.prototype, "createNestedFormGroup", null);
|
|
211
|
+
__decorate([
|
|
212
|
+
logMethod
|
|
213
|
+
], KwikIDBuilderFormEditorComponent.prototype, "handleOnClickChangeEditor", null);
|
|
214
|
+
__decorate([
|
|
215
|
+
logMethod
|
|
216
|
+
], KwikIDBuilderFormEditorComponent.prototype, "handleOnClickSaveActiveFormConfig_NoFields", null);
|
|
217
|
+
__decorate([
|
|
218
|
+
logMethod
|
|
219
|
+
], KwikIDBuilderFormEditorComponent.prototype, "handleOnInput", null);
|
|
220
|
+
__decorate([
|
|
221
|
+
logMethod
|
|
222
|
+
], KwikIDBuilderFormEditorComponent.prototype, "handleOnClickPreview", null);
|
|
223
|
+
__decorate([
|
|
224
|
+
logMethod
|
|
225
|
+
], KwikIDBuilderFormEditorComponent.prototype, "handleOnClickAddField", null);
|
|
226
|
+
__decorate([
|
|
227
|
+
logMethod
|
|
228
|
+
], KwikIDBuilderFormEditorComponent.prototype, "handleOnClickDeleteField", null);
|
|
229
|
+
__decorate([
|
|
230
|
+
logMethod
|
|
231
|
+
], KwikIDBuilderFormEditorComponent.prototype, "handleOnClickSaveActiveFormConfig", null);
|
|
232
|
+
__decorate([
|
|
233
|
+
logMethod
|
|
234
|
+
], KwikIDBuilderFormEditorComponent.prototype, "copyToClipboard", null);
|
|
235
|
+
__decorate([
|
|
236
|
+
logMethod
|
|
237
|
+
], KwikIDBuilderFormEditorComponent.prototype, "downloadJSON", null);
|
|
238
|
+
__decorate([
|
|
239
|
+
logMethod
|
|
240
|
+
], KwikIDBuilderFormEditorComponent.prototype, "closeJSONPopup", null);
|
|
241
|
+
__decorate([
|
|
242
|
+
logMethod
|
|
243
|
+
], KwikIDBuilderFormEditorComponent.prototype, "trackByFn", null);
|
|
244
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: KwikIDBuilderFormEditorComponent, decorators: [{
|
|
245
|
+
type: Component,
|
|
246
|
+
args: [{
|
|
247
|
+
selector: "kwikid-builder-form-editor",
|
|
248
|
+
templateUrl: "./builder-form-editor.component.html",
|
|
249
|
+
styleUrls: ["../shared.scss", "./builder-form-editor.component.scss"],
|
|
250
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
251
|
+
animations: [
|
|
252
|
+
trigger("panelInOut", [
|
|
253
|
+
transition(":enter", [
|
|
254
|
+
style({ transform: "translateY(100%)" }),
|
|
255
|
+
animate(150)
|
|
256
|
+
]),
|
|
257
|
+
transition(":leave", [
|
|
258
|
+
animate(100, style({ transform: "translateY(100%)" }))
|
|
259
|
+
])
|
|
260
|
+
])
|
|
261
|
+
]
|
|
262
|
+
}]
|
|
263
|
+
}], ctorParameters: function () { return []; }, propDecorators: { activeFormConfig: [{
|
|
264
|
+
type: Input
|
|
265
|
+
}], onClickSaveActiveFormConfig: [{
|
|
266
|
+
type: Output
|
|
267
|
+
}], ngOnChanges: [], initializeActiveFormConfig: [], createNestedFormGroup: [], handleOnClickChangeEditor: [], handleOnClickSaveActiveFormConfig_NoFields: [], handleOnInput: [], handleOnClickPreview: [], handleOnClickAddField: [], handleOnClickDeleteField: [], handleOnClickSaveActiveFormConfig: [], copyToClipboard: [], downloadJSON: [], closeJSONPopup: [], trackByFn: [] } });
|
|
268
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVpbGRlci1mb3JtLWVkaXRvci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9rd2lraWQtZm9ybXMvc3JjL2xpYi9idWlsZGVyMi9idWlsZGVyLWZvcm0tZWRpdG9yL2J1aWxkZXItZm9ybS1lZGl0b3IuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMva3dpa2lkLWZvcm1zL3NyYy9saWIvYnVpbGRlcjIvYnVpbGRlci1mb3JtLWVkaXRvci9idWlsZGVyLWZvcm0tZWRpdG9yLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxZQUFZLEVBQ1osS0FBSyxFQUdMLE1BQU0sRUFFUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3hELE9BQU8sRUFDTCxvQkFBb0IsRUFDcEIsc0JBQXNCLEVBQ3RCLFNBQVMsRUFDVCxZQUFZLEVBQ1osb0JBQW9CLEVBQ3JCLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxDQUFDLE1BQU0sUUFBUSxDQUFDO0FBQ3ZCLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsdUJBQXVCLEVBQ3ZCLE9BQU8sRUFDUCxhQUFhLEVBQ2QsTUFBTSxpQ0FBaUMsQ0FBQztBQUN6QyxPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLE1BQU0scUJBQXFCLENBQUM7Ozs7QUFtQjFFLE1BQU0sT0FBTyxnQ0FBZ0M7SUEwQjNDO1FBeEJBLHFCQUFnQixHQUFRLEVBQUUsQ0FBQztRQUczQixnQ0FBMkIsR0FBc0IsSUFBSSxZQUFZLEVBQU8sQ0FBQztRQUV6RSxpQkFBWSxHQUFXLFFBQVEsQ0FBQztRQUNoQyw0QkFBdUIsR0FBVSxFQUFFLENBQUM7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LENBQUM7b0JBQ3JFLGVBQWUsRUFBRSx1QkFBdUIsQ0FBQyxNQUFNO29CQUMvQyxVQUFVLEVBQUU7d0JBQ1YsT0FBTyxDQUFDLFlBQVksRUFBRTs0QkFDcEIsVUFBVSxDQUFDLFFBQVEsRUFBRTtnQ0FDbkIsS0FBSyxDQUFDLEVBQUUsU0FBUyxFQUFFLGtCQUFrQixFQUFFLENBQUM7Z0NBQ3hDLE9BQU8sQ0FBQyxHQUFHLENBQUM7NkJBQ2IsQ0FBQzs0QkFDRixVQUFVLENBQUMsUUFBUSxFQUFFO2dDQUNuQixPQUFPLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxFQUFFLFNBQVMsRUFBRSxrQkFBa0IsRUFBRSxDQUFDLENBQUM7NkJBQ3ZELENBQUM7eUJBQ0gsQ0FBQztxQkFDSDtpQkFDRjswRUFHQyxnQkFBZ0I7c0JBRGYsS0FBSztnQkFJTiwyQkFBMkI7c0JBRDFCLE1BQU07Z0JBMkJQLFdBQVcsTUFZWCwwQkFBMEIsTUErQjFCLHFCQUFxQixNQVdyQix5QkFBeUIsTUFLekIsMENBQTBDLE1BSzFDLGFBQWEsTUF1Q2Isb0JBQW9CLE1BS3BCLHFCQUFxQixNQUdyQix3QkFBd0IsTUFpQnhCLGlDQUFpQyxNQXFCakMsZUFBZSxNQUtmLFlBQVksTUFlWixjQUFjLE1BUWQsU0FBUyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE9uQ2hhbmdlcyxcbiAgT25Jbml0LFxuICBPdXRwdXQsXG4gIFNpbXBsZUNoYW5nZXNcbn0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7IEZvcm1Db250cm9sLCBGb3JtR3JvdXAgfSBmcm9tIFwiQGFuZ3VsYXIvZm9ybXNcIjtcbmltcG9ydCB7XG4gIGNoZWNrT2JqZWN0S2V5RXhpc3RzLFxuICBnZXRPYmplY3RWYWx1ZUZyb21QYXRoLFxuICBsb2dNZXRob2QsXG4gIG1lcmdlT2JqZWN0cyxcbiAgc2V0VmFsdWVUb09iamVjdFBhdGhcbn0gZnJvbSBcImt3aWtpZC10b29sa2l0XCI7XG5pbXBvcnQgXyBmcm9tIFwibG9kYXNoXCI7XG5pbXBvcnQge1xuICBGSUVMRF9QUk9QRVJUSUVTX0NPTkZJRyxcbiAgRklFTERfVkFMSURBVE9SU19DT05GSUcsXG4gIE9QVElPTlMsXG4gIFRBQkxFX0NPTFVNTlNcbn0gZnJvbSBcIi4vYnVpbGRlci5mb3JtLWVkaXRvci5jb25zdGFudHNcIjtcbmltcG9ydCB7IGFuaW1hdGUsIHN0eWxlLCB0cmFuc2l0aW9uLCB0cmlnZ2VyIH0gZnJvbSBcIkBhbmd1bGFyL2FuaW1hdGlvbnNcIjtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiBcImt3aWtpZC1idWlsZGVyLWZvcm0tZWRpdG9yXCIsXG4gIHRlbXBsYXRlVXJsOiBcIi4vYnVpbGRlci1mb3JtLWVkaXRvci5jb21wb25lbnQuaHRtbFwiLFxuICBzdHlsZVVybHM6IFtcIi4uL3NoYXJlZC5zY3NzXCIsIFwiLi9idWlsZGVyLWZvcm0tZWRpdG9yLmNvbXBvbmVudC5zY3NzXCJdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgYW5pbWF0aW9uczogW1xuICAgIHRyaWdnZXIoXCJwYW5lbEluT3V0XCIsIFtcbiAgICAgIHRyYW5zaXRpb24oXCI6ZW50ZXJcIiwgW1xuICAgICAgICBzdHlsZSh7IHRyYW5zZm9ybTogXCJ0cmFuc2xhdGVZKDEwMCUpXCIgfSksXG4gICAgICAgIGFuaW1hdGUoMTUwKVxuICAgICAgXSksXG4gICAgICB0cmFuc2l0aW9uKFwiOmxlYXZlXCIsIFtcbiAgICAgICAgYW5pbWF0ZSgxMDAsIHN0eWxlKHsgdHJhbnNmb3JtOiBcInRyYW5zbGF0ZVkoMTAwJSlcIiB9KSlcbiAgICAgIF0pXG4gICAgXSlcbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBLd2lrSURCdWlsZGVyRm9ybUVkaXRvckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzIHtcbiAgQElucHV0KClcbiAgYWN0aXZlRm9ybUNvbmZpZzogYW55ID0ge307XG5cbiAgQE91dHB1dCgpXG4gIG9uQ2xpY2tTYXZlQWN0aXZlRm9ybUNvbmZpZzogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcblxuICBhY3RpdmVFZGl0b3I6IHN0cmluZyA9IFwiZmllbGRzXCI7XG4gIGFjdGl2ZUZvcm1Db25maWdfRmllbGRzOiBhbnlbXSA9IFtdO1xuICBhY3RpdmVGb3JtQ29uZmlnX05vRmllbGRzOiBhbnkgPSB7fTtcblxuICBsb2FkZXI6IGJvb2xlYW4gPSBmYWxzZTtcblxuICByb3dzOiBhbnlbXSA9IFtdO1xuICBjb2x1bW5zOiBhbnlbXSA9IFRBQkxFX0NPTFVNTlM7XG5cbiAgc2hvd1ByZXZpZXc6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvLyBDb25zdGFudHNcbiAgb3B0aW9uczogYW55ID0gT1BUSU9OUztcbiAgZmllbGRWYWxpZGF0b3JzOiBhbnkgPSBGSUVMRF9WQUxJREFUT1JTX0NPTkZJRztcbiAgZmllbGRQcm9wZXJ0aWVzOiBhbnkgPSBGSUVMRF9QUk9QRVJUSUVTX0NPTkZJRztcblxuICAvLyBGb3Jtc1xuICBmb3JtR3JvdXA6IGFueSA9IHt9O1xuXG4gIGNvbnN0cnVjdG9yKCkge31cblxuICBuZ09uSW5pdCgpOiB2b2lkIHt9XG5cbiAgQGxvZ01ldGhvZFxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgY29uc3QgdmVyaWZ5Q2hhbmdlID0gKGtleTogc3RyaW5nKSA9PiB7XG4gICAgICByZXR1cm4gY2hlY2tPYmplY3RLZXlFeGlzdHMoY2hhbmdlcywga2V5KSAmJiAhY2hhbmdlc1trZXldLmZpcnN0Q2hhbmdlO1xuICAgIH07XG4gICAgaWYgKHZlcmlmeUNoYW5nZShcImFjdGl2ZUZvcm1Db25maWdcIikpIHtcbiAgICAgIHRoaXMuYWN0aXZlRm9ybUNvbmZpZyA9IGNoYW5nZXMuYWN0aXZlRm9ybUNvbmZpZy5jdXJyZW50VmFsdWU7XG5cbiAgICAgIHRoaXMuaW5pdGlhbGl6ZUFjdGl2ZUZvcm1Db25maWcodGhpcy5hY3RpdmVGb3JtQ29uZmlnKTtcbiAgICB9XG4gIH1cblxuICBAbG9nTWV0aG9kXG4gIGluaXRpYWxpemVBY3RpdmVGb3JtQ29uZmlnKGFjdGl2ZUZvcm1Db25maWc6IGFueSkge1xuICAgIHRoaXMubG9hZGVyID0gdHJ1ZTtcblxuICAgIHRoaXMuYWN0aXZlRm9ybUNvbmZpZ19GaWVsZHMgPSBKU09OLnBhcnNlKFxuICAgICAgSlNPTi5zdHJpbmdpZnkoYWN0aXZlRm9ybUNvbmZpZy5maWVsZHMpXG4gICAgKTtcbiAgICB0aGlzLmFjdGl2ZUZvcm1Db25maWdfTm9GaWVsZHMgPSBKU09OLnBhcnNlKFxuICAgICAgSlNPTi5zdHJpbmdpZnkoYWN0aXZlRm9ybUNvbmZpZylcbiAgICApO1xuICAgIGRlbGV0ZSB0aGlzLmFjdGl2ZUZvcm1Db25maWdfTm9GaWVsZHMuZmllbGRzO1xuXG4gICAgdGhpcy5yb3dzID0gdGhpcy5hY3RpdmVGb3JtQ29uZmlnX0ZpZWxkcy5tYXAoKGZpZWxkOiBhbnkpID0+IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGtleTogZmllbGQua2V5LFxuICAgICAgICBsYWJlbDogZmllbGQubGFiZWwsXG4gICAgICAgIHR5cGU6IGZpZWxkLnR5cGUsXG4gICAgICAgIGRpc2FibGVkOiBmaWVsZC5kaXNhYmxlZCxcbiAgICAgICAgdmFsaWRhdG9yczogeyAuLi50aGlzLmZpZWxkVmFsaWRhdG9ycywgLi4uZmllbGQudmFsaWRhdG9ycyB9LFxuICAgICAgICBwcm9wZXJ0aWVzOiB7IC4uLnRoaXMuZmllbGRQcm9wZXJ0aWVzW2ZpZWxkLnR5cGVdLCAuLi5maWVsZC5wcm9wZXJ0aWVzIH1cbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICAvLyBDcmVhdGUgdGhlIG5lc3RlZCBGb3JtR3JvdXAgZHluYW1pY2FsbHlcbiAgICB0aGlzLmZvcm1Hcm91cCA9IHRoaXMuY3JlYXRlTmVzdGVkRm9ybUdyb3VwKHRoaXMucm93cyk7XG5cbiAgICBjb25zb2xlLmxvZyh0aGlzLmZvcm1Hcm91cCk7XG5cbiAgICB0aGlzLmxvYWRlciA9IGZhbHNlO1xuICB9XG5cbiAgQGxvZ01ldGhvZFxuICBjcmVhdGVOZXN0ZWRGb3JtR3JvdXAob2JqZWN0OiBhbnlbXSk6IEZvcm1Hcm91cCB7XG4gICAgY29uc3QgZm9ybUdyb3VwID0ge307XG5cbiAgICBmb3IgKGxldCBpbmRleCBpbiBvYmplY3QpIHtcbiAgICAgIGZvcm1Hcm91cFtpbmRleF0gPSBuZXcgRm9ybUNvbnRyb2wob2JqZWN0W2luZGV4XSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBGb3JtR3JvdXAoZm9ybUdyb3VwKTtcbiAgfVxuXG4gIEBsb2dNZXRob2RcbiAgaGFuZGxlT25DbGlja0NoYW5nZUVkaXRvcihlZGl0b3JUeXBlOiBzdHJpbmcpIHtcbiAgICB0aGlzLmFjdGl2ZUVkaXRvciA9IGVkaXRvclR5cGU7XG4gIH1cblxuICBAbG9nTWV0aG9kXG4gIGhhbmRsZU9uQ2xpY2tTYXZlQWN0aXZlRm9ybUNvbmZpZ19Ob0ZpZWxkcyhlOiBhbnkpIHtcbiAgICB0aGlzLmFjdGl2ZUZvcm1Db25maWdfTm9GaWVsZHMgPSBKU09OLnBhcnNlKGUpO1xuICB9XG5cbiAgQGxvZ01ldGhvZFxuICBoYW5kbGVPbklucHV0KGU6IGFueSkge1xuICAgIGNvbnN0IGZpZWxkQ29uZmlnID0gdGhpcy5mb3JtR3JvdXAuZ2V0UmF3VmFsdWUoKVtlLmluZGV4XTtcbiAgICBjb25zdCBmaW5hbFBhdGggPSBlLnBhdGggIT09IFwiXCIgPyBgJHtlLnBhdGh9LiR7ZS5rZXl9YCA6IGUua2V5O1xuXG4gICAgbGV0IG5ld0ZpZWxkQ29uZmlnID0gc2V0VmFsdWVUb09iamVjdFBhdGgoXG4gICAgICBmaWVsZENvbmZpZyxcbiAgICAgIGZpbmFsUGF0aCxcbiAgICAgIGUudmFsdWUubmV3XG4gICAgKTtcblxuICAgIC8vIFVwZGF0ZSBwcm9wZXJ0aWVzIGNvbmZpZyBpZiB0eXBlIGlzIGNoYW5nZWRcbiAgICBpZiAoZS5rZXkgPT09IFwidHlwZVwiKSB7XG4gICAgICB0aGlzLmxvYWRlciA9IHRydWU7XG5cbiAgICAgIGNvbnN0IHVwZGF0ZWRQcm9wZXJ0aWVzQ29uZmlnID0ge1xuICAgICAgICAuLi5GSUVMRF9QUk9QRVJUSUVTX0NPTkZJR1tlLnZhbHVlLm5ld11cbiAgICAgIH07XG4gICAgICBuZXdGaWVsZENvbmZpZyA9IHtcbiAgICAgICAgLi4ubmV3RmllbGRDb25maWcsXG4gICAgICAgIHByb3BlcnRpZXM6IHVwZGF0ZWRQcm9wZXJ0aWVzQ29uZmlnXG4gICAgICB9O1xuXG4gICAgICAvLyBVcGRhdGUgcHJvcGVydGllcyBjb25maWcgaW4gdGhpcy5yb3dzIGFzIHdlbGxcbiAgICAgIGNvbnN0IHJvd0luZGV4ID0gdGhpcy5yb3dzLmZpbmRJbmRleChcbiAgICAgICAgKHJvdykgPT4gcm93LmtleSA9PT0gZmllbGRDb25maWcua2V5XG4gICAgICApO1xuICAgICAgaWYgKHJvd0luZGV4ICE9PSAtMSkge1xuICAgICAgICB0aGlzLnJvd3Nbcm93SW5kZXhdLnByb3BlcnRpZXMgPSB1cGRhdGVkUHJvcGVydGllc0NvbmZpZztcbiAgICAgIH1cblxuICAgICAgdGhpcy5sb2FkZXIgPSBmYWxzZTtcbiAgICB9XG5cbiAgICB0aGlzLmZvcm1Hcm91cC5jb250cm9sc1tlLmluZGV4XS5zZXRWYWx1ZShuZXdGaWVsZENvbmZpZywge1xuICAgICAgZW1pdEV2ZW50OiBmYWxzZVxuICAgIH0pO1xuICB9XG5cbiAgQGxvZ01ldGhvZFxuICBoYW5kbGVPbkNsaWNrUHJldmlldygpIHtcbiAgICB0aGlzLnNob3dQcmV2aWV3ID0gdHJ1ZTtcbiAgfVxuXG4gIEBsb2dNZXRob2RcbiAgaGFuZGxlT25DbGlja0FkZEZpZWxkKCkge31cblxuICBAbG9nTWV0aG9kXG4gIGhhbmRsZU9uQ2xpY2tEZWxldGVGaWVsZChlKSB7XG4gICAgdGhpcy5yb3dzID0gdGhpcy5yb3dzLmZpbHRlcigocm93KSA9PiB7XG4gICAgICBpZiAocm93LmtleSAhPT0gZS5rZXkpIHtcbiAgICAgICAgcmV0dXJuIHJvdztcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGNvbnNvbGUubG9nKEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodGhpcy5yb3dzKSkpO1xuXG4gICAgLy8gQ3JlYXRlIHRoZSBuZXN0ZWQgRm9ybUdyb3VwIGR5bmFtaWNhbGx5XG4gICAgdGhpcy5mb3JtR3JvdXAgPSB0aGlzLmNyZWF0ZU5lc3RlZEZvcm1Hcm91cCh0aGlzLnJvd3MpO1xuXG4gICAgY29uc29sZS5sb2codGhpcy5mb3JtR3JvdXApO1xuICAgIHRoaXMuZm9ybUdyb3VwLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcbiAgfVxuXG4gIEBsb2dNZXRob2RcbiAgaGFuZGxlT25DbGlja1NhdmVBY3RpdmVGb3JtQ29uZmlnKCkge1xuICAgIC8vIHByaW50IGRlZXAgY29waWVzIG9mIHJvd3MgYW5kIGFjdGl2ZUZvcm1GaWVsZHNfRmllbGRzXG5cbiAgICB0aGlzLmFjdGl2ZUZvcm1Db25maWdfRmllbGRzID0gdGhpcy5hY3RpdmVGb3JtQ29uZmlnX0ZpZWxkc1xuICAgICAgLmZpbHRlcigoZmllbGQpID0+IF8uc29tZSh0aGlzLnJvd3MsIHsga2V5OiBmaWVsZC5rZXkgfSkpXG4gICAgICAubWFwKChmaWVsZCkgPT4ge1xuICAgICAgICBjb25zdCBtYXRjaGluZ1JvdyA9IF8uZmluZCh0aGlzLnJvd3MsIHsga2V5OiBmaWVsZC5rZXkgfSk7XG4gICAgICAgIHJldHVybiBfLm1lcmdlKHt9LCBmaWVsZCwgbWF0Y2hpbmdSb3cpO1xuICAgICAgfSk7XG5cbiAgICB0aGlzLmFjdGl2ZUZvcm1Db25maWcgPSBtZXJnZU9iamVjdHModGhpcy5hY3RpdmVGb3JtQ29uZmlnX05vRmllbGRzLCB7XG4gICAgICBmaWVsZHM6IHRoaXMuYWN0aXZlRm9ybUNvbmZpZ19GaWVsZHNcbiAgICB9KTtcblxuICAgIHRoaXMub25DbGlja1NhdmVBY3RpdmVGb3JtQ29uZmlnLmVtaXQodGhpcy5hY3RpdmVGb3JtQ29uZmlnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPdGhlciBNZXRob2RzXG4gICAqL1xuICBAbG9nTWV0aG9kXG4gIGNvcHlUb0NsaXBib2FyZCgpIHtcbiAgICBuYXZpZ2F0b3IuY2xpcGJvYXJkLndyaXRlVGV4dChKU09OLnN0cmluZ2lmeSh0aGlzLmFjdGl2ZUZvcm1Db25maWcpKTtcbiAgfVxuXG4gIEBsb2dNZXRob2RcbiAgZG93bmxvYWRKU09OKCkge1xuICAgIGNvbnN0IERBVEEgPSBKU09OLnN0cmluZ2lmeSh0aGlzLmFjdGl2ZUZvcm1Db25maWcpOyAvLyBDb252ZXJ0IG9iamVjdCB0byBKU09OIHN0cmluZ1xuICAgIGNvbnN0IHR5cGUgPSBcImFwcGxpY2F0aW9uL2pzb25cIjtcbiAgICBjb25zdCBGSUxFX05BTUUgPSBgJHt0aGlzLmFjdGl2ZUZvcm1Db25maWcua2V5fS5qc29uYDtcblxuICAgIGNvbnN0IGJsb2IgPSBuZXcgQmxvYihbREFUQV0sIHsgdHlwZSB9KTtcbiAgICBjb25zdCB1cmwgPSB3aW5kb3cuVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTtcbiAgICBjb25zdCBsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImFcIik7XG4gICAgbGluay5kb3dubG9hZCA9IEZJTEVfTkFNRTtcbiAgICBsaW5rLmhyZWYgPSB1cmw7XG4gICAgbGluay5jbGljaygpO1xuICAgIHdpbmRvdy5VUkwucmV2b2tlT2JqZWN0VVJMKHVybCk7XG4gIH1cblxuICBAbG9nTWV0aG9kXG4gIGNsb3NlSlNPTlBvcHVwKCkge1xuICAgIHRoaXMuc2hvd1ByZXZpZXcgPSBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNaXNjIE1ldGhvZHNcbiAgICovXG4gIEBsb2dNZXRob2RcbiAgdHJhY2tCeUZuKGluZGV4OiBudW1iZXIsIGl0ZW06IGFueSk6IGFueSB7XG4gICAgY29uc3Qga2V5ID0gaXRlbT8ua2V5IHx8IFwiXCI7XG4gICAgY29uc3QgdmFsdWUgPSBpdGVtPy52YWx1ZSB8fCBcIlwiO1xuXG4gICAgaWYgKHR5cGVvZiBpdGVtID09PSBcInN0cmluZ1wiKSB7XG4gICAgICByZXR1cm4gYCR7U3RyaW5nKGluZGV4KX1fJHtpdGVtfV8ke25ldyBEYXRlKCkuZ2V0VGltZSgpfWA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBgJHtTdHJpbmcoaW5kZXgpfV8ke2tleX1fJHt2YWx1ZX1fJHtuZXcgRGF0ZSgpLmdldFRpbWUoKX1gO1xuICAgIH1cbiAgfVxuXG4gIGdldE9wdGlvbnMoaW5kZXgsIHZhbHVlLCBrZXksIHBhdGgpIHtcbiAgICBpZiAocGF0aC5pbmNsdWRlcyhcInByb3BlcnRpZXNcIikpIHtcbiAgICAgIGNvbnN0IGZpZWxkVHlwZSA9IHRoaXMucm93c1tpbmRleF0udHlwZTtcblxuICAgICAgY29uc3QgZmluYWxQYXRoID0gYCR7cGF0aH1bJyR7ZmllbGRUeXBlfSddLiR7a2V5fWA7XG5cbiAgICAgIHJldHVybiBnZXRPYmplY3RWYWx1ZUZyb21QYXRoKHRoaXMub3B0aW9ucywgZmluYWxQYXRoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgZmluYWxQYXRoID0gcGF0aCAhPT0gXCJcIiA/IGAke3BhdGh9LiR7a2V5fWAgOiBrZXk7XG5cbiAgICAgIHJldHVybiBnZXRPYmplY3RWYWx1ZUZyb21QYXRoKHRoaXMub3B0aW9ucywgZmluYWxQYXRoKTtcbiAgICB9XG4gIH1cblxuICBpc09wdGlvbnMoaW5kZXgsIHZhbHVlLCBrZXksIHBhdGgpIHtcbiAgICBpZiAocGF0aC5pbmNsdWRlcyhcInByb3BlcnRpZXNcIikpIHtcbiAgICAgIGNvbnN0IGZpZWxkVHlwZSA9IHRoaXMucm93c1tpbmRleF0udHlwZTtcblxuICAgICAgY29uc3QgZmluYWxQYXRoID0gYCR7cGF0aH1bJyR7ZmllbGRUeXBlfSddLiR7a2V5fWA7XG5cbiAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KGdldE9iamVjdFZhbHVlRnJvbVBhdGgodGhpcy5vcHRpb25zLCBmaW5hbFBhdGgpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgZmluYWxQYXRoID0gcGF0aCAhPT0gXCJcIiA/IGAke3BhdGh9LiR7a2V5fWAgOiBrZXk7XG5cbiAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KGdldE9iamVjdFZhbHVlRnJvbVBhdGgodGhpcy5vcHRpb25zLCBmaW5hbFBhdGgpKTtcbiAgICB9XG4gIH1cblxuICBpc0Jvb2xlYW4odmFsdWU6IGFueSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09IFwiYm9vbGVhblwiO1xuICB9XG5cbiAgaXNTdHJpbmcodmFsdWU6IGFueSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCI7XG4gIH1cblxuICBpc051bWJlcih2YWx1ZTogYW55KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIjtcbiAgfVxuXG4gIGlzT2JqZWN0KHZhbHVlOiBhbnkpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmIHZhbHVlICE9PSBudWxsO1xuICB9XG59XG4iLCI8ZGl2XG4gIG5nQ2xhc3M9XCJjb250YWluZXJcIlxuICAqbmdJZj1cImFjdGl2ZUZvcm1Db25maWdcIlxuPlxuICA8aGVhZGVyPlxuICAgIDxkaXY+e3sgYWN0aXZlRm9ybUNvbmZpZy50aXRsZSB9fSBGb3JtIEVkaXRvcjwvZGl2PlxuICAgIDxkaXYgbmdDbGFzcz1cImhlYWRlci1mb3JtLWVkaXRvci1idG5zXCI+XG4gICAgICA8YnV0dG9uIChjbGljayk9XCJoYW5kbGVPbkNsaWNrQ2hhbmdlRWRpdG9yKCdub24tZmllbGRzJylcIj5cbiAgICAgICAgRWRpdCBOb24tRmllbGRzXG4gICAgICA8L2J1dHRvbj5cbiAgICAgIDxidXR0b24gKGNsaWNrKT1cImhhbmRsZU9uQ2xpY2tDaGFuZ2VFZGl0b3IoJ2ZpZWxkcycpXCI+RWRpdCBGaWVsZHM8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgPC9oZWFkZXI+XG4gIDxtYWluPlxuICAgIDxkaXZcbiAgICAgIG5nQ2xhc3M9XCJmb3JtLWNvbmZpZy1uby1maWVsZHNcIlxuICAgICAgKm5nSWY9XCJhY3RpdmVFZGl0b3IgIT0gJ2ZpZWxkcydcIlxuICAgID5cbiAgICAgIDxwcmVcbiAgICAgICAgY29udGVudGVkaXRhYmxlPVwidHJ1ZVwiXG4gICAgICAgIChrZXl1cCk9XCJcbiAgICAgICAgICBoYW5kbGVPbkNsaWNrU2F2ZUFjdGl2ZUZvcm1Db25maWdfTm9GaWVsZHMoJGV2ZW50LnRhcmdldC5pbm5lckhUTUwpXG4gICAgICAgIFwiXG4gICAgICAgID57eyBhY3RpdmVGb3JtQ29uZmlnX05vRmllbGRzIHwganNvbiB9fTwvcHJlXG4gICAgICA+XG4gICAgPC9kaXY+XG4gICAgPGRpdlxuICAgICAgbmdDbGFzcz1cImZvcm0tY29uZmlnLWZpZWxkc1wiXG4gICAgICAqbmdJZj1cImFjdGl2ZUVkaXRvciA9PSAnZmllbGRzJ1wiXG4gICAgPlxuICAgICAgPHRhYmxlPlxuICAgICAgICA8dGhlYWQ+XG4gICAgICAgICAgPHRyPlxuICAgICAgICAgICAgPHRoICpuZ0Zvcj1cImxldCBjb2x1bW4gb2YgY29sdW1uczsgdHJhY2tCeTogdHJhY2tCeUZuXCI+e3tcbiAgICAgICAgICAgICAgY29sdW1uXG4gICAgICAgICAgICB9fTwvdGg+XG4gICAgICAgICAgPC90cj5cbiAgICAgICAgPC90aGVhZD5cbiAgICAgICAgPHRib2R5PlxuICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICpuZ0Zvcj1cImxldCByb3cgb2Ygcm93czsgbGV0IGkgPSBpbmRleDsgdHJhY2tCeTogdHJhY2tCeUZuXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8dHI+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAqbmdGb3I9XCJcbiAgICAgICAgICAgICAgICAgIGxldCBjb2x1bW4gb2YgY29sdW1ucztcbiAgICAgICAgICAgICAgICAgIGxldCBqID0gaW5kZXg7XG4gICAgICAgICAgICAgICAgICB0cmFja0J5OiB0cmFja0J5Rm5cbiAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPHRkPlxuICAgICAgICAgICAgICAgICAgPGRpdiBbbmdDbGFzc109XCJjb2x1bW5cIj5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiY29sdW1uICE9PSAnZGVsZXRlJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwiZ2V0RmllbGRUZW1wbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cIntcbiAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4OiBpLFxuICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRWYWx1ZTogcm93W2NvbHVtbl0sXG4gICAgICAgICAgICAgICAgICAgICAgICBmaWVsZEtleTogY29sdW1uLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50UGF0aDogJydcbiAgICAgICAgICAgICAgICAgICAgICB9XCJcbiAgICAgICAgICAgICAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29sdW1uID09PSAnZGVsZXRlJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlT25DbGlja0RlbGV0ZUZpZWxkKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleDogaSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6IHJvd1sna2V5J11cbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwicm93cy5sZW5ndGggPT09IDFcIlxuICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIERlbGV0ZVxuICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC90Ym9keT5cbiAgICAgIDwvdGFibGU+XG4gICAgPC9kaXY+XG4gIDwvbWFpbj5cbiAgPGZvb3Rlcj5cbiAgICA8YnV0dG9uIChjbGljayk9XCJoYW5kbGVPbkNsaWNrUHJldmlldygpXCI+UHJldmlldzwvYnV0dG9uPlxuICAgIDxidXR0b24gKGNsaWNrKT1cImhhbmRsZU9uQ2xpY2tBZGRGaWVsZCgpXCI+QWRkIEZpZWxkPC9idXR0b24+XG4gICAgPGJ1dHRvbiAoY2xpY2spPVwiaGFuZGxlT25DbGlja1NhdmVBY3RpdmVGb3JtQ29uZmlnKClcIj5TYXZlPC9idXR0b24+XG4gIDwvZm9vdGVyPlxuPC9kaXY+XG48ZGl2XG4gIG5nQ2xhc3M9XCJjb250YWluZXJcIlxuICAqbmdJZj1cIiFhY3RpdmVGb3JtQ29uZmlnXCJcbj5cbiAgPGgxIG5nQ2xhc3M9XCJuby1mb3JtLXNlbGVjdGVkXCI+UGxlYXNlIHNlbGVjdCBhIGZvcm08L2gxPlxuPC9kaXY+XG5cbjwhLS0gVGVtcGxhdGUgZm9yIHJlbmRlcmluZyBkaWZmZXJlbnQgZmllbGQgdHlwZXMgLS0+XG48bmctdGVtcGxhdGVcbiAgI2dldEZpZWxkVGVtcGxhdGVcbiAgbGV0LWluZGV4PVwiaW5kZXhcIlxuICBsZXQtdmFsdWU9XCJmaWVsZFZhbHVlXCJcbiAgbGV0LWtleT1cImZpZWxkS2V5XCJcbiAgbGV0LXBhdGg9XCJwYXJlbnRQYXRoXCJcbj5cbiAgPGRpdj5cbiAgICA8bmctY29udGFpbmVyXG4gICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJcbiAgICAgICAgaXNPYmplY3QodmFsdWUpID8gb2JqZWN0RmllbGRUZW1wbGF0ZSA6IG5vdE9iamVjdEZpZWxkVGVtcGxhdGVcbiAgICAgIFwiXG4gICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwie1xuICAgICAgICBpbmRleDogaW5kZXgsXG4gICAgICAgIGZpZWxkVmFsdWU6IHZhbHVlLFxuICAgICAgICBmaWVsZEtleToga2V5LFxuICAgICAgICBwYXJlbnRQYXRoOiBwYXRoXG4gICAgICB9XCJcbiAgICA+XG4gICAgPC9uZy1jb250YWluZXI+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlXG4gICNvYmplY3RGaWVsZFRlbXBsYXRlXG4gIGxldC1pbmRleD1cImluZGV4XCJcbiAgbGV0LXZhbHVlPVwiZmllbGRWYWx1ZVwiXG4gIGxldC1rZXk9XCJmaWVsZEtleVwiXG4gIGxldC1wYXRoPVwicGFyZW50UGF0aFwiXG4+XG4gIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGl0ZW0gb2YgdmFsdWUgfCBrZXl2YWx1ZTsgdHJhY2tCeTogdHJhY2tCeUZuXCI+XG4gICAgPG5nLWNvbnRhaW5lclxuICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwiZ2V0RmllbGRUZW1wbGF0ZVwiXG4gICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwie1xuICAgICAgICBpbmRleDogaW5kZXgsXG4gICAgICAgIGZpZWxkVmFsdWU6IGl0ZW0udmFsdWUsXG4gICAgICAgIGZpZWxkS2V5OiBpdGVtLmtleSxcbiAgICAgICAgcGFyZW50UGF0aDogcGF0aCA9PT0gJycgPyBrZXkgOiBwYXRoICsgJy4nICsga2V5XG4gICAgICB9XCJcbiAgICA+XG4gICAgPC9uZy1jb250YWluZXI+XG4gIDwvbmctY29udGFpbmVyPlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlXG4gICNub3RPYmplY3RGaWVsZFRlbXBsYXRlXG4gIGxldC1pbmRleD1cImluZGV4XCJcbiAgbGV0LXZhbHVlPVwiZmllbGRWYWx1ZVwiXG4gIGxldC1rZXk9XCJmaWVsZEtleVwiXG4gIGxldC1wYXRoPVwicGFyZW50UGF0aFwiXG4+XG4gIDxkaXY+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImlzT3B0aW9ucyhpbmRleCwgdmFsdWUsIGtleSwgcGF0aClcIj5cbiAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwib3B0aW9uRmllbGRUZW1wbGF0ZVwiXG4gICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7XG4gICAgICAgICAgaW5kZXg6IGluZGV4LFxuICAgICAgICAgIGtleToga2V5LFxuICAgICAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgICAgICBwYXRoOiBwYXRoLFxuICAgICAgICAgIG9wdGlvbnM6IGdldE9wdGlvbnMoaW5kZXgsIHZhbHVlLCBrZXksIHBhdGgpXG4gICAgICAgIH1cIlxuICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgIDwvbmctY29udGFpbmVyPlxuICAgIDxuZy1jb250YWluZXJcbiAgICAgICpuZ0lmPVwiIWlzT3B0aW9ucyhpbmRleCwgdmFsdWUsIGtleSwgcGF0aCkgJiYgaXNTdHJpbmcodmFsdWUpXCJcbiAgICA+XG4gICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiXG4gICAgICAgICAgdGV4dEZpZWxkVGVtcGxhdGU7XG4gICAgICAgICAgY29udGV4dDogeyBpbmRleDogaW5kZXgsIGtleToga2V5LCB2YWx1ZTogdmFsdWUsIHBhdGg6IHBhdGggfVxuICAgICAgICBcIlxuICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgIDwvbmctY29udGFpbmVyPlxuICAgIDxuZy1jb250YWluZXJcbiAgICAgICpuZ0lmPVwiIWlzT3B0aW9ucyhpbmRleCwgdmFsdWUsIGtleSwgcGF0aCkgJiYgaXNOdW1iZXIodmFsdWUpXCJcbiAgICA+XG4gICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiXG4gICAgICAgICAgbnVtYmVyRmllbGRUZW1wbGF0ZTtcbiAgICAgICAgICBjb250ZXh0OiB7IGluZGV4OiBpbmRleCwga2V5OiBrZXksIHZhbHVlOiB2YWx1ZSwgcGF0aDogcGF0aCB9XG4gICAgICAgIFwiXG4gICAgICA+PC9uZy1jb250YWluZXI+XG4gICAgPC9uZy1jb250YWluZXI+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlXG4gICNvcHRpb25GaWVsZFRlbXBsYXRlXG4gIGxldC1pbmRleD1cImluZGV4XCJcbiAgbGV0LWtleT1cImtleVwiXG4gIGxldC12YWx1ZT1cInZhbHVlXCJcbiAgbGV0LXBhdGg9XCJwYXRoXCJcbiAgbGV0LW9wdGlvbnM9XCJvcHRpb25zXCJcbj5cbiAgPGRpdiBjbGFzcz1cImZpZWxkLWNvbnRhaW5lciBvcHRpb25zXCI+XG4gICAgPGxhYmVsIGZvcj1cIlwiPnt7IHBhdGggfX0ue3sga2V5IH19PC9sYWJlbD5cbiAgICA8c2VsZWN0XG4gICAgICAoY2hhbmdlKT1cImhhbmRsZU9uSW5wdXQoeyBpbmRleCwga2V5LCB2YWx1ZTogeyBwcmV2aW91czogdmFsdWUsIG5ldzogJGV2ZW50LnRhcmdldC52YWx1ZSB9LCBwYXRoIH0pXCJcbiAgICA+XG4gICAgICA8b3B0aW9uXG4gICAgICAgICpuZ0Zvcj1cImxldCBvcHRpb24gb2Ygb3B0aW9uczsgdHJhY2tCeTogdHJhY2tCeUZuXCJcbiAgICAgICAgW3ZhbHVlXT1cIm9wdGlvblwiXG4gICAgICAgIFtzZWxlY3RlZF09XCJvcHRpb24gPT09IHZhbHVlXCJcbiAgICAgICAgPnt7IG9wdGlvbiB9fTwvb3B0aW9uXG4gICAgICA+XG4gICAgPC9zZWxlY3Q+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlXG4gICNib29sZWFuRmllbGRUZW1wbGF0ZVxuICBsZXQtaW5kZXg9XCJpbmRleFwiXG4gIGxldC1rZXk9XCJrZXlcIlxuICBsZXQtdmFsdWU9XCJ2YWx1ZVwiXG4gIGxldC1wYXRoPVwicGF0aFwiXG4+XG4gIDxkaXYgY2xhc3M9XCJmaWVsZC1jb250YWluZXIgY2hlY2tib3hcIj5cbiAgICA8aW5wdXRcbiAgICAgIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICBbY2hlY2tlZF09XCJ2YWx1ZVwiXG4gICAgICAoY2hhbmdlKT1cImhhbmRsZU9uSW5wdXQoeyBpbmRleCwga2V5LCB2YWx1ZTogeyBwcmV2aW91czogdmFsdWUsIG5ldzogJGV2ZW50LnRhcmdldC5jaGVja2VkIH0sIHBhdGggfSlcIlxuICAgIC8+XG4gICAgPHNwYW4+e3sgcGF0aCB9fS57eyBrZXkgfX08L3NwYW4+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlXG4gICN0ZXh0RmllbGRUZW1wbGF0ZVxuICBsZXQtaW5kZXg9XCJpbmRleFwiXG4gIGxldC1rZXk9XCJrZXlcIlxuICBsZXQtdmFsdWU9XCJ2YWx1ZVwiXG4gIGxldC1wYXRoPVwicGF0aFwiXG4+XG4gIDxkaXYgY2xhc3M9XCJmaWVsZC1jb250YWluZXIgdGV4dFwiPlxuICAgIDxsYWJlbCBmb3I9XCJcIj57eyBwYXRoIH19Lnt7IGtleSB9fTwvbGFiZWw+XG4gICAgPGlucHV0XG4gICAgICBwbGFjZWhvbGRlcj1cIkVudGVyIHt7IGtleSB9fVwiXG4gICAgICB0eXBlPVwidGV4dFwiXG4gICAgICBbdmFsdWVdPVwidmFsdWVcIlxuICAgICAgKGtleXVwKT1cImhhbmRsZU9uSW5wdXQoeyBpbmRleCwga2V5LCB2YWx1ZTogeyBwcmV2aW91czogdmFsdWUsIG5ldzogJGV2ZW50LnRhcmdldC52YWx1ZSB9LCBwYXRoIH0pXCJcbiAgICAvPlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZVxuICAjbnVtYmVyRmllbGRUZW1wbGF0ZVxuICBsZXQtaW5kZXg9XCJpbmRleFwiXG4gIGxldC1rZXk9XCJrZXlcIlxuICBsZXQtdmFsdWU9XCJ2YWx1ZVwiXG4gIGxldC1wYXRoPVwicGF0aFwiXG4+XG4gIDxkaXYgY2xhc3M9XCJmaWVsZC1jb250YWluZXIgbnVtYmVyXCI+XG4gICAgPGxhYmVsPnt7IHBhdGggfX0ue3sga2V5IH19PC9sYWJlbD5cbiAgICA8aW5wdXRcbiAgICAgIHBsYWNlaG9sZGVyPVwiRW50ZXIge3sga2V5IH19XCJcbiAgICAgIHR5cGU9XCJudW1iZXJcIlxuICAgICAgW3ZhbHVlXT1cInZhbHVlXCJcbiAgICAgIChrZXl1cCk9XCJoYW5kbGVPbklucHV0KHsgaW5kZXgsIGtleSwgdmFsdWU6IHsgcHJldmlvdXM6IHZhbHVlLCBuZXc6ICRldmVudC50YXJnZXQudmFsdWUgfSwgcGF0aCB9KVwiXG4gICAgLz5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuXG48ZGl2XG4gIG5nQ2xhc3M9XCJrd2lraWQtZm9ybXMtYnVpbGRlci1sb2FkZXJcIlxuICAqbmdJZj1cImxvYWRlclwiXG4+XG4gIDxkaXYgY2xhc3M9XCJsb2FkZXItY29udGFpbmVyXCI+XG4gICAgPHNwYW4gY2xhc3M9XCJsb2FkZXJcIj48L3NwYW4+XG4gICAgPGRpdiBjbGFzcz1cImxvYWRlci10ZXh0XCI+UGxlYXNlIHdhaXQ8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj5cblxuPGRpdlxuICBjbGFzcz1cIm1vZGFsXCJcbiAgKm5nSWY9XCJzaG93UHJldmlld1wiXG4gIFtAcGFuZWxJbk91dF1cbj5cbiAgPGRpdiBjbGFzcz1cIm1vZGFsLWJveFwiPlxuICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1jb250ZW50XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtaGVhZGluZ1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtdGl0bGVcIj5cbiAgICAgICAgICB7eyBhY3RpdmVGb3JtQ29uZmlnLnRpdGxlIH19J3MgQ29uZmlnIFByZXZpZXdcbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1hY3Rpb25zXCI+XG4gICAgICAgICAgPGJ1dHRvbiAoY2xpY2spPVwiZG93bmxvYWRKU09OKClcIj5Eb3dubG9hZCBDb25maWc8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIChjbGljayk9XCJjb3B5VG9DbGlwYm9hcmQoKVwiPkNvcHkgQ29uZmlnIHRvIENsaXBib2FyZDwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gKGNsaWNrKT1cImNsb3NlSlNPTlBvcHVwKClcIj5DbG9zZTwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWJvZHlcIj5cbiAgICAgICAgPHByZT5cbiAgICAgICAgICA8Y29kZT57eyBhY3RpdmVGb3JtQ29uZmlnIHwganNvbiB9fTwvY29kZT5cbiAgICAgICAgPC9wcmU+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { CommonModule } from "@angular/common";
|
|
2
|
+
import { NgModule } from "@angular/core";
|
|
3
|
+
import { FormsModule, ReactiveFormsModule } from "@angular/forms";
|
|
4
|
+
import { TuiSvgModule } from "@taiga-ui/core";
|
|
5
|
+
import { KwikUIModule } from "kwikui";
|
|
6
|
+
import { KwikIDBuilderFormEditorComponent } from "./builder-form-editor.component";
|
|
7
|
+
import { ValueFormatterPipe } from "./builder-form-editor.pipe";
|
|
8
|
+
import * as i0 from "@angular/core";
|
|
9
|
+
export class KwikIDBuilderFormEditorModule {
|
|
10
|
+
}
|
|
11
|
+
/** @nocollapse */ KwikIDBuilderFormEditorModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: KwikIDBuilderFormEditorModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
|
|
12
|
+
/** @nocollapse */ KwikIDBuilderFormEditorModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: KwikIDBuilderFormEditorModule, declarations: [KwikIDBuilderFormEditorComponent, ValueFormatterPipe], imports: [CommonModule,
|
|
13
|
+
FormsModule,
|
|
14
|
+
ReactiveFormsModule,
|
|
15
|
+
KwikUIModule,
|
|
16
|
+
TuiSvgModule], exports: [KwikIDBuilderFormEditorComponent] });
|
|
17
|
+
/** @nocollapse */ KwikIDBuilderFormEditorModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: KwikIDBuilderFormEditorModule, imports: [[
|
|
18
|
+
CommonModule,
|
|
19
|
+
FormsModule,
|
|
20
|
+
ReactiveFormsModule,
|
|
21
|
+
KwikUIModule,
|
|
22
|
+
TuiSvgModule
|
|
23
|
+
]] });
|
|
24
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: KwikIDBuilderFormEditorModule, decorators: [{
|
|
25
|
+
type: NgModule,
|
|
26
|
+
args: [{
|
|
27
|
+
declarations: [KwikIDBuilderFormEditorComponent, ValueFormatterPipe],
|
|
28
|
+
imports: [
|
|
29
|
+
CommonModule,
|
|
30
|
+
FormsModule,
|
|
31
|
+
ReactiveFormsModule,
|
|
32
|
+
KwikUIModule,
|
|
33
|
+
TuiSvgModule
|
|
34
|
+
],
|
|
35
|
+
exports: [KwikIDBuilderFormEditorComponent]
|
|
36
|
+
}]
|
|
37
|
+
}] });
|
|
38
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVpbGRlci1mb3JtLWVkaXRvci5tb2R1bGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9rd2lraWQtZm9ybXMvc3JjL2xpYi9idWlsZGVyMi9idWlsZGVyLWZvcm0tZWRpdG9yL2J1aWxkZXItZm9ybS1lZGl0b3IubW9kdWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxXQUFXLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNsRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDOUMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUN0QyxPQUFPLEVBQUUsZ0NBQWdDLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUNuRixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQzs7QUFhaEUsTUFBTSxPQUFPLDZCQUE2Qjs7OElBQTdCLDZCQUE2QjsrSUFBN0IsNkJBQTZCLGlCQVZ6QixnQ0FBZ0MsRUFBRSxrQkFBa0IsYUFFakUsWUFBWTtRQUNaLFdBQVc7UUFDWCxtQkFBbUI7UUFDbkIsWUFBWTtRQUNaLFlBQVksYUFFSixnQ0FBZ0M7K0lBRS9CLDZCQUE2QixZQVQvQjtZQUNQLFlBQVk7WUFDWixXQUFXO1lBQ1gsbUJBQW1CO1lBQ25CLFlBQVk7WUFDWixZQUFZO1NBQ2I7NEZBR1UsNkJBQTZCO2tCQVh6QyxRQUFRO21CQUFDO29CQUNSLFlBQVksRUFBRSxDQUFDLGdDQUFnQyxFQUFFLGtCQUFrQixDQUFDO29CQUNwRSxPQUFPLEVBQUU7d0JBQ1AsWUFBWTt3QkFDWixXQUFXO3dCQUNYLG1CQUFtQjt3QkFDbkIsWUFBWTt3QkFDWixZQUFZO3FCQUNiO29CQUNELE9BQU8sRUFBRSxDQUFDLGdDQUFnQyxDQUFDO2lCQUM1QyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gXCJAYW5ndWxhci9jb21tb25cIjtcbmltcG9ydCB7IE5nTW9kdWxlIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7IEZvcm1zTW9kdWxlLCBSZWFjdGl2ZUZvcm1zTW9kdWxlIH0gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zXCI7XG5pbXBvcnQgeyBUdWlTdmdNb2R1bGUgfSBmcm9tIFwiQHRhaWdhLXVpL2NvcmVcIjtcbmltcG9ydCB7IEt3aWtVSU1vZHVsZSB9IGZyb20gXCJrd2lrdWlcIjtcbmltcG9ydCB7IEt3aWtJREJ1aWxkZXJGb3JtRWRpdG9yQ29tcG9uZW50IH0gZnJvbSBcIi4vYnVpbGRlci1mb3JtLWVkaXRvci5jb21wb25lbnRcIjtcbmltcG9ydCB7IFZhbHVlRm9ybWF0dGVyUGlwZSB9IGZyb20gXCIuL2J1aWxkZXItZm9ybS1lZGl0b3IucGlwZVwiO1xuXG5ATmdNb2R1bGUoe1xuICBkZWNsYXJhdGlvbnM6IFtLd2lrSURCdWlsZGVyRm9ybUVkaXRvckNvbXBvbmVudCwgVmFsdWVGb3JtYXR0ZXJQaXBlXSxcbiAgaW1wb3J0czogW1xuICAgIENvbW1vbk1vZHVsZSxcbiAgICBGb3Jtc01vZHVsZSxcbiAgICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxuICAgIEt3aWtVSU1vZHVsZSxcbiAgICBUdWlTdmdNb2R1bGVcbiAgXSxcbiAgZXhwb3J0czogW0t3aWtJREJ1aWxkZXJGb3JtRWRpdG9yQ29tcG9uZW50XVxufSlcbmV4cG9ydCBjbGFzcyBLd2lrSURCdWlsZGVyRm9ybUVkaXRvck1vZHVsZSB7fVxuIl19
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { Pipe } from "@angular/core";
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
export class ValueFormatterPipe {
|
|
4
|
+
transform(value) {
|
|
5
|
+
if (value && typeof value === "object") {
|
|
6
|
+
return JSON.stringify(value);
|
|
7
|
+
}
|
|
8
|
+
else {
|
|
9
|
+
return value;
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
/** @nocollapse */ ValueFormatterPipe.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: ValueFormatterPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe });
|
|
14
|
+
/** @nocollapse */ ValueFormatterPipe.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: ValueFormatterPipe, name: "valueFormatter" });
|
|
15
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: ValueFormatterPipe, decorators: [{
|
|
16
|
+
type: Pipe,
|
|
17
|
+
args: [{ name: "valueFormatter" }]
|
|
18
|
+
}] });
|
|
19
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVpbGRlci1mb3JtLWVkaXRvci5waXBlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMva3dpa2lkLWZvcm1zL3NyYy9saWIvYnVpbGRlcjIvYnVpbGRlci1mb3JtLWVkaXRvci9idWlsZGVyLWZvcm0tZWRpdG9yLnBpcGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLElBQUksRUFBaUIsTUFBTSxlQUFlLENBQUM7O0FBR3BELE1BQU0sT0FBTyxrQkFBa0I7SUFDN0IsU0FBUyxDQUFDLEtBQVU7UUFDbEIsSUFBSSxLQUFLLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFO1lBQ3RDLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUM5QjthQUFNO1lBQ0wsT0FBTyxLQUFLLENBQUM7U0FDZDtJQUNILENBQUM7O21JQVBVLGtCQUFrQjtpSUFBbEIsa0JBQWtCOzRGQUFsQixrQkFBa0I7a0JBRDlCLElBQUk7bUJBQUMsRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBQaXBlLCBQaXBlVHJhbnNmb3JtIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcblxuQFBpcGUoeyBuYW1lOiBcInZhbHVlRm9ybWF0dGVyXCIgfSlcbmV4cG9ydCBjbGFzcyBWYWx1ZUZvcm1hdHRlclBpcGUgaW1wbGVtZW50cyBQaXBlVHJhbnNmb3JtIHtcbiAgdHJhbnNmb3JtKHZhbHVlOiBhbnkpOiBhbnkge1xuICAgIGlmICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh2YWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
|