From 53af2dd84ef1d243c18a83564d7c315a4b45f4e4 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E9=99=86=E4=BA=9A=E7=8B=AE?= <2696699791@qq.com>
Date: Mon, 7 Apr 2025 09:30:11 +0800
Subject: [PATCH] init
---
App.vue | 63 +++
api/api.js | 37 ++
api/env.js | 11 +
components/appUpdate/appUpdate.js | 790 ++++++++++++++++++++++++++++
components/daySelect/index.vue | 117 ++++
config/config.js | 17 +
index.html | 20 +
main.js | 47 ++
manifest.json | 91 ++++
package.json | 20 +
pages.json | 222 ++++++++
pages/detail.vue | 155 ++++++
pages/form.vue | 205 ++++++++
pages/index/cleanDetails.vue | 116 ++++
pages/index/cleanPlan.vue | 224 ++++++++
pages/index/index.vue | 173 ++++++
pages/index/list.vue | 170 ++++++
pages/index/planList.vue | 90 ++++
pages/my/about/feedback.vue | 73 +++
pages/my/about/index.vue | 69 +++
pages/my/account/email.vue | 116 ++++
pages/my/account/index.vue | 89 ++++
pages/my/account/logout_account.vue | 82 +++
pages/my/account/password.vue | 73 +++
pages/my/account/phone.vue | 120 +++++
pages/my/account/setting.vue | 38 ++
pages/my/auth.vue | 108 ++++
pages/my/index.vue | 172 ++++++
pages/my/profile.vue | 70 +++
pages/public/forget_password.vue | 130 +++++
pages/public/login.vue | 120 +++++
pages/public/page.vue | 49 ++
pages/public/register.vue | 179 +++++++
pages/subPack/index/detail.vue | 136 +++++
pages/tab_list.vue | 73 +++
pages/templates.vue | 31 ++
pages/─ú░σ─┐┬╝.txt | 1 +
readme.md | 131 +++++
static/images/area-bg.png | Bin 0 -> 54667 bytes
static/images/list.png | Bin 0 -> 6703 bytes
static/images/list_cur.png | Bin 0 -> 6621 bytes
static/images/login_bg.png | Bin 0 -> 5798 bytes
static/images/logo.png | Bin 0 -> 8793 bytes
static/images/plan-bg.png | Bin 0 -> 24831 bytes
static/images/plan-icon-bg.png | Bin 0 -> 76794 bytes
static/images/pos-icon.png | Bin 0 -> 1841 bytes
static/images/update.png | Bin 0 -> 31432 bytes
static/logo.png | Bin 0 -> 92756 bytes
static/tab/home.png | Bin 0 -> 374 bytes
static/tab/home_cur.png | Bin 0 -> 403 bytes
static/tab/list.png | Bin 0 -> 386 bytes
static/tab/list_cur.png | Bin 0 -> 399 bytes
static/tab/my.png | Bin 0 -> 466 bytes
static/tab/my_cur.png | Bin 0 -> 477 bytes
store/$u.mixin.js | 27 +
store/index.js | 64 +++
uni.scss | 76 +++
utils/common.js | 88 ++++
utils/interceptor.js | 50 ++
utils/request.js | 62 +++
utils/requestManager.js | 66 +++
utils/utils.js | 475 +++++++++++++++++
62 files changed, 5336 insertions(+)
create mode 100644 App.vue
create mode 100644 api/api.js
create mode 100644 api/env.js
create mode 100644 components/appUpdate/appUpdate.js
create mode 100644 components/daySelect/index.vue
create mode 100644 config/config.js
create mode 100644 index.html
create mode 100644 main.js
create mode 100644 manifest.json
create mode 100644 package.json
create mode 100644 pages.json
create mode 100644 pages/detail.vue
create mode 100644 pages/form.vue
create mode 100644 pages/index/cleanDetails.vue
create mode 100644 pages/index/cleanPlan.vue
create mode 100644 pages/index/index.vue
create mode 100644 pages/index/list.vue
create mode 100644 pages/index/planList.vue
create mode 100644 pages/my/about/feedback.vue
create mode 100644 pages/my/about/index.vue
create mode 100644 pages/my/account/email.vue
create mode 100644 pages/my/account/index.vue
create mode 100644 pages/my/account/logout_account.vue
create mode 100644 pages/my/account/password.vue
create mode 100644 pages/my/account/phone.vue
create mode 100644 pages/my/account/setting.vue
create mode 100644 pages/my/auth.vue
create mode 100644 pages/my/index.vue
create mode 100644 pages/my/profile.vue
create mode 100644 pages/public/forget_password.vue
create mode 100644 pages/public/login.vue
create mode 100644 pages/public/page.vue
create mode 100644 pages/public/register.vue
create mode 100644 pages/subPack/index/detail.vue
create mode 100644 pages/tab_list.vue
create mode 100644 pages/templates.vue
create mode 100644 pages/─ú░σ─┐┬╝.txt
create mode 100644 readme.md
create mode 100644 static/images/area-bg.png
create mode 100644 static/images/list.png
create mode 100644 static/images/list_cur.png
create mode 100644 static/images/login_bg.png
create mode 100644 static/images/logo.png
create mode 100644 static/images/plan-bg.png
create mode 100644 static/images/plan-icon-bg.png
create mode 100644 static/images/pos-icon.png
create mode 100644 static/images/update.png
create mode 100644 static/logo.png
create mode 100644 static/tab/home.png
create mode 100644 static/tab/home_cur.png
create mode 100644 static/tab/list.png
create mode 100644 static/tab/list_cur.png
create mode 100644 static/tab/my.png
create mode 100644 static/tab/my_cur.png
create mode 100644 store/$u.mixin.js
create mode 100644 store/index.js
create mode 100644 uni.scss
create mode 100644 utils/common.js
create mode 100644 utils/interceptor.js
create mode 100644 utils/request.js
create mode 100644 utils/requestManager.js
create mode 100644 utils/utils.js
diff --git a/App.vue b/App.vue
new file mode 100644
index 0000000..f21e65c
--- /dev/null
+++ b/App.vue
@@ -0,0 +1,63 @@
+
+
diff --git a/api/api.js b/api/api.js
new file mode 100644
index 0000000..f1bd11f
--- /dev/null
+++ b/api/api.js
@@ -0,0 +1,37 @@
+import request from '@/utils/request'
+//使用说明
+// export const getList = data => request.get('/api/list', data, false)
+// 页面调用名 请求参数 请求类型 接口地址 loading是否显示
+/*页面中调用方法:(若无请求参数则留空,例:this.$api.getList())
+this.$api.getList(params).then(res => {
+
+})
+*/
+//列表
+export const getList = data => request.get('/api/list', data)
+//登陆
+export const login = data => request.post('/api/login', data)
+//注册
+export const register = data => request.post('/api/register', data)
+//忘记密码
+export const forgetPassWord = data => request.post('/api/forgetPassWord', data)
+//登陆用户信息
+export const baseInfo = data => request.get('/api/baseinfo', data)
+//检测版本升级
+export const checkVersion = data => request.post('/api/checkVersion2', data,false)
+//文章详情
+export const detail = data => request.get('/api/detail', data,false)
+//获取单页内容
+export const page = data => request.get('/api/page', data)
+//提交实名认证资料
+export const auth = data => request.post('/api/auth', data)
+//修改密码
+export const password = data => request.post('/api/password', data)
+//注销帐号
+export const logout_account = data => request.post('/api/logout_account', data)
+//修改手机号
+export const phoneBind = data => request.get('/api/phoneBind', data)
+//修改邮箱
+export const emailBind = data => request.get('/api/emailBind', data)
+//提交反馈
+export const feedback = data => request.post('/api/feedback', data)
diff --git a/api/env.js b/api/env.js
new file mode 100644
index 0000000..d256ed8
--- /dev/null
+++ b/api/env.js
@@ -0,0 +1,11 @@
+let BASE_URL
+//开发环境中
+if (process.env.NODE_ENV === 'development') {
+ // 开发环境
+ BASE_URL = 'https://mock.apifox.cn/m1/3553664-0-default' //开发环境请求地址
+} else {
+ // 生产环境
+ BASE_URL = 'https://mock.apifox.cn/m1/3553664-0-default' //生成环境请求地址
+}
+
+export default BASE_URL
\ No newline at end of file
diff --git a/components/appUpdate/appUpdate.js b/components/appUpdate/appUpdate.js
new file mode 100644
index 0000000..0bbbf94
--- /dev/null
+++ b/components/appUpdate/appUpdate.js
@@ -0,0 +1,790 @@
+export default function(updateInfo) {
+ updateInfo.platform = updateInfo.platform ? updateInfo.platform : 'android'
+ updateInfo.mainColor = updateInfo.mainColor ? updateInfo.mainColor : 'FF5B78'
+ if (updateInfo.platform == 'android' || updateInfo.platform == 'ios') {
+
+ } else {
+ return false
+ }
+ let maskLayer = new plus.nativeObj.View('maskLayer', {
+ top: '0px',
+ left: '0px',
+ height: '100%',
+ width: '100%',
+ backgroundColor: 'rgba(0,0,0,0.5)'
+ })
+ let screenWidth = plus.screen.resolutionWidth
+ let screenHeight = plus.screen.resolutionHeight
+ const popupViewWidth = screenWidth * 0.7
+ const viewContentPadding = 20
+ const viewContentWidth = parseInt(popupViewWidth - (viewContentPadding * 2))
+ const descriptionList = drawtext((updateInfo.updateContent || '发现新版本'), viewContentWidth)
+ let popupViewHeight = 80 + 20 + 20 + 90 + 50
+ let popupViewContentList = [{
+ src: '/static/images/update.png',
+ id: "logo",
+ tag: "img",
+ position: {
+ top: "0px",
+ left: (popupViewWidth - 124) / 2 + "px",
+ width: "124px",
+ height: "80px",
+ }
+ },
+ {
+ tag: 'font',
+ id: 'title',
+ text: "发现新版本 " + (updateInfo.version || ''),
+ textStyles: {
+ size: '18px',
+ color: "#333",
+ weight: "bold",
+ whiteSpace: "normal"
+ },
+ position: {
+ top: '90px',
+ left: viewContentPadding + "px",
+ width: viewContentWidth + "px",
+ height: "30px",
+ }
+ }
+ ]
+ const textHeight = 18
+ let contentTop = 130
+ descriptionList.forEach((item, index) => {
+ if (index > 0) {
+ popupViewHeight += textHeight;
+ contentTop += textHeight;
+ }
+ popupViewContentList.push({
+ tag: 'font',
+ id: 'content' + index + 1,
+ text: item.content,
+ textStyles: {
+ size: '14px',
+ color: "#666",
+ lineSpacing: "50%",
+ align: "left"
+ },
+ position: {
+ top: contentTop + "px",
+ left: viewContentPadding + "px",
+ width: viewContentWidth + "px",
+ height: textHeight + "px",
+ }
+ });
+ if (item.type == "break") {
+ contentTop += 10;
+ popupViewHeight += 10;
+ }
+ })
+ if (updateInfo.force) {
+ popupViewContentList.push({
+ tag: 'rect', //绘制底边按钮
+ rectStyles: {
+ radius: "6px",
+ color: updateInfo.mainColor
+ },
+ position: {
+ bottom: viewContentPadding + 'px',
+ left: viewContentPadding + "px",
+ width: viewContentWidth + "px",
+ height: "40px"
+ }
+ })
+ popupViewContentList.push({
+ tag: 'font',
+ id: 'confirmText',
+ text: "立即升级",
+ textStyles: {
+ size: '16px',
+ color: "#FFF",
+ lineSpacing: "0%",
+ },
+ position: {
+ bottom: viewContentPadding + 'px',
+ left: viewContentPadding + "px",
+ width: viewContentWidth + "px",
+ height: "40px"
+ }
+ })
+ } else {
+ popupViewContentList.push({
+ tag: 'rect',
+ id: 'cancelBox',
+ rectStyles: {
+ radius: "3px",
+ borderColor: "#f1f1f1",
+ borderWidth: "1px",
+ },
+ position: {
+ bottom: viewContentPadding + 'px',
+ left: viewContentPadding + "px",
+ width: (viewContentWidth - viewContentPadding) / 2 + "px",
+ height: "40px",
+ }
+ })
+ popupViewContentList.push({
+ tag: 'rect',
+ id: 'confirmBox',
+ rectStyles: {
+ radius: "3px",
+ color: updateInfo.mainColor,
+ },
+ position: {
+ bottom: viewContentPadding + 'px',
+ left: ((viewContentWidth - viewContentPadding) / 2 + viewContentPadding * 2) + "px",
+ width: (viewContentWidth - viewContentPadding) / 2 + "px",
+ height: "40px",
+ }
+ })
+ popupViewContentList.push({
+ tag: 'font',
+ id: 'cancelText',
+ text: "暂不升级",
+ textStyles: {
+ size: '16px',
+ color: "#666",
+ lineSpacing: "0%",
+ whiteSpace: "normal"
+ },
+ position: {
+ bottom: viewContentPadding + 'px',
+ left: viewContentPadding + "px",
+ width: (viewContentWidth - viewContentPadding) / 2 + "px",
+ height: "40px",
+ }
+ })
+ popupViewContentList.push({
+ tag: 'font',
+ id: 'confirmText',
+ text: "立即升级",
+ textStyles: {
+ size: '16px',
+ color: "#FFF",
+ lineSpacing: "0%",
+ whiteSpace: "normal"
+ },
+ position: {
+ bottom: viewContentPadding + 'px',
+ left: ((viewContentWidth - viewContentPadding) / 2 + viewContentPadding * 2) + "px",
+ width: (viewContentWidth - viewContentPadding) / 2 + "px",
+ height: "40px",
+ }
+ })
+ }
+ let popupView = new plus.nativeObj.View("popupView", { //创建底部图标菜单
+ tag: "rect",
+ top: (screenHeight - popupViewHeight) / 2 + "px",
+ left: '15%',
+ height: popupViewHeight + "px",
+ width: "70%"
+ })
+ popupView.drawRect({
+ color: "#FFFFFF",
+ radius: "8px"
+ }, {
+ top: "40px",
+ height: popupViewHeight - 40 + "px",
+ })
+ popupView.draw(popupViewContentList)
+ popupView.addEventListener("click", e => {
+ let maxTop = popupViewHeight - viewContentPadding
+ let maxLeft = popupViewWidth - viewContentPadding
+ let buttonWidth = (viewContentWidth - viewContentPadding) / 2
+ if (e.clientY > maxTop - 30 && e.clientY < maxTop) {
+ if (updateInfo.force) {
+ if (e.clientX > viewContentPadding && e.clientX < maxLeft) {
+ maskLayer.hide()
+ popupView.hide()
+ let platform = updateInfo.platform || 'android'
+ let downUrl = updateInfo.downUrl || ''
+ download(updateInfo)
+ }
+ } else {
+ let maxTop = popupViewHeight - viewContentPadding;
+ let maxLeft = popupViewWidth - viewContentPadding;
+ let buttonWidth = (viewContentWidth - viewContentPadding) / 2;
+ if (e.clientY > maxTop - 30 && e.clientY < maxTop) {
+ // 暂不升级
+ if (e.clientX > viewContentPadding && e.clientX < maxLeft - buttonWidth -
+ viewContentPadding) {
+ maskLayer.hide()
+ popupView.hide()
+ }
+ if (e.clientX > maxLeft - buttonWidth && e.clientX < maxLeft) {
+ // 立即升级
+ maskLayer.hide()
+ popupView.hide()
+ let platform = updateInfo.platform || 'android'
+ let downUrl = updateInfo.downUrl || ''
+ download(updateInfo)
+ }
+ }
+ }
+ }
+ })
+ // 点击遮罩层
+ maskLayer.addEventListener("click", function() { //处理遮罩层点击
+ // maskLayer.hide();
+ // popupView.hide();
+ })
+ // 显示弹窗
+ maskLayer.show()
+ popupView.show()
+}
+
+// 下载流程
+function download(updateInfo) {
+ let platform = updateInfo.platform || 'android'
+ if (updateInfo.downUrl) {
+ if (platform == 'ios') {
+ plus.runtime.openURL(updateInfo.downUrl)
+ }
+ if (platform == 'android') {
+ getDownload(updateInfo)
+ }
+ } else {
+ plus.nativeUI.alert('下载地址无效')
+ }
+}
+
+// 从服务器下载应用资源包(wgt文件)
+const getDownload = function(data) {
+ let dtask
+ let popupData = {
+ progress: true,
+ buttonNum: 2
+ };
+ if(data.force){
+ popupData.buttonNum = 0
+ }
+
+ let lastProgressValue = 0
+ let popupObj = downloadPopup(popupData, data.mainColor)
+
+ dtask = plus.downloader.createDownload(data.downUrl, {
+ filename: "_doc/update/"
+ }, function(download, status) {
+ if (status == 200) {
+ popupObj.change({
+ progressValue: 100,
+ progressTip:"正在安装文件...",
+ progress: true,
+ buttonNum: 0
+ })
+ plus.runtime.install(download.filename, {}, function() {
+ popupObj.change({
+ contentText: "应用资源更新完成!",
+ buttonNum: 1,
+ progress: false
+ });
+ }, function(e) {
+ popupObj.cancel()
+ plus.nativeUI.alert("安装文件失败[" + e.code + "]:" + e.message);
+ });
+ } else {
+ popupObj.change({
+ contentText: "文件下载失败...",
+ buttonNum: 1,
+ progress: false
+ });
+ }
+ });
+ dtask.start()
+ dtask.addEventListener("statechanged", function(task, status) {
+ switch (task.state) {
+ case 1: // 开始
+ popupObj.change({
+ progressValue:0,
+ progressTip:"准备下载...",
+ progress: true
+ });
+ break;
+ case 2: // 已连接到服务器
+ popupObj.change({
+ progressValue:0,
+ progressTip:"开始下载...",
+ progress: true
+ });
+ break;
+ case 3:
+ const progress = parseInt(task.downloadedSize / task.totalSize * 100);
+ if(progress - lastProgressValue >= 2){
+ lastProgressValue = progress;
+ popupObj.change({
+ progressValue:progress,
+ progressTip: "已下载" + progress + "%",
+ progress: true
+ });
+ }
+ break;
+ }
+ })
+ // 取消下载
+ popupObj.cancelDownload = function(){
+ dtask && dtask.abort()
+ uni.showToast({
+ title: "已取消下载",
+ icon:"none"
+ });
+ }
+ // 重启APP
+ popupObj.reboot = function(){
+ plus.runtime.restart()
+ }
+}
+
+// 文件下载的弹窗绘图
+function downloadPopupDrawing(data, mainColor){
+ // 以下为计算菜单的nview绘制布局,为固定算法,使用者无关关心
+ const screenWidth = plus.screen.resolutionWidth;
+ const screenHeight = plus.screen.resolutionHeight;
+ //弹窗容器宽度
+ const popupViewWidth = screenWidth * 0.7;
+
+ // 弹窗容器的Padding
+ const viewContentPadding = 20;
+ // 弹窗容器的宽度
+ const viewContentWidth = popupViewWidth - (viewContentPadding * 2);
+ // 弹窗容器高度
+ let popupViewHeight = viewContentPadding * 3 + 60;
+ let progressTip = data.progressTip || "准备下载...";
+ let contentText = data.contentText || "正在为您更新,请耐心等待";
+
+ let elementList = [
+ {
+ tag: 'rect', //背景色
+ color: '#FFFFFF',
+ rectStyles:{
+ radius: "8px"
+ }
+ },
+ {
+ tag: 'font',
+ id: 'title',
+ text: "升级APP",
+ textStyles: {
+ size: '16px',
+ color: "#333",
+ weight: "bold",
+ verticalAlign: "middle",
+ whiteSpace: "normal"
+ },
+ position: {
+ top: viewContentPadding + 'px',
+ height: "30px",
+ }
+ },
+ {
+ tag: 'font',
+ id: 'content',
+ text: contentText,
+ textStyles: {
+ size: '14px',
+ color: "#333",
+ verticalAlign: "middle",
+ whiteSpace: "normal"
+ },
+ position: {
+ top: viewContentPadding * 2 + 30 + 'px',
+ height: "20px",
+ }
+ }
+ ];
+ // 是否有进度条
+
+ if(data.progress){
+ popupViewHeight += viewContentPadding + 40
+ elementList = elementList.concat([
+ {
+ tag: 'font',
+ id: 'progressValue',
+ text: progressTip,
+ textStyles: {
+ size: '14px',
+ color: mainColor,
+ whiteSpace: "normal"
+ },
+ position: {
+ top: viewContentPadding * 4 + 20 + 'px',
+ height: "30px"
+ }
+ },
+ {
+ tag: 'rect', //绘制进度条背景
+ id: 'progressBg',
+ rectStyles:{
+ radius: "4px",
+ borderColor: "#f1f1f1",
+ borderWidth: "1px",
+ },
+ position:{
+ top: viewContentPadding * 4 + 60 + 'px',
+ left: viewContentPadding + "px",
+ width: viewContentWidth + "px",
+ height: "8px"
+ }
+ },
+ ])
+ }
+
+ if (data.buttonNum == 2) {
+ popupViewHeight += viewContentPadding + 30;
+ elementList = elementList.concat([
+ {
+ tag: 'rect', //绘制底边按钮
+ rectStyles:{
+ radius: "3px",
+ borderColor: "#f1f1f1",
+ borderWidth: "1px",
+ },
+ position:{
+ bottom: viewContentPadding + 'px',
+ left: viewContentPadding + "px",
+ width: (viewContentWidth - viewContentPadding) / 2 + "px",
+ height: "40px"
+ }
+ },
+ {
+ tag: 'rect', //绘制底边按钮
+ rectStyles:{
+ radius: "3px",
+ color: mainColor
+ },
+ position:{
+ bottom: viewContentPadding + 'px',
+ left: ((viewContentWidth - viewContentPadding) / 2 + viewContentPadding * 2) + "px",
+ width: (viewContentWidth - viewContentPadding) / 2 + "px",
+ height: "40px"
+ }
+ },
+ {
+ tag: 'font',
+ id: 'cancelText',
+ text: "取消下载",
+ textStyles: {
+ size: '14px',
+ color: "#666",
+ lineSpacing: "0%",
+ whiteSpace: "normal"
+ },
+ position: {
+ bottom: viewContentPadding + 'px',
+ left: viewContentPadding + "px",
+ width: (viewContentWidth - viewContentPadding) / 2 + "px",
+ height: "40px",
+ }
+ },
+ {
+ tag: 'font',
+ id: 'confirmText',
+ text: "后台下载",
+ textStyles: {
+ size: '14px',
+ color: "#FFF",
+ lineSpacing: "0%",
+ whiteSpace: "normal"
+ },
+ position: {
+ bottom: viewContentPadding + 'px',
+ left: ((viewContentWidth - viewContentPadding) / 2 + viewContentPadding * 2) + "px",
+ width: (viewContentWidth - viewContentPadding) / 2 + "px",
+ height: "40px",
+ }
+ }
+ ]);
+ }
+
+ if (data.buttonNum == 1) {
+ popupViewHeight += viewContentPadding + 40;
+ elementList = elementList.concat([
+ {
+ tag: 'rect', //绘制底边按钮
+ rectStyles:{
+ radius: "6px",
+ color: $mainColor
+ },
+ position:{
+ bottom: viewContentPadding + 'px',
+ left: viewContentPadding + "px",
+ width: viewContentWidth + "px",
+ height: "40px"
+ }
+ },
+ {
+ tag: 'font',
+ id: 'confirmText',
+ text: "关闭",
+ textStyles: {
+ size: '14px',
+ color: "#FFF",
+ lineSpacing: "0%",
+ },
+ position: {
+ bottom: viewContentPadding + 'px',
+ left: viewContentPadding + "px",
+ width: viewContentWidth + "px",
+ height: "40px"
+ }
+ }
+ ]);
+ }
+
+ return {
+ popupViewHeight:popupViewHeight,
+ popupViewWidth:popupViewWidth,
+ screenHeight:screenHeight,
+ viewContentWidth:viewContentWidth,
+ viewContentPadding:viewContentPadding,
+ elementList: elementList
+ };
+}
+// 文件下载的弹窗
+function downloadPopup(data, mainColor) {
+
+ // 弹窗遮罩层
+ let maskLayer = new plus.nativeObj.View("maskLayer", { //先创建遮罩层
+ top: '0px',
+ left: '0px',
+ height: '100%',
+ width: '100%',
+ backgroundColor: 'rgba(0,0,0,0.5)'
+ });
+
+ let popupViewData = downloadPopupDrawing(data, mainColor);
+
+ // 弹窗内容
+ let popupView = new plus.nativeObj.View("popupView", { //创建底部图标菜单
+ tag: "rect",
+ top: (popupViewData.screenHeight - popupViewData.popupViewHeight) / 2 + "px",
+ left: '15%',
+ height: popupViewData.popupViewHeight + "px",
+ width: "70%",
+ });
+ let progressValue = 0;
+ let progressTip = 0;
+ let contentText = 0;
+ let buttonNum = 2;
+ if(data.buttonNum >= 0){
+ buttonNum = data.buttonNum;
+ }
+ popupView.draw(popupViewData.elementList);
+ let callbackData = {
+ change: function(res) {
+ let progressElement = [];
+ if(res.progressValue){
+ progressValue = res.progressValue;
+ // 绘制进度条
+ progressElement.push({
+ tag: 'rect', //绘制进度条背景
+ id: 'progressValueBg',
+ rectStyles:{
+ radius: "4px",
+ color: mainColor
+ },
+ position:{
+ top: popupViewData.viewContentPadding * 4 + 60 + 'px',
+ left: popupViewData.viewContentPadding + "px",
+ width: popupViewData.viewContentWidth * (res.progressValue / 100) + "px",
+ height: "8px"
+ }
+ });
+ }
+ if(res.progressTip){
+ progressTip = res.progressTip;
+ progressElement.push({
+ tag: 'font',
+ id: 'progressValue',
+ text: res.progressTip,
+ textStyles: {
+ size: '14px',
+ color: mainColor,
+ whiteSpace: "normal"
+ },
+ position: {
+ top: popupViewData.viewContentPadding * 4 + 20 + 'px',
+ height: "30px"
+ }
+ });
+ }
+ if(res.contentText){
+ contentText = res.contentText;
+ progressElement.push({
+ tag: 'font',
+ id: 'content',
+ text: res.contentText,
+ textStyles: {
+ size: '16px',
+ color: "#333",
+ whiteSpace: "normal"
+ },
+ position: {
+ top: popupViewData.viewContentPadding * 2 + 30 + 'px',
+ height: "30px",
+ }
+ });
+ }
+ if(res.buttonNum >= 0 && buttonNum != res.buttonNum){
+ buttonNum = res.buttonNum;
+ popupView.reset();
+ popupViewData = downloadPopupDrawing(Object.assign({
+ progressValue:progressValue,
+ progressTip:progressTip,
+ contentText:contentText,
+ },res));
+ let newElement = [];
+ popupViewData.elementList.map((item,index) => {
+ let have = false;
+ progressElement.forEach((childItem,childIndex) => {
+ if(item.id == childItem.id){
+ have = true;
+ }
+ });
+ if(!have){
+ newElement.push(item);
+ }
+ });
+ progressElement = newElement.concat(progressElement);
+ popupView.setStyle({
+ tag: "rect",
+ top: (popupViewData.screenHeight - popupViewData.popupViewHeight) / 2 + "px",
+ left: '15%',
+ height: popupViewData.popupViewHeight + "px",
+ width: "70%",
+ });
+ popupView.draw(progressElement);
+ }else{
+ popupView.draw(progressElement);
+ }
+ },
+ cancel: function() {
+ maskLayer.hide();
+ popupView.hide();
+ }
+ }
+ popupView.addEventListener("click", function(e) {
+ let maxTop = popupViewData.popupViewHeight - popupViewData.viewContentPadding;
+ let maxLeft = popupViewData.popupViewWidth - popupViewData.viewContentPadding;
+ if (e.clientY > maxTop - 40 && e.clientY < maxTop) {
+ if(buttonNum == 1){
+ // 单按钮
+ if (e.clientX > popupViewData.viewContentPadding && e.clientX < maxLeft) {
+ maskLayer.hide();
+ popupView.hide();
+ callbackData.reboot();
+ }
+ }else if(buttonNum == 2){
+ // 双按钮
+ let buttonWidth = (popupViewData.viewContentWidth - popupViewData.viewContentPadding) / 2;
+ if (e.clientX > popupViewData.viewContentPadding && e.clientX < maxLeft - buttonWidth - popupViewData.viewContentPadding) {
+ maskLayer.hide();
+ popupView.hide();
+ callbackData.cancelDownload();
+ } else if (e.clientX > maxLeft - buttonWidth && e.clientX < maxLeft) {
+ maskLayer.hide();
+ popupView.hide();
+ }
+ }
+ }
+ });
+ // 显示弹窗
+ maskLayer.show();
+ popupView.show();
+ // 改变进度条
+ return callbackData
+}
+
+// 文字换行
+function drawtext(text, maxWidth) {
+ let textArr = text.split("");
+ let len = textArr.length;
+ // 上个节点
+ let previousNode = 0;
+ // 记录节点宽度
+ let nodeWidth = 0;
+ // 文本换行数组
+ let rowText = [];
+ // 如果是字母,侧保存长度
+ let letterWidth = 0;
+ // 汉字宽度
+ let chineseWidth = 14;
+ // otherFont宽度
+ let otherWidth = 7;
+ for (let i = 0; i < len; i++) {
+ if (/[\u4e00-\u9fa5]|[\uFE30-\uFFA0]/g.test(textArr[i])) {
+ if (letterWidth > 0) {
+ if (nodeWidth + chineseWidth + letterWidth * otherWidth > maxWidth) {
+ rowText.push({
+ type: "text",
+ content: text.substring(previousNode, i)
+ });
+ previousNode = i
+ nodeWidth = chineseWidth
+ letterWidth = 0
+ } else {
+ nodeWidth += chineseWidth + letterWidth * otherWidth
+ letterWidth = 0
+ }
+ } else {
+ if (nodeWidth + chineseWidth > maxWidth) {
+ rowText.push({
+ type: "text",
+ content: text.substring(previousNode, i)
+ })
+ previousNode = i
+ nodeWidth = chineseWidth
+ } else {
+ nodeWidth += chineseWidth
+ }
+ }
+ } else {
+ if (/\n/g.test(textArr[i])) {
+ rowText.push({
+ type: "break",
+ content: text.substring(previousNode, i)
+ })
+ previousNode = i + 1
+ nodeWidth = 0
+ letterWidth = 0
+ } else if (textArr[i] == "\\" && textArr[i + 1] == "n") {
+ rowText.push({
+ type: "break",
+ content: text.substring(previousNode, i)
+ })
+ previousNode = i + 2
+ nodeWidth = 0
+ letterWidth = 0
+ } else if (/[a-zA-Z0-9]/g.test(textArr[i])) {
+ letterWidth += 1;
+ if (nodeWidth + letterWidth * otherWidth > maxWidth) {
+ rowText.push({
+ type: "text",
+ content: text.substring(previousNode, i + 1 - letterWidth)
+ })
+ previousNode = i + 1 - letterWidth
+ nodeWidth = letterWidth * otherWidth
+ letterWidth = 0
+ }
+ } else {
+ if (nodeWidth + otherWidth > maxWidth) {
+ rowText.push({
+ type: "text",
+ content: text.substring(previousNode, i)
+ });
+ previousNode = i
+ nodeWidth = otherWidth
+ } else {
+ nodeWidth += otherWidth
+ }
+ }
+ }
+ }
+ if (previousNode < len) {
+ rowText.push({
+ type: "text",
+ content: text.substring(previousNode, len)
+ })
+ }
+ return rowText
+}
\ No newline at end of file
diff --git a/components/daySelect/index.vue b/components/daySelect/index.vue
new file mode 100644
index 0000000..3ed2e56
--- /dev/null
+++ b/components/daySelect/index.vue
@@ -0,0 +1,117 @@
+
+
2@RJs7E*cQpw7>7i6Y~%0fm==4z#;pqxX4F9`6K}<)^}Bhr<<7yECoAQfbVjc-fBEf11)Agc3ek?;aG{+l2J* zV>Y*QB`GitnzLV@fdl1;hgPSr8p^9RH8jaKtzY?- ~Bw$*TRn5}O5?ChL*bC*FhfpNESk@6xa z!K>vx%NKa`FZ6lr8O}d# BWT_T}sE=V4O=t-es#&u&EP7-oQmtd!9+EYZt GI)|T%N0}nPQ0x zdPvKM4-^yMCCU8Q-rXJlGF&;_b-u=2$OxVzniIg? D1F%nG9xZm=f=jY#Kg4>un5TkA3?>ML`9s%f7-)$_< zQ>p9hpngL$ZD?o+IBwNq5lvg;UaipTQb>cIZ*>(K&p016_ACzJpAO9BT)s}xu>QcJ z 8G 9orv`Bsm=amDxs#PmLXaAq+)3Vu?)HHam0x~=c_VbR%#USXpcLr zJeQ8_Nv&xPhQF=E;VK|!U_hGZ? >7VlF@Jj2#|b-nxA z<%RMed3g=%GZiK=-m6zDdM(L}G9zcb>}U Ux>OvUH7u=`k=c?Q(ae2s|blIIM_z@6Z#l1VzV*1~Oesa&_ z{z3!aIpz#~J?4J^FCf&G@pKzetHNyDMrzr!ndDIvET{ETc+3X1$60EtXaaT1OVyjz zlLa6U$V!xDbE~F&Kt`20B~Lk!v&nYJ#SNv9RYLZ!*Q)&M9clCJjSkPr*wEQge)w*D zzh-Lf=WC9fiAfF_>1(Izva-m=h&@PR|1ZtvowI^m5!mp)YpJzeVG$`l{^+cG{FwxW zN?~Qt(~aX&c09HUv)urUkH6njg$VpLZiNmv(xe{yg@-AMd##ZjdIstm8spiuv(8c$ zuY$+t3+G4rJY9rnZ=5$JZ1r#Hg7ZzmCKl7V#+>la>`p~B(I?@I1V6HG#p*+p5Zflp zCzLPgF@HbUna^_697Y #OVTvi3)z%L w8#NQiN^^dO?LVgkel;Yq;8*^ej`G0O$69Ny4L@^@;iNIc&I2hpqb{vBY>j0 zvdWy <1s+p8O*!qTG51p#T2 z`j$eh&fZF)O%$l&$dr8VK4hF(@|E2i8r}?coHqayQh6P};H4tN)dyp@qYbi~IL)-0 zQg80?i%@90rJvl(qldebDaPi3p%Im!y{4Gk7edhjqa%2U Ehx74M#|)U|?Yehx{ @2Oahd!xRDsUNGj&Ni+(@r$oOMs|dKQUikm^Q@A;G<6?}skiz= zJg^an!;6~i*JmMN?Hcc2d=-8$ZtwHhoemC?cPWw&=&bNsm8fw{(*$}F JT2Ov&q2|h!bfKWiH{_XI}$WZ%onXPA88;- zSM^a4RRl+&RJHPEc2D<^B;EZBMwI>PUtQFA`Y5N3n94|G#k)*BYay ?fQ8AqmjX*=n7 zg5@aBxnkGM`kUl0KBG>~p!4Yi{s$QYY9`6w;K2`>ri<*db1x<3Fr5b%S$o5>^=7mO zs}h2tIYA>3-of^j&tYA*EteA?Ub+4}(lZSFM1iS9P3kr#&m!bEMla&1n`%2hwUCID zmKFZmcPR0kob&-eRwr+$xa*QyQQh)LwJrGOS(zdcXuD0iueTk~PBH$CmZ3| SxyH+wcb2SYLORBA;tI}K-Ju9JG(%siR8K)cb5vmzo_+d0`sbl`p7+l#%# zG=<;uCrQLeRDFSc1TJ6eEt<0Mazn(FEUBQSWUsk6q4bb5@nr#PFR#>>uU=8v=l@1g z#*&+1>dYqpW|~`?BJ)AWV{Cv~BxH;}@-zwTsR72kCjkDK_9zu#$rw5LVi=`ZFgf5* zVM}0N-3uG3Col+^=Moaldw}N)S+mz)B@l|eyKOGPS%gQB)UM%lh}A2}2H3I&@${Xn z$eWDJx_RFBIZe?-Q)Tlr BZ{4xh(NYxs1D6T6 zVZPqrh$))2-~^BKx@a23BJ~i)fd-zKfg65^w1Bu%qvLYHaxTh0`I7SRib@!X9&9u{ zq)@lp=*@=Cyt4r%exVQ{S8Gw?J<1vD2lVvUC?8Fw_*8uQAPzb?TBmVF=wWq#rJkZN zZ`|;XDh6A^sCx7C%=MR2zcg*Qo=nB_opVzBlk5Xc-6 HpV_8L51SlIOQdrC+~gtf3V zrXFOg>t)n$?iAhBQ$3sxq }9a4Gl@br~z3$ zOeW5C_ye5qTn(%e_#)Mn3hkNF98h4Owg`+Sa<>#xtX{l6nk7ygj_L7>A+)K{<+U6# z E8i@Kg+cFmdOio6+Y-WiFc7B8`h+WLm&MKp+)GtM%C+LPzU! z@x0JWFe} orQ{cr$u5)V}Z0 zd*s=L`Bza+`sWalYr7Py tpa4Pms >RFk#txZ-3JArK1bU3L=7d;A@vJOumY&jF3B@qK zHQa=WuC_|DtE90q4_>djhF+jvohJ$3sekL0sK;OB>1-wOo7?f-)|O94H^Wngi*A$wM&w%jCT!9J z7FNQTku*1xyWD&J)gtii>Y3pi|AYhtfSwq=k1*4h!uDyS-K)3fz;gk0c91`qq_|%< zJk2K4fD7o&%mH|ftO*^YBEO7SGkp%ec`j|apUPLAW%873LS03CFh4l?cw;t_gulMA zh+391C+8hspb6q4G^%Q!k7q lHx*k0)ps!uR{t0wM7mphqQ2w zsm3g4 gu^F4k!3U(Y*%O0=pie EvD#&scyQh7#(kmX^e%B}%w z^9cUd6Z28|k5>Ln`~`?rOmh-PH5wa9TCa48xum)T=+j=iKR=#+Z?$l{{rqq6`u>Fx z|JZhGM$Vk6-jv1=7Ca=K0M99Cv*Zc|MS! us=f43(h^6Cpy+Y z>r7j=;*a#454BO6a2UDKtmEHqDbW9BXN^jh0!Kg}^4#wOScUl;X%qTrpR!7J$f|+_ zWi>v0`O%(ZshG0t{_BNn+&Id)pw~US$l-1TF`roTK=F0KJAIOPNuSqpSxZ=fV>8+o z85gWx{`T+x@OBvL;M5Ik*6pHh45g)~j91{_4M<=En8mR%bv {jLK@%; z0q{Bja(#y_O0gWjDWWEQ5N 49QSM0u iegIg(d{#d^T=|qvM`-0ZJO<-N>*7yC)nL8t fL1*6r_Ljh4o8 c{JOJba^ zn*YcN$ny_0na#zb2!2rhWb?_r{!LHkTUSYXbG^-(sbccXb6VtZFX2&JR_!Uiy5UL# z#B$)7Ze{)M$Yi#`76GN4J#Zt9ti-@cH~nW|Snbqr%j~RvK4O2To>70_v}BraA%iJ- zu?(l|P~#6jra<~a4eYss(-no?D3-(`LL(xN$TN=E@_Sc{%-^F!kOuus162ChdaNYu zfTvt_)q8XWSf>{*J&-{weFu0Rkts`VF76wlNA~N&I&Cqg@vMgZG_w{cic|+9C5~j2 z31RmSnOWWecKg)dC?NTb6WJzaso9!T>43HmTb}%qYgZrJAVDYH8ViJ~Ek9fq;fW*Y zk`}0Q&;NRK{e_+u#ScK@ShwkdyFPQuWPwSzCPbc7Lz`?6Hg*xnF@}DFAY?B{P5PL> zG3OP3ev1Mx6L6P9Z fmJhWR<2?OQM|Qc~D=&K^n>v9u`*lF(mO@)EjlG zX!Ex@Lt}{&6jh&w<~rlHC}!I?xB9%3$bSUuR*NN0z0jDPwC*Ig)VPpd##myi#SUGq z)1C=E7%wY<(T7$J-yTRZ;*K9+bXaDPfzuj3+YMZHKW#FP77;OolD=6IQ&QS;(Q_ ze63=n*r(y#aWA_f803TwAR2F!nzyNAL1nxCQD!Y7jA$u-SQ-XOCKZG{CU247OBq>E z$BcChrVvrN(WrM$;OORAK8K{Y?aT0$x!w=&lgRc|Q+M~!tx3V7h1 dHp+* ANN`)tL{t reRv$qVeGJgz@MQ)P>+GumcJ_c{LjeUpb^UYz1xXILS`%c;NMc8P7U@AnyB zLTO!dc`3hLnw8ElH7I>Z?hZ?DOtZ3doqGqQjo(>c+E~KV7+|$59PM&2^zyt#qEGex zOLX@gQNf2|#X{_B&qfFkH<_X2gB4~mD~c1of3@@Kn)gQY(nnu=FK1`da|vod`T?fJ z&m>i@gsxGL&?oB@Pwbo%7*Zc062$>G)ilfMkx703urE9pcZ@gk{t4ap%`KS-yLTar zTllMtx(F!~S4+j+d4a(FPpSTIT+sUj*IqjR#GCc(XlC;pbGvJgD15LOFIF}=LbWe> ziPGe#K)dgMwKM?K{w$JLLBqn$epZtSJ7>bPN)9gEF qA(!kTG&wHYmYbTL@4-V85bK&Q=-f0VbfeZ`$<51q;0*3VA`NhS>;zZoGq>PZW z2vYvh*l#^*+s+>B1H;)xJX*+ (y!hyJvL!CbnO`SC5k2_z81OaQ2RD_cTVt*8PqZ^ZKRPN=P*7}x znptxj12=^>8b4qM%#Ffe9y;|5Xe^eDvQ4#-eO-lL;OgFUa@E8?oz$J@h5$vNO!gaJ zg;zJ02n*!O+X}ttYGNo@;!D*YHu7#y{qFdyN7vn)HxlZRNg1s|Qs>F(hDmSVXrk+( zsm}7Pw|c+D%=xKzIy|BFauI9k#Q9Y;*g&-MBh({@YP|a8D!EdIp6PAvR94-)n7&Ue zqZ)^PPRk-Z>^_sq8fQ+Rxuw;kEu*lJ>L)1-4+k07UO^eO86^7AF>ley=4^g>2;0w4YOG^!(={Ov(G<8HR| zQq!vXf&h=xIf5wbT98xFJAvPq3M`L_C{%N|a$jM4rIBOeI^(YNZEB=(INIgG0>?2t z`aw*ctROa_7{zJq0DV^qI>aVMx{pSh!){KfIVU|)Cmkd^Z6(Jld%x5`;T2)97oE UU W%$sNN1gKxMlzGU_V3=0t+xz+;BRoN!gjC@y(`s)byxm@f`9G|3&aFO@3H zkxTh4bo2z}F9x6Zi )8q*MNVrf1Uljn@Z&d^7i+_7>u?4T1o0UJd z+wvxHmsW}i415U)8!dudj&%m7T`X~x6u{g}43%6v$8v&pb6CF>Ira_j>hYci)-~su zT?K*|ntPMVTDf+t5vYtmB|1smNz7&7U*wQ-Eefcb5qW-TzJDJku^c;&l6(V0;tk0B zo6KQVBOu%g%~S1*Snr9z@!4ijsZ|J7=zMde6{0Xd>)D^X$SM?n2JV(4j-mTA8vwn* zM-aZSiZqE;L=$O+3IOfeHu5>HJtFM;&Dr;Nd^AhgWa6i|u&Grr(a=x9wsp%=KTjaz zdsif}KS~QWyFYyT^eK}GV&|l2$lK {9rKammgr^SI_}yn}s9*^di@_h^eI%o`(ff zx-K&xTrC3r{EnUwv=2^Pu1NGb{dv&aJ^S-C{h}?1+m1I}5jC&tP)2L_-J6sEI&KWf z39}btXk1_HYSAczFnP_kGBE#XAzIi4G-(&s8aDy~DRkA6lveH$Df%c9lkh41~ygu0q^na^!WS1FczW$v}X@$;m}XRArZwFGrb%Ln*) zJ;$qcy8(_P*s~JJISOkLat}y9t2i4%jRiXavX`N3@@P{gvJvu#tJQYM_<0O;gtTHX z0q{eD%~eHrnw7t%c%Wmr1K&U38>+m?N)y20yGVM*&5FQ@ugBtjvxjB*Ju%4sr}3#I zuIHL{+4{6R+q*zYHV?f|)^Uj=Sq(r4cyG4qY#szUi >QC*`eVfLctg;kPn2$=-S@RIE#ZP(Qp zT~6j2p&NM(oS1aoKZ2o&eyFEszon(6`L*Uy+_5RfYt3>Mn2}|ewQE&b#Fz@om4ud4 zYtQ}Q-ioW##xU1SbmW&nnSQfMrj2yYLDSZY{W7Mz$up7G?6x{sGu=UaS8z1#;=!87 zQ+kb=^&?&`PR>zqp8R(8xMEIMD4v>y1 Cau?s zqX^)QS%} VKqlB`N-u%hy8mMLSv z?w| YGj=^RE`O}hima%xcN)`E z(2~+3G{udB`-m5zJy^jLpJT=M^*%rlf}C8Ao8O~QAQ>QTPm@9Cc%)@v!bSHlKZn33 z+64Dz&y P8-d`F@5|4?y~jTGYw8lb92R#-dD#P)mG!wJ6l_$Z1_Gl zbj&$Q>U*@EETOw3-$eR}Hl 80#dr#J9ibiE!yltsO_A^x| zl$4KKs e#NXvbYKq^0&Oh4YlhcmG41S5mldE9 zac|KJ^ceFdtA`B679Zx(0<0EAWmotJO};1EAP!?az0Qm;`5Z&Bz3YBK^b#NR7ajTJP;Svw`PM;P *1gD~3YF9O|%%s&`+{p@(~ zw^O|hM}ig4MwdT0#d&`M-L|z}mRZ}~bSW*xj+iAV>{keDILoKGxf!tx@C@)lCZ~Vu z7BK9>D@k-#m eKztEVXahhF#%&i3*uF;%EKK>VB zkX3Mmi;!q%{(OIapqNH$33Wi3qU#xMc Duyv$hDs}S!?;sChcU>H z>9XXsiv>1m*$+VOn6b$Z1DiX=-xttX53YmeAt2NAPzYPW&vh+9+{kQJcIS-4!tyMo zLRif%s(_}0K;TOlRycqOry*yv_wf7eQRLkj4!juW7J2!ixS*dO2k$v+o-9VFo2RG1 zPpyhC!-6LYE$!7me*y+PijEDU&*?O-Ee89L{C&Ps5R7hU>d9URAF?&>)-KZ-`66*m z6L6NXNk+OvMia@tp{~Qzh(Q?^mtAa<(aNQM-5N_N&ZnZ5;5BLV=EQtpC5G*7dCbl@ zF|z4{?0qKaj_^FNQv>6kcxBkkQ_MRTmJ5z%&sOPx(r+6qYwE8SP$GP884QU57941L z8xRte=eRCq%C->6ivGRibErq5?a7p_ejF>e+5x;``moH}{-!IkY#34*Do S&H~M4l9SO;Z8U>D8$S{$R 2J7^^}{9B8_TIB%TzM`b0)VVeeu8(f02j}6x@DmNiWm>-1yM-R; z)$`7C*WFqg`Wil;))VhbxkLEVKzg- up8{S5wok}ozobx*;nP@JP4gzWr`KcqB){7Txs)mW^lbS6 zqU4pz=-u?K!_;`P7-xdd9`|-HkZ9}npjk)SNXL48B4b!(r3A9i>oKjKUg(G-ODB%( zR`xlODU3FDRzXp}OHWYC+Ls$5dCxh(O4_XiC5!)C2sB7;Gq5L9FixECU2e R-Wd*g^t`*K#W1e9S#Xf01-;_N9lJXPXb3h6hcr|a&PiZ2TK@O$m|i1#%a z&!Wc(%X0JxL?_fqaJHjjqOqbn#!6m3)Zk-(+DEy#v*cvLMb``wJKfsW$m@5JF=rN? z6R0=2Tss#y{DX(t#u3}iYn2J$pu3|O=geKnYL7nR;t1Udy^Yb}BVzkMlJQ2WAN?Dx zzfZ6cs0_{)9;nR6CMif5yw2^ID~`PMgOLH5PN;8Ag}MIOYc@7v^D~zWOO`!<`o7@V zg#vwDBM@LHE3QNnT{vOH;@4VUWVhWd*M^fjQ{DnsAVcq!mw`ojL(JezZ||`JzimNr z@l6sZu38SOz(GsN5lY6@j4sTxsV-KBIli$Y*0hDZikpj@dxu1x$8JH!db)Hn?o2h~ z3=VM(-x6%d8u>QHozh^P7DdA~y|_c@XouL;H|Od+^2M9iIfw4@xXctB{bQPK$Dr%M zg1fRiWi{LAYZ|@d IxKyqFpTa8AI6gFNXL*a%Yr~mclHGEHpdqRNf4|*S(+{^tE;6w$qUH$ zSnB`}r%*VWr8QMKWSnWhp(sa4zXx5(of}(5qY8K&>%3>*`kiUTv%4AT@*h>1c+}6M zpm)aDX6ZEA9#~ZAtcWpFKeYkVUMmONryBBGL-rmxRPNDRiLoYDnpm$@ZUomF 5UoM8kt52JSjH~5 zP7>(AFy;$f=79>jc!l(1Kpg3a)h>4!Hzzk4J_(5~meneQgo)M%{RF%mDN`M462WrU zn&@+H4l4y8;QAS`^tK TcJc&v@%c4OW`}J}QADRU0AOUGI($NxFoezHv?iR5PPN9?cs*pF zWAC*ta9UvR!=&%9M7@)^tccDc&ScQfNNSX&I8rbLW|pMGdxwIBz!gQXM}&n2D5{F& zQ_+Z#&yY>pL?i||t-OwW0Bp>M%Rt#tS$ g)@MPd^x7Mf}}6I{N8slx#3|_3~2se)Eff@5OE%{j4Hj8 ~9SdnapZTxVNSP2-o6T;vLFdFUHC)K`TR13y}SEawKsi|=lGHlyTN!I-`TLpn` zAMDy^8RuX{$T^fQx_TRYmz%7q;T)YGm_2AR{C06?zjR+az3=NhT~eP6bx;3;kLsIM zWic{^nFv3Ft*$&hGl*mXv7dW$tkU9bwO%E2=ublJ^ed_|hL741Yg2Y+w1~}Zw+qDZ zaM&LY$7AuBUIo=m>JM1!q*topO6^gJyx|)NXsD3wm0w>Mj)D{o`9kNC71)g>6yXIf zcPi|BOEC)HN1odvE*2~*A1iu*$ Kk0BEfa%Y8mDLCHi}|K(T`0ubsC*`j6RRG=AQxw-x3KSWnStkZ#9|Za z+zy>AhB!zfK3X*6Sk6hGN6F7)82%5mUFpD=YG>hq*=?UP`Fh#?^xTU%G=3uo{I z+8uCGTyxX#NecY#j7a>pi8P#udF6J}I*ir0aIaGH3@pZYCg#6HkP+qCQJwV!9&_@4 z&(f}W*>bt?qT1a3E5B=Cs%a{Cme_1!W_b5U-YEOTAM(*qU2$ATruE#C{U}=X@tRx_ zb0?J NI$Ywya-4zKkxdQs#OS_e#rP(6bxQlRWVKWUYo^-}yZaZ*|$ zKeg;SLQ+zz?=^c4KclOqyS&!~5U!iK z>M-B1EjBkTIPJC4xiw2@G0>h=*kVPRKb^vv2rs5tW+%+Uu#ErZ2`4ux9baULC(8sr ze(V_q;gEZ5AD!a}Rgpcd^w*su@lIj1;+|Jhdf`dZq4S@%)_#&ydl{t?Q!2^QDCVqd zhbUy2gKAY?yCUoRoua}4p9$={-<|rV&$5jNr29g1XmB{!0*bDGy&dqVXh741pp~8u z+(oe!mnr@r{plo(ZPpT5pa3iv^Z6mqV^#TB5pS?^X=mqSMKj^X$ZRv9;$*2TZZh!8 z{R9FK%owrV-?j)FJkUElOka#lB|wmyHKV<0r|jgQ%eaW$GK;I4{3fms<1P+T^0c}K zTZs5f`TFjQEN6^BY^Wf|iw8bD`d&v}#$6#ek-;^w+=}$JTDcR8$X5M$U$GELR0eBDCwT7NP%=-Du|~ujn}p}u0qGG@ zZpZ_S&^3Oupo!>3Jlp~)ohcNFFL;A ^4_j8BbJ!l7pE^5Sag|Se2A{kQTmJ0 zJzo*t?-c)PyC4 {O-bjU>p z2=oK4FnNKP_~8+(uhI1hJNw&vylCi=D$5QLFJF4^kiFrIjTpE5|A;yV2EmqOTX)&E zZQHhO+qSLlvTfV8(Pi7VUG-|_%(?F` C8DfBtx`cGnV19)%}R~@>Qo$ax4RR{lP_D8{7m%S03Irdg6BHRBvd3;s*{ib&J zGXmnuqdStq>zI;R%+qnTa@4q<@rd~Rs_k>>$M rV=ACGS-k_To9Ig^B~#z zcw}!hHejO3#wtl~l~a-2F;e9p3l@=)QCXN#l~Of|XRMZr WG#x6n&Z5CsIN-HDkGI`@nQddl{Mf$V_?>=`l|>9J(ak zFhx)P$2{hb(R&qkWhYe>UuMlJ6>aoKn7Z#0ckDU; J2*vRXC@ zq`kbnbY9Xhn_X1Xn{>d~bmF0WB=t)MSC~=10v<@fNno>4EVeH5+c D5 cPcl{_wS0r(-wz^ZlvndEvgX%HNu+ z_`TVy{js3N*f9{qb|5YY43i6$8Z(`C`klwl=QHD{Go`mAuP3(s@zi4ce2bLt@?_2F zw;m#CjO7fLd39y9u(&9){l4}5a66ZxE1dIjP~!ZIuA>osV8n(rhogLOaNbihMC7Ks z8x@gHFV|o15|)G?ZqCgl+vUTvu+Ahf;%Vdg&?*uJN_d7dKC?nj_t2DdwuT&>oZbtP zI3abn=mG5#ooaMm?g|fb*2%j_ENxjDt>jcCH2DasLUzYoA**O*6lj@&_;U+|V4@x^ z>)|PG)wZq9e$tPo>h=QT!CABh{G@hc+D4CtmWu0n!CsL>%9{{wE;`XgzldDt^UhO~jP+%68VLA>>kzMYAmurj{qOahP((vJ*+xd%b zaQh@wx0Wm#kLSm(YGpsu=a9IYx)zR!bq*(6vVE_n{YVD)aY4rS7t}ZQA&5WJfV}mS zK+KqwbdE5oJimRdeK6YVYNfL9(_>S W?qH~%=kv3^svtr4er 3*ujolwHa zsDPQBUKmdI+v=`C!*g{AZMI|URoC-8r#q|rX|ZMw?CT8E^N>nULho%Z vYLJ(fh*rJ-A=!V2rP)4II28mX^sPd4r=#lkdljL`5)rwDWaw`tqDv5_mCTvB)Z9n2 zre(H@)S}Co7X`^;fzY_w{g7pg!rU2|G$*9SBgI^`9-TCAzj*crK(qN_NKKPFu7V|) z#=_?wZS@e<>GW}f18eq>&Pd3MmEv@jAHI-`Op{vH4Wri@w%M}u2Zq>xDSh_ iqO} zPMSW^0=daQ`wQKcfv{Iw63f2dC5;9$XgVIRBoEPUU4N!Hp0(T0SZeaz%9fFC*>ygP z+2X d^9|3mwxPbz-HH%Ig;%vhWgjAEwmx+lYph~%FY3+h 7i3 %};`|GIy2A)J(4^ zE3W%ZZgGaAAjFclmwi1)54A1n=|t=q*@&jejM_cfA3t&r91Iy)RUlv>+-!6TQW4+N zt;qGH*pvnNxlY7k@sV)6kcXwv%0_VOqo`+Pz>DA7eI1sUIch9SOR&9(JZ5DWIyxDP zcP%0J@6q3%T!sB~msU0DZd@MKkSppV+{=#}o2)!b*6)4JJH9>w&i(ENj7DN`ZQv5E zIV9sb*8i$JJLt-DFjDW26}rFlz3V=Bi*rG7{dwo}IZ1!M@V<$AJ8A}b$bpUVEGYdKmo*YP7ud)~s_R*>v0XabBIE zD`D$;om^Pjl3l0mjP1v#w#F3>$&z#-;W$Wl=u`KY8}efqJHA_3pU`+Ea-If4YBWNd zy(&P6QpzOk$OarxNPw1usuW?!qBuSYN7cXVA_$4AQCU`m`(5Egy7(;SA}DY3yR j7uhp3n%;U^mKr*1ZVY1)iBr`)1x{-OPjULEtP zw^!(AD$#$fK%FzEm%OYgZpbi#dSkX(j_6t(_S(v7EO^ybRavf|Q#2Ft6KYlMmnXMG zHTP}(Q n+wWMXmYxfWE=M=?lZ#ZP>7ya%ovHPC^EwF5=Y(wcChu5(dTSGLPQYTY z&N31wOS;~SyajEJAK+=#sbnV&ExNBIhZ|`7vyZXUJ+R-f86~$)%+WbFVCffU(z(2f z3|*oZ)Uk3OO`rqQAgMeo1Imo8aji|g|G8V_KsJt1t&bj5v$aj%fjU&FHY`IIl>yFt zIJ~pT=Gk1GW;BX7!=Tev(yMxotJP_#BI3R$MxgJuj+~6B2nW1*%#*?T@?=$Rd^*2O z9Lr=!aex}j**KG2I|gw=6&$VEYr(!lV{P15wwFgF93HRt%T3)>K|_6K$@)3qJ_xWR zCX$4`UEj(}v6U>Q(Y_Jiy;F?OJ6-n|lSFbD$bPw9GBWfWcaSnEeg#!Ut%s-AJzdXh z)jLU}-<2fZ_J!p$&iCH)7f|PSp4*=xTC!=pv>;Vvan+^C1QJijOR4DZf-_rz;w$u< zVc<-4-K5@b$PTs`!G_h~8t==Bo9cJGU_H-+>w)E-JCATI0M>26hFO2|-vrUf-9m0I zAlcqWChiaCelXi!1}Lyu*`W `2^5M#W{2~NM z{(`t(fLtZ%wQBuu0bMq&w%6p=X&3 gPx}`FT`!Q3C{=}-;C7f2jZ){7F zer&I2;o+gqi8bK5=hQ6iE;I?do=%{{5uQ;3DwSvhZ{i?{?}n=P)z}s{*b*F#WhsS( zQ+qGcy?o5DHzQa(HEuGv`+1vT|2O?ET^Ot1i2zH!QoiEvD&@8yk=8Klr)9O68qvDO?PZu3UyDCTa8nc;cR2Vi{Gc zz9i97@N=W2{c<1o+pm``WYB|DC8*&2*2uw_CLTJS0RlL~jo?^P?xvICfnJ1s3E<6g ztoojvAbMYW$2$Xj_iVe{A6Iz2+pi1TiZ7Zoz@quZn)e40PB&qGAICRMBXa$5ZI|>J zc))90uvIdS+lbv&!G#N6PF-r!=(VqjQsQFnw!(m#dH!{xpz{gHwi_%!E!Vg~JRQY( zT@--maZ+L@leFK`kSZ`_LOqmAp$hx?_6H0=6ZZz&toc+YM}2MR^ o>}Y${Uhm@&sPzzXj%X|tN1flhYbI@p}PYko{?p!-Z%XhACfa$50kHL zP#v@T*e2)#@RleH0f#LcPRn&xuh>_9JD+-fyRXMv!yH5_i5S2L_KA_k(*0hNs>w>` zP5SHmey=HRd^bBmb}zL>ulep~sG)Eu6Jy!7>4K{C2=n~R{o%lZQu;r2aix;Vx6|Je z!8C4%SN6_YK!rcO$)eC+uC@VwuUOwyA5YgGS}(m|yx?3dvH~lSi=29IXDvJ1pR@Zn zEB7>`Cpi3j7Ut2?g79Jf{U{41YPppejAg*;gwl^%zF_(OLdYoeOt7_9#Q@9Kf?aRu z7i+A5Mu=NLjW&sYv&Geqy9C+X6)o}6K@kxNdL6 GfBX2gPMHkndD;^uUtpr`-1+9Z JkQf2g+{Q*0`yB<5p+>RM6u}0m9{P?n(yfE zB)QKuINr~k?}O1crji;XY4QrOMpj`jk;WSBY;}08QBudd7b!eo_nQv81qW)>*DYpf zUeTbP?9LSaFcWfGG#JF#REx#1uHXHDCF((IH1>#9Aj?b9zry6E2Ue~y%q5?^zdNo2 z2S)G$zaPx>g8lCJK5SZRIl;b1dcK@q3i$W{omO$tR~?~d%z-fx1lxkGwq{+U_^CRC ziS9(z(6A$ge`Aws;V1Z$USwMgOfJjxM{gq4T37*zikT?Fk1_|MN`fYogalfdWPvww zqA~pqhvbS{c#K1H;jiJDEs0WbE;4E9oqVJL7l;yy#Goz8GR v>in~Y6S}O?%l>)yzvsFnzzo#gv1lEwB>1ww z{c#tj%lqLNXQp94KglM*WXVrJar@TgRij}MiDlREys7uzZ}# ?h8AA}4Y5hcheNyAIxfU&YD@ z-+*h!RS|9$+Hzu$MDt0dc*0B>fVzA2x6z5S6FX-MG@DJ9@=`RM&yCN`Dc>h_CU*~X zN6D(D&OmACQ*ar${RJNI BlQClAkpS@!d0HmrnLBolJXp&0a+hzku-+kGYQ4fj zS|@_y_k}jDohhDr)fjD+ Ma9$25P71^#6pUaSs1i<@AYI; zXIr9=F1W8 a ^$ar-Wphi +NGd?7V648;oo8T%Gk*&B+ieR!p1G#8sJ6arZpgryhC$QOUR7$CQ& zPr@uY87Z88jWl8vZWUW{H^DNR`gmtijJShCs7MIYKKMc^$fz8ew#NIc7}dU0EItep zV=lRf`j`$vt~ 49QjPejVRJ0WO(;=cE6-!Pqy# =6Td=u8p{dF25IetXEhIOe9W$~urrqe(q^rD1ftStYe!9&- zyDRt?^udQO=CQ*kCIXGD;JhL=!`j-p!B!L(9dk0E1b&;=8m%<&_5$Dl={9lj5jyID z _u?k=Mu;%iu~{V<4hPCx zpL%q!CgE)sd7va<21(rg;i $*jsy1g)}^aNJaIlb qk=f-=2E*m){ZNGflKL4CX z2p+EwtZ8)z!q*hvC)v%@vmZEZre3IP(8mWcOg1dU*v=gZ{{c1v9^vE-*&Q*SOo~#G zid|?NAn&=lx|RTR*zH%&7`+(sUT?SelsbSz0mwubZKmc$U-cNOHKtYn;9u60EbOq< zBF325^MjMz1pfGmLTD_?d)i1)o>p6@Uu>5Et*1N87wbJR#b#?WmP+6RVbXw}ponWw z5T~8L9^xSWipA_uRtk$KM+7&?BM*lRFQ%+>LAvh5x%eQE0+eP|(=U36(H>ZCqcmdq za1$Jj&OD7?#3ZT4%C|2h5+!F6m*Z`O%#I`N$JJ>0saRFV{goe`Lv}~Txj?mU!~xxO zfxdh(P`t+7|L3o#eLe$AJR$5%Ze(A&9#9iGbnC@xW63*b&b+hi_qn{w=DW|P@9YQ- zi_MPjYTXqO86AZ?QkH#w_;KYm4P-_-BG%*LZE?zDUbUj35x6=(5+Fj;dJP2EM~3^_ zQF~duzH>7R6??>SvBlQ#nmKyCEfF|j$(T8P7o@@TaY_hnC&>w6%;Ujw=xZnu7YHRt z*PyG{cOqidH!wC~zN<0gzu$n9Y6(1(#semn{hi0X?Ul>G2$EIkzctPX{0bP!;}Wk1q4S!?9=Yd-;Ta}S&mTNDKR378$~fI(sAd-Y- _ zVK)>1x~7?`7Zm-1uc}jeynBA_(Y~dk!!0d#g|>8+l#WEWUslc~U2nNPL*a91r|6($ zqd}4ra3LX1n^ck-d<1RYuqOEFc=^2t2zSlrKRH=gj0-B2#!b{%-AlpobWYCeUo&2y zeIz9N_bj*G!39%95u;k0 33R#s>Wr&ExUY|ro$7bK zUlsA7Ili~lkxf7nv@j07-BK&Y=ewt|d|QRaF8+tX;l#hiD0)`}<9zAOS#YI^;Y*}+ z@Du;219B}E9V~B@X#q(xg5LzK7nN(ugiA|80-7Cl(7SyQW3Q|QqtRi5^%IZE4blG$ z5!t!YvA5R)_Htu3Fm*y&BO(Ylh2}vJjG4GRC `GD)`S?=^l_!5eTLt#X2k%3uIaLRdg3x{au-@@R=;gE>xrKRU>vF2;x 2@{WYuzL5iqpP~{moWPZ#7#FP&!h< z&BZAQxDep}r8)$jA)$EPT97IcF5f!w_4cy=G->b@apq+lcn1{uriy(xOL+e*H`OpO zOol}Z6t!9Y7=jeh-Wr=C0KIew!(TWpHiO@PfI6#Gu_nZ{1eV5vZ6#rd8?!Yg{bg-` z>fTxix1P2NeO_n^>8Pmw(Lwg`TZvqlG;MoOolMnnbp6BB W98a?j3eY0J(fsyEk4)F?I11>(#8N$B2(tfd}}VhJ>!7buTDr(ytHBp_=+ z6G17hU>kK7*~|Q=OYGtY$}T!7i5O1j>g@ra0}0p$ZC^T8e)k;L|5mQMMmWQ5Ll=MK zxL>=t)-RU;KH3(|^F~t!9nL>^?7H3$ihNt-nD4?sAY^IC9y-*{v4c%%Zlij#H=Bi< z @6LOaBP;2Gb@bH z{#91s(ov?F@K8}f%Wt%5JVP}-q;Bef2CYfz-Oz^Xs7}Hu3sowwqB f9T4p$3!c^dCeE-kWg~L0)QsbbR z%HhL{iIF4pkH8nkhS9%&I4YPF4bt0l k (uCZLjZx>yLx+qETq%}PtPxy(fz-E`rBq0ea!^MkI$?-r zxdOK*rC|E{Jq|Er-WBr5MO}mBpvj}7(^fhM0zeX}#!Hl2$doF)<9dtfFg5N(^r;qr zxeB2iRcHxO*^gAg;wDU=pUjXdoX5%A*b6*=GrnM!Z-awzLj21Hzm2o_EIDikwvo#X z5R{KW>y^yZJRuvp$O*blMUnuTK_;-wmSF8N_JRA~^Wv>G_dZ_#wwWHkn~UbA(zmo! zyn{^QmNZzd=AqL&d-kOIYgYmv1Dv?E1- F2{>(5gH0lN2 zPKCkGpX3cFLgNrz9}gZ+98$*`VBs;vu=ckW8W8LxAD?(> $_is*S5Z> zan(U9j@B9ILSBXLVY4kssQ5EMOCR#EN$E1>J#p*giDv{SRLdXjsxHFuomKtvJj@*z zU8X}mg2Z#0%FfMH+c* wsmd0lDHs$!XKM zk!MSKiJ`Fuj*9%B7dartBa6e;&LlJcYh-0)65OvwN*Q7&6brV~vCKt_pp8!kNjN~i z65x3W{e*I8y2t75JON3`Vr{>0p1{zACB&94NS88qd4ERAQQVV)c@La*+8VU8!JmH^ zvRFS6(&n?oauD%NbX^7?anA2s?i-Oa3)_~DzTjh`4d6|RBf&h${Skg}(eh7TtX?0R zS}dhxJsTX$N;qYYt1>xOgUF_IIkrkTuB0*LNcr3aH|?a$)xfLx`-X1$Y2F$Ns0lHM z*_qtb-v~D^M~6ayr1Wp6;b?6#sqJG+b_zB^BSZa-jgu^ONKL(SV1|U%GAMrQ=)_ z72j`~ryYnz-lN!Xu*3c58VAshulUTC50Jd=Ti;XfqRRgluhN)GTwS<$hA0%^2~zo) z8SC8FFIzI(Ry+X=GWcuRiYx#oN#o$LyP-ITQg$fW3b$%~oK2pcAENG$_wcSsF!FRf z_-$ZqB=)E;1&MNNolLP!n T=zz+`>5 AD( ztRZG<#k)Wmvg&Ou?>Ya};PdDrZ1KJQMKWlVd)-cdtVoJ;hI#5FP!{F6DM49V9s{;@ zJ`QZpjHz|(ci6=}{7*Kl9#cop)&drG6RZGifDR!^G>3`7#lY0i=2o|TUck`#XFLSM zD87OC2&C`n7PZTzZ6v2_?f78=PMYWKBW;hSBxYKc&bfnrRx6;2iNJcD4T9}r9eO^2 zW`{#bWtZNVze$LIKL7Cw#yKqwJK#9RWmoTO3ymN>-Cyr>2rrCgpCg>mC0)2`Cq1>i z1HeupY|miPo$-JNH2P3K;_onsNB}n#)Pr_}N2~1ya%bg$mWCwB#xBrE-w=Ld#qS27 ziB7m|l-7=r+ioMZsB%g%@X)uJl<7KyL}-nk%ydf25o3fN?M+yVeDy`PIeby%N+a6* zYxC4|k =OvMLL_WKT;PpBngr^F%i(+2@&mrJDwI4c*^d6%$P44iWk4 z{Z`_EwE$JB_bVj6B?+!fo+JGq*udp=NGjNwk*q=Q#EpDzP1EPmpGXsKS2 F^Pt#st_ZFCxX+?etqcrCipf!KQ{S6D-=877$FR z^r~+Lsmel^^gzz=(YDy2yjz%!Df7Zqm+edW&pAO*H=x5=pHK>T>BegCgR09F)c#On zWOAVbelDGFq2P6G@qrdrucaj7g{ N@dr$vW2=PdFuBmkY;KPX7MLfy``x z{}-i~6tF#BLu4kXoR~DSdk+Rt!Obfvi{78F`5fyWH3fXxs7_$_8wG-4olV;+FlJ>W zrfMvO&Ma`bZ?apiyS<)K{Uc^kBO{~u8#a?iG{xnm2rTok!nt)>UYUaP