diff --git a/.DS_Store b/.DS_Store deleted file mode 100644 index afc5d88..0000000 Binary files a/.DS_Store and /dev/null differ diff --git a/.gitignore b/.gitignore index 5d947ca..54184f8 100644 --- a/.gitignore +++ b/.gitignore @@ -7,12 +7,22 @@ bin-release/ # Other files and folders .settings/ + # Executables +#.gitignore +log *.swf *.air *.ipa *.apk - +classbeanLib/* +weaverLib/* +web/**/*.properties +web/**/*.xml +target +classbean +.idea/ +!/web/WEB-INF/prop/prop2map/*.properties # Project files, i.e. `.project`, `.actionScriptProperties` and `.flexProperties` # should NOT be excluded as they contain compiler settings and other important # information for Eclipse / Flash Builder. diff --git a/com/api/aiyh_pcn/fadada/dao/FaDDContractMapping.java b/com/api/aiyh_pcn/fadada/dao/FaDDContractMapping.java deleted file mode 100644 index 324c848..0000000 --- a/com/api/aiyh_pcn/fadada/dao/FaDDContractMapping.java +++ /dev/null @@ -1,184 +0,0 @@ -package com.api.aiyh_pcn.fadada.dao; - -import aiyh.utils.Util; -import aiyh.utils.zwl.common.ToolUtil; -import com.api.aiyh_pcn.fadada.entity.FaDaDaConfigDTO; -import com.api.aiyh_pcn.fadada.entity.UfContractInfoDTO; -import weaver.aiyh_pcn.fadada.entity.FileInfo; -import weaver.conn.RecordSet; -import weaver.workflow.workflow.WorkflowVersion; - -import java.util.List; -import java.util.Map; - -/** - * @author EBU7-dev1-ayh - * @create 2021/11/3 0003 14:56 - */ - - -public class FaDDContractMapping { - private final RecordSet rs = new RecordSet(); - private final ToolUtil toolUtil = new ToolUtil(); - - /** - * 查询合同相关的配置信息 - * - * @param workflowId 流程id - * @param type 配置的类型 - * @return 配置信息 - */ - public FaDaDaConfigDTO queryConfig(String workflowId, int type) { - String versionStringByWfid = WorkflowVersion.getVersionStringByWfid(workflowId); - String query = "select main.id,main.workflow_type,main.api_type, main.params_config," + - "main.signed_type,wf2.fieldname field_control1," + - "wf.fieldname field_control, wf1.fieldname contract_doc, " + - "(select GROUP_CONCAT('',selectvalue,'') selectvalue from workflow_selectitem " + - "where FIND_IN_SET(id,main.only_own)) only_own, " + - "(select GROUP_CONCAT('',selectvalue,'') selectvalue from workflow_selectitem " + - "where FIND_IN_SET(id,main.only_other)) only_other, " + - "(select GROUP_CONCAT('',selectvalue,'') selectvalue from workflow_selectitem " + - "where FIND_IN_SET(id,main.both_all)) both_all, " + - "(select GROUP_CONCAT('',selectvalue,'') selectvalue from workflow_selectitem " + - "where FIND_IN_SET(id,main.check_personal)) check_personal, " + - "(select GROUP_CONCAT('',selectvalue,'') selectvalue from workflow_selectitem " + - "where FIND_IN_SET(id,main.check_enterprise)) check_enterprise," + - "main.check_source_type,wdt.tablename check_source " + - "from uf_contract_config main " + - "left join workflow_field_table_view wf on wf.id = main.field_control " + - "left join workflow_field_table_view wf1 on wf1.id = main.contract_doc " + - "left join workflow_field_table_view wf2 on wf2.id = main.field_control1 " + - "left join workflow_detail_table_view wdt on wdt.id = main.check_source and " + - "wdt.workflow_id = main.workflow_type " + - "where main.workflow_type in ( " + versionStringByWfid + ") and api_type = ?"; - rs.executeQuery(query, type); - return Util.recordeSet2Entity(rs, FaDaDaConfigDTO.class, true); - } - - - /** - * 获取全版本的workflowId - * - * @param versionStringByWfid 全版本的workflowId - * @return - */ - public String getAllVersion(String versionStringByWfid) { - String query = "select distinct workflow_type from uf_contract_config where workflow_type in (" + versionStringByWfid + ")"; - rs.executeQuery(query); - rs.next(); - return rs.getString(1); - } - - /** - * 获取节点信息 - * - * @param versionStringByWfid 全版本的流程 - * @param markOnly 获取配置的节点信息 - * @return - */ - public String getNodes(String versionStringByWfid) { - String query = "select workflow_nodes from uf_node_config where workflow_type in (" + versionStringByWfid + ") and enable_nodes = ?"; - rs.executeQuery(query, 1); - rs.next(); - return rs.getString(1); - } - - /** - * 获取流程主表 - * - * @param workflowId - * @return - */ - public String getMainTable(String workflowId) { - String versionStringByWfid = WorkflowVersion.getVersionStringByWfid(workflowId); - String query = "select tablename from workflow_bill " + - " where id in (select formid from workflow_base " + - " where id in (" + versionStringByWfid + ") )"; - rs.executeQuery(query); - rs.next(); - String mainTable = rs.getString(1); - toolUtil.writeDebuggerLog("mainTable:" + mainTable); - return mainTable; - } - - /** - * 获取配置的明细表 - * - * @param workflowId - * @param type - * @return - */ - public String getDetailTable(String workflowId, int type) { - FaDaDaConfigDTO faDaDaConfigDTO = this.queryConfig(workflowId, type); - String detailTable = faDaDaConfigDTO.getCheckSource(); - toolUtil.writeDebuggerLog("detailTable:" + detailTable); - return detailTable; - } - - /** - * 根据主表和请求id查询主表数据 - * - * @param requestId 请求id - * @param mainTableName 主表表名 - * @return - */ - public Map queryMainMap(String requestId, String mainTableName) { - String query = "select * from " + mainTableName + " where requestid = ?"; - RecordSet rs = new RecordSet(); - rs.executeQuery(query, requestId); - return Util.recordSet2Map(rs); - } - - /** - * 查询明细数据 - * - * @param mainId 主表id - * @param tableName 明细表表名 - * @return - */ - public List> queryDetailMaps(String mainId, String tableName) { - String query = "select * from " + tableName + " where mainid = ?"; - RecordSet rs = new RecordSet(); - rs.executeQuery(query, mainId); - return Util.recordSet2MapList(rs); - } - - - /** - * 查询合同的配置信息 - * - * @param workflowId - * @return - */ -/* public Map queryContractConfig(String workflowId) { - String versionStringByWfid = WorkflowVersion.getVersionStringByWfid(workflowId); - RecordSet rs = new RecordSet(); - rs.executeQuery("select * from uf_contract_config where workflow_type in ( " + versionStringByWfid + " ) and api_type = ?", 2); - return Util.recordSet2Map(rs); - }*/ - - /** - * 根据文件的id查询物理文件的id - * @param fileIds - * @return - */ - public List queryImgFileIdByDocIds(String fileIds) { - String query = "select imagefileid,imagefilename from docimagefile where docid in ( " + fileIds + " )"; - rs.executeQuery(query); - return Util.recordeSet2Array(rs, FileInfo.class); - } - - public UfContractInfoDTO queryContractInfo(String contractNo) { - String query = "select * from uf_contract_info where contract_no = ?"; - RecordSet rs = new RecordSet(); - rs.executeQuery(query,contractNo); - return Util.recordeSet2Entity(rs,UfContractInfoDTO.class,true); - } - - public UfContractInfoDTO queryContractInfoByRequestId(String requestId) { - String query = "select * from uf_contract_info where workflow_request_id = ?"; - RecordSet rs = new RecordSet(); - rs.executeQuery(query,requestId); - return Util.recordeSet2Entity(rs,UfContractInfoDTO.class,true); - } -} diff --git a/com/api/aiyh_pcn/fadada/entity/UfContractInfoDTO.java b/com/api/aiyh_pcn/fadada/entity/UfContractInfoDTO.java deleted file mode 100644 index b7ba8e5..0000000 --- a/com/api/aiyh_pcn/fadada/entity/UfContractInfoDTO.java +++ /dev/null @@ -1,213 +0,0 @@ - -package com.api.aiyh_pcn.fadada.entity; - - -public class UfContractInfoDTO { - - private int id; - private int requestId; - private int workflowType; - private String contractNo; - private String fileNo; - private String fileName; - private int signedNum; - private int shouldSignedNum; - private int contractStatus; - private String contractViewUrl; - private String contractDownUrl; - private String workflowMainTable; - private int queueSigned; - private int singleContractFileNum; - private int singleSignedNum; - private String workflowRequestId; - private String workflowDetailTable; - private String signedType; - private String userInfo; - private int mainId; - - public void setId(int id) { - this.id = id; - } - - public void setRequestId(int requestId) { - this.requestId = requestId; - } - - public void setWorkflowType(int workflowType) { - this.workflowType = workflowType; - } - - public void setContractNo(String contractNo) { - this.contractNo = contractNo; - } - - public void setFileNo(String fileNo) { - this.fileNo = fileNo; - } - - public void setFileName(String fileName) { - this.fileName = fileName; - } - - public void setSignedNum(int signedNum) { - this.signedNum = signedNum; - } - - public void setShouldSignedNum(int shouldSignedNum) { - this.shouldSignedNum = shouldSignedNum; - } - - public void setContractStatus(int contractStatus) { - this.contractStatus = contractStatus; - } - - public void setContractViewUrl(String contractViewUrl) { - this.contractViewUrl = contractViewUrl; - } - - public void setContractDownUrl(String contractDownUrl) { - this.contractDownUrl = contractDownUrl; - } - - public void setWorkflowMainTable(String workflowMainTable) { - this.workflowMainTable = workflowMainTable; - } - - public void setQueueSigned(int queueSigned) { - this.queueSigned = queueSigned; - } - - public void setSingleContractFileNum(int singleContractFileNum) { - this.singleContractFileNum = singleContractFileNum; - } - - public void setSingleSignedNum(int singleSignedNum) { - this.singleSignedNum = singleSignedNum; - } - - public void setWorkflowRequestId(String workflowRequestId) { - this.workflowRequestId = workflowRequestId; - } - - public void setWorkflowDetailTable(String workflowDetailTable) { - this.workflowDetailTable = workflowDetailTable; - } - - public void setMainId(int mainId) { - this.mainId = mainId; - } - - public int getId() { - return this.id; - } - - public int getRequestId() { - return this.requestId; - } - - public int getWorkflowType() { - return this.workflowType; - } - - public String getContractNo() { - return this.contractNo; - } - - public String getFileNo() { - return this.fileNo; - } - - public String getFileName() { - return this.fileName; - } - - public int getSignedNum() { - return this.signedNum; - } - - public int getShouldSignedNum() { - return this.shouldSignedNum; - } - - public int getContractStatus() { - return this.contractStatus; - } - - public String getContractViewUrl() { - return this.contractViewUrl; - } - - public String getContractDownUrl() { - return this.contractDownUrl; - } - - public String getWorkflowMainTable() { - return this.workflowMainTable; - } - - public int getQueueSigned() { - return this.queueSigned; - } - - public int getSingleContractFileNum() { - return this.singleContractFileNum; - } - - public int getSingleSignedNum() { - return this.singleSignedNum; - } - - public String getWorkflowRequestId() { - return this.workflowRequestId; - } - - public String getWorkflowDetailTable() { - return this.workflowDetailTable; - } - - public int getMainId() { - return this.mainId; - } - - public String getSignedType() { - return signedType; - } - - public void setSignedType(String signedType) { - this.signedType = signedType; - } - - public String getUserInfo() { - return userInfo; - } - - public void setUserInfo(String userInfo) { - this.userInfo = userInfo; - } - - @Override - public String toString() { - return "UfContractInfoDTO{" + - "id=" + id + - ", requestId=" + requestId + - ", workflowType=" + workflowType + - ", contractNo='" + contractNo + '\'' + - ", fileNo='" + fileNo + '\'' + - ", fileName='" + fileName + '\'' + - ", signedNum=" + signedNum + - ", shouldSignedNum=" + shouldSignedNum + - ", contractStatus=" + contractStatus + - ", contractViewUrl='" + contractViewUrl + '\'' + - ", contractDownUrl='" + contractDownUrl + '\'' + - ", workflowMainTable='" + workflowMainTable + '\'' + - ", queueSigned=" + queueSigned + - ", singleContractFileNum=" + singleContractFileNum + - ", singleSignedNum=" + singleSignedNum + - ", workflowRequestId='" + workflowRequestId + '\'' + - ", workflowDetailTable='" + workflowDetailTable + '\'' + - ", signedType='" + signedType + '\'' + - ", userInfo='" + userInfo + '\'' + - ", mainId=" + mainId + - '}'; - } -} \ No newline at end of file diff --git a/customization/.DS_Store b/customization/.DS_Store deleted file mode 100644 index 99dba9e..0000000 Binary files a/customization/.DS_Store and /dev/null differ diff --git a/customization/action/demo/MM050_SC_1230_FI_DocCreate_eg.java b/customization/action/demo/MM050_SC_1230_FI_DocCreate_eg.java deleted file mode 100644 index 87ab047..0000000 --- a/customization/action/demo/MM050_SC_1230_FI_DocCreate_eg.java +++ /dev/null @@ -1,54 +0,0 @@ -package customization.action.demo; - - -import customization.commons.Console; -import customization.commons.CustomAction; -import weaver.general.Util; -import weaver.interfaces.workflow.action.Action; -import weaver.soa.workflow.request.RequestInfo; -import weaver.workflow.request.RequestManager; - -/** - * 命名规则: - * 当一只流程只有一个和SAP场景交互时,接口命规则为: - * 流程编号+SAP接口场景编号 例如:MM050_SC_1230_FI_DocCreate_eg - * ******************************************** - * 当一只流程在不同节有多个SAP交互场景交互式,接口命名规则为: - * 流程编号_流程调用节点_nodeid 前(before)/后(after)/出口(export)/(归档前)end - * - * - */ -public class MM050_SC_1230_FI_DocCreate_eg extends CustomAction implements Action { - - @Override - public String execute(RequestInfo request) { - - //封装流程表单的值 - super.getWorkflowDataValue(request); - writeLog("execute action MM050_SC_1230_FI_DocCreate_eg");//打印日志 - RequestManager rm = request.getRequestManager(); - String requestid = request.getRequestid(); - try { - String srcString = Util.null2String(rm.getSrc()); - writeLog("srcString:"+srcString); - //当提交时执行 - if (srcString.equals("submit")) { - - //在这里编写业务逻辑代码,调用往SAP系统写入值,如果需要阻止流程继续流转,参考下方catch里面信息处理。 - - Console.log( "mainFieldValuesMap"+mainMap); - Console.log( "detailFieldValuesMap"+detailMap); - - System.out.println("selectvalue:"+super.getSeletItemValue("cgsqlxjms",rm.getFormid(), Util.null2String(mainMap.get("cgsqlxjms")))); - - - } - - }catch (Exception e){ - //异常报错是填写异常信息,阻止流程继续流转 - request.getRequestManager().setMessageid("90001"); - request.getRequestManager().setMessagecontent("-"+rm.getRequestid()+" 系统异常终止流程提交!"); - } - return Action.SUCCESS; - } -} diff --git a/customization/action/demo/MM050_node688_after.java b/customization/action/demo/MM050_node688_after.java deleted file mode 100644 index 8efb8b1..0000000 --- a/customization/action/demo/MM050_node688_after.java +++ /dev/null @@ -1,76 +0,0 @@ -package customization.action.demo; - - -import customization.commons.Console; -import customization.commons.CustomAction; -import customization.commons.CustomUtil; -import weaver.general.Util; -import weaver.interfaces.workflow.action.Action; -import weaver.soa.workflow.request.RequestInfo; -import weaver.workflow.request.RequestManager; - -/** - * 命名规则: - * 当一只流程只有一个和SAP场景交互时,接口命规则为: - * 流程编号+SAP接口场景编号 例如:MM050_SC_1230_FI_DocCreate_eg - * - * 当一只流程在不同节有多个SAP交互场景交互式,接口命名规则为: - * 流程编号_流程调用节点_nodeid 前(before)/后(after)/出口(export)/(归档前)end - - * type来源于流程接口里面配置的参数 - */ -public class MM050_node688_after extends CustomAction implements Action { - - private String type; - - public String getType() { - return type; - } - - public void setType(String type) { - this.type = type; - } - - @Override - public String execute(RequestInfo requestInfo) { - RequestManager rm = requestInfo.getRequestManager(); - int requestid=rm.getRequestid(); - try { - - String srcString = Util.null2String(rm.getSrc());//submit 提交 reject 退回 - if (srcString.equals("submit")) { - //获取流程的数据 - super.getWorkflowDataValue(requestInfo); - System.out.println("主表数据:"+mainMap); - System.out.println("明细表数据:"+detailMap); - - Console.log("type:" + this.getType()); - //todo 在这里写相关业务逻辑 - - - if(!true){ - String errorinfo="我是测试信息"; - requestInfo.getRequestManager().setMessageid(""+requestid); - requestInfo.getRequestManager().setMessage("Action集成报错"); - requestInfo.getRequestManager().setMessagecontent("请求ID:" + rm.getRequestid() + ";
操作时间:"+ CustomUtil.getStringDate("yyyy-MM-dd HH:mm:ss") +";
和异构系统交互时返回错误!" + - "参考信息具体如下:
" +errorinfo); - super.sendActionErrorInfo(requestid); - return Action.FAILURE_AND_CONTINUE; - } - } - - }catch (Exception e){ - e.printStackTrace(); - //在这里编写业务逻辑代码,调用往SAP系统写入值,如果需要阻止流程继续流转,参考下方catch里面信息处理。 - requestInfo.getRequestManager().setMessageid(""+requestid); - requestInfo.getRequestManager().setMessage("Action集成报错"); - requestInfo.getRequestManager().setMessagecontent("请求ID:" + rm.getRequestid() + ";
操作时间:"+ CustomUtil.getStringDate("yyyy-MM-dd HH:mm:ss") +";
和异构系统交互时返回错误!" + - "参考信息具体如下:
" +e.toString()); - super.sendActionErrorInfo(requestid); - return Action.FAILURE_AND_CONTINUE; - } - - return Action.SUCCESS; - } - -} diff --git a/customization/action/demo/MM050_node688_before.java b/customization/action/demo/MM050_node688_before.java deleted file mode 100644 index 69566c4..0000000 --- a/customization/action/demo/MM050_node688_before.java +++ /dev/null @@ -1,39 +0,0 @@ -package customization.action.demo; - -import customization.commons.Console; -import customization.commons.CustomAction; -import weaver.interfaces.workflow.action.Action; -import weaver.soa.workflow.request.RequestInfo; - -/** - * 命名规则: - * 当一只流程只有一个和SAP场景交互时,接口命规则为: - * 流程编号+SAP接口场景编号 例如:MM050_SC_1230_FI_DocCreate_eg - * - * 当一只流程在不同节有多个SAP交互场景交互式,接口命名规则为: - * 流程编号_流程调用节点_nodeid 前(before)/后(after)/出口(export)/(归档前)end - - * - */ -public class MM050_node688_before extends CustomAction implements Action { - private String type; - - public String getType() { - return type; - } - - public void setType(String type) { - this.type = type; - } - - - @Override - public String execute(RequestInfo requestInfo) { - Console.log("type:" + this.getType()); - requestInfo.getRequestManager().setMessageid("90002"); - requestInfo.getRequestManager().setMessagecontent("MM050_node688_before"); - - return Action.FAILURE_AND_CONTINUE; - } - -} diff --git a/customization/action/demo/MM050_node688_export.java b/customization/action/demo/MM050_node688_export.java deleted file mode 100644 index 48debf0..0000000 --- a/customization/action/demo/MM050_node688_export.java +++ /dev/null @@ -1,37 +0,0 @@ -package customization.action.demo; - -import customization.commons.Console; -import customization.commons.CustomAction; -import weaver.interfaces.workflow.action.Action; -import weaver.soa.workflow.request.RequestInfo; - -/** - * 命名规则: - * 当一只流程只有一个和SAP场景交互时,接口命规则为: - * 流程编号+SAP接口场景编号 例如:MM050_SC_1230_FI_DocCreate_eg - * - * 当一只流程在不同节有多个SAP交互场景交互式,接口命名规则为: - * 流程编号_流程调用节点_nodeid 前(before)/后(after)/出口(export)/(归档前)end - * - */ -public class MM050_node688_export extends CustomAction implements Action { - - - private String type; - - public String getType() { - return type; - } - - public void setType(String type) { - this.type = type; - } - - @Override - public String execute(RequestInfo requestInfo) { - Console.log("type:"+this.getType()); - requestInfo.getRequestManager().setMessageid("90002"); - requestInfo.getRequestManager().setMessagecontent("MM050_node688_before"); - return Action.FAILURE_AND_CONTINUE; - } -} diff --git a/customization/commons/.DS_Store b/customization/commons/.DS_Store deleted file mode 100644 index 5008ddf..0000000 Binary files a/customization/commons/.DS_Store and /dev/null differ diff --git a/customization/commons/Console.java b/customization/commons/Console.java deleted file mode 100644 index da1e0c2..0000000 --- a/customization/commons/Console.java +++ /dev/null @@ -1,174 +0,0 @@ -package customization.commons; - -import weaver.conn.RecordSet; -import weaver.general.GCONST; - -import java.io.*; -import java.nio.charset.StandardCharsets; -import java.text.SimpleDateFormat; -import java.util.Date; - -/** - * @author liutaihong - * @version 1.0.0 - * @ClassName Console.java - * @Description 自己写的日志打印,UTF-8格式 - * @createTime 2020-04-29 14:31:00 - */ -public class Console { - - public static void log(String logStr) { - StackTraceElement[] stacks = new Throwable().getStackTrace(); - //int stacksLen = stacks.length; - String className = stacks[1].getClassName(); - String method = stacks[1].getMethodName(); - int number = stacks[1].getLineNumber(); - String actionFileName = stacks[1].getFileName(); - write(logStr,"log",className,method,number,actionFileName); - } - - public static void info(String logStr) { - StackTraceElement[] stacks = new Throwable().getStackTrace(); - //int stacksLen = stacks.length; - String className = stacks[1].getClassName(); - String method = stacks[1].getMethodName(); - int number = stacks[1].getLineNumber(); - String actionFileName = stacks[1].getFileName(); - write(logStr,"info",className,method,number,actionFileName); - } - - /** - * 根据action按照日期分类打印日志 - *

- * 在配置文件中可以增加NoPrintLog.properties 的className键的值(多个用,隔开)来控制对应class的日志是否完整输出 - * eg: className=com.custompage.NodeBefore - * 那么 com.custompage.NodeBefore 里面的具体日志不会完整的被打印出来。 - *

- * 适用场景: - * 场景1:很多大量的日志在调试完成后还会被打印出来会占用很大的磁盘空间,不得不一个个去掉调试日志。搞不好就能轻松一天打印80G的ecology日志。 - * 场景2:假设去掉日志以后,出现了新的问题,再调试之前又得一个个增加打印行。调试完成后回到场景1,往返循环。 - * 场景3:原来的log日志全部打印在/log/ecology*.log文件里面,假设你的日志达到很大的时候,比如200m的时候,找日志如同大海捞针。 - * 场景4:200M的日志文件你下载下来所消耗的时间和代价是巨大的,即使直接在浏览器里面访问也是痛苦不堪的。 - *

- * 关于历史action迁移: - * 1.假定之前 extends BaseBean类来writeLog日志,只需要改为 extends ActionUtil这个类即可。 - * 调用还是使用writeLog()方法即可; - * 2.在调整的时候可以考虑使用该方法打印日志,花一点点时间你将解决前面应用场景里面的问题。 - *

- * 关于日志路径: - * <<<<<<< HEAD - * 所有日志将被存放在/log/devlog/文件夹下面 按天按java类生成对应的日志。 - * eg: - * /log/devlog/NodeBefore.java_2017-06-18.log - * /log/devlog/NodeAfter.java_2017-06-18.log - * SendHrmResourceInfo.java_2017-06-28.log - * ======= - * 所有日志将被存放在/log/devlog/文件夹下面 按天按java类生成对应的日志。 - * eg: - * /log/devlog/NodeBefore.java_2017-06-18.log - * /log/devlog/NodeAfter.java_2017-06-18.log - * >>>>>>> 84c78e050685929fbe1387a54a96dc120300b2a7 - *

- * 如果快速定位日志: - * eg: - * m=execute;n=14;t=10:06:23.743===>>开始日志 - * <<<<<<< HEAD - * m=execute;n=14;t=10:10:08.774===>>日志未打印,如需打开请从配置文件NoPrintLog中删除"com.customcode.action.ExportEg" - * ======= - * m=execute;n=14;t=10:10:08.774===>>日志未打印,如需打开请从配置文件NoPrintLog中删除"com.customcode.action.Export" - * >>>>>>> 84c78e050685929fbe1387a54a96dc120300b2a7 - *

- * 如上日志提供每次调用的时候提供了以下信息: - * m=方法名(method);n=行数(number);t=执行时间(time)==>>打印日志(log) - * 例如第一行表示 执行了execute方法 在源码第14行打印,执行时间为 10:06:23.743 - * - * @param logStr log对象 - */ - private static void write(String logStr,String type,String className,String method,int number , String actionFileName ) { - - actionFileName = actionFileName.substring(0, actionFileName.indexOf(".")); - - - SimpleDateFormat CurrentDate = new SimpleDateFormat("yyyyMMdd"); - SimpleDateFormat CurrentTime = new SimpleDateFormat("HH:mm:ss.SSS"); - - SimpleDateFormat CurrentHour = new SimpleDateFormat("HH"); - Date date = new Date(); - String thisHour = CurrentHour.format(date); - String thisDate = CurrentDate.format(date); - String thisTime = CurrentTime.format(date); - - String log = type+":m=" + method + ";n=" + number + ";t=" + thisTime + "===>>"; - - String logPath = GCONST.getRootPath() + "log"+File.separatorChar +"devlog" ; - File dir = new File(logPath); - //writeLog(logPath); - if (!dir.exists()) { - dir.mkdir(); - System.out.println("创建"+logPath); - } - - logPath = GCONST.getRootPath() + "log"+File.separatorChar +"devlog" + File.separatorChar + thisDate; - dir = new File(logPath); - //writeLog(logPath); - if (!dir.exists()) { - dir.mkdir(); - System.out.println("创建"+logPath); - } - - - logPath = GCONST.getRootPath() +"log"+File.separatorChar +"devlog" + File.separatorChar + thisDate + File.separator + actionFileName; - - dir = new File(logPath); - //writeLog(logPath); - if (!dir.exists()) { - dir.mkdir(); - System.out.println("创建"+logPath); - } - - String dirStr = logPath + File.separatorChar + thisHour + ".log"; - // writeLog("dirStr:"+dirStr); - File fileName = new File(dirStr); - if (!fileName.exists()) { - try { - fileName.createNewFile(); - writeLog(fileName, "m=方法名(method);n=行数(number);t=执行时间(time)==>>打印日志(log)"); - } catch (IOException e) { - e.printStackTrace(); - } - } - RecordSet recordSet = new RecordSet(); - - - String allNoPrintLogClass = recordSet.getPropValue("NoPrintLog", "className"); - if (allNoPrintLogClass.contains(className)) { - // Log(fileName, log+ "日志未打印,如需打开请从配置文件NoPrintLog中删除\""+className+"\""); - - } else { - writeLog(fileName, log + logStr); - } - - - } - - /** - * @param fileName 写入的文件 - * @param log 写入的内容 - */ - private static void writeLog(File fileName, String log) { - try { - BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(fileName, true), StandardCharsets.UTF_8)); - - writer.write(log + "\r\n"); - if (writer != null) - writer.close(); - if (writer != null) - writer.close(); - } catch (IOException e) { - e.printStackTrace(); - - } finally { - - } - } -} diff --git a/customization/commons/CustomAction.java b/customization/commons/CustomAction.java deleted file mode 100644 index fc53856..0000000 --- a/customization/commons/CustomAction.java +++ /dev/null @@ -1,319 +0,0 @@ -package customization.commons; - - - -import weaver.conn.RecordSet; -import weaver.general.BaseBean; -import weaver.general.Util; -import weaver.hrm.company.DepartmentComInfo; -import weaver.hrm.resource.ResourceComInfo; -import weaver.soa.workflow.request.*; -import weaver.workflow.request.RequestManager; -import weaver.workflow.workflow.WorkflowRequestComInfo; - -import java.net.InetAddress; -import java.util.HashMap; -import java.util.LinkedHashMap; - - -/** - * Created by liutaihong on 16-06-17. - * 描述:日志及取值工具类 - */ -public class CustomAction extends BaseBean { - - - - protected HashMap mainMap;//主字段的值 - protected HashMap>> detailMap ;//所有明细表的值 - - protected WSBaseInfo wsBaseInfo ; - protected int wf_creater ; - protected int wf_formid ; - protected int wf_isbill ; - protected String formtablename ; - protected int wf_user ; - - - public CustomAction(){ - mainMap = new HashMap();//主字段的值 - detailMap = new HashMap>>();//所有明细表的值 - wsBaseInfo = new WSBaseInfo(); - wf_creater = 0; - wf_formid = 0; - wf_isbill = 0; - formtablename = ""; - wf_user = 0; - } - - - - - - /** - * 获取主表数据 - * 在流程action里面初始化后只需要通过Map就能快速的取到对应的主表的值 - *

- * 适用场景: - * 1.通过获取表名,然后使用SQL语句查询你要的主表数据(升级之后表名还会出错)。 - * 2.通过遍历requestInfo.getMainTableInfo().getProperty()做判断匹配值。 - *

- * 使用: - * 获取流程名称:map.get("requestName"); - * 获取流程requestid:map.get("requestId"); - * 获取流程创建人:map.get("creatorId"); - * 获取流程类型id:map.get("workflowId"); - * - * @param requestInfo 流程对象 - * @return mainMap 主表的列名和值 - */ - public synchronized void getWorkflowDataValue(RequestInfo requestInfo) { - /* - Console.log(" 执行:getWorkflowDataValue"); - long waittime=ProcessingUtil.start(); - Console.log(requestInfo.getRequestid()+"等待"+waittime+"ms"); - */ - - RequestManager rm = requestInfo.getRequestManager(); - - //System.out.println("select * from formtable_main_"+Math.abs(rm.getFormid())+" where requestid='"+rm.getRequestid()+"'"); - RequestManager RequestManager = requestInfo.getRequestManager(); - wf_formid = RequestManager.getFormid();//流程表单id - wf_creater = RequestManager.getCreater();//流程创建人 - wf_isbill = RequestManager.getIsbill();//是否为单据 - - wf_user = RequestManager.getUser().getUID();//当前操作者 - - - mainMap.put("requestname", requestInfo.getDescription());//流程标题 - mainMap.put("requestid", requestInfo.getRequestid());//流程id - mainMap.put("creatorid", requestInfo.getCreatorid());//流程创建人ID - mainMap.put("workflowid", requestInfo.getWorkflowid()); - - - try { - ResourceComInfo rci = new ResourceComInfo(); - DepartmentComInfo dci = new DepartmentComInfo(); - - - wsBaseInfo.setCreater_departmentcode(dci.getDepartmentCode(rci.getDepartmentID("" + wf_creater))); - wsBaseInfo.setCreater_departmentid(rci.getDepartmentID("" + wf_creater)); - wsBaseInfo.setCreater_departmentname(dci.getDepartmentname(rci.getDepartmentID("" + wf_creater))); - wsBaseInfo.setCreater_department_codeAndName(dci.getDepartmentCode(rci.getDepartmentID("" + wf_creater)) + "|" + dci.getDepartmentname(rci.getDepartmentID("" + wf_creater))); - - - wsBaseInfo.setCreater_lastname(rci.getLastname("" + wf_creater)); - wsBaseInfo.setCreater_workcode(rci.getWorkcode("" + wf_creater)); - wsBaseInfo.setCreater_workcodeAndName(rci.getWorkcode("" + wf_creater) + "|" + rci.getLastname("" + wf_creater)); - - - wsBaseInfo.setCurrent_departmentcode(dci.getDepartmentname(rci.getDepartmentID("" + wf_user))); - wsBaseInfo.setCurrent_departmentid(rci.getDepartmentID("" + wf_user)); - wsBaseInfo.setCurrent_departmentname(dci.getDepartmentCode(rci.getDepartmentID("" + wf_user))); - wsBaseInfo.setCurrent_department_codeAndName(dci.getDepartmentname(rci.getDepartmentID("" + wf_user)) + "|" + dci.getDepartmentCode(rci.getDepartmentID("" + wf_user))); - - wsBaseInfo.setCurrent_lastname(rci.getLastname("" + wf_user)); - wsBaseInfo.setCurrent_workcode(rci.getWorkcode("" + wf_user)); - wsBaseInfo.setCurrent_workcodeAndName(rci.getWorkcode("" + wf_user) + "|" + rci.getLastname("" + wf_user)); - - wsBaseInfo.setFormid(Math.abs(rm.getFormid())); - - - //************ 这部部分非30项目全新的项目可以去掉 - - mainMap.put("createrworkcode", rci.getWorkcode("" + wf_creater));//流程创建人工号 - mainMap.put("createrlastname", rci.getLastname("" + wf_creater));//流程创建人姓名 - mainMap.put("createrdepartmentid", rci.getDepartmentID("" + wf_creater));//流程创建人部门ID - mainMap.put("createrdepartmentname", dci.getDepartmentname(rci.getDepartmentID("" + wf_creater)));//流程创建人部门名称 - mainMap.put("createrdepartmentcode", dci.getDepartmentCode(rci.getDepartmentID("" + wf_creater)));//流程创建人部门编号 - - mainMap.put("currentworkcode", rci.getWorkcode("" + wf_user));//当前操作人工号 - mainMap.put("currentlastname", rci.getLastname("" + wf_user));//当前操作人姓名 - mainMap.put("currentdepartmentid", rci.getDepartmentID("" + wf_user));//当前操作人部门ID - mainMap.put("currentdepartmentname", dci.getDepartmentname(rci.getDepartmentID("" + wf_user)));//当前操作人部门名称 - mainMap.put("currentdepartmentcode", dci.getDepartmentCode(rci.getDepartmentID("" + wf_user)));//当前操作人部门编号 - - - } catch (Exception e) { - System.out.println("流程基础信息获取:" + e.toString()); - } - // System.out.println(".......>"+wsBaseInfo.getSys()); - - - System.out.println("requestid:" + requestInfo.getRequestid()); - Property[] properties = requestInfo.getMainTableInfo().getProperty();// 获取表单主字段信息 - for (int i = 0; i < properties.length; i++) {// 主表数据 - String name = properties[i].getName().toLowerCase(); - String value = Util.null2String(properties[i].getValue()); - //System.out.println("formtable_main_"+Math.abs(wf_formid)+"."+name+":"+ Util.null2String(value)); - mainMap.put(name, Util.null2String(value)); - //writeLog(name + ":" + value); - } - - DetailTable[] detailtable = null; - try { - detailtable = requestInfo.getDetailTableInfo().getDetailTable();// 获取明细表 - if (detailtable.length > 0) { - - for (int i = 1; i <= detailtable.length; i++) {//遍历明细表 - HashMap> rowList = new LinkedHashMap>(); - DetailTable dt = detailtable[i-1]; - Row[] s = dt.getRow(); - - for (int j = 1; j <= s.length; j++) { - HashMap rowMap = new LinkedHashMap(); - Row r = s[j-1]; - - Cell[] c = r.getCell(); - for (int k = 0; k < c.length; k++) { - Cell c1 = c[k]; - String name = c1.getName().toLowerCase(); - String value = c1.getValue(); - - //System.out.println(i+""+"-"+name+":"+value); - rowMap.put(name, Util.null2String(value)); - } - if (rowMap.size() > 0) { - rowList.put(r.getId(), rowMap); - } - - } - - detailMap.put(dt.getTableDBName(), rowList); - } - } - - } catch (Exception e) { - - } - - Console.log("-------------requestid:"+requestInfo.getRequestid()+"--------------"); - Console.log("mainMap:"+mainMap.toString()); - Console.log("detailMap:"+detailMap.toString()); - - } - - private String getSeletItemValue(String fieldname, int formid, String selectvalue, Integer index) { - String name = ""; - - try { - RecordSet recordSet = new RecordSet(); - if (selectvalue.equals("null") || selectvalue == null) { - selectvalue = ""; - } - - String detailtable = ""; - String fname = fieldname; - String billid = ""; - if (fieldname.contains(".")) { - detailtable = fieldname.split("\\.")[0]; - fname = fieldname.split("\\.")[1]; - } - - String sqls = "select * from workflow_billfield where billid= '" + formid + "' and fieldname='" + fname + "' "; - if (detailtable.equals("")) { - sqls = sqls + " and detailtable is null "; - } else { - sqls = sqls + " and detailtable ='" + detailtable + "'"; - } - - recordSet.execute(sqls); - if (recordSet.first()) { - billid = recordSet.getString("id"); - } - - sqls = "select * from WORKFLOW_SELECTITEM where SELECTvalue='" + selectvalue + "' and FIELDID='" + billid + "'"; - recordSet.execute(sqls); - if (recordSet.first()) { - name = recordSet.getString("selectName"); - } - - if (index != null && !name.isEmpty() && name.contains("|")) { - name = name.split("\\|")[index]; - } - } catch (Exception var11) { - } - - return name.trim(); - } - - public static String getSeletItemValue(String fieldname, int formid, String selectvalue) { - return new CustomAction().getSeletItemValue(fieldname, formid, selectvalue, (Integer)null); - } - - public static String getSeletItemValueBefore(String fieldname, int formid, String selectvalue) { - return new CustomAction().getSeletItemValue(fieldname, formid, selectvalue, 0); - } - - public static String getSeletItemValueAfter(String fieldname, int formid, String selectvalue) { - return new CustomAction().getSeletItemValue(fieldname, formid, selectvalue, 1); - } - - - /** - * 触发一个集成流程报错的提醒 - * @param requestid - */ - public static void sendActionErrorInfo(int requestid){ - - Boolean istrue = true; - String sendErrorWfCode = "," + Util.null2String(new BaseBean().getPropValue("customPropSet", "sendErrorWf"), "0") + ","; - String sqlstr = "select WORKFLOWID from workflow_requestbase where requestid='" + requestid + "'"; - RecordSet recordSet = new RecordSet(); - recordSet.execute(sqlstr); - if (recordSet.next()) { - if (sendErrorWfCode.contains("," + recordSet.getString("WORKFLOWID") + ",")) { - //当为设置的流程wrokflow时 - istrue = false; - } - } - if(sendErrorWfCode.equals(",0,")){ - istrue = true; - } - if (istrue) { - new Thread((new Runnable() { - @Override - public void run() { - String remarkfs = ""; //发送报文内容 - try { - - WorkflowRequestComInfo requestComInfo = new WorkflowRequestComInfo(); - String requestname = "【流程Action集成报错】:相关请求\"" + requestComInfo.getRequestName("" + requestid) + "(" + requestid + ")\""; - String remark = requestname + "
操作时间:" + CustomUtil.getStringDate("yyyy-MM-dd HH:mm:ss") + ""; - remark += "
相关请求:" + requestid + ""; - - InetAddress addr = InetAddress.getLocalHost(); - String ip = addr.getHostAddress().toString(); //获取本机ip - String hostName = addr.getHostName().toString(); //获取本机计算机名称 - remark += "
执行服务器IP:" + ip; - remark += "
服务主机名:" + hostName; - - - int resourceid = Util.getIntValue(Util.null2String(new BaseBean().getPropValue("customPropSet", "actionResourceid")), 1); - setSysRemindInfo(requestname, resourceid, remark); - // 设置主表信息 - - - } catch (Exception e) { - e.printStackTrace(); - } - } - })).start(); - } - - } - - /** - * 项目提醒工作流 - * @param requestname 工作流标题 - * @param resource 提醒人 - * @param remark 备注 - * @throws Exception - */ - public static void setSysRemindInfo(String requestname,int resource,String remark) throws Exception{ - new weaver.system.SysRemindWorkflow().setSysRemindInfo(requestname,0,0,0,0,resource,""+resource,remark); - } - - -} - diff --git a/customization/commons/CustomUtil.java b/customization/commons/CustomUtil.java deleted file mode 100644 index 88e3f7c..0000000 --- a/customization/commons/CustomUtil.java +++ /dev/null @@ -1,259 +0,0 @@ -package customization.commons; - - -import weaver.conn.RecordSet; - -import java.text.ParseException; -import java.text.SimpleDateFormat; -import java.util.ArrayList; -import java.util.Date; -import java.util.List; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -/** - * 自定义工具类 - * @author - */ -public class CustomUtil { - - public static String dateFormat(String format) { - return dateFormat(new Date(), format); - } - - public static String dateFormat(Date date, String format) { - return new SimpleDateFormat(format).format(date); - } - - public static Double getDouble(String v) { - return isBlank(v) ? null : getDouble(v, -1.0); - } - - /** - * 20200220121212转换2020-02-20 12-12 - * - * @param s - * @return - */ - public synchronized static String getDateofhour(String s) { - String r = ""; - Date d = null; - SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss"); - SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm"); - try { - d = sdf.parse(s); - r = sdf1.format(d); - } catch (Exception e) { - // 格式不正确 - } - return r; - } - - /** - * 20200220转换2020-02-20 - * - * @param s - * @return - */ - public synchronized static String stringFormatToString(String s) { - String r = ""; - Date d = null; - SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd"); - SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd"); - try { - d = sdf.parse(s); - r = sdf1.format(d); - } catch (Exception e) { - // 格式不正确 - } - System.out.println("格式化结果 = " + r); - return r; - } - - public static Double getDouble(String v, Double defValue) { - try { - return Double.parseDouble(v); - } catch (Exception e) { - return defValue; - } - } - - /** - * 如果字符串为空返回Null,否则转换成Integer返回,如果转换失败则抛出异常。 - * @param v - * @return - */ - public static Integer getInteger(String v) { - return isBlank(v) ? null : Integer.parseInt(v); - } - - /** - * 将对象转换成字符串。 - * @param value - * @return - */ - public static Integer getInteger(Object value, Integer defValue) { - try { - return Integer.parseInt(getString(value)); - } catch (Exception e) { - } - return defValue; - } - - /** - * 将字符串转换为整型,如果转化失败返回-1。 - * @param v - * @return - */ - public static int getInt(String v) { - return getInt(v, -1); - } - - /** - * 将字符串转换成整数,如果转换失败返回默认值。 - * @param v 字符串 - * @param defValue 默认值 - * @return 转换后的整数 - */ - public static int getInt(String v, Integer defValue) { - try { - return Integer.parseInt(v); - } catch (Exception e) { - return defValue; - } - } - - public static boolean isBlank(String v) { - return v == null || v.trim().length() == 0; - } - - public static boolean isNotBlank(String v) { - return !isBlank(v); - } - - public static String getDBValue(String val) { - if (val != null) { - val = "'" + val + "'"; - } - return val; - } - - public static String getString(Object obj) { - return getString(obj, null); - } - - public static String getString(Object obj, String defValue) { - if (obj == null) { - return defValue; - } - return obj.toString(); - } - - public static String getStringLeft(String str, int len) { - if (isBlank(str)) { - return ""; - } - len = str.length() > len ? len : str.length(); - return str.substring(0, len); - } - - public static void checkStringEmpty(String str, String errMessage) { - if (str == null || str.isEmpty()) { - throw new RuntimeException(errMessage); - } - } - - public static void checkNull(Object o, String errMessage) { - if (o == null) { - throw new RuntimeException(errMessage); - } - } - - public static void checkArrayEmpty(Object o, String errMessage) { - if (o == null) { - throw new RuntimeException(errMessage); - } - } - - public static List getDeclares(String str) { - Pattern p = Pattern.compile("(?<=\\u007B).*?(?=\\u007D)"); - Matcher m = p.matcher(str); - List result = new ArrayList(); - while (m.find()){ - if (m.group() != null){ - result.add(m.group()); - } - } - return result; - } - - public static void stdout(StackTraceElement[] stackTrace, Object... args){ - StackTraceElement s = stackTrace[1]; - String str = String.format("[%s] %s.%s(Line: %d) ", CustomUtil.dateFormat(new Date(), "HH:mm:ss.SSS"), - s.getClassName(), s.getMethodName(), s.getLineNumber()); - for (Object obj : args) { - str += ", " + obj; - } - System.out.println(str); - } - - public static String getStringDate(String format) { - return new SimpleDateFormat(format).format(new Date()); - } - - public static String getStringDate(String format, String date) throws ParseException { - - String olddate=date; - - - if(date.isEmpty()||date.equals("00000000")){ - return ""; - } - if(date.contains("-")){ - date=date.replace("-",""); - } - - if(format.contains("-")){ - Date rq = new SimpleDateFormat("yyyyMMdd").parse(date); - SimpleDateFormat sdf = new SimpleDateFormat(format); - date=sdf.format(rq); - } - - return date; - } - - public static String upperFirstWord(String str) { - String firstWord = str.substring(0, 1).toUpperCase(); - return firstWord + str.substring(1); - } - - public static String replace(String str){ - str=str.replaceAll("'","''"); - str=str.trim(); - return str; - } - - public static char getSeparator() { - return '\002'; - } - - public static String MerchantCode2name(String code){ - if(code.isEmpty())return ""; - - String name=""; - RecordSet rs= new RecordSet(); - rs.execute("select NAME_ORG1 from uf_Merchant where PARTNER= '" + code + "'"); - if (rs.next()) { - name = rs.getString("NAME_ORG1"); - } - return name; - } - - public static void main(String[] args) { - try { - System.out.println(getStringDate("yyyyMMdd",null)); - } catch (ParseException e) { - e.printStackTrace(); - } - } -} diff --git a/customization/commons/LocalTestAction.java b/customization/commons/LocalTestAction.java deleted file mode 100644 index 41a2d35..0000000 --- a/customization/commons/LocalTestAction.java +++ /dev/null @@ -1,136 +0,0 @@ -package customization.commons; - -import weaver.conn.RecordSet; -import weaver.general.Util; -import weaver.hrm.User; -import weaver.interfaces.workflow.action.Action; -import weaver.soa.workflow.request.RequestInfo; -import weaver.soa.workflow.request.RequestService; - - -import java.util.HashMap; -import java.util.Map; - -/** - * Action测试 类。 - * @author - */ -public class LocalTestAction { - - private Integer requestId; - private String actionClass; - private Integer lastOperator; - private String src; - - public String getRemark() { - return remark; - } - - public void setRemark(String remark) { - this.remark = remark; - } - - private String remark; - - private String mainFields; - private Map dtFields; - - public LocalTestAction(Integer requestId, String actionClass) { - this.requestId = requestId; - this.actionClass = actionClass; - } - - public Integer getRequestId() { - return requestId; - } - - public void setRequestId(Integer requestId) { - this.requestId = requestId; - } - - public String getActionClass() { - return actionClass; - } - - public void setActionClass(String actionClass) { - this.actionClass = actionClass; - } - - public Integer getLastOperator() { - return lastOperator; - } - - public void setLastOperator(Integer lastOperator) { - this.lastOperator = lastOperator; - } - - public String getSrc() { - return src; - } - - public void setSrc(String src) { - this.src = src; - } - - public String execute() throws Exception { - String result = null; - Action action = (Action) Class.forName(this.actionClass).newInstance(); - - - - RequestService requestService = new RequestService(); - RequestInfo req = requestService.getRequest(requestId); - - req.setLastoperator(this.lastOperator == null ? null : this.lastOperator.toString()); - //req.setRequestManager(new RequestManager()); - req.getRequestManager().setSrc(this.src); - req.getRequestManager().setFormid(Util.getIntValue(getByRequestId(requestId).get("FORMID").toString())); - req.getRequestManager().setCreater(Util.getIntValue(getByRequestId(requestId).get("CREATER").toString())); - req.getRequestManager().setLastoperator(this.lastOperator); - req.getRequestManager().setBillid(Util.getIntValue(getByRequestId(requestId).get("FORMID").toString())); - req.getRequestManager().setIsbill(Util.getIntValue(getByRequestId(requestId).get("ISBILL").toString())); - - - req.getRequestManager().setRequestid(this.requestId); - req.getRequestManager().setRemark(this.remark); - - - - User user=new User(1); - req.getRequestManager().setUser(user); - result = action.execute(req); - if (CustomUtil.isNotBlank(req.getRequestManager().getMessageid())) { - throw new Exception(req.getRequestManager().getMessageid() + ": " + req.getRequestManager().getMessagecontent()); - } - System.out.println("执行结果:"+result); - - /* - if("1".equals(result)) { - WorkflowRequestInfo responseInfo = new WorkflowServiceImpl().getWorkflowRequest(this.requestId, this.lastOperator, this.requestId); - String resp = new WorkflowServiceImpl().submitWorkflowRequest(responseInfo, this.requestId, this.lastOperator, this.src, this.remark); - System.out.println("流程提交结果:"+resp); - } - */ - - return result; - } - - - private static Map getByRequestId(int requestId) { - RecordSet rs = new RecordSet(); - String sql = "SELECT T1.REQUESTID, T1.WORKFLOWID, T1.REQUESTNAME,T2.ISBILL, " - + " T1.CREATER, T2.FORMID FROM WORKFLOW_REQUESTBASE T1" - + " INNER JOIN WORKFLOW_BASE T2 ON T2.ID=T1.WORKFLOWID" - + " WHERE T1.REQUESTID=?"; - Map data = new HashMap(); - if (rs.executeQuery(sql, requestId) && rs.next()) { - data.put("REQUESTID", rs.getInt("REQUESTID")); - data.put("WORKFLOWID", rs.getInt("WORKFLOWID")); - data.put("REQUESTNAME", rs.getString("REQUESTNAME")); - data.put("CREATER", rs.getInt("CREATER")); - data.put("FORMID", rs.getInt("FORMID")); - data.put("ISBILL", rs.getInt("ISBILL")); - } - return data; - } -} diff --git a/customization/commons/WSBaseInfo.java b/customization/commons/WSBaseInfo.java deleted file mode 100644 index 72fb90d..0000000 --- a/customization/commons/WSBaseInfo.java +++ /dev/null @@ -1,152 +0,0 @@ -package customization.commons; - -public class WSBaseInfo { - - private int formid = 0; - private String creater_workcode = ""; - private String creater_lastname = ""; - private String creater_departmentid = ""; - private String creater_departmentname = ""; - private String creater_departmentcode = ""; - private String creater_workcodeAndName = ""; - private String creater_department_codeAndName = ""; - - - private String sys = ""; - - private String current_workcode = ""; - private String current_lastname = ""; - private String current_departmentid = ""; - private String current_departmentname = ""; - private String current_departmentcode = ""; - private String current_workcodeAndName = ""; - private String current_department_codeAndName = ""; - - public int getFormid() { - return formid; - } - - public void setFormid(int formid) { - this.formid = formid; - } - - public String getCreater_workcodeAndName() { - return creater_workcodeAndName; - } - - public void setCreater_workcodeAndName(String creater_workcodeAndName) { - this.creater_workcodeAndName = creater_workcodeAndName; - } - - public String getCreater_department_codeAndName() { - return creater_department_codeAndName; - } - - public void setCreater_department_codeAndName(String creater_department_codeAndName) { - this.creater_department_codeAndName = creater_department_codeAndName; - } - - public String getCurrent_workcodeAndName() { - return current_workcodeAndName; - } - - public void setCurrent_workcodeAndName(String current_workcodeAndName) { - this.current_workcodeAndName = current_workcodeAndName; - } - - public String getSys() { - return sys; - } - - public void setSys(String sys) { - this.sys = sys; - } - - public String getCurrent_department_codeAndName() { - return current_department_codeAndName; - } - - public void setCurrent_department_codeAndName(String current_department_codeAndName) { - this.current_department_codeAndName = current_department_codeAndName; - } - - public String getCreater_workcode() { - return creater_workcode; - } - - public void setCreater_workcode(String creater_workcode) { - this.creater_workcode = creater_workcode; - } - - public String getCreater_lastname() { - return creater_lastname; - } - - public void setCreater_lastname(String creater_lastname) { - this.creater_lastname = creater_lastname; - } - - public String getCreater_departmentid() { - return creater_departmentid; - } - - public void setCreater_departmentid(String creater_departmentid) { - this.creater_departmentid = creater_departmentid; - } - - public String getCreater_departmentname() { - return creater_departmentname; - } - - public void setCreater_departmentname(String creater_departmentname) { - this.creater_departmentname = creater_departmentname; - } - - public String getCreater_departmentcode() { - return creater_departmentcode; - } - - public void setCreater_departmentcode(String creater_departmentcode) { - this.creater_departmentcode = creater_departmentcode; - } - - public String getCurrent_workcode() { - return current_workcode; - } - - public void setCurrent_workcode(String current_workcode) { - this.current_workcode = current_workcode; - } - - public String getCurrent_lastname() { - return current_lastname; - } - - public void setCurrent_lastname(String current_lastname) { - this.current_lastname = current_lastname; - } - - public String getCurrent_departmentid() { - return current_departmentid; - } - - public void setCurrent_departmentid(String current_departmentid) { - this.current_departmentid = current_departmentid; - } - - public String getCurrent_departmentname() { - return current_departmentname; - } - - public void setCurrent_departmentname(String current_departmentname) { - this.current_departmentname = current_departmentname; - } - - public String getCurrent_departmentcode() { - return current_departmentcode; - } - - public void setCurrent_departmentcode(String current_departmentcode) { - this.current_departmentcode = current_departmentcode; - } -} \ No newline at end of file diff --git a/customization/proxy/CustomResourceViewCmd.java b/customization/proxy/CustomResourceViewCmd.java deleted file mode 100644 index f138ed7..0000000 --- a/customization/proxy/CustomResourceViewCmd.java +++ /dev/null @@ -1,51 +0,0 @@ -package customization.proxy; - -import customization.commons.Console; -import com.engine.core.cfg.annotation.CommandDynamicProxy; -import com.engine.core.interceptor.AbstractCommandProxy; -import com.engine.core.interceptor.Command; -import com.engine.cube.cmd.resource.ResourceViewCmd; - -import java.util.Map; - -/** - * @author liutaihong - * @version 1.0.0 - * @ClassName CustomResourceViewCmd.java - * @Description TODO - * @createTime 2020-04-29 11:51:00 - */ -@CommandDynamicProxy(target = ResourceViewCmd.class, desc="重写resourceView.cmd") -public class CustomResourceViewCmd extends AbstractCommandProxy> { - @Override - public Map execute(Command> targetCommand) { - System.out.println(getClass().getName() + "command 执行之前做一些事"); - - //获取到被代理对象 - ResourceViewCmd rmCmd = (ResourceViewCmd) targetCommand; - //获取被代理对象的参数 - Map params = rmCmd.getParams(); - /* params.put("sqlwhere","id = t2.sourceid and (t2.sourceid in " + - "(select sbmc from uf_gxsboayy where ((startdate >= '2020-02-02' and startdate <= '2020-02-08') " + - "or (startdate >= '2020-02-02' and enddate <= '2020-02-08' )or (enddate >= '2020-02-02' and enddate <= '2020-02-08') " + - "or (startdate <= '2020-02-02' and enddate >= '2020-02-08')))or t2.sourceid in (select id from uf_yfsb where zyjb =0 )) " ); - - */ Console.log(params.toString()); - - //对参数做预处理 - //TODO - //参数回写 - //rmCmd.setParams(params); - //执行标准的业务处理 - Map result = nextExecute(targetCommand); - - //对返回值做加工处理 - result.put("我是Test的key", "我是"); - result.put("params", params); - - - System.out.println(getClass().getName() + "command 执行之后做一些事"); - - return result; - } -} diff --git a/customization/test/ActionTest.java b/customization/test/ActionTest.java deleted file mode 100644 index 3cfe466..0000000 --- a/customization/test/ActionTest.java +++ /dev/null @@ -1,96 +0,0 @@ -package customization.test; - -import org.junit.Test; -import aiyh.utils.fileUtil.WatermarkPoint; -import aiyh.utils.fileUtil.WatermarkPointEnum; -import weaver.file.FileUpload; -import weaver.soa.workflow.request.RequestInfo; -import weaver.system.SystemComInfo; -import weaver.workflow.request.RequestManager; - -import javax.imageio.ImageIO; -import java.awt.*; -import java.awt.image.BufferedImage; -import java.io.File; -import java.io.FileOutputStream; -import java.io.OutputStream; - -/** - * @author EBU7-dev1-ayh - * @create 2021/9/7 0007 18:43 - * Action test - */ - - -public class ActionTest extends BaseTest { - - @Test - public void testConfig(){ -// AddWatermarkAction addWatermarkAction = new AddWatermarkAction(); -// RequestInfo requestInfo = new RequestInfo(); -// RequestManager requestManager = new RequestManager(); -// requestManager.setBilltablename("formtable_main_32"); -// requestInfo.setRequestManager(requestManager); -// requestInfo.setWorkflowid("6"); -// addWatermarkAction.execute(requestInfo); - } - - @Test - public void testPath(){ - System.out.println(-170 % 90); -// System.out.println(Math.toRadians(0)); -// System.out.println(new WatermarkPoint(WatermarkPointEnum.CENTER)); -// System.out.println(FileUpload.getCreateDir(new SystemComInfo().getFilesystem())); - } - - - - @Test - public void createWaterMarkByText() { - File srcImgFile = new File("C:\\Users\\77449\\Desktop\\test.jpg"); - String logoText = "[ 天使的翅膀 ]"; - - File outputImageFile = new File("C:\\Users\\77449\\Desktop\\test_mark.jpg"); - double degree = -45; - OutputStream os = null; - try { - Image srcImg = ImageIO.read(srcImgFile); - - BufferedImage buffImg = new BufferedImage(srcImg.getWidth(null), - srcImg.getHeight(null), BufferedImage.TYPE_INT_RGB); - - Graphics2D graphics = buffImg.createGraphics(); - graphics.setRenderingHint(RenderingHints.KEY_INTERPOLATION, - RenderingHints.VALUE_INTERPOLATION_BILINEAR); - graphics.drawImage(srcImg.getScaledInstance(srcImg.getWidth(null), - srcImg.getHeight(null), Image.SCALE_SMOOTH), 0, 0, null); - - graphics.rotate(Math.toRadians(degree), - (double) buffImg.getWidth() / 2, - (double) buffImg.getHeight() / 2); - graphics.setColor(Color.RED); - graphics.setFont(new Font("宋体", Font.BOLD, 36)); - - float alpha = 0.5f; - graphics.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, - alpha)); - - graphics.drawString(logoText, buffImg.getWidth()/3, buffImg.getHeight()/2); - graphics.dispose(); - - os = new FileOutputStream(outputImageFile); - // 生成图片 - ImageIO.write(buffImg, "JPG", os); - } catch (Exception e) { - e.printStackTrace(); - } finally { - try { - if (null != os) { - os.close(); - } - } catch (Exception e) { - e.printStackTrace(); - } - } - } -} diff --git a/customization/test/AiyhUtilTest.java b/customization/test/AiyhUtilTest.java deleted file mode 100644 index 45d416f..0000000 --- a/customization/test/AiyhUtilTest.java +++ /dev/null @@ -1,771 +0,0 @@ -package customization.test; - -import aiyh.utils.Util; -import aiyh.utils.fileUtil.WatermarkPoint; -import aiyh.utils.fileUtil.WatermarkPointEnum; -import aiyh.utils.fileUtil.WritWatermark; -import aiyh.utils.httpUtil.HttpManager; -import aiyh.utils.httpUtil.ResponeVo; -import aiyh.utils.httpUtil.staticUtil.GlobalStaticCache; -import aiyh.utils.httpUtil.staticUtil.HttpStaticUtils; -import aiyh.utils.httpUtil.util.HttpUtils; -import aiyh.utils.mapUtil.ParaMap; -import aiyh.utils.mapUtil.UtilHashMap; -import aiyh.utils.sqlUtil.sqlResult.impl.BatchSqlResultImpl; -import aiyh.utils.sqlUtil.sqlResult.impl.PrepSqlResultImpl; -import aiyh.utils.sqlUtil.whereUtil.Where; -import com.api.aiyh_guijiu.service.WorkflowQueueService; -import com.api.aiyh_guijiu.vo.PicPsVO; -import com.api.aiyh_pcn.patentWall.service.PatentWallService; -import com.api.aiyh_pcn.patentWall.vo.PatentVO; -import com.drew.imaging.ImageMetadataReader; -import com.drew.imaging.ImageProcessingException; -import com.drew.metadata.Directory; -import com.drew.metadata.Metadata; -import com.drew.metadata.Tag; -import com.mzlion.core.http.ContentType; -import org.apache.http.HttpEntity; -import org.apache.http.NameValuePair; -import org.apache.http.client.entity.UrlEncodedFormEntity; -import org.apache.http.client.methods.CloseableHttpResponse; -import org.apache.http.client.methods.HttpGet; -import org.apache.http.client.methods.HttpPost; -import org.apache.http.entity.StringEntity; -import org.apache.http.impl.client.CloseableHttpClient; -import org.apache.http.message.BasicNameValuePair; -import org.apache.http.util.EntityUtils; -import org.h2.util.StringUtils; -import org.json.JSONException; -import org.json.JSONObject; -import org.junit.Test; -import sun.font.FontDesignMetrics; -import weaver.aiyh_quanshi.RequestApi; -import weaver.aiyh_quanshi.entity.QsResponse; -import weaver.conn.RecordSet; -import weaver.file.ImageFileManager; -import weaver.fna.invoice.utils.HttpUtil; -import weaver.general.GCONST; -import weaver.hrm.User; - -import javax.imageio.ImageIO; -import java.awt.*; -import java.awt.image.BufferedImage; -import java.io.*; -import java.net.URLDecoder; -import java.nio.charset.StandardCharsets; -import java.nio.file.Files; -import java.nio.file.LinkOption; -import java.nio.file.Paths; -import java.nio.file.attribute.BasicFileAttributeView; -import java.nio.file.attribute.BasicFileAttributes; -import java.security.KeyManagementException; -import java.security.KeyStoreException; -import java.security.NoSuchAlgorithmException; -import java.util.List; -import java.util.*; -import java.util.concurrent.ExecutionException; -import java.util.concurrent.Future; -import java.util.concurrent.locks.Lock; -import java.util.concurrent.locks.ReentrantLock; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -/** - * @author EBU7-dev1-ayh - * @create 2021/8/23 0023 17:55 - * 工具类测试 - */ - - -public class AiyhUtilTest extends BaseTest { - - @Test - public void testParaMap() { -// 使map可以链式调用,但是只支持String,Object的泛型,写死了 - Map map = ParaMap.create() - .put("name", "aiyh") - .put("age", 22) - .put("sex", "男"); - System.out.println(map); - } - - - @Test - public void testUtilMap() { - UtilHashMap map = Util.createUtilHashMap().uPut("id", 1).uPut("name", "%aiyh%"); - map.uPut("key", null).uPut(null, "value"); - System.out.println(map); -// 过滤键值都不为null,返回一个新的map,不影响原来的map - Map newMap = map.filter((key, value) -> !Objects.isNull(key) && !Objects.isNull(value)); - System.out.println(newMap); -// UtilLinkedHashMap用法一样。 - } - - /** - * 构建SQL条件 - */ - @Test - public void testWhere() { - System.out.println(aiyh.utils.Util.createSqlBuilder().updateSql("docimagefile" - , ParaMap.create().put("imagefileid", 2) - , aiyh.utils.Util.createPrepWhereImpl().whereAnd("docid").whereEqual(1)).getSqlStr()); - Where where = Util.createPrepWhereImpl() - .whereOr("test").whereEqual(2) - .whereAnd("id").whereEqual(1) - .whereOr("name").whereLike("%aiyh%"); -// 等效于下面代码 -// Where where = new PrepWhereImpl(); -// where.whereAnd("id").whereEqual(1).whereOr("name").whereLike("%aiyh%"); - System.out.println(where.getSql()); - System.out.println(where.getArgs()); -// WhereImpl类用法类似,但不推荐使用 - } - - @Test - public void testInnerPrepWhere() { - Where where = Util.createPrepWhereImpl() - .whereAnd("id").whereEqual(1) - .andInnerWhere("test").whereEqual("9") - .whereOr("innerOr").whereEqual("yes").endInnerWhere() - .whereOr("name").whereLike("%aiyh%"); - System.out.println(where.getSql()); - System.out.println(where.getArgs()); - } - - @Test - public void testInnerWhere() { - Where where = Util.createWhereImpl() - .whereAnd("id").whereEqual(1) - .andInnerWhere("test").whereEqual("9") - .whereOr("innerOr").whereEqual("yes").endInnerWhere() - .whereOr("name").whereLike("%aiyh%"); - System.out.println(where.getSql()); - } - - /** - * 构建单条插入SQL - */ - @Test - public void testBuilderSql1() { -// 创建键值对对应关系map - Map map = new HashMap<>(); - map.put("id", "1"); - map.put("name", "aiyh"); - map.put("age", "22"); - map.put("job", "java 开发"); - map.put("isnull", null); - PrepSqlResultImpl insertSql = Util.createSqlBuilder().insertSql("tableName", map); - System.out.println(insertSql.getSqlStr()); - System.out.println(insertSql.getArgs()); - } - - /** - * 构建批量插入SQL - */ - @Test - public void testBuilderSql2() { - List> list = new ArrayList<>(); -// 创建键值对对应关系map - for (int i = 0; i < 5; i++) { - LinkedHashMap map = new LinkedHashMap<>(); - map.put("id", i); - map.put("name", "aiyh" + i); - map.put("age", "22"); - map.put("job", "java 开发"); - list.add(map); - } - BatchSqlResultImpl batchSqlResult = Util.createSqlBuilder().insertBatchSql("tableName", list); - System.out.println(batchSqlResult.getSqlStr()); - System.out.println(batchSqlResult.getBatchList()); - } - - /** - * 构建单条更新SQL - */ - @Test - public void testBuilderSql3() { - Map map = new HashMap<>(); - map.put("lastname", "aiyh"); - map.put("loginid", "aiyh"); - Where where = Util.createPrepWhereImpl().whereAnd("id").whereEqual("22058"); - PrepSqlResultImpl updateSql = Util.createSqlBuilder().updateSql("hrmresource", map, where); - System.out.println(updateSql.getSqlStr()); - System.out.println(updateSql.getArgs()); - RecordSet recordSet = new RecordSet(); - recordSet.executeUpdate(updateSql.getSqlStr(), updateSql.getArgs()); - } - - /** - * 构建批量更新SQL - */ - @Test - public void testBuilderSql4() { - List> list = new ArrayList<>(); - List whereList = new ArrayList<>(); - for (int i = 0; i < 5; i++) { - LinkedHashMap map = new LinkedHashMap<>(); - map.put("name", "aiyh" + i); - map.put("age", "22"); - map.put("job", "java 开发"); - list.add(map); - Where where = Util.createPrepWhereImpl().whereAnd("id").whereEqual(i); - whereList.add(where); - } - BatchSqlResultImpl batchSqlResult = Util.createSqlBuilder().updateBatchSql("tableName", list, whereList); - System.out.println(batchSqlResult.getSqlStr()); - System.out.println(batchSqlResult.getBatchList()); - } - - - @Test - public void testHttpClient() throws IOException, JSONException, NoSuchAlgorithmException, KeyStoreException, KeyManagementException { - CloseableHttpClient httpConnection = HttpManager.getHttpConnection(""); - HttpGet httpGet = new HttpGet("https://www.baidu.com"); - CloseableHttpResponse execute = httpConnection.execute(httpGet); - HttpEntity entity = execute.getEntity(); - System.out.println(EntityUtils.toString(entity, StandardCharsets.UTF_8)); - - -// http://apigwaws-lite.porsche-cloudservice.com/env-101/Eflow/eflow/Services/appapi/GetExchangeRateList -// yZGiC98iGbbyQXw3WG19w5rE3swjU3ld -// CloseableHttpClient httpConnection1 = HttpManager.getHttpConnection(); - JSONObject param = new JSONObject(); - param.put("page", 1); - HttpPost httpPost = new HttpPost("http://apigwaws-lite.porsche-cloudservice.com/env-101/Eflow/eflow/Services/appapi/GetExchangeRateList"); - StringEntity stringEntity = new StringEntity(param.toString()); - stringEntity.setContentType(ContentType.APPLICATION_JSON.toString()); - httpPost.setEntity(stringEntity); - httpPost.setHeader("apiKey", "yZGiC98iGbbyQXw3WG19w5rE3swjU3ld"); - httpPost.setHeader("content-type", ContentType.APPLICATION_JSON.toString()); - CloseableHttpResponse execute1 = httpConnection.execute(httpPost); - HttpEntity entity1 = execute1.getEntity(); - System.out.println(EntityUtils.toString(entity1, StandardCharsets.UTF_8)); - -// CloseableHttpClient httpConnection2 = HttpManager.getHttpConnection(); - HttpPost httpPost1 = new HttpPost("http://apigwaws-lite.porsche-cloudservice.com/env-101/Eflow/eflow/Services/appapi/GetExchangeRateList"); - List nvps = new ArrayList<>(); - nvps.add(new BasicNameValuePair("name", "value")); - httpPost1.setEntity(new UrlEncodedFormEntity(nvps)); - httpPost1.setHeader("apiKey", "yZGiC98iGbbyQXw3WG19w5rE3swjU3ld"); - CloseableHttpResponse execute2 = httpConnection.execute(httpPost1); - HttpEntity entity2 = execute2.getEntity(); - System.out.println(EntityUtils.toString(entity2, StandardCharsets.UTF_8)); - - ResponeVo post = HttpStaticUtils.apiPost("http://apigwaws-lite.porsche-cloudservice.com/env-101/Eflow/eflow/Services/appapi/GetExchangeRateList", null); - System.out.println(); - } - - @Test - public void testUtil() throws IOException { - GlobalStaticCache.header.put("apiKey", "yZGiC98iGbbyQXw3WG19w5rE3swjU3ld"); - ResponeVo responeVo = HttpStaticUtils.apiGet("http://apigwaws-lite.porsche-cloudservice.com/env-101/Eflow/eflow/Services/appapi/GetExchangeRateList"); - System.out.println("=========" + Arrays.toString(responeVo.getAllHeaders())); - System.out.println(responeVo.getEntityString()); - System.out.println(responeVo.getEntityMap()); - System.out.println(responeVo.getCode()); - System.out.println(responeVo.getEntity(TestVo.class)); - TestVo entity = responeVo.getEntity(TestVo.class); - entity.getItems().forEach(item -> System.out.println(item.getCurrency() + " => " + item.getLocalCurrency() + " : " + item.getRate())); - } - - - @Test - public void testCallBack() throws IOException { - HttpStaticUtils.apiGet("https://www.baidu.com/s", new HashMap() {{ - put("wd", "java"); - put("ie", "utf-8"); - }}, null, response -> { - try { - System.out.println(EntityUtils.toString(response.getEntity(), StandardCharsets.UTF_8)); - System.out.println(response.getStatusLine().getStatusCode()); - } catch (IOException e) { - e.printStackTrace(); - } - }); - } - - - @Test - public void testPost() throws IOException { - GlobalStaticCache.header.put("apiKey", "yZGiC98iGbbyQXw3WG19w5rE3swjU3ld"); - GlobalStaticCache.paramMap.put("", ""); - long l = System.currentTimeMillis(); - ResponeVo responeVo = HttpStaticUtils.apiPost("http://apigwaws-lite.porsche-cloudservice.com/env-101/Eflow/eflow/Services/appapi/GetExchangeRateList", - null, null); - long l1 = System.currentTimeMillis(); - System.out.println(l1 - l); - TestVo entity = responeVo.getEntity(TestVo.class); - System.out.println(entity); - System.out.println(responeVo.getEntityMap()); - - } - - @Test - public void testAsync() throws IOException, ExecutionException, InterruptedException { - HttpUtils httpUtils = new HttpUtils(); - httpUtils.getGlobalCache().header.put("apiKey", "yZGiC98iGbbyQXw3WG19w5rE3swjU3ld"); - long l = System.currentTimeMillis(); - Future responeVoFuture = httpUtils.asyncApiPost("http://apigwaws-lite.porsche-cloudservice.com/env-101/Eflow/eflow/Services/appapi/GetExchangeRateList", - null, null); - long l1 = System.currentTimeMillis(); - System.out.println(l1 - l); - System.out.println("test"); - ResponeVo responeVo = responeVoFuture.get(); - long l2 = System.currentTimeMillis(); - System.out.println(l2 - l1); - System.out.println(l2 - l); - System.out.println("aaaa"); - System.out.println(responeVo.getEntityMap()); - } - - @Test - public void testPDFUTil() throws IOException { -// File file = new File("C:\\Users\\77449\\Pictures\\Saved Pictures\\7c3fbba87cac45568374bdb64622f8d2!400x400.png"); -// String path = WritWatermark.addWatermark(file, "C:\\Users\\77449\\Pictures\\Saved Pictures\\2.jpg", -// "这个是水印\nthis is water", "宋体", 0, new Color(249, 231, 186), 0, 20, 0); -// System.out.println(path); -// Files.delete(Paths.get(path)); - -// ImageFileManager imageFileManager ImageFileManager(); -// imageFileManager.getInputStreamById(); -// imageFileManager.saveImageFileByInputStream(); - } - - - @Test - public void testPDfUtil2() throws IOException { - /*ImageFileManager imageFileManager = new ImageFileManager(); - InputStream inputStreamById = ImageFileManager.getInputStreamById(3639); - Image image = ImageIO.read(inputStreamById); - int width = image.getWidth(null); - int height = image.getHeight(null); - BufferedImage bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); - Graphics graphics = bufferedImage.createGraphics(); - graphics.drawImage(image, 0, 0, width, height, null); - graphics.setColor(new Color(200, 120, 120)); - graphics.setFont(new Font("宋体", 0, 50)); - String[] pressTexts = "我是水印".split("\n"); - for (int i = 0; i < pressTexts.length; i++) { - graphics.drawString(pressTexts[i], 20, 20 + (50 * (i + 1)) + (int) Math.round((height * 0.02))); - } - graphics.dispose(); - FileOutputStream fileOutputStream1 = new FileOutputStream(URLDecoder.decode("C:\\Users\\77449\\Pictures\\Saved Pictures\\水印-1.jpg", "utf-8")); - ImageIO.write(bufferedImage, "jpg", fileOutputStream1); - fileOutputStream1.close(); - - ByteArrayOutputStream bs = new ByteArrayOutputStream(); - ImageOutputStream imOut = ImageIO.createImageOutputStream(bs); - ImageIO.write(bufferedImage, "jpg", imOut); -//将图片转为inputStream流 - InputStream inputStream = new ByteArrayInputStream(bs.toByteArray()); - int i = imageFileManager.saveImageFileByInputStream(new FileInputStream("C:\\Users\\77449\\Pictures\\Saved Pictures\\水印-1.jpg"), "水印1.jpg"); - System.out.println(i);*/ - - int i = WritWatermark.addTextTileWatermarkById(3639, "文字水印测试!", new Color(200, 100, 155), - "宋体", 0, 50, -40, 0.5F,1, 300, 100, 200); - //FileInputStream fs = new FileInputStream(URLDecoder.decode("I:\\wind主题\\开始按钮\\gLogoMid-v3.png","utf-8")); - -// int i = WritWatermark.addPicWatermarkById(3639, 3724,new WatermarkPoint(WatermarkPointEnum.CENTER), -45, 0.5F); - - InputStream inputStreamById1 = ImageFileManager.getInputStreamById(i); - Image image1 = ImageIO.read(inputStreamById1); - int width1 = image1.getWidth(null); - int height1 = image1.getHeight(null); - BufferedImage bufferedImage1 = new BufferedImage(width1, height1, BufferedImage.TYPE_INT_RGB); - Graphics graphics1 = bufferedImage1.createGraphics(); - graphics1.drawImage(image1, 0, 0, width1, height1, null); - graphics1.dispose(); - FileOutputStream fileOutputStream = new FileOutputStream(URLDecoder.decode("C:\\Users\\77449\\Desktop\\水印1-1.jpg", "utf-8")); - ImageIO.write(bufferedImage1, "jpg", fileOutputStream); - fileOutputStream.close(); - } - - @Test - public void testCase() { - String query = "select * from uf_temp_attachment"; - RecordSet rs = new RecordSet(); - rs.executeQuery(query); -// 如果有时间转换,需要添加自定义注解weaver.aiyh_pcn.aiyh.aiyh.utils.annotation.DateFormatAn,指定个话类型 - TestCaseVo testCaseVo = Util.recordeSet2Entity(rs, TestCaseVo.class, true); - System.out.println(testCaseVo); - } - - @Test - public void creatJava() throws IOException { - Util.creatJavaFileByTable("uf_htmb", "createJava.test.createFile"); - String selectConfigBase = "select lf.id, lf.is_out_user,lf.is_sell_change,lf.will_write, " + - "wfvw.fieldname as will_write_field,wfvw.tablename as will_write_table, " + - "lf.is_customer_address,lf.workflow_type, lf.customer_id, " + - "lf.change_setting, wslu.selectvalue as update_mark, " + - "lf.manager_type, lf.customer_manager, wfvm.fieldname as manager_field, " + - "wsli.selectvalue as insert_mark,wfv.fieldname as update_insert, " + - "wfv.tablename as update_insert_table " + - "from uf_external_law_fir as lf " + - "left join workflow_selectitem as wslu on wslu.id = lf.update_mark " + - "left join workflow_selectitem as wsli on wsli.id = lf.insert_mark " + - "left join workflow_field_view as wfv on wfv.id = lf.update_insert " + - "left join workflow_field_view as wfvm on wfvm.id = lf.manager_field " + - "left join workflow_field_view as wfvw on wfvw.id = lf.will_write_field " + - "where workflow_type in " + - "(select id from workflow_base where activeVersionID in " + - "(select activeVersionID from workflow_base where id = 2) or id = 2)"; - Util.creatJavaFileBySql(selectConfigBase, "testSqlJava", "createJava.test.createFile"); - } - - - @Test - public void testPicPs() { - FileInputStream fileInputStream = null; - try { - BasicFileAttributeView basicview = Files.getFileAttributeView(Paths.get("C:\\Users\\77449\\Desktop\\5dc086a14941f4d5aeec44068986d04.jpg"), BasicFileAttributeView.class, - LinkOption.NOFOLLOW_LINKS); - BasicFileAttributes attr; - try { - attr = basicview.readAttributes(); - //attr.lastModifiedTime(); - Date lastmodfiyTimeDate = new Date(attr.lastModifiedTime().toMillis()); - Date createTimeDate = new Date(attr.creationTime().toMillis()); - System.out.println(lastmodfiyTimeDate); - System.out.println(createTimeDate); - } catch (Exception e) { - e.printStackTrace(); - } -// 获取媒体数据 - fileInputStream = new FileInputStream( - URLDecoder.decode("C:\\Users\\77449\\Desktop\\8308CC261209F70EBC82293C4092C8B5.jpg", - "utf-8")); - Metadata metadata = ImageMetadataReader.readMetadata(fileInputStream); -// 遍历Directory对象,每个对象里面包含标签 - for (Directory directory : metadata.getDirectories()) { - String directoryName = directory.getName(); - if ("Photoshop".equalsIgnoreCase(directoryName) || "Adobe JPEG".equalsIgnoreCase(directoryName) - || directoryName.contains("Adobe")) { - System.out.println("图片经过Adobe Photoshop!"); - } - System.out.println(directoryName); - for (Tag tag : directory.getTags()) { - if ("Software".equalsIgnoreCase(tag.getTagName())) { - if (tag.getDescription().toLowerCase().contains("Adobe".toLowerCase()) - || tag.getDescription().toLowerCase().contains("Photoshop".toLowerCase())) { - System.out.println("图片经过 Adobe Photoshop!"); - } else { - System.out.println("图片经过 " + tag.getDescription() + "!"); - } - } - if ("User Comment".equalsIgnoreCase(tag.getTagName())) { - try { - com.alibaba.fastjson.JSONObject.parseObject(tag.getDescription()); - System.out.println("图片经过手机端图片处理软件,软件未知!"); - } catch (Exception e) { - e.printStackTrace(); - } - } - System.out.println(tag); - } - } - } catch (ImageProcessingException | IOException e) { - e.printStackTrace(); - } finally { - if (fileInputStream != null) { - try { - fileInputStream.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - } - } - - - @Test - public void testPic() { - PicPsVO picPsVO = PicPsVO.PicPsVOBuilder.aPicPsVO() - .docId(0) - .fileId(0) - .fileName("name") - .build(); -// 通过物理文件的id进行获取对应的输入流信息。 - ImageFileManager imageFileManager = new ImageFileManager(); - // 通过文件id获取输入流 - InputStream inputStreamById = ImageFileManager.getInputStreamById(3786); - FileInputStream fileInputStream = null; - - try { - fileInputStream = new FileInputStream( - URLDecoder.decode("C:\\Users\\77449\\Desktop\\50c42dffc1d2af366364daf0adcd694.jpg", - "utf-8")); -// 获取媒体数据 - Metadata metadata = ImageMetadataReader.readMetadata(fileInputStream); -// 遍历Directory对象,每个对象里面包含标签 - for (Directory directory : metadata.getDirectories()) { - String directoryName = directory.getName(); - if ("Photoshop".equalsIgnoreCase(directoryName) || "Adobe JPEG".equalsIgnoreCase(directoryName) - || directoryName.contains("Adobe")) { - if (picPsVO.getScore() > 80) { - continue; - } - picPsVO.setDescribe("图片经过Adobe Photoshop软件,注意审核!"); - picPsVO.setScore(80); - } - String model = ""; - for (Tag tag : directory.getTags()) { - if(tag.getDescription() != null && tag.getDescription().toLowerCase().contains("Adobe".toLowerCase())){ - System.out.println(tag + " ===============> "); - } - System.out.println(tag); - if ("Software".equalsIgnoreCase(tag.getTagName())) { - if (tag.getDescription().toLowerCase().contains("Adobe".toLowerCase()) - || tag.getDescription().toLowerCase().contains("Photoshop".toLowerCase())) { - picPsVO.setDescribe("图片经过Adobe Photoshop软件,注意审核!"); - picPsVO.setScore(100); - } else { - if (picPsVO.getScore() > 70) { - continue; - } - picPsVO.setDescribe("图片经过" + tag.getDescription() + "软件,注意审核!"); - picPsVO.setScore(70); - } - if (!StringUtils.isNullOrEmpty(model) && picPsVO.getDescribe().contains(model)) { - picPsVO.setDescribe(""); - picPsVO.setScore(-1); - } - } - if ("Model".equalsIgnoreCase(tag.getTagName())) { - model = tag.getDescription(); - if (!StringUtils.isNullOrEmpty(picPsVO.getDescribe())) { - if (picPsVO.getDescribe().contains(tag.getDescription())) { - picPsVO.setDescribe(""); - picPsVO.setScore(-1); - } - } - } - if ("User Comment".equalsIgnoreCase(tag.getTagName())) { - try { - if (picPsVO.getScore() > 60) { - continue; - } - com.alibaba.fastjson.JSONObject.parseObject(tag.getDescription()); - picPsVO.setDescribe("图片经过手机端图片处理软件,软件未知!请注意审核!"); - picPsVO.setScore(60); - } catch (Exception e) { - if (picPsVO.getScore() > 30) { - continue; - } - picPsVO.setDescribe("图片可能经过未知软件!请注意审核!"); - picPsVO.setScore(30); - } - } - } - } - } catch (ImageProcessingException | IOException e) { - e.printStackTrace(); - } finally { - if(fileInputStream != null){ - try { - fileInputStream.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - } - System.out.println(picPsVO); - } - - @Test - public void testRe2String(){ - RecordSet rs = new RecordSet(); - String query = "select id from workflow_base " + - "where activeVersionID in (select activeVersionID " + - "from workflow_base where id = ?) or id = ?"; - rs.executeQuery(query,2,2); - System.out.println(Util.recordeSet2Array(rs, Integer.class)); - } - - - - @Test - public void testConfig(){ - WorkflowQueueService workflowQueueService = new WorkflowQueueService(); -// String watermarkConfig = workflowQueueService.getWatermarkConfig("2"); -// System.out.println(watermarkConfig); -// String picIsPs = workflowQueueService.getPicIsPs("259,260,261"); -// System.out.println(picIsPs); - -// String workflowConflictConfig = workflowQueueService.getWorkflowConflictConfig("3"); -// System.out.println(workflowConflictConfig); - -// String picPsConfig = workflowQueueService.getPicPsConfig(); -// System.out.println(picPsConfig); - - -// String watermarkConfig = workflowQueueService.getWatermarkConfig(); -// System.out.println(watermarkConfig); - - Properties prop = new Properties(); - try { - // 通过输入缓冲流进行读取配置文件 - InputStream InputStream = new BufferedInputStream(new FileInputStream(new File("H:\\e-cology-dev\\web\\test.properties"))); - // 加载输入流 - prop.load(InputStream); - // 根据关键字获取value值 - Enumeration enumeration = prop.propertyNames(); - while (enumeration.hasMoreElements()){ - String key = (String) enumeration.nextElement(); - System.out.println(key); - System.out.println(prop.getProperty(key)); - } - } catch (Exception e) { - e.printStackTrace(); - } - - } - - - @Test - public void testE(){ - System.out.println(!"-1".equals("1002095")); - } - - - @Test - public void testLock(){ -// Lock lock = new ReentrantLock(); -// lock.lock(); -// lock.unlock(); - } - - - @Test - public void testMap(){ - String query = "select * from meeting where id = ?"; - RecordSet rs = new RecordSet(); - rs.executeQuery(query,8); - Map stringObjectMap = Util.recordSet2Map(rs,true); - System.out.println(stringObjectMap); - } - - public Map getPropertiesMap(String prx){ - Properties prop = new Properties(); - Map map = new HashMap<>(); - try { - // 通过输入缓冲流进行读取配置文件 - InputStream InputStream = new BufferedInputStream(new FileInputStream(new File("H:\\e-cology-dev\\web\\test.properties"))); - // 加载输入流 - prop.load(InputStream); - // 根据关键字获取value值 - Enumeration enumeration = prop.propertyNames(); - while (enumeration.hasMoreElements()){ - String key = (String) enumeration.nextElement(); - if(key.contains(prx)){ - map.put(key.replace(prx + ".", ""),prop.getProperty(key)); - } - } - } catch (Exception e) { - e.printStackTrace(); - } - return map; - } - - @Test - public void getProp2Map(){ - System.out.println(GCONST.getPropertyPath()); - System.out.println(Util.null2String(null,"-1")); - Map propertiesMap = Util.getProperties2Map("test","aiyh.test"); - System.out.println(propertiesMap); - } - - - @Test - public void getInfo(){ - RequestApi requestApi = new RequestApi(); - QsResponse quanShiInfo = requestApi.getQuanShiInfo("59733978"); - } - - - - @Test - public void testHttpUtil() throws IOException { -// HttpUtil - HttpUtils httpUtils = new HttpUtils(); - httpUtils.getGlobalCache().header.put("authentication","8cb0ddd0fd07424e9e77140d1f7378ab"); - ResponeVo files = httpUtils.apiUploadFileById("http://192.168.3.2:8081/upload/fileUpload", - 713, "files", "2008年全国统一高考英语试卷(全国卷Ⅱ)(含解析版).doc", - new HashMap(){{ - put("fileName","2008年全国统一高考英语试卷(全国卷Ⅱ)(含解析版).doc"); - }}, null); - System.out.println(files.getEntityString()); - } - - - @Test - public void testHttpInvoice(){ - net.sf.json.JSONObject jsonObject = HttpUtil.postImage(new byte[1], new User()); - System.out.println(jsonObject); - } - - @Test - public void getMap() { - Map patentWall = Util.getProperties2Map("PatentWall", "aiyh.patentWall"); - List args = new ArrayList<>(); - patentWall.forEach((key,value)->{ - System.out.println("key ——> " + key); - String pattern = "\\$\\{(?(\\s\\S)+?)}"; - Pattern compile = Pattern.compile(pattern); - Matcher matcher = compile.matcher(String.valueOf(value)); - System.out.println("value --> " + value); - String parsing = String.valueOf(value); - while (matcher.find()){ - System.out.println("解析 ---> " + matcher.group("field")); - parsing = parsing.replaceFirst(pattern,"反正是对的"); - System.out.println("解析后———> " + parsing); - } - pattern = "#\\{(?(\\s\\S)+?)}"; - compile = Pattern.compile(pattern); - matcher = compile.matcher(String.valueOf(parsing)); - while (matcher.find()){ - parsing = parsing.replaceFirst(pattern,"?"); - args.add("haoba "); - } - pattern = "#sql\\{(?([\\s\\S])+?)}"; - compile = Pattern.compile(pattern); - matcher = compile.matcher(parsing); - while (matcher.find()){ - System.out.println("============执行SQL============"); - System.out.println(matcher.group("field")); - System.out.println(args); - System.out.println("============执行SQL结束============"); - - } - args.clear(); - }); - System.out.println(patentWall); - } - - @Test - public void testFormat(){ - System.out.printf("sql %s,参数 %s%n","我是SQL","我是参数"); - } - - - @Test - public void testGetList(){ - PatentWallService patentWallService = new PatentWallService(); - patentWallService.getList(null,""); - } - - @Test - public void testWidth(){ - Font font = new Font("微软雅黑", Font.PLAIN,10); - int wordWidth = getWordWidth(font, "我不知道具体是怎么回事,反正我不清楚"); - System.out.println(wordWidth); - } - - public int getWordWidth(Font font, String content) { - FontDesignMetrics metrics = FontDesignMetrics.getMetrics(font); - int width = 0; - for (int i = 0; i < content.length(); i++) { - width += metrics.charWidth(content.charAt(i)); - } - return width; - } -} \ No newline at end of file diff --git a/customization/test/BaseTest.java b/customization/test/BaseTest.java deleted file mode 100644 index cedc2f1..0000000 --- a/customization/test/BaseTest.java +++ /dev/null @@ -1,26 +0,0 @@ -package customization.test; - -import customization.commons.Console; -import org.junit.After; -import org.junit.AfterClass; -import org.junit.Before; -import weaver.general.GCONST; - -import java.net.InetAddress; -import java.net.UnknownHostException; - -public class BaseTest { - - @Before - public void before() throws Exception { - GCONST.setServerName("ecology"); - GCONST.setRootPath("H:\\e-cology-dev\\web\\"); - } - - @AfterClass - public static void after() { - System.out.println("单元测试结束!"); - } - - -} diff --git a/customization/test/CopyFileTest.java b/customization/test/CopyFileTest.java deleted file mode 100644 index 9cbb3df..0000000 --- a/customization/test/CopyFileTest.java +++ /dev/null @@ -1,64 +0,0 @@ -package customization.test; - -import aiyh.utils.httpUtil.ResponeVo; -import aiyh.utils.httpUtil.util.HttpUtils; -import aiyh.utils.mapUtil.ParaMap; -import com.api.aiyh_pcn.copy_attachment.dao.ConfigTableData; -import com.api.aiyh_pcn.copy_attachment.model.ConfigEmpty; -import com.api.aiyh_pcn.copy_attachment.web.CopyAttachment; -import org.junit.Test; -import weaver.docs.docs.seconddev.CreateDocForJSGJXT; -import weaver.docs.pdf.docpreview.ConvertMultiPdfTools; - -import java.io.IOException; -import java.util.HashMap; -import java.util.Map; - -/** - * @author EBU7-dev1-ayh - * @create 2021/8/29 0029 17:31 - * ceshilei - */ - - -public class CopyFileTest extends BaseTest{ - - @Test - public void testGetConfig(){ - CopyAttachment copyAttachment = new CopyAttachment(); - String s = copyAttachment.queryConfig("5"); - System.out.println(s); - } - - - @Test - public void testRequest() throws IOException { - HttpUtils httpUtils = new HttpUtils(); - httpUtils.getGlobalCache().header.put("apiKey","yZGiC98iGbbyQXw3WG19w5rE3swjU3ld"); - httpUtils.getGlobalCache().paramMap.put("ToKen","1"); - httpUtils.getGlobalCache().paramMap.put("pageSize","100"); - httpUtils.getGlobalCache().paramMap.put("page","1"); - ResponeVo responeVo = httpUtils.apiPost("https://apigwaws-lite.porsche-cloudservice.com/env-101/Eflow/eflow/Services/Services/ToiBuyService.asmx/GetVendorList", null); - VendorResult entity = responeVo.getEntity(VendorResult.class); - System.out.println(entity); - } - - @Test - public void testInt(){ - TestVo testVo = new TestVo(); - System.out.println(testVo); - } - - - @Test - public void testInvoice(){ - - } - - @Test - public void testPdf(){ -// ConvertMultiPdfTools convertMultiPdfTools = new ConvertMultiPdfTools(); - CreateDocForJSGJXT createDocForJSGJXT = new CreateDocForJSGJXT(); - int fileName = createDocForJSGJXT.creatDoc(null, "fileName", 8, "1,2,3"); - } -} diff --git a/customization/test/DocCopyTest.java b/customization/test/DocCopyTest.java deleted file mode 100644 index 1778c05..0000000 --- a/customization/test/DocCopyTest.java +++ /dev/null @@ -1,172 +0,0 @@ -package customization.test; - -import aiyh.utils.Util; -import aiyh.utils.sqlUtil.sqlResult.impl.BatchSqlResultImpl; -import aiyh.utils.sqlUtil.sqlResult.impl.PrepSqlResultImpl; -import aiyh.utils.sqlUtil.whereUtil.Where; -import aiyh.utils.sqlUtil.whereUtil.impl.PrepWhereImpl; -import com.api.aiyh_kafang.service.UploadByBase64Service; -import org.apache.axiom.util.base64.Base64Utils; -import org.junit.Test; -import weaver.conn.RecordSet; -import weaver.docs.docs.DocManager; -import weaver.file.ImageFileManager; -import weaver.workflow.workflow.WorkflowVersion; - -import javax.imageio.ImageIO; -import java.awt.*; -import java.awt.image.BufferedImage; -import java.beans.BeanInfo; -import java.beans.IntrospectionException; -import java.beans.Introspector; -import java.beans.PropertyDescriptor; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.lang.reflect.Field; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.net.URLDecoder; -import java.util.ArrayList; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; - -/** - * @author EBU7-dev1-ayh - * @create 2021/8/26 0026 13:19 - * wen dang fu zhi - */ - - -public class DocCopyTest extends BaseTest { - @Test - public void testCopyFile() throws Exception { - DocManager doc = new DocManager(); - doc.setId(16); - doc.copyDocNew(); - } - - - @Test - public void testUploadBase64() throws IOException { - ImageFileManager fileManager = new ImageFileManager(); - byte[] data = null; -// String base64 = new String("/9j/4AAQSkZJRgABAQEAeAB4AAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCANABOwDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD0yD/Urx2qTNRRcRL9KWmloSxxx6CmEjPQflRRTsIT3xTccdKfijFFhkZHsKTbz0FS4pcD0osIj2jHQU4LTgMUtMBoFLS0UwEpaWigBKWiigApaKWgA6UCiigBaWkpaADNLSUdqAFooooAKKKKAClpKKAFopKUUAFFFFABRSUUAFL2pKKACiiigAooooAKKKKACiiigAooooAKKKSgAooooAKKKKACiiigAoopKAFpKKKACiiigAopKKQC0UlFAC0lFFMQUUUlAC0UlFIBKKWkoAKKKKACkpaKAEpKWigBMUUtFACUYpaKAEpKWkzQAUlFJTAKSlooAKKKKAClpKWgApaKWgApaSigBaKKKACiiigBaKKKQBSUUUAFFFFMBaSiloAKSiikAUtJS0AFFFFABRRRQAUUU1iVUkUwHUUgOVBpaACkoooAKSiikAUlFFABRRRTATvS0UlAB3ooooASg0tFIBO1HvS0UAJRS4pcUAJQKdijFAxKKXbxRg0AJS0oFFACClopaAGmmnrTjSGgBKOlGKO1AhveiiigApBS0UAOb7oNJTj9xaZQMkUYRR7UU7FGKSGNxRinYopiG0U6igBtLS0UAFGKKWmAlFLSUAFFLRQAUUtGKACloooAKXtRRQAUUUtABRRRQAtFFFACYopaKADtRRRQAlLRRQAUUUUAFJS0lABRRRQAUUUUAFFFFABRSUUALRSUUAFLSUUAFFFFAB3ooooAKKKKACkpaSgBaSlpKACiiigApKWkoAWiiigAopKWgQlFFFAwooooEFJS0lABSUtJQMKKKKBBSUtFACUUppKACiiikAUUUlACUUtFADTRRR3pgJRRRQAtJRS0AGKUUUtABRRRQAUUtJQAtJRRQAtFFJQAtFJS0AFJRS0AFFJS0AFFFFABS0lLQAlGaWjvQAZooooAKKKKACkPSlooATtRRSUAKaSiigAoopKACiijtQAUd6KO9ABRRiigAoxRRQAlFLRSASlopaYCUtFKBSAKWkp1AwoxS0lACUmaU02gBaKSjNAB2pKWigQYpMUtFADaTtTj1pKAEpO9LSUASN9xaZSseBTaBk9FOpMUkAlHalopgJ2pKWjtQAlFLRigAopcUUAJRS44opgFFFLQAYopaKAEpaMUUgCiiigBaO1FHamAtFFFIAooooAKKKKYBRRRQAUUUUAFFFJQAUUUUAFFFJQAUUUUALmkoooAKKKKACikooAWiiigAopKKAClpKKACiiigAooooAKKKKACiiigBKKKKACiiigQUUUUAFFFJQMWkpaSgQUUUUAFJRRQAUUtJmgAooooAKSlooASiiigA7UlLSUAFFFFACUlOpKAGmkpzUgGaAAUoFLilxQAUUUUALRRRQAUlLSUALSUUUAFFFFAC0UUUAFFFFABRRRQAUUUUAFLRRQAUUUlAC0UUUAFFJRQAUmaWkoAKKSjigBaSiigApKWk5oAXtRRRQAtJ3opaAEooooAKKO9FIBKWk7UUwFFLSClpDDFLiilFABSiiigBaSlpKAE7U2nGm0AFFLSUAJ3pRSUtAgoNJmkzQAtJRmigBKO9FFACt9wU2nv/qxUeaBlukpe1FJAJSUtFMBKKWigBKKXFFABS4pKKAFoopaYCUUtJQAuKKSloAWkoopAFFFGaACijNFABRS0lABRRRQAUUUUwCiiigApaKKAEooooAKKKSgAooooAKKSigAooooAKKKKACiiigAooooAKKKSgBaKKKACiikoAWikooAKXtSUUCCiiigAoopKAClpKO1ABS0lFABRRRQAUUlFAC0lFFABRRRQAUUUUAFJS0UAJRS0YoAbS0lFABRS9qSgAopaSgAoopKAFxS0lFAC0dqSigBaKTNFAC0UCigBKKWkoAO1FFFABRRS0AFFFFACUtFFABRRSZoAWijrSUALRSUooAKKU0lABRRSUAFLSUUAFFJR2oAKSiloAKKKKACilooASlooFABR0opKAFFJR3pKACijNHekAUtJS0wCloopDF70tJRQA6ikzRQAtJRRQAUlLSUAIaKKSgAopKKACiim0CFopM0UAL1pQKQU8UAI/3BUdSv/q/xqKgC3RRRSQwpKWimAlFLRQAUUUHpQBFLPDBt86ZI933dxxmo/t9l/wA/kH/fYrmvGVvHealoFtKu6KW4IYZ6jisLVdS8G6Rq1xp8+jzM8DYZkJxQB6Kl5aScJdQse2HFTf0615pq+n6O2n6Hqmk28lt9quVXBY8jNdnJr1nJql9onzLdRW+4buA2R2pgaokR1DI4ZT0IORQ0sSHbJNGjejMAa878KXGqaJpu6dzPaPKyNABmSFieD9K1YrCDUNWaz8QW8st6FLRzxEhHTqPxoA64TwNwLiI/8DFO3Dfs3rvxkLnkivPl/wCENm0S51JEuo44JfKdRJ84b1xWUniea5sxdW8NzLqFm/l2k6oSrxej+9AHqomh6edHkf7Qp24bgu4bjyBnk15n9p8OXKCa80/VIrmT5pdgbCt3xWtNb3UegSaq90HawXfZSq3JT+64oA7bOPvEAe9J5kf/AD1j/wC+hXn2neJ77xH4R12a8EaNDEApj461E0HhzR/D+l3WrS3vm3cecpITk96APRg6f89U/wC+hTu2c/lXmos/Det6VqE2k3d8s1pEZNzORj0rsfCTvJ4U095HZ2MfLMck0AbVFJS0gCikopgLRSUUAFLSUUALRRSUALRSUUAFFFFABRSUUAFFFJQAtJR2ooAWikooAWikooAWikooAWkoooAKKKKACiiigAooooAKKKSgQtFJS0AFJRSUALRRSUAFFLSUAFFJRQAtFJSigAooNJmgB1JSZppNAD80ZqPNHPpQA/PFGaYA3pRyOv8AOgB+aTNJ+X50mG7CgB1LUfzDsaUGgB9FNzS5oAWiko7UAFJjmlJpM0AFFFFABRmkzSZoAWne9Mpc0AOo70lGaAFopKWgAopKM0ALS03NGaAHUCkooAWkoooAKKKKACiikoAO9Lmq8t1FAjs7cIQGx2z0pyzxmcwhv3gGdp7igCbNJ3qNpUQ4c4qFdRtHZQkud33eOuKALeaTNMjcSjcucH1qE38AiklLfJG+xj70AWu9FRrIjkqrAleo7iojeQb9nmZYHBAHSgCxSHjmoTdwAA+Z95to9zU3tQAitkZpe1JwPYDvTY5Y5cmKRXx1welAD+9LTQy+Z5e4b8Z255xTFnhkk8tJVZ/QHrQBL2oqITwtN5IlUyf3c80huIROIDMok/u55oAmoqF7qCOURvMqueME095Y0dEeRQ7nCjPWgB9JmoZ7qG2KiaQIW6ZpJrmG2QPNIFVuh9aAJ6SoTdQIiyNKNj8qRzmlW6t2tvtKygw4zu9KAJaKaJYzD528eXjdu7YpIpUniWWJgyMMgjvQBJQKKKAFFLSUUgHUtNFLQMKWkooELRRRxQMQ0UUGgBpNJ9aWkoEFFFFMYlJTqSkITFLijmlxQAAU4UgpwoGD/wCr/Goanb/VmoaALVLRRSQCUUtFMBKKWigBKCOKWg0Acf4vuEtvEHht5WCxCdizE8DpWNrng611fWb2/TXbRFnfcF3dK6bxJd6IuoabY61bhxcEiKRjgKfeuYu77wda3V1CNCnlFq22SRMlR75zQBJqyQ6fpXhnTEuobiSC7UMY2znkVDqlzZ2vxG1O5v7Ke5ihhQgwjmM4HJ9qXTtV8HT3Uclro1yoRwTNg4jPYmrev2uo6T4hbX9OUXtlfqI5okG7K45/SmBR1W+vXu7bxVokwigu2W1aOVe/TJH4VvJ4sm0a7Oma5C096oDCW3TIKHufSrtnZaRd+HI1js5I7OJjOsL8MrDmsTW9c06Wwg8S6YwF4JBbSxueqdCCKALGr6L4TsdKbUpLdmt53AJifOSe+Kn0TQ77Q9CubKwuIDcyy+dAZP8AnmfUVPqFho1p4XaFoJZrK4cORCdxVj3HtXL3Ft4itvGVhI91AmbfZBI3COnZT/tUAa2q33i7StJl1CS4024hjIDhFyRzilvLFrLT1u4x52n3sSyX1oD8y56laNXtLK3sJfDML+XqGoL54Lt8jMDyAfwrP1J7+4hs9S0o7bvSovKntH6v68dxQBp3en6Rp3gbVZ9GyILmEMctnBrP1Pw63ifwp4eNldwI1vD829x3Aq5pV5os2gag0trOhmAN3akYIJ/uj0rJabwTbRgGDU4Yx7MAKALekeHJ/DOi6411cwSCe2IXy2HXBrqvCIx4R0wf9MqwNI0XwxrySfZDfFQM4kcjIrsbK1isLKK0hz5UQ2rmgCxRRRQAUUUUgCiikpgFLSUtABRRRQAUUUUAFJRRQAUUUlABRRRQIKKKO1Awooo7UAFFFFABRRRQAUUlFAC0lFZ1xeXVlq1vE0Pm2Vz8odesbe/tQBojJ4ozWF4lvXh0aG4tJijG6SPev1wava1fvpWi3N9GokeBAxU96AL+aK57Udb1O10aLUIrOLbIUwC3TdW+pJRSRglQSKAHGm9sinJ/rB6VzvhR5mm1VZZndY7woischR7UAdD2zR2rn9BknbX9fjkmZ445wEQnheO1dB7UABpO2aB94fWsLRt58Sa6hlZkWRdqE8LkUAbm4AgEgE9M96GIUEsQAOST2rD1K5ttXtL2wjklhvLZ9qug5RxyDVa41J73SF0wSOb7aI7tlX7nqfxoA6VWDKGUhlIyCDwaWsbSr+xhul0K384vDCHDOOorYXk89BQA3enmGLevmAZ255xRJIkMTSSuERerHoK5jTC13rGo64InmCv5EKqew6mpfFdxcnwhqQe0aJTF97PvQI6IMCAykMrDII70/tWTYyXcWkWccNluAt1wxbjOKsWD37QMuoxosoPylDwRQMuE+lRtKiOqPIiM5woJ5NV72MeWZJbz7NCoyzZx+teRy+L4bfz/ADopL2+SdjBOz/KFzxigD2RpETd5kipt67jjFYOp+NtB0slJLsSyD+CL5jXmEY1/xjqMpnujGwAEm59iqv0q1B4d0fRdUn/ti8a4t4Yww8pT8zHtQBu3vxYHK6dprOezSH+lZTeMfGmpNm0tWjU9kiJrs9M02L7LHLpmj20MTjckk4ySPWpb6e8064sobu9CLduY1FvH0OKAOHkh+IN2jSSSXEaKpY4IXiqunaX4t1y0+1WupS+VvKHfNtOR1r0aSCLZIry6g7bWHoOhrF8IQ2n/AAjcTSWt0z+a4yhOG56mgDA/4RLxmowuoscelxTW0Xx/Z4aO4uXA/uyZrtHnsI9asdNNjdhrpS24uRtArVOjQBsx3F0n0kNAjzGXxN430Rk+2h8N90Sx53VoW3xTv4AF1LSgc91yP513kukzOqj7cZAh3KJkDAGqWoWM7QM97pdnfRopJKDa2KBlbTfiJoGoFUeZrWQ8YlGB+db8esadLeJaRXsTzyLuRVbORXmF5onhzXUhk0kTWkjSBZN6kovrk1SvfBOt6NKLywP2hIzuSaBskfhQB7SMjrSg815lovxQkikW0162II4MyDBH1FdgdYil8meHU4PslwdscmM4PofSgC/a6vbXV/Np5zFeRcmJ+rL6j1puqammmGBPKaaad9qxr1x3NYN1bzv8RNPBmUSJZuRIB1qa2W8l8d3du91lorRWRyvTJ5oA6cA4zjHtR+Ga520Z9U1iQi9uM2T7QyjCSeorosnOaBFe3vLe8VzBIGKHa691PvUc18sMhQwysR1IHFQxaRFBr82pxMUaeII8Q6Mf71QWusT3Oo6hZLZmT7LIELKeCCKALZ1DbH5jW0oj/vVBpmsf2nPMgtJYkT7kjjhqw7OK4j8Z31gDNJZi3EwtmfgMe1bD6tdQ69Y6a1oIop42br0xQBsjniqSanbS6vNpiFjcRIHbjirbMUVnVS7KCQo71zugQXttNeXd1ZP9pvJdxOeQvYUAaEWqSy+KbjShGphigWQv3BNO1LVm0iQS3MDNYtwZk52H3FY3h+5mn1rXL9LZ5FeYRLz0A6it+SWaeB4ZbAtHIMMpPUUAWYpY54UmhcPFIu5WHQiiZpEiLRR+Yw/hrMt01C1e1t7SzWOxiG11dvm/CthP9YPTNAFMS3zbcWi5Pq1U9M1e61WOaSCyVVhlaJgz9xVDw6guZ9Rae9lzHeMqLv4AqPwxbRC11BZbp0b7ZIeHxQBqaZq13q8DzQWaqEkaIhn7jrVmL+0vt++XyfshXG1WyQfWsPwtawf2bOslwwP2qXo+M89aseDw66RcBnZwLuQKWOeM0AdF0opO1JmgB1JmiigApOhoooAyNWt9sDBHYvcSqzDHQCnuyS3kMBZ/PK5SQDoKssJPtLTGPe2Nka9gPU1Bb2lzp8ryJi4EnqcFB6D2oAlvlP8Ao53Asj/N7jFZ8dqE8kgZMSuAPXdWndRSzx7YlVXYcseoqvHZyySXD4MDAKsZPIJHegCe0DRaakaNulCYz6Gs6KKWbwo6jHm/MzH1YGti1UxxfOirIfvbehqOygMFqYmHV2JH1NADbaNpJIbs7cvEA+O9UbK4lNxI7IirPO0ZyORgcVaihu7eeGBMG2VywfuF9DTxYIZWd2JHmmRVHY0AVD+5063V0OYJDJJ9K0XaRo0khAO4A4PoaiubZnj8uJVAbhmJ5AqwyPtURvjbgdOooAzvELvHoUxQlSzIpI9CcGoJxFpXiGyEQ2xS2rB1HcqODWrcwR3VvJbyjKOMGoIrFVuVuJn810j8pcjgCgDOs0D+JJmlly9xZ9u3ParBs0NzbR2w/wCPJWZ5R3OOlWTYL/aP2xSFbyvLwB096ZBYTQlAbstGrbioXG760AZESbPC1lfqP9KFwH3dyS2CKbMu7wpeXhG26F0XV+4IbgVtrpsasqbybdJPNWP0P+FI2mxMZELE28kgkaLtuoAr3dujWjW8SeZc3e1yW/5Z+ppdViVbjSG+8yXCru9eKmfTXaeaRLx0EvUAcgegqWaxSZbYGRh9nYMvuR60AUkRZ/EOqLOoYLAqxg9gRyaoeHTJc39rHc/PGlqwQt3+Yj+VblxZrNdC4VzHIUMbkfxLSfYolFv5OYmgBVWHoetAGVoYjitHmlyfslzLHAvqM8CrcVmYNGvUkA3zb5Cn93PapzpkXlwpG7xCMlht7k96fHZJFFLH5kjmb77MeaBjNNAfQLYEZBgwc/So9Az/AGBaD0DfzNWoLZba0W1R2KKu0E9QKW1tktLdYIySinjNAE4NLSUtAgFFGfSkpALThTe1KKBi4paSloAKKWkoAKSlpKAG4pKWjGKBCUUUUAFFFLQAmKXFLRQAoFKBQKUUAI3+rNRVK33TUXagZaoopKSAWikopgLRSUUAKKD0pKDQBynjTSoLgWer3SCa2sCTLCf4gfSqGj2lp4dlnaaJptG1kAxuefKB7N+dbfiXVo7OL7HPpVzfQTplvJGar6FrmleI9GubZLd4LO2AikSbjaPrQBmW/hWXR9SuGs9Stk0q8OGt5D95O+DUkuvGy1C00Lw9HI0dvKBOcbl2n3p/iqx0o6bY6fPbS+S6lLe7RvlhJ6Fj6Ulp4eOkWEB0fVLWC82bbiR23LJ6GmB1rSW+5omlj3MMFNwzzWI3g3w8scjPYkqAWYBjzXNjSRq2tQefP5OsW8weSXcRHcoD/D71oy+LLq08cXekzWz3FiFC4iXJTIHJ9qAMefW5tI0qK88OXMR0p5vLa2nGXRs8j6V0XifzXEX2yMT6Y8asyxD97C+OGHfGa5yDw5pB+IN5pTlo7VrfzY0L4CyHHIroZ2Tw7arrGtM0t1H+4VoeQy/w5FAHMLbTeK7dLe9int9VtzizuCpUMg9fetbxPfWekJazqZF1WGJQsyDMbkcENVA+J/F66K+sSC1W1E3lhHjw+CeDS6tLb+HNQhs72KSbRNRjEs+4bijn+6aANiLTdV1XTk1eaW1i1NADbvGRsZT2anagNVm8K6pHq6Wckvlfuhb4JqneaZFo1p5lo8s2hXCq80Af94g7FavJp2gaTZJr8U1y9vGA3Mm7g8cigBjeILfw/wCDLCQDEzWoEbKmQGA6Guj0W9l1HQ7O8nVVlmjDMF6Vwiabf2kd7qEnlXOiX5Mr2/8AGiE9VHY13ukLbLpFotnu+zCMeXu6496AL1JRRQAUUlFAC0lLRQAUCiigBaKSigBaSlpKACiiigApKKKACiikoELRRRQMKSjNFABRRR2oAKKKSgAo9qKKAEYMUYIQHx8pPrWPFrnnaffefCYbq0+WRD0z2IrYPFY2tlJbmxslC+bdzDfjqVXnmgDL8Q6e0Hhm1JnfDXMTFT0yTV3xDpyLoGrTebKTLByGPAxiq9patq+ra3p95PI1tb3StEg/hxyKz5J528G+IlnnaaQXDRLnsMjAoAt6090vgu1DKnl4h+YHnqK6ol/IUx43bBjPTpXJ62l9F4OgjmSPy18kEg89RXWqf3ceP7g/lQBXVtSMi/JABn+9WN4TZjNrG/G4Xxzj6V0S5Mi/Wud8L8Xmtj/p+P8AKgCLTLxLPxN4iVlZ3MiMqqOTkVch07UbvVE1K8uzAI/9Xbp0x71W0b/kbvEBx8wZOfwroDIFwWONxwM+tADZo55NvkTCJgecjOa5jT7Ke58Sa6hu2iYSxtuQdeK6tc7xXP6dLHD4p14yOE5jPJ9qAKD/ANoR3viCbTHAvIJ43xj/AFgxyKnjnn/tvW3hTFxNbxYUdmI5p8v2S38SsFS4kk1GLzVMTY+7VlbaJrhpBpt4JHGGfdycetAFbT4JbXxksE0vmyLp4DOepOa1dZupLbTnSAZupwY4R7461meG57fUr29v1t5oZoG+zHzGzkCt028b3guGG5lQqgP8NAGF4HEn/CLxrIcuJZFYj1zVbScax4fmi1LUG8pp5ISjegbirvg4Y0HB/wCfmX/0KqHhdsaHMDYmcfbJQDj/AGqAJPEbi18MSLaaq5ZCiKAe2cVe1jxLYeG9Miku5fMnMY2RA/M5xXO+OdXtbLQpbCWyMF1cYMWAOMHqa5TRNBu/E9ydX1q4cWMWAXbq+P4VoAbqGo+IvGQnlAZbGEFyqnCKPc9zR4a0/StStUtrq2kbUJpNsDk7UH4120Vrdanf22lWtqtnoqDfMBw0g7A/WqXhnTbDU7DUtLcmOS1vjJCV+8mD2oAdpGgQHxnqcGoESvBDGFAO0GtjxMtknhfVreOGJJIogSMc+xrM8Z6LJb7tatruRLiWSKLCnHIOAapSadLdeK9QsJ7qXyJLSLzWJyef/r0Ad5pgA0exCjC+Qv8AKsLxc6xT6FOFLlL3hR1PFdBDBEbGOCOTdHEoQMp9KwPE8PlXOgmGNn2XmSOvagRqjU5po5GFjOIyrcn6VyXhS/uYdNsoEjch7iaQgHqueldo91MXcfY5ApB5/CuQ8KpdSeGZzBbF7gXEghc8BPmoGTx3E83jnSRMTxDKAT169K6HUrme1bEABZoywz6jtWNDp98PEOj3E9qY1t4n86Qcgk961bp2uEFxChaE52sBnJ/woAqwa3qE5QDTsln24zg4HWtCW9mEbK9m6hlI5PtSWUUqXf70bZVUEnHDKfT3pNWkGwoGwyxO4+uMCgRzvgUsvhqQLZiXzLmTcpx61p3OnagFEmkRmznDZKs+UYemKxfh7C40hW81vNkmkDjPAwfSu6yEVmZgFAySe1AHD+INJtL+yP8AbmnG2ugOLu2XKk+9efaloer6DZkvuNhMcrIhyh9D7GvdElhuo2CsssfRh1Fcr4t06a08LaiLIhrVo8vA/Oz3WgZjeGvEI1vxNp8yxN5ttYmKRCeWPt6104tdQXxHfajHauqT2ohQnqCK8r1PRn0m3sdZ0a8eSJ4wzvGfmhfuD7V3PhnxFaeINGnS6u5o9ThhbeN+A/HUUAdFHJeWOmrb6XphZ85ZnIwx7mtZo2urQCTfC7AFgp5U1j+DcjwnZMZXkLAsWY5PWt3k+9AjmWie28f6VGtxM0bWzllZuDio9NR5PEviLZefZgJ0yce1W7p0PjzSzuXC28ik56HsKj0q2STxF4hM0YYGdMZHtQBUiif/AIT+8zf4xYp+8H1qadGTxroxNyZwYJOakS0ji8aXszQ/uPsSduOtRfaLS78a6YtmQfJhk8wAfdz60DOoHBqvf3a2WnXN5IeIoy1Wcc+9Ymtq+p3UGjw8qWElyw/hUdqBGb4YXUtN022ilSIG+d5wzHoTzj61r6rfX+maXcXknkgouEUdSx6Vb1CzS509og/k+UN0Un9wjpXM6bqB8VarFDqDJDHZjIhJx57j+IeooA6TRGv30a2fUiv2tl3Ngdj0q8M5BoOc88VDPbLcooMjpg5yhxQBnJYpBPMY9KY+ZJvZ9/3jUnkEsSujoCevzdaoavLaaU0UZku7i4lYBYkk5x61X8SWxs7PT5La6uo2muURx5h+6e1AGpJbyeU4h0mFJCPlJbjNWNPAtrWGCdIYJ2yfLQ8MfUVRvBaaZNi6W7Fv2nDkgfWrMGm6XdeXewMZsHKSCTOKANPmijvmigApaSigAooo4oAQGlHSs671B4luhGoXytoVj3JqY3LwzKZCrQMvJHVGoAt9qTOar3Ny0JhK4KyHaPrVCPU7tzF+6UB2cH220AbAxijvUNjIZ7ZJmbIc5HGOKgguJpmlzKihZCoyO1AF3NFVbKaaXzhMQSkhVSB1FMiubma8mt/3a+URz6+1AF2is37bdPbxyp5fzTeUVI960SQDgnFAC0e1HJNUrTUUuIruV0MS2zlXz7UAXc8UVm2+qmS4t1nh8uK6GYHz19jUsF/52q3Ng0RjaFA+4n7wNAFyisoaznM/k4sRL5Xm55z0z9KkfU5ik80UKtDBJscE/N9aBmhxmlrNk1SXbdzwwBre1P7xieT3OKJr69eN57OCNrcRCRXdsbs0CNKj8KpLc3kqxokKJOYfNbd0+lS2F19tsY7jZsLcMvoRQBYpe1FFAxMUuKMUtABSUtFACClpKWgQtLikp1IYUUUuKACiiigBKMUtJQA00UUlAB2oopaBCYpaKOtABSiiloABTu9Npw9aABh8hqCp2+4cVBQMtUlBopAFHakopgLRSUUALSGig0AZus65baFZPdTuCUGfKB+Zh7VyS6lo+veFtc/sSBorqcfPAeGZvUCsb4oyj/hILND2gH6k1qwaPZ6Z420FrKPyvtFvvkUdCQOtMCv4YfXLm0TTNavLeGyRQjW9wuHdPY1m6X4XstR8X39pHeKLO2lG2FpDmRT6V2Pi/S7PXJoLG6tpvtDqfIukHCH0NcU+iw+D7gxySfa9Sk+azlt8ko47MKANeK1k1Dxd/Y8V3HDa6RMskEb/AH2HcZ71N4iOoeH/ABTLrVhe2yi+ZYGV+Shx3FZ8Os6IL2C91nSbyLW2YMxRSN7D0qz4x0qzv7ey123sLp3uJgbiHnJUdeOxoA0NVttKsra11TxHia8uJBH9otmwB6fhSeOb/wC021rpttbzSsJo5RIq5Qr9a53xTd2V54atdM07T72OG3m8xhKh4XvzVnwRqPiS4gGn2BhNnEdwlnUnj+6DQB3XijR5Ne8Otp1u6RSsUYMRxxXO6n9uvdJPhfWDCl84U210F/dsB79jxXUatNeJYltOlgF2hDGOQ/eXuBXF+L7zVtc0H7RZWv8AoQYK4K/vUcdce1AEvlX8F3a213LGurRIEtZlb9xKvdW96qy6ZqegWd6dalgl0e7bdcRRN80eT1Uemaz7GO4f4aX0TLI95HdAqrZLqOOneruqnTfFWk2dkourbVo4QiiXKo5HUE0AVb066uraHHZzwG0UYtJ8/I6ej++K9VthMLaIThBLtG8R/dz7V50sGmr4G1KzsUnF5CF8yCQklHBHK+30rvdF3/2Dp/mZ3+Qm7d1zigC9SUUUALRSUtABRSUtACUvakpaAFopKKAFpKKSgBaSiigAoopKACiiigAopKWgApKO1JQIWjNFJQMWiikoAWkoooACAQQRkEYIrkbWyS3+JjBJJHSO03KrtkIT6V1tVxZ241A34jxcFNhf1FAjF0q3u18S65LGRGskq4LrweKpf2TK1zLpe8SCa6+1TunQAdq6xgWUgHaT3FR28EVqjLEuCTlmPUmgDI8VzQv4YuFSRGO5AFB561rvJJHYB4ovMkWIFUz1OKo3Ogabd3cdzJBiRTuIU4DfUVp59OKAMqyOtX0iyXXl2UWfuLyxqh4TUpea6hYki+PJ+ldJuO7Peq1tZwWklxJAm1p38yTnqaBmHptzBa+NNciuJFiaRUdC5xkVL4k1a2gtLQQTpLIblCVQ5OM81q3WnWN7Kst1aRyyKMByOfzpsOl6fbS+ZDZxK/8Aexk0AJqkF9dQINOuRAxOXJHO01DZaFa2sjTyFri5cfPLJ1NaVL2oEc3q+1PGOit5vkr5Mi7gOlaKyReaC2syYz2FWpLO3mu4rmSMPLEpVCe2ak8uMHPlR/8AfIoA53waCIdVJffm9Y7vWuoHX8KggtoLYOIIljDtvYKOpqbNAzA8IOg0RgzqD9ql6n/arI0SeXTvDF/dtfLDHDdTNsI688CunXSrGJFjWAbVcuBnuetef/Eq7gR7fSrWJUb/AFkmzuT0FAHHXtzqXiS6udUuT5ohALjoAuegr1PQJbPVZYkGI7e1jUw2uMZOOSaz9G0CKDT7DRjGPOkxdXbd8dQtdo6WdsPPaOKPaMBgADQBWkDQXyorbI7g5Lf7XpXGeF5vsVvqUj/LNBeuRJ/eB6qfrXeXMAvLVoydpPzI3oexqnaaXCELTW8as53SIBwzepoApTxN4mubV1DR6bAwlJPWR/T8KqXAjsPHc1xeI4sru0Ee8AkZFdWqrGgRFCoOigYAoOCMMqsPQjNAjG0SVTqeoxwRSCyYq8cjA4JxzWwyKxUsoJU5UkdDS54wOB6CigBw5+X1BFcn4c1O10nTZbG+Z4ZkuJDtKHkE8GupzQypIcvGjH1ZQaAMyTxLpghkUSyHKkAbDzxSeF5p5fD8P2iBomVmVQwxlc8GtPYnaNP++RT8k/hQA7IPWub169k09nmk0+aWJl2q8XI9siui60E8Y6g9QaAOX8G6Vd6fpsc1xGFaZncoeq7jkVs6rIRGqBcoBubJ6+gq9nio5oI7lVWVdyg5AoAyLCdbK32qn3iWkzTtfWeXwfqGVJlkhOFA556CrjWm64CmNUt05LA/e9qfdahDbzLE2GLKSR6elAHLJbNpmm296mmMbd7dUvoCvDLj7wHqK8+1rTJPDWsJeWLE2dwpe2k7FT1U17bb3Ed5DvTlfuupHT2riPEGlGbS9S0Tbua2/wBMsj/sd1FAze8DuJPB1gQQcBgfY5rbvYp57KaK1mEMzDCuR0rz/wCF+pZjutLc9P30YP616NQBm22i2lvp4tnBlc/M8xPzbvUGoPsWs2rE2d1bzKx585cMfqe9a9KKBGMZfEobIs7MnpkPUHkeITeebHa2Vu0nEky4LYrouooBoAiYTpbBI2DTYwXPT61WijXTFZIYnnuJTukc9z9avUmTQBnSadPqBH2+bbADnyIz1+po1HQ7DUoo0aPyJIhiKWLhkrRptAGFDb+JNPnSGOeG9tScb5OGUe9bcpn8jEO3zTxk9BT8nFA4oApW2mRWzyTlzJeSDmdxkj6VmXmmavqN/aw3csTWcEom81BgsR2roKUGgBXCuGV1DI3BVhkGsvTNEi0i/upbVyLWcAiEnhW9q06KAFpabS0AKKKToKXtQAUhopaAM/UIjdvHaR4D58xjjoB0zUNpO97ehI3GyL/Xgr1b0q9Jah94Dsu/7xHU1E2mW52tHuidf40OCfr60AOvtvlAleIzvDdhWesyo+zYVCDeSe27vWo1usgQSMWVex7+9Nis4o5JmJMnmgKQ/YDtTASCM/ZlgKbUX7rKfvCoRZOLt2A3QkDaue9XYYkgiEcedg6AnpSTRCaLy2Zl91ODSAq2RWW5m+Qr5L7QQeGqgkPk3rHLtIt0WJHcEdK2YIEt4vLjHGcknqTT1UKWYAAscmgDKni8uzbHmKI2Mi5HQ1oDYbaEzkZIBz70s9vFcY80E49DUpVWGGUEdgaAFBG4fWsKBGuLHX7aP/WO7bffitvGaRI1RiUUAnqQOtAGHJi8g0COHl4XV3x/CFGDmrMZDeLL1R1a1UA/jWkkSRsSiKpbqQKPKTzPMCKH/vY5oA51YWfwz/Ze3Fws4Xb6ndnNLNbM8F1fiRobyOXHkfwyY6ce9dFsXf5m0b/72OaCis4copb1xQMxLtIjZaikcjpJdRDdBt6OR2qS5imt9M0mwAPzOiSkdgBzWztXfvKjd/exzS/WgRQ1C8SKVbXf5Ydfmkx91fQe9TWDxPZr5EbJEp2qGHX3qztB6qp+oo9v5UAAope1JQAUUUtAxKKWkoEFKKSloAWlpKKQCiiigUDFFFFFABQelFFADaSnEU2gA4opKWgQUUUUALRRR3oAUU6m06gYfwn6VXzVgdD9Kr0AWqKM0UgEooopgFHeiigAoNFBoA4jxlp9pbanD4i1CL7RZRRiGSIdQc8EVyPiHxbHf6rYaho7SQPaxlFMgrqfFFrqPiPxBP4cguUjtRbCfaw6sK5LRtIt9StZtBuLVoNbicvHKwwCB2pga9rrfjKbSrm8W9hM0JB+zNF87Ke4FP12FfD9/oXiI2kv7xfMvNvIDEfpRqXiaLULWKbS9Nu01qyAiSVUyhx1B9RWvdTal4w0MQROlgmwJdrcx4+b/ZoAta1fafrdpp0tqGkupjvtJ0GfKf8A2vapdR1DWrCPR4xJHJcyTiO8MYyMf0ql4Y8MXnhuw1CKK/t3llAMMmcohHrWHoEfiS41/Wpba+tEuUYLOJBmM+49KAO38RyX0Vkstk8GEJM0UuP3idwPesrwv4k0G9ik0rRi1tJGrOomGAW//XVK61jS9RmtNH8SW841BZNu+HIRyeOD6VT1hPBGh6m1ldabdxzr0eIH5s+hoA1NQ021htotT8RLLLctJs820b5VHYnFZ/i3xdq2h61Db6c8JsZI0KyOmVyfeoJrvVtN0pH0RftOh3T+WI7pSXiJ4OfasyJzodz/AMIz4ph8/TZCHilTOVJ6YPpQBuHRPFUurQa+t9p4k8sLtQ4R1Pr710niCaw/sIvqah0G0uYOWVvUYrn9V0628M2gguWml8OysGG1v3kT44H0qpMulWGhHX9DNyTHKImiuSSrA9cg0Aa/iC3tk0iDXtKf/SrZFMZU58xT2Yd66uzmkuLC2mlQJJJErMo7EiuGuNGi8M6rZ+IEkkOmMmbmAtkKzdML6c13scizRRyx/wCrkUMv0NAD6KKKAClpKO1ABRRRQAUtJS0AFBoooAKSiigA7UlFFABRSUUCCikozQAtFJRQAdqKSjtQAUtJRQAUUUlAC0UnNFABmk49R+dFZl0umPdMZ7pkk7qHxigDT49R+dGV9R+dYpTRM83rf9/KTZoZ/wCXtz/20NAG1lf7y/nSFkH8a/nWJ5WhZ5uJD/20NJ5Wgf8APWQn/fNAG3vj/wCeifnRvjHWVP8AvqsTZ4eHVnP/AAI0mPDv+1+ZoA2/Ni/56p/30KPOh/57R/8AfQrE/wCKe/uk/nTC/h0HiB/wDUAbn2iAf8t4/wDvqj7Tb/8APeP/AL6rEE+gL0gc/wDAWpTc6AB/x6ufohoA2Dc2w/5eI/8Avqk+12v/AD8R/wDfVZAutDzhbJz/ANszTvtWj5/5B7/9+zQBqG9tB1uY/wDvqj+0LEH/AI+4v++qzRdaT209j/2zNOF1pfbTW/79UAX/AO0LDcP9Li/76ryK9nj1j4iZeUGFroKGHTatem/bNMU4/spzn/plXlPh+ZE8bxsICyCd8Rgc454xQM9L0bUrCS71K8luUHmTGJOeiLxxUMmo2kSGISLcPbyl8Of9YvbHvUPhq9tl0oq2lSSMJ5MsIwe/rWv9ttwSU0WUZ7mMUAJaa9Y3KxH7SylQS6uvOfSrn9r6f/z8D8qqLfqo/wCQNL7nyhUgvs5I0eQ/8AFAiQ65pgOPtQz6YNMOv6XvC/ahuPQbTWVNeSNq10y6TIpS13YKDg+tVrTUpLm80uf+ym8w7gw2gZOO1AG+df0xCA05GePumlOvaevV5P8Avg1hahq99AJC+htLCHzubA288Vftr7VjC9zNo5ZyvCbhtx/jQBaHiLTT92RyfQIaB4h09uVMxB9IzXKafq1/LaYGmCCP7QxE7nofStyw1DVF0RcachbJCPkYI9aALyeJNPkGU89hnGfLPWpDrtoqbjHPtHfyzXPJqN9asGXSy0FpL86q/wAxY1qX+oaxJpe+PTUTzWAKswyFPtQBbHiKyMnliK4L4zjyz0pW122Bx5FxnHTZWTa3WtpqMEkVtHJFIPKYswHCjpn1qe8u9Y/tSMm2gQrFhsvxyeKALy67A77Vt7gt1xsp51gZ+WxuT/wGsyC41ZdSjkFvCWcNCfn6Ec1q+drGeIbf/vugCNtVLgo2m3RUjkYrHa6uBdy7tHuCsgwp74Fbnm6zniK3/wC+qbjWGkWTZahl4B3UAU9Pury1D79OuCX5YYHWqeqXUja1pFw1lLGZHe2YP3VhW3u1s8AWo981ia2NWbUNFSV7c5usgqOmBQM4LwxcPpvjmMJGW/fSQ+WOuOa9X+3Xm4gaZL+JryPQ0nn+IqCNlEounbPbjNeueXrO4/6XbAf7hoAQ3t/20x/xaj7XqXbTD+L0vk6t/wA/kGf9w0eTqve9h/BKBAbvVB000H/gdJ9p1btpyfjJS+VqWMG+j/74pDa6kf8AmIoPolAB5+r/APPhEP8AtpThLqxP/HpD/wB90z7HqH/QS/8AHKb9gvu+qP8A98CgCUvqxP8Ax7wD/gdJnWP+fe3x/vUwafd4/wCQrJ/3yKUafdd9Tl/75FADv+JzniO2H40uNZ9LUfnSDTp8c6jP+Qo/syQ9dQuKADy9ZP8AHbD8Kd5Os/8APa2H/ATTP7JJ639yfxpf7IX/AJ/bn/vqgB3kax/z823/AHyaRoNY6i7t/wDvmk/shP8An9uf++qT+x4s5N3cn/gdAFu2S5SP/SpEkfP8AwKnqC2tktUKo8jgnPznNT0AFLSUUAKKSiigA+lFU7ua4t1jaNkO9wgBHTNM33TanJbGdQEjEmce9AF+gCqt3M0AhI/jcIf8azoru9d4gz8GVw3HVR0oA3OlHPpVawkM8AlJPzseD2qCyM9xDI7XIGJWUDHQA0AaGKDVO2kl+3XMLvuRApX8arXt1PDdXqBiFW2Dp7HPWgDUpfSsj7Tc/wCkB5NpjtVkXA7nvWjDKPscUkrAZQEk0ASIpQMCc5ORTuajnkaG2klRd7KuVUd6pHUJ7W4gW7CGOaFpCVGCmBnBoA0aMVlR6lcL9jmuY1FveMVjA+8p7Z+tO+3Xka200saiOabyjFj5h70AadFVGupl11LJlXyXiLgjrkUl8RI0cJk8mPcCz+p7CgC7ij61QW6lae5iknRVixhgvrV6POxdzbuM7vWgBaKw/wC17prV9TAX7Elx5RjxyVzjOak/tOZmuwJo0mgfC25HLr6/jQM2KDUcoL2Uh5RjGT/unFUIl36MrMshfySS272oA0vajNZ6/an0a1+zcyuFDP3A7mqk+py6a1+juJo4CgjkI/ibjBoEbmcCjI9RVC3bzHnQXqzAQ/MnQq3r9Kj077O2n25kZt5HJz70AaefSlrP03rdgMSolwMnpWhQAUtJ9aKAFpabS5pALml702igY6kpM0ZoAU+lNOKWmmgQmaWkooAdRSUD1oAUUtJS0AApwpopRQMUd6r85qwOtVj1oAt0UUUAFJS0UAFFFFABQaPwo7+tAGC9jHb+L31d7uFFa38oxs2GBrJ1nSbm58Sxa7pWp2SSJF5bI7Dn1qC60yx1T4hamuoRNLDBaCTaGI6AViJqXw+kcItleKS23qaYHa6Tp0mnakq6bdW5sZQXuItwLCTuR7Vzk3ixDb6hp/imzuPs/mlUlijIBUH1qTTdItdG+JMFvYb0t3tTLtZiap2fiK/8S6tNpGrwx/2TLI8fmhduCvTn1oA5zTdcXSby7tJluG0O8bjzM7wnYiuy8O+G410rWFsb9JINTj/0Zi/zL9fes3xvpkd9rGi6RZTRLiEqrM3AA9TWNHpN34M8SabNdzedbs5bbbsT9eKAL1na63eSraXKxTf8I9IGcry7jPY9+BXVaxrfh27sNP1K/SR1E37nYuXVh2IqjDb6zpGrXviKw8qXT70iSSB+JNnsPWsjxXDZS3Gkaxo0oSa7uOI3OEDDuR2oA2IvHiSa7NZtbmOwlQC2eSIjMnofxqtrTX3iXT5NFljiTXLJxcED7rIORg/iKk8Y3FxDoejz6gkLXSXamQQcggelReJNWtbCGLxZo7bprofZZY5BjjHp1B4oAglTxP418PRqTZQ24kGGLYbcvFRX+tXUFyvhvxTDDDA6Aia2/vdjVXSPEWgp4Vh07WHureRZzKJI1OCc+tZHjLWrHV/ENve6dI08McSKcjnINAHT6v4Q8T64YJZrq3EMaBVUSbQyg8Ej1r0e1TyrSCI9UjCn8BXGXPjLw3qmmxWdxNdQbgvzCNhtI967SBQlvEqMWUINrHqRQBJRRRQAtJRRQAUUZpKAFopM0UALRSUZoAWkozSUAGaKSjNAhaQ0ZpKAClpKSgBaKSigAo70nNFAC0lFFAB2oozSdqAFopuaM0ALUTwQyNukgjZj3K1LRQBALS1HS2h/75FKLa3HS3i/74FS0nNADBBAOkEX/fIo8qHtDF/3wKfRQA3y4v8AnlH/AN8ijYn/ADyj/wC+RTqKAG7UHSKP/vkUYXsif98il70UAJhf7i/lQAM/dX8qWigAz6AflS7mpKKAF3N60bj60lHWgBQxBHNeNagx0L4kmXACi6Eg/wB1q9kavOPidozOkGswqSEHlzY7ehoGddojfZ73UrDIASbz4gO6Pzn8629x9a4Hw9rbXulWmqod1xYgW96ndo+zfhXdJIkiLJGwZHGVI7igRJub1pCT60gp1AFKW0ke9adJNoaLy2HrUEel+ReW08bgCEnK+oxWkaSgDNvNPmuI5AsobfkFT0wasw2hhJUTMYioBQnofUVZoxQBlLph+yfZHYeV5rPgd89Ks20Nxb23lNIj4UKnHAxVvFAGKAKJ087I0DDBk8yU45Y1Pd2v2teZGUhSBj1qxijFAFBdPkd0M0oCIdwWPjLetTyWcU7yNMC2/HfpirNGKAKkdgI7tZVkPlqSwQ/3j1NWx1oHSlxQAlOpKMigBfauX1jUFj1S6vGP7jTLdvoZGH8629QvhYWpkA3SsdsSDqzV5p411D7NZx6FE4ku5n868Zf7x6LQMb8NLF7zxFcanJ92JSc/7TV6wtc54M0Q6J4fijkXFxP+8k9vQV0g4FAgpKKKAG4opaMUALRRiigApcUUYoAWgUUcUAFFFLQAlFLSUAHvS0UUAFFFLQAlFLSUAUL23WWa3iUsWModhnoBTTbxya5MrbiptwOvvV9Y1V2YD5m6mjyl87zf49u3PtQBXuwkdrhgPLjGQT1yKqbh5zIwO0RiQkDoDWoY1ZgWXOOmelNjgjikeRF+Z/vZoAbaAgALtMIHyMveqNklr5MnmnD+c+efetNI1jG1F2jOcCgRRrnCLycnigCnaKi3935Y+UhSKrahE813ciNd2bcK3+zzWsFAJIABPpSBQudoxu6+9AGSis0d7MXUIIFiH+1gVfXyv7Ng85coUUEYqQwRlAhQFR2qTaCNuBtA6UANlkWCB5WB2oucDvWR58OoCSJS0lxdRsg+XiIY6VtexGaAADwqj6CgDE+a7ttKtgjCS2cNKCPu7Rin/wBqw3FyJmR3mEmyGLb0/wBo1s85zijjOdoz64oAzZmA8T2xOSPIZSQOAasXNs1w0IyuI5N/I61a49BR3oAz4kl/tG94j+bb1HtV6IMFxIQeMcCjaAxYDk9TTqAOdS0lXRpdHKN5huMq2ONmc5zT7mxjlS482Jvt6PmCVRzgdPwreyaMnNAEEzOtgRJ/rnj2kD+8RUMkMVpp+HkYbY8cHviruATkiggEEEAg9jQBnCae00OAwxNJJtAwByB61SuITqOmTWdvayLtKzFpRgyMDkit4HHTijJ7mgDNjQ3WqR3kcBhVbdkfK43N6VJZStHZQxtbuGUY6VeyaQ5oAqWQZZLoshTdJkA/SrlJ15ooAXvS03NFAC5pabS0ALmjNJRSAXNFNpe9AC000uaQ0AJRmk96WgBc0cUnalpgL3paTtQKQDqWm9qWgBw61Wb7xqwvWq7feP1oAt0UlHagYtFJRQAtFJRQAuaB94UmaKAOPtCjfEPXY5JEQy2gRCxxyRXMQ/DO7jnST+0rRlWQMV3e9d/qPhjSNUuWubqBjM3BdXIqqPBWhDpFP/39NMCihWX4pR7WUqtjtJB6Vy5H9g6vdaHqwF3pF4zT7oBl0PqMV6Dp/hrStLuvtVrE4m2ldzOTkGm2HhrStMv2vbaJzMwIO9sjBoA868JeEItb1Ge8lkkl0yORkjDSESD0rJsYruLxj9n0+4HnQ3DLD9ofK4HY5r2bT9LtdLEwtI9izSGRlzxmsifwNoFzPJPJBKJXYuXV8HJoAyfGdprDadp+r2ssMd1p6mSeJJPlPrx3FcxcXvhnX9KmuZYrpNWdCwjiDbEk9QOgruz4G0QghjdsCMENMea0NI8Pabonm/YYNolxu3c0AecroP2XSvDmomS5eaS6UTCRyVXnrg9K1PFug6frWry/YGkE9uwkuoAcJIvcr2zXoM1tDcW0lvLGDFIMEAdPce9Z/wDwjtibO3t90oNu+9JQfmb2PqKAOMktNHSwtrXUIyfDsz/6NL0kik7qfbrVfxZ4Q0jR9Kt7/SkdZFnTJ3bgV9a7/VdDsNasUs7uMiFG3KI/l5qvY+FtP09m2PPLG6bDFM+5cUAcz4+N4um23lW1o2nuY8yqBvVq76EAW0GDx5a/yrmm8CaQ7DfPeOgbcIzL8o/CumAAVVHRRgUAOpaSkzQA6ikpM0ALR2pKM0ALSUZooAKSiigQUGkooAKO1JmigBM0Zoo6UAL2pKTNFAC0maKSgBc0dqTmigBaKTmigAopM0ZoAKM0maOM0AOpKTNFAC9qKTNFAC0UlGaAClpM0ZoAKO1JmigBetFJ3ozQAtFNooAWgUlFADqrXdrDe2k1rcLuimUqwxVikPNAHjQ+2+AvE7BgXtzwynpNEf616HpmoQWUMUkUvm6NdHMEuc+Qx/gb0FWfEWgW3iLTTbTYSZeYpccqf8K8ys73VfAupS2V7b+dZSHEkD8pIPVfegZ7KD0Ocg9CKdmuU0nV0kthcaRKb6w/jtSf30H09RXQ2d9b30fmW0ob1Q8Mv1FAFvNU5NQii3M3KHAQjuc4xU0sjRwyOoyyqSB71gS+ck8byptZ3VhEBwWxTEdEssTkqkqswOCAadWFZQvbNczsuTEjL1/iPJqa2vpYiqSh3KwKdqjOSTQBrUtUrq6khWRlACxpuy3Vm7AUW988rxhoCFdeGHrjvSAu0v4VmQ6o9zGhjjBdmddgOSMd6DqMrWltLEoLhj9oBHRR1oA08ZPSmmSNCoZwpY4AJ6ms1bya7024mSaNXDboAvBKj1FQyPFdRoXIBbaQ391j0oA2/rSZqrZXD3Nory8TKSj49RU/OMnj3oAXNV7u9hsYfNmPJ4VB1Y+gqpc6qokMFjH9puPb7q/U1yGueKbfRpWKyrf6wRjPWOD6e9AFvxB4i/sSM3l0VfVJFxbW2ciEf3j71ieCPDM2r3517U9zRh96b+sr+v0qPw14RvPEd62sa20n2dm3fN96X2HoK9SijjihSGFAkSDCqBwBQBKOTnFLSCloAKSijtQAUtFFABR2oooAKWkpaACgUnSl7UALRRRQAUfSiigBaKKKAClpKKACilooAj81DMYd480Ddt74pyOrlgrAlThh6ViSXDDxY8RztW2GZFHTmpG3W9v9tlJ86d9m1TguOxx60AbVIWVeSwGOuTQudi5zkgdetZuqKxYEKSvkvuoAvvNGiB2cbWOAfWpKyYilzDBkEwrGBEAerY5NXLGaaa2BlAyDjcD96gC1UTXEKtsaVQ3pnmputZE06w6tNKbcOqbIzn370AaDXMCEhpVGKmHI46etZEy/6PfrsJZpPlGO1aKThrJZYAX+X5V9aAJvpTVdGbCyKT6A01lM1uUbKF1wcdRmsf7Pa2tzcz2yEfYYSTz95iKANwEElQQWHUZ6Ubl3bdw3emea58KbOy0q9R2NxcSATMT94MKsTacFltYYpGa7WbzXkB/h9DQBsZGdu4bvTPNBZQwUsAx6Ank1zBEkmi3mq+Zi7S5JjbP3QGxipDGL7TtY1CTcJ4z+6OfuFR2oA6PvijIzwRj1qCwdriwtpJeWkiBb64rP0qDzdKu7YSOB58iBs8gZoA1Q6OfkdWx1wacCrMQrBivXB6VlxW6nVrc2o2w2sRSVh0cnt70mnxrFreqogwp2HGfagDT8yMv5ayKX64B5pjSxpIsbyqrt0Umsu6his7zTYwhjRJCwnP8AGf7p+tVLW5I0x727sxLG1y26Td8y84H4UAdEzBFLOwVR1J7U2OaKWLzY5VaMdWB4FZmvEumnwg/up7pFf3XrWbq4a21S9tbcbLeYw7wvRcnB/SgDpEuIJInkjlVo0+8wPSmw3ltcvshmV2xnArJu7cRa3Nb2yBFms8MnQEg8GrNtcPb6jBZXNrDGZY8xSRDqR1BoAvpNFM7pFIrshw4B6VCL+1aXy1nUvnGB61T02NY9a1kKMDehx/wGo1eXS47YywQPbyy7C6cspPegDWeRYlLyOEUdSaVXEiKyEMrDII71X1JQ+l3isAR5TfyqtbzG20SyK/eZFUHHT3oAuLeWzJM4nXbAdshH8J9KS3vbe6YiFyxAzyMVi2dsnkatawuuWuQQXOAehq99tubbUHs7iGNiYvMheJcfgaAL4uITdNbCQecib2X0X1psN9bXEnlwzKz9QPXHpWC+Y9U1B1LefLp2T9c1IyiLT/DrwDEnmqDjuCPmoA6GlpD940CgBaO1JS0gG+tApeKSmAU4U2jNADqKbmlpAOFLTadQAq53VXbO4/WrC/erOfULMOw+0oMHmgDUopKWgYUUUmaAFo70lNZ/LVnxnaM4oAz11QCbUA21ltiNoHU8VahumluBE8ewtEJF57VhQ2zpBqUm7LXE2DHjoTWvuWLWTvIAW2UZ/GmIkurt7eWKNUDeYrHJPoKqjVZWijZYV3PF5nJ9D0puoz4uPLRJDJsJBxwF71SkMENnHLAJp44AJJE6MA3cf4UAbss4jtBMV5KghfUntVf+0FLNAgDXKx7yoPH0qC5xPptuwifDMCvmNtZRWTcTta6w0tsq+UIQnIzk5oA6K1vEunkj2NHJGAWVvekNyw1B7UIOED7iap6VdS3E0gdQuUOcDnIOKfcWtwLqKRC0iFSJGA5xQBbjnZr027IMeXv3A1YxWbFg6iYFEiOI9xYjt6VdZFaaN/MKsv8ACD94fSgCTGeKpyajbRziIlj82wsBkBvSrgPzcCuXs5b200P7akynbdHfAyZ3ZbH50Abs2o29vIUcsdpAYqMhfrUkl3bxXMVvI+JJfuD1rn7R7yLTNUu4ZgrpdMzRSLncOODWjfMJL7RX2gFnLYPb5aALNzqlrZzNFL5hZRltqkgCnPqNrFDDM8hEc5AQkdah1WUqIbaNRvu5AjHHO0dai11EGnQR4G1biMD25oAvXF5DasFclnI3BFGTj1pn9p2jQRyxyGQSZ2qoyTjrxRdtHFcJLGga72lYx3x/hWR9iIntINPuFXUImeQyH7nPUGgDUbVrRbUXG8mMts+UZIb0xQ2qWy2puG8wRhtvKnOazrTbcDymkW2vjdFpVIyGYDqtOW4uLx5rK6uY0ntrgBJccP6DHrQBopqVs9u85ZkjTqXXFPtb6C9D+Q+ShwykYI/Cuf1C6u5JpLK7ZZEguomMijAKk9DVu4MkXiy7kt4yf9FAYKOp7GgDUGoWpe4QSjNvjzf9nNEF9BPP5KsRJt3BWGNw9RXNj7LHNrUUqSeXMiBmUc7j3/Or9gt5a6naWup+XKVhIt507j0b3xQBvUlHakzQAUZpKKACikycUlAC0lGaSgBe1JRmkoAWkozR3oAKKSigBaOabzS5oAXtSUZooAKKKKACikooAXPpSUmaM0ALzRSZozQAtFJmjNAC9qKTNGaAFopM0lADs0nNJRmgBaKSigB1FJmloAQiqGqaVZazaG1voRIh+638Sn2NX6Qj2oA8j1TwhrfhW8OoaRNJJCpyJIvvKPRh3q1p/jezu5FGsRPaXg4+2W3Gf95a9RyV+lYGseD9H1pWZ4BBOf8AlpEMfmKBjrTV7poBLE0OqW2P9ZbsN4+q1cTVNPuxsaXy5DxtlG1hXnN54F17QpjdaTcPKo5DQNhvxFV/+E11m0Pk6vYRXarwfOj2v+dAHps1hK9o0NvcExkdM53HPPNJm7s55ljhYtI6BHxwEArg7PxroMhy8V/pzjp5Lll/Kt238WWLgeR4nhOf4bmLaaANy/tXfU7VlVnUBixPIqXTVmS6vWYEAsoQH6Vnx61csAU1LSpgfR8VL/a16Tnfp/8A3/FAiO3s5oLUx20jLeC5cqQOAD1p6xzvp7Rb3jcAhvl5kY9acdVuxz5umxn1Mwqrc+IDDzc63pkPpt+YigZcttL2X8IaJnaK2KM7DALdqspBaWdtH9reNXCBWy1cndeMtGjBW41y7u/9mCPaPzrEn8e2iN/xLdHLydpLltx/KgD0OPUokRo9OtZpySSXPC59yaxtX1+zswf7W1Ndw/5dLU5J9ia5Dz/GniYbYhMkJ4xEvlqK2dH+GCowm1i53seTFGf5mgRi3XiPWPELHTtDsntrVjjEQ+Zh/tGuk8N/DuCxKXmrkT3HUQ9VB9/WuxsbG002EQWVukKAY+Ucn6mrQoAQfdCgAKBgADgU4DFJ3pc0ALRSUUALRRSZoAdRzSUUALRSUUALRxSZooAWlpKO9AC0tNpaAHUfhSUUALRSUZoAXpS/hSUUALRSdaXvQBmqi2+uSSFTseDBfHU56VGElivRcyQvLaKSYlA5jPritT2pQaAEVw6hhnnnmqt6JdpaNpGBUrsUd/WrdGaAMlLR41j2eYGiQYQDjdV6xUx2qxlCrL1z3NWMmlzQAuao3Fg09zKxk2xuFJA65Bq7mkzQBVnhKxExrJK3YbqkiieGwSGMgSqvBPQGpR7UuaABCwVN5BYD5setVLSxEAvFkbeLmQsfoe1W+9FAGfDp0qrawzSK0Fq26P1PpmkS01JZD/pEKqz7mdR8xHpWj3ooAzX0rKTW6yAWksvmlcc56kVJNpzMbmOGUJb3WPMUjkeuKvHpRQAkaiGJY4wAEXauaoW1jc29ncwC4QNM7OrgfdJq/wA46UfhQBRs7G6geETXSNFFnCouNx96fBZyRX91dSShvtAAKgfdxVujn0oAo/2cxEEcs/mQwv5igj5ifc01tM/dywJLi1kk8wxkcg5ycGtCjHtQBBdWyXcAjJ2lGDIw/hI6VCdPjlS4+0OXluMbnHGMdMVdwaTB9KAKf9nJKZWuZGeSRBHvHGAKfHabLiOeWUyyRLtjJHQVawaMGgCnDY+TeXNwZi32nG9cfhTU05FWGJ5C8ELb0Q+vvV38KMe1AEU8f2iCSIsVEgKkgdqbbRfZbaODfvVBgFhU2D6Um0+lAFJdMi23Ku7MtwwdvUEelTQWqwz+c7tJLt2hm7CrGG9KNp9KAIPskf8AaDXu4mRo/KKkcbaZBp8MDxlWZliJ8tWPCZ9Kt4NLg0AJ706k2mjBoAKWjB9KTBoAWm0/HvTSPegBKWm0c+ooAdRTR1pwoAdS00U4UgHJ98VSaCAuxMEeSeflFXk+9VY9T9aALVFJRQMWkpKM0ALS4IOapao5TSbpgSCIzgjtVW20iE2kDG4utzRgk+aaALy2SJK0g53PvwT3onsormVZJAdwGOD1FVf7Ggyf9Ku/+/lO/saH/n7uh/20pgXJLZZZUkcHcoKjHoai/s6Ha6gMFdAhAPYVANHiB4vLv/v5TToyZ/4/rv8A7+UCLzwLIqq6btg+UntUC6fCrRt5edgOM9ye9ZWrae9npk1zDqN0siAbctkdauLpJMSFr+63FQSd1AFyC0WCV5Fzlug9KmkRnQruZc9x1FZ/9lHH/H/df99Un9ln/oIXX50AWre0MDvIztLK/BdvSpGgR5EkZfnT7pql/Zj9tRuRQdMk/wCglc/pQBoc+lV/scIkLhMbm3FexPriqv8AZkp/5iVz+Qo/syT/AKCVx+QoAsyWMEkrSmMhnILgHhiO+KJ7GG4mimcMJIjlCD0qv/ZcvbU7j8hR/Zkv/QSuPyFAFySBJZYpGX54jlW9KZdWcN4ipOrFQdwwcc1X/s2b/oJT/kKP7Om/6CU//fIoAkuNNt7mRJZPMEiLtDK2OKF023SJEjVkKElXB+bnrzUY06f/AKCk/wD3yKQ6dcf9BSf/AL4FAEx0+BolQq25X3q4PzA+uaU6dbNAYyhOX8zf/Fu9c1B/Z9wf+YnN/wB8il/s64/6Ck3/AHwKAJVsIBDNE6GQTffLHkn1qSC3W3B2bi7DBdupqqdOue2qTf8AfApf7OuR/wAxSX/vgUASDT4RJO5DMZxiQMcg0+GzjhcPl3dRtVnOSBVf+zrk/wDMUm/74FH9n3H/AEE5f++BQBoc0nNUDYXP/QTlx/uCk+wXH/QTl/74FAF/mgis82Fzn/kJy/8AfApP7Puf+gpN/wB8CgDQ57UnNUDp9weP7Um/74FN/s+5A/5CkuP9wUAaPNJzVD+z7gj/AJCc3/fApBps/wD0FJv++RQBoc+lJg+lUP7PuOn9pzf98ik/s6fvqc3/AHyKANDn0pOc9Kzzp0//AEE5/wDvkUh06fH/ACE5/wAhQBo8+9HPpWb/AGbOf+YncfkKP7Lm/wCgpcfkKANLB9KMH0rN/s2b/oJ3B/AUHTJf+gncfkKANLBHajn0rM/suX/oJXP6Uo0p++pXX50AaXPpRg+lZn9lN/0Err86T+yj31G6/wC+qANTB9KTB9KzP7JP/QRu/wDvql/sk/8AP/d/99UAaPPYUYb0rO/snI5vrr/vqk/sdf8An+uv++6ANLDUYas3+x4/+f26/wC/lH9jRZz9svP+/lAGng4pMN6Vm/2PCet1d/8Af2j+xos/8fV5/wB/aANLBo571nf2PD/z9Xf/AH9o/se36Ge6P/bWgDRx7ijj1H51m/2Na95bk/8AbWl/se0/v3H/AH8oA0fxH50DHcj86zv7GtP70/8A38NJ/Ytl384+xkNMDT4x94fnSZX+8v51m/2JYf3Zf+/ho/sTT+8cn/fw0AaW5P76/nRlP76/99Vn/wBiad/zxb/vs0f2Hpp/5Yt/32aQGjuX/non/fVJuT/non/fVUP7E03/AJ4H/vo0o0XTh/y7/mxoAulov+eif99UZj/56J/31VIaNpoP/HsP++jTv7I04Hi2X8zTAs+bGp4lT/vqoLhLC6BFyltL/vgGm/2VYf8APqn5mg6Tp/8Az6J+ZoAwr3wb4XvSSY0gY9TFJisW5+GWiyAm31fy/Z8Gu1/sjT+os4/1oOk6d3s4/wBaAPOZPheg/wBVrdof96oP+FaOOms2Of8AeNenDS9PHSzi/KnDTbH/AJ84vyoA8wX4a8/vNasl/E1ah+HGlqR5+vwf8BxXo39nWX/PnF/3zThYWQ4+yQ/98CgDirXwN4Tt2Bm1E3BHbeAK6GysvDNhj7NHZgjucMf1rWFjaAY+yQ/98CnCxteotYf++BSGMGqWIXat1CAOymk/tKx/5+Y/zqYWlsOltCP+ACl+zwD/AJYRf98CgRX/ALSsP+fpKT+1bAf8vK/lVnyIB/ywi/74FL5UQ6Qx/wDfAoAq/wBr6fj/AI+B+Rph1nTwCfOP/fJq95cf/PKMf8BFGxf7iD/gIoAzhr+ls5Rbnc46gKSRTxrVh2kf/v2aitUVfE2pbUUfuYz0rVH+6PyoAz/7bsP78n/fs1HJ4h02JgJHlXccLmI8mtX8B+VZeuH9xZE8n7UmPagB661aMOFmP/bM07+2Lf8A55T/APfs1olm3EZ70hZu5oAzv7Xh7QXB/wC2dH9rR/8APrc4/wBytHLeppMt60AZv9rpuwLO6/74oGrc4GnXZ/4BU13dTrcRWlttM8gLbm6Ko70Wd5PJczWd0oFxEA2U6Op7igCMao56addf980f2nIP+Ybdf981LK9/PcNHbFIkQffkGdxo0+8luvOimUJcQPskx0PoRQBCdTmz/wAg2559qeuoXGONMn/GoxcajfTXP2OSKKKBtg3jJcj+VWrC9N9ZLMV2yAlHHbcOuKAIvt95jjS5fzpP7Qvc/wDIJlH41NqN01tZM6cyudkY9zTlinh04QpLm4VPvvzzQBX+2X56aW/4tR9r1Ltpv5yCq982qWNi0325HfIAXZ1JNXdQnmt9KlmQhZlQHPYHvQBF9q1PH/INX/v5QLrVCcf2an/fyltY5zJGzams3ALIoHNWLr7S0YS2YIzHBc/wigCD7Rqo/wCYcn4yinfaNU/58I/+/oqNDcWF9BDLdG4inyMMMMp9fpU9xdS2suZIS1sf+WiclfqKAGedqh62UX/f0Uebqfa0h/7+VZhniuI98MiyL6g04sqKzscKoyT7UAVPM1XvbQA+nmUhfVv+eFuP+B1Hpokm86+kJDTnEYP8KjpUpvmt32XsRRSfllXlT/hQAm7VscQ22f8AfpQdW7x2w/4FVtWUqGQhlPIIPWqEtjLIJbia9kjdclNhwqgevrQA7/ibk4xa/rRt1j/p1H51JZzPe6ZHJISkki4LL/OqF9YLa6dLJ9suTLjCnf1Y9KALYXWD/Fa/kaXy9X7yWw/A1J9naTT0t5JXWTaNzqec1nX9iIIYUgubnz5JVVS0hx70AXNmrf8APa2/75NL5eq/8/Ft+CmrUkkcKM8rhEXqxNUheT3bYsosRZ5mk6H6CgB/laqT/wAfFuP+AmjydTzg3kAPptov7p7S2QIR5sriNCegJ71HZW9n5u6O5NxcJ99i+efp6UASGHUu97D/AN8UGDUe17F/3xTriwhu5xJKX4GMK2BVOwt401a7aBn8mNRHhmyC3c0AWTDqGOb6ID12UfZtQ/5/1/74qGSMahqc0M2TbwKBtBxljT9NLxXNzYs5dYWBjZjztPagB32a/XGdSQZ6ZSg2eoDhtRx9EqtFbx6vcXMtzuKJIYolBxtx3qxpE0j2zwytvaCUx7j1IHSgA+zXQOH1TB9lFL9ivD/zE3H/AAAVlQfYYTcG+tpnl85iZNpIAzxW6ksIthKJFEAXIcnjFAFcWN331OT8EFH2G5/6CUv/AHwKT7ZNenFimI+87jj8KsqVtoB50wwPvSOcc0AV/sNxnnUpv++BSiwn/wCgjL/3yKl+32XAF3CSeB84p8sS3CbHyUPXBxmgCr9hd+V1GUjOMgA0f2bJ31Cf8hUOhxrDbXSRjCrcuAM9Ktzw3LOJbWYKw6xv91qAIjprf8/9z+dNGmEAk39z+LU+LUEMot7mNre4PRW6N9DUerm6Wyf7IVZ3XyxE38RPoaAHDTcjP224PuGpJNOiQZk1Cdc9Mvim6N9rayj+1FVKLsMYHII9aZrlrBNp80zpmRcbWz05oAlGlJ3vLr/vukaxtoyokvZgzHABl61dUnYv+6KzdXgiEUc+web5yDd+NAFoaVCP+Xi5/wC/lJ/ZMGc+fcADqfMq/wBzVPU5WW3S2j/1twdg9h3NAEMFlaXUHmxzXW3JAJk61IdKgx/rbj/v5VuONYYUhT7qLgU7vQBS/sq37yTn/tpSDSbYdJJ/+/lXaKAKX9k239+f/v5WbqunxWsNvPBNcLILhQf3hwRmt/mszWz/AKHb/wDXyn86ANQn5jS03+I0ooAcKcKbSikBIn36q55P1qzH96q3r9aALNHFNzS55oGFFFIc0AUdaONEuz/s4/WrcAxbwj0Qfyqhruf7EuAO+0fqK0gNqIo7KBTELR2pKTI/vDJ7ZoGOopiSLKu6Nwyg4yDTu1AjN8Qc6DcD12/zFaI+4v8Auis3XiBo0noXUfrWkThR7AUAVLq8eGeGCGPzZXOWUdl9aUX8TXi2qxyFyMk44X61SuCFvI47OJzdPlhKTgVZhkNrcxW7QMJJ8lpWPJIoAvUUUmeaAFpM0UlADs0ZpKKYC0UnaikAvSq15eLZQNK6M4HYVPzWJ4lDS6eIo8h2ddxzwFzQBfN+63FrE8IVpgS3zfdHarUU8U+7ypA+04OOxrBuzN5KpHGMRFMvnPOegrYtmhlhk8tPKYsRIAMENQBa+tJk9qhgjeGLZJMZTnhiO1Sg4YUARwXMVyrNC24KxVvYiiWZIV3SNtXOMnpWRpIujZ3Bt/LBNy5y31q5qJkS085mTCj97E33XB9PegCx9rh+1G28wCULvx7U5ZFc4VwxHXB6VydqW+2Tb38wlkQBh82O4B9q1dEkjk+0xncH8xlD4x8ooA1IrmOd5UjOWiba49DRBcxXKbonDAHBHcGuU0xpL2+1gEXX+txHKnC5HTNX9LJlvftZgfKfu5AvQv3bFAG5PPHbxGSVgqjuaZHdRSTtCGxIBuAP8Q9RWVrchbzUgBM6LvKuMjb3I96zpIfkt5JJGaCGIOyKCHQHoVP9KAOqkkWGN5JDtVBkmo/ttuscMjSARzEBG7EmsrWmlXRYI4S0kUjoJHbrtJp88MCzvbKi+VGFIQ544oA2AwycEHnBxVd763RwvmA5bacc4PvUGk4+zu3UmQ5NZMJMOoagpOzfc/LnvxQB0SyxuzKjqzJ94A9KrXGpWlq6xyy4djgKBk1S0VGW+1JypBZ1AJHbFUL67kh8UWkRZTtictII8hc9M0AdBJdRQvErt/rW2qR60t1cx2cIllzsLBcj1NYs0kcbwvIpjf7UC/OVPHVfY0niG6tmt0hEsjPLIhVVHBGaANya4itxGJTjzGCLx3p0kscK7pGCrnGTWFewvI4hCzBrRhO29+q+1X7Z4ZdMDybkSYEhZWyRQBNLqNrFLBE0oLzNhcVIl3BJOYUkDOoyQK5NkaK90ZJRlvOcZ9RjitTw7NF/xME8wGRLhuvUCgDUuNQt7W7gtpWIknzsAHTHrUkN1DPLJHFIrtH98DtWDqtxFGrXMcha8Eiqk2OIwe30qWyvo9Ona0uLZ/tMh3vNENyvnv7UAbE13BAxSR/3gXcEHUj2qH+1rQITvJcDJjx8w/CqF/Kya8DG5RxZOysBnntVCwvLxRe6mfLMnlxK+5e/egDqYpFmiWRQQrDOCMGnVHCZvJXz3V3PJKjFSfSgA4NFFJQAUvNJmigA/CiikoAKKKSgBaWkopgLQKTml5oAcKO1J1opAL2opKKYBS5pKKAF70tNzS5oAWjFJS0AGKXAoooAMelAFFFAC4pabS0gFopOaWgBKWiigApCKdSdxQBmW2P+Em1I/wDTGOtIVmwf8jRqA/6YRmrjXcCPIhkG9OooAnrL1v8A49rQ/wDT0n86sDU7b7Ms0paLIyVYciqusMJLKydDlWuYyvvzQBsH7xoxQfvtRQAlGKWjHFAGbgp4mJY8S22E+oPNAw3iV9vVLYBvz4q1dWkd0qFiySIcpIhwy0WtpFZq2ws7ucu7nJagCK6u2SUWtqvmXbj8EHqals7VbRPLDb5GO6Rz1Y1XbSbZ7qS5Ek8ckn3ykmM1Yt7SK13mNnJc5Yu2TQBmQ2B1G5vbhLmS2DMYykR6kdzV3RmL6asbKFaJ2jJUcNjv+NLNp1vNM0uZI3b7/lvgN9RVuONIYhHEoVVGABQBRGL3WCesNmMD3c/4Vod81Da2620PlrySxZj6k1MaAM68X7TqdnbfwRkzP+HQVauGgMZiuSuyT5SG6GpAqiQvgBiME0jxRyoUkQOp7EUAZep2dpa2UU1rGkVwki+WYzyeenvV+9vYrGJXl5kc4RO7NTYdPtLeQSRxfMOm45x9KfcW1vd7RcRLJtOVJ7UAQWsKxTfar2ZGvJeFXPCD0FWLi9S1KqVeSVvuxoMk1HDp9pDKJI4FVx0OScVb/j3YG71xzQBm22nSf2j/AGhLi2YjHkRHg/73vS6ozS+TYR5DXDfOR2Qda0Ccmo/KT7QZ/wDloV259qAHqqoqxqMKowKqy3rSO1vaQec3RmcfItWqBwMDigCrYWC2CysZMlzuYD7q/QVU+1Q6s7Dz1jsY2w2WwZCP6VrdqrNZWbHJtYs+y4oAmjeOSNTCQYxwu3pVW8Q3F3awY/dhvMf8Ogq2iLGgRFCqOgFL/FmgA6mqbxtLrMbEfu7eMke7GrhpPwoArX9jDqMSpKWUqdyMOx+lNjnuoGWG6iDJ0WWIcfiO1W6OcUAZ2tWgurSFmBKQzCRwvUr3pHa1lvrM6eFDq3zlBgbPQ1pDikRVTOxFXPXaMUAOdtis3oOKqabC0Fmu/wD1jsXf6mrfakHFAFDzEsdXnec7Ip1DK/bI7Uungy3t3e4IjlIEeRgkDvV44YYZQw9CM0v8h0xQBlwXEemT3MNxld0hljIGdwNTafHJDZyysnzyyNIF74PSrp5xkA46ZHSjmgCl/a9uYmDCQSYwYivNFhaBNKW2uI1ZWySh7AnOKuYyclVJ9SOaXmgCgsFzYjFq3nW4/wCWLdV+hq28cdzBsmiDI3VWqTvRigCoNM08EH7FFkdMCppriO1QO6sVzgBFyakoyRyKAMrSblQZ4njlRpZmddynGDV64kugRHbRrk9ZGPC1PuYjk0ZNAFaCyWOTzZnaeb+8/RfoO1WT1zjocigUUAAxuJ7nrWbqszyWs1rHbTNI2MELwea0qXcfWgCvbTm4iyYpI2Xgq4qjqcs00Sww2U7ssitkDggGtXJpN3vQBHb3DTruMTxc9H61HAGudRku3BEcQ8uIH9TU+c05TgYoAeTzRRnNHagAFFJ7UtAAay9c/wCPKE/9PCfzrTrL13/jwiP/AE8J/OgDVP3jQKP4jRSAWlxSCnCgBycflVXmra9/pVUc0AT0Cm0tAx1IaSgnigDO15saQ3vIo/WtM9voKydeP/EsjHZp0H61qnrTAjuP+PSbt+7P8q562djNaYTdJCQFbPXK5Oa6KQjy2DKWBBBX1rLhsJI0QMmVkY5Kn5ouMD68UCIo/Mg0lXtJmQifawI+8Sea3CeayHswt1DEhl+VhvyPlYDvWsecmgDM8Qf8gnaf4pkH61qHt9Kydf50+Eetyn861ScmgCGaBZZY5CSrR5wQcdaaLVBMkpd2dM43GpjnNHvQAtApKTOaAHUUmaM0AL2opM0maAHUU3NGTQAtQ3Vut1bNCTgNjJqXNFAFaWzWUoBIVRWDMgH3iKs7EO/5R8/3vejHoKKAGwxLDGI1ztHTJqN3ulk/dxRsg6Etg1PTTnoKAM2xt7+yheIJE26QuDu6Zpb21uby1g8wKJEmVnCngqDWhz3FHUUAZVxpZUTvA5Znl84KeMN7GnaTYz2tmUuZixkJZ0x0JPrWjQQfSmBQsLIwveJIMRyTb02nHGKZpumi284yht3ns6Hd1BrRpaQGTqdnezu8kYQgIUTacNg9c1FNp94bVFKozLD5QKnBx71tHrRigChqFrJLpMcCDLKUyB7HmmfY5Rql1OIkeORUC72xyBzWjz2o6daAM+wsp7SxuIsqsjuzJzkDNV5bC5jm3NB9sjkRd/z4KuO9bHeg5AoAzoIb57oXU7iLBK+UDkFP8aR9PCX1tJGCYwriQnqc1ogZ6Uh9KAKFzYLuszDECscu5s+mKNWhublYYYIY2jEiuz5wVwemKv8ASkoAytS0+51dlkBFu0R+TJ/1g/un2q7GklxbeXd26xMOAFOQPcVZ5zQTzQBiy6TPJqlnJkeRbsX35GTkelX7KwgsBMYxuaVy7MRzzVvnFGKAKU9n9tmTzYkWGNt4X++w6ZpljbTjVLq9niSHzFEaohzwO9aGO1AHbNAFRYHXUZ70gFygSNfaoJNOb+ybiAEGadw7n1Oa0iOaMUAIvCqPQYp+abS/hQAvajtTaKAFozRQVPpQAZpKSjnFAC0UUUAFLSUUALS84pKWgAxRR2ooAKKBR2oAKKKKYC0UUUAFKKKBSAM0uaBRTAKUUYpaACilopAFFFGKACilooAKO9KKTvQBlwZPivUPT7NHUV75pedLaDdgqzKByw71NBx4q1D0+zR1ZeCZb9rmJlO+LyyrfzoAzLSIyqJIAzsUKq8w+UYP3asa5/x5WeQARcx8DoOamSxnW2t4C8eyGTfkZyaj14D7HbH/AKek/nQBqH7x+tFB+831ooAKKKQ0AHNJVC8lnlvorC2k8osu+SQDJVfakspp4r6bTrmTzSiiSObGCynsfegDQorNdp7/AFOS1hnaCG3A3uoyWY9ql064lle4tbkh5rZ9pcDG8HoaALwBPaislEudTmuJEungijbZEE7sO5q1pt293ZB5RiaNzG/oSO9AFvmlrLUXUOvW6SXRkimjclMYAx0rRbcAdg3NjgZ60AO7UZ4rn4dbnk8QXFqtrJ8sQAiY9GB55+lbpYKhdyEUDJyelADiaTvxVI3stydljFuXvM/Cj6etN1FphDb20Um2SeQI0g7DvQBocjmlB7ngVk+V/ZV/bCKSR4LhvLdXbPzdiKt3dqbt0jaQrADl1U4LGgC379jSdazLVPsmqyWsEjPbGPcVY58tvY0ahdZuUsROIFK75ZCcEL6D60AagI5wQfoaSqVhDZJGZLJ96k4Y7s8+9LqF6LS2jkSSMFpVQ5PQE0AXM0hIBALAE9AT1oDIWO1gwHXBzWPa2SapDPd3JLSSMwiIONgHTFAGz0pM1RsZJbvSV3SFZ1yhcDuOM00X01kNuoR4Tp9oQZX8fSgDQzTVdGZlV1LDqoPIqK4m/wBAlmtmDnyyUK85rIuUtbPRkvonxcqA4kDcue4NAG9nimSTRwqDI2Ax2j3NLG/mxo+PvqG/OqK/6ZqrN1htRge70AaBpAyliodSy9VB5FQXl19lt94G6VjtjX1Y1R02z+xardoWLSPEryEn+I9aANamrIsi5R1cZxkHNVr2VwiW8X+unO1fYdzVXR4EtJNQt487I5sAH6UAa1GaqSalZQyGOS6jRx1BPSpYLy1uSfs86ybeuO1ACyXdrFIUluY1cdVLc1IrK4DIwZT0IrHaJ4NTvZG0w3KyEMr8cDFadnPDcQK8HCdNuMFT6GgBrX1mJDH9pj3g4IzzmpxyMg/SsaDzLFZxLpnmqJWdpcDOD6VokRXtohjkZY2GVdDgigCzQaz3uLnTk33S+fbjrMv3l+oq7HIkyK8bblYZB9aAGXFwltDvfuQqgdzSTXMNsqtPIIw3AzVb/j71Td1hthgDsXq60aSFTJGr7TkbhnFAFePUbOWURR3CGRvur61NNPFbxGSZwqiqciRza3DGsaAW6F2IXHJ6VeaNXOSgcg5AIzQBFb3cF2pMEobHUdCPwqVnCIXc4VeSay7WX7Trru9ubV449uxhgye/0p+t211c2pSyuGSWQeXsxlT9fSgDTByAR0IyDVa4vrW1ZUnmVGYgBe9QaRHMlov2iWRplGx0YYCkelR67FGdLkkKKZA6YbHP3hQBpc5qK4uYbWPfO+0HoO5+lTY5FYguWl1y6C27XE8OFRT91Bjr9aANSC4S4TfHu2/7QxUtQWt4t3E7BSjxkrJGeqmqZ12AHBtLzg4/1VAGqGp4biq1rcJdQCVEdAf4XGDU+aAHZFFJS0AFZev86dH/ANd0/nWpWXr5/wCJYp9J0/nQBqkfNS0n8VLzSAO9OHWkpRQA9e/0qmDgVdXofpVEHigZPmikozQIdmkJpKD0pgZeun/Q7VfW6QfrWuT8xrI1rlLEf9PSVq9zQAtGaQ9aTk9qAH57UhoGcc0jEYoAytc5t7MDvdx/zrTnlS3jkmk4VRms7WeUsAO90tXbpgtvKdyLxgGTpmgChb6qqukcu+V5m+UqPlXPQUWF+/lE3Cs3mXDRofQVT/eiOxSMK5E2SQMAnHWp2tXtbq0iEoaFpS5U9Q3fHtTAku79l1K3tEukVZCdwC5IxUMuoXAglliLNCsvEm37oHUGm3Fi1xr9vPNJ5fysFKdQB60xI5Vmkt47gNYTTEcj8TzQBvAhlDA5DDIqhFdSHxDNa78wiENt9GqyLiAQearjyl4B9cVnG3mSKTUVQ/aPMEmzuUHb8qQGvnH3mwPX0rPe7uLaxmlMkM2yQBHXuD6+9WoLiC+hWWFw6N1HcexrFDxG2v7VgyBZyQVH5YoA1HubmK+ton8sxzkjjqMDNMuLt01I25uEhjMeVLDq1Rjyxe2huDKr7d0W/pnHI+tJfQPPdW0fnDaknmMSv3QKAC31GU2gjmz9oZJGDYwPl6VaimkOjJOz5lMO/Pvis2EzXMbXc7qyiOZFbGPpWhbwxy6barIDxEO9AFcXUjWAk+2hZmj3bdner9nI0tjDI7Auygtj1rOSyksrSQlopSu5xubHHpVuwQC1STyhG8g3MoPFAFvcD0IP0qjfPK8sFpDL5RlJJcdQB6VNbLABI9v/ABNlue9R3kdvNt82byZEO5JA2CDQBBaTS2+pnTZp/PBj82N2GGHqDTdXe8hgNxBcKiRkEpt+9zUNnbxvrX2uKR5tkZV5mPDE9hUutTRDTJkMi7+Plzz1oA1M5UE9wDVC6tpHdpX1FoFH3MYAH19atrKjRAqwYBR93ntVSf8AszUIClw8ckY6gtgrQA/TZ5rqwjlmAEmSCccNjvVe3a8g1ryZ7kSxSRFwoXG3Bp2jyubAqxJijcrE56lR0pkk8R8QW7eam37Owzn3oAu3lwLW0lnPIRcj61myfbrC2TUJLppckGaAj5Qp9PpVrVUebSLhYxuYLuHvjmoNQu4bnRkWNgz3CqqoOuaANCZJpYsW0ojc8hiM8VU0ma4kt5o7mUSyRTFN+MZFXQ6xKhdggAA5NZ2kyRsb0B13G5Y4z1FAFq7juZfLjgl8pCfncdcegqvbPcW2qGylmNxC8e9Hb7yexqS8v0tmSFSpuJOEVjgD3NFmlvFIw89Jbpxl2Byfw9qAI7hp7vUTZQzGCONA8jr156CnWM1z511YTyrJNAoZJcY3KemR61GrLb+IZ/NO1bmFdjHpleootHWXVb+5U/uwgj3djjrQBHo2qT3ccq36LHNHlgV6MnrUekape6jqt7HKiR20YBhAHJB71FDZi/063eCdY5YyyOR/EhPIqWCe3s9Y1JwyiOKCPAz6CgCP+0NSttWkWR4p7CNlSRguGUn/AArcYMQwRgGx8pPSuftbLUJ9LmAurbZeZkIKkkZ6c1p6XeC602N2dS8Y2Sn0IoAbYtdpqV3bXNz54VFZSFxjNLrVxc21jG9rIqO0yoSwzwTUcF1bnXbz98nzRJj5utN8QeW+lIkj4Vp0zz2zQBNq093ZLZtBJGQ8qxyBh1z3FSXVxMbv7DaYE23c8jdEH+NZuqWtrbrZypI5ZbhCN7k5FXXdbTxA88zBYbqIKrk8Bh2/GgBUlvLGeOK8kWeCU7VmAwVb0NR3Ul//AGxDaW9zHFFJGz/MmcYp2oOt1JBZxEOwlEjleQoFQX5tn8Q2izyBU8lwfmxyaALETX6XFsxuY7m2kYrIVXG2oydRm1e5torxY4okV1/d5zntVqwto7G0WCFi8YJIJ561QkEU3iG5/wBNaDECj5WHJoAtwXksTXUV7tL2qBzInRlP9aihGp3sS3AuVtd4ykQTdx2zUkmnx/2dc28RZnmQguxyWPakjuo7nT4lW7FpMgCuDjKkdRg0ASQx302nSRXkqxXBJAkiHbsao6hZva2amG+uzK0iouX6nPNWtJmnmtpDcS+aVlKq+MZA6U6dGn1S3Uj93ApkP+92oAusyxRl5Gwsa5YmsWznuZNejleRhDcwsyRHoAOhrQ1K1kvrJoI5ViLMCSRkEelZo+0r4lsvOntmVIHQCMEY9vrQBuilpq9KdQAUUUUALRRRQAtHaiigAoopaAEopcUUAGKWiloASlFGKWgAFLSUuKAACilo7UAFFFAoAKWkpaACiiloAKO4oFIaAMuEj/hLdQH/AE7Rn9a1B0rLgx/wlt972sf860GnhjPzzIvbBNAEnasvXubG3H/T1H/Or73VvGMtPGoJwMtWfr/Flbe11H/OgDWP3z9aKT+M0tACd6O1FJQBnMfI8RI78LPBsU9sg0iHzfEUjLgrFAFLD1J6VbuLeK6jCTxh1ByM9j7UsMMUCbIkCDvjvQBStMQa3fwuQpl2yrnuMYNLpp8zUtQuF/1byKqn1wOatXFtDdBRNGH29Ceop6IkcapGoVV6AUAZ+kTLb/bbaZgjwztIc91PORUmkqVs5HPSWZnX6E1PLaW1xKsk0Cu6jAY9cVNgbcAAAcAUAZ888Q1+xPmLgRyAnPetLPccj1FVzZWhOTbRE+pXmplUIgVRhR0AoAhFlAChC/Mj+YGzzmkv7OPULfyZSyjO4FT396sUUAUluLm1Cx3cIaMcLLCOPxHamao5jW0uhkxwzBnI/unir2TyKONuMcHsaAKFxLHfahZJAwkWN/NZl6AY4p2o6gbd47WJlSaX/lq/3UHr9atpHHGCI41TPXaMUpCkYZFb/eGaAKljJZRsLa3mEsp+Z36lvxqC+t7ePXLe+uU3QmMxsSMgHtmtJURTlURT6gYpSAQVIBB6gigChaiOTWZ5rVQIDGA5UYVm9qi1PR7O5hUi1BcyqzcnkZ5rUChQFVQqjsBij6UAMt7W2tdywRLGrdcVQs7uPToJra4DLJG7GNQM7geRitPtR15IBx0oAp6fG9ppmZEJkJaQoOvPammC6v1/0o+Rbn/lip5Ye5q9mjnrQBGiRWkAjiTZEg4UDNZU0drdRvBY2p3ycM7AhUHetmjPHGKAIZ5PslidmSyIET3PQUlnb/ZrRI+rn5nPqTU5AIAIz3paAK11ZpdtC7SPG8RyrKelULGEx6/dS+dPKrRBd0i4BINbBHFJkkYoAq3NnFLMt00s0cka4BjPb6VR0WJori/YvOyyyhlaVcEjFbFHJoAYYIHbc9vEzHqSgJpViiiyYYo0J/uqBmnikoAqi/kiYpNaShweCgyrUWUEkMM8hULLM5cIe1XAaOtAFI30vlsrWcwmxjbjg/jS2sElnpqRKA8qgnGeMmrmcUmKAKaWTu4lvZfNbtGvCj/GpriXyLWR1XlVwoA/KpaKAILGH7PaIjffb5nPuasjrzTaWgCtaW7RTXMznLzPnPsOlOlmuInBSDzY++0/MKnoNAFIJNeX8NzJEYUgBChj8zZq7yDQOaWgBDWbqi3VzaPbQ2pbLKd+4Y4Oa0u9Jk570ARwyySLukhMTDsTmqzxzWt5Lc28QlWfHmLnBBHer3WkpgVLK3eF555cCW4YMwHQY6Vb3MO5pPeg0AGc8mlpKKQDgaXPrTM80uaAH1ma7/yC/wDtqn860c1ma9/yCv8Atqn86ANbvSim5pfxpAPFKKaKdQA8dD9KpVdXv9Ko8UATZopKKYxc0GkoNAGbq3+s01fW5B/IVqdz9aytSwb7Sk7+cx/StTuaAFPQ8E/Sse4mkSzuJ4p2dFHyNnlWz90itSQBx99k9wcVmXNv9r3W1qzEOwaVyMKcf1oEXY7WQXEc/nyACPlM8E1aqlbTeZctFIJY54x91ujD1FXCeKAM3VjmbTV9bjP5VosqtkMAwPYjNZupYbUNKX/psx/StJuCaAEKhiOBheRx0phijMolKDevRqcTgZJ4oz0I5B6EUANeKORgXXJAxmkaCF4hE0SlFOQPSn5GSMjI7UZ7d6AGCGIBV8tdq/dGOBUmTnNFFAESQQROXiiWNm+9tGM0pjjLhyi7hznFSUCgCOWNJ1AkUMAcjPY0jwRSBxIgbfwc1JxikoAheztpLdYGiHlr0XPSpwoVAqjAAwBSZ96d1FAFaezguSpljyyng5qcAADAwBRzRQABQoO0AZ5OKimghmAE0ayY6ZFS5pKAEVVRAiKFUdABiontbaV98tvG7dMsM1NSUAMihigBESKgPZaie0tpJN7wIW9cVOTSUAIMAbQAFAxgCoPsdpkn7NHk99tWKKABcIoCjAHao0toI5PMjhRWPcCpKKAGvGkilZEDqezVGtpao4eO3RGHdRU1J2oAZLBBNjzYUcjoSOabHbW8TbooURvUCpfwo7UARyxRToEmiV1ByNw6U5Y0VPLVFCYxtA4p1J9aAGRwxQZ8qJEz12jFRm0tmLE28ZLfeJUZNT4o/CgBiRRpHsRFVP7oHFIkMMSsI4UQN94KoAP1qTFFAEAsrQfdtYh7heakeKNwA8auB0DDNP7UUARtDDIFV4kdV6BhnFR39lHqFi9pKSsbcHaB0qwOlFAGfa6T9jjSKG9l8lf4Coyfxq49vBK26SCN29SozUuKKAEVQoAUAKOgqNra3dizQRlj1baM1LQKAEAx04xUUltBM2+SGN29SOamooAaoCqAAAB0Ap2BnOOTRS9qAEOPSmmOMvv8tN397HNPxSYoAXilpKWgApRRS0AJS9qKXFACUUUUALRQKKAFFGKKXFABRS0UAFFFOFABRRRQAvakoooAKKKSgBaWmiloAWikooAWk70UlAGZCf8Airbz/r1j/nUcU0Dazcv9nVlEiQEn1PenQn/irr3/AK9Y/wCdSNYSS3k7+Z5cbOjjA5JFAFOdVOlzIYiXF1k4T7qg1PrkyS6XayxsGja5jKkdxmpb6GVIGMX2id24AD9M+vtVfWY/s+i2cX9yeIHH1oA2v4zRSH7xooAXNJRSUAB6UCs3Wbu4srCaSO2Mkfln5kb5gfYd6dpF5Pe6fBM8W2MxjDFsnd3yKANDB602sW9Nv/bjfbJJhCIBsVM4Ld+laNi9tJbA2kheMHHJyQfegCzwMZIGfU0tZl9bacivc6hIxB4BZyNv0AqXSWmOmRmZy+SfLZupTtn3oAvErnG4Bj0GeaQZrH1KLTbW3kluWfzn5R9x3Z7Yq2089toJuJv9ekO4n3oAuBgSVDAsOoB5peMEkgAdyaw7jT0h0QX0bML2NBN5oPLHqQfatKSGLUbOLz1JVwrkA4560AWA6McB0J9mpaxb+wtPtthFBAsczS7iyk5CjrWpdXlvaDdO4BY4VR1Y+gFAE1IapD7bduGYfZbcHO3+Nvr6U6/uWt4FWLmeVtkY9/WgC2Cp+6wJBwQD0p1YmiWYsb7VIQ7NiRCxJzyRzV2SK9gdpbWQTxk5MEnX8DQBeFRS3Fvb4E0yR56BjUFpqMF27RDdHcJ9+Fxgii6+yWwe6nt/NJGDhNxx9KALYwQGVgykcEd6ikvLWF9klxGjehaqeiAfYGkjb9y8haNM/cHpS6nJZ2VpLLNYNMrg7tibvz9KAND/ACDUc1xBbAefMseegJ5NVtLBj0m3LNvATcOc4HUCsuy1K0lL3s8UlxKxO9gmVhXPAoA6BHWRN6sChGc1FHe2ksvlR3EbSf3QetK6Jc22wH9zIvG3jIqjqMEDRw2VvEq3KurRlBygHcmgDUxSI6SAlHVsHBwehqK4RjGWWdo2QZ3KM5/CsjRY9QWeZLuTy1kczIEThwfX0oA25Zo4E3yuET1NRwXUF0GMEgbb94dxT5II5mRpUD7DkA9KpBUudZW5gwqRIUkYdHPp+FAF/tQPSqWo6hb21rcRuzCTyzjCn+dGn30Nxa26gv5nljO5SKAJZdQtYZfLeQ7x1AUnFSQXUF0rNBJuCnDcYwakUqm5yoGBknFUtLDSQSXLDBnkLjjt2oAvUZGcA9OtZyXdxqMkkVpiBEO1nk+8foKtW9rFZxvsLsTyzMcljQBPznFLWJc6pEus2WEnA2OGGw8+layXCGBpyGVFGSGGDQBHPe29tLFFNJtklbai4zmp3dY0Z3OFUZJrnrhleK21CYrvmul2ZP3V7V0DjJIIyKAKsWp20swi+eNn+4XXAb6VYmmjt4mllbai9TWZqks5ubWGeELaeaD54OcHsMdqm1NQ9xp8Tfca4yR64FAFi3v4bmUwrvWUDcEdcEj1FWu/86z9Uwt5p1wo/eCfZn2I5p+pz+WsdujhHuG27ifujuaAJLS/tr2SZLdixhba+RVhiFUszBVHUmsvThBHrGoQwMpVUTBB68U/WLtotMvENvKw8s4cDigDROMZzxjOaarpIu5GDD1BqvYXLzW0Ctbyx4jXlxweKJrGNWa5gmNrJ1Jz8h+ooAtVUmvxE7LHazTBPvFF6U3Tr2a7Egli2lDgSL91/cVPdG8EB+xCIy4/5aUAEV1BPaLdRyAwsM7j2+tSZDKGUhlPQiqOkeU2mhFHIYiVWH8XcUlzAmnoZba5EJ6+Q5yrfQdRQBf/AAo61BaTPPaxyywmJ26oe1T9KAClzSZo5oAX0rN10/8AEsAI/wCWyfzrRrN13/kHxj1nT+dAGr3pwphOCaXOKAJAaeDUQ608GkBIvX8KonqavJ1xVEn5j9aAJM0tNpc0wFoJoBpDQBn33zaxpgz0Ln9K0fWs26bOuaemOiu36Vog8UAKQDwRkUo+UYGAPaik6jigB3BIJ7UhoFIaAM2+P/E60pf9pz+lXLyTy7SdgCcIelUr3nW9M9t5/SrV40n2d0jiMjSAoMHpnvQBkR3r/wBnWMfz/NA/mAj73HBq5pNzIY4LRosAW4cNuzmomhe2SzS4KqqRNGWUZwcUWLLDewrDI04MfludhG0CgBVndNWvZVgY+XCuVJp8N4kmo+ftZVe2Vsde9Mbz1N7cyqIhMmxEPLHFNsJUglVpMqFt0TG3vQBsAgqCOh6UtVbhrpVWW1KygfeibjI9jVgEMoOCM9j2oAdmim5ooAU1Re7kGota5jVfK3gmrtU5bVzdtcJKFJj2bSuaAMywvprfRYnDxuTMVIYnJBatW/mgitz58rxA8h1BODWTaRwNpKxy3MasjsxQjnOc1oXcrXehu6Rks6cIBk0AQ6rIws2YNcrIAPmXhW96uWaRQbkSORBgMS+TuNU3kWW5SO68xITACY+etWNPeRknJd3XzDs3dcUAWoZ450ZoySAcHIp9Qwy+apby2jIOCrCpSaAFptIaM0ALSZpKOvSgBaO1NooAdRSZooAWkopKAF5o7UlFAC0Un4UUwFopKKAFoopKQC0UfhS0AAopKWgAo9qKKAD8KXtSUtACUtAFLj8KAEo4paKAExzS0CloASilooAPpS/WgUCgBRRRRQAY9aKKKAClpOaWgApaSjNADqM0lFADqKSigB1FJRQAuaKSkoAWjmkzRmgBaKKSgB1J2pKKAFpO+aKQmgDMh/5Gu9J/59Y/51p1lwk/8JXef9eqfzrQNxCrMjSorr1UnkUASVla7/yD4c/8/Mf86vPd2yruMyYHoc1n6+f+JVCVOQbmPH50AbDH5j9aKaxO40UAOzSUnajNADJEWQoXXOxtw+tIiJHuCIFDNuIHr60/rSUAVzqMCTGKYmF16bxwR6g1V0/bJf311CpEEhUDjG9h1IrRZQwAZVYDpuGaOnA6dqAKZ1CwcMlxgbTho5UzUekrJDp8p2P5RlZoYz1C1fOCclQfqKXmgChLqenTW8kUqszEFTE8ZzmiG1mk8PfY5ifMeIqNx5A7CtDOTkgFuxxzSe9AGQ16J9HWyWOT7WyCFoyp+XHGfpWtGvlwxx/3FCn8BTiT+NJyKAKkcLNq8t1JwqII4/6mpLq0t7xFWZTuU5SReGQ+oNT9RSUAVEa+tpFSUi6hPAlHDr9R3pbmyjup452lljkiB2sh/pVqkxzwKYGPo8RXVdQlLXDLKV2tKuAcVoT/AG2WXyoNsMXeU8n8BVosSOT0pKQENvaRW2SmWkP3pH5Y0w6i1vIVmtJwR0aMbgas4pQSOM0AUdOhki+1T7PL+0PvSI9v/wBdP/tGWMFZbC48zphBlW/GrdLk0AVLC3e2sxHIMFmLbOyA9qrW/nabby2K2ckqFmMbIPlIPr6VqUc5oApRx3NjoipBEJbhF4TPTP8AhVe0lmt48jTrlp5P9Y7gf5xWrS5PrQAgORnGPanbiR9OlJR0oAo6mLx4447aNmiY/vShAbHoKW2mm3RwLYNBAo5LGrueaTNADZQZbeWLPDqVohUxwRxE/cULmnUUARXUby2ksSH5nXAp8SCKGOMcBFAFPoxxQBXuLOK5YSZaOYdJEOD+PrT4BOibZ3V2B4cDGR71Lij2oAhlg8y9t7jIzECMeuamf5gQQGU8EHvSUUAZGo6Stw0P2WxhASQOWL46dsVqTeeVDQFA46q/Q+1PHFL0oAoSx3l6ggnijhhyC5Dbi2PSpry2NzEnlsFkicPGT0yKs0lAFUR3NzcxS3UccaxZKorZy3rViRI5BiWJJMdNwzT6OMUAZ9nZSW+oXFw0MEaTKAFj7Yq7NGLi2kgfhXXaacccUUACDZGqZyFUAGq72CTT+ZcyNKo+7H0Uf41ZFFACEfLtX5QBgYHSqeNSQlUeB17OwII/Cr1JxQBWtbYWtu6K26RyWZ8dWPemxWMUT+Y5M0x6u/P5VapDQAZzR1NJQaACjNFFAC1m63k2UI/6eE/nWjWbrJ/0W37/AOkJQBqn7xozSE/MaBQA4GpFNRDrTx6UATRn5xVM/eP1q3H94VTzyfrQBJ2ozSUUDF70GgUlAjPm+bxJaD+7bsf1rRHSs/r4lX/ZtT/OtEUANbcR8pArOkc/2zFFI4AjjL7x6+hrQklESlipY9gO9UhKtlHJcXQJkm6ALnHoKALUEwuD5sUqsgJUgDvUxqnpkRisE3LtZyXP41coAzbnnxBYD0jc1ojpWbLz4ltgO1ux/WtBnVBl2Cj3oACcHFKOnAAqL7VbnOJ4zjr8w4pySxylhG4Yr1x2oAfRnNMkkWKJpHPyr1I5xSqQyB1IKsMgigB3SjNRTTx28fmSvtUHGaUyxjrIo+poAf0FJTfMQrvDAr/eHSozdWwOPtEefTdQBPSGmJIsih43DoehU8Uw3dsOs6DJwOe9AD/LjJyY4ye5Kin9O1RpLHJGJEdSh6NninSSpDGXkcKo6k0AHfPf1p2arG9tgM+emPrVjtQAUnalpKAA0h6UtJQAUUd6KAEpcUlLQAlFLSUAFFLRQAmKKX6UlAB2ope1J+FABRS0YoAKKWigBKWijigA60fWlooAKOlA+lLQAnajilooAMUUtGaACigUtACUUuKSgApaKKACikzS0ALRSUgPpQA6ikozQAtFJRmgB1FNzS0ALRSUUALmlzTaXNAC0UlFAC0maSlzQAZpe1JR9KAFozSUgNADqKTNFAC000uaQmgDLhP/ABVd5/16p/OnrEX1XUNgTzAsZUuuR9Kjh48W3h7fZI/51I6S/bbtxGxSVU5X26igCvbTf2nqp2xrbJaLiWLAy7H+Yp+v/wDIKiAHH2mP+dSPGhnhuIrORJoRtXBADD0PrUWvH/iVQkjH+kx8fjQBsN95qb2pW++1JQAtGaTtQaAEJGMk4A6mlHTrnPQ1ma095HYSNaGFi6lBE+QWJ9DSaFLey2MRujGCi+W0YB3Kw9aANGWWKBA80qRqTgFjilyCoYEMp5BB4NZqJHf6zeG5jEkdttjRGGRkjJOKXTl+zXl/ZKf3UbK8S5+6D1FMDRzzimpKk67o23KCVJ96rahMYLQiPmaU+XGPc1YtYFtoIoF6IME+poASS6t4pVhkuI0lbopbmpTkdaw4fsAtLxL7YbgyNvD/AHz6Y71a0O6M+hRTTsR5e5WL9cA96QF9pYkeNHlVHkOEBPLfSnEgAliAAOSe1YUkf2sW+qSrjdcqsAP8K56/jWzcRLcI0UmdpPIHemAkF7a3LlIZ0dx/CDzUjukUbSSsERerGs2/jSSe2t7RFW5RwwdRjy175q/PBHcsokG5VbdjsfrQA22vLW83fZ5g5XqOhH4U6e4htk33EqRp6scVSkCXOsW5tlCtbk+bIowMf3at3MEM8Unmxq+EbG4ZxxQBJHIk0KyxsGjcZUjuKJHWOMyMcIvU+lU9F40GyH+x/U1X121urm3MNlcvHNONm3blPqfSgDW5IBHQ9DVSTVLKKVonlben3gEJxTNJSZbNTcyStMo2OrjABHp7VcLpBHJLhVABZjjrSAZa3UF5EZLd96g7TwRg/jRc3cFooaZ8FuigZJ/CodKX/QxMww87mRvx6VQtLiWW/vJktGuLlJCgBOAij0z3NAGxDKs0QkUMFPQMMGqzaraLMYyzjBwZNvyg/Wp7a7jvrfz49w5KsrDBUjqDVXVJbmKxkjgtBJCy4kYHlR3OO9AGh29fcVXkvraG8itJJMTTfcXFJHNBb6akqvvhjiBDeuKx5Nhk026llRp57oMcHO0YOBQB0NBIVMsQB6mqmoXbWUJlWEyHdjPZfc02Kz+0hZ7qcT55VUPyD/GgC797oarQahbXVxNBCxZ4fv8AHH4VFqdybe3SJGCyTtsUk4C+pqvZfZ49ZmggkR9tuuSpzk55oA0Li7jtioKu7t92NBkmiC6jug2wMrocNG4wy/Wns0cQaeTC7Ry57CqlqrTXkl8ylFddiL3I9TQBPPeCBxGIZZnPO2Nc0+2uo7qPfHkYOGVhgqfQ0sjzCMmBUMv8O84FUdLeR5bo3ICXZfMiDoB2x7UAWb69h061a5uC2wcBVGSx9qkhmSe2SePJR03gY5rKlu7e5u7mWeaNY7ZCsSMerY5OKuaTMkukWrxsGGzHHrQA3+1mEDS/2dd7VGeF7VatriO7tI7lAVR13fN1FQarKyae0aH55mEY/HrRdr9n0eZE6JCQMfSgBg1aIsrNBKtuW2icj5c1f74qhMqN4eaM/d+zgj2OKlilmWwheOLzXKLkFsZ4pgWBIjMyhgWU4YDtUV5dLZW/msjSZYKFXqSayLK5vRq2oE6exDuuT5g+XitW8tje2nlBzE4YMrYzgigAguJ5H2yWUsI/vMRTrm68jaqxNLK/3UWqzS3VjPCZbg3MMzCNsrgo3qParsjxwK0srBVXqxpAQ294ZZXt5oWguFG7YxyCPUGi6vPs7RxRwmaeT7iA4/M1HbK91dfbpV2KF2RKeuPU0lzHKt7FeQx+aVUo6ZwceooAmtbwXJkjeNop4v8AWRMenuD3FOu7lLO1ed1LbR8qDqx9BWbCLlvE5lmCor22DGDnbg8ZpZ7yE6sRdb0hgXKAoSHbHWgDRs7oXthFdeWY945QnpU1Z+iSCTR4WU55b+dIZta3ELZWzKDwfN60AaOccnpVFr662NOliWtl6nd85HqBVi3kuXjH2qJI5P7qNkVDcXDzyNZ2mN3SWTsg/wAaALCOs0aSR52uMjNOpscawxrGn3UXAzTqADIFH4UdKD0oAT8KzdZ/1Fr/ANfK1pZrM1k/u7Iet0tAGr/FS/SmZ+Y07NADh6U5aYPang0ASx/eqn3P1q0hC5JOABzWd9ttP+fqH/vsUAWsUtGKMc0DCg0vegUAZyHPiST2th/OtIVlwZPiO9PZYUFagoAMc9KO9LSdqBAetIetLzSEUAZuN3igH+7aH+dXXd1IAh8xTVFD/wAVNMPS2H86vTNKIisK5duAT0HvQBhAEaTqhe2PzSsQcDitayciKFfs4QGJcvxzx3pJrQjSpLaM5Zl6+pqygMcCKRkqoGBQBnYzrF2pErRiNSVQ8ZpHgBubU28U0Sq/zZJ24q3aQPD5kshzLKct7DsKs80AZWrzIrQxLzOzgICMhcnqakuZZLZ4/MsopS7BN+/qamvoWlSHYuWEysT7Co7xLie7hjSHEaSBzIW4oAtQ7wm1440wfup0rKiUPq14REg81fLhdhxuHWtS4Mmw+WMk9/SqM9lJd2i2iHyUU7hKfvbvUUAP0xtsb26xgRw/Lvz95u9YyHouMxo27GO5Y1t2puIQtvNbDCD/AFqNw/vioUsrhHkuItgdjjym6bf8aAKmmtHJYxeZHK4iYkIo45PBNaOo4ls3QggEbt3YYqC1try1hhkVVLLlZYt3UZ6/WtIhXU7lBUjlTQBlyb9QtcCJAjAFWCYOK0Y5HMOfJYMBjYe9Z97aiZfs0dkQCQBKpwAK0sMItsZAYLhSaACJ2kiV2TYx6r6U7vTYy/lr5mPMHXHSn0AJRS0lACUuOKKKAA0lL1FFACUUtFACYopaKAEoxRRQAUUZo6UALRSc0UALQKSloAWgUlLQAUtJ1ooAKKKWgAFHailoAKKSjtQAtFNzRmgB3aim5zRn2oAXNFJScUAOopuaM8UAOo7U2lzQA6ikozQAvaikozQA6kpM0uaACim5pc0ALS9abRQA6ikzRmgBe9FNzSg0wF6UUmaTNADqKbmk3UgH0U3NLmgB3vTT9aM0maAM2DnxTef9eqfzrT6VmQceK70/9OqfzrToAO1ZfiAZ0mM/9PMf861Ky/EPGkKf+niP/wBCoA1m++aSlf7xpKACkopKAEIU4yAcHIz2owAxYABickgdaXFBoAz3L2OqTXDQu9vcKMmMZKsPWnWEUhnubuRChuGG1T1CiruTjilB70AUo0NxqjTMD5VuNsee7Hqauknr1oxxwMUUAUJp3lfEOnOZxwJZUAC++amis4l0/wCxy/vFYHzD03E9as5PelxQBgX2kRr9mit4ryRY5FYfvSUUD2rWvXuEtna0j3zHgDPI96sUe9MDMgea3j2Q6fMZHPzySsASam1H7WIUS1jZtzYkKEbgvtV2m5INAFOCSaJY4INOaKIn5mdhn6n3qe5aVIisMJlLAjhgMfnUvNLQBR0pbiCzhtbi2aNo1xu3Ag8+1X880ZpKAF681XvYXubKSBDtL4BPt3qbNLmkAigIiqvAUACqey5srmaW2iWaOYhiu7aVb/CrlFAFazt5YLaQFlE0rFzxkAmhn1ExtF5EIZhjzA/H5VZzS0ARW9rHb2SW2AyKuCCMg1RutKSS4tnt7aBBFIJGboT7Vp9qBQA44weMg9RVT7Asb+ZaSNASclOqn8KtUmaAEkijlXbLGkgHZhmqUFiYdUe5WC3iQptAjHP1q/QKAKV5a3U93HJG0Twpz5UmQM+p9aniF4Zi1wYQgGAsdT0UAVmW9jkJieGRD0DjBH5UlvbPHLJcTOGnk67egHoKsk0UAQ3VuJkYJDblmGCZEzxTLG3a0s47dipMYwCowDVmkoAilgWWaF26RHIHvUjKsiNG4yjggilpOfSgDPGn3H2cWj3StbD/AGfnI9K0FAVVVRwowBRS/SgCOOFY5pZR96Ugtz6Uk0UkmGinMTj2yD9RUtJQBVFrNLNG91OrrGcqiLgZ9TRe2cl1PFIs4VY+fLZcgn1q32oP0oArxRXQmDy3QkUDG0JgVJMlwwHkTLGe5K5qXtSj3oArW1qtsWbe0ksn35G6mppPMaMrHIEY9DjOKf8AhSUAQWlt9kthDu34JOcYqfOKKOfSgAYbkZdxGRjI7VRt9NltoDFFfuqZyf3Yyfxq9g0c0ANjQpEqFy+Byx6mn4oANGDjoaAEpKXBz0owT2oAb2rL1npp49bpa1SD6GsjXOP7N7Zu1FAGt3NL24pP4iKKAHiniox708HmgCROpBGcjms/7Jbf8+0X/fIrRi5aqwFAElLjiiigYUnenUD7woAxIb22t/EGppcTJGSqbdxxnir41XThx9sjqtYxxyarqnmRI5Dryy57VpiGHGPIix6bBQIrf2pp+M/bYv8AvqgarpxPF5F+dWPs1ueTbQ/9+xQba2/59YP+/YoAg/tPT/8An8i/76pDqVh/z+Q/99VObW2PW1gP/bMUn2S2/wCfSD/v2KAMmG+sz4iuZTdRBPIVVYtwfXFaH9o2B6XkH/fYqb7PBs2m2hx2BjFN+x2pGfscH/fsUAM/tCw6G9g/77FH9oWHa8g/77FONlaj/l0g/wC/Ypfsdp/z6Qf9+xQAz7dZf8/cH/fwUpvrMf8AL3AP+2gp32O1P/LpB/37FJ9itf8An1h/74FADPttlj/j8t/+/gpRfWWOLyD/AL+CnfYbQjmzg/79igWNkB/x5wf98CgBn26yz/x+Qf8AfwUfbrL/AJ/IP+/gp32Gz/584f8AvgU37BZ/8+cH/fAoAT7bZf8AP5b/APfwUfbrHP8Ax+W5/wC2gpfsFl/z5wf98Cl/s+y/58oP++BQA37dZf8AP3b/APfwUfbbL/n7t/8Av4KP7Psf+fKD/vik/s6x72UP/fNAC/brLteW/wD38FH2yz/5/IP+/gpBpmn/APPlB/3zS/2ZYY/48of++aAD7bZdry3/AO/gpftln/z9wZ/66Cm/2bYf8+UP/fNN/szTyc/Yof8AvmgCT7ZZg4N3Bn/roKQ3loD/AMfcH/fwUw6Xp+P+PGL/AL5pP7N0/wD58of++aAJPtdp/wA/cH/fwUfa7Q/8vcH/AH8FR/2ZYZ/48oR/wGj+zNPH/LlD/wB80AS/abXvdQf99ij7Va/8/UP/AH2Kh/szT+1lD/3zR/ZmnnrZQ/8AfNAE32q27XMJ/wCBij7Tbf8APzD/AN9iof7L0/tZRf8AfNJ/ZWnn/lxi/KgCf7Tbf8/MP/fYo+02x6XMP/fYqEaVp3/PlF+VA0nTR/y5RflQBN9otjx9phz/AL4pfPtv+fiL/vsVAdK049bKL8qb/ZGm/wDPlF+VAFn7Rbf8/MP/AH2KT7Raj/l5h/77FVzpOm4/48YcfSj+x9LH/LjD+VAE32q1z/x9Q/8AfYpxuLUdbmEf8DFY+t6Rp39iXjLZRK6plWA5FXLXStOWzgxZQ5Ma5+XrxQBc+02va6h4/wBsUfabb/n5h/77FQf2Vp3eyi/Kj+y9O6izi/KgCb7Vaf8AP3B/38FL9rtP+fqD/v4Kh/syw/584f8Avmk/szT/APnyh5/2aAJ/tdp/z9wZ/wCugo+12n/P1B/38FQ/2bp4/wCXKH/vmm/2Zp//AD5Qn/gNAywbyzHW7g/7+CkF7Z/8/cH/AH8FQrptgMgWUP8A3zS/2fY45s4P++BQBN9tssf8fluP+2gpPt1l/wA/tv8A9/BUf9n2OP8Ajzh/75pP7Psf+fKH/vgUASfb7L/n9t/+/go+32X/AD+2/wD38FR/2fY/8+cH/fAo/s6xPWyh/wC+KBD/ALfZf8/tv/38FIdQsf8An+tv+/gpn9nWOP8Ajxg/74pRYWOP+PKD/vgUAO/tCw/5/rb/AL+ik/tCx/5/bf8A7+Cj7BY/8+UH/fsUfYbL/nzg/wC/YoAX+0LL/n9t/wDv4KadS08db+2/7+ig2Nlj/jzg/wC/YrJ1awsxqWj4tIRunIYBAMjHemBrDULHr9tt/wDv4Kd/aNj/AM/kH/fYpPslp2s7f/v2KX7LaY/49IP+/YoAT+0bD/n9g/7+Cj+0tPx/x+wf99il+yWp/wCXSA/9sxS/ZbbH/HrB/wB+xQMZ/amn9r2D/vsUf2rp/wDz/Qf99in/AGa1xj7LB/37FJ9lth/y6wf9+xQIT+1dOA5voP8AvsUxtX01Rzfw/wDfVSi2tsf8esH/AH7FKLa2LAfZYOf+mYoAgXWtLf7uoW7f7r5p39saYf8Al9jrP8Owwrp0wEEQ/wBJk42D1rY8qL/nhF/3wKQFf+19N73kdJ/bGmj/AJfE/WrPlxf88Y/++BS+VF/zxi/74FAFT+2dNxn7Yv5GlGsacel0v5GrOEA/1cYH+6KUqinlYxnpwOaAKn9taZ/z9j/vk/4Uv9t6YP8Al6H/AHwf8KthV/55p/3yKX5f7q/lTAo/25pmf+Pr/wAcb/Cj+3NM/wCfk/8Aftv8Ku9D0WlDDjAXH0oAo/25phPFw3/ftv8ACl/tvTSOLg/9+2/wq/u9h+VG40AZ51vTv+e7f9+2/wAKT+29O/57P/37b/CtHcc+tG4+tIDKPiTSFmWE3LiRuVXymyf0qUa3YN0klP8A2yb/AApL3nXNKfHzAyDP4Vpb2yeaAM7+2bPHAnP0ib/Ck/tqz7i4H/bE1pbm9TRub1NAGDFfouu3F59nuTbyQKgcRHqDV7+2bb/nhd/9+jV/c3rS+aRjLAZOBk0AZ/8AbMGM/ZL0/wDbE1S1W/8At9isENleFxKj/NFjgHNbhl/eCMvhyMhc807c3rQBnvrKZyNPvz9IaT+1xjP9n6gf+2P/ANetBpdiMzMAqjJJ7U0Tp+7/AHg/efc5+99KAKQ1XI/5Bt/z/wBMv/r0f2r/ANQ6+/79f/XrQ3H1NBY0AZ/9pntpt8f+2dJ/ajZ40u+/GOr+4+tG4+9AGc+pyKpYaXfHHYJUFp4g+2w+bb6VfMu4rkoByOtbAY7hWX4fb/iVv/18SfzoAl/tK4x/yCLv8hSf2hdH7uk3P4kCtHcfU0m40AUBf3nbSZ/xYUfbr3tpMv4yCr+T6mlyaAM/7dfnppD/APf0Uv23UMf8ghv+/wAKv5PrSEn1NAGf9t1H/oEEfWYUn2vUs8aSP+/4q3Pcx2tu8877Y0HJpyuHRXQ5VhkH1FMCoLrUj/zC1/7/AIpftOp/9Atf+/61cyc0yW4SHBkcAFgCfTPSgCt9o1P/AKBsf/f8Uefqh6adEPrOKla9tlfBl5zt6E81IkiyAlcjBwcjFICr5+qDrp8X/f4Unn6p20+H/v8ACruaKAKXnarj/jxgH/bWjzNWPS0th9ZKuZo+tAFPzNX7W1r+Lml36v8A88LQH3c1bzSigCkW1nHEdn+ZoDaz/csh/wB9VdzRTApyPrKIzBbE7QTjLVBZXer3tnFchbNFkGQPmzWk5/dvn+6f5VS0XI0W1/3T/M0gJf8Aibetn+TUY1X+/Zj8Gq3mobm7htIhJKWwTgBRnmgCLbq3aSy/JqNurn/lrZD8Gp7XkcbMrK6sE3gEdR/jUwlBiEhG0MM89qAKhTVe01p/3yaNmrH/AJb2Y+imny3kUUsSHLeYcZUZx9alWaNpNitk4z0oArGLVj0urXP+4ap6fNrV4sxlntY/LlMfEZ5x3rZHDCs7SRxeD/p4agCURap/z+wY/wCudHk6mf8Al9h/791cooApC31LP/H/ABf9+qPs2p5/5CSD/tkKvUlAFL7JqZ/5iaj/ALYil+yajj/kJj/vyKu0ZoAo/ZdS76mv/foUv2a/HXUj/wB+VqQ3f+mraiFyxG4seABTftgLIvlspZyp3cY96AEW1v8APOpkj/ritL9lvAOdTY/9sVq0KguLtIGCcmUjIQDr9KYDPsl6P+Yo3/fpaBa3ffU3/wC/S019SVN2yIuVYKRnByasRSFwxIXg4+Vs0ARfY7s/8xR/+/S0hsrnH/ITl/CMVbzRSApfYLk/8xSb/vgUfYbkf8xSY/8AABV6k69qAKgsrgf8xKb/AL5FBsZiP+Qjcfhirfel70AUDp0vX+0rr8xS/wBnSf8AQQufzq8KKAKP9nP31G6/76FZuqWbw3Ols13NMou1+V8YroOM1l60oL6b/wBfS0AaRwWNLSHG40n8qAHUqn1ptKKAJ4j81QipIfve1R9z9aAJaWiigYUAZbFFKgG8UAZmmfNe6o3/AE32/kK1McVlaMdzagf+ntv6Vq0CDFIaUUUAQXTSrbyGDaHCk7m6CsPN0lhpsvmFA0m+aaQ5Az/Stu9QyWM0asFZkIBJxWbGYQxVy32Vbfys4JUtQBYt7oATjzzchBv80D5c+grOtp7wTXqz7jO8QwQeEznHFaunxhdJhjikXIXGRyAaoRwsl3ftcXBfOwFlXBb2ApgV4tZu7WyijNqrFU++z5zzjP41sT3flTCEtGJCu7aQelZ00SsI4htM8sy5jHJRB2qe9ki/tYSK84lSMxlY4sjn3pARGdrrUI2Eu23a2ckqSMEHrVn7XJForXQkSUquVcA/MPf3rLuIHSO1MMc3lQMRMxHVG61fuZ4LvSmjtyFhLiNT2IFAErvLPFETdxQs7AKUB+96GpI55Gv3geeM+WmXRV5FV5rW1kM267RI5NrAA8q69xUljNCZJZNwNxMc49h0oApHUB/bTQm4uJI44vMKRpjB96ebidYbWd2la3eQEMAASD0BqKLT1TWrme6lbzXiDF1bGB6fTFMt1eOaNbq6cWO1pIo3A4weOaANa4mMUmwyxAOMBWUk1mxtKbK2QXSB4pcyDJyBnv7Vpy+U6Jd+d5WFyr4GSPxrK/e2llc3Iuis07lkVkGW7DigDWt5vMgeUSrMAxwyjH4YrNluJbO6ku7md41mXbDEBkA+/wBa1FiYWqAFY3KgsyqBzWULTzdTR/OSRYgfMkl+6c9qANSzW5Fqhu5FeU8kqMY9qmrJ0i12tLOksgQSFUjDfJj6VeS6f7cbaa3ZCRlJRyrf4GgCzVC/lljms0ikKeZIVbAzxir561QvMSX1orPtEZZ2b04xQBm2F5eTzASXTFBG7HCDPDYFaWmtMbHfdOXfceSMHHasK2R0KTLl5I43dVz9/wCY8Vs6UqNpg8iXDuSz55KMe2KAK091La3L3k8zxQyDZDGRkZ9x71o2gufsytdMpkbn5R0FZxsjNqkebhZliBaVn6EH+H0p+mWuZZpBNMsaSFUjV/kIoAfqty62/kW8myVyAZO0Y9TT2mu1uYbSHypSBmWQknA/xNM1SS7W2Ig8uCN3CvI4BJB9qZMP7NtFFndRP86hjgFmzQA7Wr17GxkkinEbjAGUznJxxURnlSW2PnStDEP3rNwXY9BSeI7drrTwjDEKOjls8k56UXkEuMvKwjyiIpP3uetAGnbTSzBjLB5WGwOc5qeooDKN0cwyyHAYfxCpaACjtRSUAFJS0UAZ2vHGg3px/wAs/wCtXIBi2g/65r/KqWvH/iQXp/6Z/wBavQ/8e0H/AFzX+VAElJincUlACUUZpKYFGSeQayibW8vySWXPGc9az/7Qu3spT9oxKqeYDtGMbsVYmiLaq0yReZDFGEk+fHU9R9KoNaRDVFkaR1sTbvFnON+OaQGlq1yYY7IDIeSZQGU4zxyKgurq5hu/tLAxF0MdvBJ0Z885pdSghvo9PlcboBIuxT3yO9RyW5nn1GKeQSi2GISxOU4zx70DNdfOFuvn/wCt2/P5Y4B9qyLW8vZryFWkkZdjuFCgZwcCrtlHN/ZCCS7d3kTJd8cD0qvI8lteae8MKqQTCw37sp160CJ7GeSedZZDgvACy9s5NOnLf2g25pxCYgR5R75otI9t1O7thyAFTcDhadc2iyNDIJRF5LFuRwfrQBBC7Jqu4SzfZzFj96eN2a0wc1no5m1FYkmingEe6TaAcN2q/nsKAFpKKM0wA1k6u3/Ey0X/AK+G/wDQa1TWRq//ACE9E97hv/QaANgdTilC5IFN7mncheBk9gaAMm51CWJri4RQPsknlspPEin+tSWMkkV41s7eZ5qmYt6ewFQalazLpl8+zBlYOcPnHIq0tvOs8VykY3hAhLPnK0gIrq53aza2qZzGjTsAcZx2okuJrPzLwx5hn2hEL5AY1I6wQa3bSNtUNE4Zm7596rKsUS21pJcpJFHK0mc5G3sKYGvGzlFMibHI5UHOKeufMX60yORZlEiNuVuQacv+sH1oAyfD5zYXB/6epP51rVk6B/x43H/X1J/OtbtSAKKKSgDK8QO8enTOisxCEFFP3veqsTyNcWTurusaGYgsRyF6Vf1SDzEys2GbAaIYyw9qpO95PpzRbJPtySH5dv3Y+4z06UAbFnO91Zx3DxiPzBkLnPFOuXEcD7gcFCMgdOO9FtJFJax+QcxqoUDGCMetFy6raSgkZZCoBOM0wMK2QCOGMupk2fn71paS4WzjgUMyoDmUD5Sc9KzI7YxahYsWDBIWQkHitTSgkNubUMC6MWI9QTQBoClpKWgAxRRQaAM+8/5C+lf7z/8AoNaA6ms+8/5C+lf7z/8AoNaI70gDFLSUtMBKzb9zLqEFkx/cTQszYHIYdCK0jVVrVpbpJnZCU4XK9BSAyY7mf7LHfbybjzhBuZQRtzg/jXREbWNYum2L/YmVnQAzOwymSOetayBlRVeTew6sR1oAz9ckK6aUUZDuqv8A7pPNRziOW9nWRWjFnCJLcL/D71Z1VTJpzADJDqeB70yeJpZL+4wR5kIiQdzigC1aTSzwq80XlsQDkHhh6ipqbECttCD2jA/SlzTAPaikozQAo+8KyvD/APyDJP8Ar5k/nWqv3hWT4f502b/r6l/nSA1gaTNHakoAdmgGm0c0AOzTWbFFJnFMDPvWypnuYj9liG4pwSx9xToDcRFDbqklrIAyozYZM+ntUF5BJcGbyIXVZYyrhwMZ7EUlvE8M4le0clY1RFGMDHU0Aa+TmsjVEZLtbmOMOwUgoRnf+HtWuOVz046VQvLRpruGeONWZVZWJOMZFAFFWVZcId8QMbBVPAdupFaWmtI9mTI5dhIwyfQGqkNhL5VvF/q/LA8yTruI6VftgyxFXjVG3HOzo3vSAno70lFAC9qSlo7UAJS0lGaAHUlJRTAH+4/+6f5VT0UY0a2+h/matt9xv90/yqpo/wDyBrb1wf5mkBeNZOumQW0Kw/OxlXK/jWt2zVW7tzcW7RrwxYHP0NAFCWaG3nlN8LjZIo8seh71dtf3WlL54c8HI6nB6UXFo115nmHGU2oPT3qSOGQq4nYMrYwo7YoAz7hmVo4ys8YZcKpUZPsD61ds+HKtE6FhkFz1H+NE1kkvlADhH3YJqZLaFH3qgDeuaAJh98fWs3Seftn/AF8NWiPvCs7STlr0elw1AGmBmjFAooATFHalooATFIf0paOtAGJJFNLrsgUFojBjl8Hr1FNRMwwWItXW4VgTIWyOOtajwE3q3CkDEeymNYjClJCsqggvjrnrQBb781narhmiG4CQn92OevqSK0IkMcaqWLbRjJ71HcQecY2DlWQ5BApgY6yNIqTLkOIwoZucndjNaGmRlI7jIIPnMcU5LFfLjic7o0JO3pmrEUbRKVLllz8ueoHpSAkopcUEUAHeiigUAJS45oooAWiiigBKy9a+/pv/AF9LWrWVrf8AzDj6Xa/1oA0u5ooP3jSUALS0lFAEkR+f271CDnkcg0rg+RN/1zb+VVtJz/ZVt5n3tnOaANGjvSZpaBi0qffppoU4agDN0bmG7b+9cua1KytBBbTmbu0zn9a0ElWeNmt3WTaSvXjI7UCJM0ZqtHPO9usjWcivkqyZ6e49qWKaZp9j2xiTszOOT9KAJnRZB8yg+xpVOBgDA9Kz5NWA1NrZInaONCZWC8g9hUb6wEui2xf7PTCyTk8hj7UAaaoiZ2IFzz8oxSbUDFtoyepqtfXv2TTzdxBJlyMfNwQfeqh1qX7T9mFmhkEipkSZByM+lAGrtTfv2Lu/vY5/OlJJGO1U7S9e4u7i3eEJ5OPmV8g5qG/1OS1vrW1ghEpkb96ScBB2yexpgaQ46DFMWONPuxqoznAHeq1rfm6u5rcWrxiH70hIIz6VaeSOJN0jBFJABY45pAJsTuiZ+lKMDooH0FQT3sNvMsTrIzspbCLnAHeqlrqxuS0nkM1oT+7lQZJx1BFAGg0cbtlkUsRjJHahoopAFkjRwvQMucVBbXq3sMklvFKNhI2yLjcfalS6Z4El+yz5OQU28qfegCRoYy+5kBI6Z7UrpHKVLxq5Xkbh0pkM0k0rK1rLEoGQz45qheaybSe4QWpkEG3c2/HX8KANJ1EilW6HrTTDEYTEY18v+7is19ZkFlNcrZ/JG+zmQcmtJ5kitzPIdqqu45oAWNFjRURQqL0Ap+eMVjxa8f7PW4uLORWaTYqKeT6cda1s/KGwRkZweooAU/WmsiOCHRWBGDkVk3GvolxBFFAXSXeCxOMFRU2mawmo+SnkyRySRl+cFeDigC+sUaFSsagqMKQOgpTGmWwijf8AewOtPFGKAIvs8QiMXlr5Z6rjrSxxpEgSNQqDoBUnFJQAxlV1KOqsvowzTfs8H/PCL/vgVJRQA2SNJV2yIrL1wRmmvBHIyM6AlDlSe1SUUAFFFFACGjmiigA7UnaiigDN8Qg/8I7ff9c/6ir0J/0WD/rmv8qo+IM/8I7ff7n9RVtGZbSEpGXIjX5R9KAJyaKoHUHF6tmbKTzmTzAN69KsQSTvu86AwkHjnORQBPTTTvrSYoAjaGNo/LKjbnOKHhhljEckSOq9Ay5Ap9FAEbxo6qrICqEFR6EUnkxFpH2Luk+/x1qQ9aO9ADDFG0YjKAoBgLTPstuP+WKfiKmoNAESQQxnKRqp9QKk/LHoaWkpgRxwRQ7vKjWPccnaMZqTpRRQAUUdqTvQAVk6v/yEdEP/AE8n/wBBrW61lat/x/6Nkf8ALyf/AEGgDW7mlFJ3NLQAMAylWGVPUGlGAMUmM8ZrPk1UW9rdtPC0dxbgnaRkN6EH0pAXyqtyyKSOmRQFUdFUfhVO11KF7W2e5miSeYD5VPG70q93oAAB2pV/1i0DpQv31oAyNBBFldD/AKe5P51rVl6Jxb3g/wCnuT+dalMAo+lFFADdq7t20bh3xSqMHIGOc5FLigUAKMcnHJoIB4ZQfTIpeMUn1oAbsUH7ox9KcFA5CgfQUd6d26UAFFJ2owaAFpCRRTJX8uGSQKW2KW2jvigClfH/AImulH/po/8A6DWiDzWM10l8+g3iqUE0jkKe3FbHc5pAOpM+1JRTAOtANZk2o30Ryml7ovM2BjMAW+gxSjWN0El2tuTZxyeW77vmB6E49BQBpZozSdSMHIPQ+tZlxq7RNcSRW4ktbRgtxIWwRn0+lIDTzRkVQa7vZ7l0sLWGSFAv715MZyM9KjfU5t955FsjrZY84M+GJxn5f/r0wNPJ6Um71rLl1S4aGe4trZTDAgkdZSQzAjPFO+2X1zIosbeFozGrlpnwfm7UAaWaM1nTXl6ss0MVvH5sEXmybyQrey0261lYNAGpxxElo96xHr7/AIUAaY+8Ky9A406cf9PUn86mN3duEeGBNv2cTFnzg8Z2iqPhO4N3oRuCuwyXEjFfTnpQBuiigdKKQBRRS0wEpCM0tJ3oAKKKKACiikoAWjpRRQACiijnFAC0n40dutFACHNGaoX4vV82aO9W3gRRtHlhizfjVWK41CcXiGdElslGflGHOM8+goA2c0lQ6ddpqNhb3SDaJlzj0Pes+e6vZ5dQa0kEaWJwE2g+acZINAGtyUb/AHTVPRjnR7fHPB/mayo9bXVrSa4ivlsY1G2PcAdzYyc57dq0PDxzoNqdwOQeR0PJoA1cUUtJSAMUYpcUd6YCY56UVlv9qhvrbF3vmkciSAn5dnqPcUaldXNteqY2KxoAQvZwTzmkBqD7wrO0riW/H/TwauWjF4lcuGLHsentVPTOLjUB6T/0oA0xS0nOKKYC0UUUAJSUtHvSATHNFLRQAe1GKKKAEwKWjvR2oABS0CigBKOlHSgc0AFHOcUtVruGS4tmiik2O2Pm9u9AFkdM8H6UDmsyzgWHWZ/su4WgiAdckr5nqKu3Nv8AaYlQsVAYMcfxD0oAmwT3GKytd4SwP/T2v9ahtLOC5kvkdmWzjlDi3JwV45z6A1VntoUtLWe3QrHLeqVGScCgDof4jS/ypP4jSigA68Ypcd6O9LQA+L7+O1ZUuk2ssrSFpVLHkBuK1ov9YKr9z9aAJ80ZpM0d6AuOpM4DH2NITxTZOIpD2CE/pQBjWcEs3hiKKBZfMaRiGjk2FfmPP/1qraJp9wFaS98xkZ3PmRy7Qpz/ABD+ta2i5/sa2b1BP61auLeK6iMUy7kJyV9aAOeSeH+w4Ekedri5doxNuYlFDf4Vo2ZsBfR2gglMkaboriQth/Xr3q3Jp8bcwSy2p/6YnA/Kmpp7pIkjaheSbTnaz8H8qAMK/VG1mM2t9JvkMjSbV+6QvQ+1Rpez+TGTHFLG0ce5XjyMnOTXSXFklxMkudjKrDgeoxVaLSFjgkjE5DMioGCD5QKAKnlhvC9vGiKGmdQF7E7qqzQyLqcggxHILwY7jhK3hYRCO3Tc22AYUDjJ9ahXSIkdXaeWRxKZSxPJOMUAQaIxkN3cRY+ys3yrtwS3eq2qvcpZTItoIo5WAP8AE0hJ6ZrXt7CG2uHlgLxh/vRg/KT649acbbdMJZpS7L9wfwr749aYGTbNeWdwmn2Co0YTeY7gYKfiOtQ67BePIrxiRVcorAvlC2eMelbNtZNb3EtxJO08kgwGYYwPSrR6cikBiyTx2unGO8knjwf3wYb3I9A3pWbIY4WS9mgAsYzuS0jOJE9CfX866W7tlvLWS3ZiocY3AciobjT5Lm18iS9cx4AwEHamA5Jk1GyZ1F3agDPzDY1YzTK2k20cl3KtzMWVZt54APU+9b9xbJdQiKUts44BxmoH05Vx9mnktsfwrhl/I0AVbJ7OS++zqJ/tMKBklkYkSr3NZ2pgu2oyBNymWJSfxrbjsrhZVkl1GWUL0UIFFQPpKOmPPkUGXzHXjDmkBiHzfJMPy7pLhjbZXPzA85roL3eI41+ym6dQCQOFB+lQjRrdomSSSVsuXQ5wYyTnirjxyiFY0mOcYMhGWNAHNE3El9e6huYT24GCI8xnA+6R/Wt2xnu7qzE11bxxl1yqo2cg+vpST6ez2otoJ2hiY/vABkv681dC7I1VAAFGFoA5aNI7dp5ZLXpL9mjRW4Ut35qxpmnv/aawuTENPUD5D/rCf6VrfYFlmEt0wfByI1GFz6+5p1tZG1u5ZY53aOUco/JB+tAFz60meaKKBiZ5ooopiEooopAFFJS0AFJRRQAZ9qT8aWkoAO9FFFAGZ4i/5F6+/wBwfzFWvLeW3gCyvFhF5X6VU8Rf8i7ff7g/mKtMsr2sKRyeXmMbmA56dqAMSc3I8SRTxXDNEhFszEA5yMnFbUEPk3EmbuSV3GdjkcD1xUc2mxvaRwwSGBo3EiyAbju9/Wi3sZI7xrue7aeUps+4FAH0FAF2iiigApKKKACkpaKADmiiigBKKWimAlLRRQAhpKWigBKytW/5CGje9yf/AEGtWsvVv+P3Rz6XJ/lQBq9zS0nc0tACgZIHXNY1s6aibjUrj5baKQqIz3C+v41sjrkVSOmw/cBYW5YuYR0Zj3NIDP0KMbWtruIGVXNzDuH8Lf4Vuiq9zZRXTQyMXjlhOY5Izggen0qz2oAKB98fWk7UD74FAGZovFvdj/p7etOszRSPKvcf8/b1qUwE5opaSgAooooAWlzSUUAANL2popaQC5opKKYC0yb/AFEvpsb+VOpGVWXawDD0NAHPWZH2Dw0Ac4lcfoa6Puayr9I49Q0dY41RftDcKMD7tag6n60ALzmkJo/GigDOldpvENtAc+XFEZfYt0FZeo2m3Sb+ys7rInmA+z7fmRieee4rpMANuwN2MZpAib9+xd/9/HP50AMt5IiBFG4ZoAEfHY4rC2eTpeuae5HnySMYw38YbpiuhVVVmYKoLdSB1pGVWIYqpYdCRzQBz1xDbDSriPEkN/BGiq2/BLgcFajntBfRXFxcTG11CONVyrFfNAGfmH8QJrpGVWIJQFh0JHSgqrEFlDEdCR0oAyJ9StrqJLa5nW3Cxq06kYLcfdFR3EmnXsN2ZIZYG8geUXOMgdCo9a2yFY5aNGb1KgmgqrY3Kpx0yOlAGEt6x061s9RnMUhhDXDnqR6fU0agDcaRc3kO0W5tikMbDBX3rfPPOOaaRnqAfrQBlRXEMtvBYXYdM2qusgbAbjoPeqngzI0Bwc8XUoGfTNb+0EgFQQD0xWZoOPsVwB/z9SfzoA1qWk7UUgF7UUUUwCkoPWigAooo70AFFFFABzRRRQAUtJS0AFFH4UUAUtRikn+yoqkp5wMmB2FQX6J9rnZLGUzSxbBKhO189mxWrRg0AZ+mQGxgh0/yXAgjH7zHyk+gqEwz2lxqAjhaRbob42UcBsYINa2DQQaAOd07Sf7J068014PNSdSyvjIyRyD+NW/DCNH4bskcYZFKkfia1v4W/wB01Q0X/kExZ/vN/OgDRoopKAFo6mkooAy7iK6vI4Y5IQlxFKCJV6BR6Grt3F9oQQ4G1uC3pU/tS0AZ2lWkto0gddqnAxnOSO9Jp3F5qP8A12H8q0x94Vmaec3+pD0lH8qQGnRSUtMBaT8KWigBO1HWg0UgFo70UUAGKaadRQAg6UUYooAUUlL3pPagAoooxQAtQ3CzSW7pAyrKRwW6VLRQBnrFqaRqqPaxhB90ZO4+pqxcxTyQr5MojlVg3s3qKnooAomxkmkvZ3ZY5biLywF6D3NVtQiMGmafCxGY5kBx0JrY5rN1sf6LbnH/AC8JQBoHqaKX+I0nagBegoHrSdqd3oAki/1gqAg5P1qaL/WCoj94/WgCSij8KKACork7bOc+kbfyqWq98caddEf88m/lQBHpAxo1oP8ApmDV7Heq2nrt0u0X/pkv8qs0AAo7UDjiigA/CjFO7UUAGKSndBSdaADpSUGigApaSigAxRS0lAC0lFFABjikK8UUUAJikxTvrSGgBKKOaKACijtRmgBKKXtTaAClpKBQAUUUlABRRRQAUUdqSgBaT8KKKACk/CloPtQBl+If+Rcvv9wfzFaEX+oh/wBxf5VQ8Qf8i9ef7o/mK0Iv9RF/uD+VADsUgFOoxQAlJTsd6KAG0EUtGKAG0UtHegBO1FLRQAlFLjmjFMBKKWigBvWil7UUgErL1b/j70j/AK+T/KtSszVv+PnSf+vr+lMDTHU/WlxSH7x+tLQAtGKBRQAuKMUUtACdaB/rFo7UD760AZeirtjvR/09vWrWXo//AC/4/wCft61KAG0UtJQAtFJ2ooAKXPFFJQAUtJRQAtFJS0AHeg0daKAMvVD/AMTDRj/08n/0GtP+I1l6qcX+j+9yR+lavegApaTvRQAY5o4oooAKKO1HagBKXFJ3paAEopaSgAoxS0dqAGj7wrK0EYtLkH/n6k/nWt/EKydDJ+zXY9Lt6ANcUlFHNABS0UUAFFFLQA2lFHajFABRS0UAJS0dqBQAUUUUAFFLS0AJiiiigBaPrRRQAhHysPY1n6N/yC4x6M2fzrR7N9DWdon/ACCk9d7fzoA0KMc0oooATFJSmjFABSiiigBP4hWdp/8AyENSH/TVf5Vo/wAQ+tZ2n/8AIQ1L/rov8qANGlpMccU6gBBS0lFABS0lLSAKKKKAFzR70nSloADikxS0UAJSU6koASijvS/hQAnHSiiigAxSU7ikoAPeszXP+PGH2uE/nWmazNd/5B8f/XdP50AaX8RopT940CgBo6UvWloAoAfF/rBURwCfrUsf3xUTfeNAElFFHegBT61T1Ntuk3bdP3Zq2aoa023RLo+q4/WgC3aDbZW4PaNf5VNUcS7beFfRAP0qSgApaSigBaXvTc0e9AC9qKTtRQAtFJRQAtHFJRQAtIaKKAEzRS0UAIKKKTvQAvNB6c0lFABR0ozRQAUlLmigBKO1FJigYUUUuKBCUUtFACfhSGnUUDGUU7FIKBBRRS4oATFJTqTtQBma/wD8gC7+g/mK0I/9TGP9gfyqjr3/ACALr6D+Yq/EP3Uf+4P5UAO7UmKWigBKKXrRQAlFLRQAlJS0UAJRilooASijFFACYopaSgA60UUUwENZer4+06Sf+nr+hrVPSsrV/wDj50n/AK+v6UgNT+I0tJ/EaU0wCiiigBaOaKKAClH3x9aMUL98fWgDK0U86iPS7atWsnRfv6n/ANfbVrUgEopaSmAlLSUd6AFopKKADPNHaiigAzxQKWigA+lBopKAMvVf+P8A0j/r5P8AKtUdT9ay9VGb7ST6XP8AStTuaAFxSUv4UcUAJRSmk4oASlpaTFABRRS4oASlxRR2oASj8KXFFADQPmFZWh/6i8/6+nrWH3h9aytE/wBXff8AX09AGrjiijFLgUAAoooxQAUUUUAGaKKO9ABRQKMUgClpKXtTAKKKKACiiloASlpKWkAUUUooAT1+hrO0Mf8AEq+kr/zrR/wrO0X/AJB7D0lf+dAGkKKBS0wExSfhTqKAGiiiigBO4rOsONT1P/rov8q0sfMKzbH/AJCepj/pov8AKgDSFFFFIBe1J3ooFABSiigUAFJS0dKAFopO9FAC0e9JS0AJRSjp0pKAE+tFGaKAFopO1FAC/Wkz60fWigA/OsvXv+QXn0lQ/rWoTxWXr2f7FlI7Op/8eFAGoetGOc+tHXB9hSigBMUAUvBoGRQA+MfMKif75+tTR/fFRP8AfP1oAXilpo6UtABms3XhnRZkzjcyj9a0TWbrf/INAPeVB+tAGoBhV9gBS/jSE9vajtQAtHtSUtABRSUUAOzRTaKAFopuaXNAC0uabmigBaDSUdsUALRmk7UH60ALSUmTil7UAGaKTPFFABS9qSigApaSigApaMUUDCjFFL9aAExRS4pQKAG4oxxTuR2pMUAJikxTsc0YoAbijFOxSUAJikxTqXtQBla+P+JDdfQfzrQj/wBXGP8AZH8qoeIM/wBg3P4fzFaEf+qj/wB0fyoEOpKd3pKAExR2paMUAJRRRQAlFLSUAJRS0YoATtRRRQAlFFAoAKO9LSUAJWVrH/HzpH/X1/StU9KytYH+laR7XX9DQBqjqfrS0nc/WimAUUtFABS0UdqAAdKF++KKQffH1pAZWjf63U/a7atasnRv9dqn/X2f5VrdqAEopaT8aYBSU6koASijFFABRQKWgAooooAKOtLRQBl6p/x+6T/18/0rUHU1l6rxe6T/ANfP9K1B1NIBaSlxRQAd6OKKWmA2gU6jFIBtKKKWgBKMUtFACUmKdRQA0ffFZWijCX3/AF9NWuPvj61k6L/zEBj/AJe2pgan4UUtH0oASilxxRQAmKKWigBKKKKADGaKKKACiiloAKKKKACiiigApaKSkAuaKKKAGI5aVkx93vVLRv8Aj0mx2uH/AJ1fQfPWdov/AB7XH/Xy/wDOgDU96O1IKWmAUUlFIApaT3ooATuKzrL/AJC2p/76fyrR7is+0P8AxONS/wB5T+lAGgKMcUvakoAKKO9FAB35paSigBaKKKAFpvel/CigBcUUlL3oAXtTTTqYetMBKPaiigBe9GTSUv1pAHWiiigA7Vn60M6NP9V/mK0O1UNZ/wCQNcfh/OgC8nMaH/ZFOpkX+pj/ANwfyp9AC0CiigB6feFQv98/Wpk++KicnefrQAClpopaADtWbrXNrap/euUH61pdRxWdq/P9nr63Kn8qANI/epab3JpRQAvejNJ70ds0ALRRmigA6ikpaKAG0tHaigBaKOope1ACUUUUAFJR2o/GgAooooASjrS0UAFLR2paAEopaKAEApaWigYYopaWgBvalpcUUAJSU6igBO1FLiigBtGO9O7UnagBO9B6UtJQBl+IcjQpv95R+orRUfIv+6P5VneIv+QFKPWRP51pD7q/7ooELSU6kxQAmKKKKBiUlLSUAHekxS0lAgopaKAEopaSgBKKKKACig0UwENZOrgfadJPpdf0rWNZWsf8fGk/9fX9KQGp/EfrS0n8Rx60o96YBRRS0gDtSUtFAB0pB98UtAHzj60AZOjf63VP+vs/yrWrK0f/AF+qf9fZ/lWrQAUUtJ2pgJRS0UAJSYp2KMUAJR3opaADFGKXFGKQCUtGKWgDI1bP23SP+vr+lao6n61mat/x+aT/ANfX9K1f4jQAd6O1LSUAFAFFLQAneilooATtR2paTrQAtJil4pKACilooAQfeFZukkebqQ9Lk/yrSH3hWXpB/f6mPS6P8qANQUUtJTAKSl7UUAJ+FGKXmkoAKO9HaigApO9LRQAlFLRQAUtJRQAvFJS0lAB2ooopAFFJ3pwFAAv3xWbowxbXH/Xy/wDOtJeHFZujcW9z73L/AM6ANOgUlLQAHrRRS+9ABSUtLQA3vWdaf8hnUj7r/KtE9az7X/kL6gfdP5UAX6KXtRQAlFFHNABR70c0UALSUUUAL+OKX6UlFAC0oFIMUooAKYTzT6YeTTAKBmiigAooFFIBOaXv0o6UZoAO9UdY/wCQNc/Qfzq9VHWv+QJdf7o/nQBch/1ER/2B/KpM81Hb/wDHrD/1zX+VSUAFL04oooAen3hUL/fP1qZPvConxvbPrQA33paT6UtAB2rP1HDXuloe8xP5CtA1m3oJ1vS/9nef0oA0+5ooFFABRRRQAtJ3oFGOaAFooo7UAJRR7UvagAFLSUtABSUuKWgBuKKdiigBtFLRQAlGKUDiloAT8KWiloGJiloooEJSgCl7UYoAKKWloGJS0UUAJRS0UCEopaKAE70dqKKAEoPSlpDQBk+Iv+QKw9ZUH61qDoPoKy/EX/IGH/XeP/0KtU9fwoAbRS0goASil7UlABSUppOaAEpKX3ooAKKKKAE7UUUUwCkpaKAE70Yo7UtACVlaxzc6QP8Ap6/pWrWVrH/H1pGP+fr+lAGmOppaU/eI96T+dABS0UUAFHajFLQAfSgffX60dqUD51pAZGjkG41Qel2f5VrYrK0fBn1Q/wDT2f5VrUAJRS0UAJikp1JTASlopaQDe9LRS0AFFLRQAlFFL2oAydXH+l6R/wBfX9K1j94/WsrWP+PnSf8Ar7H8q1T1P1oAO1JS0lABRS0UAFFFJQAUUUUALRSUtACUtJS0AIPvD61maT/x9aqP+nn+laf8QrL0n/j+1celyP5UAatJS0lAC0lFFABRRRQAUUUd6ACiiigApKWigAopKXtTAKSlopAJRS0UAFFH0o7UAC8MKztH/wBTcj/p4f8AnWiOorN0fiK6HpctQBp80UUUAHWloo70AFLSUtACd6zrXjWtQ+i/yrS71m25/wCJ7fj/AGUoA0aKXtSUAGKPrRQaAEx6UmDTqWgBnNHenYpKACiiloAKB7UlLQAvvUZ9akppHFACUdKTpS0ALSUetFABmikpaACqGs86Jd/7lX/rVHV/+QNecf8ALM0AWrbP2OD/AK5r/Kpqr2Z/0C2PcxL/ACqx70AKPpS/Wm04daAHJ94VDL/rG+tTL94fWoZSBK3PegBBmlo/pRjvQAGs2658QWC46ROa0jWc43eJrYZ+7bMf1oA0RS0DpS0AJiloxS4oASilooASilooASlpKKAF4pe9JSigAooNLQAUlLQaAE7UUUooAO1FLRigYlGKWigBKKWgUAApaBS0CCiiloASilooAKSlooATtRS4ooGJRRRQISkIp1IaBmR4h/5BKD1uIx+tax64rK8Rf8guH/r5j/nWq3WgQ2ilpKAEooooASkzS0lAB2pKKPrQAUUUUAJRS0UAJR2paSgAxRS0lACVl6xj7VpH/X1/StU1l6uP9K0n2uv6UAaZ+8aKd/EaQimAlFLilxQAlLRQOKACgffH1paT+NfrSAydH/4+dW9rs/yrWrJ0b/j61b/r6P8AKtfrQAlAoooAKKOlFAB+NFFFABS9qSloAKKKWgBKSl4oNAGTrH+v0o+l2P5Vqn7x+tZer/e00+l2tah6n60ALxSUUUwCiiigAooopALSUHpR2oAKKKKAClpKKAD+IVlaV/yEdZGOlwv/AKDWp/EKzNM41TWPedf/AEGgDUooo7UwCiiigAooopAFFGKKACiiigAo5oooAKKKKACiiimAUUUUgCilooAQdRWdpPC3n/Xw1aCnMgFZ+lcC8/6+GoA0aWkxS96AClpKWgAFFFFAAeDWbbn/AIn98PWNDWiazYB/xUF9/wBckoA0xRQOlFABRRS0AFFHekoAKQ9aWkoAUUUlFAC0UcUZoAKDRSUAJSUtJ3oAKKKSgBaWk70poATNU9U50i8H/TI1bqrqX/IKvP8Ark38qAJLHH9n2vP/ACyX+VWe9VNPOdNtf+uS/wAqs0AP4oHWm/SnDrQBIvUVBL/rW+tTL1qCYfvTQA/tijoKWl9qAGVnqM+J2b+7a4/WtHFZ8Iz4kuj/AHbdRQBojpS4oHSl70AFFH0ooAKKWjtQAlFHb3ooATnFApaMUAFFHtSigAoopaACkpfwpKBhR2opcetAAKWkpRQAdqPrS0UAJRRS4oEFFFLQAUUtJQAUtFFABRRiloASk70tFAxMUUtJQISkPSlpDQBkeI/+QZD73Uf861m+9WT4h/5B9t/19x/zrWP3jQAlJS0lABSUtJigBKKWkoASkxTqSgBKKWigBKKWigBKKKXFACYope1FACVlav8A8fWk/wDX1/StWsrVsfbNIH/T0cflQBq9zS8Ug6mloASiiloASlpKX60AFIPvilpP4h9aAMnRv+PvVx/09/0rX+lZGj/8fer/APX1/StftQAlGaKKACijtRQAfjRRSUALRSUtAC0UmaKAClzxSUdqAMzWfuWDel2laZ+8frWZrP8AqrE/9PaVp9z9aAEpKU9aT60wCjmiigBaKKKAFoo7UlIBaKSloAKKM0UAAPzCsvTf+QrrH/XZf/Qa0v4qzdO/5Cmr/wDXZf8A0GgDUopKWmAUUUUAFFFFIA7UUUUAFJS0lACiiiimAUUUUAFFFFIAooooAWkopaAEVRvB71naX/rL4elwa0h94VnaZ/x8agP+m/8ASgDRoFL2ooAKSjtS9qACgUfSj+dAAetZsQ/4qC8H/TJa0j1FZsf/ACMd17wKf1oA0RS0CigAxRRRQAUfWikFAB0NITS0me1ABnigUUUALRTelHFADqKSigAooo5oAKKKKAEopaaetAB2NVtQGdLuh/0yb+VWarX3/INuh/0yb+VACadzplqf+mQq2Kp6af8AiV2v/XMVbFADhSjrTaXOKAJFPNQzf601KtRTEeaaAJqMetOooAb3xWZaHPiHUj/djjA/KtTHNZ1gv/E61Vv9wfpQBoDpS80uKXFADaKWigA7UlLijFAxKKWjFAhtFOxRigBtLSkccUAcUAAo70tFAxKKdgU3FABRS8UYoEFGKXFFABzR2pcUUAJS0uKPagBKXFGKWgBKKXFFAxBS0UuKAExS0UUAJxRS0UAN7UUtJQISmmnGkNAGTr//AB5Wv/X3H/OtQ/eNZevc2dqP+nqP+danc0AFJS0UDEpKdScUAJRS0n0oAbRS0lAgpKWigBO9GKKKACiiigAooooADWRq/wDx+6P/ANfJ/lWselZerD/S9JPcXX9KANQdT9aWk7mlNACUcUUUAFLSUUALSD7wpaQffFAGTpP/AB/asP8Ap6/pWt2rI0j/AI/9Y/6+v6Vr9qACig0hoAWk7UUUAFFHNJQAoopKKAHUlFFAC0meKQ0dqAM3Wubez/6+k/nWofvH61l62cWdsf8Ap6j/AJ1pn7xx60ALTSM0tHamA2loxSUAFLRRQAUtJRSAXvS0gooAWikopgJ/EKy9O/5C2sf9dV/lWp3FZdgMazq3u6H9KANWikFKKAClpKXvQAUUUUgCiiigAooopgFFLmkoAKKKWgBKKKKQBRRS0AJRS0UAJ/EKz9Nx9s1LH/PYfyrR/iFZum4+3amPSYfyoA06Q9aWjpQAlLSUdKAF6UA9qKPrQAHrWav/ACMc3vbj+daJrNB/4qaYf9Ow/nQBpClpB0ooAKWkooAKKKSgAoooPNABR+NFJ9KACige9FAAKKKKAFpKWk60ALRRRQAU004000AFV73/AJB9z/1yb+VWKgu+bG4H/TNv5UAQ6X/yCbT/AK5iroqlpXOk2v8A1zFXO9ADs8UUlHvQBICKiuADKT7U8U2b/WfhQBZ7UUtL2oAbj5hWbp+Tqmqt2Mir+laY++KzNH+a41R/W6K4+goA08cUdqWigBMUYpe1FACY9aKWjtQAlFL1o7UAJiinUYoAbiinUUANx2paWjvQAgFIRTqMUANpRRiigApaKBQAUUtFABRRS0AFFFFABRRS0DEopaKADFFFFABSUtHagBDSUtIaBCU006mmgDK13/j1tPe6T+dan8R+tZWvf8e9l/19pWqfvn60AHakpaTvQMKKKKAEpKWkoASjiijvQIKSlpKACiiigAopKO9AC0lFJQAGsvVyPtWk+11/StQ81k6t/wAfWk/9fX9KANbufrRSdzS0AFFHaigAooo7UAFIPvr9aKOjCgDJ0nH2/WP+vr+la1ZOlD/T9X/6+v6VrUAFBNJRTAKKKO9ABRRmk4oAKWkooAWikpaACikopAZmvHGmwH0uo/51qn7zH3rJ1/8A5BkRP/PzH/OtY/eNABRSUUAFJTqSmAlFLxRSAKKKKAFo7UlL2oAKKKKYCelZtj/yG9VH+5/KtHuKzbP/AJD2qfSP+VAGnRQKKAFFFJS5oAUUUlLQAUc0UUAFFFFIBaKKKACkpaKAEooo9qAFoxRRQAlO70UUAJ/EKzdPGNT1Qf8ATVf5Vp96zbH/AJCmqf8AXRf5UAaXaigdKWgBKKKKAEpKWkoAPes0f8jRJ/16j+daNZ3TxNIf+nUfzoA0+oopB0ooAWikooABRRzRzQAUUnNGaACjmigUAGKKKKYCClFJS0AHNHajqaKQC0dqTFFABRRRQAlQ3P8Ax53H/XNv5VPUNyM2kw9Y2/lQBV0jnR7Q/wDTOr3FUdG/5Adn/uf1q9jmgBaO9J2pRQA4U2bmT8KcOtNm+/8AhQBbooooAVfvisrROl+fW7f+laq/frM0P/j1uW/vXLmgDT7UdqXpxRQAlFFFABRRRQAUdqXtSdqAClpKWgBKBS0dqAEGKWkpe1ABRRRQAlFLSUAHWgUUUALRRRQAUpptLzQAtFJS5oAKKM0UALRSUtABSUUUAFLSUUAFJRSGgApppaQ0AZGvcRaeMZzdrWufvH61la197Tf+voVqH7x+tABSUtFACUUUUDEpKWkoAQ0UUUAFFFJQIKQ0UUAFFFJQAUUlLQAVkav/AMfmj/8AX0f5VrGsnWP+PzR/+vk/yoA1u5opO5paACikpaAD2opKKAFpO4+tFJ/EPrQBmaX/AMf2rf8AXz/StQVlaWf9P1b2uf6Vq0wCiiigApKWikAlFFFABS9qSimAUUUUAFFFLSAyvEBxpUZ/6eY/51q4+Y1k+IOdKT/r4j/9CrXP3jQAlLSUDrQAtJS0UwE7UUtFIBKKWimAUUUUgCil4pKAE71m2g/4qDUx/sRmtLvWba/8jJqI/wCmMZoA0aWjikpgLRSUUAOozSdqWgBaKTNFAC0UUUAFFFFAC0lFGKQBRRR3oAWikooAXNLmm0fjQAo6is+y/wCQrqf++n8qt5k+0jn93iqdl/yFdT/31/lQBpUd6KKACijvS0AN7UnelpO9AAfpWZ/zMz5/59R/OtM1m/8AMyMfW2H86ANEHjilpB0ooAWkozRTASlGaSjoaAFo4xSZ4opALRSUtACUtJRTAKUUlAoAWjtR0opAKKOKSigApaKKADtUU/8Ax7TD/YP8ql4FMl5ik/3DQBR0X/kC2v8Aun+dX6z9COdCtT7H+ZrR6UAJSUvFAoAcOtJL9/8AClHUUkxIk/CgC3RSdqWgAX71Zeg/8gxm/vTuf1rTzjd9DWb4f/5AsJ9Xc/8AjxoA1KKMUdqAEo7UtJQAUUtJQAUUUUAGaKKBQAUUUUALSUUUAFFFLQAUUUlABiilFFACUUUtACd6WjHFJQAtLSUtABRRRQAUUUUAFFFFABSUUUAFNpaSgBKSloPSgDJ1n7+mj1uh/KtX+I/WsrWP+PrSQe9z/StX+I/WgBKKKKACkzR3ooGFNNKaM0AJ2pM0vakoAWkopKACkpc0lABSUUnagQUuaSigArK1fi90f3uT/KtQ1k6v/wAf2j/9fJ/9BoA1+9GaQHk0tABRSUtABRRRQAUn8QpaT+IUAZel/wDH/q3vcj+ValZel/8AH/q3tcj+VavWgBKKWkoAKKKWgBKKWimAlFHejvQAlFLxRQAdqOaKKAMrxB/yCV/6+I//AEKtc/eNZWvn/iUr/wBd4/51rfxGkAlFFFABRRS8UwEopaKQCUUUtACUUvtRQAlFLSUwEPasy348TX4/6YRmtLNZkP8AyNN9/wBeyfzoA0x70Ugpc0AFHtRRQAuT0opKKAFpabRQA6ikzRQA7tRmm9KM80AOopAaWkAUUmaM0ALRSUueKACikzjvS5oAT+IVQsv+QvqQ/wBpf5VfHUVn2Z/4nGpD3T+VAGlS9qQGigBRRSdqWgBDSdBSmkFAAelZx/5GPH/Tt/WtE4rPPHiT6239aALwpaSg0wF70lGaM0AFJS02gBaKKKQC0UUZoAXtSUUtACUUtJ3oAO1HIFJnmlHvQAU4U2igBaUUlFAC0jfdb6GlzTfX6GgDO0LjRbf6t/M1o1naFzo8WR0Zv51pdsUAIaB0pecUDpQAvNJMcP0zxSjNLNkOPnQcDqaALFFANFACNwj/AO6aoaDxo1v9W/mauzHEEp9EP8qp6IMaLa+6k/rQBpUlJ2ooAWkoooAKKSigApabRmgBaKTPNFAC0tNzxRQA6k74pKr3csyRMYtqKBlpGP3aAD7dD/aBs8HeBnd2z6fWrPesZhEbIwGSABvn87cc59av2guREBPKkowNrqOooAt54ozSUlADqM0maQ7iMKcN2JoASKUTFl2lWU4INMtrpLoSmMMBG5Q57kVTsJr2aS58yVCY5igwvUCo9HjnNrK3mhc3DlgB15oA2O1JRSUAO4optFADqKSloAWikzRQAUUhNJmgBc0ZptGaAF4pMUlGeKAAUHpSZoNAzJ1YE3ukqe9wT+lav8R+tZWqn/iZ6OP+m7f+g1q9zQAUUUlAgoopKBhSUuaTNABn2pOKCabmgQtFJR3oAKKM8UlABSUtJQAdqSjNGaAA1k6sQL7Rx63R/lWqaydW/wCQjo3/AF8n/wBBoA1u5paTuaKAFpabmjNADqKbkUUAO/CgcsKSgfeGaAMvSx/p+r/9fI/lWr2rK0v/AI/9Y/6+h/KtWgBKWikoAWiiigA4xRijtSigA7UmKWimA2ig0nNABS0lL2oAyvEPGkKf+niP/wBCrXx8xrJ8Q/8AIHH/AF3jP/j1ax+8aQC0lHSk60ALS02lzxQAd6WkyKKAClpKWgAopKO1ABSHpSmkNMBpHNZkX/I13o/6dU/nWmeorMj/AORrvB/06p/OgDTGKKSjNAC0tNzS5NAC0UmaM0ALRSUZoAd3optLQAvoKyNR1l9IuUa7iQ2bH5nTJdB6kela1UdSgupoJfIeLZ5RBWRM54oAqW+vrqF+sWmiOS2xzI+QT9K1p5hbxGQo74/hQZNY3h+2vY9MszJLA0Wz7qx4I/GtwHpQBTXU0+0QwyW08ZmOELDjNTT3SwSLEI3lkYZ2p1xULfv9XB6rbp/48akkinF5Hc24VmC7HVjgY9aAJYJ47mESxElc4II5U9wal7ZrK0hJFkv2dwwefKkdOnOK09wJKhlLL1UHkUgIri4WAouxpJHPyovU0Wt1HdozIGVkba6N1U1A5xrdtuOA0TBfrSWgxq98V+623P1oAle8AnMUUbSsv3tvQVXsyf7b1Hjsn8qrWxuksrq4ikEbQzMShH38HvVixkEmrX0gGN6xtj04oA1KO1IDxS5oAWlxTc0A0AOpMUZpaAGkCs0n/ioh/wBe39a0m6VmN/yMMZ9bc/zoA0RQQKQGjNAC0YpM80uaYBikx70uaTjNIApaQUUAKKKKKADvRRkelGaAA0yZWeJgjsjY4Zeop9IeUKnjPpQBzn9r6tYSfY57Ga7ebJtp1AH4MPUVq6Ut2LQG9kZpj94MuMVmahYouoWG7U7hcSHrJyOK27eE28ewzSTZOd0hyaAFmuhC4TynkYjOFHanwzR3EQkjJ29CD1B9KhuLsQuIoyPPccZ7D1p1rGsUIVXDkklmHc0AWKrSXRiLHyJGRRlmA6CpI7iGZnWKQO0Zw4HY1FdqtzbyRLcmJl67T19jQBI9wFiSWKNplfptplveefPJCYHidBkhu9OsWLWULFduFxj6VHYkyGeZhy7kAn0FAEOhf8goe0rj9a0u9ZegH/iVtnqJnH61qUAAFGKWloAaBUF3p9tPNvkQliBk5qyBillzuGPSgCWikFLQBDdHFncEdom/lUOjA/2LZcdYgakvW2afdN1xE38qzNK026GlWpOpzqpjBCr0HtQBujPpRtb0rO/s24P/ADFLn86P7Mn/AOgrdf8AfVAGjg+howT2rNOmTH/mKXf/AH1Tf7JlPXVLz/vqgDUwfQ0mD6Vmf2S3fUrw/wDA6T+xgeTqF5/33QBqbW9KNrelZY0WPr9tuz9ZKP7Fg6m5uf8Av4aANTa3pS7T6Vl/2Lb/APPe5P8A20NH9iWveW4/7+GgDU2n0o2H0rL/ALDs/wC/P/38NL/YdmerTn/toaANTYfSq19byXGnzwoAWdMDJqp/YVj6zf8Afw0f2DYek3/fw0APeyn+wi38mAfu9uc1ct4vKtYYiVyiBTzVD+wbD+7L/wB/DS/2FYf885P+/hoA0OP76/nS/L/fT/voVnDQtOB/1T/99ml/sTT/APni3/fZoA0Mrj76f99CkDoDnen/AH0KoDRNOH/LBuf9s0f2Hp3/ADwP/fZoAW0tUtri5le5jYSSl1UOPlzUlgi28Lo80XMhYfOOhqL+xdOH/Lt/48aP7E00nd9mH5mgC/5sP/PeL/vsUebD/wA94v8AvsVUGk6eOPsy/nS/2TYD/l2WgC150H/PeL/vsUnn2463MP8A32Krf2Vp/wDz6pR/ZWn/APPqn5UAWftNt/z8w/8AfYpPtVsP+XqD/v4Kr/2VYf8APrH+VA0qwx/x6RfiKALBvLUf8vcH/fYpPt1oP+XuD/vsVB/Zdh/z5xf980f2ZYD/AJc4v++aAJWv7L/n8h/77FNOoWX/AD9w/wDfVN/s6xAx9jh/75o/s6x7WkP/AHyKAD+0rH/n8h/76o/tKw/5/If++qUWNoP+XWL/AL5FH2O0/wCfaL/vkUANOp2A63kX503+1dP/AOfyKpfslr/z7Rf98ik+y2w6W8f/AHyKAIv7V07/AJ/I/wBaT+19OH/L5H+tTfZrbtbx/wDfIpTbwdoI/wDvkUDMLU9W05tU0llu0ZUmYtjPHFa39r6Zk/6Yn5H/AArP1K2tzq+kHyYx+9fOF68VreVD/wA8Y/8AvkUAQHWdMx/x+J/3yf8ACm/2zpv/AD9r/wB8n/Crfkx44hT/AL5oMaDrEn/fNAimdb0wdbtf++T/AIU3+3dL/wCfn/xw1eCR/wDPNP8AvkUFU/55p/3yKBlA65pnUTn/AL4NJ/bumk4Er/8Afs1f2r/cX8qPl/ur+VAGf/bmn/35P+/ZpP7bsD0Mx/7ZmtHj+6v5UnH90flQIz/7asvSf/v0aP7as/7tx/36NX/wH5UZ9h+VAGf/AG1adPKuj/2yNL/bFt2huv8Av1V/PtRk0AZ39sW/a3u/+/VNOswf8+t5+EVaeSOtJuNAGb/bMH/Ppe/9+aT+2os/8eV7/wB+q09zetJuPrQBm/2zH/z5Xv8A36qje3jXV3p80VjdlbeYu+Y8cYxXQEt60bj60AZv9rr1+w3nX/nnR/a697C8/wC/daWT60bj60AZn9rDr/Z95/3xS/2vz/yD7z/vitHc3Yml3N60wM3+1j/0Drv/AL5oGrE/8w28/wC+a0tzepo3N60gM4aq3/QNu/8Avml/tV8j/iWXf5CtHe3qaNxPegDBs7i5trq+lfTbgrcS+YuMccd6vf2nL20y5/StDJ9aXJx1oAzv7Tm/6BdyPxFL/aMx/wCYZcfmKv7j70u4+tAFD+0J8caZcfmKP7Rn/wCgZcf99Cr24+ppcmgDP/tG4zj+y7j/AL6FO+33H/QMn/76FXtx9aMn1oAo/b7n/oFz/wDfYo+33P8A0C5v++xV/J9aTJpgUDf3X/QKm/77FIb66/6Bc3/fYrQ3GjJ7GgDO+33Q66XN/wB9ig391/0Cpv8AvsVoc+9Jk560AYupte39j5EemyK29XyzjHBzVz7fd99Klz3/AHgq/k0bqAKH9oXX/QKm/wC+xR9vu/8AoFS/9/BWhuPrSZPrQBR+3XX/AEC5f+/go+33f/QKl/7+Cr2T60ueKAKH2+7x/wAgqX/v4KPt93/0Cpf+/gq/upcmgCj9vu/+gVJ/38FJ9vu/+gVJ/wB/BV7JoyaAKP2+8H/MJk/7+Cj7fen/AJhUn/fwVeyc0ZOetAFE3t5/0CpP+/gpv229/wCgVJ/38FaG40mTQBn/AG68J/5BUn/fwVVzfpq0t+NOYrJEsezzBkYPWtrPvTeaAKH229/6Bb/9/BR9uvf+gU//AH8FX8n1pMmgCh9uvT/zCn/7+Cj7de/9Ap/+/gq/k0ZoAo/br3/oFP8A9/BR9tve2lP/AN/BV7NGaAKP269/6Bbj/toKPtt720t/+/gq/k+tFAFD7bff9Atv+/gpReX3fTG/7+Cr2TRk0AUftl9/0DT/AN/BUVxJfXMflvp7KPVJsGtPNL2oAyLNbuxi8uDTm2ejTZxVn7VqHBGnr/38q9+NGTigDOWa/WR3XTUBc/MfM602b7dcY32WB6LLjNadLQBnxy38SBE0+JVHT95UKRXUd9Jepp8YnkXa5804I+latGaAM6f7bdJsmsYcA5Uh+QfalgF9bptjs4cZycuck1o9aKQGVLBdSy+a1nEGP3gJDhvrRHFqMd3NciCA+aACm48YrUNAoAqebqI6WsP/AH0aXzdT/wCfe3/76NW880ZoAqeZqf8Azwt/++jRv1XtDbf99GrmaXtQBSDat/zytfzNLu1Yj7lqPxNXO9LQBnMdY5/49f1qA2+pvcpcl7dZEUrgDgg1rNUdAFNf7WzybbH0NOxqv962/I1bFFMCnjVv71t+VG3Ve0lufwq52ozQBTxqmfv235UBdU/56W//AHzVz8KKAKu3U/8Anrb/APfNG3VO0tv/AN81bzQOKQFTbqn/AD1t/wDvmjbqnea3/wC+at5paAKWzVO08A/4BS7NUxzPB/3xVvNLQBT2ap/z3g/74prR6tji4g/74q9migDJfTruZ985tHY/xGPmrKw6iigLcQAAYA2VdooAzntL6Vt0klszYwCY+aVINSjG1J4FA9ErQ70dqAKItr9CzLNbqznLER8mkNpes4Z5oCR32VfBooAqiLUu1zEB6bKPI1Lol1CP+2dXO9Azu60AZWgBhprhyC4ncNj1zWrWVofFrdD0unH61q0ALRRQKAHD1pZfvD6UlLKcFcf3aAFBp3amDinCgCvqPOmXX/XJv5U6w40yzUdBCv8AKotTONKu/wDrkalsuNPtf+uS/wAqALFFFFABRRRQAlFLRQAlFLRQAlFLQBk4oATPFKKz01Ld9slaMfZ4G2Iw6u3pU9jcvcQYmTy7heXjPXHY0AWaOtU7u9lt2jWO3DmRtqsWwM1HPqJtjIsgjJVMgq2Ru9KANGg8dajhk82COTKncuSVORmqt7dzxypBZxCWQfNLnoq/40AXqSkikSaISxMGU/pTGM4uUVY1aFhy2eQaAJaKri4b+1DaYG3yt+e/WpywVSzEBQMk0ALRVaC8EiGaRljjc/uwepHrUcd6r6pND5qmFIlb6E0AXaXNQpdQymQRNvZBkgDrVKG+uXnNvOYopQm8g9AD0H1oA080VntLdvPFFDcW5y2XwO1TJM0V8beQ5WQZiPv3FAFqiiigApMUtFACYpKWigBOlFFFABx6UmKKKAExRS5oOKBmPqX/ACGNIH/TV/5VS13xMthcrYWSh7lnCSTMP3cGfU+tS+IrhrS50+5UZMXmPj6LSaBp0L+GVFygka+BlmLdTu6flQBI2h3cmGuNaumcjOYjtX8Kzb7UdQ8NX1vC1w+pwSgs8RH72NR/F9KP7bl8ME6XfRvcMR/oDj/lpnop+la2jaZLal73UMSajc/6w9Qi/wB0UAX7a5hvbWO5tn3xSDKn+lS4Nc9o6my1fW9MiUmFCJo1H8O4cgVVtr2+ktbVN8iK8LqpVuWkzx+NAHVc0nWsK2vprnVrKGUEPDuSQ5+8do60+W7ktPEjSSBVX7P90nrz296ANrsaDXPQXTWG7Upneb7TJiaJcnyx2wK0ry9RVh8qaQNKu9Ao4I96BF7nkdTRz2Fcy09zHc3F4JmUyoqKM9DV17kv4dvVUzeZEpUySDBJ9qBmzg0EEHtn0rnG5vJI0c+UkKY5/wCWhFGjPv1HT33kyG3kEvPVgaAOiwSOlNyCSAQSvUA9KwC7yapfAyttiuFwu7AGRWdPNdpql6bZpPMMsJ5PbuKBHYdaRTvGVIZfUHNZmu3c9nos8kSfvioDEdEB4JqlCphv7SwtXeOOGH7Q53/fJ7UAdD2ppdVZVZlDN90E8mqtjqH2zT0u3hI3MQVXnoaxklvpNdmaRBMsSEmQIf3I7Ae9AHS49aTpySAPes7S5pyvlySNcxOcxXGOg9GqG6uYbnUI1ll8uztTvdznDv2FAGuCCOCDg4PtS4rGbVLex1Zo8vJDcr5jFFJ8s9Mn2NbKkFQVOVIyDQAuKO1LRQAYoopaAEo4paSgAoxRRQAUtFKKAEopaPagBtFLSUwFooooAMcUmKWk5oAMUY4oooAKO1LRQAmKWlo4pAJSU7tSdqACiiimAUUvak7UAJRilzSUAJiilpKAExmkp30pKAEopaOKAEowKKOlABS0mRRQAtGKKWgAoxRS0AFJS0UAJilpM0tADHdY03ucAUuQELHgAZqrcjzL20hP3Tlj+FOklke6aNB+5WNt598cUATxSJNEssZyjDINI8yRFRI4Ut0zWfaXP2PTrJpV/wBHYbS4/hOeM+1WdQiD2cjqu6RVIQjtmgCYTwnpKKRbmFoxIrgoW2596rIXEChiuQoydlTQrDcWBVAArg5wMc+tICzg5xS4qvYyGWyjZjlgME+uKs9qAE/GjgHbuAJ6AnrS1navZQ3lsBIUR84WRm27foaANAcZ3HA96cOnUGuQjN7qDtZ3uo2skds4Aw2Gk9MmuriRYkREUKoAwKBj2xnGRk9s1HjnFZEs9mrXgvpXS6RjsIzwOxFaMHmS2UYuMiRl+YqefrTETEYorM0yM295f2/mO6I6ldxzjIrToAWk/lRmqOoBrkixjYruUtIy9hQBe9qOM7dw3emeapaSWOj225yTtI3d+tVr+KytLc7vNWdj+7kGeG+tAGtjnmnUyPf5MfmEM+0biO9PzSAKKKKADFGPSijtmgAxxQRRR9aAExS0UZoAO1LSUvagBKdikpc8UAFIPvClFIv3xQBmaNwl8vpdPWp2rM0j71+P+nlq06AFFFJS0AKKe/VfpTBSyzQxlVkkCnb0NAAOlLTad2pgVNVONHvD/wBMzU9oCLK2HpEv8qr6ucaLd/7n9atwDbbwj0QfypAS0dqM0lAC0dKbRmgBc0uabniigBaM0lJmmA7tSEEgqDjIxmkpf4s0gMFYzBojhTyt2Qn1zVwwfaNcuy0jAxJHsKnpxzUkVgy7VlkDRrKZQoHc1PHDsu7i4z/rQBj0xQBk6skk+pWf2f5USX52PRmxwKeJE057iOS0VzNhgM8Lnj+daNxB5xhKnb5T7/qaY1isscgkcmWQglx2x0xQA+2tZYdPjtRIEYdWXtVS1IxIlr9pCiQq7jB3Gr9vCbfeTI0jO24k1DBY/Z9+yeUb3LkA96AINPt7dpJJoWnRkkKuGb7x9xTmVIda+aRhG0BOM989qtW1utsrqrM299xLdc0rW0T3UdwykyRghfSgCglqh8Qygs5AtgOTz1q5cw7NMnhhB5jOMmpFt1F491zvZdp+lTCgCC0WJ7G3YqpURgc9qz4gsd/c6lt/0dyIiMcbR3/Orv2JfmTzHETHJjFWgqhAgUbAMbccUAN3xInmrgoeQUGc1nMsX2ua6WRy0oAIMecAVdtrSK0DiLcFc52k5A+lTbRQBlxSv9vtljyFfdvBTBwKsXSmXUrJV6xszv7DGKlhsooLh5wXaRhj5jnA9qlSFUleTks3UmgB9FLikoAWkopKAFpDRSUAGaM0GkxQAtJRSUDFoNJRQBha/b/bLywtc48wSL+a03RtWtbXwzvvG8t7H9zIh6kjoMe9WtQGde0nB6Fz+lVNY8NRX92moWrCK8jYOVYZSQj+8KAK6aEddWS/1fck8o/0VAebcdj9av6RqjrJJp2rMI7y2XPmNwJUH8QqNtW1qI7ZtEErAfeikGD+dQy6Vea/dQz6vElvBD9yGM/M3sT6UAQ6bHJfnV9WMxtUun2RydMxqKhEaLpOnmOYqLeJ5CwP8R4H411TW8L232YxL5AG0JjjFMSzto4vKWBBH/dxxQBh2NoYNdtd8oeSRWkYDqMqOtLBapHreoyrO1xILQnexztbnAreWGJZzOI180jbvxzikWCGN5HSNVaT75A60AYMN2/9nabIk5M8rqJV29fXNauqxCaxuI42RJmTEeTjH0q2ERVChFAHQY6Ux7eKVgzxqxHrQBy08qTafbLEhE1xIEGW+6V6k1t6m6T6HdiJ1cCPadvqKu/ZrfGBCntxSrFGilERVU9QBQBzqiGW4jKOVQFZXZgcFguABS6MMazCGTYwjlJ9OT2roiF4+VcD2pCF3A7QD64oA52KzvFvLq5+wqRNMAVdv4R0anRWs76xqITZkLHgn1FdAaQBQWYKAx6kd6BGdqweewWwAzPcEBsdFA6moTDHBrk8skhWKO0AL46VrYAOcDOMZpMA5yAc8HNAGVowZfD0ZEvlDcx347Z61GrRW7v9llb5jlmLn5jW0FUJtCgL6AcUmxf7q/lQBjadb2kc6CKSSKdss8aMSh/OrF/Gt75djGv7oOHmYDgAc4rSAHUKB+FIBt+6MZ60AZVmyXOv3d1En7hYFiBK4571rDpSDHTA/CloAWikzRQA6lzxTciloAKO1JRQAUuaSkzTAdS0zNLmgB2aM0lFAC0mKM0ZoAKXPNJmjNAC5pKM0mfWgBaKTNGaAFopMmjNADxRTQaXNAC0lFFABRSZo7UALziikozQAdRRSZpCaAFzQfekzSE0ALS9qbRmgBaMUcGigAxSYpc0UANpc0tIRQAtFNpfrQA6ikooAWikoBoAWiko/CgCC5iZzHLH/rIjkD1HcUrlo7d2jjLsw5Heph1oNAFa0gC6dHbSruXbgg1P5Z42uVAGMCnge1Lj2oAp3CSRoXQPKf7oPSnRRPFYpCvDkcn0zVrketAFICOGNYYljThVFTU3Bz0p2DjpQAVDcJHJERNGJEHO0jNTYPpSMp9KAMKxhsW1C6BsiFlYMjNH7VvLwQOwpvPcU7BoAy/kg+0QXNs0rSsSrBc7gas2yPbWEavlmjXkd6t4NNwfSgDJtpiupXTmCYRzlSrFfQVpOWWN2RdzAfKvqaeckYNJj2pgV7KeW5s0luLcwSknMZNQ3NkrSS3KzTqzrgrGetXsE9qNp96AM/RopLfSY4XDB1J4anT3JmtZbd7Ry7Dbgjj65q/hj2o575pARWyNFbRRM2WRACalo2n0pcH0oAKKMH0NGD6UAFFGCe1GD6UAFFKFJ7Um0+lACdqKXB7CjaaAAdaKMHFGD6GgA7UtAB9DSYOeBQAtC/eH1pQCO1A+8OKAM3ScCXUB6XBNaQrN0wf6TqP/AF3/AKVpe1ABj0pwFJSjNAC7RT3RTt3IDx3FNFTDoOKAK/Wl7U3vTqYFHWiP7Fuz/sf1q9HnyYuP4B/Ks/W8HQ7v/c/rTF069KRj+1pgNo6AelIDXwfQ0bT6Vlf2Zd99XuaP7Muv+gvdfnQBrYPoaTB9Kyv7KuP+gtd/nSHR5iedWvP++qANbafQ0bW9Kx20V1ikb+1Lzcqkj56paTpcl3psNzcajdmSTOcPx1oA6XafQ0bT6Vkf2FERze3f/fygaDAOt3dn/toaANfYfSgRn0rK/sO2/wCe9z/38NJ/YFmeTJcH/toaANbYf8mjb7j86yv7Asu7T/8Afw0n/CPWHrOf+2hoA1cDuV/OjKZ/1if99CsseHtOH8Mp/wC2hoHh7TR/yzkP/bQ0Aae6P/nrH/30KN8PeaL/AL7FZ39g6Z/zwb/vs07+wtM6/Zv/AB40AX/Mh/57xf8AfYo86DvcRf8AfYqkNF00f8uw/M07+xdNH/Lqv50AW/tFsBk3MOP+ugpBdWuP+PqDH++Kqf2Npv8Az6JS/wBkab/z5x/lQBZN5Zjrdwf99ik+3WIH/H5B/wB9iof7H03H/HlH+VH9j6Z/z4xflQBL/aNh3vYP++qP7S0//n9h/wC+qjGl6cP+XKH/AL5p39nWHX7HF/3zQA46np3/AD+w/nTTq2mjrfRfnSiwsR0tIv8Avml+w2fa1h/75FADP7W03H/H7F+tNOs6Z/z+x/kamFpaD/l2i/75FH2a2/594v8AvkUAQjWdMx/x+x/kaQ61pY63ifkanFvbD/l3j/75FO8iHtBH/wB8igCodc0rP/H4v/fJph17Sgebsfgpq75EOf8AUR/98ijyoR/yxjz/ALooApf8JBpX/P1n6IaP7f0w9J2P/ADV7y4/+eKf980bYx/yzT/vmgDP/t/TM/62T/v2aDr2n9nlP0jNaAVc8Rr/AN80YGPuKPwoAzv7esP+m/8A36NH9vWHpP8A9+jWjwf4R+VG3/ZH5UAc7d6rBNq9hPFDcmOHd5jeUeM1of25Z5/1Vz/36NaXQdsH2o7dB+VAGZ/b1qOBb3Z/7ZGkOu23/Ptd/wDfo1qZ+n0pA3tQBmjXYCeLS8P/AGyo/tyPtY3h/wC2daZY5oBJ4oGZn9tL20+8/wC+KX+1yemm3X/fNaWWFO3MO9AGYdWk7aXdH8qT+1pj00q5/MVp5J70buTg5xwaAMs6nc440m4P/AhSf2nd/wDQIn/77FauT60mT6j86AMr+0b3to8v4uKadQv+2jy/jIK1sk8ggj1BpCT60CMk6hqX/QIb/v4KBfan/wBAgj/toK1KMmgDL+26kemlYPvIKT7Zqv8A0CV/7+VqZNGTQBm/a9U7aYv/AH8pPteq/wDQLT/v5Wnk0bjQBm/atW7abH/38pDdav20yL/v5WnmjJoAzPtOrf8AQOh/7+Uv2jVv+gdF/wB/K0s0ZNAGYbjV+2nwfjJSfaNY/wCgfB/38NafakNAGcLjWP8Anwt/++zS/aNX/wCfG3/77NaFJk0wKPn6x2sbc/8AAzR52s9rK3/77NaANLk0gM3zdZ72dt/32aTzda7Wdp/32a08mk9qYGb5mtZ4tLX/AL7NHmaz/wA+lr/32a0qOlAGb5mt/wDPraf99mlMmudfstoP+BmtHNFAGaJNaxzb2mf940b9b/54Wg/4Ea0c8UZoAzt+uf8APvZ/XcaXfrX/ADwtM/7xrRzilzQBmbtb7w2Y/wCBGgnW+0Vof+BGtLJooAzd2uDrDZ/99GkLa7/zys/zNadJmgDN367/AM8bP/vo0btc7xWn/fRrSzRnmgDEub7WLSe1jeG0b7RJ5a4J4NW9+uA48uz/ADNRat/x+6QfS6/pWtnk0AZu7Xf+edmPxNKP7cJxtsx75NaNC/fFAGJYX2s38DyiK1QJI0eOeSKuf8Tr0tR+dQ6Af9Amz/z9SfzrWFAGdjWietqPwNBGs44a1/KtCigDNxrX961/KjGsnq9qPwrSpOaAM7brI6yW3/fNIV1n+/bf981pZppoAz9usf8APS1/75o26z2e1H/Aav0ooAoAaznmS1/75pcazn79r+VXxxRQBQK6v/z0th/wGjZrH/PW2/75q/S9aAKGzV/+e1v/AN80bNYPSa2H/Aav0tIDN8vWO9xb/wDfFATVu81v/wB81o0negDP2av/AM97f/vil8vVz/y8Qf8AfFX6KAKPl6rj/j4g/wC+Kb5Wrf8AP1AP+AVoUUwKAi1bnN1D/wB8Uvlar3u4f++KvU6gDP8AI1Y/8vsQ/wC2dHkasOPtkX18utDNGaAM77Nq3/P/AB/9+6X7Pquf+Qgn/futDvRmgDPFrqnfUFP0Sl+zaj/z/j/vir9A4pAUfsuoH/mIY/4BR9l1D/oIf+OVfooAo/ZL/H/IQP8A3zS/ZL3HOoN+C1e4prusSF3OAKYFFrW8GP8AiYNk/wCzSiyvB/zEXP4VPDuceY/BPQegqfFAFH7Hd4/5CEn5U37Ddtz/AGjL+VaFJSAo/YrsDnUJPypv2C6P/MRlH4VoGj2pgZ/2C6PB1GX8qPsF1/0Epq0KMUgM/wCwXP8A0EpqX7Dc9P7Qmq/SUAUTZXP/AEEZqT+z7k9dSmH0q/3pR9KAKH9nXGMf2lPR/Z9z/wBBKer/AL5ooAof2fcf9BGegafcf9BGc1fxRigCh/Z8/wD0EZ6T+zrj/oJT1oUlAFAabcf9BKel/s+46HUp6v0GgCgNPn/6CExpTYT/APQQmq8M0UAUP7PuP+gjPS/YJ++oTVezgUZ9qAKP9nT/APQSnpRp1xuGdSnNXhS5+YUAZOhxtBJqUbyNIwnzubqeK1+1Zmmf8f2qD/pqP5VpjpQAUtFA6UAOFWFxtFV+lTr90UAVKcOhpoozxTAz9fOdBugPQfzFaS/cQH+6KzNf/wCQFcf8B/mK0geEH+yKQDx6UCiigBaTtRR1FADJuLeb/rm38qpaFzoVp/un+dW7k4tZz6RN/KqmiDGhWQ/2KALdxOlrbSTyHCIM/WoF1KBbNbifMWQMoRyM1DqyxC3aW8uCkMfKKnUt2qMN9oVLq+VlhiG5I9vJ9zQBrDBUEHg8inU1HEkayL91hkfSnUAHagUUUAFAopaADFFLRigAxR0oooAz76+mt54IIokLTttWR24X60LfP/aMqOyi3iQAsB99++Kz9Tga48Q2DR4VFLfe6FsUrtPLeWMioqxiZhEvTdheTTA2rW5ivIjLFu2g4+YYqc1BBKl1Z7kHlqwII6bT3qSJFWFUVtwA4bPWkBVub1bdsAx5H3txxiqFxqlz9stoYpIk8zdjaMg4HFO1mdxLNZhV8p7RpCcc5BqGX9w2l3UjRGGHap2dVDDGTQBowX/n2CySFYZ2Oz5hxvpiX9z9oit2hTzGJRzngNjPFJq11Zx6ddGRPNSEgYA/i7VVuo5LPQopAc3gYSovd39PyoAvWd3Lc3l5DIiCOAhQy9271Wm1C7N/PZxpGhjUMHxknNTaGIzpisrhppCXn9VY9Qay3+yxazqUhleRnjVY9pz8/PFAE8es3MqW8ccal3k8l5GHG4dxWtcLMtm5M2yRFLF1HpXN29rOttptrMGimhuiHI/jyM5ro7jKQtD5bzK6lWIPOKAMtp7r/hHW1B7h0kKZUD68VrRForOKS4cZWMGRz9KzTalrZLb7PO8SgKqM+BxS6ShvI74XBZ4nmKBGOQAO1AFXTNWa4ttQVC8kiO7IT02+xqXS9Ql+yaVFPEWe7UkuT0xVW2X7Nod6ImKFrh440Xq2e1T2dmBLb2V1culzaANDjjcDQA/Ub65hu7yKObylSENF8vLN7VWsdWa4mubvzxyBFGjjgsBk0zV5XfxHDE0oEaOjDAyRwc01bKS5S8Np5QaK7LqjnGRjFAGvDeSXGlW9w7eVJMucquQMVm6RezT2X2lJjLdSuQPNOEIBxge9XYvMk0OK0tCAxUxPJ/c9SKzdC0+RNFihjAeMswYOejBvvCgDV05pPP1JnyWWfAQnpx0qolzcr4kusoqgW6EI78U7SI7j7ZqTvNgCbbsA4Jx1qOwtrYa/qJkn88GFQ7u2cdc0AFrc3P8AbGokqgJCCNWf5SfatG+uJbG3kvJJkjgiTcwIySfSsO1kjl1GK1nYR2ts5eOZhgS+gz7Vqa7bpcaVdu5Lr5R2p2z60DKdlczWmlS6ldSurznzWG3IUHoKs6gLiLw7cubhndsOr4wQCRxVHU43Xw4RIVUtCqqN3JPFaWtfL4Zm9fKUD9KAMtjLBJaM07nz7kqylvugLV3TXZvEd8hY+WsCFRuyKo3lvLFe2c16V2TvgIgzgbcZ+tWdLCW+oFbrel3t8uPI+V07fjQBdv2NzOlnG5VEPmzuP4QO1NF5Ha33n7ibG7AKv2R/f61DqMsMUo05dyeed88gGfl9KlF3bm4isPIL2Uy7YyUxtI7GgC3fSIkKtIEMRONxbHPaqiGOS7W3SOISEbiCxzt9atajZNdWKwRbVKyKwz04NQmE22pLqVxICkcLIQi+tAg0L/kEqM5/ev8AzrQI96oaGpXSUJBG52YZ9Ca0DQMZSdqcaSgQlJS0lABRRRQAUUUUAFHaiigAooooAb3paSlpgLS0lLSAKSlooATFFLSYpgFJilpM0AGKKXtSUAFLQKKACiilpAJRRRTATFGKWigDK1gYutJP/T3/AErU7n61mawP3mmN6Xa1pnAY56d6AFoX761Sg1OCe1kuTlI0coCe+KuxkEq3Y9KAMvQv+PGb/r6k/nWr2rI8PnNlc/8AX1J/OtftQAmKKWigBKSnUlIBtFFLTATFFLRQAmKWiigBaSlpaQCUlLSUAFFFLQA3FLjFLRQAYpMUtFMBBS9RQRR2oAMUUUUgCilpKAFxS45pKKAFoopKADgAk8AdaqDN3LuI/dKflHrRI5vJfKjOIl+83rVpVVFCqOBTAUClH0pRS0gG96KXFBGKAG0YoNJntTAXFJ70hNKMnoKAENJmnOVQZkdEH+0cVRm1jSrY/vtRtkP++KQFzNGfasWTxh4diOG1SI49Oai/4TnwyODqI/75NAG/n2ozWEPGnhs9NTTn1Bq1B4j0O44i1S3JPYtigDUHXpS1FFcQT8w3EMn+64NTEMO1ABgdaMUmaUUALijFKKWgBuKMUppaAG49qTFPA5oxQA0CjuKdijuKAMvTf+Qnqn/XRf5VqCsvTx/xN9VH+2h/StSgAopaWgYCrC/dFQCpl5WkIp0vaminVQjN8Qf8gG5/4D/MVpr91foKzNfGdCnA7lf5itMfdB9hQMX2FUTqsQkuFKnER2qRyXPcCrpJwcdccVzu6WFb6JPNKw5KnHIJHJNIDVXU0aWXahaNURlI6ktWhXO3WwaUki4WZljBYN1rouw55xQBBeHFjcn/AKZN/Kq+jf8AIDsf+uQqa/40y75/5Yt/KotIGNEse37lf5UAOvbFLm0liAHmPjDHtRNFeTW5iaWIZXacLVsjikGM4yMntQAQr5cMcf8AcUDNSU3npRkdMj86AHZozTc84yOOvtS5ABJIAHJNAC0ZpOoBBBB6Ed6CwQfMwXPcmgB2aWm59SB+NL3wMUwFpO9Rm5twMmeMYODk96e8ixJvkYKuQMmgCGe1Sea3kbjyWLADvkYpPsatexXJc4iGI4+y+9TyypBGZJWCoOpNRPfWkUZd51CjqcUgJiisjJj5W6gUqIscaogwqjAFCsHRWU/KwyDTqAM6fR7e51Brud5HYpsCZwoFWBZWogeAQL5TjDLjrVhsKpZiAo6kmmo6SrujdXX1U5pgUYNGtoLCey3O8MrbjuOSKnjs40nEzFpJFGFLn7v0qyxRFLO6qo7scUdRnIIPQ0gKh0+D7cLxQUl/iCnAb6inR2VtEylIVXDFhgd/WrHqegHUmmoyyKGR1dT0ZTxQBVm02C4fdK0hIO4YboatRxiJAik4A4yeabNc29sQJplQnkAnmnqyugdHDKejA0ART26XMRikztPcHBFFvbR2cCwwLtReeepPrSTXltbMFnmVGPbvU4IZQyncpGQR3oAqRadbxTeaqktuLAE8AnvT7mygu2Rpk3MhyrdCKd9qtxcC385fOPRM81Nz6UAQC2gW4acQp5zDBcjnFRS6fazSl3iG49SDjNJJqtjHN5TzfMDtJA+UH3NXcD+uaAIooYrdNkSBF9BSRwpEgSJQqg5AFV/7WsfOEfmsNzbRJt+Un0zVuV0giaSQ4VeuKAI0iSMuVUDedze5qH7BajeRCoLnLYHWmJqtu8qo0csYc4V3XAJq1PNHbQtLKcKvp3oAikt4ZYxHJErRjouOlP2J5XllRsxjHtVeDUoZpViaKWFn+4ZF4apbq4S1i3urMScBVGSTQMV4YplVZI1ZVOQCOlOdVkUq4DL6HpVa31COefyGhkhlxuVXH3h7U+6vFtXhTynkeUkKqe1AicgEjKg46ZHSggFgxUEjoSOlRQztMDmB48dnqO4vxDOLaKF5piNxC9AKALJxncVGfXFBwccDjpxUFpex3iuFVo5Izh43HK1HNqUUEyxmKUguEL44BNAFzPrSE8YxwfWnY+bFZ0upP5kot7UzRw8SNnH5UDNAdABwB2pM9qh+0o1l9qhUyAruVR1PtVOS+vIrVrh7FVVV3EF+RQBo0maZBL59vFLtKmRQ230qpLqSR6nFZrGX3naz9lPpQIvUlU9R1GPTVid4ZJFkcJlf4SfWlv8AUF09YS0LytM+xVTrQBcpKByM4xRQAUUUe1ABRS0d6AEpKWkNACUUUd6YC0tJS0gFopKWgApKWkoAKKSimAvaiikzQAtFFFIAo6UUUAFFFFMAope1JQBmazn/AIlxxx9rWrd68aQyGUuEAy2wc4qtq/3bE+l0taEsfmJKnHzKRSA58kNKt3FH+42eb9kP8QH8X1rW03UI9TiSeKKSNT0DjFVotLlXyCzr+6haLA75q/p8BtbO3t2xmMYOKAM7w8MWV3/19yfzrX7VlaF/x7XvGMXb1qgUwCilxRQAUhpaKQDKSlIpKYCilptLQAtAooFAC0tJS0gExSUtJQAUCigUALRRS0AJS0lFABSYp1FADaKWqnmvb3ghlO6KX/Vv6H0oAtd6KTkcUtABS0n0oHPtTAXOT6VRkke8mMMRxCv3m9abNcNdyG2ts7Af3klXIY1ijEaLhR+tACxIsaBFHAqWkFOFIAFKaKPagBKSg1V1HVLHSLYz306xqOgJ5P4UAWOpqte6jYabGXvLqOEAZwzc/lXCXXjPWNfnaz8PWjIhOPNxz+fan23w9eXN74gv5JiBudFOaAJtQ+JVormLSrOS6kzgMRx+VUftXjvXhugQWUJ6YG2usWz0nQNMjurOxjMG5cvjJwe+a2kuIpJGijkRnQAlQeQD0oA86X4e6zeNu1LWmweoViatwfC3S1O64vJ5vxxXec7ua5PWlvEvLq1iMgad1ktfm+UleSvtmgCvb/D7ww7uI1klaNtrqX6Grw8A+Gupsf8Ax41mwagqaVNIrSxT3bOXJ/gkX+GuxtixtIGfljGpb64oGc3P4B8MFSWt/KA5Lb8VnyfDrw1JbvPFcypGvV1fgVs+Mrp7Lw/cP5SSB12L/eUnjNUpzHJ4chy2yT7MFWVBhZB0KsPWgRlSfDAoFk07WpUJGVJPao/7E8daJk2d+buMc4LZz+dejW0arZwIuMLGo4PtT9xHfFAHm8XxC1jTHEeuaM2O7opU11Ok+NdC1nCxXQhl/uTfL+taImj1C/urSW3jlghUZcgHn0rnp/BPh7XYpLi1ia2fcV3R8DIoA7EcqGUhlPQg5FGa81XSfF/hKUvYXBvLQdUY5BH0re0Tx7YahKLTUENhedMP90n60DOsFLSdgwIKnoRyDThQIXFGKMHNOoAbTT2p9IetAGXZD/id6n/wA/pWpWbajGv6iPVEP6VpdqBiYoFOoxxQAVMv3ahGKnjxsFICiOKXtTe9L24qyShrp/4kk59Cv8xWkvRfoKzNd50WYe6/zFag/h+gpDDvmqMlhuku5FkYGdcbO1XzTe9AFK4snmtYbZCiou3eccnFaBptOBOKQFXUv+QVeY6+S38qTTFxo9iP+mK5/KjUs/2Xd4/55NTrD/kF2ftCv8qAKD3z/b5ZEjaR0BVIjwAo6saRLm4utSspgqKxtWk2Z4NIS3nX0qTPMxUjaqYCjHTNJBaKdJhuLibypVhAiYcFR6UATz3jnQWuZVYExsS0Zxt9Ko2TKbPS4o4izz/P5pf+IDNWmt3uNCiic/uRCzOO7HtUYtIZdMsLaFSszBWypxtHc0AXrEyR3tzbTKPMGJC4PXNP1Nguk3eT96MqPqeBVTSngtgsGGa5ldg7HJIAJxmrNwhvZY4V/wBTG26Rv7xHagBdHBXR7aJid8K+W+euRRqk0MdmwngeSLjJU4xUV1LLptwbtI2ktZD++RRyp/vCpNSDXeizfZkLs6gop4J5pgRyxwnW4kmciMWwKgnvmn6bsW/1AqTsDrgk8dKbCs91dwuwAEa4lYj1/hFTWheKee1uogUA3pMo++PQ+9AGYUVzdaYyw7nzP5xP3RmprmRpEukL7o1mhVPTt0pl3CqW15OsJ867AiiQL90e9TXUKW6w2saO0kskZbA4AWgCzqxElrJDtbAwxbHAAqCV5NR0/aqL5Uq8NtA4rVlRZUaNxlGGCPWsm+igEZsYLWVXcBUdfugUAacDMY9rRNHsGBk9aLeWSWMtJEYmDYCk9R609UMcSxrzsXAzTIDOYybkKJM8bfSkBT1HZJf2UU7bbViS3ozdgagSa3tvFCWlqRsmiJlRfuhh0P1q/eS2aRBLwZRz025qnYQRy6gLqC38m2iQqmRy5PU0wH61axTadcySAllj+XngVdtf+PG3Pfyx/KqOtXUaafPBtkaWVMKqqTmrGn3UdxbRogdWjQBg64oAjvt17cx6ZExG/wCecj+FPT8aTRlWLTmSMfIszhfpmlnsoYpp70yzIzjDiM9RUPh+Mx2Uqusq5mZh5g7GkBa+z21s013cYYnlmfnA9BUejRslvI5TZHLKXjQ/wrVSW5a4vn+1Ws5t4TiJFXhz6mtS2uDcJ5hhaIA4Ct1xQBR0qCOdbi6mQSSTSspLDOADjFSaPlbe4gySkE7In0qKOSbSmuIhbvMkjl4SvYnsat6dbtbWQEn+tkYySfU0AVLi3hh1bTfLQKS7k478VoXbGOzuHU4ZY2I+uKzLue5l1G0mjsJSluzbuRzkdq0x/pNuweMoJFIKnqKAM2C1iPhvYyg74C7Ejq2M5oNw6+EVm3Ev9nHP6UgF7FZnTRb7uPLWYHjbV5rOM6Z9hP8Aq/L2ZoAr6hbQjw5JCqAKsQZcDofWrsWXtYS4zmMZz9KymXUZrVNOeEBQArz7uqitWbzUt8W4UuoAUN0oAy9XnuPPt4ZYFWwMqlpgckfh2rXdVJwQGXtms24W+v4xbSW6QwsQZG3ZyPars/niIfZtu5ezdxQBlXkly+q2i3kKpZLJ+7dDnLds1snG8k846VntFd3ssa3MaQwRsHIU5LEdKsXf2r5WtSmR95XHDUAZoluf+Egi/tBFVSpW2KdCe+ferV5bTzXFvNbyrG8JPJGetCW9xcXUVxeBF8nJjjT19afcpdlxJbSKMDmNxwaAI4J7qPUBaXLrKsiF0kAweO1TzTQ2aNO4+Y8DHVvaobe2mF0bu6ZTLt2qq9FFV5rK+bVGvFniZQMRxuvCe9AE9lbyJJNdzjE1xjK/3QOgpNVP+iQj/pun86lt1uhua6lVyegUYAqrfWd9dnYk8SQq4dcrzkUAao++RWdouBp3rmV9351bt/OEY89laTPJUYFU5LC4UyraXAihmOXUjkZ64oGN0TjS/bzXx+dJrDGS2itF+9cSBcf7Per0UKW1skEY+VBge9RtCrXMc7fejBC/jQAl1KbWykeJCzRrhABWILq3hfS4syNM05aRih5JFdB3qndWctxdRSLOESJgyrt70CJ7tYGtZhc/6jad2ax9F81r8pfljKqf6IX7p/jWhqVi+opGguDEiMGZQPvYpdQsWvRAUmMLwnIZRQBd+tLTRkgZOSByfWloAKWkpaADFFFFACUhpT0ppNABR2pKKAF/GlpopaAHUtNpaAFpMUUtADaKWkxTAKKWigAo7UUCkAUUUtAB2oxQBS0AJiiloNAGbrA/c2ZJxi6StLufrWbrP/Hva+10n860/wCI0AJQM71+tLQv31+tAGVofEN7/wBfb1qgcVlaIMLqA9Ltq1u1ACYopaMUANopTSUANNNIp1GKYDaUUuKMUAFLSUUALS0maWgAooopANNAPanYppoAKdTaWgBaSlooAKWkpaAEqG6t/tVs0XRuqN6Gp6KAKlncfaYfmGJo/lkU9jVgVWubRnn+027+VcAYPo496YZr/G0W6b/XPFAFxmWNC7sFUdSazWmm1JikOY7cfefu1SLYSzvvvJS/+wOgq8qBFCqAFHQCgCOGBIIxHGMAfrUwoxTh70AJTsUYooAKOpwKTknFcV4v8YSW0v8AZGjfPeP8ruvO32HvQMu+KPGdtoam1tALi/bgKOQn1rmbLwnqWvP/AGr4lunit/vbCecf0FbnhbwXFYhdQ1Qeffv82H5Cf/XrobiTzdUSxvVxbzoRHj7rH0NAifT7Kz060jhsYUjhxkFR1981NK2IJWK7gEJK+tYaXtzpOlTRJCZvsUu0k/8APL1+oroY2SSJZEO6N1DL7g0Achp4lutA1CwuJsRru8pMfMqkZFJoHn3N0lzBiFzapEySjl8fxD1ravkNrqIniizHcwmFgo6N2NTJpsTabb28hKyQr8ki9VNAFs5zyee9czqdpPJ4pheF3ZEKSmPsD0P6V0kMTxxhZJDKR/ERyacQA24KAx6mgDlk02F2vrC7fyG+0+fG5GQymt/T52nSRXXiJtqsBwy9qssiv95A2PUU9RjgAAegoAyNbs/NsJmIMjSOigEfdGRUOs6XAulvDCrYmnQkA8A55rewDwaCikYYZGc0ARw2sdquyIELjpmq+qS+RYSyG2MyhSSAcY96vD1qjqllJeRR+U5DI3zpnh19DQBz1lbXNtprRBZI7q5jaaNlf73sa1fD6uNNg8tiI1BWRHXB3dzTNVsrq4hjupCFFo4dYo+pXuPyraheKWFJICPLZcjFADsnHtXN+IfB2n69ExCC3uv4ZVHU+9bct1GWaHyZHyOSBxWBZ3d5fQzRWcuy3DbVEh/eY77T3oA5S3v/ABL4AuEh1FDd6WxwDnOB7HtXoulavY61Zrd2EwkQj5l/iQ+hFESWV9px0+b9/GF2uko+avPNV8Pal4Iv/wC19DmdrMnLoeQB6EelAHqamnVh+G/Etn4ksPOtyEuE/wBdCTyp9R7VtrQMWkp1IRQBmwceI77/AK5JWl1rMh48S3g9YVNadAAKWjkUuKBCYp28oAAuc80gqVACozQMzIZRNAjjuOakrO0yTb5kDdQcitHtVMkz9b50eT3ZR+tandfoKzNa/wCQPJ/vL/OtLPT6Uhi9TxWWmqGW9vVTBt7dcbu5etJl3qVyQD1xWIIFgvr6JFwGwQAPUdaALVpqjy2MErwkyyngDv71qdua5+2R7drS3C/vlzs3cA+tb+TjJHNAFXUjjSrs/wDTJqksf+Qbaf8AXJf5VFqpxo94f+mRqSx4060z/wA8V/lQBYGACABz1460wxoybWQFQPukcUCWNpniDjzEGWX0BpFnja4a3yfMVdxHbFIB+0Y24GMYxTlVU+6oHGOPSop50tbdp5chF64p0sqxQNO2diruP0oAeAvXaMnvilAA4AxSRuJIkkX7rjcM06gAFAyDSig0wD2paQUtABQDVe7vIra1nnLq3kgllB5p8U8UscThwGlUFVJ56UAS0VFcTGBFfy2cFgp29veoL7UBYJlreR8kKCOhJ6UAXR0oNRQNM0QM8Qjc/wAIOcVLigBrAHqoP1FHWqs9/DBIyEFnAzj1qC11ZLiB3MRQqAy56MD0oA0RwaUE1Rl1SONJGMLny8bvxqW6vVtLcyGNmJHyj1PpQBZpM5wTUEN150MbtGV3LuYjkCqcmsJHNtaLIWNnOD1xQBqljikzkVlvrCrpjXnk4+fYoz+pog1ZrmVUSNIvlDOXPr2FAGmGIozVI35TU5bZ0AjWHepPc0Wd+LmzWd1IP8QApAXt3vRniso6sX1Ka0t1DtFGHKkcnPWpr2+lt4IZYgnzsqlX6jNAF4HikNUbW+e4u7mN2QLDJ5YUdWOKr/2lcm7lhkVY2jiLkenPH6UAa3OKUVnyXs7RWZiQK87YweQRimwXsl1qP2aFwyRrumOPun0oA0ufWkrL1DU3tmKoeOGBA54PNWYLx5bNpmTaw556Y9aALZJo5rHi1GfC75ECO37uVhw/qKtapPJDptzJGPux5Dqe9Ay2aTHNVoZ3ns0l2AxtDuLg8k4rHur+58qPyZSF8guxPUjP86AOgzSZrPur6S2sbcgqZnKbvZT1qZJpDq91bnHkxxq6+uTQItAHFHPpWA8s8iXUYEgaOTIfdgKKt300xey2O8YlOGwfagDV5zS5rn9Gu5Lm+jRpGbyyVc5p0lxcSRajONw2XKLjPRBQM3iDj/GojmqF4rrDaxPIxV7gfNnt2rLMrG78ppHDR3YUDPBFAHRYNHfqKwPtYt9VvWkZnO9giA9KuJOX0madFByu4pu5FAjT6dxml68Vz8s8nnRMhP2iSRDGueq45rVMhXVDF5fzGHIO7g0AWs0uRjJIArJsJZv7FfcMYRyHJ781jXWoSnT47eVy4VlKsnpjv+NAHYCjvjvVMB/s8LSeZu2jIU1JAAZWbbKuF6uaALGc9x+dHP1rkI2nkeMCRzhwFGevzGta3aRdNtHEjAm8KsM9RmgDY5PamZGAdwwTgHNVJBKuohknyELGQZ4AxwMetc+J7kWFszlgiu031+bFAHWc0hI9R+dUbh22afJFIQHmAPP3garXkiJqV5IzHy12pnsDQBrg5HBB+lBYDGSB9azIUZNPv2DMrFd6n047U+982TSbZ0BdsI59TQBpBlOQGBI64NOrMtFkj1STcBl4wSo/hq1eyPHZu0fDcDPpnvQBZzmgcrkEEHuKo6gz2+nJ5TnO9VLeoPWoYMwarawI58pkclSepoA1etJg5pe9FACUUtJQAUUuKTvQAtFFGaAFo7UUtACUUUvagDN1o4s7c/8ATzH/ADrT/iNZeuZ/s+E/9PMf861f4jQAmKVR84ooH3x9aAMnReG1If8AT21aw6Vk6PxcaoPS6P8AKtagAo7UUUAIRSHpTqSgCM0U5hTaYCiigUtACY4opw6UlACUtFFACUtFFIApKdikxQA2gUtFMBaWiigApcUUUgDFGO9KOlGKAExSYp3tSfhQAmO9LilxzS0ANxxRin0lAB2pDTscVU1C+i0zTp72c4jhUt9TQBz/AIz8TDQ7D7NasGv7gYQDqo9ap+C/C/8AZ0J1fUwGvZvmXf8AwA9z71i+EdPn8VeJJvEGoAmCJ8xqehPYfhXXa9eTS2UtrJE9uDIoaRfmwmeTQM6Ec81BqNtFc2REzbNhDI46qfas2y1We3ultNRVRBtAhvEHySemfQ1rxyxXG9V+bY2DkcUAUfs8slvu8rMZBAiz97PUmptIt5bXTI7eb70ZIXn+HPFXscUuKBDMU3HNPIpuOaAEPSkpxFN70AIBS0c0UALQKKUUAJ3o5zSiigBOR+NNRFjG1FCj0FPpKAKWpLPNCtrbHaZTh5P7q96x3sfMkt9NgdSFXcZYz0H9DXS9DVe1soLSSV4Uw0rZYmgB4tYkaNguZEXbvPU/Wi4aFLaQ3RTyCMOG6EVHd38dsCqqZpyPliXqa5tpG1aNZryfYp3b4yMBPYepoA5XxBpF34J1qHX9F3GxkOSvYA/wn2Nej6JrVrr2lx39o3ytxIndG7g1naWy31hLpd/mW0lBWF5RgsPT6iuJ0qafwB41ewuGJ065IBJ6bT0b8KBnrQ6UdaaCOxBB5BHcU7vQBmp/yM1x/wBe6/zrTFZgGPFEvobYfzrTFAhe9FFL0oAKeOlNqVOF6ZoA5hj9nu0kHTODWqemR0NVNQt8MwA4PNSWbmS2XJ5Xg1Yivrf/ACCJD/tr/OtL0+lZmtf8gmUf7S/zrS7D6CpGOzzVZrR/tj3Mc5jLqFIxnOKs0HIoArfY2a6inlnaRos7Rj1q0c0maWkBS1b/AJAt7/1yNTWmRYWvtEv8qh1jnRbwD/nmasWv/Hlbf9cl/lQBkSNcDV9WYRLs+zKGOeeh6VXWSaK3uJRJtZLKIg9zzWkLK6lmu55HERnTZsXngdKrrAgAM9jNJIIhGQD8px0oAta35p0VyhABVS2e/Ipl7JcRu1tJIGja0ZyMdD2p8lvdX2nxQSsIw3+t45x2AqOW1mlnZ0jdl8hocueST3oAvWTTC3gV0UR+UuDnnpVrtntVa0M6xxxSQhVRAM5pyWzR3jTJKfLcfNGemfUUwLApaAeKKAClX7wpOtHegDmroKNN1nOzcZWxnrjirO4G60Yrs2qPmx/u9607yzjubOeBUVTMDlsd/Wqvk37Wa2pht0wgTzQeeO9AEurNcQwpLBOUzKqlcepqvqES3kj2cPmvLFIkj88YzV66tBd2YtpHPBBLD1FRx2bQXkk8ExjDoFYdc4oAWxlhuJLiWESAiQowc9xViGJ4i++UyBmyM/w+1RWVoLSKVd5dpHLsfrUsMCQBtpY7mydxoAw5o7i41xh5TmFJMBgOxFPX7RDY3OnLbkyQJ8rkcMM8UzUZrqO+kAkbbuAVc8AHjP50nm3S6VfzGdjIuIwT1GO9ADnt53+yyxwM0NuoMwJwZD/9armoRtexQPGrIFPmEnqPbFU7i4f7bDpwZkMm0mUnjGOn1q1qdybUIiPg8YXuRnFAEemW89tbxsAWV1bIJ+4azm0e+lAk27XkOHIPQd/0q7pdvc/abyYXB+WUgIx4YEcVHLctDbi6kkYRqzREA8Fj6fjQAl5a3UmivawRN88pPPULSwaZKLiJ5RudZEBH+yB1NWbsSWvhp1LMZtgwc85Jp9s8v9oNtkxO8S5Vl4wKAK72gbVtQfynZXjCDLdT7VNp0c0ENxEVAuM5L/w1BJI8FxfXKDzJFmCrH/e4q9paA2CktuaTJk9j6fhQBTXSGS8nkidkcqrLN/ef/Crc1u908CzKPkYSSMO5HYU+wdzFNGzFlikKo3qKqapcSLPbohZUWVSxH8RPagCxZWxgmvZHjGZZi6fTFU7nTrqZXZNqySNukdj1H936VnzXF3HDDcI7+ZcSOk3+yoPX2p4e4GpvZRsZLNWLKzNwTtzjNIDWkS5mjs3WARSQMfkz2xjiktrU296biOJUdxib5+vuax2vpnkW4RX8kMqEZ+ZGx29RUkTTNHFHlPMmXzXk3dQDypoA1bm1Ny8kjlEBjMcQyOc96dFHcsJIroRorRBEQH261kMnnafdZ+VlkbyEY9FHXFLHPK5leVSZGkCLuHzKpXqKALsGmsbeygZ4nit2y4HOfSr01uZysbELApB2jvVLS43S+m2geT5SjcOjN61q+9AFNLR4pJlik228gPyf3CfSqEmiyYxHOGXy/Lw47VtUmOKAKElgJ7OKCVxvTGXA5IHapUtdl7JdByS6BCvsKskUUAVLu2a4Ty1YIjH95x94U6e2WVo253R/c9BViigDNi0pYLjzYpCu4gycfeIq3HbIBdBvmWdskfhU2KWgCgNNzCIpJ3dVkDqT1GO1KNMg8yN8tlH3jPc1eoxQBS+wRnzjx5krFt+ORmnpZxxwGFV4ZNjH1FWcUvWgDLOjxbo5FldZoRtjcH7oq0bZWu1uWJMiJsHvVnAzRQBWjtkS28jG5OeDVN9Fs5AdynnPStSjFAFWO1KxqhmkO0YznrThbkNuEsnHYmrFHFAFQWMCPG6JhkBxilWyiFvFE2SI38wf71WqOlAFU2Fv9pNzhvMLbjzxmozp0BgEQ3AA5z+OcfSrtGKAK5s4CkaBSFjfeoz0NMmsIpwu4kYfzDj+I+9W8UtAFZLVVhmhLO0cvUE9KlijWKJY1+6owBT6XHFAFeG3WGWSTJZ36k+lTMoZCpGQeop2KKAIJbdJrcQNkKCCMe1ItrGsySncXQEAn3qxRigAp1NpaACilo60AJQKWigBKWiigAooooAWiiigDL8Qf8guMj/n5j/nWrn5jWXrxxpSe1xH/Or10+0+WJfLkflCRwSO1AE9Iv3x9azLm9l+wrcKDGyyKMjo+TitCOR2mIaPYB0OetAFDSgPteqf9fP9K1KytKP+n6svpcj+VaooAKBRR0oAMUUuaKAGEVGamxTCPWmA0UtLjFHNAAKKKKAEopcUuKQCUtIKWgAoxS0tAEeKKfSUwEopaKQBRS0tACUvakpaADtRjiiloASilooABS0YooAQ+led/EjUpJ57PQ7Y5aVgZFHfPQV6JwDk9Bya8u0hP7f+Js103zRQMXGfQcCgD0HRNOj0fSbeyiUDy1Bb3bvWZfW99pzmUL9ptp5N0u0ZaMd8eoxW9BcwXLssUyM6nDLnkVMCVOTwB1zQM5fS7L/SJ7K2uzNpUib4VkGcHuv4V0lrbpa2scMY+VBiq2n2sMUTyREEPKzgjpzV+gQAUtJmigANJRmkzQAYppWnZo70AR0U800mgBKWkozQA6jOTTM0uaAHUlFFABQOtGaM0AVrrNtFJc29sJbj0HU1zl0nny2clyZPPLmSVUX/AFQHTiutztOapx2hj1Se7zuEyAfTFAFBNNbUB59xKUQyB0WPjkd/asv4g6INU0BrpB/pFmNwPcr3FdUJojMYiwWQfwninyQiWN4ZVBjkUqw9jQM5fwDrJ1bwzGkjbp7Q+UxPUjsa6rNeW+D3bQPiBeaOxxFMWQD1xytepd6BGc3/ACNA97X+taYrNf8A5GWM+tsf51orQA8dKdTacKAFAqZD8tQ1NGMr1oApX8W+LcOorKs28u4eM9GGRXQOoKkHvXOXYNtdBv7rfpVIQa6P+JLOemCp/UVpD7q/QVQ1hfM0a554Kg/rV2M7ooz6qKBjmcquQpYjsKp316Y7Xd5ckTFgqt7npV7tVG8AvLqG2HMcTCSQ/wAhSAm86dUUG1Yyfxc/rVkdKz4ol/t2RldjshGRu4yTWhSApay23Rbw+kZqzbHNnbnH/LJf5VV1v/kBXv8A1zqzbcWduf8Apmv8qAJqM81TutQ+ybN1u7CRxGpB6k0C9lN4bUWv70LvOW4xTAvUUx5BFC0knyqg3NjtVb7YzyQSQKz28gy3HI9DQBdGaWq8F1FcyzJGGBhba2RTBdM17sBAQqQit1dh3+lAFyiqzvdABhHEoB53P2qZ/MOPLK59+lAD80ueKxRqV6+myXIaIOJjEi46nOK0mlK2TyB0aVIyWK9NwFAE9LWCdTunSPZIN21t/HfbkVdtLq5urazMZGDGGmlbv7CgDRox7VT1UyrYMIGIl3AZHUDvVO/bNlKtvLcGYr8p7UAbFKajhYNEgDBiFAbnvRHNHMu6Jw6g44oAr3FmtxMHkPC4+Ud8dKiGn4triB5CyzEscjkVFe3VxFqENvBcJj78oYfdX0/Gsm61C7TVZ3jkYFbRmUe+aANs2TPFsaYY4ySvORSXOlLdzpLPKx2JswO9NjuWbQ45r9WRnizJs6jjrVMzQ3V1pUEd0xhVDIzMcF+OBQBffT0NzFNHIyFPvAHh/rSDS4Nqxvl40JZYyehPeqOiSmCe7sWDyeXMzeYDkAdap/aLiSfUZlleOVlzsI+6gBx+JoA347NViETyNIituXcakMK/axdFsMqFfbFc3Kx/4R2zlMmXJjy2/nrzWtr0og00ySvst1ALgHlz2WgC0tmv2iSeN2DSckjp9RT47cReYA5O/rWc88UNnHNdpPDtRciP7q+lWLQqsM/2eCVf4g0p+9QBdjiEUYRBhRUTLb3YX5kk2ncMHoRWWWkOoLbMMsYzKG8ziqui2cz29ncx7UeOSQOc/eGelAG8sEAkchF3OPmFH2S2EHlbECZz1rPnZnvtpjKXDHy4yDw6HqfwqlJCsmnR2e5vtbXHlN83O0Hr+VAHQC2hJU+UuV6cVH5VqsxgKoJJBu2kfeFMv7aWW0SKCQpsYEkdSB2qiyQPqUEctvcG4ZC0ZMnQd6QGsbaMhQ0alV6DHSmyPAlwiuUEzjCA9SKq2FrNHcXF3K7Zf5UQtkAVn3kRublrSKYG8lH72fP+pT0FAG3E0W5oo2XcvVR1FSAVhJPZpeQ2l3P5V7CBslU8Sr71o3qKFNzsaQqM7VbHFAEqXEUs00SN80Jw+e1SAg8hgR6g1hiOO2kZ1Tzf7QlDIu7kADnNabQwWtpImGEfUgHk+1ACx3tvJGZA+1dxUFh1pUu4JZjHFJuYDnisrSjdXFgblfLId2xG44QDoBVnT5rq6jiuWWGKI5DKo5OKANAsFIBIBboCetMM8SSbGlQOTjBPesS5uPP13Spw37vzmVFz1AHWpLnT1CfY48yXFxcCUueqDNAGw8scbqkkiqzdAT1pJJooSBNKqEnjcetYflLeW+uSz/NJE5SM/wB0KOMVFYE6gNUmuhkpaqqBv4flzmgDpGZIxmR1UHgEnrTZJYoQDJIq56Z71z0rGfwlpUshLP5kQ3HvzWzdQwpci+lJJiQoqf3iaALKSLKgdGV1PRgeKb58PkGbzV8sHBbPFZdtG9lp6WjNtlndnb/YB7VmWGJLDRrXJMT3sm/PfHSgDp0nhkgM6SoYh1YHgURTRTpvicOM4OK5fUWePXrqyi+S1knhLgdAe9aksq2PiS9aIfIbVWKDoGzgUAagkjeV4kcF4/vqOq0kc0U5bypFfYdrYPQ1l6QVXxBqSFsuyRsfqRTbdfs9v4gMIwyyMVx2O2gDUju7eadoIpVaQc7fX6VCmp2by+Ws2WztxjvWU8Sw2fhqSI/vDJyR/Fkc5qdJLnS44GkWCW2eYodg+YEng5oA0Tf2qy+UZQGLbQe2fTNNfUbSKdoGl/eKcMAucGqd1YJJs02DhRMJpZD/AA85pLlrjTxfXcYheFJd7DGSR3FAGhNeW0DqksoVmAP0B9fSnT3ENt/rXwcbsDnj1rJtNl3Dr08y9Rhd3ZduRVHRG1C6mu2+TzUtIwBIM5GP60AdBJqFpCIt8hPmruTaM5FEmo2kKRu8hAk+6NpyfwqnAtxffZbq2MML/ZiPLYZ2nPYelImopJoDapLCgniDRgY43ZxxQBcXULR7Y3KyExhtvTkn0AqeC4iuYhLC25Dx9D6GstLYQ6jotu/3NryH0MmM1Lpa7NS1hV+4LgED0OOaANTFJTqCO1ADe1FLig8UAJRS0UAFLSCloAKKWjFMBtLRR3oASilpKAFpabS9qQGZ4g/5BK/9fEf86m1iRo7BjsDbnCqf7pPeoNe/5BQ/6+I/51qSxpKCjqGXOcGgDL1KDGnBFl4RkG36GtCLAlYebvJOcelBtomLZjB3dc05IUSQFVCmgDO0r/kIavn/AJ+B/KtbtWVpZ/4mWrjHS4H/AKDWsKAEpKWigBBxS9qSlFAC0YopaAEwKMU+koAZijHtTqMUAR4pcU/FJigBgop4FGKAG0vWjHFHagAFFL0ooATFGKWjvQAh+lGKWigBKBS45pDQAUtFFABS0lLQAUdqKWgCjqtwLTR7y5P/ACziY/pXDfC2Df8A2hen7xIQH9a67xXx4S1L/ria5j4WYbw7eD1mwfyoA3poYN7q0PlyyzEJcI2Np7UqperfR2Or3JKOv7maPhZPY+9aM2nK9qkCMBHu3SA8k1RutNulZIIJRJYsckSnmEjoVNAGzDEkESxIMKvQVFfXwso02xmWWVtsaDuamXO1dxycYJ9ap6jEZDayRypHNFKGTf0b2oAj/tuAaU966MjI/lvEeob0qxf6jHp+nNeyDKgAhfXNZEcTPo+rmVVLNMzDHSmeIWmbT482zSWwtQQ69mx3oA0bvV3tmBSzeWFUEkrg/dBoudaWGf8AdQNLbpt82UH7m7pULXX223tLCPbG8sStPuONq+lQTBLW112DoXK7Ae4xgYoA1W1GIasmnhSWMRkL9gKr2mtie42S2zRRSKzQSZ+/t602ZManppA+f7K6sf8AgIqlgXGkaXFFjzVWTK9xgHNAF+DWHkLLNaNG7xmSAA58wDt9aSLVpDFdCWzZbqAA+UDncD0qq95CjaNd5LRwxMJNoztzgc1LHPFZa7eStL5kE0SyGTrs7AfSgB0erTyRzRmyIvInCGIHjnoc00aw505Z1tD9oM/kGEtwG+tMtZ47HWLq2llMkNxh0n/uk9iaitrW1MElhezMY0u8xzA43EjuaAL0t9dxxwqbAm5fJ8vdwAPemNrUC2NrcbGDXD7BGeoOcGqkV7JaWs1iJjJK07RW8jnov19qmvrSO10OBFKuYpUbcOed3NAE9/qhs5zHHbNN5a75SD91ajvdYntPLlWxM1tKVCyK3Jz7Uk+2O/1QOQGktwyZ7jGKSKMyTaXC+dsMXmMPftQBdu9QhtLqzt2UmS5faB6VGdUjWK5LRlZreTyzHnls9CKxNQmnj1uKSa2cv9qUROBxtq1qDKPEMWqKu63hPk3GPU9G/CgDeBLIrFdpIBI9Kq6kLlrBvskvlyqQ27271cPPQ5Hr61DcK0lvJHGQrMuATQBSn+1FQlxbR3XA+eI4Ye9Lg6fKp+0SSK3SA8kU2O1m0/T2FsfMuTgF2NWra1WBAzHzJiMs5oA808Yk6d8RrG9j+Xf5bn88GvVs5fI6HmvLvieMazpbDrt/rXpsBzDGT1KLn8qBlOT/AJGSH/r3P860R1rOl/5GW3H/AE7tWktAh1OpvWlFADqlQgL0qGpVbAoAeRWNrFvuXeO4xW2aq3cQkgZcduKEBz8kpm8PXCtyyIVNX4Mm3hPrGP5VlBvLW9tz0eIkfUVqWxzaW/8A1zH8qoCYgkVGttEsTx7ch/vnualzS+1ICC2tIrPf5QYlzyWOTVikopAUdb/5Ad5/1zq1b/8AHlBjr5S4z9Kq63/yAr3/AK51Ztjmytsf88l/lTApajHM8ljG8qkmcOAB0AoEVy+vSHzwpNvgEDtmrohBuPPkO5gNqj+6KURYvDPnkpsxQBHd/uNJnEr7j5ZXce5NOtYpo7K3jEmzbGBjHTinzQrOyB+UU7tvqanzmgCC3tvs0txLvMjTHLcYqjDE8niKf7Rgj7OCgH8PNatRCBReNc5+dk2Y9qAKgtIjrbRspaP7PkgnjOas3cht7QiMfvGGyNfelt7NLeV5d7vI4wSx6CnyQCSRXJIKjj2oAyJmGjRxoEWVZFwV67ZP730rQtrNYdNNvGylnUlmByMmporWJCx8sMzcEtyTSQ2MMBkMQZd/UZ4FAGBFGuXVmK4ZvLOOHwmOtWrGSH7Na21w7CN41MbA4Ab0ra+zx+SIvLBQdAR0pn2KD7Otv5I8pei46UAJPD5kMqodsjLtDelZ8qz6fphCSwu8ShVB+8TWvtIHTpUTWcMk4neIGQdDQAQRiOIfKFdhl8evektTAYAbdCi5ORjHNT7T6UbCOgoA53XSq39tG2AsrhncDlQPX2qAosmusvnQ7WtiA27jrXTfZ0yzGMEtwSRVZtMsmzutovyoAaN0+kyoXSSTymXKHI6cViIxTQ7MmIfbYQPJiAyxI459q6OKCK3j8uFURR2FIsMMbl1CBz/FkZoAydClgSOZJf3d7NIXmjYYwfQe1U7m1C6tqUWyV1e2DBgeBgGuiKRGTefL3/3sjNOOzBBdOevI5oA5OJVfTrcvHKLJ4lWYqvKsO4rU123huNCkkUtIAi+Xn6jmtbMYXbujC9MZGKQmErtLx7fTcKAM3XLiP+yVtWJ86UIEUDr0rQupBFYSM2QFi/pTi0GQzPCSOmSOKDJAeGniPsWFAHPWKtNNaSG2kkRLby23cfNnNTi4n0eZ7YQs0dxMGgYDIXJ5BrZM8GMefFj03Cm/abYcG4iP1YUAUGdo/EU89ySYoIQIQB3PX8ahW3vI9SbWRCp3LtNv32+v1rVN1aZybiHj/ao+22nU3UX/AH1QA0XsMlqsrLKivxgryKybiKM6pDNAs21YHQvzwx6Vr/2hYjk3UX50h1PT1/5e4/wpAQaZIxt/Ikt3jfHzv2Jqu9okeuiSO1MkRgKtg4yc1bOs6b0+1L+ApP7Z04f8vGfopoAqWtqJNfnnlstkXkhV3cjPtV+W5MZ8uGBpHxwOwqMaxYHgTMf+Amg6vYf89H/74NAGba6Xe6dfSX6Mk7SA/uGPEY/2a1raeS4jLT25hZTwpOaiOrWP96T/AL4NN/tiy9ZT/wBszQBDZx3NnpJRYg8u5yEJxwTVjT4Hg02KGQYfGWHoTTf7Ysu/nf8Afs0n9s2meEnP/bM0AR3OnPLf2U8YjWO2YtgjrmoTY6l5k+y8QLK+d235gPQVZ/ti1/55z/8Afs0n9s2v/PG4P/bM0AMl01j56wyhY7jHnKR1Pcj60+bTcySm2cRrNEIpOOoFL/a8HaG4/wC+KUatDji3uP8AvigBl3p3nadBZW7iNIWUqSP7tLd2l3cXEM0dysZjXG0rkE+tL/akeOLW4P8AwCj+1U/59Lj/AL5oAkt7Z4IGWSXzpWJJdh0z6VVt9IEOnrbGTLxymWNwOhzmpv7TU/8ALpcf980o1Mf8+dx/3zQAn9mRyQTiVt00ziRpMcgjpip4LMRXEs8jeZNKoVmI7DtUf9pf9Odx+VH9pN/z43H5UALb2TQahc3m8FpwBtx0x0ostPNq9yzzGUXLbnUjvTTqcgHGnzmj+05/+gbN+dACQ6XHBLEzyNJHBnyYz0TNMTTQGjVpWaCJy6xn1pzajcdtOlP40hv7n/oGyn8aAIv7JcNJi9m2SPvZT39qkl0uOTzUEriGZ90kY7mj7fdn/mGyf99Cl+3Xecf2bJ/30KYD7jT45y+1jGsqhJFX+IDpT5LGPzRNAxhfy/LYr/EtQ/bbwj/kHP8A99Ufbb7/AKBjf99UgJPsCIIjA7RPGhQEdwaV9Nt304WW3EWdx9znOaj+2XvbTj/31Qt7ff8AQO/8foAnubZLlIwxKvEd0br1U061t0to2VeWZtzserH1qv8AbL4/8w7/AMfpftd9/wBA/wD8foAvUtURd3x/5cB/33Si6vv+fED/AIHQBdppqobq/HH2Ff8Avqj7TfH/AJclH/AqALdFU/tN/wD8+S/99Uv2i+P/AC5IP+BUwLfSl+tUvtF/3sk/76pftF//AM+Sf99UAXaXtVH7TqH/AD5J/wB9Uv2jUscWkf8A31QBcpKpefqn/PpD/wB9Uedqf/PrF/31QBcNHNU/N1PP/HtD/wB9U0zarn/j1h/76oAvZ96M1REurZ5toAP96jzdU/59of8AvqgCPXhnSl/67x/zrV/iNYt9Bqt/a+S0UCYdXGG9DmrXn6t/z6wf99UAaGKUfeFZwl1c9beAf8CpBNrGf+Pe3H/AqAE0wf8AEz1j/ruv/oNalY9tb6pb3N3OogJuHDkE9DjFWd+rf3Lf86QF+iqG7VscR2/50u7Vscpb0AXO9LkVQ3at2W3pc6qf4YKAL+aWs8f2qeogFOzqvT/R/wAqAL4oqh/xNf70H5UY1b+/B+VAF6lqgU1Yn/XQD/gNN8rVyf8Aj5gH/AaANH60lZ/lat/z8w/980CHVs83UWP92gDQxRVEw6rn/j6jA/3aTyNU7Xcf/fNAF/mj2qh5GpH/AJe0H/AaPs+pf8/q/wDfNAF+jn0qh9m1PP8Ax+r/AN80fZtS/wCf1f8AvmgC/gmjB9KofZ9RP/L6P++aX7PqHT7cM/7tAF7B9KMGs/7PqAP/AB+j/vml8i//AOfwf980AX8GjFUfs9/3vfyWk+z32f8Aj+/8doAv4PpSYNUvs97/AM/px/u0n2W9PW+P/fNAF/B9KMH0qiLa973v/jtH2a9B/wCP0/lQBe59KUA+lUfs15/z+n/vmj7JdHrfP+VADNbtzdaDfwYzvgbH5VwnwonPlalZk8qVcD9K7w2d0x2tfttYYI215ToKyaF8R5NPM7QLJI0RYdweRQM9d+1Q/blst/71lJA/pWPrsP8AaE8NhbzSeYXBk2HgAdc1ny+H7qO6k8/U5A8shaAr/eHvVZdM1CJBLBqE8MMrZHG594oEduFKAKOgGBUc9tHcxGKVMqefoaxNJi1K7tGF3fTR3UbYdSvBHYir32G8HH9oyH8KALq26Jb+QE/d4wR607yx5BhK5jK7dp9KoCxvRz/aD/lSmxvCP+Qg/wCVAEk2lWlxIJJIP3mAu4HBwKkfT4JWjeSLc8YAU+wqv9hvMf8AIRf8qb/Z14f+YlJx7UAaPlgyJIV+ZOhxUcVjBFctcRxbZG6mqf8AZ94f+YnJ+VO/s+6K86lLn6UAWYbC2gaVo4FHm/fHY0kOn21ukkaQjZIMMDzkVW/s66/6CU35U06Zc5/5Cc9AFtNOtVtntxAPKfqDR/Z9sbU23kDys5x7+tVhptwf+YhNS/2dddBqMuPpQBM+lWbwpG1uCsfK56ilWyjS2+ziPMWc4NV/7Puc5/tGX8qRtPuv+gjL+VAFi4s4rrYZY8lOhqXyRvD7fmA259qojTroHP8AaUv5UfYLwdNRk/KgC6yBgoZd2DkZ7GmLbQiJ4vLGyTO4Y65qr9ivP+f9/wAqX7JejpfN+VAF1V2IEXOFGBS4OCcE4HSqH2W/7X5HvtrNE2oi+mtLrUPIUD5JGThvxoA0rfVrK5cxrLskBIKSDB4q4jLLGHjbcp6EVyr6RrEbEzXUU0MSHyp0UEnPY1oWVpqEczRpqIEEKhSu2gDi/H7fa/Gmm2f90IPzavUgNuFHYAV4/Yw3PiT4jM/njdbuWMgHGF6V6kIdTBP+lRt/wGgYTg/8JFaMP+eLA1pD1qhFa3H2xbi4kViq7RgVeFAh9OpopaQDhzUkagr171Fmpo3wmKBktMdeKfQaEI5HWYCksmOMg4NLBf3kVrEp015FCgBkYc1ravb+ZFvx04NUdLlJieInlDx9KtANGrS9DpdyPyp39qSdtMuf0q+GOOtOyfU0gM06pPzjSrk/iKT+0r0jI0ib8WFaW/AyXG3uc0bj60AY17PqV7YTWy6Wyeau3czjiprefUoraKE6cpKKFJ3+laWTnrQJEYMVkUhOGOelAFH7TqeeNPT8Xo+0av20+L8ZKvKwZQysGU8gg07J7mgDO87WiP8Ajytx/wADp4fWz/ywtV/4FV0yorojOoZ/uqTyaeOTQBRX+2j1FqKcV1g9JLYfhV4GloAz/J1kjm7t1+iUfZdWPXUIx9ErQo6UAZ/2LUu+p/klBsr8jH9puPotXJLiOF41lbaZDtT3PpUUd9by37WSyfvQM47H2oAg/s68IydVm/ACmnTLknnVLj8MVctrqO684Jn9zIY2z6ilN1Ct4lo7bZZF3JnowoApjSpMc6lc/nS/2T639z/31Vi1vo7qSZVGFjfYrE/fPfFJf30dhFGzKXklcRxoOpJoAg/spe95cn/gVB0iM9bq5/77qYX8QvLq3lHli2RWZieuasQyrPEsqAhW6ZGDQBQ/sWE9bi5P/bQ0n9h2mMGS4/7+GtSg0AZY0Ky7mc/9tDS/2HY+kp+rmtKigDO/sWxHOxz/AMDNL/ZFjj/VH/vo1f5xRQBnnR7H/nkf++jR/ZFiP+WH/jxq/wBqKAKH9kWH/PuPzNH9kaf/AM+4/Or1HagCj/ZNh/z7LR/ZOn/8+qVeoxSApjTLIDi2j/KnDT7If8usf5VaApQKAKwsbQdLaL/vmn/Y7Uji2i/75qXFFAEf2aADAgjH/ARS+TEP+WMf/fIqWkoAZ5adfLX8qCi/3F/Kn445pKAGBF/uj8qCqj+EflT+2KYzBFLEE47CgBMd9o/KlH0H5VjwXVwdRvd7su0gLH2A7H61Zsrua5v7iIv8kAGRjrmgDQx9PyoHpxRWa9y48RLAv/PvkgnA69aANKl5+lZQuZftM0iuArMIo+4Y9zWoWEcW6VgMD5j2oAX8ab+NP4IBHQ1G6M6EK20+tACjPvTuaytTa7tLaJ47psvMqHjsauLayLOrtdSPt/h7GgCyN2KcMkdfrWLJeStq91Zm5wiQb0wP4jVdbi5RbhxLulW2VSAeQ3rQB0X40lMgbzIIpM/eQHmpMUARkc0mcU8im0AFFFJQA6jNFFAB+NJilo7UAH40lLiloATtRRS0AJRRRTASgUtFACfjS5H94fnRxjJrJuxD9usNmdrysHHrxQBrblGPmXngc0uQBkmsi3MCX9+WRmWORNoHbIrXI3KRjqKAGGaJeGlQd+TQJoiwUSKWPIArF8lmeFnGcRSI2fU9KsabCwuI93RIAp9moA1qZvTzRFvHmEbgvcind6x7ptvim2lzhIYtj/8AAulAGxxRS4wcYpiSBpJEwQUP50AOpcUuKWgBhYDqQPqaY08MWPMmRcnA5pl5C0sOUALId2D0PtXOW5i1Bvt6psEl8kQjP8AFAHURzRSsyxyKzJ94A9KDNELhYWfEjqWVfUDrVHTo4x9vf/lv5jCVehGOlZdxPHbQQarOw3R/uwm7sxxmkB0cU0U8SyQuGU9CKSWeOExrI2DI21B6mse2jFrd2UEKiSIlm8wN0zzU95FJ/wAJJpkjfNEu/C9s44NAGgs0TmTa4/dNtfPY1IDmsC0aJ7vUxcu+1rgsqqOGwPWtu0fzrOKTbtJHT0oAlxS0tFACYpR0oooAXFJ3pw5o60ANop2KKAG0lOxRQA3FFOxRQA3FGKdSY4oATFJTjSUAQy3EUDRrI2PMbav1pkt1FGVBbOXCHHY1V1EgXlszhWUtsCnsT3qvFGJrqZDx5Lrtx3470Aa0ciTJvjbK5IJ+lVhqVs0BnBPliTyyfQ+tNsd9zpTq3BLupwMVkCE/2RBGoJ2yDcPXBoA6Tcu7arAkDOAaR3CRs+MhRkgelUrMp9qkX++vFGpQqliwjLCRyFXB70AXRIjIsgYbWGQadVAKBcwW8sAAZDyD0xWgAOBnpQAUySVYkDP3OAPWkjMpZxKoGG+UjuKrygyatbxn7qxsw+tAElxeRW6FjlmUjKgc/WvL/iVbCHWLLXLI5D4DOo6MvSvQZJJDezLI3zQEBXx1BFUG02HV4r3RZ1HkNHvRscq2etAy3oOsWvibQ4bpMGRceandHHetaGFIi5UcO27Hoa8j8JXc3hHxrJpuoMY4ZT5Tk9D/AHWr2DocduxoAU8nPem4p4pSKBEeKWnYoxQMZTWdEIDMAWztB71JisnxAkyWyXsIUrbBmZScZ4oEWbLUba/XETFZAMlGGDipZrmC1AM8gQHuaxtIP2iW0w6+bBDlsL1DdjVrX7Z7mziCDgSYc/7JHNAFqDVbG6k8u3l8w5xwKtE5z7VyejaQLHVVaOXKAlsA+oxW7qV2IbKdQzq4QsCooAt206XVus0edrZ6+1FzcxWkayTNtRmC59zWRpSm2trfyYJmcxhmDNxz3qzrmTZQAYybhMZ6daAJ21WyV41Eu/zJPLBUcbqtMQCQcVyMRbeilkIGo52gdK3tbl8u0cvFvhb5XYHBTPcUATWl/BeK2w7ZEYoyN1BFWq5mxxDqUUKHMsyYL464710w6UAFFFFACUySNJl2Sxq6+jCpO1N6UwM59L8slrO4e3b+5nK/lWPruoSeHfCt7NPIpup2KoV7k10+RyzHCjkn2ry7XLiTxr4vh021J+xQNgsOmB1NIDX+GWkNa6VNqcy/vrpsKT12j/69d8v61BbW8VtbxW0KhYolCqB6CrIoAWlFNFOoAUdadSClHSkAtSKOKjFSL92gCcUtNFLQBDPEJImX1GK5cbrO/BPQna1dcelYGs2vzeYo69apMCyOKhu7hrWKN1UMWlVMH3NJZTedbKT95flNLeQPcQKkbBXWRXBPTg0AYs5c21zbqSd1/wDMc9FrUjup5NUktBGgjiQMz+56Cq8AiW11BZ+S07YwOSeMYpNHlkiEkOoApfSNnkcMvagDQuNwiLKxXHpWHFbSpHdw7mLzlnU59R3rbvg32VlQEyMcD2rGthNGZXTMwdysYbqDjqPagC5pc08lva+SE+yqhVieuRxWrxisu0RtLkjtJATFIMq4HRu4rRlmWBMsCW7KB1NMDJ1U7dcsJv4bZS7/AEJxW19DweapwWQfzpLoZkuBhh/dXsKjtWurOUWU8TSxf8sp17D0NIC95jC5WIRkqwyX7CpqiVpftJXaPK2/ezzmpaACg9KWjHFAGdfSyQ3enj5DFJNhgw6cda56JxDc2bBiXF1Mx2/f28810mp2TXkcGw/NFJvx6+1UodMki1i2uzAGkTLO46AY4UUAO0BFP2+ZZHkWSc/eHXj+dVovs11qUN3PN5MUReKKI/eY455rVsIp7e1uJGhAmllMix56Vn/2XeNLE7RxjZM8uM9dwxigBlqsSazbQ2+J7R1MqZ4MR9fermp2TT31lcq4Z4pwQpPCjHNR2dhe2s1u4EX7qIxEZ6gnNabWtu8vmPHk9TzQBgwEt4g1K58sXYUqhy2ACO1a2myTyxTPOVyZDtVTnaPSo7HTEt5L0yRqVnnMi49MVfjijiUrGgQdcAUAPooooAMUdaKKAEopaKQDe1GKdSUAJSU/FJigBuKKXHNFACe1FLRQAdRSYpaBQAmDS9+aWigBCKSnUhFADaaeozTqY6blxnHuKAMO5H2fUp9QdilvIAu3qSR3xV3SIiEmunwGuDkAHt2qytnCrbmXew6F+cULYwJN5qghvQHigCx35rHa1VvEUssw3b7fgZ6YNbBqJ4UkfeR8wGM+1AGSVVZV8v8Adr0LDpEP8a2J2hS3LTHMYxk9c0giTyjHtGw8EYqQKvlhNo2gYwaAHDBUbemOKMUUdqAMrXHQ29tEGHmG5Q7e+M1rfxH61C9vC8yTPGpkT7pI6VIelAGDPFcG61K+SEJGYPLUt1JHcVQELxRTzszL5gKlj3+UYrrGUOhRhlSMEUhijaPy2RSh7EUDG2ilbK3B7RjP5VNSDAHsKWgQhplONNoASloHvRQAvakpaWgBMcUYpRS0ANop1GKAEope1JQAmKKfRgUAMxRTsCgCgBhx3quIvO1COUqBHCDt9yatFaAuPamBStU26nqBK4DspB9eKtvyhBJH0pwXmlpAYlzDPswu4b5F2Y9O+aurAy3ARg20HKup/nVwilxQBHLKYlyq7mPQVVjsQ0E/nnMtxyxHb0xV7bzmlwKAKNjPc+Y1pdRnzIx8so6OP8atqXM0gZAAPusO9PFLQAUUtFAEE8RmXZuKoeuO9Z15p6QvFLbIQHnRnRRxx3rXxRigClBayW93eXUjiR5iMBRjgVnavppvbCSWaIfKV2RKOgzW8BRQBnxQz2UyLEiyWrYwD96P/wCtVs22+dXaVuDkD0qbFGMUAZGl6e4sZY5ndG89yPUjNa0KeVCseSQowCadz1pelABSUUlAC0maKKAFU4NOplOBoAWijIooAKKKKACiikzQAtFFFACUlOpKAKWoW8lxAnlYEscgcE0kVqVuriVlyWwV/KruKWgCtp8TQW21xhmdmI9M1VggaEyq8Bb96zKc9jWpSUAVLWAxzTyFcK5BUelL5Tyz+Y/AT7inpmrdJQBShW4e9M06BNqbVAPX3q0ODTupoxQBEgkBcOwKk5X2FR3MTSBJIjiWM5U+o9KsEUgoAz72zkns5sHMjrTo7Fo2SUSkPtAbA6+1XaPrQBx3jfwmfENs17bALfQL8oH/AC0Hp9ap+BvGBmVdD1djHdxfJFI/G7H8J967zkHIrivGng3+1QdT0xdl9HyyLxvx3HvQM7fJBwadXnnhLx2XkGka8fKuUOxJnGM+ze9egZx3BB6EUCH0U0GnUAFZ+pxx3Crbznbb/flPr7VoUx40kxvUED1oAxNBAgluYbj5Z2IMZYY3R9qtasZUCrDI25vvIBkbe5q9JbwzsjSIGZPunuKlAG7OOcYzQBy+mrII43uA0tvLIVjlTqvPGfat64gEtrLEVLBlwQOpqxHDHEhRECqTnA6UpFAGJpMcL6lcXMLSBIkEKxueRVu+X7RdWkBXKh/Mf6CriwRpM8qIA743Ed6UqC27HNAHMSrFAI4gu2Q6hlRjqK2dVhkuYWtEjJEvBbP3asy28UxTzIwSjbgcdDUhzmgDn9IhuZB5sqoZbeZowfaugA4pkarHu2KBuOTj1p2aYDuKSkJzTSeKAHE0nU4FM3DBZiAo6knpXBeKvGzyO2kaFmW4c7WlTnHsKAJfGXipizaHpOZbmU7JHTt7Ctfwl4bTQNOBkAN7MMyt6e1UPBnhI6Qn9oaj+8v5OQDzs/8Ar12IHOaQD1GKdTaWgB1KKb3pwoAdThTRThQAtSKeKj71IvSkBIDTqYDTqAHVBcwiaJlPpUwoNAHNWJMN7JEeA1aRFQ6nbeTcR3KDjd81TZzTAj8tQ24KM5znFOIDEFgCR0JHIp1JQAEnrTdqgggAY6YFO7UYpgA5HPI96fxnOKYM5qQUCDjvTgRjFN70ozmgY7FGKUGlzQAgFKKOKWgBMUYp2KWkA3FJinUUwG4pMU6igBtFKaKAAUUlLQAYpKWikAUlL2ooASiiloAKSlpKACkpaO1ACUlLRigBKUHFJRQA7HHFJR0pevSgBKSlpKBhSYpaKAG4op1JigQlGKBS/WgBMUUtFACdqWjFFAwoooFAgxSgUlLQMKKM0lAhDSGlpOtACCilooAKcKSloAKWkooAWiiigAopaTvQAZooooAWikpaAFoxSUvegAxRil4pKAGkUYp1FADaKXtRjigBKWkpaAClopKAFxSYpaKAEopaSgApe1JRzQAtFJS0AFFJRQAUUUUAFLSUtACiikpaAAUdqTNFAC5pKKM0ALRSUZoAWkoooAWik6UUALS0lFAC0UlFAC0UlLQA2mmpKaRQA2ijmjnNACEUnQ8U7mkxQBzHijwZZeIommjAgvh92RRjd9a5Gw8S654KuF0/XLeSezBwrnkqPY16oRVe9srXU7Zre9gSaM9mHSgCHStZ0/WrYT6fcpKCOVz8y/UVezXm2o/Du90y5N94avHRgc+VuwaWx8farpMq2viOwcgceaq4P/16BnpWcmlrI07xLo2qKDa30RY/wOcGtUZxkYI9RQIdS8Uzd60m6gCSjPFM3Uu6gBaSm7uaTdQMdSEelN3UoNMQw5FN3GnuVjXdK6oo7scVgap4x0PTFIa5E0g6JFzQBtgk9BWdq3iDTNEhL3lwu/HEanLGuKn8UeJfEMph0WyaCE8b8c/nVnS/h6zzfatduWnlJyYwc/maAMy71rXvGs5tNMha3sicFhxx7muv8N+FLLw/CGAE12335mHT6Vt21tBZwrBbQrFEowFUYqbbQAAZ604UAUtIA/GnCm04UAOpRSCnUDFFOpo6U4fWkIdTlOBTB0p69KBj1p4qMH1p4oEOooFLQBFPEJoWjPcVmQElMH7ynaa2DWTIBFfsvRZOR9aaAf0FGOeadijHemA2inbaMUANxS0pFAoAWlptKKAFzSj3pBS0AL24pc03NLQA4GlzTaKQDs0UlHegAooozTAKKKKQBRRRQAlJS0lAC0UlLQAUUUUAFJS0UAJRS0lABxSUvaigBKKWjtQA2l6UUUAL1HvTaWncMPegBnFFLjFJQAUUUtAxO1FLSUAFFFFAB2oo9qKBCdaKWjFABRRRmgApKWloAZR3p1JQAmKKWgUAJigU6igAoopaAEFLRRQAUlLRQAlJS0UAFGaTFFAC5pc0lGaAHZozTfrRQA6kpKWgAopKKAFopKKAFooo7UAKKKQUtABSUtFACUUUUAFGaSgUALRSUUALSUUUALS5ptFADqKbS0ALRSUUALSUUUAFFFJQAtGaTjFFAC0tNzRQA6im0uaAFopKKAFpabS0ALmkoooAKBRQKADijFLx3pKAEK8daYVNSUUARcioLyytNRhMV5bpMp/vCre0U3bzQBwWpfC/T7lzLp1zJav2GeKzBoPjjw+c2F41zEv8O7PH0Nen4pckd6Bnmq+O/EmnfLqeilwOrKpFXIPipppwLqwuIT3xzXeNtcYdFcf7QzVG40bSrr/X6fbsT32UAYMXxJ8OSfellj+qVZHj/wANEf8AH6f++akm8F+HZuG09Bj+6cVCPAXhvPFif++jQAN8QfDS/wDL2x+imqkvxK8PpnZ50n0Wrv8Awg3h0f8ALjn/AIFVqLwtoMIAXTYePUZoA5iX4nIxxZ6VLJ6FjUDeKPGGp/JZab5Oeh2130NjY264gtIUx6IKshsDgAfQUxHmY8IeKdaO/VtRMSHqu7p+Fbuk/D/R9NYSTK11KO8nSusOaMetIBscccKCOGNY0HQKMUbc80/FHagBmOaUUtJ2oAO9Lmm0vSgBacKYOtPFADhTuKbTqBjqUU0U4dKQhwp4FNFOXpQA1TUq1EtSLQBKOlLSCloGIayNaDLGky9Uatg9Ko6hH5lq6+1NCI4XE0KuvRhmn44rN0mYqrW7feU5H0rVFMBmKMU/AzRikBGRRin7aTGKAGYoApxFJ2pgFLRxR2oAKKKKAFopPeloAWik7UtIAooooAKKOaKACiiloASiiigAoFFAoAWkNFFABRRRQAUlGaM0AFFANFABSdqKKADtRSUtABRRRQApPrSdqXqKSgBKWj6UUDCiilxQAlFGKX60CG0UvaigApKWkoAKKWigBKWiigBKKWigBKMUUUAFFFFAC0UUn1oAWlpKKACiiloASkp1JigBKKKKACiiigAooooAKMGiigA5opQaKAEope1FACUUd6KAFFLTaKAHdqKSigAooooAKKKSgAopaSgAGKKKKACilpKACl6UlFABRRRQAUtJRQAUdqBRQAlFLigigBKKKKAClpKUZoAOaKWigBM0ZoPFNJ9KAHZpe1MGaXNADqUU3NGeaAH8UlGaKACiikoAWikzS0AJijFLRQAzbSYp5FJQA3bRinUUDGYoxT6b0oEJikxT6Q0ANPWkNLSUALSUlFAAaTvS0lAB0pKWk70AKOtOFJThQA4dKcOlNFOAoGKKd0NNFL70gJBTl6VGKeDxQB//2Q=="); -// data = Base64Utils.decode(base64); -// System.out.println(data.length); -// fileManager.setImagFileName("buzhidap.jpg"); -// fileManager.setData(data); -//// int i = fileManager.saveImageFile(); -//// System.out.println(i); -// InputStream inputStreamById1 = ImageFileManager.getInputStreamById(2364); -// Image image1 = ImageIO.read(inputStreamById1); -// int width1 = image1.getWidth(null); -// int height1 = image1.getHeight(null); -// BufferedImage bufferedImage1 = new BufferedImage(width1, height1, BufferedImage.TYPE_INT_RGB); -// Graphics graphics1 = bufferedImage1.createGraphics(); -// graphics1.drawImage(image1, 0, 0, width1, height1, null); -// graphics1.dispose(); -// FileOutputStream fileOutputStream = new FileOutputStream(URLDecoder.decode("C:\\Users\\77449\\Desktop\\测试base64.jpg", "utf-8")); -// ImageIO.write(bufferedImage1, "jpg", fileOutputStream); -// fileOutputStream.close(); - } - - - @Test - public void test(){ - System.out.println("[" + WorkflowVersion.getVersionStringByWfid("45") + "]"); - } - - - @Test - public void testuplosd() throws IOException { - UploadByBase64Service uploadByBase64Service = new UploadByBase64Service(); - int i = uploadByBase64Service.uploadImage(null); - System.out.println(i); - InputStream inputStreamById1 = ImageFileManager.getInputStreamById(i); - Image image1 = ImageIO.read(inputStreamById1); - int width1 = image1.getWidth(null); - int height1 = image1.getHeight(null); - BufferedImage bufferedImage1 = new BufferedImage(width1, height1, BufferedImage.TYPE_INT_RGB); - Graphics graphics1 = bufferedImage1.createGraphics(); - graphics1.drawImage(image1, 0, 0, width1, height1, null); - graphics1.dispose(); - FileOutputStream fileOutputStream = new FileOutputStream(URLDecoder.decode("C:\\Users\\77449\\Desktop\\测试base64.jpg", "utf-8")); - ImageIO.write(bufferedImage1, "jpg", fileOutputStream); - fileOutputStream.close(); - } - - - @Test - public void testBatchUpdate(){ - ArrayList> objects = new ArrayList>(){{ - add(new LinkedHashMap(){{ - put("email","1@qq.com"); - }}); - add(new LinkedHashMap(){{ - put("email","2@qq.com"); - }}); - add(new LinkedHashMap(){{ - put("email","3@qq.com"); - }}); - add(new LinkedHashMap(){{ - put("email","4@qq.com"); - }}); - add(new LinkedHashMap(){{ - put("email","5@qq.com"); - }}); - }}; - ArrayList prepWheres = new ArrayList(){{ - add(Util.createPrepWhereImpl().whereAnd("id").whereEqual(22)); - add(Util.createPrepWhereImpl().whereAnd("id").whereEqual(23)); - add(Util.createPrepWhereImpl().whereAnd("id").whereEqual(24)); - add(Util.createPrepWhereImpl().whereAnd("id").whereEqual(25)); - add(Util.createPrepWhereImpl().whereAnd("id").whereEqual(26)); - }}; - - BatchSqlResultImpl batchSqlResult = Util.createSqlBuilder().updateBatchSql("hrmresource",objects, prepWheres); - RecordSet rs = new RecordSet(); - rs.executeBatchSql(batchSqlResult.getSqlStr(),batchSqlResult.getBatchList()); - } - - - @Test - public void testEntity() throws IntrospectionException, InvocationTargetException, IllegalAccessException { - TestVoItem testVoItem = new TestVoItem(); - testVoItem.setCurrency("currency"); - testVoItem.setLocalCurrency("localCurrency"); - testVoItem.setRate("1.22"); - BeanInfo beanInfo = Introspector.getBeanInfo(testVoItem.getClass(), Object.class); - PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors(); - for (PropertyDescriptor proper : propertyDescriptors) { - String name = proper.getName(); - Method readMethod = proper.getReadMethod(); - Object invoke = readMethod.invoke(testVoItem); - System.out.println(name); - System.out.println(invoke); - } - -// List entityFields = Util.getEntityFields(testVoItem.getClass()); -// System.out.println(entityFields); -// for (Field entityField : entityFields) { -// entityField.setAccessible(true); -// String name = entityField.getName(); -// System.out.println(name); -// System.out.println(String.valueOf(entityField.get(name))); -// } - } - - @Test - public void testByentity(){ - TestVoItem testVoItem = new TestVoItem(); - testVoItem.setCurrency("currency"); - testVoItem.setLocalCurrency("localCurrency"); - testVoItem.setRate("1.22"); - PrepSqlResultImpl testTable = Util.createSqlBuilder().insertSqlByEntity("testTable", testVoItem); - System.out.println(testTable.getSqlStr()); - System.out.println(testTable.getArgs()); - } - - -} diff --git a/customization/test/NewActionTest.java b/customization/test/NewActionTest.java deleted file mode 100644 index bd7b6be..0000000 --- a/customization/test/NewActionTest.java +++ /dev/null @@ -1,189 +0,0 @@ -package customization.test; - -import aiyh.utils.Util; -import aiyh.utils.entity.ApiConfigMainDTO; -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONObject; -import com.api.aiyh_kafang.dao.InvoiceMapping; -import com.api.aiyh_kafang.entity.UfInvoiceConfigDTO; -import com.api.aiyh_kafang.service.InvoiceService; -import com.api.aiyh_kafang.web.InvoiceController; -import com.api.aiyh_pcn.fadada.dao.FaDDServiceMapping; -import com.api.aiyh_pcn.fadada.entity.FaDaDaConfigDTO; -import com.api.aiyh_pcn.fadada.util.FaDDRequestUtils; -import com.cloudstore.dev.api.util.Util_DataCache; -import com.fasterxml.jackson.core.JsonProcessingException; -import org.junit.Test; -import weaver.aiyh_pcn.fadada.UploadFile2FaDDAction; -import weaver.soa.workflow.request.RequestInfo; -import weaver.workflow.request.RequestManager; - -import java.io.IOException; -import java.io.UnsupportedEncodingException; -import java.net.URLDecoder; -import java.nio.charset.StandardCharsets; -import java.util.*; - -/** - * @author EBU7-dev1-ayh - * @create 2021/10/21 0021 11:48 - * ce shi action - */ - -/*公司名 = 陕西正天建设有限公司 - creditNo = 916100007273444965 - 企业编号 = e23deb7a29714d0da5b806665ab3e2f8*/ - - -public class NewActionTest extends BaseTest { - - @Test - public void testAction() { - UploadFile2FaDDAction uploadFile2FaDDAction = new UploadFile2FaDDAction(); - RequestInfo requestInfo = new RequestInfo(); - requestInfo.setRequestid("68072"); - requestInfo.setWorkflowid("45"); - RequestManager requestManager = new RequestManager(); - requestManager.setBilltablename("formtable_main_17"); - requestInfo.setRequestManager(requestManager); - uploadFile2FaDDAction.setContractField("htwj"); - uploadFile2FaDDAction.execute(requestInfo); -// uploadFile2FaDDAction.signedContract(); - - } - - @Test - public void testContractStatus() throws JsonProcessingException { - Map data = new HashMap<>(); - data.put("contractNo", "7622cb620bc04e77b4e85950c564493b"); - Map stringObjectMap = FaDDRequestUtils.queryDetailContractStatus(data); - System.out.println(stringObjectMap); - } - - - @Test - public void getCode() throws UnsupportedEncodingException { - Map map = new HashMap<>(); - map.put("companyName", "陕西正天建设有限公司"); - map.put("creditNo", "916100007273444965"); - String s = FaDDRequestUtils.builderBizContent(map); - System.out.println(s); - byte[] decode = Base64.getDecoder().decode(s.getBytes(StandardCharsets.UTF_8)); - String decodeStr = new String(decode, "UTF-8"); - System.out.println(decodeStr); - String decode1 = URLDecoder.decode(decodeStr, "UTF-8"); - System.out.println(decode1); - JSONObject jsonObject = JSON.parseObject(decode1); - System.out.println(jsonObject); -// Map stringObjectMap = FaDDRequestUtils.checkCompanyInfo(map); -// System.out.println(JSON.toJSONString(stringObjectMap)); - } - - @Test - public void testDown() throws UnsupportedEncodingException { - FaDDServiceMapping faDDServiceMapping = new FaDDServiceMapping(); - FaDaDaConfigDTO faDaDaConfigDTO = faDDServiceMapping.queryConfig("45", 2); - System.out.println(JSONObject.toJSONString(faDaDaConfigDTO)); - ApiConfigMainDTO apiConfigMainDTO = Util.queryApiConfig(faDaDaConfigDTO.getParamsConfig()); -// System.out.println(JSONObject.toJSONString(apiConfigMainDTO)); -// FaDDController faDDController = new FaDDController(); -// faDDController.getAllVersion("45"); -// FaDDServiceImpl faDDService = new FaDDServiceImpl(); -// faDDService.queryContractStatus("45","68072"); -// faDDController.signedContract("45","68072"); -// Response response = faDDController.contractDownload("68072"); -// Response response1 = faDDController.contractDownload("68072"); -// System.out.println(response); -// System.out.println(response1); -// FaDDServiceImpl faDDService = new FaDDServiceImpl(); -// StreamingOutput contractZipStream = faDDService.contractDownload("68072"); -// Response build = Response.ok(contractZipStream) -// .type("application/zip") -// .header("Content-Disposition", "attachment;filename=contracts.zip").build(); -// System.out.println(build); -// String str = "public.docx"; -// System.out.println(str.substring(0,str.indexOf("."))); -// FaDDRequestUtils.downContract(ParaMap.create().put("contractNo","bc8485e3ce1343f5bc898325f371d739")); -// FaDDServiceImpl faDDService = new FaDDServiceImpl(); -// faDDService.queryContractStatus("45","68072"); - -// ModeDataIdUpdate modeDataIdUpdate = ModeDataIdUpdate.getInstance(); -// ModeRightInfo mr = new ModeRightInfo(); -// mr.rebuildModeDataShareByEdit(1, 11, Util.getIntValue("5"));//数据权限重构 - } - - - - - @Test - public void testCha() throws IOException { - List list = new ArrayList<>(); - List list_rm = new ArrayList<>(); - List list1 = new ArrayList<>(); - List list1_rm = new ArrayList<>(); - list.add("1"); - list.add("2"); - list.add("3"); - list.add("4"); - list.add("5"); - list.add("6"); - list.add("7"); - list.add("8"); - list1.add("2"); - list1.add("4"); - list1.add("6"); - list1.add("8"); - list1.add("10"); - list1.add("20"); - for (String s : list) { - for (String s1 : list1) { - if (s.equals(s1)) { - list_rm.add(s); - list1_rm.add(s1); - } - } - } - list.removeAll(list_rm); - list1.removeAll(list1_rm); -// Util_DataCache.setObjVal("list_123",list,20); - System.out.println(list); - System.out.println(list1); - } - - @Test - public void getCache() { - List list = (List) Util_DataCache.getObjVal("list_123"); - System.out.println(list); - } - - - - @Test - public void testInvoiceConfig() { - InvoiceMapping invoiceMapping = new InvoiceMapping(); - UfInvoiceConfigDTO configInfo = invoiceMapping.getConfigInfo("48"); - System.out.println(JSON.toJSONString(configInfo)); - } - - @Test - public void testIncoiceCheck(){ - Map testData = new HashMap<>(); - testData.put("requestId","171172"); - testData.put("workflowId","48"); - InvoiceService invoiceService = new InvoiceService(); - Map result = invoiceService.contrastInvoiceInfo(testData); - System.out.println(JSON.toJSONString(result)); - } - - @Test - public void testIncoiceCheckController(){ - Map testData = new HashMap<>(); - testData.put("requestId","171172"); - testData.put("workflowId","48"); - InvoiceController invoiceController = new InvoiceController(); - String result = invoiceController.check(null, null, testData); - System.out.println(result); - } - - -} diff --git a/customization/test/NewTest.java b/customization/test/NewTest.java deleted file mode 100644 index 1b7fdaf..0000000 --- a/customization/test/NewTest.java +++ /dev/null @@ -1,529 +0,0 @@ -package customization.test; - -import aiyh.utils.Util; -import aiyh.utils.entity.ApiConfigMainDTO; -import aiyh.utils.entity.FnainvoiceinterfaceDTO; -import aiyh.utils.httpUtil.HttpArgsType; -import aiyh.utils.httpUtil.ResponeVo; -import aiyh.utils.httpUtil.util.HttpUtils; -import aiyh.utils.mapUtil.UtilLinkedHashMap; -import aiyh.utils.sqlUtil.sqlResult.impl.BatchSqlResultImpl; -import aiyh.utils.sqlUtil.sqlResult.impl.PrepSqlResultImpl; -import aiyh.utils.sqlUtil.whereUtil.Where; -import aiyh.utils.sqlUtil.whereUtil.impl.PrepWhereImpl; -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONObject; -import com.api.aiyh_pcn.fadada.dao.FaDDServiceMapping; -import com.api.aiyh_pcn.fadada.service.impl.FaDDServiceImpl; -import com.api.aiyh_pcn.fadada.util.FaDDRequestUtils; -import com.api.aiyh_pcn.patentWall.vo.LinkUrlVO; -import com.weaver.general.TimeUtil; -import org.apache.axiom.util.base64.Base64Utils; -import org.apache.commons.codec.binary.Hex; -import org.apache.http.HttpEntity; -import org.apache.poi.ss.usermodel.Row; -import org.apache.poi.ss.usermodel.Sheet; -import org.apache.poi.xssf.streaming.SXSSFWorkbook; -import org.junit.Test; -import weaver.conn.RecordSet; -import weaver.file.ImageFileManager; -import weaver.formmode.data.ModeDataIdUpdate; -import weaver.formmode.setup.ModeRightInfo; -import weaver.general.xcommon.IOUtils; -import weaver.hrm.User; -import weaver.soa.workflow.FileProcessor; -import weaver.workflow.workflow.WorkflowVersion; - -import java.beans.BeanInfo; -import java.beans.IntrospectionException; -import java.beans.Introspector; -import java.beans.PropertyDescriptor; -import java.io.*; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.net.URLEncoder; -import java.nio.charset.StandardCharsets; -import java.security.MessageDigest; -import java.security.NoSuchAlgorithmException; -import java.util.*; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.atomic.AtomicReference; -import java.util.function.Function; -import java.util.function.Predicate; -import java.util.regex.Matcher; -import java.util.regex.Pattern; -import java.util.stream.Collectors; - -/** - * @author EBU7-dev1-ayh - * @create 2021/9/30 0030 12:50 - * xinceshilei - */ - - -public class NewTest extends BaseTest { - - public static Predicate distinctByKey(Function keyExtractor) { - Map seen = new ConcurrentHashMap<>(); -// putIfAbsent添加不存在的键,返回null,如果为null表示不重复 - return t -> seen.putIfAbsent(keyExtractor.apply(t), Boolean.TRUE) == null; - } - - public static String string2SHA256(String str) { - MessageDigest messageDigest; - String encdeStr = ""; - try { - messageDigest = MessageDigest.getInstance("SHA-256"); - byte[] hash = messageDigest.digest(str.getBytes(StandardCharsets.UTF_8)); - encdeStr = Hex.encodeHexString(hash); - } catch (NoSuchAlgorithmException e) { - e.printStackTrace(); - } - return encdeStr.toUpperCase(); - } - - @Test - public void testNewSQL() { - String sql = "select * from workflow_base"; - RecordSet rs = new RecordSet(); - rs.executeQuery(sql); - List> maps = Util.recordSet2MapList(rs); - System.out.println(maps); - System.out.println("jiehus"); - } - - @Test - public void test() { - String versionStringByWfid = WorkflowVersion.getVersionStringByWfid("45"); - System.out.println(versionStringByWfid); - } - - @Test - public void createJavaFile() throws IOException { - String query = ""; - /*query = "select main.id,main.workflow_type, wf.fieldname field_control, " + - "(select GROUP_CONCAT('',selectvalue,'') result from workflow_selectitem where FIND_IN_SET(id,main.check_personal)) check_personal, " + - "(select GROUP_CONCAT('',selectvalue,'') result from workflow_selectitem where FIND_IN_SET(id,main.check_enterprise)) check_enterprise, " + - "main.check_source_type,wdt.tablename check_source " + - "from uf_attestation_conf main " + - "left join workflow_field_table_view wf on wf.id = main.field_control " + - "left join workflow_detail_table_view wdt on wdt.id = main.check_source and wdt.workflow_id = main.workflow_type"; - query = "select dt.id,dt.line_num,dt.param_name,dt.param_type,dt.object_child,dt.parent_line,dt.change_rule, " + - "dt.param_value,wf.fieldname workflow_field,wf.tablename tablename,dt.array_sql,dt.api_type " + - "from uf_attestation_conf_dt1 dt " + - "left join workflow_field_table_view wf on wf.id = dt.workflow_field "; - */ - /*query = "select dt.id,dt.line_num,dt.param_name,dt.param_type,dt.object_child,dt.parent_line,dt.change_rule, " + - "dt.param_value,wf.fieldname workflow_field,wf.tablename tablename,dt.array_sql " + - "from uf_api_param_config_dt1 dt " + - "left join workflow_field_table_view wf on wf.id = dt.workflow_field "; - Util.creatJavaFileBySql(query, "ApiConfigDetail", "aiyh.utils.entity"); - query = "select id,workflow_type,api_url,api_name from uf_api_param_config "; - Util.creatJavaFileBySql(query, "ApiConfigMain", "aiyh.utils.entity");*/ - /*query = "select main.id,main.workflow_type,main.api_type, main.params_config, " + - "wf.fieldname field_control, " + - "(select GROUP_CONCAT('',selectvalue,'') selectvalue from workflow_selectitem where FIND_IN_SET(id,main.check_personal)) check_personal, " + - "(select GROUP_CONCAT('',selectvalue,'') selectvalue from workflow_selectitem where FIND_IN_SET(id,main.check_enterprise)) check_enterprise, " + - "main.check_source_type,wdt.tablename check_source " + - "from uf_contract_config main " + - "left join workflow_field_table_view wf on wf.id = main.field_control " + - "left join workflow_detail_table_view wdt on wdt.id = main.check_source and wdt.workflow_id = main.workflow_type ";*/ - - query = "select * from uf_multi_language_dt1"; - Util.creatJavaFileBySql(query, "MultiLanguage", "aiyh.utils.entity"); - } - - @Test - public void testQueryConf() { - FaDDServiceMapping faDDServiceMapping = new FaDDServiceMapping(); -// FaDDConfigMainDTO configParam = faDDServiceMapping.getConfigParam("45"); -// System.out.println(JSON.toJSONString(configParam)); - } - - @Test - public void testSubString() { - String str = "formtable_main_17_dt1"; - System.out.println(str.substring(str.indexOf("_dt") + 3)); - } - - @Test - public void pattern() { - String str = "流程的requestid{{$requestId}}流程路径的{{$workflowid}}我不知道{{main.test}}对不对,{{detail.field}}"; - String pattern = "\\{{2}(?((?!\\$)\\S)+?)\\.(?\\S+?)}{2}"; - String pattern1 = "\\{{2}\\$(?(\\S)+?)}{2}"; - Pattern compile1 = Pattern.compile(pattern1); - Matcher matcher1 = compile1.matcher(str); -// while (matcher1.find()){ -// str = str.replaceFirst(pattern1,matcher1.group("value")); -// System.out.println(str); -// System.out.println(matcher1.group("value")); -// } - Pattern compile = Pattern.compile(pattern); - Matcher matcher = compile.matcher(str); - while (matcher.find()) { - System.out.println(matcher.group("table")); - System.out.println(matcher.group("field")); - } - System.out.println(matcher); - } - - @Test - public void testParsingSql() { - Map params = new HashMap<>(); - params.put("requestId", "67544"); - params.put("workflowId", "45"); - params.put("main.field", null); - params.put("main.field1", "field1"); - params.put("main.field2", "field2"); - params.put("main.field3", "field3"); - String map = Util.parsingSq("select * from maintable where " + - "test1 = {{main.field1}} and " + - "test2 = {{main.field2}} and " + - "test3 = {{main.field}} and " + - "test4 = {{main.field1}} and " + - "test5 = {{main.field3}}", params); - System.out.println(map); - } - - @Test - public void testParsingSqlByWorkflowId() { - Map params = new HashMap<>(); - params.put("requestId", "67544"); - params.put("workflowId", "45"); - params.put("main.field", "field"); - params.put("main.field1", "field1"); - params.put("main.field2", "field2"); - params.put("main.field3", "field3"); - params.put("main.indata", "1,2,3,4,5,6"); - String result = "select * from maintable where " + - "test1 = {{main.field1}} and " + - "test2 = {{main.field2}} and " + - "test3 = {{main.field}} and " + - "test4 = {{main.field1}} and " + - "test5 = {{main.field3}} and " + - "id in (#{{main.indata}})"; - String s = Util.parsingSq(result, params); - System.out.println(s); - - } - - @Test - public void testImp() { - FaDDServiceImpl faDDService = new FaDDServiceImpl(); -// Map configParam1 = faDDService.getConfigParam1("45"); -// System.out.println(JSON.toJSONString(configParam1)); -// Map configParam = faDDService.getConfigParam("45"); -// System.out.println(JSON.toJSONString(configParam)); -// Map map = new HashMap<>(); -// map.put("workflowId","45"); -// map.put("dataArr",new ArrayList(){{ -// TableFieldMappingVO tableFieldMappingVO = new TableFieldMappingVO(); -// tableFieldMappingVO.setField("field"); -// tableFieldMappingVO.setTableName("tableName"); -// add(tableFieldMappingVO); -// TableFieldMappingVO tableFieldMappingVO1 = new TableFieldMappingVO(); -// tableFieldMappingVO1.setField("field1"); -// tableFieldMappingVO1.setTableName("tableName1"); -// add(tableFieldMappingVO1); -// }}); -// faDDService.checkCertification(map); - - Map map = new HashMap<>(); - List> dataArr = new ArrayList>() {{ - Map map = new HashMap<>(); - map.put("detail_1.gyshtfmczw", "gyshtfmczw-value-api"); - map.put("detail_1.tyshxydm", "gyshtflb-value-api"); - add(map); - Map map1 = new HashMap<>(); - map1.put("detail_1.gyshtfmczw", "gyshtfmczw1-value-api"); - map1.put("detail_1.tyshxydm", "gyshtflb1-value-api"); - add(map1); - Map map2 = new HashMap<>(); - map2.put("detail_1.gyshtfmczw", "gyshtfmczw2-value-api"); - map2.put("detail_1.tyshxydm", "gyshtflb2-value-api"); - add(map2); - Map map3 = new HashMap<>(); - map3.put("detail_1.gyshtfmczw", "gyshtfmczw3-value-api"); - map3.put("detail_1.tyshxydm", "gyshtflb3-value-api"); - add(map3); - Map map4 = new HashMap<>(); - map4.put("detail_1.gyshtfmczw", "gyshtfmczw4-value-api"); - map4.put("detail_1.tyshxydm", "gyshtflb4-value-api"); - add(map4); - }}; - map.put("dataArr", dataArr); - map.put("workflowId", "45"); - Map stringObjectMap = faDDService.checkCertification(map); -// faDDService.checkCertification1(map); - System.out.println(stringObjectMap); - } - - @Test - public void testMap() { - List list = new ArrayList() {{ - add("测试"); - add("测试1"); - add("测试2"); - add("测试3"); - add("测试4"); - add("测试"); - }}; - List collect = list.stream().map(item -> item + "[aaa]").collect(Collectors.toList()); - System.out.println(collect); - System.out.println(list); - } - - @Test - public void testHttp() throws UnsupportedEncodingException { - HttpUtils httpUtils = new HttpUtils(); - Map header = httpUtils.getGlobalCache().header; - header.put("appId", "100001"); - header.put("signType", "SHA256"); - header.put("timestamp", Util.getTime("yyyy-MM-dd HH:mm:ss")); - Map data = new HashMap<>(); - data.put("companyName", "公司名称"); - data.put("creditNo", "统一社会信用代码"); - String jsonString = JSONObject.toJSONString(data); - String encode = URLEncoder.encode(jsonString, "UTF-8"); - String bizContent = Base64.getEncoder().encodeToString(encode.getBytes(StandardCharsets.UTF_8)); - header.put("bizContent", bizContent); - StringBuilder signBuilder = new StringBuilder(); - String signStr = signBuilder.append("appId=").append(header.get("appId")) - .append("&bizContent=").append(header.get("bizContent")) - .append("&signType=").append(header.get("signType")) - .append("×tamp=").append(header.get("timestamp")).toString(); - System.out.println(signStr); - String appkey = "L7P59oqA2An0XgJ1LeMN0fRu1"; - String sha256 = string2SHA256(signStr) + appkey; - String sign = Base64.getEncoder().encodeToString(string2SHA256(sha256).getBytes(StandardCharsets.UTF_8)); - System.out.println(sign); - header.put("sign", sign); - header.put("apikey", "TulQxnZSRKeHoQfmeZzOUzGn6KpTDkDK"); - header.put("Content-Type", HttpArgsType.APPLICATION_JSON); - try { - ResponeVo responeVo = httpUtils.apiPost("http://apigwaws-lite.porsche-cloudservice.com/env-101/econtract/econtract/contract/api/v1/account/company/info", - data, null); - System.out.println(responeVo.getEntityString()); - } catch (IOException e) { - e.printStackTrace(); - } - } - - @Test - public void testApi() { - - ApiConfigMainDTO apiConfigMainDTO = Util.queryApiConfig("2"); - } - - - @Test - public void getCode() { - Map map = new HashMap<>(); - map.put("companyName", "陕西正天建设有限公司"); - map.put("creditNo", "916100007273444965"); - Map stringObjectMap = FaDDRequestUtils.checkCompanyInfo(map); - System.out.println(JSON.toJSONString(stringObjectMap)); - } - - - @Test - public void testBatch() { - List> list = new ArrayList<>(); - List whereList = new ArrayList<>(); - for (int i = 0; i < 50; i++) { - int finalI = i; - list.add(new UtilLinkedHashMap() {{ - put("mobile", "1111111" + finalI); - }}); - whereList.add(new PrepWhereImpl().whereAnd("id").whereEqual(22 + finalI)); - } - BatchSqlResultImpl hrmresource = Util.createSqlBuilder().updateBatchSql("hrmresource", list, whereList); - RecordSet rs = new RecordSet(); - long l = System.currentTimeMillis(); - boolean b = rs.executeBatchSql(hrmresource.getSqlStr(), hrmresource.getBatchList()); - long l1 = System.currentTimeMillis(); - System.out.println(l1 - l); - System.out.println(b); - } - - @Test - public void testUpdate() { - long constTime = 0L; - RecordSet rs = new RecordSet(); - for (int i = 0; i < 50; i++) { - int finalI = i; - UtilLinkedHashMap mobile = new UtilLinkedHashMap() {{ - put("mobile", "111111" + finalI); - }}; - Where id = new PrepWhereImpl().whereAnd("id").whereEqual(22 + finalI); - PrepSqlResultImpl sqlResult = Util.createSqlBuilder().updateSql("hrmresource", mobile, id); - long l = System.currentTimeMillis(); - boolean b = rs.executeUpdate(sqlResult.getSqlStr(), sqlResult.getArgs()); - long l1 = System.currentTimeMillis(); - constTime += (l1 - l); - System.out.println(b); - } - System.out.println(constTime); - } - - - @Test - public void testSuffix() { - String str = "【保时捷】合同管理需求文档-第一阶段流程V5.3.pdf"; - String substring = str.substring(str.lastIndexOf(".")); - System.out.println(substring); - } - - - @Test - public void testUpload() { - RecordSet rs = new RecordSet(); - String query = "select * from formtable_main_17_dt1 where mainid = 5"; - rs.executeQuery(query); - List> maps = Util.recordSet2MapList(rs); - System.out.println(JSONObject.toJSONString(maps)); -// Map map = Util.queryLanguage(1, 8); -// System.out.println(map); - - } - - @Test - public void invoice() throws IOException { - String query = "select * from fnainvoiceinterface where interfaceType=2 and status=1 and subIdStatus=0"; - RecordSet rs = new RecordSet(); - rs.executeQuery(query); - FnainvoiceinterfaceDTO fnainvoiceinterfaceDTO = Util.recordeSet2Entity(rs, FnainvoiceinterfaceDTO.class); - System.out.println(fnainvoiceinterfaceDTO); -// Util.creatJavaFileByTable("fnainvoiceinterface","aiyh.utils.entity"); - } - - - @Test - public void testLanguage() { - System.out.println(Util.getHtmlLabelName(1, 7, "不知道")); - } - - @Test - public void createJava() throws IOException { - Util.creatJavaFileByTable("uf_invoice_config", "com.api.aiyh_kafang.entity"); - } - - @Test - public void testUtil() { - RecordSet rs = new RecordSet(); - rs.executeQuery("select formid from workflow_base where id = 45"); - String s = Util.recordeSet2Entity(rs, String.class); - System.out.println(s); - } - - - @Test - public void testMode() { - ModeDataIdUpdate mdu = ModeDataIdUpdate.getInstance(); - String formModeId = "52"; - int dataid = mdu.getModeDataNewId("uf_contract_config", - Util.getIntValue(formModeId, -1), - 1, 0, TimeUtil.getCurrentDateString(), - TimeUtil.getOnlyCurrentTimeString()); - //数据权限重构 - ModeRightInfo mri = new ModeRightInfo(); - mri.rebuildModeDataShareByEdit(1, Util.getIntValue(formModeId, -1), 1); - - } - - @Test - public void donwTest() throws IOException { - Map data = new HashMap<>(); - data.put("contractNo", "bda970602f4a4e1dbe37ee9c43908cfc"); - AtomicReference content = new AtomicReference<>(); - FaDDRequestUtils.downContract(data, response -> { - HttpEntity entity = response.getEntity(); - if (response.getStatusLine().getStatusCode() != 200) { - throw new RuntimeException("法大大请求接口错误!"); - } - try { - content.set(entity.getContent()); - } catch (IOException e) { - e.printStackTrace(); - } - InputStream inputStream = content.get(); - try { - byte[] bytes = IOUtils.toByteArray(inputStream); - } catch (IOException e) { - e.printStackTrace(); - } - }, "https://apigwaws-lite.porsche-cloudservice.com/env-101/econtract/econtract/contract/api/v1/contract/download"); - } - - - @Test - public void testBase642system() throws IOException { - String path = "C:\\Users\\77449\\Downloads\\154157.pdf"; - InputStream is = new FileInputStream(path); - byte[] bytes = IOUtils.toByteArray(is); - String base64 = Base64Utils.encode(bytes); - FileProcessor fileProcessor = new FileProcessor(); - User user = new User(); - user.setUid(1); - user.setLogintype("1"); - int process = fileProcessor.Process("base64:"+base64, ",,88", user, "测试合同下载保存.pdf"); - System.out.println(process); - } - - @Test - public void downPDF() throws IOException { - InputStream inputStreamById = ImageFileManager.getInputStreamById(3618); - OutputStream out = new FileOutputStream("C:\\Users\\77449\\Downloads\\154157合同测试.pdf"); - int cache = 1024 * 10; - byte[] bytes = new byte[cache]; - int len = 0; - while ((len = inputStreamById.read(bytes)) != -1){ - out.write(bytes,0,len); - } - out.flush(); - out.close(); - } - - - @Test - public void testDocCategorys(){ - String docCategorys = Util.getDocCategorys("47","khpj"); - System.out.println(docCategorys); - } - - @Test - public void testToint(){ - List docIds = new ArrayList<>(); - docIds.add(1); - docIds.add(2); - docIds.add(3); - docIds.add(4); - Integer[] strings = docIds.toArray(new Integer[0]); - int[] ints = Arrays.stream(strings).mapToInt(Integer::valueOf).toArray(); - System.out.println(Arrays.toString(ints)); - } - - @Test - public void tesetLong() throws NoSuchMethodException, InvocationTargetException, IllegalAccessException, IntrospectionException { - LinkUrlVO linkUrlVO = new LinkUrlVO(); - String linkUrl = "linkUrl"; - BeanInfo beanInfo = Introspector.getBeanInfo(LinkUrlVO.class,Object.class); - PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors(); - for (PropertyDescriptor propertyDescriptor : propertyDescriptors) { - System.out.println(propertyDescriptor.getName()); - if (propertyDescriptor.getPropertyType().equals(Integer.class)){ - propertyDescriptor.getWriteMethod().invoke(linkUrlVO,1); - }else{ - propertyDescriptor.getWriteMethod().invoke(linkUrlVO,propertyDescriptor.getName()); - } - } -// Class aClass = linkUrlVO.getClass(); -// Method method = aClass.getMethod("set" + linkUrl.substring(0, 1).toUpperCase() + linkUrl.substring(1)); -// method.invoke(linkUrlVO,"https://baidu.com"); - System.out.println(linkUrlVO); - } - -} - - - diff --git a/customization/test/NewUtilTest.java b/customization/test/NewUtilTest.java deleted file mode 100644 index 8e04ce4..0000000 --- a/customization/test/NewUtilTest.java +++ /dev/null @@ -1,425 +0,0 @@ -package customization.test; - -import aiyh.utils.LabelHtmlUtils; -import aiyh.utils.Util; -import aiyh.utils.entity.LabelHtmlIndex; -import aiyh.utils.fileUtil.ProperUtil; -import com.alibaba.fastjson.JSON; -import com.api.aiyh_pcn.patentWall.service.PatentWallService; -import com.api.aiyh_pcn.patentWall.vo.PatentVO; -import com.api.aiyh_pcn.patentWall.vo.SearchInputVO; -import com.cloudstore.dev.api.bean.MessageBean; -import com.cloudstore.dev.api.bean.MessageType; -import com.cloudstore.dev.api.util.Util_Message; -import org.junit.AfterClass; -import org.junit.Before; -import org.junit.Test; -import weaver.common.util.string.StringUtil; -import weaver.general.GCONST; - -import java.io.*; -import java.nio.charset.Charset; -import java.util.*; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -/** - * @author EBU7-dev1-ayh - * @create 2021/11/29 0029 10:16 - */ - - -public class NewUtilTest { - @Before - public void before() throws Exception { - GCONST.setServerName("ecology"); - GCONST.setRootPath("H:\\e-cology-dev\\web\\"); - } - - @AfterClass - public static void after() { - System.out.println("单元测试结束!"); - } - - - @Test - public void testKey() { - String key = "aiyh.patent.config[11].public"; - String pattern = "^(aiyh.patent\\.)(?(\\w+))$"; - String pattern1 = "^(aiyh.patent\\.)(?(?(\\w+))\\.(\\S)+(?!\\[))"; - String pattern2 = "^(aiyh.patent\\.)(?(\\w+))(\\[([0-9])+])$"; - String pattern3 = "^(aiyh.patent\\.)(?(\\w+))(\\[(?([0-9])+)])\\.(?(\\S)+)$"; - Pattern compile = Pattern.compile(pattern); - Matcher matcher = compile.matcher(key); - while (matcher.find()) { - System.out.println("单一值"); - System.out.println(matcher.group("key")); - } - - compile = Pattern.compile(pattern2); - matcher = compile.matcher(key); - while (matcher.find()) { - System.out.println("数组"); - System.out.println(matcher.group("key")); - } - - compile = Pattern.compile(pattern3); - matcher = compile.matcher(key); - while (matcher.find()) { - System.out.println("对象数组"); - System.out.println(matcher.group("key")); - System.out.println(matcher.group("objKey")); - System.out.println(matcher.group("index")); - } - - compile = Pattern.compile(pattern1); - matcher = compile.matcher(key); - while (matcher.find()) { - System.out.println("多个"); - System.out.println(matcher.group("key")); - System.out.println(matcher.group("objKey")); - } - } - - @Test - public void testGetPro() { - String key = "aiyh.patent.config[0]"; - String prefix = "aiyh.patent"; - String value = "第一个元素"; - getPro(prefix, key, value); - } - - - public void getPro(String prefix, String key, Object value) { - Map result = new HashMap<>(); -// result = keyHandler(prefix, key, value, result); - String key2 = "aiyh.patent.config[1]"; -// result = keyHandler(prefix, key2, "第二个元素", result); - System.out.println(JSON.toJSONString(result)); - } - - @Test - public void redPro() { - String fileName = "test"; - String prefix = "aiyh.patentWall"; - Map result = Util.readProperties2Map(fileName, prefix); - System.out.println(JSON.toJSONString(result)); - } - - public Map getProperties2Map(String fileName, String prefix) { - String propertyPath = GCONST.getPropertyPath(); - if (StringUtil.isNullOrEmpty(fileName)) { - return null; - } - if (fileName.contains(".properties")) { - fileName.replace(".properties", ""); - } - String path = propertyPath + "prop2map" + File.separator + fileName + ".properties"; - ProperUtil prop = new ProperUtil(); - Map map = new HashMap<>(); - InputStream inputStream = null; - try { - inputStream = new BufferedInputStream(new FileInputStream(path)); - prop.load(inputStream); -// Enumeration enumeration = prop.propertyNames(); -// 顺序读取 - Enumeration enumeration = prop.keys(); - while (enumeration.hasMoreElements()) { - String key = (String) enumeration.nextElement(); - String value = prop.getProperty(key); - System.out.println(key); - keyHandler(prefix, key, value, map); - ; - } - } catch (IOException e) { - throw new RuntimeException("找不到文件:" + path); - } finally { - try { - if (inputStream != null) { - inputStream.close(); - } - } catch (IOException e) { - e.printStackTrace(); - } - } - return map; - } - - - public Map keyHandler(String prePrefix, String key, Object value, Map preResult) { - String objRegex = "^(" + prePrefix + "\\.)(?(\\w+))$"; - Pattern compile = Pattern.compile(objRegex); - Matcher matcher = compile.matcher(key); - if (matcher.find()) { -// 只匹配前缀.key=value模式的 - String resultKey = matcher.group("key"); - preResult.put(resultKey, prop2MapPutValue(value)); - } - String moreKey = "^(" + prePrefix + "\\.)(?(?(\\w+))\\.(\\S)+(?!\\[))"; - compile = Pattern.compile(moreKey); - matcher = compile.matcher(key); - if (matcher.find()) { -// 匹配前缀.key1.key2=value模式的 - String objKey = matcher.group("objKey"); - String prefixStr = prePrefix + "." + objKey; - Map valueMap; - if (preResult.containsKey(objKey)) { - valueMap = (Map) preResult.get(objKey); - keyHandler(prefixStr, key, value, valueMap); - return null; - } - valueMap = new HashMap<>(); - keyHandler(prefixStr, key, value, valueMap); - preResult.put(objKey, valueMap); - return null; - } - String strList = "^(" + prePrefix + "\\.)(?(\\w+))(\\[(?([0-9])+)])$"; - compile = Pattern.compile(strList); - matcher = compile.matcher(key); - if (matcher.find()) { -// 匹配前缀.key[0]=value模式的 - String objKey = matcher.group("key"); - int index = Integer.parseInt(matcher.group("index")); - if (preResult.containsKey(objKey)) { -// 存在值 - List valueList = (List) preResult.get(objKey); - if (index >= valueList.size()) { - valueList.add(prop2MapPutValue(value)); - } else { - valueList.set(index, prop2MapPutValue(value)); - } - return null; - } - List valueList = new ArrayList<>(); - valueList.add(prop2MapPutValue(value)); - preResult.put(objKey, valueList); - return null; - } - String objArray = "^(" + prePrefix + "\\.)(?(\\w+))(\\[(?([0-9])+)])\\.(?(\\S)+)$"; -// String objArray = "^("+prePrefix+"\\.)(?(\\w+))(\\[(?([0-9])+)])(\\.(?(\\S)+))+"; - compile = Pattern.compile(objArray); - matcher = compile.matcher(key); - if (matcher.find()) { -// 匹配前缀.key[0].name=value的模式 - String arrKey = matcher.group("arrKey"); - String objKey = matcher.group("objKey"); - int index = Integer.parseInt(matcher.group("index")); - List> mapList; - if (preResult.containsKey(arrKey)) { -// 存在 - mapList = (List>) preResult.get(arrKey); -// mapList - Map valueMap; - if (index >= mapList.size()) { - valueMap = new HashMap<>(); - valueMap.put(objKey, prop2MapPutValue(value)); - mapList.add(valueMap); - return null; - } - valueMap = mapList.get(index); - String arrMoreKey = "(?(\\w+))\\.(\\S)+(?!\\[)"; - Pattern arrMoreKeyCompile = Pattern.compile(arrMoreKey); - Matcher arrMoreKeyMatcher = arrMoreKeyCompile.matcher(objKey); - if (arrMoreKeyMatcher.find()) { - String arrMoreObjKey = arrMoreKeyMatcher.group("key"); - Map arrMoreValue; - if (valueMap.containsKey(arrMoreObjKey)) { - arrMoreValue = (Map) valueMap.get(arrMoreObjKey); - keyHandler(arrMoreObjKey, objKey, value, arrMoreValue); - return null; - } - arrMoreValue = new HashMap<>(); - keyHandler(arrMoreObjKey, objKey, value, arrMoreValue); - valueMap.put(arrMoreObjKey, arrMoreValue); - return null; - } - arrMoreKey = "(?(\\w+))(\\[(?([0-9])+)])$"; - arrMoreKeyCompile = Pattern.compile(arrMoreKey); - arrMoreKeyMatcher = arrMoreKeyCompile.matcher(objKey); - if (arrMoreKeyMatcher.find()) { - String arrMoreArrKey = arrMoreKeyMatcher.group("key"); - int arrMoreIndex = Integer.parseInt(arrMoreKeyMatcher.group("index")); - List arrMoreListValue; - if (valueMap.containsKey(arrMoreArrKey)) { -// 存在值 - arrMoreListValue = (List) valueMap.get(arrMoreArrKey); - if (arrMoreIndex >= arrMoreListValue.size()) { - arrMoreListValue.add(prop2MapPutValue(value)); - } else { - arrMoreListValue.set(arrMoreIndex, prop2MapPutValue(value)); - } - return null; - } - arrMoreListValue = new ArrayList<>(); - arrMoreListValue.add(prop2MapPutValue(value)); - valueMap.put(arrMoreArrKey, arrMoreListValue); - return null; - } - -// 直接添加 - valueMap.put(objKey, prop2MapPutValue(value)); - return null; - } -// 不存在 - mapList = new ArrayList<>(); - Map valueMap = new HashMap<>(); - valueMap.put(objKey, prop2MapPutValue(value)); - mapList.add(valueMap); - preResult.put(arrKey, mapList); - } - return null; - } - - public Object prop2MapPutValue(Object value) { - if (value == null) { - return null; - } - String valueStr = String.valueOf(value).trim(); - if (valueStr.startsWith("\"") && valueStr.endsWith("\"")) { - return valueStr.substring(1, valueStr.length() - 1); - } - if (valueStr.contains(",")) { - return valueStr.split(","); - } - return value; - } - - @Test - public void testSubstr() { - System.out.println("\"这个是文本框\"".trim().substring(1, "\"这个是文本框\"".trim().length() - 1)); - } - - @Test - public void testSplit() { - String str = "12,343,89\\,99"; - String str1 = "abcd'efg'hig?'klmn"; - String[] data = str1.split("(?(\\w*|\\W*|[\\u4e00-\\u9fa5]*))(`~`)"; - Pattern compile = Pattern.compile(pattern); - Matcher matcher = compile.matcher(selectName); - if (matcher.find()) { - showName = matcher.group("lable"); - } - } - System.out.println(showName); - } - - @Test - public void testPatentServer() { - PatentWallService patentWallService = new PatentWallService(); - List inputList = patentWallService.getSearchList("patentWall", 8); - System.out.println(JSON.toJSONString(inputList)); - List patentWallList = patentWallService.getList(null, "patentWall"); - System.out.println(JSON.toJSONString(patentWallList)); - } - - @Test - public void testRegx() { - String pattern = "\\$\\{(?(\\s|\\S)+?)}"; - Pattern compile = Pattern.compile(pattern); - Matcher matcher = compile.matcher("${id}"); - if (matcher.find()) { - System.out.println(matcher.group("field")); - } - } - - - @Test - public void testSplic() { - List list = new ArrayList<>(); - list.add(0); - list.add(1); - list.add(2); - list.add(3); - list.add(4); - list.add(5); - list.add(6); - System.out.println(list); - System.out.println(list.subList(0, 2)); - list.removeAll(list.subList(0, 2)); - System.out.println(list); - } - - - @Test - public void test() { - String bizContent = "{\"contractExtension\":\".pdf\",\"contractTitle\":\"PCN Template - Non-Disclosure Agreement (Corporate).pdf\",\"uploadType\":1,\"customerNo\":\"ecef845ba95a409393cb66271a41b0a6\"}"; - System.out.println(cn.hutool.core.util.URLUtil.encodeAll(bizContent, Charset.forName("UTF-8"))); - } - - - @Test - public void testReg() { - String var15 = " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - "

< img alt=\"\" src=\"/weaver/weaver.file.FileDownload?fileid=acdde79d8027d30e809be35a885a28eb184a3d7609b33666049ac12a48c5c8c3c10908eae8d1f6d650bfffce6db986fb5069726005eaf18c1\" />

\n" + - " \n" + - " \n" + - " "; - - ArrayList var17 = Util.matchAll(var15, "/weaver/weaver.file.FileDownload\\?fileid=([a-z0-9]+)", 1, 1); - - System.out.println(var17.size()); - System.out.println(var17); - } - - - @Test - public void testMessage() { - Set userIdList = new HashSet<>(); //接收人id - userIdList.add("22"); - userIdList.add("1"); - String linkUrl = "/spa/cube/index.html#/main/cube/search?customid=36"; //PC端链接 - String linkMobileUrl = ""; //移动端链接 - String title = "我是标题淦"; - String context = "我是内容啊啊啊"; - try { - MessageBean messageBean = Util_Message.createMessage(MessageType.newInstance(1146), userIdList, title, context, linkUrl, linkMobileUrl); - messageBean.setCreater(1);//创建人id - Util_Message.store(messageBean); - } catch (IOException e) { - e.printStackTrace(); - } - } - - @Test - public void testGetTime() { - System.out.println(System.currentTimeMillis()); - System.out.println(System.currentTimeMillis()); - } - - - @Test - public void testPro() { - LabelHtmlUtils labelHtmlUtils = new LabelHtmlUtils("aiyh.htmlLabel.porsche"); - Map faDDContractController = labelHtmlUtils.getHtmlLabelMap("FaDDContractController"); - System.out.println(faDDContractController); - LabelHtmlIndex labelHtmlIndex = labelHtmlUtils.getLabelHtmlIndex(faDDContractController, "singedErr"); - System.out.println(labelHtmlIndex); - } -} diff --git a/customization/test/PsApiTest.java b/customization/test/PsApiTest.java deleted file mode 100644 index 05fc3ed..0000000 --- a/customization/test/PsApiTest.java +++ /dev/null @@ -1,22 +0,0 @@ -package customization.test; - -import aiyh.utils.ApiResult; -import com.api.aiyh_guijiu.service.WorkflowQueueService; -import org.junit.Test; - -/** - * @author EBU7-dev1-ayh - * @create 2021/9/16 0016 14:22 - * 会议接口测试 - */ - - -public class PsApiTest extends BaseTest { - - @Test - public void test() { - WorkflowQueueService workflowQueueService = new WorkflowQueueService(); - String picIsPs = workflowQueueService.getPicIsPs("73"); - System.out.println(picIsPs); - } -} diff --git a/customization/test/TestAction.java b/customization/test/TestAction.java deleted file mode 100644 index 52fc921..0000000 --- a/customization/test/TestAction.java +++ /dev/null @@ -1,370 +0,0 @@ -package customization.test; - -import aiyh.utils.zwl.common.ToolUtil; -import com.alibaba.fastjson.JSON; -import com.api.aiyh_guijiu.service.WorkflowQueueService; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.ibm.icu.text.SimpleDateFormat; -import com.interfaces.toolkit.SSOLoginUtil; -import km.org.apache.poi.hssf.usermodel.HSSFCellStyle; -import km.org.apache.poi.hssf.util.HSSFColor; -import org.apache.poi.ss.usermodel.*; -import org.apache.poi.ss.util.CellRangeAddress; -import org.apache.poi.xssf.streaming.SXSSFWorkbook; -import org.h2.util.StringUtils; -import org.junit.Test; -import aiyh.utils.HotDeployToolUtil; -import tebie.applib.api.M; -import weaver.aiyh_pcn.async_organization.SyncOrganizationForOtherAPI; -import weaver.aiyh_pcn.async_organization.model.Department; -import weaver.aiyh_pcn.async_organization.model.Employee; -import weaver.aiyh_pcn.async_organization.model.Position; -import weaver.aiyh_pcn.async_organization.result.ApiAsyncConfigResult; -import weaver.aiyh_pcn.async_organization.result.GetOrganizationResult; -import weaver.aiyh_pcn.async_organization.util.GetModelValue; -import weaver.aiyh_quanshi.QsAPI; -import weaver.aiyh_quanshi.RequestApi; -import weaver.aiyh_quanshi.entity.QsResponse; -import weaver.conn.RecordSet; - -import java.io.*; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.net.URL; -import java.util.*; - -/** - * @author liutaihong - * @version 1.0.0 - * @ClassName TestAction.java - * @Description TODO - * @createTime 2020-05-15 10:55:00 - */ -public class TestAction extends BaseTest { - - - @Test - public void testHot() throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, InvocationTargetException, InterruptedException { - int i = 0; - while (true) { - - HotDeployToolUtil hotDeployToolUtil = new HotDeployToolUtil("d:\\WEAVER\\ecology\\classbean\\", ""); - Class aClass = hotDeployToolUtil.loadClass("com.api.aiyhTools.TestHot"); - Object o = aClass.newInstance(); - Method test = o.getClass().getMethod("test"); - Object invoke = test.invoke(o); - Thread.sleep(1000); - System.out.println(invoke); - if (i > 100) { - return; - } - i++; - } - } - - - @Test - public void testFile() throws ClassNotFoundException { - HotDeployToolUtil hotDeployTool = new HotDeployToolUtil("d:\\WEAVER\\ecology\\classbean\\", ""); - hotDeployTool.findClass("com\\api\\aiyhTools\\HotDeployTool.class"); - } - - @Test - public void testLog4j() { - ToolUtil toolUtil = new ToolUtil(); - toolUtil.writeDebuggerLog("TestAction", "i am is test log4j method, are you ok?"); - } - - @Test - public void getDate() { - Date date = new Date(); - SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMdd"); -// return "?date=" + formatter.format(date); - System.out.println("?date=" + formatter.format(date)); - } - - @Test - public void testAsync() { - SyncOrganizationForOtherAPI syncOrganization = new SyncOrganizationForOtherAPI(); - syncOrganization.SynTimingToOADepartment(); - syncOrganization.SynTimingToOAJobtitle(); - syncOrganization.SynTimingToOAHrmResource(); - } - - @Test - public void testString() { - RecordSet rs = new RecordSet(); - rs.executeProc("HrmResourceMaxId_Get", ""); - rs.next(); - int hrmid = rs.getInt(1); - System.out.println(hrmid); - StringBuilder sysSetSql = new StringBuilder(); - System.out.println(StringUtils.isNullOrEmpty(null)); - System.out.println(sysSetSql.lastIndexOf(",")); - String str = "q=1,w=2,e=3,"; - System.out.println(str.substring(0, str.lastIndexOf(","))); - } - - @Test - public void testCallMethod() throws NoSuchMethodException, InvocationTargetException, IllegalAccessException { - ApiAsyncConfigResult asyncConfigResult = new ApiAsyncConfigResult(); - asyncConfigResult.setId(1); - asyncConfigResult.setAsyncType(0); - asyncConfigResult.setApiField("apiField"); - asyncConfigResult.setoAField("oAField"); - asyncConfigResult.setFieldType(1); - asyncConfigResult.setChangeRules(2); - asyncConfigResult.setCustomRules("customRules"); - String str = "Id"; - GetModelValue apiAsyncConfigResultGetModelValue = new GetModelValue<>(); - Object id = apiAsyncConfigResultGetModelValue.getValueForString(asyncConfigResult, "Id"); -// Class clazz = asyncConfigResult.getClass(); -// Method getId = clazz.getDeclaredMethod("get" + str); -// Object invoke = getId.invoke(asyncConfigResult); - System.out.println(id); - } - - - @Test - public void testQueryConfigTableInfo() { - GetModelValue getModelValue = new GetModelValue<>(); - Position position = new Position(); - position.setCompany_Code("public static void main test~"); - - this.builderSql("Company_Code", position, getModelValue); - } - - public void builderSql(String filedName, Object obj, GetModelValue getModelValue) { - // 拼接系统部门字段 - try { - String value = getModelValue.getValueForString(obj, filedName).toString(); - System.out.println(value); - } catch (NoSuchMethodException | InvocationTargetException | IllegalAccessException e) { - e.printStackTrace(); - } - } - - @Test - public void testSyncOrganizationForOtherAPI() { - new SyncOrganizationForOtherAPI().SynTimingToOADepartment(); - } - - @Test - public void testFormatSql() { - Map map = new HashMap<>(); - URL resource = Thread.currentThread().getContextClassLoader().getResource(""); - String path = resource.getPath().replaceFirst("/", "").replace("/", "\\"); - map.put("packageName", "com.api.aiyhTools"); - map.put("filePath", path); - map.put("path", path); - map.put("classPath", path + "com.api.aiyhTools".replace(".", System.getProperties().getProperty("file.separator"))); - System.out.println(map); - File file = new File((String) map.get("classPath")); - if (file.exists()) { - System.out.println(map.get("classPath")); - } - } - - @Test - public void testWritExcel() throws IOException { - GetOrganizationResult getOrganizationResult = new GetOrganizationResult(); - List employeeList = getOrganizationResult.getEmployeeList(); - SXSSFWorkbook sxssfWorkbook = new SXSSFWorkbook(); - CellStyle cellStyle = sxssfWorkbook.createCellStyle(); - // 设置单元格居中对齐 - cellStyle.setAlignment(HorizontalAlignment.forInt(HSSFCellStyle.ALIGN_CENTER)); - Font font = sxssfWorkbook.createFont(); - font.setColor(HSSFColor.RED.index); - cellStyle.setFont(font); - Sheet sheet = sxssfWorkbook.createSheet("人员信息"); - Row desc = sheet.createRow(0); - sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, 13)); - Cell cell2 = desc.createCell(0); - cell2.setCellValue("员工信息表,同步数据时,按照岗位id进行同步!"); - cell2.setCellStyle(cellStyle); - Row th = sheet.createRow(1); - th.createCell(0).setCellValue("员工ID"); - th.createCell(1).setCellValue("名(英文)"); - th.createCell(2).setCellValue("姓(英文)"); - th.createCell(3).setCellValue("中文姓名"); - th.createCell(4).setCellValue("英文名"); - th.createCell(5).setCellValue("员工编号"); - th.createCell(6).setCellValue("岗位ID"); - th.createCell(7).setCellValue("部门ID"); - th.createCell(8).setCellValue("部门名称"); - th.createCell(9).setCellValue("成本中心编码"); - th.createCell(10).setCellValue("邮箱"); - th.createCell(11).setCellValue("公司实体"); - th.createCell(12).setCellValue("电话号"); - th.createCell(13).setCellValue("座机号"); - for (int i = 0; i < employeeList.size(); i++) { - Employee e = employeeList.get(i); - Row row = sheet.createRow(i + 2); - row.createCell(0).setCellValue(e.getUserID()); - row.createCell(1).setCellValue(e.getFIRSTNAMEEN()); - row.createCell(2).setCellValue(e.getLASTNAMEEN()); - row.createCell(3).setCellValue(e.getUSERNAMECN()); - row.createCell(4).setCellValue(e.getPreferred_Name()); - row.createCell(5).setCellValue(e.getUSERCODE()); - row.createCell(6).setCellValue(e.getJOBCODEID()); - row.createCell(7).setCellValue(e.getDEPARTMENTID()); - row.createCell(8).setCellValue(e.getDEPARTMENTNAME()); - row.createCell(9).setCellValue(e.getCOSTCENTERCODE()); - row.createCell(10).setCellValue(e.getEMAIL()); - row.createCell(11).setCellValue(e.getORGANIZATION()); - row.createCell(12).setCellValue(e.getMOBILENO()); - row.createCell(13).setCellValue(e.getTEL()); - } - - List departmentList = getOrganizationResult.getDepartmentList(); - Sheet depSheet = sxssfWorkbook.createSheet("部门信息"); - Row depdesc = depSheet.createRow(0); - depSheet.addMergedRegion(new CellRangeAddress(0, 0, 0, 2)); - Cell cell1 = depdesc.createCell(0); - cell1.setCellValue("部门信息表,同步数据时按照该上级部门id进行排序同步!红色字体为根部门!"); - cell1.setCellStyle(cellStyle); - Row depTh = depSheet.createRow(1); - depTh.createCell(0).setCellValue("部门ID"); - depTh.createCell(1).setCellValue("部门名称"); - depTh.createCell(2).setCellValue("上级部门"); - for (int i = 0; i < departmentList.size(); i++) { - Row row = depSheet.createRow(i + 2); - Department d = departmentList.get(i); - row.createCell(0).setCellValue(d.getDEPARTMENTID()); - row.createCell(1).setCellValue(d.getDEPARTMENTNAME()); - Cell cell = row.createCell(2); - cell.setCellValue(d.getPARENTDEPARTMENDID()); - if (d.getPARENTDEPARTMENDID() == 0) { - cell.setCellStyle(cellStyle); - } - } - - List positionList = getOrganizationResult.getPositionList(); - Sheet posSheet = sxssfWorkbook.createSheet("职位信息"); - Row posdesc = posSheet.createRow(0); - posSheet.addMergedRegion(new CellRangeAddress(0, 0, 0, 3)); - Cell cell3 = posdesc.createCell(0); - cell3.setCellValue("职位信息表,职位同步过程中以上级岗位id升序排序进行同步!"); - cell3.setCellStyle(cellStyle); - Row posTh = posSheet.createRow(1); - posTh.createCell(0).setCellValue("岗位编号"); - posTh.createCell(1).setCellValue("岗位编号"); - posTh.createCell(2).setCellValue("岗位描述"); - posTh.createCell(3).setCellValue("上级岗位ID"); - for (int i = 0; i < positionList.size(); i++) { - Row row = posSheet.createRow(i + 2); - Position p = positionList.get(i); - row.createCell(0).setCellValue(p.getJOBCODEID()); - row.createCell(1).setCellValue(p.getJOBCODE()); - row.createCell(2).setCellValue(p.getJOBFUNCTION()); - row.createCell(3).setCellValue(p.getSUPERIORJOBCODEID()); - } - - - File file = new File("F:\\fanwei\\cms_async\\cms_data_proud.xlsx"); - if (!file.exists()) { - //先得到文件的上级目录,并创建上级目录,在创建文件 - file.getParentFile().mkdir(); - try { - //创建文件 - file.createNewFile(); - } catch (IOException e) { - e.printStackTrace(); - } - } - FileOutputStream fileOutputStream = new FileOutputStream(file); - //写入文件 - sxssfWorkbook.write(fileOutputStream); - - fileOutputStream.close(); - } - - - @Test - public void testSyncOrganization() throws IOException { - GetOrganizationResult getOrganizationResult = new GetOrganizationResult(); - List employeeList = getOrganizationResult.getEmployeeList(); - System.out.println(employeeList.size()); - BufferedWriter employeeListOut = new BufferedWriter(new FileWriter("F:\\fanwei\\employee-list.json")); - employeeListOut.write(JSON.toJSONString(employeeList)); - employeeListOut.close(); - List departmentList = getOrganizationResult.getDepartmentList(); - BufferedWriter departmentListOut = new BufferedWriter(new FileWriter("F:\\fanwei\\department-list.json")); - departmentListOut.write(JSON.toJSONString(departmentList)); - departmentListOut.close(); - System.out.println(departmentList.size()); - List positionList = getOrganizationResult.getPositionList(); - BufferedWriter positionListOut = new BufferedWriter(new FileWriter("F:\\fanwei\\position-list.json")); - positionListOut.write(JSON.toJSONString(positionList)); - positionListOut.close(); - System.out.println(positionList.size()); - } - - @Test - public void testContains() { - - String str = "select d.id,m.api_field_type,d.api_field,d.change_rules,d.custom_rules_value,d.ao_field,oa_field_type from uf_cms_async as m inner join uf_cms_async_dt1 as d on d.mainid = m.id"; - RecordSet rs = new RecordSet(); - rs.executeQuery(str); - rs.next(); - System.out.println(rs.getString(0)); - } - - @Test - public void testSortEmployee() throws IOException { - GetOrganizationResult getOrganizationResult = new GetOrganizationResult(); - List employeeList = getOrganizationResult.getEmployeeList(); - Collections.sort(employeeList); - System.out.println(employeeList.size()); - BufferedWriter employeeListOut = new BufferedWriter(new FileWriter("F:\\fanwei\\employee-list-sort.json")); - employeeListOut.write(JSON.toJSONString(employeeList)); - employeeListOut.close(); - } - - - @Test - public void testCav(){ - Map map = new HashMap<>(); - map.put("contrast","[{\n" + - "\t\"start\": \"fieldName\",\n" + - "\t\"tableName\": \"databaseTableName\",\n" + - "\t\"end\": \"endFieldName\",\n" + - "\t\"workflowId\": 9,\n" + - "\t\"user\": 10\n" + - "}, {\n" + - "\t\"start\": \"fieldName\",\n" + - "\t\"tableName\": \"databaseTableName\",\n" + - "\t\"end\": \"endFieldName\",\n" + - "\t\"workflowId\": 9,\n" + - "\t\"user\": 10\n" + - "}, {\n" + - "\t\"start\": \"fieldName\",\n" + - "\t\"tableName\": \"databaseTableName\",\n" + - "\t\"end\": \"endFieldName\",\n" + - "\t\"workflowId\": 9,\n" + - "\t\"user\": 10\n" + - "}]"); - WorkflowQueueService workflowQueueService = new WorkflowQueueService(); - workflowQueueService.getWorkflowQueue(map); - } - - - @Test - public void testEmailgetID(){ - RequestApi requestApi = new RequestApi(); - QsResponse userIdsByEmails = requestApi.getInfoByEmail( new ArrayList() {{ - add("ZhangYun03@saicmotor.com"); - }}); - Map resultMap = new HashMap<>(); - - ObjectMapper mapper = new ObjectMapper(); - try { - resultMap = mapper.readValue(userIdsByEmails.getResult(), Map.class); - } catch (JsonProcessingException e) { -// toolUtil.writeErrorLog("请求结果转换失败,失败信息:" + e); - } - System.out.println(((Map) resultMap.get("ZhangYun03@saicmotor.com")).get("userId")); - System.out.println(userIdsByEmails); - } -} diff --git a/customization/test/TestCaseVo.java b/customization/test/TestCaseVo.java deleted file mode 100644 index b2a26f9..0000000 --- a/customization/test/TestCaseVo.java +++ /dev/null @@ -1,48 +0,0 @@ -package customization.test; - -import aiyh.utils.annotation.DateFormatAn; - -import java.util.Date; - -/** - * @author EBU7-dev1-ayh - * @create 2021/9/3 0003 15:39 - * testVo - */ - - -public class TestCaseVo { - int id; - int requestId; - int workflowType; - int attachmentField; - int showField; - String modelTableName; - String modelField; - int showValue; - int hiddenValue; - int formmodeid; - String templateField; - String isTemplateShow; - @DateFormatAn("yyyy-MM-dd") - Date modedatacreatedate; - - @Override - public String toString() { - return "TestCaseVo{" + - "id=" + id + - ", requestId=" + requestId + - ", workflowType=" + workflowType + - ", attachmentField=" + attachmentField + - ", showField=" + showField + - ", modelTableName='" + modelTableName + '\'' + - ", modelField='" + modelField + '\'' + - ", showValue=" + showValue + - ", hiddenValue=" + hiddenValue + - ", formmodeid=" + formmodeid + - ", templateField='" + templateField + '\'' + - ", isTemplateShow='" + isTemplateShow + '\'' + - ", modedatacreatedate=" + modedatacreatedate + - '}'; - } -} diff --git a/customization/test/TestDBVo.java b/customization/test/TestDBVo.java deleted file mode 100644 index 94c61f2..0000000 --- a/customization/test/TestDBVo.java +++ /dev/null @@ -1,31 +0,0 @@ -package customization.test; - -/** - * @author EBU7-dev1-ayh - * @create 2021/9/3 0003 14:59 - * shujv - */ - - -public class TestDBVo { - int id; - String fieldname; - String indexdesc; - String tablename; - int billid; - String showtablename; - int fieldhtmltype; - - @Override - public String toString() { - return "TestDBVo{" + - "id=" + id + - ", fieldname='" + fieldname + '\'' + - ", indexdesc='" + indexdesc + '\'' + - ", tablename='" + tablename + '\'' + - ", billid=" + billid + - ", showtablename='" + showtablename + '\'' + - ", fieldhtmltype=" + fieldhtmltype + - '}'; - } -} diff --git a/customization/test/TestVo.java b/customization/test/TestVo.java deleted file mode 100644 index 42fac8a..0000000 --- a/customization/test/TestVo.java +++ /dev/null @@ -1,71 +0,0 @@ -package customization.test; - -import com.simplerss.dataobject.Item; - -import java.util.List; - -/** - * @author EBU7-dev1-ayh - * @create 2021/8/31 0031 23:28 - * testVo - */ - - -public class TestVo { - boolean code; - String errorMessage; - String traceId; - int index; - List items; - - @Override - public String toString() { - return "TestVo{" + - "code=" + code + - ", errorMessage='" + errorMessage + '\'' + - ", traceId='" + traceId + '\'' + - ", index=" + index + - ", items=" + items + - '}'; - } - - public int getIndex() { - return index; - } - - public void setIndex(int index) { - this.index = index; - } - - public boolean isCode() { - return code; - } - - public void setCode(boolean code) { - this.code = code; - } - - public String getErrorMessage() { - return errorMessage; - } - - public void setErrorMessage(String errorMessage) { - this.errorMessage = errorMessage; - } - - public String getTraceId() { - return traceId; - } - - public void setTraceId(String traceId) { - this.traceId = traceId; - } - - public List getItems() { - return items; - } - - public void setItems(List items) { - this.items = items; - } -} diff --git a/customization/test/TestVoItem.java b/customization/test/TestVoItem.java deleted file mode 100644 index 7579db2..0000000 --- a/customization/test/TestVoItem.java +++ /dev/null @@ -1,71 +0,0 @@ -package customization.test; - -/** - * @author EBU7-dev1-ayh - * @create 2021/8/31 0031 23:29 - * testVoItem - */ - - -public class TestVoItem { - /** - * 货币 - */ - String currency; - /** - * 人民币 - */ - String localCurrency; - /** - * 汇率 - */ - String rate; - /** - * 有效期 - */ - String validDate; - - @Override - public String toString() { - return "TestVoItem{" + - "currency='" + currency + '\'' + - ", localCurrency='" + localCurrency + '\'' + - ", rate='" + rate + '\'' + - ", validDate='" + validDate + '\'' + - '}'; - } - - public String getCurrency() { - return currency; - } - - public void setCurrency(String currency) { - this.currency = currency; - } - - public String getLocalCurrency() { - return localCurrency; - } - - public void setLocalCurrency(String localCurrency) { - this.localCurrency = localCurrency; - } - - public String getRate() { - return rate; - } - - public void setRate(String rate) { - this.rate = rate; - } - - public String getValidDate() { - return validDate; - } - - public void setValidDate(String validDate) { - this.validDate = validDate; - } - - -} diff --git a/customization/test/UfTempAttachmentDTO.java b/customization/test/UfTempAttachmentDTO.java deleted file mode 100644 index 82b18e6..0000000 --- a/customization/test/UfTempAttachmentDTO.java +++ /dev/null @@ -1,47 +0,0 @@ -package customization.test; -public class UfTempAttachmentDTO{ - private int id; - private int requestId; - private int workflowType; - private String attachmentField; - private String showField; - private String modelTableName; - private String modelField; - private String showValue; - private String hiddenValue; - private int formmodeid; - private int modedatacreater; - private int modedatacreatertype; - private String modedatacreatedate; - private String modedatacreatetime; - private int modedatamodifier; - private String modedatamodifydatetime; - private String MODEUUID; - private String templateField; - private int isTemplateShow; - - @Override - public String toString() { - return "UfTempAttachmentDTO{" + - "id=" + id + - ", requestId=" + requestId + - ", workflowType=" + workflowType + - ", attachmentField='" + attachmentField + '\'' + - ", showField='" + showField + '\'' + - ", modelTableName='" + modelTableName + '\'' + - ", modelField='" + modelField + '\'' + - ", showValue='" + showValue + '\'' + - ", hiddenValue='" + hiddenValue + '\'' + - ", formmodeid=" + formmodeid + - ", modedatacreater=" + modedatacreater + - ", modedatacreatertype=" + modedatacreatertype + - ", modedatacreatedate='" + modedatacreatedate + '\'' + - ", modedatacreatetime='" + modedatacreatetime + '\'' + - ", modedatamodifier=" + modedatamodifier + - ", modedatamodifydatetime='" + modedatamodifydatetime + '\'' + - ", MODEUUID='" + MODEUUID + '\'' + - ", templateField='" + templateField + '\'' + - ", isTemplateShow=" + isTemplateShow + - '}'; - } -} \ No newline at end of file diff --git a/customization/test/UploadTest.java b/customization/test/UploadTest.java deleted file mode 100644 index 2ee47a5..0000000 --- a/customization/test/UploadTest.java +++ /dev/null @@ -1,49 +0,0 @@ -package customization.test; - -import org.apache.axiom.util.base64.Base64Utils; -import org.junit.Test; -import weaver.file.ImageFileManager; -import weaver.soa.workflow.FileProcessor; - -import javax.imageio.ImageIO; -import java.awt.*; -import java.awt.image.BufferedImage; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.net.URLDecoder; -import java.util.UUID; - -/** - * @author EBU7-dev1-ayh - * @create 2021/11/2 0002 11:11 - * shangchuan ceshi - */ - - -public class UploadTest extends BaseTest { - @Test - public void testBaseUpload() throws IOException { -// String base = "/9j/4AAQSkZJRgABAQEAeAB4AAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCANBBMkDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD1Skpe1JTEBoo7UdqACkxS0UAJig0tFMBMUYpaKQCUYpaSmAmKWiigBMCjFL3ooATHFFLSUAJRS4ooATn1opaKAG0tFLQAnPrSc+tL2ooAOaTmlooATmjmlooAbzR3p2KSgBOaKWigBOaOfWlpKBBSUtLQA2jFLRQAmKXFFLQAmKTtS0UAFFLRQAlLSUtABRS0UAFFFFABRRS0AJS0UUAFJS0lABS0naigBaKKKACkpaSgAoopaACiiigAo60UUAFFFFABS0lKKACiiigAooooASiiloASilooAQ0dqKO1ABRRRQAlFLRQAneilooASjvS0lAC0UlFAC0UUUAJ2o7UUUAFFFFABRRQaACiikoAKKKKACkpfrRQAUUUUAJiilooATtRS0lABRRTWzgAUAOooooAKSlooASkpaSgAopaSgAoooNABSUtFACUUUUAFFLRigBKKKWgYlFLiigBKKXFFIBKTFOpKBCUUuKKACiiigYYopaKAEo7UtJSAWiiigYVDcDKLU1R3H3F+tYVdi4lXGetJgelO4pM+1cLNjWopaTFescgUUUUxhSUtFABSUtFACUUtJQAUUUUAJRS0YoEJRRRQMKKKKAE7UUtJQAUUUUCEopaSgYUUUUCCiiigYUlLRQAUlLRQAlFFJQIKKWigAoo7UUAJRS0UAJRS9qKAEopaKADtS0lLQAlFLRimMKKKKQgoopaACijpRQAlFLSUALSUUtAB2ooooAKKKKACiiigBKKWigAooooAKKKWgBKWiigAooooAKKKKACikpaACiiigAooooAKMUUUAFFFFACd6O9LRQAlJS0UAFFFFABRR2ooAKKKKAEo7UtFABSUUUDCiikAxQIWkpaKACkpaKAE70UUUAFFLRQAlLSUUAFFFFAB2pKKKACiiigApKKWgBKKWkoAKKSigAooooAKO9FFABiiiigAooopAFFFLQAUlLRQAlFFGKYBRR2opAFFFFABRS0UDEo98UtFACUUtFIBKWjvRQAVDcnEYOO9T1Bdf6kfWsamxpAqCQE07cvtUe1c5xRtHpXCbo26KDRXrHIFJS0UAJRRRQAUUUUAFFGKKACkpcUUAJiilpKACiijFACUUuKKAEopaSgBKSnUlAhKWkooAKKKKACiiigYUUUlAC0lLRQAlFFFAgooooAKKWkoAO1FFFABRRS0AJR3paKACiiigApaSlpgFFFFABRS0UgEooooASloo7UAJS0UUAFFFFABR2oooAKPwoooAKKKWgAoooNABRRRQAd6O9FLQAlFLSUAFFFFABR2ooFABRRxRQAUUdqO1AB3ooooAKKSloASiiigAopaKACkoooAO9HejvRQAUUUUAFFHakoAKKWkoAWkoooAKKKKADtRRR3oAKKKKACiiigApKKKAEpaSloASiiigAooooAKKKKACik7UUABpKKKACiiigApaKKAEpe9FFAB2ooopAFApaSmAUUd6KACiiikAlFFFMAooopAFLRRQMKKKKACiiigApRSUo6UgCorjmD6GpelR3AzA1ZVNi4lHjtRS0mD6V573OhGzRRRXr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"; -//// FileProcessor fileProcessor = new FileProcessor(); -//// fileProcessor.Process(base,) -// ImageFileManager fileManager = new ImageFileManager(); -// byte[] data = null; -// data = Base64Utils.decode(base); -// fileManager.setData(data); -// String fileName = "" + System.currentTimeMillis() + UUID.randomUUID() + ".jpg"; -// fileManager.setImagFileName(fileName); -// int imageFileId = fileManager.saveImageFile(); -// InputStream inputStreamById = ImageFileManager.getInputStreamById(imageFileId); -// Image image1 = ImageIO.read(inputStreamById); -// int width1 = image1.getWidth(null); -// int height1 = image1.getHeight(null); -// BufferedImage bufferedImage1 = new BufferedImage(width1, height1, BufferedImage.TYPE_INT_RGB); -// Graphics graphics1 = bufferedImage1.createGraphics(); -// graphics1.drawImage(image1, 0, 0, width1, height1, null); -// graphics1.dispose(); -// FileOutputStream fileOutputStream = new FileOutputStream(URLDecoder.decode("C:\\Users\\77449\\Desktop\\"+ fileName, "utf-8")); -// ImageIO.write(bufferedImage1, "jpg", fileOutputStream); -// fileOutputStream.close(); - } -} diff --git a/customization/test/UtilTest.java b/customization/test/UtilTest.java deleted file mode 100644 index 29bc21d..0000000 --- a/customization/test/UtilTest.java +++ /dev/null @@ -1,86 +0,0 @@ -package customization.test; - -import aiyh.utils.Util; -import org.junit.Test; - -import java.beans.BeanInfo; -import java.beans.IntrospectionException; -import java.beans.Introspector; -import java.beans.PropertyDescriptor; -import java.io.IOException; -import java.util.Collection; - -/** - * @author EBU7-dev1-ayh - * @create 2021/9/6 0006 20:03 - * 工具类测试 - */ - - -public class UtilTest extends BaseTest { - - @Test - public void createJava() throws IOException { -/* Util.creatJavaFileBySql("select upw.workflow,upw.water_type,upw.water_point,upw.font_size, " + - "upw.water_content,upw.font_style,upw.font_color,upw.water_fields, " + - "wftv.fieldname as water_field,upw.save_source,wftv1.fieldname as source_field," + - "upw.water_text,upw.add_time,upw.water_alpha from uf_pic_watermark as upw " + - "left join workflow_field_table_view as wftv on wftv.id = upw.water_field " + - "left join workflow_field_table_view as wftv1 on wftv1.id = upw.source_field", - "config","com.api.aiyh_guijiu.pojo");*/ -/* Util.creatJavaFileBySql("select dt.id,main.enable,wf.tablename,wf.fieldname as start_date_field, " + - "wf1.fieldname as start_time_field,wf2.fieldname as end_date_field, " + - "wf3.fieldname as end_time_field from uf_workflow_conflic_dt1 as dt " + - "left join workflow_field_table_view as wf on wf.id = dt.start_date_field " + - "left join workflow_field_table_view as wf1 on wf1.id = dt.start_time_field " + - "left join workflow_field_table_view as wf2 on wf2.id = dt.end_date_field " + - "left join workflow_field_table_view as wf3 on wf3.id = dt.end_time_field " + - "left join uf_workflow_conflic as main on dt.mainid = main.id", - "workflowConfig","com.api.aiyh_guijiu.pojo");*/ - Util.creatJavaFileBySql("select id,name,meetingtype,begindate,begintime,endtime,enddate,desc_n,creater,hrmmembers from meeting where id = 8", - "meetingInfo", "com.customization.quanshimeting.entity"); -// Util.creatJavaFileByTable("uf_workflow_conflic_dt1","com.api.aiyh_guijiu.pojo"); - - - } - - - @Test - public void testIntrospector() throws IntrospectionException { - // 不内省父类的信息,第二个参数stopClass代表从stopClass开始往上的父类不再内省 - BeanInfo beanInfo = Introspector.getBeanInfo(TestVo.class, Object.class); - PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors(); - for (PropertyDescriptor p : propertyDescriptors) { - System.out.println(p.getName()); - System.out.println(p.getPropertyType()); - System.out.println(p.getPropertyType().equals(String.class)); - } - } - - - public void toJsonString(T t) throws Exception { - BeanInfo beanInfo = Introspector.getBeanInfo(t.getClass(), Object.class); - PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors(); - for (PropertyDescriptor proper : propertyDescriptors) { - String name = proper.getName(); - Class propertyType = proper.getPropertyType(); - if (int.class.equals(propertyType) || long.class.equals(propertyType) - || short.class.equals(propertyType) || byte.class.equals(propertyType) - || float.class.equals(propertyType) || double.class.equals(propertyType) - || boolean.class.equals(propertyType) || Boolean.class.equals(propertyType) - || Integer.class.equals(propertyType) || Long.class.equals(propertyType) - || Short.class.equals(propertyType) || Byte.class.equals(propertyType) - || Float.class.equals(propertyType) || Double.class.equals(propertyType)) { -// 整数类型和浮点数以及boolean类型 - continue; - } - if (String.class.equals(propertyType) || Character.class.equals(propertyType) - || char.class.equals(propertyType)) { -// 字符串类型的数据处理 - continue; - } - if (proper.getReadMethod().invoke(t) instanceof Collection) { - } - } - } -} \ No newline at end of file diff --git a/customization/test/WorkflowToCustomerTest.java b/customization/test/WorkflowToCustomerTest.java deleted file mode 100644 index 1d172ef..0000000 --- a/customization/test/WorkflowToCustomerTest.java +++ /dev/null @@ -1,205 +0,0 @@ -package customization.test; - -import com.engine.crm.util.CrmCommonUtil; -import org.junit.Test; -import aiyh.utils.Util; -import aiyh.utils.sqlUtil.sqlResult.impl.BatchSqlResultImpl; -import aiyh.utils.sqlUtil.sqlResult.impl.PrepSqlResultImpl; -import aiyh.utils.sqlUtil.whereUtil.Where; -import weaver.aiyh_pcn.workflow_to_customer.AddCustomer_Action; -import weaver.aiyh_pcn.workflow_to_customer.config.CRM_Config; -import weaver.aiyh_pcn.workflow_to_customer.model.MainResult; -import weaver.aiyh_pcn.workflow_to_customer.utils.*; -import weaver.conn.RecordSet; -import weaver.crm.Maint.*; -import weaver.hrm.companyvirtual.ResourceVirtualComInfo; -import weaver.soa.workflow.request.RequestInfo; -import weaver.workflow.request.RequestManager; - -import java.util.*; - -/** - * @author EBU7-dev1-ayh - * @create 2021/8/6 0006 15:46 - * ceshi - */ - - -public class WorkflowToCustomerTest extends BaseTest{ - - @Test - public void testSqlBuilderBatch(){ - List> list = new ArrayList<>(); - List whereList = new ArrayList<>(); - list.add(new LinkedHashMap(){{ - put("id",9); - put("name","updateSql"); - put("status","prod"); - }}); - list.add(new LinkedHashMap(){{ - put("id",10); - put("name","updateSql1"); - put("status","prod1"); - }}); - list.add(new LinkedHashMap(){{ - put("id",11); - put("name","updateSql2"); - put("status","prod3"); - }}); - whereList.add(Util.createPrepWhereImpl() - .whereAnd("id").whereEqual(9) - .whereAnd("name").whereLike("%Sql%")); - whereList.add(Util.createPrepWhereImpl() - .whereAnd("id").whereEqual(10) - .whereAnd("name").whereLike("%Sql%")); - whereList.add(Util.createPrepWhereImpl() - .whereAnd("id").whereEqual(11) - .whereAnd("name").whereLike("%Sql%")); - BatchSqlResultImpl batchSqlResult = Util.createSqlBuilder().updateBatchSql("tablename", list, whereList); - System.out.println(batchSqlResult.getSqlStr()); - System.out.println(batchSqlResult.getBatchList()); - } - - @Test - public void testSqlBuilder(){ - PrepSqlResultImpl prepSqlResult = Util.createSqlBuilder().insertSql("tablename", - ParaMap.create().put("id", 10) - .put("name", "insertSql") - .put("status", "test")); - System.out.println(prepSqlResult.getSqlStr()); - System.out.println(prepSqlResult.getArgs()); - } - - -// @Test -// public void testUtilSql(){ -// String sql = Util.createWhereImpl().whereAnd("id").whereEqual("90").whereOr("name") -// .whereLike("%不知道%") -// .whereAnd("age").whereIn(1,2,3,4,5).getSql(); -// System.out.println(sql); -// } - -// @Test -// public void testUtilPreSql(){ -// Where where = Util.createPrepWhereImpl().whereAnd("id").whereEqual("90").whereOr("name") -// .whereLike("%不知道%") -// .whereAnd("age").whereIn(1, 2, 3, 4, 5); -// System.out.println(where.getSql()); -// System.out.println(where.getArgs()); -// } - - @Test - public void testMap(){ - UtilMap utilMap = new UtilMap<>(); - utilMap.uPut("test","testValue").uPut("liu","liu").uPut("isnull",null); - Map filter = utilMap.filter((key,value) -> !Objects.isNull(value)); - System.out.println(filter); - System.out.println(utilMap); - } - - @Test - public void testPinYin(){ - CrmCommonUtil crmCommonUtil = new CrmCommonUtil(); - System.out.println(crmCommonUtil.getPinYin("不知道", 7)); - } - - - @Test - public void testInsert(){ - RecordSet rs = new RecordSet(); - boolean b = rs.executeUpdate("insert into formtable_main_2 (requestId,jbr) values (-121,2);"); - rs.executeQuery("select @@identity"); - System.out.println(rs.getString(1)); - System.out.println(rs.getString(2)); - } - - @Test - public void testSQLWhere(){ - SQLWhere sqlWhere = SQLWhere.creatWhere() - .and("id").equal(90) - .or("name").like("%testname%") - .and("mainid").equalSql("select id from maintable") - .create(); - Map map = new HashMap<>(); - map.put("id", "90"); - String tablename = BuilderSqlUtil.builderUpdateFullSql("tablename", map, sqlWhere); - System.out.println(tablename); - } - - @Test - public void testPrepSQLWhere(){ - PrepSQLWhere prepSQLWhere = PrepSQLWhere.creatPrepWhere() - .and("id").equal(6) - .or("name").like("%public%") - .and("status").in(2,3,4,5,6) - .create(); - Map map = new HashMap<>(); - map.put("id", "90"); - SqlResult tablename = BuilderSqlUtil.builderUpdateSql("tablename", map, prepSQLWhere); - System.out.println(tablename.getSqlStr()); - System.out.println(Arrays.toString(tablename.getArgs())); - } - - @Test - public void testInnerPrepSQLWhere(){ - PrepSQLWhere prepSQLWhere = PrepSQLWhere.creatPrepWhere() - .and("id").equal(6) - .or("name").like("%public%") - .and("status").in(2,3,4,5,6) - .create(); - Map map = new HashMap<>(); - map.put("id", "90"); - SqlResult tablename = BuilderSqlUtil.builderUpdateSql("tablename", map, prepSQLWhere); - System.out.println(tablename.getSqlStr()); - System.out.println(Arrays.toString(tablename.getArgs())); - } - - - @Test - public void testRemoveCache(){ - CustomerInfoComInfo customerInfo = new CustomerInfoComInfo(); - customerInfo.removeCustomerInfoCache(); - customerInfo.removeCache(); - ResourceVirtualComInfo resource = new ResourceVirtualComInfo(); - resource.removeCache(); - resource.removeResourceVirtualCache(); - (new CustomerContacterComInfo()).removeCustomerContacterCache(); - } - - @Test - public void test_crm_config(){ -// CRM_Config conf = new CRM_Config("6","formtable_main_32","105106"); - RequestInfo requestInfo = new RequestInfo(); - AddCustomer_Action addCustomer = new AddCustomer_Action(); - requestInfo.setRequestid("179181"); - requestInfo.setWorkflowid("6"); - requestInfo.setCreatorid("1"); - requestInfo.setRequestManager(new RequestManager(){{setBilltablename("formtable_main_32");}}); - addCustomer.execute(requestInfo); -// System.out.println(conf.getConfigInfo());; - } - - @Test - public void test_removeSegmentation(){ - StringBuilder sqlBuilder = new StringBuilder(" ,insert into 1,2,3,4,5 , "); - System.out.println(Utils.removeSeparator(sqlBuilder)); - } - - @Test - public void testAddCustomerAction(){ - AddCustomer_Action addCustomer_action = new AddCustomer_Action(); - CRM_Config config = new CRM_Config("4","formtable_main_2","5011"); - Map>> configInfoMap = config.getConfigInfo(); - MainResult mainResult = config.getMainResult(); - System.out.println(configInfoMap); - System.out.println(mainResult); - if(mainResult.getChangeSetting() == 0){ -// 表示插入 - addCustomer_action.insertCustomerModel(mainResult,configInfoMap); - }else{ -// 表示根据流程字段判断是插入还是更新 - - } - } - -} diff --git a/customutil/proxy/dynamicProxy/Customer.java b/customutil/proxy/dynamicProxy/Customer.java deleted file mode 100644 index 149ba6e..0000000 --- a/customutil/proxy/dynamicProxy/Customer.java +++ /dev/null @@ -1,15 +0,0 @@ -package customutil.proxy.dynamicProxy; - -/** - * @author EBU7-dev1-ayh - * @create 2021/11/25 0025 12:53 - */ - - -public class Customer implements IOrderInterface{ - @Override - public String order(String foodName){ - System.out.println("顾客下单。。。"); - return "已经下单了" + foodName; - } -} diff --git a/customutil/proxy/dynamicProxy/IOrderInterface.java b/customutil/proxy/dynamicProxy/IOrderInterface.java deleted file mode 100644 index e5324f0..0000000 --- a/customutil/proxy/dynamicProxy/IOrderInterface.java +++ /dev/null @@ -1,11 +0,0 @@ -package customutil.proxy.dynamicProxy; - -/** - * @author EBU7-dev1-ayh - * @create 2021/11/25 0025 12:05 - */ - - -public interface IOrderInterface { - public String order(String foodName); -} diff --git a/customutil/proxy/dynamicProxy/Test.java b/customutil/proxy/dynamicProxy/Test.java deleted file mode 100644 index a834c01..0000000 --- a/customutil/proxy/dynamicProxy/Test.java +++ /dev/null @@ -1,30 +0,0 @@ -package customutil.proxy.dynamicProxy; - -import java.lang.reflect.InvocationHandler; -import java.lang.reflect.Method; -import java.lang.reflect.Proxy; - -/** - * @author EBU7-dev1-ayh - * @create 2021/11/25 0025 12:53 - */ - - -public class Test { - public static void main(String[] args) { - Customer customer = new Customer(); - IOrderInterface iOrderInterface = (IOrderInterface) Proxy.newProxyInstance( - customer.getClass().getClassLoader(), - customer.getClass().getInterfaces(), - new InvocationHandler() { - @Override - public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { - Object result = method.invoke(customer,args); - System.out.println("接收到订单,正在去取餐途中。。。"); - return result; - } - }); - String result = iOrderInterface.order("鱼香肉丝"); - System.out.println(result); - } -} diff --git a/customutil/proxy/dynamicProxy/TestCGLIB.java b/customutil/proxy/dynamicProxy/TestCGLIB.java deleted file mode 100644 index 0146d47..0000000 --- a/customutil/proxy/dynamicProxy/TestCGLIB.java +++ /dev/null @@ -1,29 +0,0 @@ -package customutil.proxy.dynamicProxy; - -import net.sf.cglib.proxy.Enhancer; -import net.sf.cglib.proxy.MethodInterceptor; -import net.sf.cglib.proxy.MethodProxy; - -import java.lang.reflect.Method; - -/** - * @author EBU7-dev1-ayh - * @create 2021/11/25 0025 13:06 - */ - - -public class TestCGLIB { - public static void main(String[] args) { - Customer customer = new Customer(); - Customer deliveryClerk = (Customer) Enhancer.create(Customer.class, new MethodInterceptor() { - @Override - public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable { - Object result = method.invoke(customer,objects); - System.out.println("接收到订单,正在去取餐途中。。。"); - return result; - } - }); - String result = deliveryClerk.order("口水鸡"); - System.out.println(result); - } -} diff --git a/customutil/proxy/staticProxy/Customer.java b/customutil/proxy/staticProxy/Customer.java deleted file mode 100644 index a55f3ad..0000000 --- a/customutil/proxy/staticProxy/Customer.java +++ /dev/null @@ -1,15 +0,0 @@ -package customutil.proxy.staticProxy; - -/** - * @author EBU7-dev1-ayh - * @create 2021/11/25 0025 11:57 - * 顾客 - */ - - -public class Customer { - public String order(String foodName){ - System.out.println("顾客下单。。。"); - return "已经下单了" + foodName; - } -} diff --git a/customutil/proxy/staticProxy/DeliverClerk.java b/customutil/proxy/staticProxy/DeliverClerk.java deleted file mode 100644 index 2cbfc1e..0000000 --- a/customutil/proxy/staticProxy/DeliverClerk.java +++ /dev/null @@ -1,17 +0,0 @@ -package customutil.proxy.staticProxy; - -/** - * @author EBU7-dev1-ayh - * @create 2021/11/25 0025 11:59 - * 外卖员 - */ - - -public class DeliverClerk extends Customer { - @Override - public String order(String foodName) { - String result = super.order(foodName); - System.out.println("接收到订单,正在去取餐途中。。。"); - return result+",已经搅拌均匀"; - } -} diff --git a/customutil/proxy/staticProxy/Test.java b/customutil/proxy/staticProxy/Test.java deleted file mode 100644 index a55596e..0000000 --- a/customutil/proxy/staticProxy/Test.java +++ /dev/null @@ -1,15 +0,0 @@ -package customutil.proxy.staticProxy; - -/** - * @author EBU7-dev1-ayh - * @create 2021/11/25 0025 12:02 - */ - - -public class Test { - public static void main(String[] args) { - Customer customer = new DeliverClerk(); - String result = customer.order("小炒肉"); - System.out.println(result); - } -} diff --git a/customutil/proxy/staticProxy/interfaceModel/DeliverClerkImpl.java b/customutil/proxy/staticProxy/interfaceModel/DeliverClerkImpl.java deleted file mode 100644 index b714765..0000000 --- a/customutil/proxy/staticProxy/interfaceModel/DeliverClerkImpl.java +++ /dev/null @@ -1,22 +0,0 @@ -package customutil.proxy.staticProxy.interfaceModel; - -/** - * @author EBU7-dev1-ayh - * @create 2021/11/25 0025 12:07 - */ - - -public class DeliverClerkImpl implements IOrderInterface { - private IOrderInterface iOrderInterface; - - public DeliverClerkImpl(IOrderInterface iOrderInterface) { - this.iOrderInterface = iOrderInterface; - } - - @Override - public String order(String foodName) { - String result = iOrderInterface.order(foodName); - System.out.println("接收到订单,正在去取餐途中。。。"); - return result + ",已经搅拌均匀"; - } -} diff --git a/customutil/proxy/staticProxy/interfaceModel/IOrderInterface.java b/customutil/proxy/staticProxy/interfaceModel/IOrderInterface.java deleted file mode 100644 index a2a7fc4..0000000 --- a/customutil/proxy/staticProxy/interfaceModel/IOrderInterface.java +++ /dev/null @@ -1,11 +0,0 @@ -package customutil.proxy.staticProxy.interfaceModel; - -/** - * @author EBU7-dev1-ayh - * @create 2021/11/25 0025 12:05 - */ - - -public interface IOrderInterface { - public String order(String foodName); -} diff --git a/customutil/proxy/staticProxy/interfaceModel/Test.java b/customutil/proxy/staticProxy/interfaceModel/Test.java deleted file mode 100644 index 0a4a09b..0000000 --- a/customutil/proxy/staticProxy/interfaceModel/Test.java +++ /dev/null @@ -1,17 +0,0 @@ -package customutil.proxy.staticProxy.interfaceModel; - -/** - * @author EBU7-dev1-ayh - * @create 2021/11/25 0025 12:09 - */ - - -public class Test { - public static void main(String[] args) { - customerImpl customer = new customerImpl(); -// 创建代理对象 - IOrderInterface orderInterface = new DeliverClerkImpl(customer); - String result = orderInterface.order("红烧肉"); - System.out.println(result); - } -} diff --git a/customutil/proxy/staticProxy/interfaceModel/customerImpl.java b/customutil/proxy/staticProxy/interfaceModel/customerImpl.java deleted file mode 100644 index feb9751..0000000 --- a/customutil/proxy/staticProxy/interfaceModel/customerImpl.java +++ /dev/null @@ -1,15 +0,0 @@ -package customutil.proxy.staticProxy.interfaceModel; - -/** - * @author EBU7-dev1-ayh - * @create 2021/11/25 0025 12:06 - */ - - -public class customerImpl implements IOrderInterface { - @Override - public String order(String foodName) { - System.out.println("顾客下单。。。"); - return "已经下单了" + foodName; - } -} diff --git a/lib/hamcrest-core-1.3.jar b/lib/hamcrest-core-1.3.jar new file mode 100644 index 0000000..9d5fe16 Binary files /dev/null and b/lib/hamcrest-core-1.3.jar differ diff --git a/lib/hamcrest-library-1.3.jar b/lib/hamcrest-library-1.3.jar new file mode 100644 index 0000000..9eac80d Binary files /dev/null and b/lib/hamcrest-library-1.3.jar differ diff --git a/lib/hutool-all-5.7.12.jar b/lib/hutool-all-5.7.12.jar new file mode 100644 index 0000000..5306f66 Binary files /dev/null and b/lib/hutool-all-5.7.12.jar differ diff --git a/lib/lombok1.18.22.jar b/lib/lombok1.18.22.jar new file mode 100644 index 0000000..49f5286 Binary files /dev/null and b/lib/lombok1.18.22.jar differ diff --git a/lib/metadata-extractor-2.16.0.jar b/lib/metadata-extractor-2.16.0.jar new file mode 100644 index 0000000..d5ba20a Binary files /dev/null and b/lib/metadata-extractor-2.16.0.jar differ diff --git a/lib/xmpcore-6.1.11.jar b/lib/xmpcore-6.1.11.jar new file mode 100644 index 0000000..920f529 Binary files /dev/null and b/lib/xmpcore-6.1.11.jar differ diff --git a/aiyh/utils/ApiResult.java b/src/aiyh/utils/ApiResult.java similarity index 100% rename from aiyh/utils/ApiResult.java rename to src/aiyh/utils/ApiResult.java diff --git a/aiyh/utils/HotDeployToolUtil.java b/src/aiyh/utils/HotDeployToolUtil.java similarity index 100% rename from aiyh/utils/HotDeployToolUtil.java rename to src/aiyh/utils/HotDeployToolUtil.java diff --git a/aiyh/utils/LabelHtmlUtils.java b/src/aiyh/utils/LabelHtmlUtils.java similarity index 92% rename from aiyh/utils/LabelHtmlUtils.java rename to src/aiyh/utils/LabelHtmlUtils.java index 4aea6b9..ed6451b 100644 --- a/aiyh/utils/LabelHtmlUtils.java +++ b/src/aiyh/utils/LabelHtmlUtils.java @@ -2,6 +2,7 @@ package aiyh.utils; import aiyh.utils.entity.LabelHtmlIndex; import aiyh.utils.service.UtilService; +import aiyh.utils.zwl.common.ToolUtil; import weaver.systeminfo.SystemEnv; import java.util.Map; @@ -19,9 +20,11 @@ public class LabelHtmlUtils { private final UtilService utilService = new UtilService(); private Map htmlLabel = null; + private ToolUtil toolUtil = new ToolUtil(); public LabelHtmlUtils(String prefix) { if (!this.init(prefix)) { + toolUtil.writeErrorLog("配置文件异常,请检查配置文件结构是否符合要求!"); throw new RuntimeException("配置文件异常,请检查配置文件结构是否符合要求!"); } } @@ -44,6 +47,7 @@ public class LabelHtmlUtils { return this.htmlLabel != null; } catch (Exception e) { e.printStackTrace(); + toolUtil.writeErrorLog(e.toString()); return false; } } diff --git a/aiyh/utils/Util.java b/src/aiyh/utils/Util.java similarity index 99% rename from aiyh/utils/Util.java rename to src/aiyh/utils/Util.java index ce33593..757fdaf 100644 --- a/aiyh/utils/Util.java +++ b/src/aiyh/utils/Util.java @@ -1,10 +1,7 @@ package aiyh.utils; import aiyh.utils.annotation.DateFormatAn; -import aiyh.utils.entity.AInputStream; -import aiyh.utils.entity.AZipOutputStream; -import aiyh.utils.entity.ApiConfigMainDTO; -import aiyh.utils.entity.ListZipEntity; +import aiyh.utils.entity.*; import aiyh.utils.fileUtil.ProperUtil; import aiyh.utils.mapUtil.UtilHashMap; import aiyh.utils.mapUtil.UtilLinkedHashMap; @@ -1541,6 +1538,11 @@ public class Util extends weaver.general.Util { return SystemEnv.getHtmlLabelName(id, languageId); } + public static String getHtmlLabelName(LabelHtmlIndex labelHtmlIndex, User user) { + return Util.getHtmlLabelName(labelHtmlIndex.getLabelIndex(), + user.getLanguage(), labelHtmlIndex.getDefaultStr()); + } + /** * 获取流程主表 diff --git a/aiyh/utils/annotation/DateFormatAn.java b/src/aiyh/utils/annotation/DateFormatAn.java similarity index 100% rename from aiyh/utils/annotation/DateFormatAn.java rename to src/aiyh/utils/annotation/DateFormatAn.java diff --git a/aiyh/utils/dao/UtilDao.java b/src/aiyh/utils/dao/UtilDao.java similarity index 100% rename from aiyh/utils/dao/UtilDao.java rename to src/aiyh/utils/dao/UtilDao.java diff --git a/aiyh/utils/entity/AInputStream.java b/src/aiyh/utils/entity/AInputStream.java similarity index 100% rename from aiyh/utils/entity/AInputStream.java rename to src/aiyh/utils/entity/AInputStream.java diff --git a/aiyh/utils/entity/AZipOutputStream.java b/src/aiyh/utils/entity/AZipOutputStream.java similarity index 100% rename from aiyh/utils/entity/AZipOutputStream.java rename to src/aiyh/utils/entity/AZipOutputStream.java diff --git a/aiyh/utils/entity/ApiConfigDetailDTO.java b/src/aiyh/utils/entity/ApiConfigDetailDTO.java similarity index 100% rename from aiyh/utils/entity/ApiConfigDetailDTO.java rename to src/aiyh/utils/entity/ApiConfigDetailDTO.java diff --git a/aiyh/utils/entity/ApiConfigMainDTO.java b/src/aiyh/utils/entity/ApiConfigMainDTO.java similarity index 100% rename from aiyh/utils/entity/ApiConfigMainDTO.java rename to src/aiyh/utils/entity/ApiConfigMainDTO.java diff --git a/aiyh/utils/entity/BaseTree.java b/src/aiyh/utils/entity/BaseTree.java similarity index 100% rename from aiyh/utils/entity/BaseTree.java rename to src/aiyh/utils/entity/BaseTree.java diff --git a/aiyh/utils/entity/FnainvoiceinterfaceDTO.java b/src/aiyh/utils/entity/FnainvoiceinterfaceDTO.java similarity index 100% rename from aiyh/utils/entity/FnainvoiceinterfaceDTO.java rename to src/aiyh/utils/entity/FnainvoiceinterfaceDTO.java diff --git a/aiyh/utils/entity/LabelHtmlIndex.java b/src/aiyh/utils/entity/LabelHtmlIndex.java similarity index 100% rename from aiyh/utils/entity/LabelHtmlIndex.java rename to src/aiyh/utils/entity/LabelHtmlIndex.java diff --git a/aiyh/utils/entity/ListZipEntity.java b/src/aiyh/utils/entity/ListZipEntity.java similarity index 100% rename from aiyh/utils/entity/ListZipEntity.java rename to src/aiyh/utils/entity/ListZipEntity.java diff --git a/aiyh/utils/entity/MultiLanguageDTO.java b/src/aiyh/utils/entity/MultiLanguageDTO.java similarity index 100% rename from aiyh/utils/entity/MultiLanguageDTO.java rename to src/aiyh/utils/entity/MultiLanguageDTO.java diff --git a/aiyh/utils/fileUtil/ProperUtil.java b/src/aiyh/utils/fileUtil/ProperUtil.java similarity index 100% rename from aiyh/utils/fileUtil/ProperUtil.java rename to src/aiyh/utils/fileUtil/ProperUtil.java diff --git a/aiyh/utils/fileUtil/WatermarkPoint.java b/src/aiyh/utils/fileUtil/WatermarkPoint.java similarity index 100% rename from aiyh/utils/fileUtil/WatermarkPoint.java rename to src/aiyh/utils/fileUtil/WatermarkPoint.java diff --git a/aiyh/utils/fileUtil/WatermarkPointEnum.java b/src/aiyh/utils/fileUtil/WatermarkPointEnum.java similarity index 100% rename from aiyh/utils/fileUtil/WatermarkPointEnum.java rename to src/aiyh/utils/fileUtil/WatermarkPointEnum.java diff --git a/aiyh/utils/fileUtil/WritWatermark.java b/src/aiyh/utils/fileUtil/WritWatermark.java similarity index 100% rename from aiyh/utils/fileUtil/WritWatermark.java rename to src/aiyh/utils/fileUtil/WritWatermark.java diff --git a/aiyh/utils/function/FindChildren.java b/src/aiyh/utils/function/FindChildren.java similarity index 100% rename from aiyh/utils/function/FindChildren.java rename to src/aiyh/utils/function/FindChildren.java diff --git a/aiyh/utils/function/VerifyParent.java b/src/aiyh/utils/function/VerifyParent.java similarity index 100% rename from aiyh/utils/function/VerifyParent.java rename to src/aiyh/utils/function/VerifyParent.java diff --git a/aiyh/utils/httpUtil/ExtendedIOUtils.java b/src/aiyh/utils/httpUtil/ExtendedIOUtils.java similarity index 100% rename from aiyh/utils/httpUtil/ExtendedIOUtils.java rename to src/aiyh/utils/httpUtil/ExtendedIOUtils.java diff --git a/aiyh/utils/httpUtil/HttpArgsType.java b/src/aiyh/utils/httpUtil/HttpArgsType.java similarity index 100% rename from aiyh/utils/httpUtil/HttpArgsType.java rename to src/aiyh/utils/httpUtil/HttpArgsType.java diff --git a/aiyh/utils/httpUtil/HttpManager.java b/src/aiyh/utils/httpUtil/HttpManager.java similarity index 100% rename from aiyh/utils/httpUtil/HttpManager.java rename to src/aiyh/utils/httpUtil/HttpManager.java diff --git a/aiyh/utils/httpUtil/ResponeVo.java b/src/aiyh/utils/httpUtil/ResponeVo.java similarity index 100% rename from aiyh/utils/httpUtil/ResponeVo.java rename to src/aiyh/utils/httpUtil/ResponeVo.java diff --git a/aiyh/utils/httpUtil/httpAsync/HttpAsyncThread.java b/src/aiyh/utils/httpUtil/httpAsync/HttpAsyncThread.java similarity index 100% rename from aiyh/utils/httpUtil/httpAsync/HttpAsyncThread.java rename to src/aiyh/utils/httpUtil/httpAsync/HttpAsyncThread.java diff --git a/aiyh/utils/httpUtil/httpAsync/HttpAsyncThreadCallBack.java b/src/aiyh/utils/httpUtil/httpAsync/HttpAsyncThreadCallBack.java similarity index 100% rename from aiyh/utils/httpUtil/httpAsync/HttpAsyncThreadCallBack.java rename to src/aiyh/utils/httpUtil/httpAsync/HttpAsyncThreadCallBack.java diff --git a/aiyh/utils/httpUtil/staticUtil/GlobalStaticCache.java b/src/aiyh/utils/httpUtil/staticUtil/GlobalStaticCache.java similarity index 100% rename from aiyh/utils/httpUtil/staticUtil/GlobalStaticCache.java rename to src/aiyh/utils/httpUtil/staticUtil/GlobalStaticCache.java diff --git a/aiyh/utils/httpUtil/staticUtil/HttpStaticUtils.java b/src/aiyh/utils/httpUtil/staticUtil/HttpStaticUtils.java similarity index 100% rename from aiyh/utils/httpUtil/staticUtil/HttpStaticUtils.java rename to src/aiyh/utils/httpUtil/staticUtil/HttpStaticUtils.java diff --git a/aiyh/utils/httpUtil/util/CloseThread.java b/src/aiyh/utils/httpUtil/util/CloseThread.java similarity index 100% rename from aiyh/utils/httpUtil/util/CloseThread.java rename to src/aiyh/utils/httpUtil/util/CloseThread.java diff --git a/aiyh/utils/httpUtil/util/GlobalCache.java b/src/aiyh/utils/httpUtil/util/GlobalCache.java similarity index 100% rename from aiyh/utils/httpUtil/util/GlobalCache.java rename to src/aiyh/utils/httpUtil/util/GlobalCache.java diff --git a/aiyh/utils/httpUtil/util/HttpUtils.java b/src/aiyh/utils/httpUtil/util/HttpUtils.java similarity index 100% rename from aiyh/utils/httpUtil/util/HttpUtils.java rename to src/aiyh/utils/httpUtil/util/HttpUtils.java diff --git a/aiyh/utils/mapUtil/ParaMap.java b/src/aiyh/utils/mapUtil/ParaMap.java similarity index 100% rename from aiyh/utils/mapUtil/ParaMap.java rename to src/aiyh/utils/mapUtil/ParaMap.java diff --git a/aiyh/utils/mapUtil/UtilHashMap.java b/src/aiyh/utils/mapUtil/UtilHashMap.java similarity index 100% rename from aiyh/utils/mapUtil/UtilHashMap.java rename to src/aiyh/utils/mapUtil/UtilHashMap.java diff --git a/aiyh/utils/mapUtil/UtilLinkedHashMap.java b/src/aiyh/utils/mapUtil/UtilLinkedHashMap.java similarity index 100% rename from aiyh/utils/mapUtil/UtilLinkedHashMap.java rename to src/aiyh/utils/mapUtil/UtilLinkedHashMap.java diff --git a/aiyh/utils/mapUtil/UtilMapFilter.java b/src/aiyh/utils/mapUtil/UtilMapFilter.java similarity index 100% rename from aiyh/utils/mapUtil/UtilMapFilter.java rename to src/aiyh/utils/mapUtil/UtilMapFilter.java diff --git a/aiyh/utils/service/UtilService.java b/src/aiyh/utils/service/UtilService.java similarity index 100% rename from aiyh/utils/service/UtilService.java rename to src/aiyh/utils/service/UtilService.java diff --git a/aiyh/utils/sqlUtil/builderSql/BuilderSql.java b/src/aiyh/utils/sqlUtil/builderSql/BuilderSql.java similarity index 100% rename from aiyh/utils/sqlUtil/builderSql/BuilderSql.java rename to src/aiyh/utils/sqlUtil/builderSql/BuilderSql.java diff --git a/aiyh/utils/sqlUtil/builderSql/impl/BuilderSqlImpl.java b/src/aiyh/utils/sqlUtil/builderSql/impl/BuilderSqlImpl.java similarity index 100% rename from aiyh/utils/sqlUtil/builderSql/impl/BuilderSqlImpl.java rename to src/aiyh/utils/sqlUtil/builderSql/impl/BuilderSqlImpl.java diff --git a/aiyh/utils/sqlUtil/sqlResult/SqlResult.java b/src/aiyh/utils/sqlUtil/sqlResult/SqlResult.java similarity index 100% rename from aiyh/utils/sqlUtil/sqlResult/SqlResult.java rename to src/aiyh/utils/sqlUtil/sqlResult/SqlResult.java diff --git a/aiyh/utils/sqlUtil/sqlResult/impl/BatchSqlResultImpl.java b/src/aiyh/utils/sqlUtil/sqlResult/impl/BatchSqlResultImpl.java similarity index 100% rename from aiyh/utils/sqlUtil/sqlResult/impl/BatchSqlResultImpl.java rename to src/aiyh/utils/sqlUtil/sqlResult/impl/BatchSqlResultImpl.java diff --git a/aiyh/utils/sqlUtil/sqlResult/impl/PrepSqlResultImpl.java b/src/aiyh/utils/sqlUtil/sqlResult/impl/PrepSqlResultImpl.java similarity index 100% rename from aiyh/utils/sqlUtil/sqlResult/impl/PrepSqlResultImpl.java rename to src/aiyh/utils/sqlUtil/sqlResult/impl/PrepSqlResultImpl.java diff --git a/aiyh/utils/sqlUtil/whereUtil/InnerWhere.java b/src/aiyh/utils/sqlUtil/whereUtil/InnerWhere.java similarity index 100% rename from aiyh/utils/sqlUtil/whereUtil/InnerWhere.java rename to src/aiyh/utils/sqlUtil/whereUtil/InnerWhere.java diff --git a/aiyh/utils/sqlUtil/whereUtil/InnerWhereOperator.java b/src/aiyh/utils/sqlUtil/whereUtil/InnerWhereOperator.java similarity index 100% rename from aiyh/utils/sqlUtil/whereUtil/InnerWhereOperator.java rename to src/aiyh/utils/sqlUtil/whereUtil/InnerWhereOperator.java diff --git a/aiyh/utils/sqlUtil/whereUtil/Where.java b/src/aiyh/utils/sqlUtil/whereUtil/Where.java similarity index 100% rename from aiyh/utils/sqlUtil/whereUtil/Where.java rename to src/aiyh/utils/sqlUtil/whereUtil/Where.java diff --git a/aiyh/utils/sqlUtil/whereUtil/WhereOperator.java b/src/aiyh/utils/sqlUtil/whereUtil/WhereOperator.java similarity index 100% rename from aiyh/utils/sqlUtil/whereUtil/WhereOperator.java rename to src/aiyh/utils/sqlUtil/whereUtil/WhereOperator.java diff --git a/aiyh/utils/sqlUtil/whereUtil/impl/InnerPrepWhereImpl.java b/src/aiyh/utils/sqlUtil/whereUtil/impl/InnerPrepWhereImpl.java similarity index 100% rename from aiyh/utils/sqlUtil/whereUtil/impl/InnerPrepWhereImpl.java rename to src/aiyh/utils/sqlUtil/whereUtil/impl/InnerPrepWhereImpl.java diff --git a/aiyh/utils/sqlUtil/whereUtil/impl/InnerPrepWhereOperatorImpl.java b/src/aiyh/utils/sqlUtil/whereUtil/impl/InnerPrepWhereOperatorImpl.java similarity index 100% rename from aiyh/utils/sqlUtil/whereUtil/impl/InnerPrepWhereOperatorImpl.java rename to src/aiyh/utils/sqlUtil/whereUtil/impl/InnerPrepWhereOperatorImpl.java diff --git a/aiyh/utils/sqlUtil/whereUtil/impl/InnerWhereImpl.java b/src/aiyh/utils/sqlUtil/whereUtil/impl/InnerWhereImpl.java similarity index 100% rename from aiyh/utils/sqlUtil/whereUtil/impl/InnerWhereImpl.java rename to src/aiyh/utils/sqlUtil/whereUtil/impl/InnerWhereImpl.java diff --git a/aiyh/utils/sqlUtil/whereUtil/impl/InnerWhereOperatorImpl.java b/src/aiyh/utils/sqlUtil/whereUtil/impl/InnerWhereOperatorImpl.java similarity index 100% rename from aiyh/utils/sqlUtil/whereUtil/impl/InnerWhereOperatorImpl.java rename to src/aiyh/utils/sqlUtil/whereUtil/impl/InnerWhereOperatorImpl.java diff --git a/aiyh/utils/sqlUtil/whereUtil/impl/PrepWhereImpl.java b/src/aiyh/utils/sqlUtil/whereUtil/impl/PrepWhereImpl.java similarity index 100% rename from aiyh/utils/sqlUtil/whereUtil/impl/PrepWhereImpl.java rename to src/aiyh/utils/sqlUtil/whereUtil/impl/PrepWhereImpl.java diff --git a/aiyh/utils/sqlUtil/whereUtil/impl/PrepWhereOperatorImpl.java b/src/aiyh/utils/sqlUtil/whereUtil/impl/PrepWhereOperatorImpl.java similarity index 100% rename from aiyh/utils/sqlUtil/whereUtil/impl/PrepWhereOperatorImpl.java rename to src/aiyh/utils/sqlUtil/whereUtil/impl/PrepWhereOperatorImpl.java diff --git a/aiyh/utils/sqlUtil/whereUtil/impl/WhereImpl.java b/src/aiyh/utils/sqlUtil/whereUtil/impl/WhereImpl.java similarity index 100% rename from aiyh/utils/sqlUtil/whereUtil/impl/WhereImpl.java rename to src/aiyh/utils/sqlUtil/whereUtil/impl/WhereImpl.java diff --git a/aiyh/utils/sqlUtil/whereUtil/impl/WhereOperatorImpl.java b/src/aiyh/utils/sqlUtil/whereUtil/impl/WhereOperatorImpl.java similarity index 100% rename from aiyh/utils/sqlUtil/whereUtil/impl/WhereOperatorImpl.java rename to src/aiyh/utils/sqlUtil/whereUtil/impl/WhereOperatorImpl.java diff --git a/aiyh/utils/zwl/common/CusBaseAction.java b/src/aiyh/utils/zwl/common/CusBaseAction.java similarity index 100% rename from aiyh/utils/zwl/common/CusBaseAction.java rename to src/aiyh/utils/zwl/common/CusBaseAction.java diff --git a/aiyh/utils/zwl/common/ToolUtil.java b/src/aiyh/utils/zwl/common/ToolUtil.java similarity index 100% rename from aiyh/utils/zwl/common/ToolUtil.java rename to src/aiyh/utils/zwl/common/ToolUtil.java diff --git a/aiyh/utils/zwl/common/logging/Log4JLogger.java b/src/aiyh/utils/zwl/common/logging/Log4JLogger.java similarity index 100% rename from aiyh/utils/zwl/common/logging/Log4JLogger.java rename to src/aiyh/utils/zwl/common/logging/Log4JLogger.java diff --git a/aiyh/utils/zwl/common/logging/Logger.java b/src/aiyh/utils/zwl/common/logging/Logger.java similarity index 100% rename from aiyh/utils/zwl/common/logging/Logger.java rename to src/aiyh/utils/zwl/common/logging/Logger.java diff --git a/aiyh/utils/zwl/common/logging/LoggerFactory.java b/src/aiyh/utils/zwl/common/logging/LoggerFactory.java similarity index 100% rename from aiyh/utils/zwl/common/logging/LoggerFactory.java rename to src/aiyh/utils/zwl/common/logging/LoggerFactory.java diff --git a/com/.DS_Store b/src/com/.DS_Store similarity index 100% rename from com/.DS_Store rename to src/com/.DS_Store diff --git a/com/api/aiy_changeStatus/Impl/ChangeStatusImpl.java b/src/com/api/aiy_changeStatus/Impl/ChangeStatusImpl.java similarity index 100% rename from com/api/aiy_changeStatus/Impl/ChangeStatusImpl.java rename to src/com/api/aiy_changeStatus/Impl/ChangeStatusImpl.java diff --git a/com/api/aiy_changeStatus/Impl/Util/ChangeStatusUtil.java b/src/com/api/aiy_changeStatus/Impl/Util/ChangeStatusUtil.java similarity index 100% rename from com/api/aiy_changeStatus/Impl/Util/ChangeStatusUtil.java rename to src/com/api/aiy_changeStatus/Impl/Util/ChangeStatusUtil.java diff --git a/com/api/aiyh_guijiu/dao/ConflictWorkflowDao.java b/src/com/api/aiyh_guijiu/dao/ConflictWorkflowDao.java similarity index 100% rename from com/api/aiyh_guijiu/dao/ConflictWorkflowDao.java rename to src/com/api/aiyh_guijiu/dao/ConflictWorkflowDao.java diff --git a/com/api/aiyh_guijiu/pojo/UfWorkflowConflicDt1DTO.java b/src/com/api/aiyh_guijiu/pojo/UfWorkflowConflicDt1DTO.java similarity index 100% rename from com/api/aiyh_guijiu/pojo/UfWorkflowConflicDt1DTO.java rename to src/com/api/aiyh_guijiu/pojo/UfWorkflowConflicDt1DTO.java diff --git a/com/api/aiyh_guijiu/pojo/WorkflowBaseInfoDTO.java b/src/com/api/aiyh_guijiu/pojo/WorkflowBaseInfoDTO.java similarity index 100% rename from com/api/aiyh_guijiu/pojo/WorkflowBaseInfoDTO.java rename to src/com/api/aiyh_guijiu/pojo/WorkflowBaseInfoDTO.java diff --git a/com/api/aiyh_guijiu/pojo/WorkflowConfigDTO.java b/src/com/api/aiyh_guijiu/pojo/WorkflowConfigDTO.java similarity index 100% rename from com/api/aiyh_guijiu/pojo/WorkflowConfigDTO.java rename to src/com/api/aiyh_guijiu/pojo/WorkflowConfigDTO.java diff --git a/com/api/aiyh_guijiu/service/WorkflowQueueService.java b/src/com/api/aiyh_guijiu/service/WorkflowQueueService.java similarity index 100% rename from com/api/aiyh_guijiu/service/WorkflowQueueService.java rename to src/com/api/aiyh_guijiu/service/WorkflowQueueService.java diff --git a/com/api/aiyh_guijiu/vo/ConfigInfoVo.java b/src/com/api/aiyh_guijiu/vo/ConfigInfoVo.java similarity index 100% rename from com/api/aiyh_guijiu/vo/ConfigInfoVo.java rename to src/com/api/aiyh_guijiu/vo/ConfigInfoVo.java diff --git a/com/api/aiyh_guijiu/vo/PicPsVO.java b/src/com/api/aiyh_guijiu/vo/PicPsVO.java similarity index 100% rename from com/api/aiyh_guijiu/vo/PicPsVO.java rename to src/com/api/aiyh_guijiu/vo/PicPsVO.java diff --git a/com/api/aiyh_guijiu/web/ConflictWorkflowController.java b/src/com/api/aiyh_guijiu/web/ConflictWorkflowController.java similarity index 100% rename from com/api/aiyh_guijiu/web/ConflictWorkflowController.java rename to src/com/api/aiyh_guijiu/web/ConflictWorkflowController.java diff --git a/com/api/aiyh_kafang/dao/InvoiceMapping.java b/src/com/api/aiyh_kafang/dao/InvoiceMapping.java similarity index 100% rename from com/api/aiyh_kafang/dao/InvoiceMapping.java rename to src/com/api/aiyh_kafang/dao/InvoiceMapping.java diff --git a/com/api/aiyh_kafang/entity/UfInvoiceConfigDTO.java b/src/com/api/aiyh_kafang/entity/UfInvoiceConfigDTO.java similarity index 100% rename from com/api/aiyh_kafang/entity/UfInvoiceConfigDTO.java rename to src/com/api/aiyh_kafang/entity/UfInvoiceConfigDTO.java diff --git a/com/api/aiyh_kafang/service/InvoiceService.java b/src/com/api/aiyh_kafang/service/InvoiceService.java similarity index 100% rename from com/api/aiyh_kafang/service/InvoiceService.java rename to src/com/api/aiyh_kafang/service/InvoiceService.java diff --git a/com/api/aiyh_kafang/service/UploadByBase64Service.java b/src/com/api/aiyh_kafang/service/UploadByBase64Service.java similarity index 100% rename from com/api/aiyh_kafang/service/UploadByBase64Service.java rename to src/com/api/aiyh_kafang/service/UploadByBase64Service.java diff --git a/com/api/aiyh_kafang/web/InvoiceController.java b/src/com/api/aiyh_kafang/web/InvoiceController.java similarity index 100% rename from com/api/aiyh_kafang/web/InvoiceController.java rename to src/com/api/aiyh_kafang/web/InvoiceController.java diff --git a/com/api/aiyh_kafang/web/UploadByBase64.java b/src/com/api/aiyh_kafang/web/UploadByBase64.java similarity index 100% rename from com/api/aiyh_kafang/web/UploadByBase64.java rename to src/com/api/aiyh_kafang/web/UploadByBase64.java diff --git a/com/api/aiyh_pcn/async_organization/ExportExcel.java b/src/com/api/aiyh_pcn/async_organization/ExportExcel.java similarity index 100% rename from com/api/aiyh_pcn/async_organization/ExportExcel.java rename to src/com/api/aiyh_pcn/async_organization/ExportExcel.java diff --git a/com/api/aiyh_pcn/copy_attachment/dao/ConfigTableData.java b/src/com/api/aiyh_pcn/copy_attachment/dao/ConfigTableData.java similarity index 100% rename from com/api/aiyh_pcn/copy_attachment/dao/ConfigTableData.java rename to src/com/api/aiyh_pcn/copy_attachment/dao/ConfigTableData.java diff --git a/com/api/aiyh_pcn/copy_attachment/dao/DocTemplateDao.java b/src/com/api/aiyh_pcn/copy_attachment/dao/DocTemplateDao.java similarity index 100% rename from com/api/aiyh_pcn/copy_attachment/dao/DocTemplateDao.java rename to src/com/api/aiyh_pcn/copy_attachment/dao/DocTemplateDao.java diff --git a/com/api/aiyh_pcn/copy_attachment/model/ConfigEmpty.java b/src/com/api/aiyh_pcn/copy_attachment/model/ConfigEmpty.java similarity index 100% rename from com/api/aiyh_pcn/copy_attachment/model/ConfigEmpty.java rename to src/com/api/aiyh_pcn/copy_attachment/model/ConfigEmpty.java diff --git a/com/api/aiyh_pcn/copy_attachment/service/CopyAttachmentService.java b/src/com/api/aiyh_pcn/copy_attachment/service/CopyAttachmentService.java similarity index 100% rename from com/api/aiyh_pcn/copy_attachment/service/CopyAttachmentService.java rename to src/com/api/aiyh_pcn/copy_attachment/service/CopyAttachmentService.java diff --git a/com/api/aiyh_pcn/copy_attachment/web/CopyAttachment.java b/src/com/api/aiyh_pcn/copy_attachment/web/CopyAttachment.java similarity index 100% rename from com/api/aiyh_pcn/copy_attachment/web/CopyAttachment.java rename to src/com/api/aiyh_pcn/copy_attachment/web/CopyAttachment.java diff --git a/src/com/api/aiyh_pcn/fadada/dao/FaDDContractMapping.java b/src/com/api/aiyh_pcn/fadada/dao/FaDDContractMapping.java new file mode 100644 index 0000000..43ed930 --- /dev/null +++ b/src/com/api/aiyh_pcn/fadada/dao/FaDDContractMapping.java @@ -0,0 +1,194 @@ +package com.api.aiyh_pcn.fadada.dao; + +import aiyh.utils.Util; +import aiyh.utils.zwl.common.ToolUtil; +import com.api.aiyh_pcn.fadada.entity.FaDaDaConfigDTO; +import com.api.aiyh_pcn.fadada.entity.PushAPushEmailEntity; +import com.api.aiyh_pcn.fadada.entity.UfContractInfoDTO; +import com.api.aiyh_pcn.fadada.typeEnum.DisableEnableType; +import weaver.aiyh_pcn.fadada.entity.FileInfo; +import weaver.conn.RecordSet; +import weaver.workflow.workflow.WorkflowVersion; + +import java.util.List; +import java.util.Map; + +/** + * @author EBU7-dev1-ayh + * @create 2021/11/3 0003 14:56 + */ + + +public class FaDDContractMapping { + private final RecordSet rs = new RecordSet(); + private final ToolUtil toolUtil = new ToolUtil(); + + /** + * 查询合同相关的配置信息 + * + * @param workflowId 流程id + * @param type 配置的类型 + * @return 配置信息 + */ + public FaDaDaConfigDTO queryConfig(String workflowId, int type) { + String versionStringByWfid = WorkflowVersion.getVersionStringByWfid(workflowId); + String query = "select main.id,main.workflow_type,main.api_type, main.params_config," + + "main.signed_type,wf2.fieldname field_control1," + + "wf.fieldname field_control, wf1.fieldname contract_doc, " + + "(select GROUP_CONCAT('',selectvalue,'') selectvalue from workflow_selectitem " + + "where FIND_IN_SET(id,main.only_own)) only_own, " + + "(select GROUP_CONCAT('',selectvalue,'') selectvalue from workflow_selectitem " + + "where FIND_IN_SET(id,main.only_other)) only_other, " + + "(select GROUP_CONCAT('',selectvalue,'') selectvalue from workflow_selectitem " + + "where FIND_IN_SET(id,main.both_all)) both_all, " + + "(select GROUP_CONCAT('',selectvalue,'') selectvalue from workflow_selectitem " + + "where FIND_IN_SET(id,main.check_personal)) check_personal, " + + "(select GROUP_CONCAT('',selectvalue,'') selectvalue from workflow_selectitem " + + "where FIND_IN_SET(id,main.check_enterprise)) check_enterprise," + + "main.check_source_type,wdt.tablename check_source " + + "from uf_contract_config main " + + "left join workflow_field_table_view wf on wf.id = main.field_control " + + "left join workflow_field_table_view wf1 on wf1.id = main.contract_doc " + + "left join workflow_field_table_view wf2 on wf2.id = main.field_control1 " + + "left join workflow_detail_table_view wdt on wdt.id = main.check_source and " + + "wdt.workflow_id = main.workflow_type " + + "where main.workflow_type in ( " + versionStringByWfid + ") and api_type = ?"; + rs.executeQuery(query, type); + return Util.recordeSet2Entity(rs, FaDaDaConfigDTO.class, true); + } + + + /** + * 获取全版本的workflowId + * + * @param versionStringByWfid 全版本的workflowId + * @return + */ + public String getAllVersion(String versionStringByWfid) { + String query = "select distinct workflow_type from uf_contract_config where workflow_type in (" + versionStringByWfid + ")"; + rs.executeQuery(query); + rs.next(); + return rs.getString(1); + } + + /** + * 获取节点信息 + * + * @param versionStringByWfid 全版本的流程 + * @param markOnly 获取配置的节点信息 + * @return + */ + public String getNodes(String versionStringByWfid) { + String query = "select workflow_nodes from uf_node_config where workflow_type in (" + versionStringByWfid + ") and enable_nodes = ?"; + rs.executeQuery(query, 1); + rs.next(); + return rs.getString(1); + } + + /** + * 获取流程主表 + * + * @param workflowId + * @return + */ + public String getMainTable(String workflowId) { + String versionStringByWfid = WorkflowVersion.getVersionStringByWfid(workflowId); + String query = "select tablename from workflow_bill " + + " where id in (select formid from workflow_base " + + " where id in (" + versionStringByWfid + ") )"; + rs.executeQuery(query); + rs.next(); + String mainTable = rs.getString(1); + toolUtil.writeDebuggerLog("mainTable:" + mainTable); + return mainTable; + } + + /** + * 获取配置的明细表 + * + * @param workflowId + * @param type + * @return + */ + public String getDetailTable(String workflowId, int type) { + FaDaDaConfigDTO faDaDaConfigDTO = this.queryConfig(workflowId, type); + String detailTable = faDaDaConfigDTO.getCheckSource(); + toolUtil.writeDebuggerLog("detailTable:" + detailTable); + return detailTable; + } + + /** + * 根据主表和请求id查询主表数据 + * + * @param requestId 请求id + * @param mainTableName 主表表名 + * @return + */ + public Map queryMainMap(String requestId, String mainTableName) { + String query = "select * from " + mainTableName + " where requestid = ?"; + RecordSet rs = new RecordSet(); + rs.executeQuery(query, requestId); + return Util.recordSet2Map(rs); + } + + /** + * 查询明细数据 + * + * @param mainId 主表id + * @param tableName 明细表表名 + * @return + */ + public List> queryDetailMaps(String mainId, String tableName) { + String query = "select * from " + tableName + " where mainid = ?"; + RecordSet rs = new RecordSet(); + rs.executeQuery(query, mainId); + return Util.recordSet2MapList(rs); + } + + + /** + * 查询合同的配置信息 + * + * @param workflowId + * @return + */ +/* public Map queryContractConfig(String workflowId) { + String versionStringByWfid = WorkflowVersion.getVersionStringByWfid(workflowId); + RecordSet rs = new RecordSet(); + rs.executeQuery("select * from uf_contract_config where workflow_type in ( " + versionStringByWfid + " ) and api_type = ?", 2); + return Util.recordSet2Map(rs); + }*/ + + /** + * 根据文件的id查询物理文件的id + * + * @param fileIds + * @return + */ + public List queryImgFileIdByDocIds(String fileIds) { + String query = "select imagefileid,imagefilename from docimagefile where docid in ( " + fileIds + " )"; + rs.executeQuery(query); + return Util.recordeSet2Array(rs, FileInfo.class); + } + + public UfContractInfoDTO queryContractInfo(String contractNo) { + String query = "select * from uf_contract_info where contract_no = ?"; + RecordSet rs = new RecordSet(); + rs.executeQuery(query, contractNo); + return Util.recordeSet2Entity(rs, UfContractInfoDTO.class, true); + } + + public UfContractInfoDTO queryContractInfoByRequestId(String requestId) { + String query = "select * from uf_contract_info where workflow_request_id = ?"; + RecordSet rs = new RecordSet(); + rs.executeQuery(query, requestId); + return Util.recordeSet2Entity(rs, UfContractInfoDTO.class, true); + } + + public PushAPushEmailEntity queryEmailInfo(int workflowType) { + String query = "select * from uf_push_a_push where workflow_type = ? and disable_enable = ?"; + RecordSet rs = new RecordSet(); + rs.executeQuery(query, workflowType, DisableEnableType.enable.getValue()); + return Util.recordeSet2Entity(rs, PushAPushEmailEntity.class, true); + } +} diff --git a/com/api/aiyh_pcn/fadada/dao/FaDDServiceMapping.java b/src/com/api/aiyh_pcn/fadada/dao/FaDDServiceMapping.java similarity index 100% rename from com/api/aiyh_pcn/fadada/dao/FaDDServiceMapping.java rename to src/com/api/aiyh_pcn/fadada/dao/FaDDServiceMapping.java diff --git a/com/api/aiyh_pcn/fadada/entity/FaDaDaConfigDTO.java b/src/com/api/aiyh_pcn/fadada/entity/FaDaDaConfigDTO.java similarity index 100% rename from com/api/aiyh_pcn/fadada/entity/FaDaDaConfigDTO.java rename to src/com/api/aiyh_pcn/fadada/entity/FaDaDaConfigDTO.java diff --git a/src/com/api/aiyh_pcn/fadada/entity/PushAPushEmailEntity.java b/src/com/api/aiyh_pcn/fadada/entity/PushAPushEmailEntity.java new file mode 100644 index 0000000..4547567 --- /dev/null +++ b/src/com/api/aiyh_pcn/fadada/entity/PushAPushEmailEntity.java @@ -0,0 +1,21 @@ +package com.api.aiyh_pcn.fadada.entity; + +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; + +/** + * @author EBU7-dev1-ayh + * create 2021/12/13 0013 14:54 + */ + +@Getter +@Setter +@ToString +public class PushAPushEmailEntity { + private Integer workflowType; + private Integer disableEnable; + private String emailAddress; + private String emailTitle; + private String emailContent; +} diff --git a/com/api/aiyh_pcn/fadada/entity/TreeEntity.java b/src/com/api/aiyh_pcn/fadada/entity/TreeEntity.java similarity index 100% rename from com/api/aiyh_pcn/fadada/entity/TreeEntity.java rename to src/com/api/aiyh_pcn/fadada/entity/TreeEntity.java diff --git a/src/com/api/aiyh_pcn/fadada/entity/UfContractInfoDTO.java b/src/com/api/aiyh_pcn/fadada/entity/UfContractInfoDTO.java new file mode 100644 index 0000000..e620d60 --- /dev/null +++ b/src/com/api/aiyh_pcn/fadada/entity/UfContractInfoDTO.java @@ -0,0 +1,222 @@ +package com.api.aiyh_pcn.fadada.entity; + + +public class UfContractInfoDTO { + + private int id; + private int requestId; + private int workflowType; + private String contractNo; + private String fileNo; + private String fileName; + private int signedNum; + private int shouldSignedNum; + private int contractStatus; + private String contractViewUrl; + private String contractDownUrl; + private String workflowMainTable; + private int queueSigned; + private int singleContractFileNum; + private int singleSignedNum; + private String workflowRequestId; + private String workflowDetailTable; + private String signedType; + private String userInfo; + private String contractSignedUrl; + private int mainId; + + public void setId(int id) { + this.id = id; + } + + public void setRequestId(int requestId) { + this.requestId = requestId; + } + + public void setWorkflowType(int workflowType) { + this.workflowType = workflowType; + } + + public void setContractNo(String contractNo) { + this.contractNo = contractNo; + } + + public void setFileNo(String fileNo) { + this.fileNo = fileNo; + } + + public void setFileName(String fileName) { + this.fileName = fileName; + } + + public void setSignedNum(int signedNum) { + this.signedNum = signedNum; + } + + public void setShouldSignedNum(int shouldSignedNum) { + this.shouldSignedNum = shouldSignedNum; + } + + public void setContractStatus(int contractStatus) { + this.contractStatus = contractStatus; + } + + public void setContractViewUrl(String contractViewUrl) { + this.contractViewUrl = contractViewUrl; + } + + public void setContractDownUrl(String contractDownUrl) { + this.contractDownUrl = contractDownUrl; + } + + public void setWorkflowMainTable(String workflowMainTable) { + this.workflowMainTable = workflowMainTable; + } + + public void setQueueSigned(int queueSigned) { + this.queueSigned = queueSigned; + } + + public void setSingleContractFileNum(int singleContractFileNum) { + this.singleContractFileNum = singleContractFileNum; + } + + public void setSingleSignedNum(int singleSignedNum) { + this.singleSignedNum = singleSignedNum; + } + + public void setWorkflowRequestId(String workflowRequestId) { + this.workflowRequestId = workflowRequestId; + } + + public void setWorkflowDetailTable(String workflowDetailTable) { + this.workflowDetailTable = workflowDetailTable; + } + + public void setMainId(int mainId) { + this.mainId = mainId; + } + + public int getId() { + return this.id; + } + + public int getRequestId() { + return this.requestId; + } + + public int getWorkflowType() { + return this.workflowType; + } + + public String getContractNo() { + return this.contractNo; + } + + public String getFileNo() { + return this.fileNo; + } + + public String getFileName() { + return this.fileName; + } + + public int getSignedNum() { + return this.signedNum; + } + + public int getShouldSignedNum() { + return this.shouldSignedNum; + } + + public int getContractStatus() { + return this.contractStatus; + } + + public String getContractViewUrl() { + return this.contractViewUrl; + } + + public String getContractDownUrl() { + return this.contractDownUrl; + } + + public String getWorkflowMainTable() { + return this.workflowMainTable; + } + + public int getQueueSigned() { + return this.queueSigned; + } + + public int getSingleContractFileNum() { + return this.singleContractFileNum; + } + + public int getSingleSignedNum() { + return this.singleSignedNum; + } + + public String getWorkflowRequestId() { + return this.workflowRequestId; + } + + public String getWorkflowDetailTable() { + return this.workflowDetailTable; + } + + public int getMainId() { + return this.mainId; + } + + public String getSignedType() { + return signedType; + } + + public void setSignedType(String signedType) { + this.signedType = signedType; + } + + public String getUserInfo() { + return userInfo; + } + + public void setUserInfo(String userInfo) { + this.userInfo = userInfo; + } + + public String getContractSignedUrl() { + return contractSignedUrl; + } + + public void setContractSignedUrl(String contractSignedUrl) { + this.contractSignedUrl = contractSignedUrl; + } + + @Override + public String toString() { + return "UfContractInfoDTO{" + + "id=" + id + + ", requestId=" + requestId + + ", workflowType=" + workflowType + + ", contractNo='" + contractNo + '\'' + + ", fileNo='" + fileNo + '\'' + + ", fileName='" + fileName + '\'' + + ", signedNum=" + signedNum + + ", shouldSignedNum=" + shouldSignedNum + + ", contractStatus=" + contractStatus + + ", contractViewUrl='" + contractViewUrl + '\'' + + ", contractDownUrl='" + contractDownUrl + '\'' + + ", workflowMainTable='" + workflowMainTable + '\'' + + ", queueSigned=" + queueSigned + + ", singleContractFileNum=" + singleContractFileNum + + ", singleSignedNum=" + singleSignedNum + + ", workflowRequestId='" + workflowRequestId + '\'' + + ", workflowDetailTable='" + workflowDetailTable + '\'' + + ", signedType='" + signedType + '\'' + + ", userInfo='" + userInfo + '\'' + + ", contractSignedUrl='" + contractSignedUrl + '\'' + + ", mainId=" + mainId + + '}'; + } +} \ No newline at end of file diff --git a/com/api/aiyh_pcn/fadada/service/IFaDDService.java b/src/com/api/aiyh_pcn/fadada/service/IFaDDService.java similarity index 100% rename from com/api/aiyh_pcn/fadada/service/IFaDDService.java rename to src/com/api/aiyh_pcn/fadada/service/IFaDDService.java diff --git a/com/api/aiyh_pcn/fadada/service/impl/FaDDContractService.java b/src/com/api/aiyh_pcn/fadada/service/impl/FaDDContractService.java similarity index 84% rename from com/api/aiyh_pcn/fadada/service/impl/FaDDContractService.java rename to src/com/api/aiyh_pcn/fadada/service/impl/FaDDContractService.java index 40484ea..f388e48 100644 --- a/com/api/aiyh_pcn/fadada/service/impl/FaDDContractService.java +++ b/src/com/api/aiyh_pcn/fadada/service/impl/FaDDContractService.java @@ -11,6 +11,7 @@ import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.TypeReference; import com.api.aiyh_pcn.fadada.dao.FaDDContractMapping; import com.api.aiyh_pcn.fadada.entity.FaDaDaConfigDTO; +import com.api.aiyh_pcn.fadada.entity.PushAPushEmailEntity; import com.api.aiyh_pcn.fadada.entity.UfContractInfoDTO; import com.api.aiyh_pcn.fadada.util.FaDDRequestUtils; import com.fasterxml.jackson.core.JsonProcessingException; @@ -18,6 +19,7 @@ import org.apache.axiom.util.base64.Base64Utils; import org.apache.http.HttpEntity; import org.h2.util.StringUtils; import weaver.conn.RecordSet; +import weaver.email.EmailWorkRunnable; import weaver.general.xcommon.IOUtils; import weaver.hrm.User; import weaver.soa.workflow.FileProcessor; @@ -31,6 +33,8 @@ import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.concurrent.atomic.AtomicReference; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; @@ -575,7 +579,14 @@ public class FaDDContractService { }*/ // 签署下一次 toolUtil.writeDebuggerLog("下一个供应商签署合同,签署数据:" + JSON.toJSONString(map)); - signedRequest(map, apiConfigMainDTO); + List> resultList = signedRequest(map, apiConfigMainDTO); + List signedList = new ArrayList<>(); +// 遍历将数据保存到合同信息表中 + for (Map result : resultList) { + signedList.add(String.valueOf(result.get("signerUrl"))); + } +// 将合同签署地址保存到建模信息中 + updateData.put("contract_signed_url", String.join(" ; ", signedList)); // 将合同签署信息更新到合同信息表中 updateData.put("single_signed_num", 0); PrepSqlResultImpl sqlResult = @@ -608,9 +619,10 @@ public class FaDDContractService { * @param map * @param apiConfigMainDTO */ - private void signedRequest(Map map, ApiConfigMainDTO apiConfigMainDTO) { + private List> signedRequest(Map map, ApiConfigMainDTO apiConfigMainDTO) { String contractNos = Util.null2String(map.get("contractNo")); String[] split = contractNos.split(","); + List> resultList = new ArrayList<>(); // RecordSet rs = new RecordSet(); for (String s : split) { map.put("contractNo", s); @@ -625,7 +637,9 @@ public class FaDDContractService { toolUtil.writeDebuggerLog("法大大接口签署合同失败!"); throw new RuntimeException("法大大接口签署合同失败!"); } + resultList.add((Map) response.get("data")); } + return resultList; } /** @@ -938,4 +952,147 @@ public class FaDDContractService { apiConfigMainDTO.getApiUrl()); }; } + + public void pushAPush(String requestId) { + toolUtil.writeDebuggerLog("进入催一催方法==================="); + UfContractInfoDTO ufContractInfoDTO = faDDContractMapping.queryContractInfoByRequestId(requestId); + toolUtil.writeDebuggerLog("获取到合同数据:" + JSON.toJSONString(ufContractInfoDTO)); + String signedUrls = Util.null2String(ufContractInfoDTO.getContractSignedUrl()); + PushAPushEmailEntity pushAPushEmailEntity = queryEmailInfo(ufContractInfoDTO.getWorkflowType(), + ufContractInfoDTO.getWorkflowRequestId()); + toolUtil.writeDebuggerLog("获取到邮件信息数据:" + JSON.toJSONString(pushAPushEmailEntity)); + String content = pushAPushEmailEntity.getEmailContent().replaceAll("#\\{info.signedUrls}", signedUrls); + toolUtil.writeDebuggerLog("contnet:" + content); + try { + EmailWorkRunnable.threadModeReminder(pushAPushEmailEntity.getEmailAddress(), "", "", + pushAPushEmailEntity.getEmailTitle(), + content); + } catch (Exception e) { + toolUtil.writeDebuggerLog(e.toString()); + } + toolUtil.writeDebuggerLog("结束催一催方法==================="); + } + + private PushAPushEmailEntity queryEmailInfo(int workflowType, String requestId) { + PushAPushEmailEntity pushAPushEmailEntity = faDDContractMapping.queryEmailInfo(workflowType); + Map workflowData = getWorkflowData(String.valueOf(workflowType), requestId); + toolUtil.writeDebuggerLog("获取到邮件配置参数:" + JSON.toJSONString(pushAPushEmailEntity)); + toolUtil.writeDebuggerLog("查询到的数据:===> " + JSON.toJSONString(workflowData)); + String parsingTitle = parsingValue(pushAPushEmailEntity.getEmailTitle(), workflowData); + toolUtil.writeDebuggerLog("parsingTitle解析后的值:" + parsingTitle); + pushAPushEmailEntity.setEmailTitle(parsingTitle); + String parsingEmail = parsingValue(pushAPushEmailEntity.getEmailAddress(), workflowData); + toolUtil.writeDebuggerLog("parsingEmail解析后的值:" + parsingEmail); + pushAPushEmailEntity.setEmailAddress(parsingEmail); + try { + String parsingContent = parsingValue(pushAPushEmailEntity.getEmailContent(), workflowData); + toolUtil.writeDebuggerLog("parsingContent解析后的值:" + parsingContent); + pushAPushEmailEntity.setEmailContent(parsingContent); + } catch (Exception e) { + toolUtil.writeDebuggerLog("解析出错:" + e.toString()); + } + return pushAPushEmailEntity; + } + + public String parsingValue(String str, Map workflowData) { + String regEx = "\\$\\{(?\\S+?)}"; + Pattern compile = Pattern.compile(regEx); + Matcher matcher = compile.matcher(str); + String parsingValue = str; + parsingValue = parsingValue.replaceAll("\\$\\{sys\\.data}", Util.getTime("yyyy-MM-dd")); + parsingValue = parsingValue.replaceAll("\\$\\{sys\\.time}", Util.getTime("HH:mm:ss")); + parsingValue = parsingValue.replaceAll("\\$\\{sys\\.dataTime}", Util.getTime("yyyy-MM-dd HH:mm:ss")); + while (matcher.find()) { + String key = matcher.group("key"); + String value = Util.null2String(workflowData.get(key)); + parsingValue = parsingValue.replaceFirst(regEx, value); + } + regEx = "#sql\\{\\{(?(\\S\\s)+?)}}"; + compile = Pattern.compile(regEx); + matcher = compile.matcher(str); + while (matcher.find()) { + String key = matcher.group("key"); + String value = parsingSql(key, workflowData); + parsingValue = parsingValue.replaceFirst(regEx, value); + } + return parsingValue; + } + + private String parsingSql(String str, Map workflowData) { + RecordSet rs = new RecordSet(); + String sqlRegEx = "#\\{(?\\S+?)}"; + Pattern sqlCompile = Pattern.compile(sqlRegEx); + Matcher sqlMatcher = sqlCompile.matcher(str); + String parsingSql = str; + parsingSql = parsingSql.replaceAll("#\\{sys\\.data}", "'" + Util.getTime("yyyy-MM-dd") + "'"); + parsingSql = parsingSql.replaceAll("#\\{sys\\.time}", "'" + Util.getTime("HH:mm:ss") + "'"); + parsingSql = parsingSql.replaceAll("#\\{sys\\.dataTime}", "'" + Util.getTime("yyyy-MM-dd HH:mm:ss") + "'"); + List args = new ArrayList<>(); + while (sqlMatcher.find()) { + String key = sqlMatcher.group("key"); + String value = Util.null2String(workflowData.get(key)); + parsingSql = parsingSql.replaceFirst(sqlRegEx, "?"); + args.add(value); + } + String value = ""; + if (str.toLowerCase().trim().startsWith("select")) { + rs.executeQuery(parsingSql, args); + if (rs.next()) { + value = rs.getString(1); + } + } + return value; + } + + public Map getWorkflowData(String workflowId, String requestId) { + String queryMainTable = "select base.id,base.workflowname,base.formid,bill.tablename " + + "from workflow_bill bill join workflow_base base on base.formid = bill.id " + + "where base.id = ?"; + RecordSet rs = new RecordSet(); + rs.executeQuery(queryMainTable, workflowId); + String mainTable = ""; + if (rs.next()) { + mainTable = rs.getString("tablename"); + } else { + toolUtil.writeDebuggerLog("表查询到数据为null," + mainTable + "---》" + queryMainTable); + } + String queryDetailTable = "select bill.id bill_id, base.workflowname,base.formid " + + "main_formid,bill.tablename,bill.orderid from workflow_billdetailtable bill " + + "join workflow_base base on base.formid = bill.billid where base.id = ?"; + rs.executeQuery(queryDetailTable, workflowId); + List> detailTableList = new ArrayList<>(); + while (rs.next()) { + Map map = new HashMap<>(); + map.put("tableName", rs.getString("tablename")); + map.put("tableOrderId", rs.getString("orderid")); + detailTableList.add(map); + } +// 查询主表数据 + String queryMainData = "select * from " + mainTable + " where requestid = ?"; + rs.executeQuery(queryMainData, requestId); + Map mainData = Util.recordSet2Map(rs); + if (mainData == null) { + toolUtil.writeDebuggerLog("查询到数据为null," + mainData + "---》" + queryMainData); + return null; + } +// 查询明细表数据 + for (Map detailTable : detailTableList) { + String queryDetailData = "select * from " + detailTable.get("tableName") + " where mainid = ?"; + rs.executeQuery(queryDetailData, String.valueOf(mainData.get("id"))); + Map detailData = Util.recordSet2Map(rs); + if (detailData == null) { + continue; + } + for (Map.Entry entry : detailData.entrySet()) { + mainData.put("detail_" + detailTable.get("tableOrderId") + "." + entry.getKey(), entry.getValue()); + } + } + mainData.put("requestId", requestId); + mainData.put("workflowId", workflowId); + return mainData; + } + } + + + diff --git a/com/api/aiyh_pcn/fadada/service/impl/FaDDServiceImpl.java b/src/com/api/aiyh_pcn/fadada/service/impl/FaDDServiceImpl.java similarity index 100% rename from com/api/aiyh_pcn/fadada/service/impl/FaDDServiceImpl.java rename to src/com/api/aiyh_pcn/fadada/service/impl/FaDDServiceImpl.java diff --git a/src/com/api/aiyh_pcn/fadada/typeEnum/DisableEnableType.java b/src/com/api/aiyh_pcn/fadada/typeEnum/DisableEnableType.java new file mode 100644 index 0000000..b23db12 --- /dev/null +++ b/src/com/api/aiyh_pcn/fadada/typeEnum/DisableEnableType.java @@ -0,0 +1,27 @@ +package com.api.aiyh_pcn.fadada.typeEnum; + +/** + * @author EBU7-dev1-ayh + * create 2021/12/13 0013 16:07 + */ + + +public enum DisableEnableType { + /** + * 不启用 + */ + disable(0), + /** + * 启用 + */ + enable(1); + private final int value; + + DisableEnableType(int value) { + this.value = value; + } + + public int getValue() { + return this.value; + } +} diff --git a/src/com/api/aiyh_pcn/fadada/typeEnum/EmailType.java b/src/com/api/aiyh_pcn/fadada/typeEnum/EmailType.java new file mode 100644 index 0000000..d096c74 --- /dev/null +++ b/src/com/api/aiyh_pcn/fadada/typeEnum/EmailType.java @@ -0,0 +1,29 @@ +package com.api.aiyh_pcn.fadada.typeEnum; + +/** + * @author @author EBU7-dev1-ay + * create 2021/12/13 0013 15:01 + */ + +public enum EmailType { + /** + * 固定值 + */ + fixedValue(0), + /** + * 查询你SQL + */ + querySql(1); + + private final int value; + + private EmailType(int value) { + this.value = value; + } + + public int getValue() { + return this.value; + } + + +} diff --git a/com/api/aiyh_pcn/fadada/util/FaDDRequestUtils.java b/src/com/api/aiyh_pcn/fadada/util/FaDDRequestUtils.java similarity index 100% rename from com/api/aiyh_pcn/fadada/util/FaDDRequestUtils.java rename to src/com/api/aiyh_pcn/fadada/util/FaDDRequestUtils.java diff --git a/com/api/aiyh_pcn/fadada/vo/TableFieldMappingVO.java b/src/com/api/aiyh_pcn/fadada/vo/TableFieldMappingVO.java similarity index 100% rename from com/api/aiyh_pcn/fadada/vo/TableFieldMappingVO.java rename to src/com/api/aiyh_pcn/fadada/vo/TableFieldMappingVO.java diff --git a/com/api/aiyh_pcn/fadada/web/FaDDContractController.java b/src/com/api/aiyh_pcn/fadada/web/FaDDContractController.java similarity index 72% rename from com/api/aiyh_pcn/fadada/web/FaDDContractController.java rename to src/com/api/aiyh_pcn/fadada/web/FaDDContractController.java index ce7b534..2c34efc 100644 --- a/com/api/aiyh_pcn/fadada/web/FaDDContractController.java +++ b/src/com/api/aiyh_pcn/fadada/web/FaDDContractController.java @@ -1,7 +1,18 @@ package com.api.aiyh_pcn.fadada.web; -import java.util.HashMap; -import java.util.Map; +import aiyh.utils.ApiResult; +import aiyh.utils.LabelHtmlUtils; +import aiyh.utils.Util; +import aiyh.utils.entity.LabelHtmlIndex; +import aiyh.utils.zwl.common.ToolUtil; +import com.alibaba.fastjson.JSON; +import com.api.aiyh_pcn.fadada.dao.FaDDContractMapping; +import com.api.aiyh_pcn.fadada.entity.UfContractInfoDTO; +import com.api.aiyh_pcn.fadada.service.impl.FaDDContractService; +import io.swagger.v3.oas.annotations.parameters.RequestBody; +import org.h2.util.StringUtils; +import weaver.hrm.HrmUserVarify; +import weaver.hrm.User; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @@ -10,20 +21,8 @@ import javax.ws.rs.core.Context; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import javax.ws.rs.core.StreamingOutput; - -import org.h2.util.StringUtils; - -import com.alibaba.fastjson.JSON; -import com.api.aiyh_pcn.fadada.dao.FaDDContractMapping; -import com.api.aiyh_pcn.fadada.entity.UfContractInfoDTO; -import com.api.aiyh_pcn.fadada.service.impl.FaDDContractService; - -import aiyh.utils.ApiResult; -import aiyh.utils.Util; -import aiyh.utils.zwl.common.ToolUtil; -import io.swagger.v3.oas.annotations.parameters.RequestBody; -import weaver.hrm.HrmUserVarify; -import weaver.hrm.User; +import java.util.HashMap; +import java.util.Map; /** * @author EBU7-dev1-ayh @@ -34,12 +33,12 @@ public class FaDDContractController { private final FaDDContractService faDDService = new FaDDContractService(); private final FaDDContractMapping faDDContractMapping = new FaDDContractMapping(); private final ToolUtil toolUtil = new ToolUtil(); + private final LabelHtmlUtils labelHtmlUtils = new LabelHtmlUtils("aiyh.htmlLabel.porsche.FaDDContractController"); /** * 获取流程全版本 * - * @param workflowId - * 流程id + * @param workflowId 流程id * @return 流程全版本id */ @Path("/getAllVersion/{workflowId}/{markOnly}") @@ -67,18 +66,22 @@ public class FaDDContractController { @Produces(MediaType.APPLICATION_JSON) @Consumes(MediaType.APPLICATION_JSON) public String signedCallBack(@RequestBody Map params) { - toolUtil.writeErrorLog("回调方法,获取到的请求参数:" + JSON.toJSONString(params)); Map result = new HashMap<>(); result.put("code", 200); result.put("msg", "操作成功!"); - String resultCode = String.valueOf(params.get("resultCode")); - if (!"1".equals(resultCode)) { - // 签署失败 - toolUtil.writeErrorLog("合同回调:签署失败,失败信息:" + JSON.toJSONString(params)); - return JSON.toJSONString(result); + try { + toolUtil.writeErrorLog("回调方法,获取到的请求参数:" + JSON.toJSONString(params)); + String resultCode = String.valueOf(params.get("resultCode")); + if (!"1".equals(resultCode)) { + // 签署失败 + toolUtil.writeErrorLog("合同回调:签署失败,失败信息:" + JSON.toJSONString(params)); + return JSON.toJSONString(result); + } + String contractNo = String.valueOf(params.get("docNo")); + faDDService.signedCallBack(contractNo); + } catch (Exception e) { + toolUtil.writeErrorLog(e.toString()); } - String contractNo = String.valueOf(params.get("docNo")); - faDDService.signedCallBack(contractNo); return JSON.toJSONString(result); } @@ -94,7 +97,7 @@ public class FaDDContractController { @Produces(MediaType.APPLICATION_JSON) @Consumes(MediaType.APPLICATION_JSON) public String querySignedStatus(@PathParam("requestId") String requestId, - @PathParam("workflowId") String workflowId) { + @PathParam("workflowId") String workflowId) { Map result = faDDService.querySignedStatus(requestId); return ApiResult.success(result); } @@ -102,10 +105,8 @@ public class FaDDContractController { /** * 本方签署 * - * @param workflowId - * 流程id - * @param requestId - * 请求id + * @param workflowId 流程id + * @param requestId 请求id * @return 本方签署结果 */ @Path("/signedContract/own/{requestId}/{workflowId}") @@ -113,7 +114,7 @@ public class FaDDContractController { @Consumes(MediaType.APPLICATION_JSON) @Produces(MediaType.APPLICATION_JSON) public String signedContractOwn(@Context HttpServletRequest request, @Context HttpServletResponse response, - @PathParam("workflowId") String workflowId, @PathParam("requestId") String requestId) { + @PathParam("workflowId") String workflowId, @PathParam("requestId") String requestId) { // TODO 更换labelIndex User user = HrmUserVarify.getUser(request, response); try { @@ -127,8 +128,7 @@ public class FaDDContractController { /** * 催一催 * - * @param requestId - * 请求id + * @param requestId 请求id * @return 催一催 */ @Path("/signedContract/{requestId}") @@ -136,15 +136,23 @@ public class FaDDContractController { @Consumes(MediaType.APPLICATION_JSON) @Produces(MediaType.APPLICATION_JSON) public String signedContract(@Context HttpServletRequest request, @Context HttpServletResponse response, - @PathParam("requestId") String requestId) { - return ApiResult.success("没有催一催接口还点!淦!等法大大调整,额。。。具体啥时候好我也不知道,反正不关我的事!"); + @PathParam("requestId") String requestId) { + User user = HrmUserVarify.getUser(request, response); + try { + faDDService.pushAPush(requestId); + } catch (Exception e) { + LabelHtmlIndex pushErr = labelHtmlUtils.getLabelHtmlIndex("pushErr"); + toolUtil.writeDebuggerLog(e.toString()); + return ApiResult.error(Util.getHtmlLabelName(pushErr, user)); + } + LabelHtmlIndex pushSuccess = labelHtmlUtils.getLabelHtmlIndex("pushSuccess"); + return ApiResult.success(Util.getHtmlLabelName(pushSuccess, user)); } /** * 合同下载 * - * @param requestId - * 请求id + * @param requestId 请求id * @return 合同问价压缩包 */ @Path("/contract/download/{requestId}") @@ -164,11 +172,11 @@ public class FaDDContractController { if (Util.null2String(ufContractInfoDTO.getContractNo()).split(",").length >= 2) { // 多文件 return Response.ok(contractZipStream, MediaType.APPLICATION_OCTET_STREAM).type("application/zip") - .header("Content-Disposition", "attachment;filename=" + requestTitle + ".zip").build(); + .header("Content-Disposition", "attachment;filename=" + requestTitle + ".zip").build(); } else { // 单文件 return Response.ok(contractZipStream, MediaType.APPLICATION_OCTET_STREAM).type("application/pdf") - .header("Content-Disposition", "attachment;filename=" + requestTitle).build(); + .header("Content-Disposition", "attachment;filename=" + requestTitle).build(); } } catch (Exception e) { toolUtil.writeErrorLog("文件流转换失败," + e); diff --git a/com/api/aiyh_pcn/fadada/web/FaDDController.java b/src/com/api/aiyh_pcn/fadada/web/FaDDController.java similarity index 100% rename from com/api/aiyh_pcn/fadada/web/FaDDController.java rename to src/com/api/aiyh_pcn/fadada/web/FaDDController.java diff --git a/com/api/aiyh_pcn/patentWall/controller/PatentWallController.java b/src/com/api/aiyh_pcn/patentWall/controller/PatentWallController.java similarity index 100% rename from com/api/aiyh_pcn/patentWall/controller/PatentWallController.java rename to src/com/api/aiyh_pcn/patentWall/controller/PatentWallController.java diff --git a/com/api/aiyh_pcn/patentWall/dao/PatentWallMapping.java b/src/com/api/aiyh_pcn/patentWall/dao/PatentWallMapping.java similarity index 100% rename from com/api/aiyh_pcn/patentWall/dao/PatentWallMapping.java rename to src/com/api/aiyh_pcn/patentWall/dao/PatentWallMapping.java diff --git a/com/api/aiyh_pcn/patentWall/dto/FilterWhere.java b/src/com/api/aiyh_pcn/patentWall/dto/FilterWhere.java similarity index 100% rename from com/api/aiyh_pcn/patentWall/dto/FilterWhere.java rename to src/com/api/aiyh_pcn/patentWall/dto/FilterWhere.java diff --git a/com/api/aiyh_pcn/patentWall/entity/PatentEntity.java b/src/com/api/aiyh_pcn/patentWall/entity/PatentEntity.java similarity index 100% rename from com/api/aiyh_pcn/patentWall/entity/PatentEntity.java rename to src/com/api/aiyh_pcn/patentWall/entity/PatentEntity.java diff --git a/com/api/aiyh_pcn/patentWall/service/PatentWallService.java b/src/com/api/aiyh_pcn/patentWall/service/PatentWallService.java similarity index 100% rename from com/api/aiyh_pcn/patentWall/service/PatentWallService.java rename to src/com/api/aiyh_pcn/patentWall/service/PatentWallService.java diff --git a/com/api/aiyh_pcn/patentWall/vo/LinkUrlVO.java b/src/com/api/aiyh_pcn/patentWall/vo/LinkUrlVO.java similarity index 100% rename from com/api/aiyh_pcn/patentWall/vo/LinkUrlVO.java rename to src/com/api/aiyh_pcn/patentWall/vo/LinkUrlVO.java diff --git a/com/api/aiyh_pcn/patentWall/vo/PatentVO.java b/src/com/api/aiyh_pcn/patentWall/vo/PatentVO.java similarity index 100% rename from com/api/aiyh_pcn/patentWall/vo/PatentVO.java rename to src/com/api/aiyh_pcn/patentWall/vo/PatentVO.java diff --git a/com/api/aiyh_pcn/patentWall/vo/SearchInputVO.java b/src/com/api/aiyh_pcn/patentWall/vo/SearchInputVO.java similarity index 100% rename from com/api/aiyh_pcn/patentWall/vo/SearchInputVO.java rename to src/com/api/aiyh_pcn/patentWall/vo/SearchInputVO.java diff --git a/com/api/aiyh_pcn/patentWall/vo/SelectOptionsVo.java b/src/com/api/aiyh_pcn/patentWall/vo/SelectOptionsVo.java similarity index 100% rename from com/api/aiyh_pcn/patentWall/vo/SelectOptionsVo.java rename to src/com/api/aiyh_pcn/patentWall/vo/SelectOptionsVo.java diff --git a/com/api/aiyh_quanshi/service/Impl/CancelMetingServiceImpl.java b/src/com/api/aiyh_quanshi/service/Impl/CancelMetingServiceImpl.java similarity index 100% rename from com/api/aiyh_quanshi/service/Impl/CancelMetingServiceImpl.java rename to src/com/api/aiyh_quanshi/service/Impl/CancelMetingServiceImpl.java diff --git a/com/api/aiyh_quanshi/service/Impl/DeleteMetingServiceImpl.java b/src/com/api/aiyh_quanshi/service/Impl/DeleteMetingServiceImpl.java similarity index 100% rename from com/api/aiyh_quanshi/service/Impl/DeleteMetingServiceImpl.java rename to src/com/api/aiyh_quanshi/service/Impl/DeleteMetingServiceImpl.java diff --git a/com/api/aiyh_quanshi/service/Impl/NewMetingServiceImpl.java b/src/com/api/aiyh_quanshi/service/Impl/NewMetingServiceImpl.java similarity index 100% rename from com/api/aiyh_quanshi/service/Impl/NewMetingServiceImpl.java rename to src/com/api/aiyh_quanshi/service/Impl/NewMetingServiceImpl.java diff --git a/com/api/doc/search/util/DocListUtil.java b/src/com/api/doc/search/util/DocListUtil.java similarity index 100% rename from com/api/doc/search/util/DocListUtil.java rename to src/com/api/doc/search/util/DocListUtil.java diff --git a/com/api/doc/search/web/SearchListAction.java b/src/com/api/doc/search/web/SearchListAction.java similarity index 100% rename from com/api/doc/search/web/SearchListAction.java rename to src/com/api/doc/search/web/SearchListAction.java diff --git a/com/customization/quanshimeting/NewMeetingServiceProxy.java b/src/com/customization/quanshimeting/NewMeetingServiceProxy.java similarity index 100% rename from com/customization/quanshimeting/NewMeetingServiceProxy.java rename to src/com/customization/quanshimeting/NewMeetingServiceProxy.java diff --git a/com/customization/quanshimeting/entity/MeetingInfoDTO.java b/src/com/customization/quanshimeting/entity/MeetingInfoDTO.java similarity index 100% rename from com/customization/quanshimeting/entity/MeetingInfoDTO.java rename to src/com/customization/quanshimeting/entity/MeetingInfoDTO.java diff --git a/weaver/aiyh_intercept/ChangeStatusIntercept.java b/src/weaver/aiyh_intercept/ChangeStatusIntercept.java similarity index 100% rename from weaver/aiyh_intercept/ChangeStatusIntercept.java rename to src/weaver/aiyh_intercept/ChangeStatusIntercept.java diff --git a/weaver/aiyh_pcn/async_organization/SyncOrganizationForOtherAPI.java b/src/weaver/aiyh_pcn/async_organization/SyncOrganizationForOtherAPI.java similarity index 100% rename from weaver/aiyh_pcn/async_organization/SyncOrganizationForOtherAPI.java rename to src/weaver/aiyh_pcn/async_organization/SyncOrganizationForOtherAPI.java diff --git a/weaver/aiyh_pcn/async_organization/config/SyncOrganizationConfig.java b/src/weaver/aiyh_pcn/async_organization/config/SyncOrganizationConfig.java similarity index 100% rename from weaver/aiyh_pcn/async_organization/config/SyncOrganizationConfig.java rename to src/weaver/aiyh_pcn/async_organization/config/SyncOrganizationConfig.java diff --git a/weaver/aiyh_pcn/async_organization/model/Department.java b/src/weaver/aiyh_pcn/async_organization/model/Department.java similarity index 100% rename from weaver/aiyh_pcn/async_organization/model/Department.java rename to src/weaver/aiyh_pcn/async_organization/model/Department.java diff --git a/weaver/aiyh_pcn/async_organization/model/Employee.java b/src/weaver/aiyh_pcn/async_organization/model/Employee.java similarity index 100% rename from weaver/aiyh_pcn/async_organization/model/Employee.java rename to src/weaver/aiyh_pcn/async_organization/model/Employee.java diff --git a/weaver/aiyh_pcn/async_organization/model/Position.java b/src/weaver/aiyh_pcn/async_organization/model/Position.java similarity index 100% rename from weaver/aiyh_pcn/async_organization/model/Position.java rename to src/weaver/aiyh_pcn/async_organization/model/Position.java diff --git a/weaver/aiyh_pcn/async_organization/result/ApiAsyncConfigResult.java b/src/weaver/aiyh_pcn/async_organization/result/ApiAsyncConfigResult.java similarity index 100% rename from weaver/aiyh_pcn/async_organization/result/ApiAsyncConfigResult.java rename to src/weaver/aiyh_pcn/async_organization/result/ApiAsyncConfigResult.java diff --git a/weaver/aiyh_pcn/async_organization/result/GetOrganizationResult.java b/src/weaver/aiyh_pcn/async_organization/result/GetOrganizationResult.java similarity index 100% rename from weaver/aiyh_pcn/async_organization/result/GetOrganizationResult.java rename to src/weaver/aiyh_pcn/async_organization/result/GetOrganizationResult.java diff --git a/weaver/aiyh_pcn/async_organization/result/ResultBean.java b/src/weaver/aiyh_pcn/async_organization/result/ResultBean.java similarity index 100% rename from weaver/aiyh_pcn/async_organization/result/ResultBean.java rename to src/weaver/aiyh_pcn/async_organization/result/ResultBean.java diff --git a/weaver/aiyh_pcn/async_organization/util/GetModelValue.java b/src/weaver/aiyh_pcn/async_organization/util/GetModelValue.java similarity index 100% rename from weaver/aiyh_pcn/async_organization/util/GetModelValue.java rename to src/weaver/aiyh_pcn/async_organization/util/GetModelValue.java diff --git a/weaver/aiyh_pcn/async_organization/util/SyncOrganizationUtils.java b/src/weaver/aiyh_pcn/async_organization/util/SyncOrganizationUtils.java similarity index 100% rename from weaver/aiyh_pcn/async_organization/util/SyncOrganizationUtils.java rename to src/weaver/aiyh_pcn/async_organization/util/SyncOrganizationUtils.java diff --git a/weaver/aiyh_pcn/convert_pdf/ConvertPdfAction.java b/src/weaver/aiyh_pcn/convert_pdf/ConvertPdfAction.java similarity index 100% rename from weaver/aiyh_pcn/convert_pdf/ConvertPdfAction.java rename to src/weaver/aiyh_pcn/convert_pdf/ConvertPdfAction.java diff --git a/weaver/aiyh_pcn/copy_attachment/AttachmentIdName.java b/src/weaver/aiyh_pcn/copy_attachment/AttachmentIdName.java similarity index 100% rename from weaver/aiyh_pcn/copy_attachment/AttachmentIdName.java rename to src/weaver/aiyh_pcn/copy_attachment/AttachmentIdName.java diff --git a/weaver/aiyh_pcn/copy_attachment/CopyAttachmentAction.java b/src/weaver/aiyh_pcn/copy_attachment/CopyAttachmentAction.java similarity index 100% rename from weaver/aiyh_pcn/copy_attachment/CopyAttachmentAction.java rename to src/weaver/aiyh_pcn/copy_attachment/CopyAttachmentAction.java diff --git a/weaver/aiyh_pcn/copy_attachment/CopyAttachmentSecretAction.java b/src/weaver/aiyh_pcn/copy_attachment/CopyAttachmentSecretAction.java similarity index 100% rename from weaver/aiyh_pcn/copy_attachment/CopyAttachmentSecretAction.java rename to src/weaver/aiyh_pcn/copy_attachment/CopyAttachmentSecretAction.java diff --git a/weaver/aiyh_pcn/fadada/FaDDContractAction.java b/src/weaver/aiyh_pcn/fadada/FaDDContractAction.java similarity index 100% rename from weaver/aiyh_pcn/fadada/FaDDContractAction.java rename to src/weaver/aiyh_pcn/fadada/FaDDContractAction.java diff --git a/weaver/aiyh_pcn/fadada/UploadFile2FaDDAction.java b/src/weaver/aiyh_pcn/fadada/UploadFile2FaDDAction.java similarity index 100% rename from weaver/aiyh_pcn/fadada/UploadFile2FaDDAction.java rename to src/weaver/aiyh_pcn/fadada/UploadFile2FaDDAction.java diff --git a/weaver/aiyh_pcn/fadada/entity/FileInfo.java b/src/weaver/aiyh_pcn/fadada/entity/FileInfo.java similarity index 100% rename from weaver/aiyh_pcn/fadada/entity/FileInfo.java rename to src/weaver/aiyh_pcn/fadada/entity/FileInfo.java diff --git a/src/weaver/aiyh_pcn/fadada/util/FaddContractUtil.java b/src/weaver/aiyh_pcn/fadada/util/FaddContractUtil.java new file mode 100644 index 0000000..0b4c923 --- /dev/null +++ b/src/weaver/aiyh_pcn/fadada/util/FaddContractUtil.java @@ -0,0 +1,383 @@ +package weaver.aiyh_pcn.fadada.util; + +import aiyh.utils.Util; +import aiyh.utils.entity.ApiConfigMainDTO; +import aiyh.utils.httpUtil.ResponeVo; +import aiyh.utils.mapUtil.ParaMap; +import aiyh.utils.sqlUtil.sqlResult.impl.PrepSqlResultImpl; +import aiyh.utils.zwl.common.ToolUtil; +import com.alibaba.fastjson.JSON; +import com.api.aiyh_pcn.fadada.dao.FaDDContractMapping; +import com.api.aiyh_pcn.fadada.entity.FaDaDaConfigDTO; +import com.api.aiyh_pcn.fadada.service.impl.FaDDContractService; +import com.api.aiyh_pcn.fadada.util.FaDDRequestUtils; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.weaver.general.TimeUtil; +import org.h2.util.StringUtils; +import weaver.aiyh_pcn.fadada.entity.FileInfo; +import weaver.conn.RecordSet; +import weaver.file.ImageFileManager; +import weaver.formmode.data.ModeDataIdUpdate; +import weaver.formmode.setup.ModeRightInfo; +import weaver.hrm.User; + +import java.io.InputStream; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @author EBU7-dev1-ayh + * @create 2021/11/3 0003 16:50 + * heton gonjvlei + */ + + +public class FaddContractUtil { + private String workflowId; + private String requestId; + private String mainTableName; + private String tableName; + private String customerNo; + private String contractField; + private String queueSigned; + private final String contractInfoTable = "uf_contract_info"; + private String customerNoField; + private List> detailMaps; + private Map mainMap; + private FaDDContractMapping faDDContractMapping = new FaDDContractMapping(); + private FaDDContractService faDDContractService = new FaDDContractService(); + private final ToolUtil toolUtil = new ToolUtil(); + private User user; + + public FaddContractUtil() { + } + + public FaddContractUtil(String workflowId, String requestId, String mainTableName, String tableName, String customerNo, + String customerNoField, String contractField, String queueSigned, List> detailMaps, Map mainMap, + User user) { + this.workflowId = workflowId; + this.requestId = requestId; + this.mainTableName = mainTableName; + this.tableName = tableName; + this.customerNo = customerNo; + this.customerNoField = customerNoField; + this.contractField = contractField; + this.queueSigned = queueSigned; + this.detailMaps = detailMaps; + this.mainMap = mainMap; + this.user = user; + } + + /** + * 创建合同 + */ + public void createContract(Map mainMap) { +// 查询配置参数 + FaDaDaConfigDTO faDaDaConfigDTO = faDDContractMapping.queryConfig(workflowId, 2); +// 查询api配置参数 + ApiConfigMainDTO apiConfigMainDTO = Util.queryApiConfig(Util.null2String(faDaDaConfigDTO.getParamsConfig())); + RecordSet rs = new RecordSet(); + List fileInfos = this.contractHandle(this.contractField); + List contractNoIds = new ArrayList<>(); + List fileNoIds = new ArrayList<>(); + List fileName = new ArrayList<>(); + if (fileInfos.size() == 0) { + toolUtil.writeErrorLog("fileInfos 为空"); + } +// 多文件的时候会遍历文件去创建合同问文件,但是一个流程只创建一次,一次可能回有多份文件需要创建为合同文件 + for (FileInfo fileInfo : fileInfos) { +// 发起合同创建 + ResponeVo contract = FaDDRequestUtils.createContract(fileInfo, apiConfigMainDTO.getApiUrl()); + Map result; + try { + Map entityMap = contract.getEntityMap(); + if (!"200".equals(String.valueOf(entityMap.get("code")))) { + toolUtil.writeErrorLog("创建合同失败,错误信息:" + entityMap.get("message")); + throw new RuntimeException("创建合同失败!"); + } + result = (Map) entityMap.get("data"); + contractNoIds.add(Util.null2String(result.get("contractNo"))); + fileNoIds.add(Util.null2String(result.get("fileNo"))); + fileName.add(fileInfo.getImagefilename()); + } catch (JsonProcessingException e) { + toolUtil.writeErrorLog(e.toString()); + throw new RuntimeException("创建合同失败!"); + } + } +// 创建合同文件成功之后收集合同编号,文件编号和合同文件的名字 + String joinContract = String.join(",", contractNoIds); + String joinFileNoIds = String.join(",", fileNoIds); + String joinFileName = String.join(",", fileName); + /* + TODO 主表创建字段 contract_no(合同编号)、file_no(文件编号)、file_name(文件名称) + TODO 明细表添加字段,signed_status(合同方签署状态) + */ +// 将合同的基本信息更新到流程主表中保存 + Map updateMap = ParaMap.create().put("contract_no", joinContract) + .put("file_no", joinFileNoIds) + .put("file_name", joinFileName); + PrepSqlResultImpl sqlResult = Util.createSqlBuilder().updateSql(this.mainTableName, updateMap, + Util.createPrepWhereImpl().whereAnd("id").whereEqual(mainMap.get("id"))); + toolUtil.writeDebuggerLog(sqlResult.getSqlStr() + ",参数:" + sqlResult.getArgs()); + rs.executeUpdate(sqlResult.getSqlStr(), sqlResult.getArgs()); +// 将合同信息和流程表信息保存到自定义的建模表中 + updateMap.put("workflow_type", workflowId); + updateMap.put("workflow_request_id", requestId); + updateMap.put("workflow_main_table", mainTableName); + updateMap.put("workflow_detail_table", tableName); + updateMap.put("user_info", JSON.toJSONString(user)); +// 1表示创建 2表示等待对方签署,3表示等待本方签署,4表示完成 + updateMap.put("contract_status", 1); +// 对方应该签署的数量 + updateMap.put("should_signed_num", detailMaps.size()); + updateMap.put("single_signed_num", 0); +// 现在已经签署的数量 + updateMap.put("signed_num", 0); + updateMap.put("signed_type", 3); + + updateMap.put("main_id", String.valueOf(mainMap.get("id"))); + updateMap.put("queue_signed", "true".equals(queueSigned) ? 1 : 0); + updateMap.put("single_contract_file_num", contractNoIds.size()); + // 如果需要控制签署规则 + if (faDaDaConfigDTO.getSignedType() == 1) { +// 需要控制签署规则 + if (Integer.parseInt(Util.null2String(mainMap.get(faDaDaConfigDTO.getFieldControl1()))) == faDaDaConfigDTO.getOnlyOwn()) { +// 只需要本方签署 + updateMap.put("contract_status", 3); +// 对方应该签署的数量 + updateMap.put("should_signed_num", 0); +// 现在已经签署的数量 + updateMap.put("signed_num", 0); + updateMap.put("queue_signed", 0); + updateMap.put("signed_type", 1); + } + if (Integer.parseInt(Util.null2String(mainMap.get(faDaDaConfigDTO.getFieldControl1()))) == faDaDaConfigDTO.getOnlyOther()) { + updateMap.put("signed_type", 2); + } + } +// 查询合同信息中,是否存在该信息,如果存在着更新,不存在则插入 + String query = "select * from " + contractInfoTable + " where workflow_request_id = ?"; + rs.executeQuery(query, requestId); + String formModeId = "52"; + if (rs.next()) { + sqlResult = Util.createSqlBuilder().updateSql(contractInfoTable, updateMap, + Util.createPrepWhereImpl().whereAnd("workflow_request_id").whereEqual(requestId)); + toolUtil.writeDebuggerLog(sqlResult.getSqlStr() + ",参数:" + sqlResult.getArgs()); + rs.executeUpdate(sqlResult.getSqlStr(), sqlResult.getArgs()); +// 权限重构 + ModeRightInfo mri = new ModeRightInfo(); + int dataId = rs.getInt("id"); + toolUtil.writeDebuggerLog("id:" + dataId); + mri.rebuildModeDataShareByEdit(1, Util.getIntValue(formModeId, -1), dataId); + } else { + ModeDataIdUpdate mdu = ModeDataIdUpdate.getInstance(); + int dataId = mdu.getModeDataNewId(contractInfoTable, + Util.getIntValue(formModeId, -1), + 1, 0, TimeUtil.getCurrentDateString(), + TimeUtil.getOnlyCurrentTimeString()); + sqlResult = Util.createSqlBuilder().updateSql(contractInfoTable, updateMap, + Util.createPrepWhereImpl().whereAnd("id").whereEqual(dataId)); + toolUtil.writeDebuggerLog(sqlResult.getSqlStr() + ",参数:" + sqlResult.getArgs()); + rs.executeUpdate(sqlResult.getSqlStr(), sqlResult.getArgs()); + ModeRightInfo mri = new ModeRightInfo(); + mri.rebuildModeDataShareByEdit(1, Util.getIntValue(formModeId, -1), dataId); + } + } + + /** + * 处理合同创建数据 + * + * @param contractField + * @return + */ + public List contractHandle(String contractField) { + String fileIds = Util.null2String(this.mainMap.get(contractField)); +// 如果没有合同字段的数据,则返回一个空的 + if ("".equals(fileIds)) { + return new ArrayList<>(); + } + List fileInfos = faDDContractMapping.queryImgFileIdByDocIds(fileIds); + String customer = customerNo; +// 查询创建合同的企业编号 + if (StringUtils.isNullOrEmpty(customerNo)) { + toolUtil.writeErrorLog("创建合同失败,失败原因:customerNo 为空!"); + } +// 处理数据信息 + for (FileInfo fileInfo : fileInfos) { + InputStream inputStreamById = ImageFileManager.getInputStreamById(fileInfo.getImagefileid()); + fileInfo.setFile(inputStreamById); + String imagefilename = fileInfo.getImagefilename(); + if (imagefilename == null) { + return new ArrayList<>(); + } + fileInfo.setContractExtension(imagefilename.substring(imagefilename.lastIndexOf("."))); + fileInfo.setContractTitle(imagefilename); + fileInfo.setCustomerNo(Util.null2String(customer)); + if (StringUtils.isNullOrEmpty(fileInfo.getCustomerNo())) { + toolUtil.writeErrorLog("创建合同失败,失败原因,customer!"); +// fileInfo.setCustomerNo(Util.null2String(detail.get("companyno"))); + } + fileInfo.setUploadType(1); + } + return fileInfos; + } + + /** + * 签署合同 + */ + public void signedContract(Map mainMap) { +// 获取配置表信息 + FaDaDaConfigDTO faDaDaConfigDTO = faDDContractMapping.queryConfig(workflowId, 3); +// 查询接口配置树形结构 + ApiConfigMainDTO apiConfigMainDTO = Util.queryApiConfigTree(faDaDaConfigDTO.getParamsConfig()); +// 查询签署数据 + List> dataArr = faDDContractService.getDataArr(requestId, workflowId, mainTableName, tableName); +// 处理数据 + List> maps = faDDContractService.objectAndListHandle(apiConfigMainDTO.getDetails(), dataArr); + if (maps == null) { + toolUtil.writeErrorLog("签署合同错误,错误原因:maps为null!"); + throw new RuntimeException("签署合同错误,错误原因:maps为null!"); + } + if (maps.size() == 0) { + return; + } + RecordSet rs = new RecordSet(); + Map update = new HashMap<>(); +// 顺序签署合同 + if ("true".equals(queueSigned)) { + Map map = maps.get(0); + if (faDaDaConfigDTO.getSignedType() == 1) { +// 需要控制签署规则 + if (Integer.parseInt(Util.null2String(mainMap.get(faDaDaConfigDTO.getFieldControl1()))) == faDaDaConfigDTO.getOnlyOther()) { +// 只需要对方签署 + map.put("autoArchive", 1); + } +// 双方签署 + } + List> requestList = signedRequest(map, apiConfigMainDTO); + List signedList = new ArrayList<>(); +// 遍历将数据保存到合同信息表中 + for (Map result : requestList) { + signedList.add(String.valueOf(result.get("signerUrl"))); + } +// 将合同签署地址保存到建模信息中 + update.put("contract_signed_url", String.join(" ; ", signedList)); + // 将合同签署信息更新到合同信息表中 + update.put("contract_status", 2); +// update.put("single_signed_num",0); + PrepSqlResultImpl sqlResult = Util.createSqlBuilder().updateSql(contractInfoTable, update, + Util.createPrepWhereImpl().whereAnd("workflow_request_id").whereEqual(requestId)); + rs.executeUpdate(sqlResult.getSqlStr(), sqlResult.getArgs()); + update.clear(); +// 更新明细表合同信息 明细表添加字段,signed_status(合同方签署状态) +// 签署状态,1 已发送待签署,2 已签蜀 + update.put("signed_status", 1); + sqlResult = Util.createSqlBuilder().updateSql(tableName, update, + Util.createPrepWhereImpl().whereAnd("id").whereEqual(String.valueOf(map.get("id")))); + rs.executeUpdate(sqlResult.getSqlStr(), sqlResult.getArgs()); + return; + } +// 不是顺序签署 + for (Map map : maps) { + if (faDaDaConfigDTO.getSignedType() == 1) { +// 需要控制签署规则 + if (Integer.parseInt(Util.null2String(mainMap.get(faDaDaConfigDTO.getFieldControl1()))) == faDaDaConfigDTO.getOnlyOther()) { +// 只需要对方签署 + map.put("autoArchive", 1); + } +// 双方签署 + } + signedRequest(map, apiConfigMainDTO); +// TODO 一起签署不好控制催一催,没有一起签署的需求,暂且不做 + } + // 将合同签署信息更新到合同信息表中 + update.put("contract_status", 2); + PrepSqlResultImpl sqlResult = Util.createSqlBuilder().updateSql(contractInfoTable, update, + Util.createPrepWhereImpl().whereAnd("workflow_request_id").whereEqual(requestId)); + rs.executeUpdate(sqlResult.getSqlStr(), sqlResult.getArgs()); + + } + + /** + * 合同签署发送请求 + * + * @param map + * @param apiConfigMainDTO + */ + private List> signedRequest(Map map, ApiConfigMainDTO apiConfigMainDTO) { + String contractNos = Util.null2String(map.get("contractNo")); + String[] split = contractNos.split(","); + List> list = new ArrayList<>(); +// RecordSet rs = new RecordSet(); + for (String s : split) { + map.put("contractNo", s); + ResponeVo responeVo = FaDDRequestUtils.signedContract(map, apiConfigMainDTO.getApiUrl()); + Map response = null; + try { + response = responeVo.getEntityMap(); + } catch (JsonProcessingException e) { + e.printStackTrace(); + } + if (!"200".equals(response.get("code"))) { + toolUtil.writeErrorLog("法大大接口签署合同失败!"); + throw new RuntimeException("法大大接口签署合同失败!"); + } + list.add((Map) response.get("data")); + } + return list; + } + + + @Override + public String toString() { + return "FaddContractUtil{" + + "workflowId='" + workflowId + '\'' + + ", requestId='" + requestId + '\'' + + ", mainTableName='" + mainTableName + '\'' + + ", tableName='" + tableName + '\'' + + ", customerNo='" + customerNo + '\'' + + ", contractField='" + contractField + '\'' + + ", queueSigned='" + queueSigned + '\'' + + ", contractInfoTable='" + contractInfoTable + '\'' + + ", customerNoField='" + customerNoField + '\'' + + ", detailMaps=" + detailMaps + + ", mainMap=" + mainMap + + '}'; + } + + public String getWorkflowId() { + return workflowId; + } + + public void setWorkflowId(String workflowId) { + this.workflowId = workflowId; + } + + public String getRequestId() { + return requestId; + } + + public void setRequestId(String requestId) { + this.requestId = requestId; + } + + public String getMainTableName() { + return mainTableName; + } + + public void setMainTableName(String mainTableName) { + this.mainTableName = mainTableName; + } + + public String getTableName() { + return tableName; + } + + public void setTableName(String tableName) { + this.tableName = tableName; + } + + +} diff --git a/weaver/aiyh_pcn/workflow_to_customer/AddCustomer_Action.java b/src/weaver/aiyh_pcn/workflow_to_customer/AddCustomer_Action.java similarity index 100% rename from weaver/aiyh_pcn/workflow_to_customer/AddCustomer_Action.java rename to src/weaver/aiyh_pcn/workflow_to_customer/AddCustomer_Action.java diff --git a/weaver/aiyh_pcn/workflow_to_customer/config/CRM_Config.java b/src/weaver/aiyh_pcn/workflow_to_customer/config/CRM_Config.java similarity index 100% rename from weaver/aiyh_pcn/workflow_to_customer/config/CRM_Config.java rename to src/weaver/aiyh_pcn/workflow_to_customer/config/CRM_Config.java diff --git a/weaver/aiyh_pcn/workflow_to_customer/exception/DataExistsException.java b/src/weaver/aiyh_pcn/workflow_to_customer/exception/DataExistsException.java similarity index 100% rename from weaver/aiyh_pcn/workflow_to_customer/exception/DataExistsException.java rename to src/weaver/aiyh_pcn/workflow_to_customer/exception/DataExistsException.java diff --git a/weaver/aiyh_pcn/workflow_to_customer/exception/LoginIdRepeatException.java b/src/weaver/aiyh_pcn/workflow_to_customer/exception/LoginIdRepeatException.java similarity index 100% rename from weaver/aiyh_pcn/workflow_to_customer/exception/LoginIdRepeatException.java rename to src/weaver/aiyh_pcn/workflow_to_customer/exception/LoginIdRepeatException.java diff --git a/weaver/aiyh_pcn/workflow_to_customer/model/MainResult.java b/src/weaver/aiyh_pcn/workflow_to_customer/model/MainResult.java similarity index 100% rename from weaver/aiyh_pcn/workflow_to_customer/model/MainResult.java rename to src/weaver/aiyh_pcn/workflow_to_customer/model/MainResult.java diff --git a/weaver/aiyh_pcn/workflow_to_customer/model/TableFieldRelation.java b/src/weaver/aiyh_pcn/workflow_to_customer/model/TableFieldRelation.java similarity index 100% rename from weaver/aiyh_pcn/workflow_to_customer/model/TableFieldRelation.java rename to src/weaver/aiyh_pcn/workflow_to_customer/model/TableFieldRelation.java diff --git a/weaver/aiyh_pcn/workflow_to_customer/utils/BuilderSqlUtil.java b/src/weaver/aiyh_pcn/workflow_to_customer/utils/BuilderSqlUtil.java similarity index 100% rename from weaver/aiyh_pcn/workflow_to_customer/utils/BuilderSqlUtil.java rename to src/weaver/aiyh_pcn/workflow_to_customer/utils/BuilderSqlUtil.java diff --git a/weaver/aiyh_pcn/workflow_to_customer/utils/ParaMap.java b/src/weaver/aiyh_pcn/workflow_to_customer/utils/ParaMap.java similarity index 100% rename from weaver/aiyh_pcn/workflow_to_customer/utils/ParaMap.java rename to src/weaver/aiyh_pcn/workflow_to_customer/utils/ParaMap.java diff --git a/weaver/aiyh_pcn/workflow_to_customer/utils/PrepSQLWhere.java b/src/weaver/aiyh_pcn/workflow_to_customer/utils/PrepSQLWhere.java similarity index 100% rename from weaver/aiyh_pcn/workflow_to_customer/utils/PrepSQLWhere.java rename to src/weaver/aiyh_pcn/workflow_to_customer/utils/PrepSQLWhere.java diff --git a/weaver/aiyh_pcn/workflow_to_customer/utils/SQLWhere.java b/src/weaver/aiyh_pcn/workflow_to_customer/utils/SQLWhere.java similarity index 100% rename from weaver/aiyh_pcn/workflow_to_customer/utils/SQLWhere.java rename to src/weaver/aiyh_pcn/workflow_to_customer/utils/SQLWhere.java diff --git a/weaver/aiyh_pcn/workflow_to_customer/utils/SqlResult.java b/src/weaver/aiyh_pcn/workflow_to_customer/utils/SqlResult.java similarity index 100% rename from weaver/aiyh_pcn/workflow_to_customer/utils/SqlResult.java rename to src/weaver/aiyh_pcn/workflow_to_customer/utils/SqlResult.java diff --git a/weaver/aiyh_pcn/workflow_to_customer/utils/UtilMap.java b/src/weaver/aiyh_pcn/workflow_to_customer/utils/UtilMap.java similarity index 100% rename from weaver/aiyh_pcn/workflow_to_customer/utils/UtilMap.java rename to src/weaver/aiyh_pcn/workflow_to_customer/utils/UtilMap.java diff --git a/weaver/aiyh_pcn/workflow_to_customer/utils/UtilMapFilter.java b/src/weaver/aiyh_pcn/workflow_to_customer/utils/UtilMapFilter.java similarity index 100% rename from weaver/aiyh_pcn/workflow_to_customer/utils/UtilMapFilter.java rename to src/weaver/aiyh_pcn/workflow_to_customer/utils/UtilMapFilter.java diff --git a/weaver/aiyh_pcn/workflow_to_customer/utils/Utils.java b/src/weaver/aiyh_pcn/workflow_to_customer/utils/Utils.java similarity index 100% rename from weaver/aiyh_pcn/workflow_to_customer/utils/Utils.java rename to src/weaver/aiyh_pcn/workflow_to_customer/utils/Utils.java diff --git a/weaver/aiyh_quanshi/QsAPI.java b/src/weaver/aiyh_quanshi/QsAPI.java similarity index 100% rename from weaver/aiyh_quanshi/QsAPI.java rename to src/weaver/aiyh_quanshi/QsAPI.java diff --git a/weaver/aiyh_quanshi/QsUtil.java b/src/weaver/aiyh_quanshi/QsUtil.java similarity index 100% rename from weaver/aiyh_quanshi/QsUtil.java rename to src/weaver/aiyh_quanshi/QsUtil.java diff --git a/weaver/aiyh_quanshi/RequestApi.java b/src/weaver/aiyh_quanshi/RequestApi.java similarity index 100% rename from weaver/aiyh_quanshi/RequestApi.java rename to src/weaver/aiyh_quanshi/RequestApi.java diff --git a/weaver/aiyh_quanshi/entity/QsAccount.java b/src/weaver/aiyh_quanshi/entity/QsAccount.java similarity index 100% rename from weaver/aiyh_quanshi/entity/QsAccount.java rename to src/weaver/aiyh_quanshi/entity/QsAccount.java diff --git a/weaver/aiyh_quanshi/entity/QsConfParty.java b/src/weaver/aiyh_quanshi/entity/QsConfParty.java similarity index 100% rename from weaver/aiyh_quanshi/entity/QsConfParty.java rename to src/weaver/aiyh_quanshi/entity/QsConfParty.java diff --git a/weaver/aiyh_quanshi/entity/QsConfSetting.java b/src/weaver/aiyh_quanshi/entity/QsConfSetting.java similarity index 100% rename from weaver/aiyh_quanshi/entity/QsConfSetting.java rename to src/weaver/aiyh_quanshi/entity/QsConfSetting.java diff --git a/weaver/aiyh_quanshi/entity/QsConfig.java b/src/weaver/aiyh_quanshi/entity/QsConfig.java similarity index 100% rename from weaver/aiyh_quanshi/entity/QsConfig.java rename to src/weaver/aiyh_quanshi/entity/QsConfig.java diff --git a/weaver/aiyh_quanshi/entity/QsConsts.java b/src/weaver/aiyh_quanshi/entity/QsConsts.java similarity index 100% rename from weaver/aiyh_quanshi/entity/QsConsts.java rename to src/weaver/aiyh_quanshi/entity/QsConsts.java diff --git a/weaver/aiyh_quanshi/entity/QsDialoutParty.java b/src/weaver/aiyh_quanshi/entity/QsDialoutParty.java similarity index 100% rename from weaver/aiyh_quanshi/entity/QsDialoutParty.java rename to src/weaver/aiyh_quanshi/entity/QsDialoutParty.java diff --git a/weaver/aiyh_quanshi/entity/QsResponse.java b/src/weaver/aiyh_quanshi/entity/QsResponse.java similarity index 100% rename from weaver/aiyh_quanshi/entity/QsResponse.java rename to src/weaver/aiyh_quanshi/entity/QsResponse.java diff --git a/weaver/aiyh_quanshi/key_store/mg.client.p12 b/src/weaver/aiyh_quanshi/key_store/mg.client.p12 similarity index 100% rename from weaver/aiyh_quanshi/key_store/mg.client.p12 rename to src/weaver/aiyh_quanshi/key_store/mg.client.p12 diff --git a/weaver/aiyh_quanshi/key_store/mg.client_cert.pem b/src/weaver/aiyh_quanshi/key_store/mg.client_cert.pem similarity index 100% rename from weaver/aiyh_quanshi/key_store/mg.client_cert.pem rename to src/weaver/aiyh_quanshi/key_store/mg.client_cert.pem diff --git a/weaver/aiyh_quanshi/key_store/mg.client_key.pem b/src/weaver/aiyh_quanshi/key_store/mg.client_key.pem similarity index 100% rename from weaver/aiyh_quanshi/key_store/mg.client_key.pem rename to src/weaver/aiyh_quanshi/key_store/mg.client_key.pem diff --git a/weaver/aiyh_quanshi/key_store/server.truststore b/src/weaver/aiyh_quanshi/key_store/server.truststore similarity index 100% rename from weaver/aiyh_quanshi/key_store/server.truststore rename to src/weaver/aiyh_quanshi/key_store/server.truststore diff --git a/weaver/alioss/AliOSSObjectManager.java b/src/weaver/alioss/AliOSSObjectManager.java similarity index 100% rename from weaver/alioss/AliOSSObjectManager.java rename to src/weaver/alioss/AliOSSObjectManager.java diff --git a/weaver/aoyh_guijiu/VerifyWorkflow.java b/src/weaver/aoyh_guijiu/VerifyWorkflow.java similarity index 100% rename from weaver/aoyh_guijiu/VerifyWorkflow.java rename to src/weaver/aoyh_guijiu/VerifyWorkflow.java diff --git a/weaver/docs/docs/DocManager.java b/src/weaver/docs/docs/DocManager.java similarity index 100% rename from weaver/docs/docs/DocManager.java rename to src/weaver/docs/docs/DocManager.java diff --git a/weaver/file/FileUpload.java b/src/weaver/file/FileUpload.java similarity index 100% rename from weaver/file/FileUpload.java rename to src/weaver/file/FileUpload.java diff --git a/weaver/file/ImageFileManager.java b/src/weaver/file/ImageFileManager.java similarity index 100% rename from weaver/file/ImageFileManager.java rename to src/weaver/file/ImageFileManager.java diff --git a/weaver/fna/general/FnaCommon.java b/src/weaver/fna/general/FnaCommon.java similarity index 100% rename from weaver/fna/general/FnaCommon.java rename to src/weaver/fna/general/FnaCommon.java diff --git a/weaver/fna/invoice/common/FnaInvoiceCommon.java b/src/weaver/fna/invoice/common/FnaInvoiceCommon.java similarity index 100% rename from weaver/fna/invoice/common/FnaInvoiceCommon.java rename to src/weaver/fna/invoice/common/FnaInvoiceCommon.java diff --git a/weaver/fna/invoice/utils/HttpUtil.java b/src/weaver/fna/invoice/utils/HttpUtil.java similarity index 100% rename from weaver/fna/invoice/utils/HttpUtil.java rename to src/weaver/fna/invoice/utils/HttpUtil.java diff --git a/weaver/fna/invoice/utils/ImageUtil.java b/src/weaver/fna/invoice/utils/ImageUtil.java similarity index 100% rename from weaver/fna/invoice/utils/ImageUtil.java rename to src/weaver/fna/invoice/utils/ImageUtil.java diff --git a/weaver/fna/invoice/utils/InvoiceCloudUtil.java b/src/weaver/fna/invoice/utils/InvoiceCloudUtil.java similarity index 100% rename from weaver/fna/invoice/utils/InvoiceCloudUtil.java rename to src/weaver/fna/invoice/utils/InvoiceCloudUtil.java diff --git a/weaver/ofs/webservices/OfsTodoDataWebServiceImpl.java b/src/weaver/ofs/webservices/OfsTodoDataWebServiceImpl.java similarity index 100% rename from weaver/ofs/webservices/OfsTodoDataWebServiceImpl.java rename to src/weaver/ofs/webservices/OfsTodoDataWebServiceImpl.java diff --git a/customization/test/VendorContent.java b/src/weaver/workflow/cms/xiao/entity/VendorContent.java similarity index 90% rename from customization/test/VendorContent.java rename to src/weaver/workflow/cms/xiao/entity/VendorContent.java index e49be76..3db67c8 100644 --- a/customization/test/VendorContent.java +++ b/src/weaver/workflow/cms/xiao/entity/VendorContent.java @@ -1,4 +1,4 @@ -package customization.test; +package weaver.workflow.cms.xiao.entity; import java.util.List; diff --git a/customization/test/VendorItem.java b/src/weaver/workflow/cms/xiao/entity/VendorItem.java similarity index 94% rename from customization/test/VendorItem.java rename to src/weaver/workflow/cms/xiao/entity/VendorItem.java index 196d22e..cf013a6 100644 --- a/customization/test/VendorItem.java +++ b/src/weaver/workflow/cms/xiao/entity/VendorItem.java @@ -1,10 +1,12 @@ -package customization.test; +package weaver.workflow.cms.xiao.entity; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; /** * @author XiaoBokang * @create 2021/10/9 14:06 */ - +@JsonIgnoreProperties(ignoreUnknown = true) public class VendorItem { private String vendorCode; private String vendorNameCn; diff --git a/customization/test/VendorResult.java b/src/weaver/workflow/cms/xiao/entity/VendorResult.java similarity index 92% rename from customization/test/VendorResult.java rename to src/weaver/workflow/cms/xiao/entity/VendorResult.java index 799c939..b22d2da 100644 --- a/customization/test/VendorResult.java +++ b/src/weaver/workflow/cms/xiao/entity/VendorResult.java @@ -1,4 +1,4 @@ -package customization.test; +package weaver.workflow.cms.xiao.entity; /** * @author XiaoBokang diff --git a/src/weaver/workflow/cms/xiao/schedule/VendorSyncSchedule.java b/src/weaver/workflow/cms/xiao/schedule/VendorSyncSchedule.java new file mode 100644 index 0000000..5a61095 --- /dev/null +++ b/src/weaver/workflow/cms/xiao/schedule/VendorSyncSchedule.java @@ -0,0 +1,305 @@ +package weaver.workflow.cms.xiao.schedule; + +import aiyh.utils.zwl.common.ToolUtil; +import com.alibaba.fastjson.JSON; +import com.weaver.general.TimeUtil; +import com.weaver.general.Util; +import weaver.conn.RecordSet; +import weaver.formmode.data.ModeDataIdUpdate; +import weaver.formmode.setup.ModeRightInfo; +import weaver.interfaces.schedule.BaseCronJob; +import weaver.workflow.cms.xiao.entity.VendorItem; +import weaver.workflow.cms.xiao.entity.VendorResult; +import weaver.workflow.cms.xiao.utils.RequestBaseInfo; +import weaver.workflow.cms.xiao.utils.RequestUtil; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @author XiaoBokang + * @create 2021/10/9 12:10 + */ + +public class VendorSyncSchedule extends BaseCronJob { + + + private String formModeId;//建模id + private String vendorSyncUrl;//请求地址 + private String vendorSyncKey;//key + private String pageSize; + private String ToKen; + + private Integer totalPage = 1; + + + private final ToolUtil toolUtil = new ToolUtil();//工具类用于打印日志及其他操作 + public static final String CLASS_NAME = "VendorSyncSchedule"; + private final ModeDataIdUpdate mdu = ModeDataIdUpdate.getInstance(); + private final ModeRightInfo mri = new ModeRightInfo(); + + private final Map subCompanyMap = new HashMap<>();//分部信息,分部全称对应id + private final Map subCompanyDescMap = new HashMap<>();//分部信息,分部全称对应简称 + private final Map oneVendorMap = new HashMap<>();//各个分部的一次性供应商编码 +// private final Map vendorList = new HashMap<>();//数据库中已存在的供应商列表 + private final List maids = new ArrayList<>();//供应商主键集合 + + { + oneVendorMap.put("PCN","700000410"); + oneVendorMap.put("PHK","702000290"); + oneVendorMap.put("space4.0","700000410"); + oneVendorMap.put("PSCN","400300000"); + oneVendorMap.put("PFLCN","400300000"); + oneVendorMap.put("PDC","700000410"); + oneVendorMap.put("PMAP","700000410"); + } + + @Override + public void execute() { + toolUtil.writeDebuggerLog(CLASS_NAME,"--------------------"+CLASS_NAME+" begin-------------------"); + toolUtil.writeDebuggerLog(CLASS_NAME,"参数formModeId:"+formModeId+" vendorSyncUrl:"+vendorSyncUrl+" vendorSyncKey:"+vendorSyncKey+" pageSize:"+pageSize); + + int pageSizeParam = Util.getIntValue(pageSize,500); + Map headers = new HashMap<>(); + Map params = new HashMap<>(); + params.put("ToKen",ToKen); + headers.put("apiKey",vendorSyncKey); + int page = 1; + boolean flag = true; + //做do-while循环发送请求,同步供应商信息 + try { + do { + params.put("pageSize", pageSizeParam); + params.put("page", page); + toolUtil.writeDebuggerLog(String.format("请求同步:url->{%s},参数ToKen->{%s},参数apiKey->{%s},参数pageSize->{%s},参数page->{%s}" + ,vendorSyncUrl,ToKen,vendorSyncKey,pageSizeParam,page)); + VendorResult res = RequestUtil.apiRequest(RequestBaseInfo.create( + "GET", + vendorSyncUrl, + headers, + params + ), VendorResult.class); + if (res != null && res.getCode()) { + //初始化只有在请求成功并且只做一次 + if (flag) { + totalPage = res.getContent().getTotalPage(); + //将数据库已经存在的供应商列表查询出来,将分部信息初始化 + flag = false; + } + this.getVendorListBySql(); + toolUtil.writeDebuggerLog(CLASS_NAME, "request success:"); + toolUtil.writeDebugLog("get totalPages:"+res.getContent().getTotalPage()); + //进行具体插入操作 + this.insetVendor(res.getContent().getItems()); + } + } while (page++ < totalPage); + }catch (Exception e){ + toolUtil.writeDebuggerLog(CLASS_NAME,"发生异常"); + toolUtil.writeDebugLog(e); + } + //在所有信息更新之后,另外开一个线程来进行数据权限重构 + new Thread(new VendorSyncTheard(1,Util.getIntValue(formModeId,-1),maids,mri)).start(); + toolUtil.writeDebuggerLog(CLASS_NAME,"--------------------"+CLASS_NAME+" over-------------------"); + } + + /** + * 向建模表插入供应商数据 + * @param itemList 供应商集合 + */ + private void insetVendor(List itemList){ + RecordSet rs = new RecordSet(); + toolUtil.writeDebuggerLog("向建模表添加数据:"+JSON.toJSONString(itemList.size())); + RecordSet update_recordRes = new RecordSet(); + //进行批量更新的list + List bachList = new ArrayList<>(); + //进行批量修改的sql语句 + String updateSql = "update uf_gyszsjb set vendorCode = ?,vendorNameCn = ?,vendorNameEn = ?,vatRegNo = ?" + + ",addressEn = ?,nationalType = ?,isRelatedParty = ?,businessPartnerCheckNumber = ?,organization = ?" + + ",szfb=?,sfdlgys= ?,ywhbsc = ?,vendorType = ?,fadadaechapter = ? where id = ?"; + for (VendorItem vendorItem : itemList) { + //进行数据更新时的参数集合 + List vendorParamList = new ArrayList<>(); + String query = "select id from uf_gyszsjb where "; + StringBuilder stringBuilder = new StringBuilder(query); + List args = new ArrayList<>(); +// = ? and vendorNameCn = ? and vendorNameEn = ? and vatRegNo = ? + if(vendorItem.getVendorCode() == null){ + stringBuilder.append("vendorCode is null "); + }else{ + stringBuilder.append("vendorCode = ? "); + args.add(vendorItem.getVendorCode()); + } + /*if(vendorItem.getVendorNameCn() == null){ + stringBuilder.append(" and vendorNameCn is null "); + }else{ + stringBuilder.append(" and vendorNameCn = ? "); + args.add(vendorItem.getVendorNameCn()); + } + if(vendorItem.getVendorNameEn() == null){ + stringBuilder.append(" and vendorNameEn is null "); + }else{ + stringBuilder.append(" and vendorNameEn = ? "); + args.add(vendorItem.getVendorNameEn()); + } + if(vendorItem.getVatRegNo() == null){ + stringBuilder.append(" and vatRegNo is null "); + }else{ + stringBuilder.append(" and vatRegNo = ? "); + args.add(vendorItem.getVatRegNo()); + }*/ + if(vendorItem.getOrganization() == null){ + stringBuilder.append(" and organization is null "); + }else{ + stringBuilder.append(" and organization = ? "); + args.add(vendorItem.getOrganization()); + } + rs.executeQuery(stringBuilder.toString(),args); + int mainId = -1; + if(rs.next()){ + mainId = rs.getInt("id"); +// toolUtil.writeDebuggerLog("查询到数据id:" + mainId); + } +// int mainId = Util.getIntValue(vendorList.get(vendorItem.getVendorCode()+","+vendorItem.getVendorNameCn()+","+vendorItem.getVendorNameEn()+","+vendorItem.getVatRegNo()),-1); + //将分部全程转换成简称 + String companyName = Util.null2String(subCompanyDescMap.get(vendorItem.getOrganization())); + //是否大陆供应商 + int sfdlgys = 1; + if("China".equals(vendorItem.getNationalType())){ + sfdlgys = 0; + } + //是否为一次性供应商 + int vendorType = 1; + if(oneVendorMap.get(companyName) != null && oneVendorMap.get(companyName).equals(vendorItem.getVendorCode())){ + vendorType = 0; + } + //所属分部 + int szfb = Util.getIntValue(subCompanyMap.get(vendorItem.getOrganization()),-1); + //是否业务伙伴审查 + int ywhbsc = 1; + if(vendorItem.getBusinessPartnerCheckNumber() != null && !"".equals(vendorItem.getBusinessPartnerCheckNumber())){ + ywhbsc = 0; + } + //判断数据库是否存在此条记录,若存在则进行更新操作 + if(mainId == -1){ + mainId = mdu.getModeDataNewId("uf_gyszsjb", Util.getIntValue(formModeId,-1), 1, 0, TimeUtil.getCurrentDateString(), TimeUtil.getOnlyCurrentTimeString()); + } +// String updateSql = "update uf_gyszsjb set vendorCode = ?,vendorNameCn = ?,vendorNameEn = ?,vatRegNo = ?" + +// ",addressEn = ?,nationalType = ?,isRelatedParty = ?,businessPartnerCheckNumber = ?,organization = ?" + +// ",szfb=?,sfdlgys= ?,ywhbsc = ?,vendorType = ? where id = ?"; +// long l1 = System.currentTimeMillis(); +// update_recordRes.executeUpdate(updateSql, +// vendorItem.getVendorCode(), +// vendorItem.getVendorNameCn(), +// vendorItem.getVendorNameEn(), +// vendorItem.getVatRegNo(), +// vendorItem.getAddressEn(), +// vendorItem.getNationalType(), +// vendorItem.getIsRelatedParty(), +// vendorItem.getBusinessPartnerCheckNumber(), +// vendorItem.getOrganization(), +// szfb, +// sfdlgys, +// ywhbsc, +// vendorType, +// mainId +// ); +// long l2 = System.currentTimeMillis(); +// System.out.println("执行数据更新用时:"+(l2-l1)); +// maids.add(mainId); + vendorParamList.add(vendorItem.getVendorCode()); + vendorParamList.add(vendorItem.getVendorNameCn()); + vendorParamList.add(vendorItem.getVendorNameEn()); + vendorParamList.add(vendorItem.getVatRegNo()); + vendorParamList.add(vendorItem.getAddressEn()); + vendorParamList.add(vendorItem.getNationalType()); + vendorParamList.add(vendorItem.getIsRelatedParty()); + vendorParamList.add(vendorItem.getBusinessPartnerCheckNumber()); + vendorParamList.add(vendorItem.getOrganization()); + vendorParamList.add(szfb); + vendorParamList.add(sfdlgys); + vendorParamList.add(ywhbsc); + vendorParamList.add(vendorType); + vendorParamList.add(vendorItem.getFadadaEchapter()); + vendorParamList.add(mainId); + + bachList.add(vendorParamList); + maids.add(mainId); + } + //进行批量操作 + toolUtil.writeDebuggerLog("执行批量操作:"+updateSql); + update_recordRes.executeBatchSql(updateSql,bachList); + } + + /** + * 查询出数据库已经存在的供应商列表 + * 查询出分部信息 + */ + private void getVendorListBySql(){ + String query_vendor_list = "select id,vendorCode,vendorNameCn,vendorNameEn,vatRegNo from uf_gyszsjb"; + String query_subCompany_list = "select id,subcompanyname,subcompanydesc from HrmSubCompany"; + RecordSet recordSet = new RecordSet(); + RecordSet subCompany_recordset = new RecordSet(); + toolUtil.writeDebuggerLog("执行查询,供应商列表与分部信息:"); + recordSet.executeQuery(query_vendor_list); + subCompany_recordset.executeQuery(query_subCompany_list); +// while (recordSet.next()){ +// String vendorCode = Util.null2String(recordSet.getString("vendorCode")); +// String vendorNameCn = Util.null2String(recordSet.getString("vendorNameCn")); +// String vendorNameEn = Util.null2String(recordSet.getString("vendorNameEn")); +// String vatRegNo = Util.null2String(recordSet.getString("vatRegNo")); +// String mainId = Util.null2String(String.valueOf(recordSet.getString("id"))); +// vendorList.put(vendorCode+","+vendorNameCn+","+vendorNameEn+","+vatRegNo,mainId); +// } + while(subCompany_recordset.next()){ + String subCompanyName = Util.null2String(subCompany_recordset.getString("subcompanyname")); + String subCompanyDesc = Util.null2String(subCompany_recordset.getString("subcompanydesc")); + String mainId = Util.null2String(String.valueOf(subCompany_recordset.getString("id"))); + subCompanyDescMap.put(subCompanyDesc,subCompanyName); + subCompanyMap.put(subCompanyDesc,mainId); + } +// toolUtil.writeDebuggerLog("查询成功,数据库原有供应商长度为==>"+vendorList.size()); + toolUtil.writeDebuggerLog("查询成功:分部简称全程对应信息:"+JSON.toJSONString(subCompanyDescMap)+" \n 分部信息id对应:"+JSON.toJSONString(subCompanyMap)); + } + + public String getFormModeId() { + return formModeId; + } + + public void setFormModeId(String formModeId) { + this.formModeId = formModeId; + } + + public String getVendorSyncUrl() { + return vendorSyncUrl; + } + + public void setVendorSyncUrl(String vendorSyncUrl) { + this.vendorSyncUrl = vendorSyncUrl; + } + + public String getVendorSyncKey() { + return vendorSyncKey; + } + + public void setVendorSyncKey(String vendorSyncKey) { + this.vendorSyncKey = vendorSyncKey; + } + + public String getPageSize() { + return pageSize; + } + + public void setPageSize(String pageSize) { + this.pageSize = pageSize; + } + + public String getToKen() { + return ToKen; + } + + public void setToKen(String toKen) { + ToKen = toKen; + } +} diff --git a/src/weaver/workflow/cms/xiao/schedule/VendorSyncTheard.java b/src/weaver/workflow/cms/xiao/schedule/VendorSyncTheard.java new file mode 100644 index 0000000..bedf1e1 --- /dev/null +++ b/src/weaver/workflow/cms/xiao/schedule/VendorSyncTheard.java @@ -0,0 +1,39 @@ +package weaver.workflow.cms.xiao.schedule; + + +import weaver.formmode.setup.ModeRightInfo; +import weaver.integration.mail.MailOperation; + +import java.util.List; + +/** + * @author XiaoBokang + * @create 2021/10/9 17:46 + */ + +public class VendorSyncTheard implements Runnable{ + + private Integer userId; + private Integer modelId; + private ModeRightInfo mri; + private List mainIds; + + public VendorSyncTheard(int userId, int modelId, List mainIds, ModeRightInfo mri){ + this.userId = userId; + this.modelId = modelId; + this.mainIds = mainIds; + this.mri = mri; + } + + @Override + public void run() { + for (Integer mainId : mainIds) { + long l4 = System.currentTimeMillis(); + mri.rebuildModeDataShareByEdit(userId,modelId,mainId); + mri.setNewRight(true); + mri.editModeDataShare(userId,modelId,mainId);//新建时添加共享 + long l5 = System.currentTimeMillis(); + System.out.println("执行权限耗费时间: " + (l5 - l4)); + } + } +} diff --git a/src/weaver/workflow/cms/xiao/utils/RequestBaseInfo.java b/src/weaver/workflow/cms/xiao/utils/RequestBaseInfo.java new file mode 100644 index 0000000..b2a9560 --- /dev/null +++ b/src/weaver/workflow/cms/xiao/utils/RequestBaseInfo.java @@ -0,0 +1,70 @@ +package weaver.workflow.cms.xiao.utils; + + +import java.util.HashMap; +import java.util.Map; + +/** + * @author XiaoBokang + * @create 2021/8/23 16:34 + */ + +public class RequestBaseInfo{ + + private String type; + private String url; + private Object params; + private Map headers; + + private static final Map HEADER_NORMAL = new HashMap<>(); + private static final Map PARAMS_NORMAL = new HashMap<>(); + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public Object getParams() { + return params; + } + + public void setParams(Object params) { + this.params = params; + } + + public Map getHeaders() { + return headers; + } + + public void setHeaders(Map headers) { + this.headers = headers; + } + + public static RequestBaseInfo create(String type, String url){ + return create(type,url,HEADER_NORMAL,PARAMS_NORMAL); + } + + public static RequestBaseInfo create(String type, String url, Map headers){ + return create(type,url,headers,PARAMS_NORMAL); + } + + public static RequestBaseInfo create(String type, String url, Map headers, Object params){ + RequestBaseInfo requestInfo = new RequestBaseInfo(); + requestInfo.setType(type.toUpperCase()); + requestInfo.setUrl(url); + requestInfo.setParams(params); + requestInfo.setHeaders(headers); + return requestInfo; + } +} diff --git a/src/weaver/workflow/cms/xiao/utils/RequestUtil.java b/src/weaver/workflow/cms/xiao/utils/RequestUtil.java new file mode 100644 index 0000000..19812ba --- /dev/null +++ b/src/weaver/workflow/cms/xiao/utils/RequestUtil.java @@ -0,0 +1,93 @@ +package weaver.workflow.cms.xiao.utils; + +import com.alibaba.fastjson.JSON; +import com.fasterxml.jackson.databind.ObjectMapper; +import org.apache.http.HttpEntity; +import org.apache.http.client.methods.*; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.DefaultHttpClient; +import org.apache.http.util.EntityUtils; +import weaver.wechat.request.HttpManager; + +import java.io.IOException; +import java.util.Map; + + +/** + * @author XiaoBokang + * @create 2021/8/9 10:09 + */ + +public class RequestUtil { + + public static T apiRequest(RequestBaseInfo requestInfo, Class tClass){ + + Map headers = requestInfo.getHeaders(); + T result = null; + + switch(requestInfo.getType()){ + case "GET" :{ + String sendUrl = serializableUrl(requestInfo.getUrl(), (Map) requestInfo.getParams()); + HttpGet httpGet = new HttpGet(sendUrl); + headers.forEach(httpGet::setHeader); + result = apiSend(httpGet,tClass); + }break; + case "POST" :{ + HttpPost httpPost = new HttpPost(requestInfo.getUrl()); + headers.forEach(httpPost::setHeader); + httpPost.setEntity(new StringEntity(JSON.toJSONString(requestInfo.getParams()),"UTF-8")); + result = apiSend(httpPost,tClass);}break; + case "PUT" :{ + HttpPut httpPut = new HttpPut(requestInfo.getUrl()); + headers.forEach(httpPut::setHeader); + httpPut.setEntity(new StringEntity(JSON.toJSONString(requestInfo.getParams()),"UTF-8")); + result = apiSend(httpPut,tClass);}break; + } + + return result; + } + + public static T apiSend( + HttpUriRequest httpRequest, + Class resClass + ){ + DefaultHttpClient httpClient = HttpManager.getHttpClient(); + CloseableHttpResponse execute = null; + T res = null; + try { + execute = httpClient.execute(httpRequest); + if(execute.getStatusLine().getStatusCode() == 200){ + HttpEntity entity = execute.getEntity(); + String response= EntityUtils.toString(entity,"utf-8"); +// ObjectMapper mapper = new ObjectMapper(); +// CollectionType listType = mapper.getTypeFactory().constructCollectionType(ArrayList.class, Map.class); +// List> list = mapper.readValue(response, listType); +// result.put("res",list); + ObjectMapper objectMapper = new ObjectMapper(); + res = objectMapper.readValue(response,resClass); + } + } catch (IOException e) { + try { + if(execute != null) { + execute.close(); + } + } catch (IOException ioException) { + ioException.printStackTrace(); + } + e.printStackTrace(); + } + return res; + } + + public static String serializableUrl(String url,Map params){ + if(params == null || params.isEmpty()){ + return url; + } + url += "?"; + for (Map.Entry entry: params.entrySet()){ + url += entry.getKey() + "=" + entry.getValue() + "&"; + } + return url.substring(0,url.length()-1); + } + +} diff --git a/src/weaver/workflow/cms/xiao/utils/SqlUtil.java b/src/weaver/workflow/cms/xiao/utils/SqlUtil.java new file mode 100644 index 0000000..ca63c32 --- /dev/null +++ b/src/weaver/workflow/cms/xiao/utils/SqlUtil.java @@ -0,0 +1,82 @@ +package weaver.workflow.cms.xiao.utils; + +import java.lang.reflect.Field; +import java.util.List; +import java.util.Map; + +/** + * @author XiaoBokang + * @create 2021/8/13 17:43 + */ + +public class SqlUtil { + + /** + * 构建插入的sql语句 + * @param tableName + * @param param + * @param params + * @return + */ + public static String buildInsert(String tableName, Map param,List params){ + + StringBuilder keyBuilder = new StringBuilder(); + StringBuilder valueBuilder = new StringBuilder(); + + keyBuilder.append("insert into ") + .append(tableName) + .append(" ("); + valueBuilder.append(" values ("); + param.forEach((key,value) ->{ + keyBuilder.append(key); + keyBuilder.append(","); + valueBuilder.append("?"); + valueBuilder.append(","); + params.add(value); + }); + String keySql = keyBuilder.substring(0,keyBuilder.length()-1); + String valueSql = valueBuilder.substring(0,valueBuilder.length()-1); + + return keySql+") "+valueSql+")"; + } + + public static String buildUpdate(String tableName, Map param,List params){ + + StringBuilder updateBuilder = new StringBuilder(); + + updateBuilder.append("update ") + .append(tableName) + .append(" set "); + param.forEach((k,v)->{ + updateBuilder.append(k).append(" = ?,"); + params.add(v); + + }); + String updateSql = updateBuilder.substring(0,updateBuilder.length()-1)+" "; + + return updateSql; + } + + public static String buildUpdate(String tableName, Object obj,List params){ + + StringBuilder updateBuilder = new StringBuilder(); + + updateBuilder.append("update ") + .append(tableName) + .append(" set "); + Field[] fields = obj.getClass().getFields(); + try{ + for (Field field : fields) { + field.setAccessible(true); + updateBuilder.append(field.getName()).append(" = ?,"); + params.add(field.get(obj)); + } + }catch (Exception e){ + e.printStackTrace(); + } + String updateSql = updateBuilder.substring(0,updateBuilder.length()-1)+" "; + + return updateSql; + } + +} diff --git a/test/apiTest/ApiTest.java b/test/apiTest/ApiTest.java new file mode 100644 index 0000000..ad2923a --- /dev/null +++ b/test/apiTest/ApiTest.java @@ -0,0 +1,18 @@ +package apiTest; + +import org.junit.Test; + +/** + * @author EBU7-dev1-ayh + * create 2021/12/13 0013 23:09 + * + */ + + +public class ApiTest { + + @Test + public void test(){ + + } +} diff --git a/customization/test/TestRecordUtil.java b/test/baseTest/BaseTest.java similarity index 61% rename from customization/test/TestRecordUtil.java rename to test/baseTest/BaseTest.java index ad17c6d..b4081d8 100644 --- a/customization/test/TestRecordUtil.java +++ b/test/baseTest/BaseTest.java @@ -1,20 +1,23 @@ -package customization.test; +package baseTest; - -import customization.commons.Console; +import cn.hutool.core.lang.Console; +import org.junit.Before; import org.junit.Test; import weaver.conn.RecordSet; /** - * @author liutaihong - * @version 1.0.0 - * @ClassName TestRecordUtil.java - * @Description 本地调用服务器的实例, - * @createTime 2020-04-28 14:31:00 + * @author EBU7-dev1-ayh + * create 2021/12/13 0013 23:08 */ -public class TestRecordUtil extends BaseTest { +public class BaseTest { + @Before + public void before() { + weaver.general.GCONST.setServerName("ecology"); + weaver.general.GCONST.setRootPath("H:\\ecology-weaver\\web\\"); + } + @Test public void with() { String sql = "select COMPANYNAME,LICENSE,EXPIREDATE,CVERSION from license "; @@ -28,6 +31,4 @@ public class TestRecordUtil extends BaseTest { Console.log(sql); } } - - } diff --git a/weaver/aiyh_pcn/fadada/util/FaddContractUtil.java b/weaver/aiyh_pcn/fadada/util/FaddContractUtil.java deleted file mode 100644 index a79080c..0000000 --- a/weaver/aiyh_pcn/fadada/util/FaddContractUtil.java +++ /dev/null @@ -1,372 +0,0 @@ -package weaver.aiyh_pcn.fadada.util; - -import aiyh.utils.Util; -import aiyh.utils.entity.ApiConfigMainDTO; -import aiyh.utils.httpUtil.ResponeVo; -import aiyh.utils.mapUtil.ParaMap; -import aiyh.utils.sqlUtil.sqlResult.impl.PrepSqlResultImpl; -import aiyh.utils.zwl.common.ToolUtil; -import com.alibaba.fastjson.JSON; -import com.api.aiyh_pcn.fadada.dao.FaDDContractMapping; -import com.api.aiyh_pcn.fadada.entity.FaDaDaConfigDTO; -import com.api.aiyh_pcn.fadada.service.impl.FaDDContractService; -import com.api.aiyh_pcn.fadada.util.FaDDRequestUtils; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.weaver.general.TimeUtil; -import org.h2.util.StringUtils; -import weaver.aiyh_pcn.fadada.entity.FileInfo; -import weaver.conn.RecordSet; -import weaver.file.ImageFileManager; -import weaver.formmode.data.ModeDataIdUpdate; -import weaver.formmode.setup.ModeRightInfo; -import weaver.hrm.User; - -import java.io.InputStream; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -/** - * @author EBU7-dev1-ayh - * @create 2021/11/3 0003 16:50 - * heton gonjvlei - */ - - -public class FaddContractUtil { - private String workflowId; - private String requestId; - private String mainTableName; - private String tableName; - private String customerNo; - private String contractField; - private String queueSigned; - private final String contractInfoTable = "uf_contract_info"; - private String customerNoField; - private List> detailMaps; - private Map mainMap; - private FaDDContractMapping faDDContractMapping = new FaDDContractMapping(); - private FaDDContractService faDDContractService = new FaDDContractService(); - private final ToolUtil toolUtil = new ToolUtil(); - private User user; - - public FaddContractUtil() { - } - - public FaddContractUtil(String workflowId, String requestId, String mainTableName, String tableName, String customerNo, - String customerNoField, String contractField, String queueSigned, List> detailMaps, Map mainMap, - User user) { - this.workflowId = workflowId; - this.requestId = requestId; - this.mainTableName = mainTableName; - this.tableName = tableName; - this.customerNo = customerNo; - this.customerNoField = customerNoField; - this.contractField = contractField; - this.queueSigned = queueSigned; - this.detailMaps = detailMaps; - this.mainMap = mainMap; - this.user = user; - } - - /** - * 创建合同 - */ - public void createContract(Map mainMap) { -// 查询配置参数 - FaDaDaConfigDTO faDaDaConfigDTO = faDDContractMapping.queryConfig(workflowId, 2); -// 查询api配置参数 - ApiConfigMainDTO apiConfigMainDTO = Util.queryApiConfig(Util.null2String(faDaDaConfigDTO.getParamsConfig())); - RecordSet rs = new RecordSet(); - List fileInfos = this.contractHandle(this.contractField); - List contractNoIds = new ArrayList<>(); - List fileNoIds = new ArrayList<>(); - List fileName = new ArrayList<>(); - if (fileInfos.size() == 0) { - toolUtil.writeErrorLog("fileInfos 为空"); - } -// 多文件的时候会遍历文件去创建合同问文件,但是一个流程只创建一次,一次可能回有多份文件需要创建为合同文件 - for (FileInfo fileInfo : fileInfos) { -// 发起合同创建 - ResponeVo contract = FaDDRequestUtils.createContract(fileInfo, apiConfigMainDTO.getApiUrl()); - Map result; - try { - Map entityMap = contract.getEntityMap(); - if (!"200".equals(String.valueOf(entityMap.get("code")))) { - toolUtil.writeErrorLog("创建合同失败,错误信息:" + entityMap.get("message")); - throw new RuntimeException("创建合同失败!"); - } - result = (Map) entityMap.get("data"); - contractNoIds.add(Util.null2String(result.get("contractNo"))); - fileNoIds.add(Util.null2String(result.get("fileNo"))); - fileName.add(fileInfo.getImagefilename()); - } catch (JsonProcessingException e) { - toolUtil.writeErrorLog(e.toString()); - throw new RuntimeException("创建合同失败!"); - } - } -// 创建合同文件成功之后收集合同编号,文件编号和合同文件的名字 - String joinContract = String.join(",", contractNoIds); - String joinFileNoIds = String.join(",", fileNoIds); - String joinFileName = String.join(",", fileName); - /* - TODO 主表创建字段 contract_no(合同编号)、file_no(文件编号)、file_name(文件名称) - TODO 明细表添加字段,signed_status(合同方签署状态) - */ -// 将合同的基本信息更新到流程主表中保存 - Map updateMap = ParaMap.create().put("contract_no", joinContract) - .put("file_no", joinFileNoIds) - .put("file_name", joinFileName); - PrepSqlResultImpl sqlResult = Util.createSqlBuilder().updateSql(this.mainTableName, updateMap, - Util.createPrepWhereImpl().whereAnd("id").whereEqual(mainMap.get("id"))); - toolUtil.writeDebuggerLog(sqlResult.getSqlStr() + ",参数:" + sqlResult.getArgs()); - rs.executeUpdate(sqlResult.getSqlStr(), sqlResult.getArgs()); -// 将合同信息和流程表信息保存到自定义的建模表中 - updateMap.put("workflow_type", workflowId); - updateMap.put("workflow_request_id", requestId); - updateMap.put("workflow_main_table", mainTableName); - updateMap.put("workflow_detail_table", tableName); - updateMap.put("user_info", JSON.toJSONString(user)); -// 1表示创建 2表示等待对方签署,3表示等待本方签署,4表示完成 - updateMap.put("contract_status", 1); -// 对方应该签署的数量 - updateMap.put("should_signed_num", detailMaps.size()); - updateMap.put("single_signed_num", 0); -// 现在已经签署的数量 - updateMap.put("signed_num", 0); - updateMap.put("signed_type", 3); - - updateMap.put("main_id", String.valueOf(mainMap.get("id"))); - updateMap.put("queue_signed", "true".equals(queueSigned) ? 1 : 0); - updateMap.put("single_contract_file_num", contractNoIds.size()); - // 如果需要控制签署规则 - if (faDaDaConfigDTO.getSignedType() == 1) { -// 需要控制签署规则 - if (Integer.parseInt(Util.null2String(mainMap.get(faDaDaConfigDTO.getFieldControl1()))) == faDaDaConfigDTO.getOnlyOwn()) { -// 只需要本方签署 - updateMap.put("contract_status", 3); -// 对方应该签署的数量 - updateMap.put("should_signed_num", 0); -// 现在已经签署的数量 - updateMap.put("signed_num", 0); - updateMap.put("queue_signed", 0); - updateMap.put("signed_type", 1); - } - if (Integer.parseInt(Util.null2String(mainMap.get(faDaDaConfigDTO.getFieldControl1()))) == faDaDaConfigDTO.getOnlyOther()) { - updateMap.put("signed_type", 2); - } - } -// 查询合同信息中,是否存在该信息,如果存在着更新,不存在则插入 - String query = "select * from " + contractInfoTable + " where workflow_request_id = ?"; - rs.executeQuery(query, requestId); - String formModeId = "52"; - if (rs.next()) { - sqlResult = Util.createSqlBuilder().updateSql(contractInfoTable, updateMap, - Util.createPrepWhereImpl().whereAnd("workflow_request_id").whereEqual(requestId)); - toolUtil.writeDebuggerLog(sqlResult.getSqlStr() + ",参数:" + sqlResult.getArgs()); - rs.executeUpdate(sqlResult.getSqlStr(), sqlResult.getArgs()); -// 权限重构 - ModeRightInfo mri = new ModeRightInfo(); - int dataId = rs.getInt("id"); - toolUtil.writeDebuggerLog("id:" + dataId); - mri.rebuildModeDataShareByEdit(1, Util.getIntValue(formModeId, -1), dataId); - } else { - ModeDataIdUpdate mdu = ModeDataIdUpdate.getInstance(); - int dataId = mdu.getModeDataNewId(contractInfoTable, - Util.getIntValue(formModeId, -1), - 1, 0, TimeUtil.getCurrentDateString(), - TimeUtil.getOnlyCurrentTimeString()); - sqlResult = Util.createSqlBuilder().updateSql(contractInfoTable, updateMap, - Util.createPrepWhereImpl().whereAnd("id").whereEqual(dataId)); - toolUtil.writeDebuggerLog(sqlResult.getSqlStr() + ",参数:" + sqlResult.getArgs()); - rs.executeUpdate(sqlResult.getSqlStr(), sqlResult.getArgs()); - ModeRightInfo mri = new ModeRightInfo(); - mri.rebuildModeDataShareByEdit(1, Util.getIntValue(formModeId, -1), dataId); - } - } - - /** - * 处理合同创建数据 - * - * @param contractField - * @return - */ - public List contractHandle(String contractField) { - String fileIds = Util.null2String(this.mainMap.get(contractField)); -// 如果没有合同字段的数据,则返回一个空的 - if ("".equals(fileIds)) { - return new ArrayList<>(); - } - List fileInfos = faDDContractMapping.queryImgFileIdByDocIds(fileIds); - String customer = customerNo; -// 查询创建合同的企业编号 - if (StringUtils.isNullOrEmpty(customerNo)) { - toolUtil.writeErrorLog("创建合同失败,失败原因:customerNo 为空!"); - } -// 处理数据信息 - for (FileInfo fileInfo : fileInfos) { - InputStream inputStreamById = ImageFileManager.getInputStreamById(fileInfo.getImagefileid()); - fileInfo.setFile(inputStreamById); - String imagefilename = fileInfo.getImagefilename(); - if (imagefilename == null) { - return new ArrayList<>(); - } - fileInfo.setContractExtension(imagefilename.substring(imagefilename.lastIndexOf("."))); - fileInfo.setContractTitle(imagefilename); - fileInfo.setCustomerNo(Util.null2String(customer)); - if (StringUtils.isNullOrEmpty(fileInfo.getCustomerNo())) { - toolUtil.writeErrorLog("创建合同失败,失败原因,customer!"); -// fileInfo.setCustomerNo(Util.null2String(detail.get("companyno"))); - } - fileInfo.setUploadType(1); - } - return fileInfos; - } - - /** - * 签署合同 - */ - public void signedContract(Map mainMap) { -// 获取配置表信息 - FaDaDaConfigDTO faDaDaConfigDTO = faDDContractMapping.queryConfig(workflowId, 3); -// 查询接口配置树形结构 - ApiConfigMainDTO apiConfigMainDTO = Util.queryApiConfigTree(faDaDaConfigDTO.getParamsConfig()); -// 查询签署数据 - List> dataArr = faDDContractService.getDataArr(requestId, workflowId, mainTableName, tableName); -// 处理数据 - List> maps = faDDContractService.objectAndListHandle(apiConfigMainDTO.getDetails(), dataArr); - if (maps == null) { - toolUtil.writeErrorLog("签署合同错误,错误原因:maps为null!"); - throw new RuntimeException("签署合同错误,错误原因:maps为null!"); - } - if (maps.size() == 0) { - return; - } - RecordSet rs = new RecordSet(); - Map update = new HashMap<>(); -// 顺序签署合同 - if ("true".equals(queueSigned)) { - Map map = maps.get(0); - if (faDaDaConfigDTO.getSignedType() == 1) { -// 需要控制签署规则 - if (Integer.parseInt(Util.null2String(mainMap.get(faDaDaConfigDTO.getFieldControl1()))) == faDaDaConfigDTO.getOnlyOther()) { -// 只需要对方签署 - map.put("autoArchive", 1); - } -// 双方签署 - } - signedRequest(map, apiConfigMainDTO); -// 将合同签署信息更新到合同信息表中 - update.put("contract_status", 2); -// update.put("single_signed_num",0); - PrepSqlResultImpl sqlResult = Util.createSqlBuilder().updateSql(contractInfoTable, update, - Util.createPrepWhereImpl().whereAnd("workflow_request_id").whereEqual(requestId)); - rs.executeUpdate(sqlResult.getSqlStr(), sqlResult.getArgs()); - update.clear(); -// 更新明细表合同信息 明细表添加字段,signed_status(合同方签署状态) -// 签署状态,1 已发送待签署,2 已签蜀 - update.put("signed_status", 1); - sqlResult = Util.createSqlBuilder().updateSql(tableName, update, - Util.createPrepWhereImpl().whereAnd("id").whereEqual(String.valueOf(map.get("id")))); - rs.executeUpdate(sqlResult.getSqlStr(), sqlResult.getArgs()); - return; - } -// 不是顺序签署 - for (Map map : maps) { - if (faDaDaConfigDTO.getSignedType() == 1) { -// 需要控制签署规则 - if (Integer.parseInt(Util.null2String(mainMap.get(faDaDaConfigDTO.getFieldControl1()))) == faDaDaConfigDTO.getOnlyOther()) { -// 只需要对方签署 - map.put("autoArchive", 1); - } -// 双方签署 - } - signedRequest(map, apiConfigMainDTO); - } - // 将合同签署信息更新到合同信息表中 - update.put("contract_status", 2); - PrepSqlResultImpl sqlResult = Util.createSqlBuilder().updateSql(contractInfoTable, update, - Util.createPrepWhereImpl().whereAnd("workflow_request_id").whereEqual(requestId)); - rs.executeUpdate(sqlResult.getSqlStr(), sqlResult.getArgs()); - - } - - /** - * 合同签署发送请求 - * - * @param map - * @param apiConfigMainDTO - */ - private void signedRequest(Map map, ApiConfigMainDTO apiConfigMainDTO) { - String contractNos = Util.null2String(map.get("contractNo")); - String[] split = contractNos.split(","); -// RecordSet rs = new RecordSet(); - for (String s : split) { - map.put("contractNo", s); - ResponeVo responeVo = FaDDRequestUtils.signedContract(map, apiConfigMainDTO.getApiUrl()); - Map response = null; - try { - response = responeVo.getEntityMap(); - } catch (JsonProcessingException e) { - e.printStackTrace(); - } - if (!"200".equals(response.get("code"))) { - toolUtil.writeErrorLog("法大大接口签署合同失败!"); - throw new RuntimeException("法大大接口签署合同失败!"); - } - } - } - - - @Override - public String toString() { - return "FaddContractUtil{" + - "workflowId='" + workflowId + '\'' + - ", requestId='" + requestId + '\'' + - ", mainTableName='" + mainTableName + '\'' + - ", tableName='" + tableName + '\'' + - ", customerNo='" + customerNo + '\'' + - ", contractField='" + contractField + '\'' + - ", queueSigned='" + queueSigned + '\'' + - ", contractInfoTable='" + contractInfoTable + '\'' + - ", customerNoField='" + customerNoField + '\'' + - ", detailMaps=" + detailMaps + - ", mainMap=" + mainMap + - '}'; - } - - public String getWorkflowId() { - return workflowId; - } - - public void setWorkflowId(String workflowId) { - this.workflowId = workflowId; - } - - public String getRequestId() { - return requestId; - } - - public void setRequestId(String requestId) { - this.requestId = requestId; - } - - public String getMainTableName() { - return mainTableName; - } - - public void setMainTableName(String mainTableName) { - this.mainTableName = mainTableName; - } - - public String getTableName() { - return tableName; - } - - public void setTableName(String tableName) { - this.tableName = tableName; - } - - -} diff --git a/weaver/docs/weaver.zip b/weaver/docs/weaver.zip deleted file mode 100644 index 2e9c22b..0000000 Binary files a/weaver/docs/weaver.zip and /dev/null differ diff --git a/web/WEB-INF/prop/prop2map/PatentWall.properties b/web/WEB-INF/prop/prop2map/PatentWall.properties new file mode 100644 index 0000000..2fc5670 --- /dev/null +++ b/web/WEB-INF/prop/prop2map/PatentWall.properties @@ -0,0 +1,149 @@ +# ${id}\u8868\u793A\u8BFB\u53D6\u6570\u636E\u5E93\u4E2D\u7684id\uFF0C\u4E0D\u5BF9\u7ED3\u679C\u8F6C\u4E49\uFF0C#{id}\u8868\u793A\u8BFB\u53D6\u6570\u636E\u5E93\u4E2D\u7684id\uFF0C\u5E76\u5C06\u7ED3\u679C\u8FDB\u884C\u8F6C\u4E49\u4F7F\u7528?\u4EE3\u66FF\u540E\u62FC\u63A5\u5230sql\u5B57\u7B26\u4E32\u4E2D +# #sql{select xx from xxx } \u8868\u793A\u67E5\u8BE2SQL\uFF0C\u5C06\u7ED3\u679C\u7684\u7B2C\u4E00\u4E2A\u5B57\u6BB5\u5F53\u505A\u503C +# \u67E5\u8BE2\u7ED3\u679C\u914D\u7F6E +aiyh.patentWall.voMapping.dataResource=uf_zlqzsb +aiyh.patentWall.voMapping.id=${id} +aiyh.patentWall.voMapping.icon=patent.png +aiyh.patentWall.voMapping.activeIcon=patent_active.png +aiyh.patentWall.voMapping.title=#sql{select imagefilename from docimagefile where docid = #{zlzs} } +# labelName labelIndex linkUrl +aiyh.patentWall.voMapping.linkList[0].labelName=\u67E5\u770B\u6587\u6863 +aiyh.patentWall.voMapping.linkList[0].labelIndex=-199 +aiyh.patentWall.voMapping.linkList[0].linkUrl=/spa/document/index.jsp?id=${zlzs} +aiyh.patentWall.voMapping.linkList[1].labelName=\u8DF3\u8F6C\u6D41\u7A0B +aiyh.patentWall.voMapping.linkList[1].labelIndex=-199 +aiyh.patentWall.voMapping.linkList[1].linkUrl=/spa/document/index.jsp?id=${zlzs} +#aiyh.patentWall.voMapping.linkUrl=/spa/document/index.jsp?id=${zlzs} +aiyh.patentWall.voMapping.docId=${zlzs} +aiyh.patentWall.voMapping.imageFileId=#sql{select imagefileid from docimagefile where docid = #{zlzs} } + +# \u641C\u7D22\u4FE1\u606F\u914D\u7F6E +# type \u8868\u793A\u641C\u7D22\u6846\u7C7B\u578B\uFF0C1-\u9009\u62E9\u6846\uFF0C2-\u5355\u884C\u6587\u672C\uFF0C3-\u65E5\u671F\uFF0C4-\u5355\u4EBA\u529B\u8D44\u6E90\uFF0C5-\u591A\u4EBA\u529B\u8D44\u6E90\uFF0C6-\u6D41\u7A0B\u8DEF\u5F84\uFF0C7-\u591A\u6D41\u7A0B\u8DEF\u5F84\uFF0C8-\u65E5\u671F\u8303\u56F4 +# name \u6570\u636E\u5E93\u5B57\u6BB5 \u641C\u7D22\u65F6\u9700\u8981\u8FC7\u6EE4\u90A3\u4E2A\u6570\u636E\u5E93\u5B57\u6BB5\u7684\u503C +# labelName \u524D\u7AEF\u9ED8\u8BA4\u663E\u793A\u6587\u5B57\u7684labelName +# labelIndex \u524D\u7AEF\u663E\u793A\u6587\u5B57\u7684labelIndex +# searchType \u641C\u7D22\u7C7B\u578B 1-\u7B49\u4E8E\uFF0C2-\u5927\u4E8E\uFF0C3-\u5C0F\u4E8E\uFF0C4-in\uFF0C5-\u65E5\u671F\u5927\u4E8E\uFF0C6-\u65E5\u671F\u5C0F\u4E8E\uFF0C7-\u65E5\u671F\u7B49\u4E8E,8-\u65E5\u671F\u8303\u56F4 +aiyh.patentWall.search.dataResource=uf_zlqzsb + +aiyh.patentWall.search.inputs[0].type=2 +aiyh.patentWall.search.inputs[0].dbFieldName=zlqr +aiyh.patentWall.search.inputs[0].labelName=\u4E13\u5229\u6743\u4EBA +aiyh.patentWall.search.inputs[0].labelIndex=-1023 +aiyh.patentWall.search.inputs[0].searchType=1 +aiyh.patentWall.search.inputs[0].value= + +aiyh.patentWall.search.inputs[1].type=2 +aiyh.patentWall.search.inputs[1].dbFieldName=fmrsjr +aiyh.patentWall.search.inputs[1].labelName=\u53D1\u660E\u4EBA/\u8BBE\u8BA1\u4EBA +aiyh.patentWall.search.inputs[1].labelIndex=-1023 +aiyh.patentWall.search.inputs[1].searchType=1 +aiyh.patentWall.search.inputs[1].value= + +aiyh.patentWall.search.inputs[2].type=2 +aiyh.patentWall.search.inputs[2].dbFieldName=zlcpmc +aiyh.patentWall.search.inputs[2].labelName=\u4E13\u5229\u4EA7\u54C1\u540D\u79F0 +aiyh.patentWall.search.inputs[2].labelIndex=-1023 +aiyh.patentWall.search.inputs[2].searchType=1 +aiyh.patentWall.search.inputs[2].value= + +aiyh.patentWall.search.inputs[3].type=1 +aiyh.patentWall.search.inputs[3].dbFieldName=zllx +aiyh.patentWall.search.inputs[3].labelName=\u4E13\u5229\u7C7B\u578B +aiyh.patentWall.search.inputs[3].labelIndex=-1023 +aiyh.patentWall.search.inputs[3].searchType=1 +aiyh.patentWall.search.inputs[3].multiple=true +aiyh.patentWall.search.inputs[3].value= + +aiyh.patentWall.search.inputs[4].type=3 +aiyh.patentWall.search.inputs[4].dbFieldName=zlsqrq +aiyh.patentWall.search.inputs[4].labelName=\u4E13\u5229\u7533\u8BF7\u65E5\u671F +aiyh.patentWall.search.inputs[4].labelIndex=-1023 +aiyh.patentWall.search.inputs[4].searchType=1 +aiyh.patentWall.search.inputs[4].value= + +aiyh.patentWall.search.inputs[5].type=1 +aiyh.patentWall.search.inputs[5].dbFieldName=zlzt +aiyh.patentWall.search.inputs[5].labelName=\u4E13\u5229\u72B6\u6001 +aiyh.patentWall.search.inputs[5].labelIndex=-1023 +aiyh.patentWall.search.inputs[5].searchType=1 +aiyh.patentWall.search.inputs[5].value= + +aiyh.patentWall.search.inputs[6].type=1 +aiyh.patentWall.search.inputs[6].dbFieldName=sqlx +aiyh.patentWall.search.inputs[6].labelName=\u6388\u6743\u7C7B\u578B +aiyh.patentWall.search.inputs[6].labelIndex=-1023 +aiyh.patentWall.search.inputs[6].searchType=1 +aiyh.patentWall.search.inputs[6].value= + + +# copyrightWall \u8457\u4F5C\u5899 + +aiyh.copyrightWall.voMapping.dataResource=uf_zlqzsb +aiyh.copyrightWall.voMapping.id=${id} +aiyh.copyrightWall.voMapping.icon=patent.png +aiyh.copyrightWall.voMapping.activeIcon=patent_active.png +aiyh.copyrightWall.voMapping.title=#sql{select imagefilename from docimagefile where docid = #{zlzs} } +# labelName labelIndex linkUrl +aiyh.copyrightWall.voMapping.linkList[0].labelName=\u67E5\u770B\u6587\u6863 +aiyh.copyrightWall.voMapping.linkList[0].labelIndex=-199 +aiyh.copyrightWall.voMapping.linkList[0].linkUrl=/spa/document/index.jsp?id=${zlzs} +aiyh.copyrightWall.voMapping.linkList[1].labelName=\u8DF3\u8F6C\u6D41\u7A0B +aiyh.copyrightWall.voMapping.linkList[1].labelIndex=-199 +aiyh.copyrightWall.voMapping.linkList[1].linkUrl=/spa/document/index.jsp?id=${zlzs} +#aiyh.copyrightWall.voMapping.linkUrl=/spa/document/index.jsp?id=${zlzs} +aiyh.copyrightWall.voMapping.docId=${zlzs} +aiyh.copyrightWall.voMapping.imageFileId=#sql{select imagefileid from docimagefile where docid = #{zlzs} } + + + +aiyh.copyrightWall.search.dataResource=uf_zlqzsb + +aiyh.copyrightWall.search.inputs[0].type=2 +aiyh.copyrightWall.search.inputs[0].dbFieldName=zlqr +aiyh.copyrightWall.search.inputs[0].labelName=\u4E13\u5229\u6743\u4EBA +aiyh.copyrightWall.search.inputs[0].labelIndex=-1023 +aiyh.copyrightWall.search.inputs[0].searchType=1 +aiyh.copyrightWall.search.inputs[0].value= + +aiyh.copyrightWall.search.inputs[1].type=2 +aiyh.copyrightWall.search.inputs[1].dbFieldName=fmrsjr +aiyh.copyrightWall.search.inputs[1].labelName=\u53D1\u660E\u4EBA/\u8BBE\u8BA1\u4EBA +aiyh.copyrightWall.search.inputs[1].labelIndex=-1023 +aiyh.copyrightWall.search.inputs[1].searchType=1 +aiyh.copyrightWall.search.inputs[1].value= + +aiyh.copyrightWall.search.inputs[2].type=2 +aiyh.copyrightWall.search.inputs[2].dbFieldName=zlcpmc +aiyh.copyrightWall.search.inputs[2].labelName=\u4E13\u5229\u4EA7\u54C1\u540D\u79F0 +aiyh.copyrightWall.search.inputs[2].labelIndex=-1023 +aiyh.copyrightWall.search.inputs[2].searchType=1 +aiyh.copyrightWall.search.inputs[2].value= + +aiyh.copyrightWall.search.inputs[3].type=1 +aiyh.copyrightWall.search.inputs[3].dbFieldName=zllx +aiyh.copyrightWall.search.inputs[3].labelName=\u4E13\u5229\u7C7B\u578B +aiyh.copyrightWall.search.inputs[3].labelIndex=-1023 +aiyh.copyrightWall.search.inputs[3].searchType=1 +aiyh.copyrightWall.search.inputs[3].multiple=true +aiyh.copyrightWall.search.inputs[3].value= + +aiyh.copyrightWall.search.inputs[4].type=3 +aiyh.copyrightWall.search.inputs[4].dbFieldName=zlsqrq +aiyh.copyrightWall.search.inputs[4].labelName=\u4E13\u5229\u7533\u8BF7\u65E5\u671F +aiyh.copyrightWall.search.inputs[4].labelIndex=-1023 +aiyh.copyrightWall.search.inputs[4].searchType=1 +aiyh.copyrightWall.search.inputs[4].value= + +aiyh.copyrightWall.search.inputs[5].type=1 +aiyh.copyrightWall.search.inputs[5].dbFieldName=zlzt +aiyh.copyrightWall.search.inputs[5].labelName=\u4E13\u5229\u72B6\u6001 +aiyh.copyrightWall.search.inputs[5].labelIndex=-1023 +aiyh.copyrightWall.search.inputs[5].searchType=1 +aiyh.copyrightWall.search.inputs[5].value= + +aiyh.copyrightWall.search.inputs[6].type=1 +aiyh.copyrightWall.search.inputs[6].dbFieldName=sqlx +aiyh.copyrightWall.search.inputs[6].labelName=\u6388\u6743\u7C7B\u578B +aiyh.copyrightWall.search.inputs[6].labelIndex=-1023 +aiyh.copyrightWall.search.inputs[6].searchType=1 +aiyh.copyrightWall.search.inputs[6].value= diff --git a/web/WEB-INF/prop/prop2map/htmlLabelIndex.properties b/web/WEB-INF/prop/prop2map/htmlLabelIndex.properties new file mode 100644 index 0000000..4a3e3ea --- /dev/null +++ b/web/WEB-INF/prop/prop2map/htmlLabelIndex.properties @@ -0,0 +1,4 @@ +aiyh.htmlLabel.porsche.FaDDContractController.pushErr.labelIndex=-1 +aiyh.htmlLabel.porsche.FaDDContractController.pushErr.defaultStr=\u90AE\u4EF6\u53D1\u9001\u5931\u8D25\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458\uFF01 +aiyh.htmlLabel.porsche.FaDDContractController.pushSuccess.labelIndex=-1 +aiyh.htmlLabel.porsche.FaDDContractController.pushSuccess.defaultStr=\u7B7E\u7F72\u90AE\u4EF6\u53D1\u9001\u6210\u529F\uFF01 \ No newline at end of file