From 71acd46cb78d98ce43d1020c415b140b41c44990 Mon Sep 17 00:00:00 2001 From: dzc <2388224167@qq.com> Date: Fri, 16 Jan 2026 10:30:01 +0800 Subject: [PATCH] =?UTF-8?q?feat:=E5=85=85=E5=80=BC/=E6=89=A3=E6=AC=BE?= =?UTF-8?q?=E7=94=B3=E8=AF=B7=E5=AF=BC=E5=87=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../task/constant/TaskCheckStatusEnum.java | 4 +- .../api/constant/WalletBizRechargeEnum.java | 2 +- .../WalletRechargeApplyController.java | 11 +- .../service/WalletRechargeApplyService.java | 7 + .../WalletRechargeApplyServiceImpl.java | 146 +++++++++++++++--- .../main/resources/file/充值或扣款申请.xlsx | Bin 0 -> 10174 bytes 6 files changed, 141 insertions(+), 29 deletions(-) create mode 100644 pjcloud-wallet/pjcloud-wallet-biz/src/main/resources/file/充值或扣款申请.xlsx diff --git a/pjcloud-flow/pjcloud-flow-task/pjcloud-flow-task-api/src/main/java/com/bsd/pjcloud/flow/task/constant/TaskCheckStatusEnum.java b/pjcloud-flow/pjcloud-flow-task/pjcloud-flow-task-api/src/main/java/com/bsd/pjcloud/flow/task/constant/TaskCheckStatusEnum.java index adf8c9e91..f7b811e8a 100644 --- a/pjcloud-flow/pjcloud-flow-task/pjcloud-flow-task-api/src/main/java/com/bsd/pjcloud/flow/task/constant/TaskCheckStatusEnum.java +++ b/pjcloud-flow/pjcloud-flow-task/pjcloud-flow-task-api/src/main/java/com/bsd/pjcloud/flow/task/constant/TaskCheckStatusEnum.java @@ -23,13 +23,13 @@ public enum TaskCheckStatusEnum { public static TaskCheckStatusEnum descOf(String description) { return Arrays.stream(TaskCheckStatusEnum.values()) .filter(v -> ObjectUtil.equal(v.getDesc(), description)) - .findFirst().get(); + .findFirst().orElse(null); } public static TaskCheckStatusEnum codeOf(String code) { return Arrays.stream(TaskCheckStatusEnum.values()) .filter(v -> ObjectUtil.equal(v.getCode(), code)) - .findFirst().get(); + .findFirst().orElse(null); } } diff --git a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/constant/WalletBizRechargeEnum.java b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/constant/WalletBizRechargeEnum.java index 907ac832d..7215ee316 100644 --- a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/constant/WalletBizRechargeEnum.java +++ b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/constant/WalletBizRechargeEnum.java @@ -26,7 +26,7 @@ public enum WalletBizRechargeEnum { public static WalletBizRechargeEnum valueOfByType(String code) { return Arrays.stream(WalletBizRechargeEnum.values()) .filter(v -> ObjectUtil.equal(v.getCode(), code)) - .findFirst().get(); + .findFirst().orElse(null); } public static WalletBizRechargeEnum descOf(String description) { diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/recharge/WalletRechargeApplyController.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/recharge/WalletRechargeApplyController.java index c25ae7d10..3cb568db6 100644 --- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/recharge/WalletRechargeApplyController.java +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/controller/recharge/WalletRechargeApplyController.java @@ -12,6 +12,7 @@ import com.bsd.pjcloud.common.idempotent.annotation.Idempotent; import com.bsd.pjcloud.common.log.annotation.SysLog; import com.bsd.pjcloud.common.security.annotation.Inner; import com.bsd.pjcloud.flow.task.dto.ProcessNodeRecordAssignUserParamDto; +import com.bsd.pjcloud.hard.api.dto.order.HardOrderDto; import com.bsd.pjcloud.wallet.api.dto.recharge.WalletRechargeApplyDto; import com.bsd.pjcloud.wallet.api.dto.recharge.WalletRechargeImportDto; import com.bsd.pjcloud.wallet.api.dto.recharge.WalletRechargeSaveTopupDto; @@ -22,6 +23,7 @@ import com.bsd.pjcloud.wallet.api.vo.recharge.WalletRechargeImportVo; import com.bsd.pjcloud.wallet.api.vo.recharge.excel.WalletRechargeByApplyExcelVo; import com.bsd.pjcloud.wallet.service.WalletRechargeApplyService; import com.bsd.pjcloud.wallet.service.WalletRechargeApplyComposeService; +import jakarta.servlet.http.HttpServletResponse; import org.springframework.security.access.prepost.PreAuthorize; import com.bsd.pjcloud.common.excel.annotation.ResponseExcel; import io.swagger.v3.oas.annotations.security.SecurityRequirement; @@ -153,11 +155,14 @@ public class WalletRechargeApplyController { return walletRechargeApplyService.exportExcel(dto); } + /** + * 导出充值/扣款申请 + */ @ResponseExcel - @GetMapping("/export") + @PostMapping("/export") @PreAuthorize("@pms.hasPermission('wallet_walletRechargeApply_export')") - public List export(WalletRechargeApplyEntity walletRechargeApply, Long[] ids) { - return walletRechargeApplyService.list(Wrappers.lambdaQuery(walletRechargeApply).in(ArrayUtil.isNotEmpty(ids), WalletRechargeApplyEntity::getId, ids)); + public void export(HttpServletResponse response, @RequestBody WalletRechargeApplyDto dto) { + walletRechargeApplyService.export(response, dto); } @PostMapping("/read-excel") diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/WalletRechargeApplyService.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/WalletRechargeApplyService.java index 580910a24..8b641c875 100644 --- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/WalletRechargeApplyService.java +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/WalletRechargeApplyService.java @@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.extension.service.IService; import com.bsd.pjcloud.common.core.util.R; import com.bsd.pjcloud.common.data.datascope.DataScope; import com.bsd.pjcloud.flow.task.dto.ProcessNodeRecordAssignUserParamDto; +import com.bsd.pjcloud.hard.api.dto.order.HardOrderDto; import com.bsd.pjcloud.wallet.api.dto.recharge.WalletRechargeApplyDto; import com.bsd.pjcloud.wallet.api.dto.recharge.WalletRechargeImportDto; import com.bsd.pjcloud.wallet.api.dto.recharge.WalletRechargeSaveTopupDto; @@ -12,6 +13,7 @@ import com.bsd.pjcloud.wallet.api.dto.recharge.excel.WalletRechargeExcelDto; import com.bsd.pjcloud.wallet.api.entity.recharge.WalletRechargeApplyEntity; import com.bsd.pjcloud.wallet.api.vo.recharge.WalletRechargeApplyVo; import com.bsd.pjcloud.wallet.api.vo.recharge.excel.WalletRechargeByApplyExcelVo; +import jakarta.servlet.http.HttpServletResponse; import org.springframework.validation.BindingResult; import java.util.ArrayList; @@ -65,4 +67,9 @@ public interface WalletRechargeApplyService extends IService exportExcel(WalletRechargeImportDto dto); + + /** + * 导出充值/扣款申请 + */ + void export(HttpServletResponse response, WalletRechargeApplyDto dto); } \ No newline at end of file diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/recharge/WalletRechargeApplyServiceImpl.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/recharge/WalletRechargeApplyServiceImpl.java index f0c4ba4d6..7df8a5440 100644 --- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/recharge/WalletRechargeApplyServiceImpl.java +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/recharge/WalletRechargeApplyServiceImpl.java @@ -2,10 +2,15 @@ package com.bsd.pjcloud.wallet.service.impl.recharge; import cn.hutool.core.date.DatePattern; import cn.hutool.core.date.LocalDateTimeUtil; +import cn.hutool.core.io.resource.ResourceUtil; import cn.hutool.core.lang.Validator; import cn.hutool.core.util.ObjectUtil; import cn.hutool.extra.spring.SpringUtil; +import com.alibaba.excel.EasyExcel; +import com.alibaba.excel.ExcelWriter; +import com.alibaba.excel.write.metadata.WriteSheet; +import com.alibaba.excel.write.metadata.fill.FillConfig; import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; @@ -32,6 +37,7 @@ import com.bsd.pjcloud.flow.task.constant.TaskCheckStatusEnum; import com.bsd.pjcloud.flow.task.dto.ProcessNodeRecordAssignUserParamDto; import com.bsd.pjcloud.flow.task.dto.TaskDto; import com.bsd.pjcloud.flow.task.dto.TaskParamDto; +import com.bsd.pjcloud.hard.api.dto.order.HardOrderDto; import com.bsd.pjcloud.wallet.api.constant.WalletBizEnum; import com.bsd.pjcloud.wallet.api.constant.WalletBizRechargeEnum; import com.bsd.pjcloud.wallet.api.constant.WalletRechargeInvoiceStatusEnum; @@ -61,6 +67,7 @@ import com.bsd.pjcloud.wallet.service.*; import com.bsd.pjcloud.wallet.utils.flow.FlowUtil; import com.bsd.pjcloud.wallet.utils.flow.dto.WalletRechargeApplyFlowDto; +import jakarta.servlet.http.HttpServletResponse; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -70,11 +77,14 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.BindingResult; import org.springframework.validation.annotation.Validated; +import org.springframework.web.context.request.RequestAttributes; +import org.springframework.web.context.request.RequestContextHolder; import java.math.BigDecimal; import java.math.RoundingMode; import java.time.LocalDateTime; import java.util.*; +import java.util.concurrent.CompletableFuture; /** * 充值/扣款申请 @@ -544,39 +554,128 @@ public class WalletRechargeApplyServiceImpl extends ServiceImpl map = new HashMap(); + if (ObjectUtil.isNotEmpty(dto.getCreateTimeList())) { + map.put("timeSpan", " 到 "); + map.put("startTime", LocalDateTimeUtil.format(dto.getCreateTimeList()[0], DatePattern.NORM_DATETIME_PATTERN)); + map.put("endTime", LocalDateTimeUtil.format(dto.getCreateTimeList()[1], DatePattern.NORM_DATETIME_PATTERN)); + } + + // 统计 + double sumTotalPrice = 0; + int lineNumber = 1; + + long currentPage = 1; + long pageSize = 1000; + while (true) { + Page page = scopePageList(new Page(currentPage, pageSize), dto, DataScope.of()); + List records = page.getRecords(); + if (ObjectUtil.isEmpty(records)) break; + // 处理excel start + List> excelList = new LinkedList<>(); + for (WalletRechargeApplyVo v : records) { + Map excelMap = new HashMap<>(); + excelMap.put("lineNumber", lineNumber); + excelMap.put("username", v.getUsername()); + excelMap.put("bizTypeStr", ""); + if (ObjectUtil.isNotEmpty(v.getBizType())) { + WalletBizRechargeEnum bizTypeEnum = WalletBizRechargeEnum.valueOfByType(v.getBizType()); + if (ObjectUtil.isNotEmpty(bizTypeEnum)) excelMap.put("bizTypeStr", bizTypeEnum.getDesc()); + } + excelMap.put("invoiceCode", v.getInvoiceCode()); + excelMap.put("walletTypeName", v.getWalletTypeName()); + excelMap.put("deptName", v.getDeptName()); + excelMap.put("totalPrice", 0); + if (ObjectUtil.isNotEmpty(v.getTotalPrice())) { + double totalPrice = new BigDecimal(v.getTotalPrice()).divide(BigDecimal.valueOf(100)).setScale(2, RoundingMode.HALF_UP).doubleValue(); + if (ObjectUtil.isNotEmpty(totalPrice)) { + excelMap.put("totalPrice", totalPrice); + // 累加 + sumTotalPrice += totalPrice; + } + } + excelMap.put("importTime", LocalDateTimeUtil.format(v.getImportTime(), DatePattern.NORM_MONTH_PATTERN)); + excelMap.put("processStatus", ""); + if (ObjectUtil.isNotEmpty(v.getProcessStatus())) { + TaskCheckStatusEnum processStatusEnum = TaskCheckStatusEnum.codeOf(v.getProcessStatus()); + if (ObjectUtil.isNotEmpty(processStatusEnum)) { + excelMap.put("processStatus", processStatusEnum.getCode()); + } + } + excelMap.put("remark", v.getRemark()); + excelMap.put("applyTime", LocalDateTimeUtil.format(v.getApplyTime(), DatePattern.NORM_DATETIME_PATTERN)); + excelMap.put("processTime", LocalDateTimeUtil.format(v.getProcessTime(), DatePattern.NORM_DATETIME_PATTERN)); + excelList.add(excelMap); + lineNumber++; + } + excelWriter.fill(excelList, fillConfig, writeSheet); + // 处理excel end + if (page.getTotal() < pageSize) break; + currentPage++; + } + map.put("totalPrice", sumTotalPrice); + excelWriter.fill(map, writeSheet); + } catch (Exception e) { + e.printStackTrace(); + log.error("|{}|导出充值/扣款申请异常,dto:|{}|error:|{}|", TAG, JSON.toJSONString(dto), e.getMessage()); + } + } + private void disposeList(List list, WalletRechargeApplyDto dto) { if (ObjectUtil.isEmpty(list)) return; + RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes(); + PjcloudUser user = SecurityUtils.getUser(); // 用户 - List userIds = list.stream().map(WalletRechargeApplyVo::getUserId).distinct().toList(); - if (ObjectUtil.isNotEmpty(userIds)) { - List userList = userService.getUserById(new ArrayList<>(userIds)).getData(); - if (ObjectUtil.isNotEmpty(userList)) { - DataUtil.convertUserList(list, CollectionUtils.convertMap(userList, SysUser::getUserId)); + CompletableFuture userFuture = CompletableFuture.runAsync(() -> { + RequestContextHolder.setRequestAttributes(requestAttributes); + List userIds = list.stream().map(WalletRechargeApplyVo::getUserId).distinct().toList(); + if (ObjectUtil.isNotEmpty(userIds)) { + List userList = userService.getUserById(new ArrayList<>(userIds)).getData(); + if (ObjectUtil.isNotEmpty(userList)) { + DataUtil.convertUserList(list, CollectionUtils.convertMap(userList, SysUser::getUserId)); + } } - } + }); // 部门 - List deptIds = list.stream().map(WalletRechargeApplyVo::getDeptId).distinct().toList(); - if (ObjectUtil.isNotEmpty(deptIds)) { - Map deptList = deptService.getDeptByDeptIds(deptIds).getData(); - if (ObjectUtil.isNotEmpty(deptList)) { - DataUtil.convertDeptList(list, deptList); + CompletableFuture deptFuture = CompletableFuture.runAsync(() -> { + RequestContextHolder.setRequestAttributes(requestAttributes); + List deptIds = list.stream().map(WalletRechargeApplyVo::getDeptId).distinct().toList(); + if (ObjectUtil.isNotEmpty(deptIds)) { + Map deptList = deptService.getDeptByDeptIds(deptIds).getData(); + if (ObjectUtil.isNotEmpty(deptList)) { + DataUtil.convertDeptList(list, deptList); + } } - } + }); // 饭卡类型 - List walletTypeIds = list.stream().map(WalletRechargeApplyVo::getWalletTypeId).distinct().toList(); - if (ObjectUtil.isNotEmpty(walletTypeIds)) { - WalletTypeDto walletTypeDto = new WalletTypeDto(); - walletTypeDto.setWalletTypeIds(walletTypeIds); - List walletTypeList = walletTypeMapper.list(walletTypeDto); - if (ObjectUtil.isNotEmpty(walletTypeList)) { - WalletDataUtil.convertWalletTypeList(list, CollectionUtils.convertMap(walletTypeList, WalletTypeEntity::getId)); + CompletableFuture walletTypeFuture = CompletableFuture.runAsync(() -> { + RequestContextHolder.setRequestAttributes(requestAttributes); + List walletTypeIds = list.stream().map(WalletRechargeApplyVo::getWalletTypeId).distinct().toList(); + if (ObjectUtil.isNotEmpty(walletTypeIds)) { + WalletTypeDto walletTypeDto = new WalletTypeDto(); + walletTypeDto.setWalletTypeIds(walletTypeIds); + List walletTypeList = walletTypeMapper.list(walletTypeDto); + if (ObjectUtil.isNotEmpty(walletTypeList)) { + WalletDataUtil.convertWalletTypeList(list, CollectionUtils.convertMap(walletTypeList, WalletTypeEntity::getId)); + } } - } + }); // 审批流程 - if (dto.getIsFindCheckUser()) { + CompletableFuture flowFuture = CompletableFuture.runAsync(() -> { + RequestContextHolder.setRequestAttributes(requestAttributes); + if (!dto.getIsFindCheckUser()) return; List processInstanceIds = list.stream().map(WalletRechargeApplyVo::getProcessId).filter(ObjectUtil::isNotEmpty).distinct().toList(); if (ObjectUtil.isNotEmpty(processInstanceIds)) { - List taskList = flowUtil.queryProcessInstanceList(SecurityUtils.getUser().getId().toString(), processInstanceIds); + List taskList = flowUtil.queryProcessInstanceList(String.valueOf(user.getId()), processInstanceIds); if (ObjectUtil.isNotEmpty(taskList)) { Map taskMap = CollectionUtils.convertMap(taskList, TaskDto::getProcessInstanceId); CollectionUtils.convertList(list, v -> { @@ -588,7 +687,8 @@ public class WalletRechargeApplyServiceImpl extends ServiceImplh~M1N1rqr8jtA_x~QyF9!wyeOX(8wH=M@ix~3D38iW zXn}!%7(sx55dJBqYi&*KY-y1e)gcZ_hb(mC^NdgpV4%X6rzi6X;(%0lz+wO_v`ZpI z?~L73QQPC)LRwt{6dz$3-i;MC+B#_;e{a2j$^axM*RJ{26BoqT2t$7`l(1B0Yf()P z4=05tl_E1Y$1Tu+vZubjab7P2jX(zpMj_s^58E{g1+NPb4zQ_}vL`>l2)4PTFe(wJ zV6EEE2lll{HVlMihRXM|-D-s~HA}6#U7eUH4yVziZlDH%@i^2hi|cmIYa~bAx>(=a zeDbeZ=imXIU;Ze1SqAqK~1%1z~#htgM4zY`Fw;*1T*D<&BZDQ^-Kr#XCTmqd^te=^H^3w!b zpEerzR9GJFtj@rHXV*Eo28Q>AUGo=q5&y}qKET%SmEN#uIhih8WdBvE$G31NRAWhB zBI_ll4*Q9SXH47)tY?`}#et5tD-!B8(ncV0)>9vBM&Rac3zBz1OG`A;2$B(yy-~|b z9pZ8dY*A=rw>W2`S;_)1k2{U{bFtnLi)fs{b%Zk+j14wi`@;{y$| z)KDLpSu#pBt3m7327kozh*ww|V}VIRgX4g_M4SPZ$p!<1=R5&iv8GFZ@E{ z6E2b_k`)sC^GX9yE=Q}+bgLp*G*furJcBNxk%Uo0$KGuq${O4rx*==-PIvN`JZJJ3 zx)EOJe)k*Q4tDkc%U8nlqK3_Ud69*0{9Ap8JW|_CQZoYz5yjubF%H)Ug$J(<1u^8q z<(;fRo2obM=6}>`9b9+6=^0d+cN3vYmM#H9zyXyhRA)(BAXzij=!A0aQ7$fWEfWNh z?({Nrb$bU8<_a2j>~x0Dk_3UDfrs&v{De?V-}*UDLY-@1pvh*5V7dMy)tiqp@}!?h zd+>@$^y~b(-otA;f6n4C3SgyCSSu25+IPAesS0--e@oL7ZrWqSpe!$rHj-UR%C>$H8JJp* zk5sMmgOh;nUMpf;X)}ZWklgrs2(=94C9`I&h3@4e@zV#3py;%C^KOv8kv3VrhuM^nNcdBn5&^ z;B(Qu7g#&@6QL@rs_N_d z`ct7gviN`>6}o|x{ZN$g3QTXWI}Y}BogiK!rZa!nLQDsE_k;LsiTF6BJ6j4ixw~2l zHl@2*ijy(eA>{*8uvCim81sT7Zeht+_^pMRfSeW?_BWiYZ)Qt!`oas~!S3h|cq8#H z;KA6=m%MQ$P_dxS4d%UZ6_hQzh4M=|5DW(LLBAwtzxA_(^lAEfz+1j-sk-=_Ti5Pe zXI)n25Je_KWLqJl{mDmHH{9QtlCrXr(!aw}YwNOD@RD^hOnnmL9SKT~t+HM}BC{%C=8Ckz+BE&OyPJAPUwPrUUh?YiQKk~Tg zwE6%QJb{=^`7O*kT*%qs`NvIpCKuW!7$j~+2-g&pK3Ppm8Wx?OE+KU_Y{9AJkh2eA z^LhVBP!7Xb%2=8$^0Xt8-~_Fx9EjOT`eo-2{}FibZ$-#vI-)Kzrri|n~`fCu`ZoSWqoOvMZ3ZMsB;t6)>dTVDY5bFfIkVH? zuy5hv8dKkHMd|v%w9(g%4W_=e67yRLISMmn%pd3mr*%y31?r|s9PnDcdg2p%=h{!3p*Ny6aH(cQ9ekFJM@DeP!pOzxtGe0Gq@I2iWj6U*`X6Fgfv^t+3 z)R54$K5jJtaNO1)G2twnGYD0|SWeZfKNGE`z=xW%VV};%?Dht+B9THYV^3qDakOLD z34UrMcJy@$6nH)bt{6V%sK3_Zj_GE&xMH>O>J1$y-dq9FRIyV-JRY40_O#`$v1veH zzZzcVFN#?hq4X^mb0^oJa~$H#B8@ZgQJ@693X`I{c6N$DASv%P=u6VkM_VG`dxr=R zy*F4xFeS4WMd}+|GRDna2p&F5%j_>4Jz(Z`h>}GJat%Gv-}gI1PZo>4RlJttKk~xC zLwg849KIXtaq#n#l%X}`Gxqa8?O)njtBAWi7~_64<;lP37P1w~=S~v|qQjUsnp6&r z9tu2)Vyv&i2_ln41}BlcU+WzzL%4!>;oa-8U&WgfySWy&#$Ye7oQTHV9}IP~b%A3D zY-?e|A}IX|Ywu8?O+vW5&^!!#vfxO-xz?@08Avhg`tI0sE_=}=K3%6UJT8bUuPl49|&VhLk4X`(bFYV{;15*o-A+;^sd!FvyU06s=p~e zS`7;cpYAQG82Wm7f0P)k6qC{l`R0@KI4f9*i3b&{=G0-EEDMp$aGw0C2 z38Q?b>_#1}3*{~&-V`lPb{Giz9spjZ85#LBa-fJ{`&k=0aM~1%riv1U%N0#9rZw>i z655SkY)4#Ie7L^}DuKYqL_Gn+_r!aQsxv+%S}L^_=IJ(^`3O*rY`jMyVadGl%{H4sSIJP`!_pmD{*?+%@v>IZ>-F1be-?kX^O-V>q^$k{kV~Ngwpe1J>0EaQ#d&ED0(RdRr zJZ>0gG>Hfv-D_bGAmO?^U|yc6!LdD5xl2h=M75WQGPtfsx7_JCSS%Ezd(}`zp9;3n z?i?!2dc((Ly$MQrCV_)LUDnLqXx=q%QEiuZ}R0sVP~RiYiOWgZ)<90Z1=i+bBN&s zOwuCvo`|{!_K~oT#bNT?S?^Q9?d4Ozam8}!lk9cW3A~vO{Q%EX zYAgGIiuTN0!qsDCy^70>yR#y!=M-#A{n_A1wXh^9Wo|!yke1RAdJ!03)t5AObwY|G z>cIGF7e8tSq-2-~i+wxH-c0I4a5qOV&5z#53alQ4l8t#J(bm_1)O|R+4*tmMyh`yr zAylLGZwfH&slCgC-p%w=;#b!?%xKe?2hf@qTRwKbo1BQ(jOo?ngD)n3`}e9{4*)R# z`75g+2S}ks@W`lr*11djAi4|kMllPlOkP3BG~QAs29j8niMcv0%51?i11@WM%5-DT zednb0>%)lF#|#Vz4}_w^HM&b9YB0a|*}0D&x?~=f)c7+Qw~35=Vm@%c1Fwj=IZ;lF zlv(w61_|&g`7op2fXH85DCRpYS?iaQBHjmKzBxc3Uq;xd$b{FV+vl`QF{LxG-j2{u zhM8S#!bdNcir#s}ix1tkP+MWPK%Q7iKG3I|2(?z<(i^t-Fodh4x+f*ZM5fQmQoh?~ zj_bvnzHlj+^aXCG{H@$M{gy9dc-l3uSb^5&3^>;Jyj^Z2*V4Ku+S5<7+u1y)KgNhF z8oX|>xYY4DbIR))@(bApgOYulsan!?B`Ihrun8;kAp_D60#W%!?xpuud}4Cx9+Myj zr_usjYx-K2)SR;pa`&b?p{w1o-A}7iq#~cuiFh=6_QQ_hsB&eqCu;Z^O(GwMubYYX zYoKRHOtFQk(dY0nhH1tVbeO=XbDouO7YrR^C9a>nBDUq|=@CAG`AUOH5=SjX77-C z$Md|+Ga55YAwrHYW*Zo;YdC)#n1!V<=C^W{CzG} zx!l6@P9jC&WRAH4Cpn)4`16^4iS4dSOqjam0uQ4|&t)|OUGM4en2ksPB+jz$g8fEv zk4{LCu%lGbtVUgwZWx7MS5IL^V1J*rCu@r0!-$EVv+`&))yap8V$qzZo)k#^UM5%O zLf0)bU}NXdDr~h+vq|g%C-jxYY+YH?Ec)mJWy$6%)sarM1J~Qm%o8Fjiu)WjRSimV zT`EX-+rz-ku@p#jO$V^NVJQ={xf0rK_C+2FuAp3=Z37RrH^Om`z7p=6`HDs0 z*{ZGLu{3!1C+{QrK`Dr@Q7D+MiCm&2f`t{KwfDcfc5~nRYL1LRVPOT zV|ei}&FZaY*=ki&n~MeZ`#~c50vfi9WTBK^v95B8iKJAwaf>G_tFvC(|^w(Z;HUo6pn}d1PlA=?)cByx&VV$O8BZq+91I z^Pnc1#*j2ks65z_Do8Bn>A8pQZ-#1>eCkcdEp|u38=EYdV-eWTm{KU_{lr~?X9sc(6ZeU zaA}X&)0=mfhQ3aVDfMiZI%E6lkb%3}qe+=~rJF959(65jm7$=<7IUYn1e(s`sy)6a zU&}(ApeU?5Vr%FwFg?$*1Lhu<7zXvQoKfgagYqd97!`Ok3TaK9TYJg)(b9f0fG?dV z9l~3;MxOsz8C3a2ZahfavgE3MK~cSX$HfrR(K>1D2K6KSAO?Q`zBUw^Pb!`PDRrlC zQ*6wvZ~%Tr7%ZPO23m+poz2>iPM1iK2v0Pu0N-G|*t-UX7(pFVVks>RhT>e+@bWHk zHZ3&{;}+x@V8|<=8GlJ;T;_4+ausBav*%6?|L1iIq+T)!lH$WWLs;~rr&B$QbPDy+5XvL?`nh&m)&z5*cx_6|KkMjTnwcneMMe3A40dAENRIgM#~bM-0_kovO+c zB|*Sr4;JP6H1F?l#qNt26HOXqZtKI<`jslkQ_Tn2383HN6G0zQ*9F)$Zn;9|O+ak>@o>{RDW_0er$qJk8e2ACD2-_51g)U zwtO2yvyR)#zV>>EaduwMRT}@@(oI$KRjAe?_GOE|;ky>Fb4ENFCH}FXd*Y#aL6zNY^vLC$(eyA+sCX;b$~aa(Fw0R zi?{tE6EVvW!5kv*wPtrc>ekqM#r_HaZR1Dpr?oAexvuYc&TZsB#;&%uF z1CE!QieNvrD3yfPyx*cQ@5)Vr`m3|c2%6`^9Xz%%{% ze)-$UG0n=eId34lCoI;NMEvZ%4c`Z2oG0$gc7`$7;ISVCGTb2FQJvCHCr+Db^DN(- z@pX&oE_$H`s$%)eT?BXfg({n?;_J@2XVVgO-hqaTeqhOf3W-LizPQERk;~~||M9r~ zs1*cX+tW=7c|o3S0^I*YMu3bHUng2X(Du9_fh2+-3H#j^yjP*#=ZIsm={35deu>FE9@z0acv(<*bkAFa zl%qL(h}r9hBQn~YZs^gcsLJ!8Qr_2& zDwZe5z^0&uM*`CtHtO1hgdhiDF0)|f%tv>oa79)CvFmg#I&C+D@{Ze$i-g05m*0tA z%*u8pboH+eW>n!{B6>OSCdub!>9!8lCz9k`g9!IV$OzWTvTz<^_Dhtyd}G*UTpNJ! z<>#rbV*af+l}JW25D{vPX0l%Mf)%pNoJP7BMP5?bDx?_LUn*_X+lj|1@Gz`FG0c<_ zvB0&w6CA&D zuYNsQx5ck%rG5#X_E|>z^5`b}mj74_N=J(v4+U%PYgQq3b&+v4!s7(Q+IESScXm?v zo2fQ1$sy$Ptl=hlMi7(mWu?45tmvM4L30xjl=g~dFCJXX>HJ<)?Z_qKcf_BiQ4rb~2H9|$(^;^Wkt!f`T z-hO{y1zvk~s*e|ysBhraW=Y?Wb^jq^YCR1PI1kx!)adQX5S^4`*1Dm0ENcp3D^wYNl@MR@~N$8@X zNP4`BH1fF`%`PR~&_lWuNRk9s=?>8z8^vVxPiv*Zzf;g4m)JJ#uG5SCbvKZ6xJw;jG3=Srt0yZ9f0$=79D_N_7 zbK#y0Y*{JJZ!6?MZeJm6SpA#t0D$6yku|QQ9Dz{=iY>*cGzW`Flu%#yoVhlHD4SR3%RTH<$k^SNu0R`z+>d4_|0(dZ82jW&e_e`X%;Sdi-}{ z;$Q4anRU@3_}}=i@C~)br^U;QZ&`@rEzWRxMfSu8Q$Y`3_BK>l@_lL-Ycdo+zXSI#cJC`K;D_xP1vx%@oHDdTiK07`DlC!ldjI+EuTtc7}( zTcn|#pmZ8R(GAl+&>-Ogc(slUYI=gc!Lyr^9*(rJR=a`4kMfj*vpUS?oz@-%oMn3P zw%jG=u+zz~t9V#_c;~^Js`zY9;k4(6z0+;K|Hv1fsoNR9q;23{$~vzl9Ss41mA#>r zy|$u@wV~a|*VIi}?4UFV9df`8acftu27`jNZm6!#x?vIF2I$mvJL6@1y3gr#I++d# zpLb}A82iy(+w)@!tT2Un2$A5_%5pF*cIB$Ebc_4w(% z8Lb**yH7FJOsN7CZP|XGN%=4eQ9zqLTEgGltQchzL&feG>XzT)7-8Xi-GT1j-TVUQ+xe! zSaz^F9~~-P%Nq&i#&cWDPrT9r#cfLAbC;7v@x16T5{Qap^`*RV-h_C>a6IYH1`;^y zwzt$d_4j%kATbRI3~$ln)wU&X2dpgw!LHKr(?ky?dlC3ZEr6n#rqi#F3o$>pTt&@5 zJT3F0a`8#q7kTXf+U$VTw!uyZd+!QvE=DT5YRRq!-W-jr?NISAd@9~sxoVB7Z=-C! z=(x~leuR*f00u$+nJxX*d-JDdUW@|-421i#g~tD{cKS8Jf3LZ}Mx0;cwT;IX=kNIQ zyV5@+&@1Mb()hnHKRxDuDSLIvU*lET>-a}|(eL{HY%qEi{-uxPpRj+m8~sVqpA9sB zqy1lA>A#fzyPf7w_@50Sf5R_dBF5kFzuH6o*F(RyJ^UK44=n@sGu-?y!0#-z;{GE( z{duE*2C`Q@zgYVIPuPEiwLj2`On1k-xJ8cSnB1W|4G~by6M-xm0#o4!q&em q{96~x?|1%ZAImHDm(^1L1N(PZi>w6rPiIAZX$gaTk;@`@#r;2iSjFoA literal 0 HcmV?d00001