diff --git a/src/api/demo/formScheme.ts b/src/api/demo/formScheme.ts index 47b48979..be858f39 100644 --- a/src/api/demo/formScheme.ts +++ b/src/api/demo/formScheme.ts @@ -252,7 +252,7 @@ export function AddTable(params) { dbColumnName: 'geom', dataType: 'geometry', length: 0, - columnDescription: 'geom', + columnDescription: '地图组件', isNullable: 0, isIdentity: 0, isPrimarykey: 0, @@ -272,3 +272,34 @@ export function AddColumn(params) { params, }); } + +// 获取表单分页数据 【先不写】 +export function functionGetFormDataPage(params: AccountParams) { + return defHttp.post({ + url: Api.GetFormDataPage, + params, + }); +} +// 获取表单分页数据【先不写】 +export function functionGetFormDataList(params: AccountParams) { + return defHttp.post({ + url: Api.GetFormDataList, + params, + }); +} + +// 获取表单数据【先不写】 +export function functionGetFormDataFormScheme(params: AccountParams) { + return defHttp.get({ + url: Api.GetFormDataFormScheme, + params, + }); +} + +// 保存自定表单数据【先不写】 +export function functionsaveForm(params: AccountParams) { + return defHttp.post({ + url: Api.saveForm, + params, + }); +} diff --git a/src/components/FormViewer/index.vue b/src/components/FormViewer/index.vue index 0d7ebb69..391dc904 100644 --- a/src/components/FormViewer/index.vue +++ b/src/components/FormViewer/index.vue @@ -16,6 +16,7 @@ formVerison: String, formRelationId: String, flowFormData: Object, + instanceInfo: String, }); props.formConfig.forEach((element) => { element.componentProps.disabled = !element.disabled; @@ -44,10 +45,11 @@ } } async function getFormDetail() { + var instance = JSON.parse(props.instanceInfo); const querys = { id: props.formVerison, key: keyValue.value, - keyValue: props.processId, + keyValue: instance.pkeyValue, }; const data = await functionGetFormDataFormScheme(querys); let obj = new Object(); diff --git a/src/views/demo/form-design/components/VFormDesign/components/FormItemProps.vue b/src/views/demo/form-design/components/VFormDesign/components/FormItemProps.vue index f4e9506a..bc18ad9d 100644 --- a/src/views/demo/form-design/components/VFormDesign/components/FormItemProps.vue +++ b/src/views/demo/form-design/components/VFormDesign/components/FormItemProps.vue @@ -13,25 +13,54 @@ > + + + + - + - + - +
@@ -111,6 +140,8 @@ const { formConfig } = useFormDesignState(); + const options = [...Array(25)].map((_, i) => ({ value: (i + 10).toString(36) + (i + 1) })); + watch( () => formConfig.value, () => { @@ -120,7 +151,15 @@ formConfig.value.currentItem.itemProps.labelCol || {}; formConfig.value.currentItem.itemProps.wrapperCol = formConfig.value.currentItem.itemProps.wrapperCol || {}; - formConfig.value.mapSetData = formConfig.value.mapSetData || {}; + if (formConfig.value.currentItem.field == 'MapGeom') { + formConfig.value.currentItem.mapSetData = formConfig.value.currentItem.mapSetData || { + width: 100, + layerFields: {}, + isAllowAddPolygon: false, + isAllowEditPolygon: false, + isEnablePostionJump: false, + }; + } } }, { deep: true, immediate: true }, diff --git a/src/views/demo/form-design/components/VFormDesign/modules/PropsPanel.vue b/src/views/demo/form-design/components/VFormDesign/modules/PropsPanel.vue index 6e4031df..ce8e6338 100644 --- a/src/views/demo/form-design/components/VFormDesign/modules/PropsPanel.vue +++ b/src/views/demo/form-design/components/VFormDesign/modules/PropsPanel.vue @@ -13,7 +13,7 @@ - + @@ -21,7 +21,7 @@ diff --git a/src/views/demo/form-design/components/VFormItem/index.vue b/src/views/demo/form-design/components/VFormItem/index.vue index 0f591606..de86e6e3 100644 --- a/src/views/demo/form-design/components/VFormItem/index.vue +++ b/src/views/demo/form-design/components/VFormItem/index.vue @@ -26,8 +26,7 @@
- + > + 地图组件 + ; -} - -/** - * 图层字段 - */ -export interface LayerFields { - // GID字段 - gidField?: string; - // 标注字段 - labelField?: string; - // geom字段 - geomField?: string; - // 标注字段options - labelFieldOptions?: any[]; -} -/** - * 地图属性 - */ -export interface MapComponent { - // 地图宽度 - width?: string; - // 选择图层 - chooseLayer: string; - // 图层字段解析 - layerFields?: LayerFields; - // 是否允许添加图斑 - isAllowAddPolygon?: boolean; - // 是否允许编辑图斑 - isAllowEditPolygon?: boolean; - // 是否开启位置跳转 - isEnablePostionJump?: boolean; + // 地图数据 + mapSetData?: MapComponent; } declare type namesType = string | string[]; @@ -129,7 +132,6 @@ export interface IFormConfig extends PickAntFormConfig { activeKey?: PropsTabKey; status?: string; defaultValue?: string; - mapSetData?: MapComponent; } export interface AForm { diff --git a/src/views/demo/onlineform/formCall/CreateFlow.vue b/src/views/demo/onlineform/formCall/CreateFlow.vue index 62ea7bd5..a616a465 100644 --- a/src/views/demo/onlineform/formCall/CreateFlow.vue +++ b/src/views/demo/onlineform/formCall/CreateFlow.vue @@ -180,7 +180,6 @@ schemeId: designerData.formCurrentNode.formVerison, isUpdate: props.isUpdate, pkey: keyValue.value, - pkeyValue: processId, }; // 有表单内容,先存表单信息 if (formVisble.value) { @@ -190,19 +189,31 @@ formBoxRef.value .getForm() .then(async (res) => { - res[designerData.formCurrentNode.formRelationId] = processId; + if (!props.isUpdate) { + res[designerData.formCurrentNode.formRelationId] = processId; + querys.pkeyValue = processId; + } for (var item in res) { + console.log(res[item]); if (res[item] == undefined) { res[item] = ''; - if (item.search('_input_guid') != -1) { + if (item.search('_input_guid') != -1 && !props.isUpdate) { res[item] = buildGUID(); } + } else { + if (props.isUpdate) { + if (item.search('_input_guid') != -1) { + console.log(res[item]); + querys.pkeyValue = res[item]; + } + } } } querys.data = JSON.stringify(res); + console.log(querys); const formValue = await functionsaveForm(querys); if (formValue) { - handleCreateFlow(processId); + handleCreateFlow(processId, querys.pkeyValue); } }) .catch((error) => { @@ -214,12 +225,18 @@ handleCreateFlow(processId); } } - async function handleCreateFlow(processId) { + async function handleCreateFlow(processId, pkeyValue) { + var commit = { + schemeId: designerData.formCurrentNode.formVerison, + pkey: keyValue.value, + pkeyValue: pkeyValue ? pkeyValue : processId, + }; var querys = { schemeCode: designerData.isDraft ? '' : props.code, userId: formData.userId, title: formData.title, processId: processId, + InstanceInfo: JSON.stringify(commit), }; if (!designerData.isDraft) { await saveDraft(querys); diff --git a/src/views/demo/onlineform/formCall/index.vue b/src/views/demo/onlineform/formCall/index.vue index 97493f56..37cbca23 100644 --- a/src/views/demo/onlineform/formCall/index.vue +++ b/src/views/demo/onlineform/formCall/index.vue @@ -317,6 +317,7 @@ btnList: btnList.value, }); } else { + flowFormData.value = {}; previewOpen.value = true; isUpdate.value = false; } diff --git a/src/views/demo/onlineform/formModule/FormModal.vue b/src/views/demo/onlineform/formModule/FormModal.vue index 81a2128a..579c804f 100644 --- a/src/views/demo/onlineform/formModule/FormModal.vue +++ b/src/views/demo/onlineform/formModule/FormModal.vue @@ -50,6 +50,7 @@ ref="modalDesign_config" :modalFormVerison="modalFormVerison" :editData="editData" + :isEdit="isEdit" />
diff --git a/src/views/demo/onlineform/formModule/modalDesign.vue b/src/views/demo/onlineform/formModule/modalDesign.vue index 954f51af..29dea1f8 100644 --- a/src/views/demo/onlineform/formModule/modalDesign.vue +++ b/src/views/demo/onlineform/formModule/modalDesign.vue @@ -39,13 +39,19 @@ type: Object, default: () => ({}), }, + isEdit: { + type: Boolean, + default: () => false, + }, }); watch( () => props.modalFormVerison, (newVal, oldVal) => { if (newVal != oldVal) { - validateSteps(newVal); + if (typeof newVal == 'string') { + validateSteps(newVal); + } } }, ); @@ -236,9 +242,14 @@ } // 编辑时的先前内容 - if (props.editData.formEdit) { - if (props.editData.record.formVerison === formVerison) { + if (props.isEdit) { + if ( + (typeof props.editData.record.formVerison == 'string' + ? props.editData.record.formVerison + : props.editData.record.formVerison.value) === formVerison + ) { const editDataScheme = JSON.parse(props.editData.record.scheme); + // 布局 config.value.layoutType = editDataScheme.layoutType; // 查询设置-风格 diff --git a/src/views/demo/onlineform/formModule/modalForm-Modal.vue b/src/views/demo/onlineform/formModule/modalForm-Modal.vue index 1dc0df5e..8bb0db0e 100644 --- a/src/views/demo/onlineform/formModule/modalForm-Modal.vue +++ b/src/views/demo/onlineform/formModule/modalForm-Modal.vue @@ -4,7 +4,6 @@ @ok="modalSubmit" title="选择表单" width="60%" - height="750" useWrapper="false" >
diff --git a/src/views/demo/onlineform/formdesign/FormModal.vue b/src/views/demo/onlineform/formdesign/FormModal.vue index 0f29da6e..310c7636 100644 --- a/src/views/demo/onlineform/formdesign/FormModal.vue +++ b/src/views/demo/onlineform/formdesign/FormModal.vue @@ -56,7 +56,7 @@ @@ -81,7 +81,7 @@ const emit = defineEmits(['submitsuccess']); let isAddVisible = ref(); - let formScheme = ref(); + let formScheme: any = ref({ info: {}, scheme: {} }); let saveFormDatas: any = ref({}); const primaryKey: any = ref(); @@ -89,6 +89,10 @@ 'handleNextStepsData', computed(() => saveFormDatas.value), ); + provide( + 'thisFormType', + computed(() => saveFormDatas.value), + ); function designSendGrandson(value) { let designTab = JSON.parse(value); diff --git a/src/views/demo/onlineform/formdesign/modal/AutomaticModal.vue b/src/views/demo/onlineform/formdesign/modal/AutomaticModal.vue index 548df4f1..e3273572 100644 --- a/src/views/demo/onlineform/formdesign/modal/AutomaticModal.vue +++ b/src/views/demo/onlineform/formdesign/modal/AutomaticModal.vue @@ -85,7 +85,7 @@ }, }); - const emit = defineEmits(['automaticModalSubmitsuccess']); + const emit = defineEmits(['automatic-modal-submitsuccess']); let saveFormDatas; const labelCol = { span: 7 }; @@ -129,7 +129,7 @@ // 获取db if (!props.isAddVisible) { let query: any = { id: data.saveFormDatas.info.id }; - let result = await functionGetForm(query); + let result: any = await functionGetForm(query); let result_json = JSON.parse(result.scheme.scheme); let data_json = JSON.parse(data.saveFormDatas.scheme.scheme); data_json.db = result_json.db; @@ -213,7 +213,7 @@ }); saveFormDatas.scheme.scheme = JSON.stringify(schems); - emit('automaticModalSubmitsuccess', saveFormDatas); + emit('automatic-modal-submitsuccess', saveFormDatas); closeModal(); } diff --git a/src/views/demo/workflow/create/preview.vue b/src/views/demo/workflow/create/preview.vue index 69e2af0a..1ae1b83c 100644 --- a/src/views/demo/workflow/create/preview.vue +++ b/src/views/demo/workflow/create/preview.vue @@ -166,11 +166,18 @@ designerData.delegateUsers = data; } async function handleSaveDraft() { + var processId = buildGUID(); + var commit = { + schemeId: designerData.formCurrentNode.formVerison, + pkey: keyValue.value, + pkeyValue: processId, + }; var querys = { schemeCode: designerData.isDraft ? '' : props.code, userId: formData.userId, title: formData.title, - processId: buildGUID(), + processId: processId, + InstanceInfo: JSON.stringify(commit), }; const data = await saveDraft(querys); querys.schemeCode = ''; @@ -184,6 +191,7 @@ } function handleSubmit() { var processId = buildGUID(); + var querys = { schemeId: designerData.formCurrentNode.formVerison, isUpdate: false, @@ -223,11 +231,17 @@ } } async function handleCreateFlow(processId) { + var commit = { + schemeId: designerData.formCurrentNode.formVerison, + pkey: keyValue.value, + pkeyValue: processId, + }; var querys = { schemeCode: designerData.isDraft ? '' : props.code, userId: formData.userId, title: formData.title, processId: processId, + InstanceInfo: JSON.stringify(commit), }; if (!designerData.isDraft) { await saveDraft(querys); diff --git a/src/views/demo/workflow/task/process/audit.vue b/src/views/demo/workflow/task/process/audit.vue index 15437ac7..2b193480 100644 --- a/src/views/demo/workflow/task/process/audit.vue +++ b/src/views/demo/workflow/task/process/audit.vue @@ -17,6 +17,7 @@ :processId="designerData.process.id" :formVerison="designerData.formCurrentNode.formVerison" :formRelationId="designerData.formCurrentNode.formRelationId" + :instanceInfo="designerData.process.instanceInfo" v-if="formVisble" /> diff --git a/src/views/demo/workflow/task/process/look.vue b/src/views/demo/workflow/task/process/look.vue index aa6c040c..29baaf9a 100644 --- a/src/views/demo/workflow/task/process/look.vue +++ b/src/views/demo/workflow/task/process/look.vue @@ -20,6 +20,7 @@ :processId="designerData.process.id" :formVerison="designerData.formCurrentNode.formVerison" :formRelationId="designerData.formCurrentNode.formRelationId" + :instanceInfo="designerData.process.instanceInfo" v-if="formVisble" /> diff --git a/vite.config.ts.timestamp-1716167551492-2f8db6b83a5e2.mjs b/vite.config.ts.timestamp-1716167551492-2f8db6b83a5e2.mjs new file mode 100644 index 00000000..40fe7bcf --- /dev/null +++ b/vite.config.ts.timestamp-1716167551492-2f8db6b83a5e2.mjs @@ -0,0 +1,66 @@ +// vite.config.ts +import { defineApplicationConfig } from "file:///E:/%E6%96%B0%E6%9E%B6%E6%9E%84%E9%A1%B9%E7%9B%AE/%E8%B4%A2%E6%BA%90%E4%B8%80%E4%BD%93%E5%8C%96/mian/CaiYuanYiTiHua/internal/vite-config/dist/index.mjs"; +var vite_config_default = defineApplicationConfig({ + overrides: { + optimizeDeps: { + include: [ + "echarts/core", + "echarts/charts", + "echarts/components", + "echarts/renderers", + "qrcode", + "@iconify/iconify", + "ant-design-vue/es/locale/zh_CN", + "ant-design-vue/es/locale/en_US", + "@/../lib/vform/designer.umd.js" + ] + }, + build: { + /* 其他build生产打包配置省略 */ + //... + target: "esnext", + commonjsOptions: { + include: /node_modules|lib/ + //这里记得把lib目录加进来,否则生产打包会报错!! + } + }, + server: { + proxy: { + "/basic-api": { + target: "http://localhost:3000", + changeOrigin: true, + ws: true, + rewrite: (path) => path.replace(new RegExp(`^/basic-api`), "") + // only https + // secure: false + }, + "/upload": { + target: "http://localhost:3300/upload", + changeOrigin: true, + ws: true, + rewrite: (path) => path.replace(new RegExp(`^/upload`), "") + } + }, + warmup: { + clientFiles: ["./index.html", "./src/{views,components}/*"] + } + }, + define: { + "process.env": { + BASE_URL: "/" + } + }, + css: { + preprocessorOptions: { + less: { + javascriptEnabled: true + } + } + }, + plugins: [] + } +}); +export { + vite_config_default as default +}; +//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsidml0ZS5jb25maWcudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImNvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9kaXJuYW1lID0gXCJFOlxcXFxcdTY1QjBcdTY3QjZcdTY3ODRcdTk4NzlcdTc2RUVcXFxcXHU4RDIyXHU2RTkwXHU0RTAwXHU0RjUzXHU1MzE2XFxcXG1pYW5cXFxcQ2FpWXVhbllpVGlIdWFcIjtjb25zdCBfX3ZpdGVfaW5qZWN0ZWRfb3JpZ2luYWxfZmlsZW5hbWUgPSBcIkU6XFxcXFx1NjVCMFx1NjdCNlx1Njc4NFx1OTg3OVx1NzZFRVxcXFxcdThEMjJcdTZFOTBcdTRFMDBcdTRGNTNcdTUzMTZcXFxcbWlhblxcXFxDYWlZdWFuWWlUaUh1YVxcXFx2aXRlLmNvbmZpZy50c1wiO2NvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9pbXBvcnRfbWV0YV91cmwgPSBcImZpbGU6Ly8vRTovJUU2JTk2JUIwJUU2JTlFJUI2JUU2JTlFJTg0JUU5JUExJUI5JUU3JTlCJUFFLyVFOCVCNCVBMiVFNiVCQSU5MCVFNCVCOCU4MCVFNCVCRCU5MyVFNSU4QyU5Ni9taWFuL0NhaVl1YW5ZaVRpSHVhL3ZpdGUuY29uZmlnLnRzXCI7aW1wb3J0IHsgZGVmaW5lQXBwbGljYXRpb25Db25maWcgfSBmcm9tICdAdmJlbi92aXRlLWNvbmZpZyc7XG5cbmV4cG9ydCBkZWZhdWx0IGRlZmluZUFwcGxpY2F0aW9uQ29uZmlnKHtcbiAgb3ZlcnJpZGVzOiB7XG4gICAgb3B0aW1pemVEZXBzOiB7XG4gICAgICBpbmNsdWRlOiBbXG4gICAgICAgICdlY2hhcnRzL2NvcmUnLFxuICAgICAgICAnZWNoYXJ0cy9jaGFydHMnLFxuICAgICAgICAnZWNoYXJ0cy9jb21wb25lbnRzJyxcbiAgICAgICAgJ2VjaGFydHMvcmVuZGVyZXJzJyxcbiAgICAgICAgJ3FyY29kZScsXG4gICAgICAgICdAaWNvbmlmeS9pY29uaWZ5JyxcbiAgICAgICAgJ2FudC1kZXNpZ24tdnVlL2VzL2xvY2FsZS96aF9DTicsXG4gICAgICAgICdhbnQtZGVzaWduLXZ1ZS9lcy9sb2NhbGUvZW5fVVMnLFxuICAgICAgICAnQC8uLi9saWIvdmZvcm0vZGVzaWduZXIudW1kLmpzJyxcbiAgICAgIF0sXG4gICAgfSxcbiAgICBidWlsZDoge1xuICAgICAgLyogXHU1MTc2XHU0RUQ2YnVpbGRcdTc1MUZcdTRFQTdcdTYyNTNcdTUzMDVcdTkxNERcdTdGNkVcdTc3MDFcdTc1NjUgKi9cbiAgICAgIC8vLi4uXG4gICAgICB0YXJnZXQ6ICdlc25leHQnLFxuICAgICAgY29tbW9uanNPcHRpb25zOiB7XG4gICAgICAgIGluY2x1ZGU6IC9ub2RlX21vZHVsZXN8bGliLywgLy9cdThGRDlcdTkxQ0NcdThCQjBcdTVGOTdcdTYyOEFsaWJcdTc2RUVcdTVGNTVcdTUyQTBcdThGREJcdTY3NjVcdUZGMENcdTU0MjZcdTUyMTlcdTc1MUZcdTRFQTdcdTYyNTNcdTUzMDVcdTRGMUFcdTYyQTVcdTk1MTlcdUZGMDFcdUZGMDFcbiAgICAgIH0sXG4gICAgfSxcbiAgICBzZXJ2ZXI6IHtcbiAgICAgIHByb3h5OiB7XG4gICAgICAgICcvYmFzaWMtYXBpJzoge1xuICAgICAgICAgIHRhcmdldDogJ2h0dHA6Ly9sb2NhbGhvc3Q6MzAwMCcsXG4gICAgICAgICAgY2hhbmdlT3JpZ2luOiB0cnVlLFxuICAgICAgICAgIHdzOiB0cnVlLFxuICAgICAgICAgIHJld3JpdGU6IChwYXRoKSA9PiBwYXRoLnJlcGxhY2UobmV3IFJlZ0V4cChgXi9iYXNpYy1hcGlgKSwgJycpLFxuICAgICAgICAgIC8vIG9ubHkgaHR0cHNcbiAgICAgICAgICAvLyBzZWN1cmU6IGZhbHNlXG4gICAgICAgIH0sXG4gICAgICAgICcvdXBsb2FkJzoge1xuICAgICAgICAgIHRhcmdldDogJ2h0dHA6Ly9sb2NhbGhvc3Q6MzMwMC91cGxvYWQnLFxuICAgICAgICAgIGNoYW5nZU9yaWdpbjogdHJ1ZSxcbiAgICAgICAgICB3czogdHJ1ZSxcbiAgICAgICAgICByZXdyaXRlOiAocGF0aCkgPT4gcGF0aC5yZXBsYWNlKG5ldyBSZWdFeHAoYF4vdXBsb2FkYCksICcnKSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICB3YXJtdXA6IHtcbiAgICAgICAgY2xpZW50RmlsZXM6IFsnLi9pbmRleC5odG1sJywgJy4vc3JjL3t2aWV3cyxjb21wb25lbnRzfS8qJ10sXG4gICAgICB9LFxuICAgIH0sXG4gICAgZGVmaW5lOiB7XG4gICAgICAncHJvY2Vzcy5lbnYnOiB7XG4gICAgICAgIEJBU0VfVVJMOiAnLycsXG4gICAgICB9LFxuICAgIH0sXG4gICAgY3NzOiB7XG4gICAgICBwcmVwcm9jZXNzb3JPcHRpb25zOiB7XG4gICAgICAgIGxlc3M6IHtcbiAgICAgICAgICBqYXZhc2NyaXB0RW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBwbHVnaW5zOiBbXSxcbiAgfSxcbn0pO1xuIl0sCiAgIm1hcHBpbmdzIjogIjtBQUFrWCxTQUFTLCtCQUErQjtBQUUxWixJQUFPLHNCQUFRLHdCQUF3QjtBQUFBLEVBQ3JDLFdBQVc7QUFBQSxJQUNULGNBQWM7QUFBQSxNQUNaLFNBQVM7QUFBQSxRQUNQO0FBQUEsUUFDQTtBQUFBLFFBQ0E7QUFBQSxRQUNBO0FBQUEsUUFDQTtBQUFBLFFBQ0E7QUFBQSxRQUNBO0FBQUEsUUFDQTtBQUFBLFFBQ0E7QUFBQSxNQUNGO0FBQUEsSUFDRjtBQUFBLElBQ0EsT0FBTztBQUFBO0FBQUE7QUFBQSxNQUdMLFFBQVE7QUFBQSxNQUNSLGlCQUFpQjtBQUFBLFFBQ2YsU0FBUztBQUFBO0FBQUEsTUFDWDtBQUFBLElBQ0Y7QUFBQSxJQUNBLFFBQVE7QUFBQSxNQUNOLE9BQU87QUFBQSxRQUNMLGNBQWM7QUFBQSxVQUNaLFFBQVE7QUFBQSxVQUNSLGNBQWM7QUFBQSxVQUNkLElBQUk7QUFBQSxVQUNKLFNBQVMsQ0FBQyxTQUFTLEtBQUssUUFBUSxJQUFJLE9BQU8sYUFBYSxHQUFHLEVBQUU7QUFBQTtBQUFBO0FBQUEsUUFHL0Q7QUFBQSxRQUNBLFdBQVc7QUFBQSxVQUNULFFBQVE7QUFBQSxVQUNSLGNBQWM7QUFBQSxVQUNkLElBQUk7QUFBQSxVQUNKLFNBQVMsQ0FBQyxTQUFTLEtBQUssUUFBUSxJQUFJLE9BQU8sVUFBVSxHQUFHLEVBQUU7QUFBQSxRQUM1RDtBQUFBLE1BQ0Y7QUFBQSxNQUNBLFFBQVE7QUFBQSxRQUNOLGFBQWEsQ0FBQyxnQkFBZ0IsNEJBQTRCO0FBQUEsTUFDNUQ7QUFBQSxJQUNGO0FBQUEsSUFDQSxRQUFRO0FBQUEsTUFDTixlQUFlO0FBQUEsUUFDYixVQUFVO0FBQUEsTUFDWjtBQUFBLElBQ0Y7QUFBQSxJQUNBLEtBQUs7QUFBQSxNQUNILHFCQUFxQjtBQUFBLFFBQ25CLE1BQU07QUFBQSxVQUNKLG1CQUFtQjtBQUFBLFFBQ3JCO0FBQUEsTUFDRjtBQUFBLElBQ0Y7QUFBQSxJQUNBLFNBQVMsQ0FBQztBQUFBLEVBQ1o7QUFDRixDQUFDOyIsCiAgIm5hbWVzIjogW10KfQo=