From cd9692147395e18e151e63d9f71449e3737d7afe Mon Sep 17 00:00:00 2001 From: liupopo Date: Fri, 17 Mar 2023 18:13:18 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B6=88=E6=81=AF=E6=8E=A8=E9=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/databases/tables_create.sql | 14 +- .../mallplus/unipush/UniPushService.java | 151 +++++++++++++++++- .../main/resources/application-dev.properties | 8 +- .../zscat/mallplus/ums/entity/SysMessage.java | 4 +- .../mallplus/unipush/entity/PushCids.java | 4 + .../com/zscat/mallplus/utils/PhoneUtil.java | 3 +- .../mallplus/single/SingelHomeController.java | 15 +- .../mallplus/unipush/PushCidsService.java | 16 +- .../main/resources/application-dev.properties | 3 +- .../src/main/resources/application.properties | 8 +- mallplusui-web-admin/config/dev.env.js | 4 +- mallplusui-web-admin/static/tz.png | Bin 0 -> 4680 bytes mallplusui-web-admin/static/tzf.png | Bin 0 -> 3434 bytes mallplusui-web-admin/static/tzy.png | Bin 0 -> 4680 bytes 14 files changed, 206 insertions(+), 24 deletions(-) create mode 100644 mallplusui-web-admin/static/tz.png create mode 100644 mallplusui-web-admin/static/tzf.png create mode 100644 mallplusui-web-admin/static/tzy.png diff --git a/docs/databases/tables_create.sql b/docs/databases/tables_create.sql index 29ef738..aee8aa8 100644 --- a/docs/databases/tables_create.sql +++ b/docs/databases/tables_create.sql @@ -29,4 +29,16 @@ CREATE TABLE `push_cids` ( `userPhone` varchar(100) DEFAULT NULL COMMENT '用户手机号', `userId` bigint(32) DEFAULT NULL COMMENT '用户ID', PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; \ No newline at end of file +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + + +CREATE TABLE `sys_message_task` ( + `id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `user_id` int(11) NOT NULL DEFAULT '1' COMMENT '用户id', + `code` varchar(60) DEFAULT '系统消息' COMMENT '消息编码', + `params` varchar(5000) DEFAULT NULL COMMENT '参数', + `content` text COMMENT '内容', + `sendtime` date NOT NULL COMMENT '发送时间', + `status` tinyint(3) unsigned NOT NULL DEFAULT '0' COMMENT '0未发送,1已发送', + PRIMARY KEY (`id`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='定时消息'; \ No newline at end of file diff --git a/mallplus-admin/src/main/java/com/zscat/mallplus/unipush/UniPushService.java b/mallplus-admin/src/main/java/com/zscat/mallplus/unipush/UniPushService.java index 4d4a8de..ca6ee2a 100644 --- a/mallplus-admin/src/main/java/com/zscat/mallplus/unipush/UniPushService.java +++ b/mallplus-admin/src/main/java/com/zscat/mallplus/unipush/UniPushService.java @@ -1,16 +1,22 @@ package com.zscat.mallplus.unipush; +import cn.hutool.json.JSONUtil; import com.getui.push.v2.sdk.ApiHelper; import com.getui.push.v2.sdk.GtApiConfiguration; import com.getui.push.v2.sdk.api.PushApi; import com.getui.push.v2.sdk.common.ApiResult; import com.getui.push.v2.sdk.dto.req.Audience; +import com.getui.push.v2.sdk.dto.req.AudienceDTO; import com.getui.push.v2.sdk.dto.req.message.PushDTO; import com.getui.push.v2.sdk.dto.req.message.PushMessage; import com.getui.push.v2.sdk.dto.req.message.android.GTNotification; +import com.getui.push.v2.sdk.dto.res.TaskIdDTO; +import com.zscat.mallplus.ums.entity.SysMessage; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; +import java.util.ArrayList; +import java.util.List; import java.util.Map; @Component @@ -130,9 +136,152 @@ public class UniPushService { } + public void testlist() { + String taskid = createMessageTaskaa(); + AudienceDTO pdto = new AudienceDTO(); + + Audience audience = new Audience(); + audience.addCid("89e286aee78d38faf748a690e603b1a3"); + audience.addCid("e4a96929cc5f40c886cb517853356bc2"); + + pdto.setAudience(audience); + pdto.setTaskid(taskid); + + ApiResult>> mapApiResult = singlePushApi().pushListByCid(pdto); + + System.out.println(mapApiResult); + } + + public String createMessageTaskaa() { + PushDTO pdto = new PushDTO<>(); + pdto.setGroupName("群发消息"); + + + PushMessage pushMessage = new PushMessage(); + + GTNotification notification = new GTNotification(); + notification.setTitle("测试Titleaa"); + notification.setBody("测试BodyXaa"); + + SysMessage msg = new SysMessage(); + msg.setId(11); + msg.setUserId(1); + msg.setCode("云链助手"); + msg.setParams("欢迎"); + msg.setContent("欢迎注册汇融云链~"); + msg.setCtime(System.currentTimeMillis()); + +// String payload = "{\"title\":\"lzh\",\"body\":\"liubody\",\"name\":\"hao\",\"userid\":101,\"msgtitle\":\"haha\"}"; + String payload = JSONUtil.toJsonStr(msg); + notification.setPayload(payload); + notification.setClickType("payload"); + + pushMessage.setNotification(notification); + + pdto.setPushMessage(pushMessage); + + ApiResult msgg = this.singlePushApi().createMsg(pdto); + System.out.println(msgg); + return msgg.getData().getTaskId(); + } + public static void main(String[] args) { - new UniPushService().test(); + List clist = new ArrayList<>(); + clist.add("079fb42d1f4f824a3defd471a432d0fe"); + clist.add("89e286aee78d38faf748a690e603b1a3"); + + SysMessage msg = new SysMessage(); + msg.setId(11); + msg.setUserId(1); + msg.setCode("交易物流"); + msg.setParams("ABC"); + msg.setContent("欢迎注册汇融云链~"); + msg.setCtime(System.currentTimeMillis()); + new UniPushService().sendPush(msg, clist); +// new UniPushService().testlist(); + } + + private static String imgUrltx = "http://mall.yyundong.com/tx.png"; + private static String imgUrltz = "http://mall.yyundong.com/tz.png"; + private static String imgUrlwl = "http://mall.yyundong.com/wl.png"; + + public void sendPush(SysMessage mess, List cids) { + String code = mess.getCode(); + if ("系统消息".equals(code)) { + sendTzMsg(mess); + } else { + sendUserMsg(mess, cids); + } + } + private void sendUserMsg(SysMessage mess, List cids) { + + if (cids == null || cids.isEmpty()) + return; + + String taskid = createMessageTask(mess); + AudienceDTO pdto = new AudienceDTO(); + + Audience audience = new Audience(); + cids.forEach(cid -> audience.addCid(cid)); + + pdto.setAudience(audience); + pdto.setTaskid(taskid); + + ApiResult>> mapApiResult = singlePushApi().pushListByCid(pdto); + + } + + private void sendTzMsg(SysMessage mess) { + + PushDTO pd = new PushDTO<>(); + pd.setRequestId("all" + System.currentTimeMillis()); + pd.setGroupName("system_notice"); + pd.setAudience("all"); + + pd.setPushMessage(createPushMessage(mess)); + + ApiResult taskIdDTOApiResult = singlePushApi().pushAll(pd); +// System.out.println(taskIdDTOApiResult); + } + + private PushMessage createPushMessage(SysMessage mess) { + + String code = mess.getCode(); + PushMessage pushMessage = new PushMessage(); + + GTNotification notification = new GTNotification(); +// notification.setTitle(code); +// notification.setBody(mess.getParams()); + notification.setTitle(mess.getParams()); + notification.setBody(mess.getContent()); + if ("交易物流".equals(code)) { + notification.setLogoUrl(imgUrlwl); + } else if ("云链助手".equals(code)) { + notification.setLogoUrl(imgUrltx); + } else { + notification.setLogoUrl(imgUrltz); + } + String payload = JSONUtil.toJsonStr(mess); + notification.setPayload(payload); + notification.setClickType("payload"); +// notification.setClickType("payload_custom"); + + pushMessage.setNotification(notification); + + return pushMessage; + } + + private String createMessageTask(SysMessage mess) { + PushDTO pdto = new PushDTO<>(); + pdto.setGroupName("tolist"); + + pdto.setPushMessage(createPushMessage(mess)); + + ApiResult result = this.singlePushApi().createMsg(pdto); +// System.out.println(msgg); + return result.getData().getTaskId(); + } } diff --git a/mallplus-admin/src/main/resources/application-dev.properties b/mallplus-admin/src/main/resources/application-dev.properties index 7f32296..225d647 100644 --- a/mallplus-admin/src/main/resources/application-dev.properties +++ b/mallplus-admin/src/main/resources/application-dev.properties @@ -18,11 +18,11 @@ spring.redis.pool.min-idle=0 # \u8FDE\u63A5\u8D85\u65F6\u65F6\u95F4\uFF08\u6BEB\u79D2\uFF09 spring.redis.timeout=0 #===redis end=== -spring.datasource.url=jdbc:mysql://8.130.39.13:3306/mallplus1?autoReconnect=true&useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&useSSL=false&useTimezone=true&serverTimezone=GMT%2B8 -#spring.datasource.url=jdbc:mysql://127.0.0.1:3306/mallplus1?autoReconnect=true&useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&useSSL=false&useTimezone=true&serverTimezone=GMT%2B8 +#spring.datasource.url=jdbc:mysql://8.130.39.13:3306/mallplus1?autoReconnect=true&useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&useSSL=false&useTimezone=true&serverTimezone=GMT%2B8 +spring.datasource.url=jdbc:mysql://127.0.0.1:3306/mallplus1?autoReconnect=true&useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&useSSL=false&useTimezone=true&serverTimezone=GMT%2B8 spring.datasource.username=root -#spring.datasource.password=root -spring.datasource.password=1LAiGz$t1*Iw +spring.datasource.password=root +#spring.datasource.password=1LAiGz$t1*Iw spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver spring.datasource.type=com.alibaba.druid.pool.DruidDataSource spring.datasource.druid.initialSize=5 diff --git a/mallplus-mbg/src/main/java/com/zscat/mallplus/ums/entity/SysMessage.java b/mallplus-mbg/src/main/java/com/zscat/mallplus/ums/entity/SysMessage.java index cdd8cdf..1884a60 100644 --- a/mallplus-mbg/src/main/java/com/zscat/mallplus/ums/entity/SysMessage.java +++ b/mallplus-mbg/src/main/java/com/zscat/mallplus/ums/entity/SysMessage.java @@ -64,7 +64,7 @@ public class SysMessage implements Serializable { public String getCdate() { String cdate = ""; if (ctime != null && ctime > 0) { - cdate = DateUtil.format(new Date(ctime), "yyyy-MM-dd"); + cdate = DateUtil.format(new Date(ctime), "yyyy-MM-dd hh:mm:ss"); } return cdate; } @@ -72,7 +72,7 @@ public class SysMessage implements Serializable { public String getUdate() { String udate = ""; if (utime != null && utime > 0) { - udate = DateUtil.format(new Date(utime), "yyyy-MM-dd"); + udate = DateUtil.format(new Date(utime), "yyyy-MM-dd hh:mm:ss"); } return udate; } diff --git a/mallplus-mbg/src/main/java/com/zscat/mallplus/unipush/entity/PushCids.java b/mallplus-mbg/src/main/java/com/zscat/mallplus/unipush/entity/PushCids.java index 69ecf06..9fedf0d 100644 --- a/mallplus-mbg/src/main/java/com/zscat/mallplus/unipush/entity/PushCids.java +++ b/mallplus-mbg/src/main/java/com/zscat/mallplus/unipush/entity/PushCids.java @@ -26,6 +26,7 @@ package com.zscat.mallplus.unipush.entity; import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; @@ -66,7 +67,10 @@ public class PushCids implements Serializable { @TableId(value = "id", type = IdType.AUTO) private Long id; + @TableField("getuiCid") private String getuiCid;// 个推的ClientID + @TableField("userPhone") private String userPhone;// 用户手机号 + @TableField("userId") private Long userId;// 用户ID } diff --git a/mallplus-mbg/src/main/java/com/zscat/mallplus/utils/PhoneUtil.java b/mallplus-mbg/src/main/java/com/zscat/mallplus/utils/PhoneUtil.java index 30cf3f9..186aa3f 100644 --- a/mallplus-mbg/src/main/java/com/zscat/mallplus/utils/PhoneUtil.java +++ b/mallplus-mbg/src/main/java/com/zscat/mallplus/utils/PhoneUtil.java @@ -10,7 +10,8 @@ import java.util.regex.Pattern; */ public class PhoneUtil { - private static String REGEX = "^((13[0-9])|(14[5|7])|(15([0-3]|[5-9]))|(17[013678])|(18[0,5-9]))\\d{8}$"; + private static String REGEX = "^(1[3-9])\\d{9}$"; +// private static String REGEX = "^((13[0-9])|(14[0-9])|(15([0-9]|[5-9]))|(17[013678])|(18[0,5-9]))\\d{8}$"; private static Pattern P = Pattern.compile(REGEX); /** diff --git a/mallplus-portal/src/main/java/com/zscat/mallplus/single/SingelHomeController.java b/mallplus-portal/src/main/java/com/zscat/mallplus/single/SingelHomeController.java index b35466e..4683598 100644 --- a/mallplus-portal/src/main/java/com/zscat/mallplus/single/SingelHomeController.java +++ b/mallplus-portal/src/main/java/com/zscat/mallplus/single/SingelHomeController.java @@ -368,7 +368,7 @@ public class SingelHomeController { log.info("用户名或密码错误"); return new CommonResult().failed("用户名或密码错误"); } - if (StringUtils.isNotBlank(cid) && StringUtils.isNotBlank(phone)) { + if (StringUtils.isNotBlank(cid) && StringUtils.isNotBlank(phone) && !"null".equals(cid)) { ThreadUtil.execute(() -> pushCidsService.bindPhone(cid, phone)); } return new CommonResult().success(token); @@ -399,7 +399,7 @@ public class SingelHomeController { if (token.get("token") == null) { return new CommonResult().validateFailed("用户名或密码错误"); } - if (StringUtils.isNotBlank(cid) && StringUtils.isNotBlank(phone)) { + if (StringUtils.isNotBlank(cid) && StringUtils.isNotBlank(phone) && !"null".equals(cid)) { ThreadUtil.execute(() -> pushCidsService.bindPhone(cid, phone)); } return new CommonResult().success(token); @@ -470,6 +470,12 @@ public class SingelHomeController { if (StringUtils.isBlank(type)) { return new CommonResult().failed("参数错误:type"); } + + UmsMember byUsername = memberService.getByUsername(phone); + if (byUsername == null) { + return new CommonResult().failed("该手机号未注册!"); + } + //缓存识别码 String redisKey = ""; if (SmsEnum.SendEnum.LOGIN.getCode().equals(type)) { @@ -616,8 +622,9 @@ public class SingelHomeController { @ApiOperation(value = "登出功能") @RequestMapping(value = "/logout", method = RequestMethod.POST) @ResponseBody - public Object logout() { + public Object logout(@RequestParam("cid") String cid) { SecurityContextHolder.getContext().setAuthentication(null); + ThreadUtil.execute(() -> pushCidsService.unbindPhone(cid)); return new CommonResult().success(null); } @@ -629,6 +636,6 @@ public class SingelHomeController { if (StringUtils.isNotBlank(cid)) { ThreadUtil.execute(() -> pushCidsService.pushCid(cid)); } - return new CommonResult().success(); + return new CommonResult().success("OK"); } } diff --git a/mallplus-portal/src/main/java/com/zscat/mallplus/unipush/PushCidsService.java b/mallplus-portal/src/main/java/com/zscat/mallplus/unipush/PushCidsService.java index 568ac0c..d8bf718 100644 --- a/mallplus-portal/src/main/java/com/zscat/mallplus/unipush/PushCidsService.java +++ b/mallplus-portal/src/main/java/com/zscat/mallplus/unipush/PushCidsService.java @@ -25,6 +25,7 @@ *********************************************************/ package com.zscat.mallplus.unipush; +import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; @@ -69,10 +70,8 @@ public class PushCidsService extends ServiceImpl { if (list != null && list.size() == 1) { // 只有一条cid数据,判断是否和手机号相同 PushCids pc = list.get(0); if (!phone.equals(pc.getUserPhone())) { // 手机号不同或为空,更新手机号 - UpdateWrapper uw = new UpdateWrapper<>(); - uw.set("userPhone", phone); - uw.eq("getuiCid", cid); - baseMapper.update(null, uw); + pc.setUserPhone(phone); + baseMapper.updateById(pc); } return; } @@ -91,4 +90,13 @@ public class PushCidsService extends ServiceImpl { uw.eq("getuiCid", cid); baseMapper.delete(uw); } + + public void unbindPhone(String cid) { + if (StrUtil.isBlank(cid)) + return; + UpdateWrapper uw = new UpdateWrapper<>(); + uw.set("userPhone", ""); + uw.eq("getuiCid", cid); + baseMapper.update(null, uw); + } } diff --git a/mallplus-portal/src/main/resources/application-dev.properties b/mallplus-portal/src/main/resources/application-dev.properties index 74d8c60..763a2a7 100644 --- a/mallplus-portal/src/main/resources/application-dev.properties +++ b/mallplus-portal/src/main/resources/application-dev.properties @@ -44,7 +44,8 @@ spring.redis.host=127.0.0.1 # Redis\u670D\u52A1\u5668\u8FDE\u63A5\u7AEF\u53E3 spring.redis.port=6379 # Redis\u670D\u52A1\u5668\u8FDE\u63A5\u5BC6\u7801\uFF08\u9ED8\u8BA4\u4E3A\u7A7A\uFF09 -spring.redis.password=123456 +spring.redis.password= +#spring.redis.password=123456 # \u8FDE\u63A5\u6C60\u6700\u5927\u8FDE\u63A5\u6570\uFF08\u4F7F\u7528\u8D1F\u503C\u8868\u793A\u6CA1\u6709\u9650\u5236\uFF09 spring.redis.pool.max-active=8 # \u8FDE\u63A5\u6C60\u6700\u5927\u963B\u585E\u7B49\u5F85\u65F6\u95F4\uFF08\u4F7F\u7528\u8D1F\u503C\u8868\u793A\u6CA1\u6709\u9650\u5236\uFF09 diff --git a/mallplus-portal/src/main/resources/application.properties b/mallplus-portal/src/main/resources/application.properties index 7c28e74..e2058c6 100644 --- a/mallplus-portal/src/main/resources/application.properties +++ b/mallplus-portal/src/main/resources/application.properties @@ -53,10 +53,10 @@ oss.aliyun.first.bucketName=yxt-sc oss.aliyun.first.endPoint=oss-cn-huhehaote.aliyuncs.com oss.aliyun.first.styleName= oss.aliyun.first.prefix=web -oss.aliyun.second.accessKeyId=\u02A1\uFFFD\uFFFD... -oss.aliyun.second.accessKeySecret=\u02A1\uFFFD\uFFFD... -oss.aliyun.second.accessKeyId=\u7701\u951F\u65A4\u62F7... -oss.aliyun.second.accessKeySecret=\u7701\u951F\u65A4\u62F7... +#oss.aliyun.second.accessKeyId=\u02A1\uFFFD\uFFFD... +#oss.aliyun.second.accessKeySecret=\u02A1\uFFFD\uFFFD... +#oss.aliyun.second.accessKeyId=\u7701\u951F\u65A4\u62F7... +#oss.aliyun.second.accessKeySecret=\u7701\u951F\u65A4\u62F7... oss.aliyun.second.bucketName=peterjava oss.aliyun.second.endPoint=oss-cn-huhehaote.aliyuncs.com oss.aliyun.second.styleName= diff --git a/mallplusui-web-admin/config/dev.env.js b/mallplusui-web-admin/config/dev.env.js index 9253274..1fbcfe6 100644 --- a/mallplusui-web-admin/config/dev.env.js +++ b/mallplusui-web-admin/config/dev.env.js @@ -4,7 +4,7 @@ const prodEnv = require('./prod.env') module.exports = merge(prodEnv, { NODE_ENV: '"development"', - BASE_API: '"http://mall.yyundong.com/adminapi"', + // BASE_API: '"http://mall.yyundong.com/adminapi"', // BASE_API: '"http://192.168.3.9:8085"' - // BASE_API: '"http://127.0.0.1:8085"' + BASE_API: '"http://127.0.0.1:8085"' }) diff --git a/mallplusui-web-admin/static/tz.png b/mallplusui-web-admin/static/tz.png new file mode 100644 index 0000000000000000000000000000000000000000..747a34032b4bf346eae9bd912c324748a6d7c698 GIT binary patch literal 4680 zcmV-O61VM%P)Px{0!c(cRCr$Poei*@Re8sM&t5_xsFgSa^uvx0=ooFa9a>D@bZv3>1QaXn_>0rQ&7U;9xsgf)$%sA&}fX zopbih&3*TMclVrk&w2MFduHz3J9E!@&htFy|DMn1Lm0uLwy=;xEaEs`MT12Mi)gSA zVF9qf{8pS~{%)3M5PpW@8S}UPUE*mJ)0CLzFpn~iX<5V5qoytyc7fE5%;!YTqQM0S z7ok`LoEk{3eF)Pi?xw^po@I|*!E=H7DunD%0zgf%loDqFX9K?toKT3i(w!Uxb^;I3 zV2@04N1yn}-R;l-K-F1JgXIXzfirST9Jb+J6gw!fL(1$3+m#>c0}X&78T57|F%)1J zNC2oBzYAOrEc1i&zEim!*eVe>_nng#1_lZMs>({l4E&NoQVDp1Ai65iTx6OAo^82i*OCFNg@sv%~Rn3P*pCWWCs77qJtw=r# z1%R63YD#>pNCAhguLc`rlB;)itPwjO2lKK

