UNPKG

kwikid-forms

Version:

KwikID's JSON Configuration based Forms Renderer and Builder

162 lines 26.3 kB
import { __awaiter, __decorate } from "tslib"; import { Component, Input } from "@angular/core"; import { checkObjectKeyExists, isNotEmptyValue, logMethod } from "kwikid-toolkit"; import { resolveFormsStorageConfig, resolveFormsStorageObject, resolveFormsStorageString } from "../renderer/helpers/forms-storage.helper"; import { convertFormListConfig } from "./builder.helper"; import * as i0 from "@angular/core"; import * as i1 from "kwikui"; import * as i2 from "./builder-form-list/builder-forms-list.component"; import * as i3 from "./builder-form-editor/builder-form-editor.component"; export class KwikIDFormsBuilderComponent { constructor(loaderService) { this.loaderService = loaderService; this.userConfig = {}; this.reduxData = {}; this.formsList = []; this.activeFormConfig = undefined; } ngOnInit() { var _a; this.reduxData = Object.assign({}, ((_a = this.reduxData) !== null && _a !== void 0 ? _a : {})); const storageConfig = resolveFormsStorageConfig(this.userConfig); const formStepKey = resolveFormsStorageString("formKey", this.reduxData, storageConfig); if (isNotEmptyValue(formStepKey) && checkObjectKeyExists(this.userConfig.userFormFields, formStepKey)) { this.formsList = convertFormListConfig(this.userConfig.userFormFields[formStepKey]); } else if (Array.isArray(this.userConfig.userFormFields)) { this.formsList = convertFormListConfig(this.userConfig.userFormFields); } else { throw new Error(`userFormFields doesn't have a form defined with key: ${formStepKey}`); } } fetchFormConfig(url) { return __awaiter(this, void 0, void 0, function* () { const response = yield fetch(url, { method: "GET" }); const data = yield response.json(); return data; }); } /** * Forms List Listeners */ handleGetFormsList(e) { this.formsList = e.formsList; } handleOnClickSetActiveForm(selectedFormKey) { var _a, _b, _c, _d, _e; return __awaiter(this, void 0, void 0, function* () { this.toggleLoader(true); const activeFormConfig = this.formsList.find((form) => { return form.key === selectedFormKey; }); let formConfig; this.reduxData = Object.assign({}, ((_a = this.reduxData) !== null && _a !== void 0 ? _a : {})); const storageConfig = resolveFormsStorageConfig(this.userConfig); const cachedFormConfig = resolveFormsStorageObject(activeFormConfig.key, this.reduxData, storageConfig); if (cachedFormConfig) { formConfig = cachedFormConfig; } else if (checkObjectKeyExists(activeFormConfig, "props")) { if (checkObjectKeyExists(activeFormConfig.props, "url")) { const formConfigFromUrl = yield this.fetchFormConfig(activeFormConfig.props.url); formConfig = Object.assign(Object.assign({}, activeFormConfig), formConfigFromUrl); } else if (checkObjectKeyExists(activeFormConfig.props, "path") && checkObjectKeyExists(this.userConfig, "backend") && checkObjectKeyExists(this.userConfig.backend, "CONFIG_BASE_URL")) { const url = `${(_c = (_b = this.userConfig) === null || _b === void 0 ? void 0 : _b.backend) === null || _c === void 0 ? void 0 : _c.CONFIG_BASE_URL}${activeFormConfig.props.path}`; const formConfigFromPath = yield this.fetchFormConfig(url); formConfig = Object.assign(Object.assign({}, activeFormConfig), formConfigFromPath); } else if (checkObjectKeyExists(activeFormConfig, "fields")) { formConfig = activeFormConfig; } else { console.error("No Direct URL, No Path with Base URL, No fields key found in Active Form's Config!"); } } else if (checkObjectKeyExists(activeFormConfig, "formContent")) { if (checkObjectKeyExists(activeFormConfig.formContent, "url")) { const formConfigFromUrl = yield this.fetchFormConfig(activeFormConfig.formContent.url); formConfig = Object.assign(Object.assign({}, activeFormConfig), formConfigFromUrl); } else if (checkObjectKeyExists(activeFormConfig.formContent, "path") && checkObjectKeyExists(this.userConfig, "backend") && checkObjectKeyExists(this.userConfig.backend, "CONFIG_BASE_URL")) { const url = `${(_e = (_d = this.userConfig) === null || _d === void 0 ? void 0 : _d.backend) === null || _e === void 0 ? void 0 : _e.CONFIG_BASE_URL}${activeFormConfig.props.path}`; const formConfigFromPath = yield this.fetchFormConfig(url); formConfig = Object.assign(Object.assign({}, activeFormConfig), formConfigFromPath); } else if (checkObjectKeyExists(activeFormConfig, "fields")) { formConfig = activeFormConfig; } else { console.error("No Direct URL, No Path with Base URL, No fields key found in Active Form's Config!"); } } else if (checkObjectKeyExists(activeFormConfig, "fields")) { formConfig = activeFormConfig; } else { console.error("No Direct URL, No Path with Base URL, No fields key found in Active Form's Config!"); } this.activeFormConfig = Object.assign(Object.assign({}, activeFormConfig), formConfig); this.toggleLoader(false); }); } /** * Form Editor Listeners */ handleOnClickSaveActiveFormConfig(activeFormConfig) { this.activeFormConfig = activeFormConfig; this.formsList = this.formsList.map((form) => { if (form.key === activeFormConfig.key) { return activeFormConfig; } return form; }); } toggleLoader(loader) { if (loader) { this.loaderService.show({ fullscreen: true, loaderText: "Please wait" }); } else { this.loaderService.hide(); } } } /** @nocollapse */ KwikIDFormsBuilderComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: KwikIDFormsBuilderComponent, deps: [{ token: i1.KwikUILoaderService }], target: i0.ɵɵFactoryTarget.Component }); /** @nocollapse */ KwikIDFormsBuilderComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.17", type: KwikIDFormsBuilderComponent, selector: "kwikid-forms-builder", inputs: { userConfig: "userConfig", reduxData: "reduxData" }, ngImport: i0, template: "<div class=\"container\">\n <kwikid-builder-forms-list\n [activeFormConfig]=\"this.activeFormConfig\"\n [formsList]=\"this.formsList\"\n (getFormsList)=\"this.handleGetFormsList($event)\"\n (onClickSetActiveForm)=\"this.handleOnClickSetActiveForm($event)\"\n ></kwikid-builder-forms-list>\n <kwikid-builder-form-editor\n [activeFormConfig]=\"activeFormConfig\"\n (onClickSaveActiveFormConfig)=\"\n this.handleOnClickSaveActiveFormConfig($event)\n \"\n ></kwikid-builder-form-editor>\n</div>\n\n<kwikui-loader></kwikui-loader>\n", styles: ["::-webkit-scrollbar{width:8px}::-webkit-scrollbar-track{border-radius:10px}::-webkit-scrollbar-thumb{background:lightgray;border-radius:10px}::-webkit-scrollbar-thumb:hover{background:gray}input[type=text],input[type=number]{width:100%;padding:8px 12px;border:1px solid #ccc;border-radius:4px;box-sizing:border-box;appearance:auto!important}input[type=checkbox]{appearance:auto!important;width:1rem;height:1rem}select{width:100%;padding:8px 12px;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:8px 12px;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}button.secondary{padding:7px 11px;border:1px solid #007bff;background-color:#fff;color:#007bff}button.secondary:hover{background-color:#b7daff}button.secondary:active{background-color:#b7daff}button.secondary:focus{outline:none}.field-container{display:flex}.field-container label{color:gray}.field-container.checkbox{flex-direction:row;align-items:center;justify-content:center;padding:8px 12px;margin:auto}.field-container.options,.field-container.number,.field-container.text{flex-direction:column}.disclaimer{display:flex;flex-direction:column;align-content:center;justify-content:center;align-items:center;color:#121212;width:100%;height:100%}.disclaimer>*:not(:last-child){margin-bottom:1.5rem}.disclaimer .icon{width:3rem;height:3rem;display:flex;flex-direction:row;align-content:center;justify-content:center;align-items:center}.disclaimer.no-form-selected h1{transform:scaleX(-1)}.disclaimer h1{font-size:5rem;font-weight:100}.disclaimer p{font-size:1rem}\n", ":host{all:unset;position:relative;width:100%;height:100%}.container{width:100%;height:100%;display:flex;flex-direction:row;justify-content:space-between;align-items:stretch;padding:1rem}.container>*:not(:last-child){margin-right:1rem}\n"], components: [{ type: i2.KwikIDBuilderFormsListComponent, selector: "kwikid-builder-forms-list", inputs: ["activeFormConfig", "formsList"], outputs: ["onClickSetActiveForm", "getFormsList"] }, { type: i3.KwikIDBuilderFormEditorComponent, selector: "kwikid-builder-form-editor", inputs: ["activeFormConfig"], outputs: ["onClickSaveActiveFormConfig"] }, { type: i1.KwikUILoaderComponent, selector: "kwikui-loader" }] }); __decorate([ logMethod ], KwikIDFormsBuilderComponent.prototype, "fetchFormConfig", null); __decorate([ logMethod ], KwikIDFormsBuilderComponent.prototype, "handleGetFormsList", null); __decorate([ logMethod ], KwikIDFormsBuilderComponent.prototype, "handleOnClickSetActiveForm", null); __decorate([ logMethod ], KwikIDFormsBuilderComponent.prototype, "handleOnClickSaveActiveFormConfig", null); __decorate([ logMethod ], KwikIDFormsBuilderComponent.prototype, "toggleLoader", null); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: KwikIDFormsBuilderComponent, decorators: [{ type: Component, args: [{ selector: "kwikid-forms-builder", templateUrl: "./builder.component.html", styleUrls: ["./shared.scss", "./builder.component.scss"] }] }], ctorParameters: function () { return [{ type: i1.KwikUILoaderService }]; }, propDecorators: { userConfig: [{ type: Input }], reduxData: [{ type: Input }], fetchFormConfig: [], handleGetFormsList: [], handleOnClickSetActiveForm: [], handleOnClickSaveActiveFormConfig: [], toggleLoader: [] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVpbGRlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9rd2lraWQtZm9ybXMvc3JjL2xpYi9idWlsZGVyL2J1aWxkZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMva3dpa2lkLWZvcm1zL3NyYy9saWIvYnVpbGRlci9idWlsZGVyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBVSxNQUFNLGVBQWUsQ0FBQztBQUN6RCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsZUFBZSxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ2xGLE9BQU8sRUFDTCx5QkFBeUIsRUFDekIseUJBQXlCLEVBQ3pCLHlCQUF5QixFQUMxQixNQUFNLDBDQUEwQyxDQUFDO0FBRWxELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLGtCQUFrQixDQUFDOzs7OztBQU96RCxNQUFNLE9BQU8sMkJBQTJCO0lBV3RDLFlBQW1CLGFBQWtDO1FBQWxDLGtCQUFhLEdBQWIsYUFBYSxDQUFxQjtRQVRyRCxlQUFVLEdBQVEsRUFBRSxDQUFDO1FBR3JCLGNBQVMsR0FBUSxFQUFFLENBQUM7UUFFcEIsY0FBUyxHQUFHLEVBQUUsQ0FBQztRQUVmLHFCQUFnQixHQUFRLFNBQVMsQ0FBQztJQUVzQixDQUFDO0lBRXpELFFBQVE7O1FBQ04sSUFBSSxDQUFDLFNBQVMscUJBQVEsQ0FBQyxNQUFBLElBQUksQ0FBQyxTQUFTLG1DQUFJLEVBQUUsQ0FBQyxDQUFFLENBQUM7UUFDL0MsTUFBTSxhQUFhLEdBQUcseUJBQXlCLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ2pFLE1BQU0sV0FBVyxHQUFHLHlCQUF5QixDQUMzQyxTQUFTLEVBQ1QsSUFBSSxDQUFDLFNBQVMsRUFDZCxhQUFhLENBQ2QsQ0FBQztRQUVG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SUFEQyxTQUFTO3FFQUdUO0FBR0Q7SUFEQyxTQUFTOzZFQXdGVDtBQU1EO0lBREMsU0FBUztvRkFVVDtBQUdEO0lBREMsU0FBUzsrREFVVDs0RkF4S1UsMkJBQTJCO2tCQUx2QyxTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSxzQkFBc0I7b0JBQ2hDLFdBQVcsRUFBRSwwQkFBMEI7b0JBQ3ZDLFNBQVMsRUFBRSxDQUFDLGVBQWUsRUFBRSwwQkFBMEIsQ0FBQztpQkFDekQ7MEdBR0MsVUFBVTtzQkFEVCxLQUFLO2dCQUlOLFNBQVM7c0JBRFIsS0FBSztnQkFtQ0EsZUFBZSxNQVVyQixrQkFBa0IsTUFLWiwwQkFBMEIsTUE2RmhDLGlDQUFpQyxNQVlqQyxZQUFZIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT25Jbml0IH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7IGNoZWNrT2JqZWN0S2V5RXhpc3RzLCBpc05vdEVtcHR5VmFsdWUsIGxvZ01ldGhvZCB9IGZyb20gXCJrd2lraWQtdG9vbGtpdFwiO1xuaW1wb3J0IHtcbiAgcmVzb2x2ZUZvcm1zU3RvcmFnZUNvbmZpZyxcbiAgcmVzb2x2ZUZvcm1zU3RvcmFnZU9iamVjdCxcbiAgcmVzb2x2ZUZvcm1zU3RvcmFnZVN0cmluZ1xufSBmcm9tIFwiLi4vcmVuZGVyZXIvaGVscGVycy9mb3Jtcy1zdG9yYWdlLmhlbHBlclwiO1xuaW1wb3J0IHsgS3dpa1VJTG9hZGVyU2VydmljZSB9IGZyb20gXCJrd2lrdWlcIjtcbmltcG9ydCB7IGNvbnZlcnRGb3JtTGlzdENvbmZpZyB9IGZyb20gXCIuL2J1aWxkZXIuaGVscGVyXCI7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogXCJrd2lraWQtZm9ybXMtYnVpbGRlclwiLFxuICB0ZW1wbGF0ZVVybDogXCIuL2J1aWxkZXIuY29tcG9uZW50Lmh0bWxcIixcbiAgc3R5bGVVcmxzOiBbXCIuL3NoYXJlZC5zY3NzXCIsIFwiLi9idWlsZGVyLmNvbXBvbmVudC5zY3NzXCJdXG59KVxuZXhwb3J0IGNsYXNzIEt3aWtJREZvcm1zQnVpbGRlckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIEBJbnB1dCgpXG4gIHVzZXJDb25maWc6IGFueSA9IHt9O1xuXG4gIEBJbnB1dCgpXG4gIHJlZHV4RGF0YTogYW55ID0ge307XG5cbiAgZm9ybXNMaXN0ID0gW107XG5cbiAgYWN0aXZlRm9ybUNvbmZpZzogYW55ID0gdW5kZWZpbmVkO1xuXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBsb2FkZXJTZXJ2aWNlOiBLd2lrVUlMb2FkZXJTZXJ2aWNlKSB7fVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMucmVkdXhEYXRhID0geyAuLi4odGhpcy5yZWR1eERhdGEgPz8ge30pIH07XG4gICAgY29uc3Qgc3RvcmFnZUNvbmZpZyA9IHJlc29sdmVGb3Jtc1N0b3JhZ2VDb25maWcodGhpcy51c2VyQ29uZmlnKTtcbiAgICBjb25zdCBmb3JtU3RlcEtleSA9IHJlc29sdmVGb3Jtc1N0b3JhZ2VTdHJpbmcoXG4gICAgICBcImZvcm1LZXlcIixcbiAgICAgIHRoaXMucmVkdXhEYXRhLFxuICAgICAgc3RvcmFnZUNvbmZpZ1xuICAgICk7XG5cbiAgICBpZiAoXG4gICAgICBpc05vdEVtcHR5VmFsdWUoZm9ybVN0ZXBLZXkpICYmXG4gICAgICBjaGVja09iamVjdEtleUV4aXN0cyh0aGlzLnVzZXJDb25maWcudXNlckZvcm1GaWVsZHMsIGZvcm1TdGVwS2V5KVxuICAgICkge1xuICAgICAgdGhpcy5mb3Jtc0xpc3QgPSBjb252ZXJ0Rm9ybUxpc3RDb25maWcoXG4gICAgICAgIHRoaXMudXNlckNvbmZpZy51c2VyRm9ybUZpZWxkc1tmb3JtU3RlcEtleV1cbiAgICAgICk7XG4gICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHRoaXMudXNlckNvbmZpZy51c2VyRm9ybUZpZWxkcykpIHtcbiAgICAgIHRoaXMuZm9ybXNMaXN0ID0gY29udmVydEZvcm1MaXN0Q29uZmlnKHRoaXMudXNlckNvbmZpZy51c2VyRm9ybUZpZWxkcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYHVzZXJGb3JtRmllbGRzIGRvZXNuJ3QgaGF2ZSBhIGZvcm0gZGVmaW5lZCB3aXRoIGtleTogJHtmb3JtU3RlcEtleX1gXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIEBsb2dNZXRob2RcbiAgYXN5bmMgZmV0Y2hGb3JtQ29uZmlnKHVybDogc3RyaW5nKSB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwsIHsgbWV0aG9kOiBcIkdFVFwiIH0pO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgcmV0dXJuIGRhdGE7XG4gIH1cblxuICAvKipcbiAgICogRm9ybXMgTGlzdCBMaXN0ZW5lcnNcbiAgICovXG4gIEBsb2dNZXRob2RcbiAgaGFuZGxlR2V0Rm9ybXNMaXN0KGU6IGFueSkge1xuICAgIHRoaXMuZm9ybXNMaXN0ID0gZS5mb3Jtc0xpc3Q7XG4gIH1cblxuICBAbG9nTWV0aG9kXG4gIGFzeW5jIGhhbmRsZU9uQ2xpY2tTZXRBY3RpdmVGb3JtKHNlbGVjdGVkRm9ybUtleTogc3RyaW5nKSB7XG4gICAgdGhpcy50b2dnbGVMb2FkZXIodHJ1ZSk7XG5cbiAgICBjb25zdCBhY3RpdmVGb3JtQ29uZmlnID0gdGhpcy5mb3Jtc0xpc3QuZmluZCgoZm9ybSkgPT4ge1xuICAgICAgcmV0dXJuIGZvcm0ua2V5ID09PSBzZWxlY3RlZEZvcm1LZXk7XG4gICAgfSk7XG5cbiAgICBsZXQgZm9ybUNvbmZpZzogYW55O1xuXG4gICAgdGhpcy5yZWR1eERhdGEgPSB7IC4uLih0aGlzLnJlZHV4RGF0YSA/PyB7fSkgfTtcbiAgICBjb25zdCBzdG9yYWdlQ29uZmlnID0gcmVzb2x2ZUZvcm1zU3RvcmFnZUNvbmZpZyh0aGlzLnVzZXJDb25maWcpO1xuICAgIGNvbnN0IGNhY2hlZEZvcm1Db25maWcgPSByZXNvbHZlRm9ybXNTdG9yYWdlT2JqZWN0KFxuICAgICAgYWN0aXZlRm9ybUNvbmZpZy5rZXksXG4gICAgICB0aGlzLnJlZHV4RGF0YSxcbiAgICAgIHN0b3JhZ2VDb25maWdcbiAgICApO1xuXG4gICAgaWYgKGNhY2hlZEZvcm1Db25maWcpIHtcbiAgICAgIGZvcm1Db25maWcgPSBjYWNoZWRGb3JtQ29uZmlnO1xuICAgIH0gZWxzZSBpZiAoY2hlY2tPYmplY3RLZXlFeGlzdHMoYWN0aXZlRm9ybUNvbmZpZywgXCJwcm9wc1wiKSkge1xuICAgICAgaWYgKGNoZWNrT2JqZWN0S2V5RXhpc3RzKGFjdGl2ZUZvcm1Db25maWcucHJvcHMsIFwidXJsXCIpKSB7XG4gICAgICAgIGNvbnN0IGZvcm1Db25maWdGcm9tVXJsID0gYXdhaXQgdGhpcy5mZXRjaEZvcm1Db25maWcoXG4gICAgICAgICAgYWN0aXZlRm9ybUNvbmZpZy5wcm9wcy51cmxcbiAgICAgICAgKTtcbiAgICAgICAgZm9ybUNvbmZpZyA9IHtcbiAgICAgICAgICAuLi5hY3RpdmVGb3JtQ29uZmlnLFxuICAgICAgICAgIC4uLmZvcm1Db25maWdGcm9tVXJsXG4gICAgICAgIH07XG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgICBjaGVja09iamVjdEtleUV4aXN0cyhhY3RpdmVGb3JtQ29uZmlnLnByb3BzLCBcInBhdGhcIikgJiZcbiAgICAgICAgY2hlY2tPYmplY3RLZXlFeGlzdHModGhpcy51c2VyQ29uZmlnLCBcImJhY2tlbmRcIikgJiZcbiAgICAgICAgY2hlY2tPYmplY3RLZXlFeGlzdHModGhpcy51c2VyQ29uZmlnLmJhY2tlbmQsIFwiQ09ORklHX0JBU0VfVVJMXCIpXG4gICAgICApIHtcbiAgICAgICAgY29uc3QgdXJsID0gYCR7dGhpcy51c2VyQ29uZmlnPy5iYWNrZW5kPy5DT05GSUdfQkFTRV9VUkx9JHthY3RpdmVGb3JtQ29uZmlnLnByb3BzLnBhdGh9YDtcbiAgICAgICAgY29uc3QgZm9ybUNvbmZpZ0Zyb21QYXRoID0gYXdhaXQgdGhpcy5mZXRjaEZvcm1Db25maWcodXJsKTtcbiAgICAgICAgZm9ybUNvbmZpZyA9IHtcbiAgICAgICAgICAuLi5hY3RpdmVGb3JtQ29uZmlnLFxuICAgICAgICAgIC4uLmZvcm1Db25maWdGcm9tUGF0aFxuICAgICAgICB9O1xuICAgICAgfSBlbHNlIGlmIChjaGVja09iamVjdEtleUV4aXN0cyhhY3RpdmVGb3JtQ29uZmlnLCBcImZpZWxkc1wiKSkge1xuICAgICAgICBmb3JtQ29uZmlnID0gYWN0aXZlRm9ybUNvbmZpZztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgXCJObyBEaXJlY3QgVVJMLCBObyBQYXRoIHdpdGggQmFzZSBVUkwsIE5vIGZpZWxkcyBrZXkgZm91bmQgaW4gQWN0aXZlIEZvcm0ncyBDb25maWchXCJcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGNoZWNrT2JqZWN0S2V5RXhpc3RzKGFjdGl2ZUZvcm1Db25maWcsIFwiZm9ybUNvbnRlbnRcIikpIHtcbiAgICAgIGlmIChjaGVja09iamVjdEtleUV4aXN0cyhhY3RpdmVGb3JtQ29uZmlnLmZvcm1Db250ZW50LCBcInVybFwiKSkge1xuICAgICAgICBjb25zdCBmb3JtQ29uZmlnRnJvbVVybCA9IGF3YWl0IHRoaXMuZmV0Y2hGb3JtQ29uZmlnKFxuICAgICAgICAgIGFjdGl2ZUZvcm1Db25maWcuZm9ybUNvbnRlbnQudXJsXG4gICAgICAgICk7XG4gICAgICAgIGZvcm1Db25maWcgPSB7XG4gICAgICAgICAgLi4uYWN0aXZlRm9ybUNvbmZpZyxcbiAgICAgICAgICAuLi5mb3JtQ29uZmlnRnJvbVVybFxuICAgICAgICB9O1xuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgY2hlY2tPYmplY3RLZXlFeGlzdHMoYWN0aXZlRm9ybUNvbmZpZy5mb3JtQ29udGVudCwgXCJwYXRoXCIpICYmXG4gICAgICAgIGNoZWNrT2JqZWN0S2V5RXhpc3RzKHRoaXMudXNlckNvbmZpZywgXCJiYWNrZW5kXCIpICYmXG4gICAgICAgIGNoZWNrT2JqZWN0S2V5RXhpc3RzKHRoaXMudXNlckNvbmZpZy5iYWNrZW5kLCBcIkNPTkZJR19CQVNFX1VSTFwiKVxuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IHVybCA9IGAke3RoaXMudXNlckNvbmZpZz8uYmFja2VuZD8uQ09ORklHX0JBU0VfVVJMfSR7YWN0aXZlRm9ybUNvbmZpZy5wcm9wcy5wYXRofWA7XG4gICAgICAgIGNvbnN0IGZvcm1Db25maWdGcm9tUGF0aCA9IGF3YWl0IHRoaXMuZmV0Y2hGb3JtQ29uZmlnKHVybCk7XG4gICAgICAgIGZvcm1Db25maWcgPSB7XG4gICAgICAgICAgLi4uYWN0aXZlRm9ybUNvbmZpZyxcbiAgICAgICAgICAuLi5mb3JtQ29uZmlnRnJvbVBhdGhcbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSBpZiAoY2hlY2tPYmplY3RLZXlFeGlzdHMoYWN0aXZlRm9ybUNvbmZpZywgXCJmaWVsZHNcIikpIHtcbiAgICAgICAgZm9ybUNvbmZpZyA9IGFjdGl2ZUZvcm1Db25maWc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgIFwiTm8gRGlyZWN0IFVSTCwgTm8gUGF0aCB3aXRoIEJhc2UgVVJMLCBObyBmaWVsZHMga2V5IGZvdW5kIGluIEFjdGl2ZSBGb3JtJ3MgQ29uZmlnIVwiXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChjaGVja09iamVjdEtleUV4aXN0cyhhY3RpdmVGb3JtQ29uZmlnLCBcImZpZWxkc1wiKSkge1xuICAgICAgZm9ybUNvbmZpZyA9IGFjdGl2ZUZvcm1Db25maWc7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgIFwiTm8gRGlyZWN0IFVSTCwgTm8gUGF0aCB3aXRoIEJhc2UgVVJMLCBObyBmaWVsZHMga2V5IGZvdW5kIGluIEFjdGl2ZSBGb3JtJ3MgQ29uZmlnIVwiXG4gICAgICApO1xuICAgIH1cblxuICAgIHRoaXMuYWN0aXZlRm9ybUNvbmZpZyA9IHtcbiAgICAgIC4uLmFjdGl2ZUZvcm1Db25maWcsXG4gICAgICAuLi5mb3JtQ29uZmlnXG4gICAgfTtcblxuICAgIHRoaXMudG9nZ2xlTG9hZGVyKGZhbHNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGb3JtIEVkaXRvciBMaXN0ZW5lcnNcbiAgICovXG4gIEBsb2dNZXRob2RcbiAgaGFuZGxlT25DbGlja1NhdmVBY3RpdmVGb3JtQ29uZmlnKGFjdGl2ZUZvcm1Db25maWc6IGFueSkge1xuICAgIHRoaXMuYWN0aXZlRm9ybUNvbmZpZyA9IGFjdGl2ZUZvcm1Db25maWc7XG5cbiAgICB0aGlzLmZvcm1zTGlzdCA9IHRoaXMuZm9ybXNMaXN0Lm1hcCgoZm9ybTogYW55KSA9PiB7XG4gICAgICBpZiAoZm9ybS5rZXkgPT09IGFjdGl2ZUZvcm1Db25maWcua2V5KSB7XG4gICAgICAgIHJldHVybiBhY3RpdmVGb3JtQ29uZmlnO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZvcm07XG4gICAgfSk7XG4gIH1cblxuICBAbG9nTWV0aG9kXG4gIHRvZ2dsZUxvYWRlcihsb2FkZXIpIHtcbiAgICBpZiAobG9hZGVyKSB7XG4gICAgICB0aGlzLmxvYWRlclNlcnZpY2Uuc2hvdyh7XG4gICAgICAgIGZ1bGxzY3JlZW46IHRydWUsXG4gICAgICAgIGxvYWRlclRleHQ6IFwiUGxlYXNlIHdhaXRcIlxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubG9hZGVyU2VydmljZS5oaWRlKCk7XG4gICAgfVxuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiY29udGFpbmVyXCI+XG4gIDxrd2lraWQtYnVpbGRlci1mb3Jtcy1saXN0XG4gICAgW2FjdGl2ZUZvcm1Db25maWddPVwidGhpcy5hY3RpdmVGb3JtQ29uZmlnXCJcbiAgICBbZm9ybXNMaXN0XT1cInRoaXMuZm9ybXNMaXN0XCJcbiAgICAoZ2V0Rm9ybXNMaXN0KT1cInRoaXMuaGFuZGxlR2V0Rm9ybXNMaXN0KCRldmVudClcIlxuICAgIChvbkNsaWNrU2V0QWN0aXZlRm9ybSk9XCJ0aGlzLmhhbmRsZU9uQ2xpY2tTZXRBY3RpdmVGb3JtKCRldmVudClcIlxuICA+PC9rd2lraWQtYnVpbGRlci1mb3Jtcy1saXN0PlxuICA8a3dpa2lkLWJ1aWxkZXItZm9ybS1lZGl0b3JcbiAgICBbYWN0aXZlRm9ybUNvbmZpZ109XCJhY3RpdmVGb3JtQ29uZmlnXCJcbiAgICAob25DbGlja1NhdmVBY3RpdmVGb3JtQ29uZmlnKT1cIlxuICAgICAgdGhpcy5oYW5kbGVPbkNsaWNrU2F2ZUFjdGl2ZUZvcm1Db25maWcoJGV2ZW50KVxuICAgIFwiXG4gID48L2t3aWtpZC1idWlsZGVyLWZvcm0tZWRpdG9yPlxuPC9kaXY+XG5cbjxrd2lrdWktbG9hZGVyPjwva3dpa3VpLWxvYWRlcj5cbiJdfQ==