From 6b0d3c13e8a4218d7e61cd9580e97ca6909f81d1 Mon Sep 17 00:00:00 2001 From: Y1NanPing <735289578@qq.com> Date: Sat, 19 Jul 2025 17:23:25 +0800 Subject: [PATCH] =?UTF-8?q?=E7=AC=AC=E4=BA=8C=E6=AC=A1=E8=AF=BE=E7=A8=8B?= =?UTF-8?q?=E6=8F=90=E4=BA=A4=20(2)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../album/api/AlbumInfoApiController.java | 54 ++++- .../tingshu/album/mapper/AlbumInfoMapper.java | 5 + .../album/service/AlbumInfoService.java | 12 ++ .../service/impl/AlbumInfoServiceImpl.java | 194 +++++++++++++----- .../main/resources/mapper/AlbumInfoMapper.xml | 30 ++- .../album/api/AlbumInfoApiController.class | Bin 1792 -> 3310 bytes .../album/service/AlbumInfoService.class | Bin 609 -> 1066 bytes .../service/impl/AlbumInfoServiceImpl.class | Bin 5541 -> 6093 bytes 8 files changed, 237 insertions(+), 58 deletions(-) diff --git a/service/service-album/src/main/java/com/atguigu/tingshu/album/api/AlbumInfoApiController.java b/service/service-album/src/main/java/com/atguigu/tingshu/album/api/AlbumInfoApiController.java index 90b6bdf..6c15ddc 100644 --- a/service/service-album/src/main/java/com/atguigu/tingshu/album/api/AlbumInfoApiController.java +++ b/service/service-album/src/main/java/com/atguigu/tingshu/album/api/AlbumInfoApiController.java @@ -3,15 +3,19 @@ package com.atguigu.tingshu.album.api; import com.atguigu.tingshu.album.service.AlbumInfoService; import com.atguigu.tingshu.common.result.Result; import com.atguigu.tingshu.common.util.AuthContextHolder; +import com.atguigu.tingshu.model.album.AlbumInfo; +import com.atguigu.tingshu.query.album.AlbumInfoQuery; import com.atguigu.tingshu.vo.album.AlbumInfoVo; +import com.atguigu.tingshu.vo.album.AlbumListVo; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; + +import java.util.List; @Tag(name = "专辑管理") @RestController @@ -32,6 +36,48 @@ public class AlbumInfoApiController { } + //这个是在登录到专辑页面的时候,会调用这个接口,获取当前登录用户的专辑信息 + @Operation(summary = "分页条件查询当前登录用户发布专辑") + @PostMapping("/albumInfo/findUserAlbumPage/{page}/{limit}") + public Result> findUserAlbumPage(@PathVariable Long page, + @PathVariable Long limit, + @RequestBody AlbumInfoQuery albumInfoQuery){ + //先从线程中取出来用户id + Long userId = AuthContextHolder.getUserId(); + //将用户id放进到查询条件中 + albumInfoQuery.setUserId(userId); + //new一个新的pageInfo对象 用来封装数据 + IPage pageInfo = new Page<>(page, limit); + pageInfo =albumInfoService.findUserAlbumPage(pageInfo, albumInfoQuery); + return Result.ok(pageInfo); + } + + @Operation(summary = "根据专辑ID删除专辑") + @DeleteMapping("/albumInfo/removeAlbumInfo/{id}") + public Result removeAlbumInfo(@PathVariable Long id) { + albumInfoService.removeAlbumInfo(id); + return Result.ok(); + } + /** + * 查询专辑信息,包含专辑标签列表 + * + * @param id + * @return + */ + @Operation(summary = "查询专辑信息,包含专辑标签列表") + @GetMapping("/albumInfo/getAlbumInfo/{id}") + public Result getAlbumInfo(@PathVariable Long id) { + AlbumInfo albumInfo = albumInfoService.getAlbumInfo(id); + return Result.ok(albumInfo); + } + @Operation(summary = "更新专辑信息") + @PutMapping("/albumInfo/updateAlbumInfo/{id}") + public Result updateAlbumInfo(@PathVariable Long id, @Validated @RequestBody AlbumInfoVo albumInfoVo) { + albumInfoService.updateAlbumInfo(id, albumInfoVo); + return Result.ok(); + } + + } diff --git a/service/service-album/src/main/java/com/atguigu/tingshu/album/mapper/AlbumInfoMapper.java b/service/service-album/src/main/java/com/atguigu/tingshu/album/mapper/AlbumInfoMapper.java index f483cac..adad2fa 100644 --- a/service/service-album/src/main/java/com/atguigu/tingshu/album/mapper/AlbumInfoMapper.java +++ b/service/service-album/src/main/java/com/atguigu/tingshu/album/mapper/AlbumInfoMapper.java @@ -1,10 +1,15 @@ package com.atguigu.tingshu.album.mapper; import com.atguigu.tingshu.model.album.AlbumInfo; +import com.atguigu.tingshu.query.album.AlbumInfoQuery; +import com.atguigu.tingshu.vo.album.AlbumListVo; import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.core.metadata.IPage; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; @Mapper public interface AlbumInfoMapper extends BaseMapper { + IPage findUserAlbumPage(IPage pageInfo, @Param("vo")AlbumInfoQuery albumInfoQuery); } diff --git a/service/service-album/src/main/java/com/atguigu/tingshu/album/service/AlbumInfoService.java b/service/service-album/src/main/java/com/atguigu/tingshu/album/service/AlbumInfoService.java index ec87626..6907c48 100644 --- a/service/service-album/src/main/java/com/atguigu/tingshu/album/service/AlbumInfoService.java +++ b/service/service-album/src/main/java/com/atguigu/tingshu/album/service/AlbumInfoService.java @@ -1,7 +1,10 @@ package com.atguigu.tingshu.album.service; import com.atguigu.tingshu.model.album.AlbumInfo; +import com.atguigu.tingshu.query.album.AlbumInfoQuery; import com.atguigu.tingshu.vo.album.AlbumInfoVo; +import com.atguigu.tingshu.vo.album.AlbumListVo; +import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.IService; public interface AlbumInfoService extends IService { @@ -11,4 +14,13 @@ public interface AlbumInfoService extends IService { void saveAlbumInfo(AlbumInfoVo albumInfoVo, Long userId); //保存专辑的状态 void saveAlbumInfoStat(Long albumId, String statType, int statNum); + + + IPage findUserAlbumPage(IPage pageInfo, AlbumInfoQuery albumInfoQuery); + + void removeAlbumInfo(Long id); + + AlbumInfo getAlbumInfo(Long id); + + void updateAlbumInfo(Long id, AlbumInfoVo albumInfoVo); } diff --git a/service/service-album/src/main/java/com/atguigu/tingshu/album/service/impl/AlbumInfoServiceImpl.java b/service/service-album/src/main/java/com/atguigu/tingshu/album/service/impl/AlbumInfoServiceImpl.java index 30e3e6d..f5f6b97 100644 --- a/service/service-album/src/main/java/com/atguigu/tingshu/album/service/impl/AlbumInfoServiceImpl.java +++ b/service/service-album/src/main/java/com/atguigu/tingshu/album/service/impl/AlbumInfoServiceImpl.java @@ -4,14 +4,22 @@ import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; import com.atguigu.tingshu.album.mapper.AlbumInfoMapper; import com.atguigu.tingshu.album.mapper.AlbumStatMapper; +import com.atguigu.tingshu.album.mapper.TrackInfoMapper; import com.atguigu.tingshu.album.service.AlbumAttributeValueService; import com.atguigu.tingshu.album.service.AlbumInfoService; import com.atguigu.tingshu.common.constant.SystemConstant; +import com.atguigu.tingshu.common.execption.GuiguException; import com.atguigu.tingshu.model.album.AlbumAttributeValue; import com.atguigu.tingshu.model.album.AlbumInfo; import com.atguigu.tingshu.model.album.AlbumStat; +import com.atguigu.tingshu.model.album.TrackInfo; +import com.atguigu.tingshu.query.album.AlbumInfoQuery; import com.atguigu.tingshu.vo.album.AlbumAttributeValueVo; import com.atguigu.tingshu.vo.album.AlbumInfoVo; +import com.atguigu.tingshu.vo.album.AlbumListVo; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; @@ -26,63 +34,143 @@ import java.util.stream.Collectors; public class AlbumInfoServiceImpl extends ServiceImpl implements AlbumInfoService { - @Autowired - private AlbumInfoMapper albumInfoMapper; - @Autowired - private AlbumAttributeValueService albumAttributeValueService; + @Autowired + private AlbumInfoMapper albumInfoMapper; + @Autowired + private AlbumAttributeValueService albumAttributeValueService; - @Autowired - private AlbumStatMapper albumStatMapper; + @Autowired + private AlbumStatMapper albumStatMapper; + @Autowired + private TrackInfoMapper trackInfoMapper; - @Override - @Transactional(rollbackFor = Exception.class) - public void saveAlbumInfo(AlbumInfoVo albumInfoVo, Long userId) { - //1.保存专辑信息 - //1.1 将专辑VO(视图对象)对象转为专辑PO(持久化对象)对象 - //将我们上传专辑的那个表中的数据转换成为albumInfo这个持久化对象数据里 - //相当于把传上来的表变成一个你存大数据的表 albumInfo这表中有大量的数据 比如说专辑的状态 属性等 - //不是这一个albumInfoVo表能装下的 + @Override + @Transactional(rollbackFor = Exception.class) + public void saveAlbumInfo(AlbumInfoVo albumInfoVo, Long userId) { + //1.保存专辑信息 + //1.1 将专辑VO(视图对象)对象转为专辑PO(持久化对象)对象 + //将我们上传专辑的那个表中的数据转换成为albumInfo这个持久化对象数据里 + //相当于把传上来的表变成一个你存大数据的表 albumInfo这表中有大量的数据 比如说专辑的状态 属性等 + //不是这一个albumInfoVo表能装下的 - //用这个工具要保证两个字段是相同的 - AlbumInfo albumInfo= BeanUtil.copyProperties(albumInfoVo, AlbumInfo.class); - //1.2 封装PO对象中用户ID、免费试听集数、专辑状态 - //这两张表只有这三个状态是不一样的 - albumInfo.setUserId(userId); - albumInfo.setTracksForFree(5); - albumInfo.setStatus(SystemConstant.ALBUM_STATUS_NO_PASS); - //1.3 保存专辑,得到专辑ID - albumInfoMapper.insert(albumInfo); - Long albumId = albumInfo.getId(); - //2.保存专辑标签信息 - List albumAttributeValueVoList = albumInfoVo.getAlbumAttributeValueVoList(); + //用这个工具要保证两个字段是相同的 + AlbumInfo albumInfo = BeanUtil.copyProperties(albumInfoVo, AlbumInfo.class); + //1.2 封装PO对象中用户ID、免费试听集数、专辑状态 + //这两张表只有这三个状态是不一样的 + albumInfo.setUserId(userId); + albumInfo.setTracksForFree(5); + albumInfo.setStatus(SystemConstant.ALBUM_STATUS_NO_PASS); + //1.3 保存专辑,得到专辑ID + albumInfoMapper.insert(albumInfo); + Long albumId = albumInfo.getId(); + //2.保存专辑标签信息 + List albumAttributeValueVoList = albumInfoVo.getAlbumAttributeValueVoList(); - if (CollUtil.isNotEmpty(albumAttributeValueVoList)) { - //2.1 将集合泛型从AlbumAttributeValueVo转为AlbumAttributeValue - //最一开始是vo类型 你通过stream将泛型 - List attributeValueList = albumAttributeValueVoList - .stream() - .map(vo -> { - AlbumAttributeValue albumAttributeValue = BeanUtil.copyProperties(vo, AlbumAttributeValue.class); - //2.2 为每个专辑标签关系 关联 专辑ID - albumAttributeValue.setAlbumId(albumId); - return albumAttributeValue; - }).collect(Collectors.toList()); - //2.3 批量保存 - albumAttributeValueService.saveBatch(attributeValueList); - } - this.saveAlbumInfoStat(albumId, SystemConstant.ALBUM_STAT_PLAY, 0); - this.saveAlbumInfoStat(albumId, SystemConstant.ALBUM_STAT_SUBSCRIBE, 0); - this.saveAlbumInfoStat(albumId, SystemConstant.ALBUM_STAT_BUY, 0); - this.saveAlbumInfoStat(albumId, SystemConstant.ALBUM_STAT_COMMENT, 0); + if (CollUtil.isNotEmpty(albumAttributeValueVoList)) { + //2.1 将集合泛型从AlbumAttributeValueVo转为AlbumAttributeValue + //最一开始是vo类型 你通过stream将泛型 + List attributeValueList = albumAttributeValueVoList + .stream() + .map(vo -> { + AlbumAttributeValue albumAttributeValue = BeanUtil.copyProperties(vo, AlbumAttributeValue.class); + //2.2 为每个专辑标签关系 关联 专辑ID + albumAttributeValue.setAlbumId(albumId); + return albumAttributeValue; + }).collect(Collectors.toList()); + //2.3 批量保存 + albumAttributeValueService.saveBatch(attributeValueList); + } + this.saveAlbumInfoStat(albumId, SystemConstant.ALBUM_STAT_PLAY, 0); + this.saveAlbumInfoStat(albumId, SystemConstant.ALBUM_STAT_SUBSCRIBE, 0); + this.saveAlbumInfoStat(albumId, SystemConstant.ALBUM_STAT_BUY, 0); + this.saveAlbumInfoStat(albumId, SystemConstant.ALBUM_STAT_COMMENT, 0); - } + } - @Override - public void saveAlbumInfoStat(Long albumId, String statType, int statNum) { - AlbumStat albumStat = new AlbumStat(); - albumStat.setAlbumId(albumId); - albumStat.setStatType(statType); - albumStat.setStatNum(statNum); - albumStatMapper.insert(albumStat); - } + @Override + public void saveAlbumInfoStat(Long albumId, String statType, int statNum) { + AlbumStat albumStat = new AlbumStat(); + albumStat.setAlbumId(albumId); + albumStat.setStatType(statType); + albumStat.setStatNum(statNum); + albumStatMapper.insert(albumStat); + } + + @Override + public IPage findUserAlbumPage(IPage pageInfo, AlbumInfoQuery albumInfoQuery) { + return albumInfoMapper.findUserAlbumPage(pageInfo, albumInfoQuery); + + } + + @Override + public void removeAlbumInfo(Long id) { + Long count = trackInfoMapper.selectCount(new LambdaQueryWrapper() + .eq(TrackInfo::getAlbumId, id)); + + if (count>0){ + throw new GuiguException(500,"专辑下有声音,请先删除专辑下的声音"); + } + //2.删除专辑 + albumInfoMapper.deleteById(id); + + //3.删除专辑统计 + albumStatMapper.delete( + new LambdaQueryWrapper() + .eq(AlbumStat::getAlbumId, id) + ); + + //4.删除专辑标签关系 + albumAttributeValueService.remove( + new LambdaQueryWrapper() + .eq(AlbumAttributeValue::getAlbumId, id) + ); + + + + } + + @Override + public AlbumInfo getAlbumInfo(Long id) { + //1.根据专辑ID查询专辑信息 + AlbumInfo albumInfo = albumInfoMapper.selectById(id); + + //2.根据专辑ID查询专辑标签列表 + List albumAttributeValues = albumAttributeValueService.list( + new LambdaQueryWrapper() + .eq(AlbumAttributeValue::getAlbumId, id) + ); + albumInfo.setAlbumAttributeValueVoList(albumAttributeValues); + return albumInfo; +} + + @Override + @Transactional(rollbackFor = Exception.class) + public void updateAlbumInfo(Long id, AlbumInfoVo albumInfoVo) { //1.更新专辑信息 + AlbumInfo albumInfo = BeanUtil.copyProperties(albumInfoVo, AlbumInfo.class); + albumInfo.setId(id); + albumInfoMapper.updateById(albumInfo); + + //2.更新专辑标签关系 + //2.1 根据专辑ID删除原有专辑标签关系 + albumAttributeValueService.remove( + new LambdaQueryWrapper() + .eq(AlbumAttributeValue::getAlbumId, id) + ); + //2.2 如果有新提交专辑标签关系再次进行新增即可 + List albumAttributeValueVoList = albumInfoVo.getAlbumAttributeValueVoList(); + if (CollUtil.isNotEmpty(albumAttributeValueVoList)) { + //2.1 将集合泛型从AlbumAttributeValueVo转为AlbumAttributeValue + List attributeValueList = albumAttributeValueVoList + .stream() + .map(vo -> { + AlbumAttributeValue albumAttributeValue = BeanUtil.copyProperties(vo, AlbumAttributeValue.class); + //2.2 为每个专辑标签关系 关联 专辑ID + albumAttributeValue.setAlbumId(id); + return albumAttributeValue; + }).collect(Collectors.toList()); + //2.3 批量保存 + albumAttributeValueService.saveBatch(attributeValueList); + + } + } } diff --git a/service/service-album/src/main/resources/mapper/AlbumInfoMapper.xml b/service/service-album/src/main/resources/mapper/AlbumInfoMapper.xml index 5ad3286..37d1281 100644 --- a/service/service-album/src/main/resources/mapper/AlbumInfoMapper.xml +++ b/service/service-album/src/main/resources/mapper/AlbumInfoMapper.xml @@ -3,7 +3,35 @@ - + diff --git a/service/service-album/target/classes/com/atguigu/tingshu/album/api/AlbumInfoApiController.class b/service/service-album/target/classes/com/atguigu/tingshu/album/api/AlbumInfoApiController.class index 5087ba41a7b94af75406a3287fb922f60d3d8ddf..0be8958d3df3f10b149d3eca90598f13a471d0df 100644 GIT binary patch literal 3310 zcmc&$TXPge7(JcrW=XPya1n^00*dBFI$XspL<5Q>ZXhJE3V7??ooohnXV$qSrqBn= zDheOGP^eWtSXQjE$|t}og+K~?_ZRpBNP>UD^7Kr|jY*L_`7qrxJ^h{jZs+UouYd2} z2XGj<8dRV%fmjl8R0-5yP{T?Vl~s@@vlonI7BH`aHL6$}auZZ4KI8WmBKy*u|ngq(0c9e+(GT zu$eQ6lwKN&>gY{#a5GY=T5P~m32aPa6E+L%SviEjYF7;#vx*8FZj97q*p{JPvs*KE zYO!~81fIs01hyve44xHejM9i}Is%U2`bAIn2a`aBeNmv59$&6Vss`JzJ%JrbJdYOy z+M)zM@(pKnvF4}rB17%Yg?fGCyC=~`{+3-5} z`*q|G2z1VOXh_x>xFra=ARSTy4gJ35nI$7*x@NX$bXk_|1-^9!4yJ9VAlg(E1+p^kC={;Cv5Dfou}v4q)p2>;g_<8b6OFeWKY{URm>>I z)Za6UF>lD^c?TjL7xH0gp7XTK3dppA%onH)4%ZbVV+%A#>K92_R!pBsq|00V;*{r7 zui*{Z`97tc>KP7gZ%UiCbVpR7U^sGkue6mr&$q5TSvH&?E;Kjc`lXW6+*&vF{msdV zyAQ^%J-mPQ!JlJOpWP7H9~rh0BP+Aa?RluO&vw0DRW38WgpCh}B-tDiSz9d^RjnNh zvt`zR1!)s~KEX|LM6-5Y&XAXSHOQH0xhTE+4YJAgj@bE8>ix-l4g}Z7Vvk40?TLh3 zCWB(EM@;N^(JYy~DeGoaW~TnNuk>_*RT@(JpXD}?UUqE|*tn2jqvb~=JGUaFLy=l9 z%=NVCdc2-G8H4Hpv%s3{JM_fg|6@EtwU_Iz6&b0`Y@fVx`Jb^rrhXiIFmY?@r(Yi4 z_<8c)waG8Ooc>{A^4@pT-~Kvv<@V&)S0~3m4>>8&GLKD<-7WHxj`XMUQjk2K>Jk`L za-%rVr@Wy@Wt5uL4A{PtGme?M$ZiQPFP%UOI-)jxHL_cHLaFgo!Ih_#E(tM<1xg?p z8Z&);Z2FtaOWg}mO0w(l<~lM0Mqeq>q5;R}%2Tzz0s?YjJKMtwwytbvbc4wGWqwt0 zKFGO}Gy7PMukcH97M$bFw;_JxO9eVO>fc~Lm*SWVH{cL^VGX(oornd(X9-rxwe{mj z^fv#F)h(@eu)Y%GXt>Gc5UMWNvW+6!u?9N=$Zet63?u>YDqbUWj61q;gpx-o9~WFk zp!_B-z0M79xHyJ4`EvX`go|$Ua6_#&^ew)m`LF>+FAdbjU8fyYoZG2iM{HL^>=vGz zz|ONRxA0OcpWE2g5!ZS*#CP36dnG#J4e@d8)5`OM<3=I@tsL9f%}Z=WJDRaOFrqWW zo;9K!C#bsiTRTn$M(DRboFZ17-Iq2jMuZLM#{gGObEo!gxN?Ro+UV7lgaH9SQ6R&o y0&g#N!aMVva5iuP-7avByC03(85KAmjPC~WTd2r;{Qtg-5AY#>D1L;F%>D<>SoXvK delta 276 zcmXYrNlpSm7=^#8?k0gYuxJxQOizfYID)gnE!=U8K7ih#Ptsvw;({F;60X7#gx3X& zdVjsC>fdyK+O5_9-vXF2ty;02d;Zdv>*n?=mDs?LXe!IOPN&`= zDoM_`%KVKQj`4-#CwLh{lff!hn^W|uqg&GMd^fSQRp4e#+A7pZXpA*?XI@!VnT#a8 z#IdW-T7z2|s^LvUlhd1PQ!OR+%H3|To~tx6#I52Nw6{f-|8|2r7?loJ{_<3dM@V!S zY~)UJq`SnkiIC3S8sjC`Q1c&~zgoqWMcUe;@eIasufb;S)5vaUYOP8_eohLeLJb&4=eP)I6ce%SwXqE^cjd6qHqT#b7sl}EU zRZ)=}zKC3n>OmzbR)FTlOyBHqQzE%2Ry3tZ!&BMR*cwTu;?j>l2iK1QJg0?cW)BIJ zUWD%8x-$UoK2NrDa%M>DT<0s&e4l&yf-iNxGWeQrI*$%xiLG}@tejdvm)zKGb>9sPiFfoAIHIP)m=H>HiG1#@ub);8FyGdIgS7G z$*%v8PsKZ}RXfcI{$T}A^<%&&o)+7Xc_iW)o|RGKId)-ZrQaZH~~d5rMmTUJ4*W`b8@11zxm-Z(|QHNr8QA;$>bD>G^Way(&J37!jRMoUufX_rtW zNc0~RLsNHUdV8=;M!Wb7A$4^yuZMf=?2~`H#Yt^DSYhSAEFCwH-=LRwt$BmP9FhEc z6;8jWm-oc#FJP}s9G16F>MwCev%Ko$$h@lB(tZXxLH`!}VLaVr^s%KZFSm;a@)VVH zd3;v-nbM}0#5 vr(Ga)gp{~Xd^SGegf)ITa9U5w|0#Kuz|Vxsw|vh}{45@?cz)pwzZ3WuoPWrj delta 1601 zcmb7@X>e0j6vuxzdC5!CN1CP-O&u7@2vgcRfzpu*Wht92We@u%0Rk4TcG zalCzJ;u?SV@y!>#6m&SgfK|pYSXSwvjYRS+rB9sL>^XKHBgW>y_SM_pL=*il+js!)<>ySZt)bB9Kg^ zYMU0fH`gz<)puCjNk2uNsBQo09jyslf0xDGda7CIz1QMCw&)dRy5!ze08M#~PQn#8d5U3B_3*^c8o`2=!LMPXc_(XC|Lpe8HEU>kAB}&go6zih^%! zI=;1di?>63uUM&D1DESF`31T;zq-(>Z)r)ijc$r3lL;aACq-Xf5WYmuFAN#y6}_Cx z#==PY2@Hzu7Uh|`D5nC&9+ACr?sarBp?~RwjDP4na`!k%B>(ZzA55Al{Aq&ecva-EA=Wf3F1+MQvIE!=ofxcQ=Ri!Iol z8rYpqqq}^g1W8v?$RKIDiW06Aeg;#?Ra7&C(F~=58e)uK1|#Lo*RqUpB&j1U`?5)_ zTbRHOS)1KVc3{^DvZR22fft1i!T2YBTY8Co4k>%s&jFc6kZp9PIViML(#Ff8G^B77 z8431qNWy!FTP|Ifq|4c|VmmChAnF2X6Vv2~DNB1)bbgmqLGs)692bsB%~$84mI!Cc z-Y!WgQ;^PGl1PA*A7R~`L)S707 z48Ii47j}x6NiSwm#%za&Dm%Blx7_q?$%bb?k8)1%n$)(X*Lfo?=>7EJByS3O8$&m@ z_#$42olwAD0g1GGo+r+3Ig84}Tir+Tcae9TtrIKCGCWwZPYf<+xVX+s>P;deMCY1ag0V(;>vg!(w`JYl<1iPNhP8ZPbPp-y(%(3O)t_sTC7fM-PK n;(g9K=Ldf+)`xQcNdEQ?d@Oap;%mO+2hjvX^CLg=3z0tnn$SOB