S{RcD16 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 KMNUMnLSTYgO{Pl# literal 0 HcmV?d00001 diff --git a/mallplusui-web-admin/static/tzf.png b/mallplusui-web-admin/static/tzf.png new file mode 100644 index 0000000000000000000000000000000000000000..31b93a4ffc808b4319115ad956d43e88d9b2b1cf GIT binary patch literal 3434 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 M&rG*M$N9m30I|SR00000 literal 0 HcmV?d00001 diff --git a/mallplusui-web-admin/static/tzy.png b/mallplusui-web-admin/static/tzy.png new file mode 100644 index 0000000000000000000000000000000000000000..747a34032b4bf346eae9bd912c324748a6d7c698 GIT binary patch literal 4680 zcmV-O61VM%P)Px{0!c(cRCr$Poei*@Re8sM&t5_xsFgSa^uvx0=ooFa9a>D@bZv3>1QaXn_>0rQ&7U;9xsgf)$%sA&}fX zopbih&3*TMclVrk&w2MFduHz3J9E!@&htFy|DMn1Lm0uLwy=;xEaEs`MT12Mi)gSA zVF9qf{8pS~{%)3M5PpW@8S}UPUE*mJ)0CLzFpn~iX<5V5qoytyc7fE5%;!YTqQM0S z7ok`LoEk{3eF)Pi?xw^po@I|*!E=H7DunD%0zgf%loDqFX9K?toKT3i(w!Uxb^;I3 zV2@04N1yn}-R;l-K-F1JgXIXzfirST9Jb+J6gw!fL(1$3+m#>c0}X&78T57|F%)1J zNC2oBzYAOrEc1i&zEim!*eVe>_nng#1_lZMs>({l4E&NoQVDp1Ai65iTx6OAo^82i*OCFNg@sv%~Rn3P*pCWWCs77qJtw=r# z1%R63YD#>pNCAhguLc`rlB;)itPwjO2lKK

S{RcD16 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 KMNUMnLSTYgO{Pl# literal 0 HcmV?d00001