From 5c0787c089a375a228f6d7c8eaec663be1665d04 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8A=8A=E9=87=8C?= <1227971437@qq.com> Date: Thu, 1 Apr 2021 20:43:00 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=9D=E5=A7=8B=E5=8C=96=E9=A1=B9=E7=9B=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 4 + App.vue | 26 + changelog.md | 2 + common/login.css | 504 ++++++ common/uni-ui.scss | 120 ++ common/univerify.js | 142 ++ common/uqrcode.js | 1382 +++++++++++++++++ common/utils.js | 57 + components/m-icon/m-icon.css | 378 +++++ components/m-icon/m-icon.vue | 23 + components/m-input.vue | 125 ++ .../u-parse/components/wxParseAudio.vue | 28 + components/u-parse/components/wxParseImg.vue | 94 ++ .../u-parse/components/wxParseTable.vue | 55 + .../u-parse/components/wxParseTemplate0.vue | 98 ++ .../u-parse/components/wxParseTemplate1.vue | 88 ++ .../u-parse/components/wxParseTemplate10.vue | 88 ++ .../u-parse/components/wxParseTemplate11.vue | 86 + .../u-parse/components/wxParseTemplate2.vue | 88 ++ .../u-parse/components/wxParseTemplate3.vue | 88 ++ .../u-parse/components/wxParseTemplate4.vue | 88 ++ .../u-parse/components/wxParseTemplate5.vue | 88 ++ .../u-parse/components/wxParseTemplate6.vue | 88 ++ .../u-parse/components/wxParseTemplate7.vue | 88 ++ .../u-parse/components/wxParseTemplate8.vue | 88 ++ .../u-parse/components/wxParseTemplate9.vue | 88 ++ .../u-parse/components/wxParseVideo.vue | 15 + components/u-parse/libs/html2json.js | 261 ++++ components/u-parse/libs/htmlparser.js | 156 ++ components/u-parse/libs/wxDiscode.js | 209 +++ components/u-parse/parse.css | 258 +++ components/u-parse/parse.vue | 228 +++ components/uni-badge/uni-badge.vue | 153 ++ components/uni-clientdb/license.md | 30 + components/uni-clientdb/uni-clientdb.vue | 377 +++++ components/uni-forms-item/uni-forms-item.vue | 437 ++++++ components/uni-forms/uni-forms.vue | 420 +++++ components/uni-forms/validate.js | 442 ++++++ components/uni-icons/icons.js | 132 ++ components/uni-icons/uni-icons.vue | 67 + components/uni-list-item/uni-list-item.vue | 440 ++++++ components/uni-list/uni-list.vue | 106 ++ components/uni-list/uni-refresh.vue | 65 + components/uni-list/uni-refresh.wxs | 87 ++ components/uni-load-more/config.json | 10 + components/uni-load-more/readme.md | 48 + components/uni-load-more/uni-load-more.vue | 359 +++++ components/uni-qrcode/uni-qrcode.vue | 196 +++ components/uni-section/config.json | 12 + components/uni-section/readme.md | 30 + components/uni-section/uni-section.vue | 136 ++ main.js | 13 + manifest.json | 63 + package.json | 80 + pages.json | 78 + pages/grid/banner.json | 34 + pages/grid/grid.nvue | 313 ++++ pages/index/index.vue | 29 + pages/invite-reg/invite-reg.vue | 255 +++ pages/invite/invite.vue | 184 +++ pages/invited-user/invited-user.vue | 149 ++ pages/list-news/list-news.vue | 169 ++ pages/list/detail.vue | 286 ++++ pages/list/list.nvue | 321 ++++ pages/login/login.vue | 654 ++++++++ pages/main/main.vue | 134 ++ pages/pwd/pwd.vue | 52 + pages/pwd/update-password.vue | 261 ++++ pages/reg/reg.vue | 109 ++ pages/search/search.nvue | 496 ++++++ pages/ucenter/ucenter.nvue | 182 +++ pages/uni-feedback/uni-feedback.nvue | 235 +++ pages/user/user.vue | 279 ++++ static/api.png | Bin 0 -> 1449 bytes static/apiHL.png | Bin 0 -> 1418 bytes static/c1.png | Bin 0 -> 401 bytes static/c2.png | Bin 0 -> 470 bytes static/c3.png | Bin 0 -> 511 bytes static/c4.png | Bin 0 -> 476 bytes static/c5.png | Bin 0 -> 472 bytes static/c6.png | Bin 0 -> 545 bytes static/c7.png | Bin 0 -> 365 bytes static/c8.png | Bin 0 -> 587 bytes static/c9.png | Bin 0 -> 565 bytes static/component.png | Bin 0 -> 1146 bytes static/componentHL.png | Bin 0 -> 1142 bytes static/img/apple.png | Bin 0 -> 8569 bytes static/img/home.png | Bin 0 -> 2637 bytes static/img/homeHL.png | Bin 0 -> 2196 bytes static/img/logo.png | Bin 0 -> 4577 bytes static/img/more.png | Bin 0 -> 3037 bytes static/img/qq.png | Bin 0 -> 62363 bytes static/img/sinaweibo.png | Bin 0 -> 4513 bytes static/img/univerify.png | Bin 0 -> 232345 bytes static/img/user.png | Bin 0 -> 4793 bytes static/img/userHL.png | Bin 0 -> 4214 bytes static/img/weixin.png | Bin 0 -> 2421 bytes static/logo.png | Bin 0 -> 4023 bytes static/template.png | Bin 0 -> 461 bytes static/templateHL.png | Bin 0 -> 459 bytes static/text-icon.ttf | Bin 0 -> 3512 bytes static/uni-center/logo.png | Bin 0 -> 4577 bytes static/uni.png | Bin 0 -> 4162 bytes static/uni.ttf | Bin 0 -> 26164 bytes store/index.js | 20 + store/modules/user.js | 42 + uni.scss | 76 + .../uni-analyse-searchhot/index.js | 49 + .../uni-analyse-searchhot/package.json | 14 + .../cloudfunctions/user-center/index.js | 210 +++ .../user-center/package-lock.json | 14 + .../cloudfunctions/user-center/package.json | 15 + .../database/JQL\346\237\245\350\257\242.jql" | 9 + uniCloud-aliyun/database/db_init.json | 163 ++ .../database/opendb-banner.schema.json | 54 + .../database/opendb-mall-goods.schema.json | 123 ++ .../database/opendb-news-articles.schema.json | 175 +++ .../opendb-news-categories.schema.json | 50 + .../database/opendb-news-comments.schema.json | 68 + .../database/opendb-news-favorite.schema.json | 35 + .../database/opendb-search-hot.schema.json | 27 + .../database/opendb-search-log.schema.json | 31 + .../database/opendb-verify-codes.schema.json | 45 + .../database/uni-id-log.schema.json | 41 + .../database/uni-id-users.schema.json | 269 ++++ uni_modules/m-icon/m-icon.css | 378 +++++ uni_modules/m-icon/m-icon.vue | 23 + uni_modules/m-input.vue | 125 ++ uni_modules/uni-badge/changelog.md | 2 + .../components/uni-badge/uni-badge.vue | 156 ++ uni_modules/uni-badge/package.json | 83 + uni_modules/uni-badge/readme.md | 43 + uni_modules/uni-calendar/changelog.md | 2 + .../components/uni-calendar/calendar.js | 546 +++++++ .../uni-calendar/uni-calendar-item.vue | 170 ++ .../components/uni-calendar/uni-calendar.vue | 505 ++++++ .../components/uni-calendar/util.js | 352 +++++ uni_modules/uni-calendar/package.json | 81 + uni_modules/uni-calendar/readme.md | 96 ++ uni_modules/uni-captcha/changelog.md | 2 + uni_modules/uni-captcha/package.json | 80 + uni_modules/uni-captcha/readme.md | 92 ++ .../common/uni-captcha/LICENSE.md | 201 +++ .../common/uni-captcha/index.js | 1 + .../common/uni-captcha/package.json | 13 + uni_modules/uni-card/changelog.md | 2 + .../uni-card/components/uni-card/uni-card.vue | 406 +++++ uni_modules/uni-card/package.json | 81 + uni_modules/uni-card/readme.md | 97 ++ uni_modules/uni-clientDB/db_init.json | 0 uni_modules/uni-clientDB/license.md | 30 + uni_modules/uni-clientDB/package.json | 16 + uni_modules/uni-clientDB/pages.json | 0 uni_modules/uni-clientDB/readme.md | 248 +++ uni_modules/uni-collapse/changelog.md | 4 + .../uni-collapse-item/uni-collapse-item.vue | 220 +++ .../components/uni-collapse/uni-collapse.vue | 59 + uni_modules/uni-collapse/package.json | 84 + uni_modules/uni-collapse/readme.md | 107 ++ uni_modules/uni-combox/changelog.md | 4 + .../components/uni-combox/uni-combox.vue | 218 +++ uni_modules/uni-combox/package.json | 82 + uni_modules/uni-combox/readme.md | 46 + uni_modules/uni-countdown/changelog.md | 2 + .../uni-countdown/uni-countdown.vue | 211 +++ uni_modules/uni-countdown/package.json | 81 + uni_modules/uni-countdown/readme.md | 50 + uni_modules/uni-data-checkbox/changelog.md | 8 + .../uni-data-checkbox/uni-data-checkbox.vue | 785 ++++++++++ uni_modules/uni-data-checkbox/package.json | 81 + uni_modules/uni-data-checkbox/readme.md | 291 ++++ uni_modules/uni-data-picker/changelog.md | 8 + .../components/uni-data-picker/config.json | 12 + .../components/uni-data-picker/keypress.js | 45 + .../uni-data-picker/uni-data-picker.vue | 462 ++++++ .../uni-data-pickerview/uni-data-picker.js | 468 ++++++ .../uni-data-pickerview.vue | 289 ++++ uni_modules/uni-data-picker/package.json | 86 + uni_modules/uni-data-picker/readme.md | 253 +++ uni_modules/uni-dateformat/changelog.md | 3 + .../components/uni-dateformat/date-format.js | 197 +++ .../uni-dateformat/uni-dateformat.vue | 90 ++ uni_modules/uni-dateformat/package.json | 83 + uni_modules/uni-dateformat/readme.md | 71 + uni_modules/uni-datetime-picker/changelog.md | 6 + .../uni-datetime-picker/keypress.js | 45 + .../uni-datetime-picker.vue | 903 +++++++++++ uni_modules/uni-datetime-picker/package.json | 82 + uni_modules/uni-datetime-picker/readme.md | 61 + uni_modules/uni-drawer/changelog.md | 2 + .../components/uni-drawer/keypress.js | 45 + .../components/uni-drawer/uni-drawer.vue | 181 +++ uni_modules/uni-drawer/package.json | 83 + uni_modules/uni-drawer/readme.md | 59 + uni_modules/uni-easyinput/changelog.md | 3 + .../components/uni-easyinput/common.js | 56 + .../uni-easyinput/uni-easyinput.vue | 427 +++++ uni_modules/uni-easyinput/package.json | 83 + uni_modules/uni-easyinput/readme.md | 192 +++ uni_modules/uni-fab/changelog.md | 4 + .../uni-fab/components/uni-fab/uni-fab.vue | 447 ++++++ .../components/uni-fab/uni-fab.vue.bak | 383 +++++ uni_modules/uni-fab/package.json | 82 + uni_modules/uni-fab/readme.md | 84 + uni_modules/uni-fav/changelog.md | 6 + .../uni-fav/components/uni-fav/uni-fav.vue | 139 ++ uni_modules/uni-fav/package.json | 81 + uni_modules/uni-fav/readme.md | 44 + uni_modules/uni-field/changelog.md | 0 .../components/uni-field/uni-field.vue | 712 +++++++++ uni_modules/uni-field/package.json | 79 + uni_modules/uni-field/readme.md | 165 ++ uni_modules/uni-file-picker/changelog.md | 3 + .../uni-file-picker/choose-and-upload-file.js | 186 +++ .../uni-file-picker/uni-file-picker.vue | 646 ++++++++ .../uni-file-picker/upload-file.vue | 325 ++++ .../uni-file-picker/upload-image.vue | 289 ++++ uni_modules/uni-file-picker/package.json | 82 + uni_modules/uni-file-picker/readme.md | 294 ++++ uni_modules/uni-forms/changelog.md | 8 + .../uni-forms-item/uni-forms-item.vue | 453 ++++++ .../components/uni-forms/uni-forms.vue | 456 ++++++ .../components/uni-forms/validate.js | 472 ++++++ uni_modules/uni-forms/package.json | 86 + uni_modules/uni-forms/readme.md | 533 +++++++ uni_modules/uni-goods-nav/changelog.md | 4 + .../uni-goods-nav/uni-goods-nav.vue | 227 +++ uni_modules/uni-goods-nav/package.json | 81 + uni_modules/uni-goods-nav/readme.md | 107 ++ uni_modules/uni-grid/changelog.md | 2 + .../uni-grid-item/uni-grid-item.vue | 127 ++ .../uni-grid/components/uni-grid/uni-grid.vue | 141 ++ uni_modules/uni-grid/package.json | 82 + uni_modules/uni-grid/readme.md | 88 ++ uni_modules/uni-group/changelog.md | 3 + .../components/uni-group/uni-group.vue | 128 ++ uni_modules/uni-group/package.json | 82 + uni_modules/uni-group/readme.md | 48 + uni_modules/uni-icons/changelog.md | 2 + .../uni-icons/components/uni-icons/icons.js | 132 ++ .../components/uni-icons/uni-icons.vue | 71 + .../uni-icons/components/uni-icons/uni.ttf | Bin 0 -> 26164 bytes uni_modules/uni-icons/package.json | 81 + uni_modules/uni-icons/readme.md | 43 + uni_modules/uni-id/changelog.md | 2 + uni_modules/uni-id/package.json | 80 + uni_modules/uni-id/readme.md | 33 + .../cloudfunctions/common/uni-id/LICENSE.md | 201 +++ .../cloudfunctions/common/uni-id/config.json | 44 + .../cloudfunctions/common/uni-id/index.js | 1 + .../cloudfunctions/common/uni-id/package.json | 13 + uni_modules/uni-indexed-list/changelog.md | 5 + .../uni-indexed-list-item.vue | 141 ++ .../uni-indexed-list/uni-indexed-list.vue | 358 +++++ uni_modules/uni-indexed-list/package.json | 82 + uni_modules/uni-indexed-list/readme.md | 61 + uni_modules/uni-link/changelog.md | 5 + .../uni-link/components/uni-link/uni-link.vue | 111 ++ uni_modules/uni-link/package.json | 82 + uni_modules/uni-link/readme.md | 41 + uni_modules/uni-list-detail/db_init.json | 30 + uni_modules/uni-list-detail/license.md | 30 + uni_modules/uni-list-detail/package.json | 24 + uni_modules/uni-list-detail/pages.json | 24 + uni_modules/uni-list-detail/readme.md | 52 + .../uni-list-news-title-image/db_init.json | 427 +++++ .../uni-list-news-title-image/license.md | 30 + .../uni-list-news-title-image/package.json | 24 + .../uni-list-news-title-image/pages.json | 11 + .../uni-list-news-title-image/readme.md | 94 ++ uni_modules/uni-list/changelog.md | 5 + .../components/uni-list-ad/uni-list-ad.vue | 107 ++ .../uni-list-chat/uni-list-chat.scss | 58 + .../uni-list-chat/uni-list-chat.vue | 533 +++++++ .../uni-list-item/uni-list-item.vue | 438 ++++++ .../uni-list/components/uni-list/uni-list.vue | 106 ++ .../components/uni-list/uni-refresh.vue | 65 + .../components/uni-list/uni-refresh.wxs | 87 ++ uni_modules/uni-list/package.json | 85 + uni_modules/uni-list/readme.md | 340 ++++ uni_modules/uni-load-more/changelog.md | 2 + .../uni-load-more/uni-load-more.vue | 359 +++++ uni_modules/uni-load-more/package.json | 82 + uni_modules/uni-load-more/readme.md | 63 + uni_modules/uni-nav-bar/changelog.md | 6 + .../components/uni-nav-bar/uni-nav-bar.vue | 243 +++ .../components/uni-nav-bar/uni-status-bar.vue | 25 + uni_modules/uni-nav-bar/package.json | 82 + uni_modules/uni-nav-bar/readme.md | 67 + uni_modules/uni-notice-bar/changelog.md | 4 + .../uni-notice-bar/uni-notice-bar.vue | 397 +++++ uni_modules/uni-notice-bar/package.json | 83 + uni_modules/uni-notice-bar/readme.md | 64 + uni_modules/uni-number-box/changelog.md | 7 + .../uni-number-box/uni-number-box.vue | 213 +++ uni_modules/uni-number-box/package.json | 81 + uni_modules/uni-number-box/readme.md | 43 + uni_modules/uni-pagination/changelog.md | 4 + .../uni-pagination/uni-pagination.vue | 206 +++ uni_modules/uni-pagination/package.json | 82 + uni_modules/uni-pagination/readme.md | 42 + uni_modules/uni-popup/changelog.md | 8 + .../components/uni-popup-dialog/keypress.js | 45 + .../uni-popup-dialog/uni-popup-dialog.vue | 290 ++++ .../uni-popup-message/uni-popup-message.vue | 138 ++ .../uni-popup-share/uni-popup-share.vue | 165 ++ .../components/uni-popup/keypress.js | 45 + .../uni-popup/components/uni-popup/message.js | 22 + .../uni-popup/components/uni-popup/popup.js | 50 + .../uni-popup/components/uni-popup/share.js | 16 + .../components/uni-popup/uni-popup.vue | 321 ++++ uni_modules/uni-popup/package.json | 84 + uni_modules/uni-popup/readme.md | 294 ++++ uni_modules/uni-rate/changelog.md | 5 + .../uni-rate/components/uni-rate/uni-rate.vue | 380 +++++ uni_modules/uni-rate/package.json | 81 + uni_modules/uni-rate/readme.md | 100 ++ uni_modules/uni-row/changelog.md | 3 + .../uni-row/components/uni-col/uni-col.vue | 316 ++++ .../uni-row/components/uni-row/uni-row.vue | 189 +++ uni_modules/uni-row/package.json | 84 + uni_modules/uni-row/readme.md | 176 +++ uni_modules/uni-search-bar/changelog.md | 10 + .../uni-search-bar/uni-search-bar.vue | 251 +++ uni_modules/uni-search-bar/package.json | 82 + uni_modules/uni-search-bar/readme.md | 75 + uni_modules/uni-section/changelog.md | 0 .../components/uni-section/uni-section.vue | 139 ++ uni_modules/uni-section/package.json | 79 + uni_modules/uni-section/readme.md | 33 + .../uni-segmented-control/changelog.md | 2 + .../uni-segmented-control.vue | 141 ++ .../uni-segmented-control/package.json | 82 + uni_modules/uni-segmented-control/readme.md | 54 + uni_modules/uni-steps/changelog.md | 4 + .../components/uni-steps/uni-steps.vue | 252 +++ uni_modules/uni-steps/package.json | 82 + uni_modules/uni-steps/readme.md | 43 + uni_modules/uni-swipe-action/changelog.md | 7 + .../uni-swipe-action-item/bindingx.js | 292 ++++ .../uni-swipe-action-item/index.wxs | 318 ++++ .../components/uni-swipe-action-item/isPC.js | 12 + .../uni-swipe-action-item/mpalipay.js | 207 +++ .../uni-swipe-action-item/mpother.js | 252 +++ .../components/uni-swipe-action-item/mpwxs.js | 135 ++ .../uni-swipe-action-item.vue | 383 +++++ .../uni-swipe-action/uni-swipe-action.vue | 42 + uni_modules/uni-swipe-action/package.json | 84 + uni_modules/uni-swipe-action/readme.md | 161 ++ uni_modules/uni-swiper-dot/changelog.md | 4 + .../uni-swiper-dot/uni-swiper-dot.vue | 215 +++ uni_modules/uni-swiper-dot/package.json | 83 + uni_modules/uni-swiper-dot/readme.md | 84 + uni_modules/uni-table/changelog.md | 4 + .../components/uni-table/uni-table.vue | 276 ++++ .../uni-table/components/uni-td/uni-td.vue | 74 + .../uni-table/components/uni-th/uni-th.vue | 80 + .../uni-table/components/uni-tr/uni-tr.vue | 129 ++ uni_modules/uni-table/package.json | 83 + uni_modules/uni-table/readme.md | 104 ++ uni_modules/uni-tag/changelog.md | 2 + .../uni-tag/components/uni-tag/uni-tag.vue | 237 +++ uni_modules/uni-tag/package.json | 84 + uni_modules/uni-tag/readme.md | 43 + uni_modules/uni-test/changelog.md | 6 + uni_modules/uni-test/package.json | 122 ++ uni_modules/uni-test/readme.md | 290 ++++ uni_modules/uni-title/changelog.md | 2 + .../components/uni-title/uni-title.vue | 170 ++ uni_modules/uni-title/package.json | 82 + uni_modules/uni-title/readme.md | 65 + uni_modules/uni-transition/changelog.md | 2 + .../uni-transition/uni-transition.vue | 280 ++++ uni_modules/uni-transition/package.json | 82 + uni_modules/uni-transition/readme.md | 84 + uni_modules/uni-ui/changelog.md | 34 + .../uni-ui/components/uni-ui/uni-ui.vue | 7 + uni_modules/uni-ui/package.json | 124 ++ uni_modules/uni-ui/readme.md | 167 ++ 379 files changed, 47589 insertions(+) create mode 100644 .gitignore create mode 100644 App.vue create mode 100644 changelog.md create mode 100644 common/login.css create mode 100644 common/uni-ui.scss create mode 100644 common/univerify.js create mode 100644 common/uqrcode.js create mode 100644 common/utils.js create mode 100644 components/m-icon/m-icon.css create mode 100644 components/m-icon/m-icon.vue create mode 100644 components/m-input.vue create mode 100644 components/u-parse/components/wxParseAudio.vue create mode 100644 components/u-parse/components/wxParseImg.vue create mode 100644 components/u-parse/components/wxParseTable.vue create mode 100644 components/u-parse/components/wxParseTemplate0.vue create mode 100644 components/u-parse/components/wxParseTemplate1.vue create mode 100644 components/u-parse/components/wxParseTemplate10.vue create mode 100644 components/u-parse/components/wxParseTemplate11.vue create mode 100644 components/u-parse/components/wxParseTemplate2.vue create mode 100644 components/u-parse/components/wxParseTemplate3.vue create mode 100644 components/u-parse/components/wxParseTemplate4.vue create mode 100644 components/u-parse/components/wxParseTemplate5.vue create mode 100644 components/u-parse/components/wxParseTemplate6.vue create mode 100644 components/u-parse/components/wxParseTemplate7.vue create mode 100644 components/u-parse/components/wxParseTemplate8.vue create mode 100644 components/u-parse/components/wxParseTemplate9.vue create mode 100644 components/u-parse/components/wxParseVideo.vue create mode 100644 components/u-parse/libs/html2json.js create mode 100644 components/u-parse/libs/htmlparser.js create mode 100644 components/u-parse/libs/wxDiscode.js create mode 100644 components/u-parse/parse.css create mode 100644 components/u-parse/parse.vue create mode 100644 components/uni-badge/uni-badge.vue create mode 100644 components/uni-clientdb/license.md create mode 100644 components/uni-clientdb/uni-clientdb.vue create mode 100644 components/uni-forms-item/uni-forms-item.vue create mode 100644 components/uni-forms/uni-forms.vue create mode 100644 components/uni-forms/validate.js create mode 100644 components/uni-icons/icons.js create mode 100644 components/uni-icons/uni-icons.vue create mode 100644 components/uni-list-item/uni-list-item.vue create mode 100644 components/uni-list/uni-list.vue create mode 100644 components/uni-list/uni-refresh.vue create mode 100644 components/uni-list/uni-refresh.wxs create mode 100644 components/uni-load-more/config.json create mode 100644 components/uni-load-more/readme.md create mode 100644 components/uni-load-more/uni-load-more.vue create mode 100644 components/uni-qrcode/uni-qrcode.vue create mode 100644 components/uni-section/config.json create mode 100644 components/uni-section/readme.md create mode 100644 components/uni-section/uni-section.vue create mode 100644 main.js create mode 100644 manifest.json create mode 100644 package.json create mode 100644 pages.json create mode 100644 pages/grid/banner.json create mode 100644 pages/grid/grid.nvue create mode 100644 pages/index/index.vue create mode 100644 pages/invite-reg/invite-reg.vue create mode 100644 pages/invite/invite.vue create mode 100644 pages/invited-user/invited-user.vue create mode 100644 pages/list-news/list-news.vue create mode 100644 pages/list/detail.vue create mode 100644 pages/list/list.nvue create mode 100644 pages/login/login.vue create mode 100644 pages/main/main.vue create mode 100644 pages/pwd/pwd.vue create mode 100644 pages/pwd/update-password.vue create mode 100644 pages/reg/reg.vue create mode 100644 pages/search/search.nvue create mode 100644 pages/ucenter/ucenter.nvue create mode 100644 pages/uni-feedback/uni-feedback.nvue create mode 100644 pages/user/user.vue create mode 100644 static/api.png create mode 100644 static/apiHL.png create mode 100644 static/c1.png create mode 100644 static/c2.png create mode 100644 static/c3.png create mode 100644 static/c4.png create mode 100644 static/c5.png create mode 100644 static/c6.png create mode 100644 static/c7.png create mode 100644 static/c8.png create mode 100644 static/c9.png create mode 100644 static/component.png create mode 100644 static/componentHL.png create mode 100644 static/img/apple.png create mode 100644 static/img/home.png create mode 100644 static/img/homeHL.png create mode 100644 static/img/logo.png create mode 100644 static/img/more.png create mode 100644 static/img/qq.png create mode 100644 static/img/sinaweibo.png create mode 100644 static/img/univerify.png create mode 100644 static/img/user.png create mode 100644 static/img/userHL.png create mode 100644 static/img/weixin.png create mode 100644 static/logo.png create mode 100644 static/template.png create mode 100644 static/templateHL.png create mode 100644 static/text-icon.ttf create mode 100644 static/uni-center/logo.png create mode 100644 static/uni.png create mode 100644 static/uni.ttf create mode 100644 store/index.js create mode 100644 store/modules/user.js create mode 100644 uni.scss create mode 100644 uniCloud-aliyun/cloudfunctions/uni-analyse-searchhot/index.js create mode 100644 uniCloud-aliyun/cloudfunctions/uni-analyse-searchhot/package.json create mode 100644 uniCloud-aliyun/cloudfunctions/user-center/index.js create mode 100644 uniCloud-aliyun/cloudfunctions/user-center/package-lock.json create mode 100644 uniCloud-aliyun/cloudfunctions/user-center/package.json create mode 100644 "uniCloud-aliyun/database/JQL\346\237\245\350\257\242.jql" create mode 100644 uniCloud-aliyun/database/db_init.json create mode 100644 uniCloud-aliyun/database/opendb-banner.schema.json create mode 100644 uniCloud-aliyun/database/opendb-mall-goods.schema.json create mode 100644 uniCloud-aliyun/database/opendb-news-articles.schema.json create mode 100644 uniCloud-aliyun/database/opendb-news-categories.schema.json create mode 100644 uniCloud-aliyun/database/opendb-news-comments.schema.json create mode 100644 uniCloud-aliyun/database/opendb-news-favorite.schema.json create mode 100644 uniCloud-aliyun/database/opendb-search-hot.schema.json create mode 100644 uniCloud-aliyun/database/opendb-search-log.schema.json create mode 100644 uniCloud-aliyun/database/opendb-verify-codes.schema.json create mode 100644 uniCloud-aliyun/database/uni-id-log.schema.json create mode 100644 uniCloud-aliyun/database/uni-id-users.schema.json create mode 100644 uni_modules/m-icon/m-icon.css create mode 100644 uni_modules/m-icon/m-icon.vue create mode 100644 uni_modules/m-input.vue create mode 100644 uni_modules/uni-badge/changelog.md create mode 100644 uni_modules/uni-badge/components/uni-badge/uni-badge.vue create mode 100644 uni_modules/uni-badge/package.json create mode 100644 uni_modules/uni-badge/readme.md create mode 100644 uni_modules/uni-calendar/changelog.md create mode 100644 uni_modules/uni-calendar/components/uni-calendar/calendar.js create mode 100644 uni_modules/uni-calendar/components/uni-calendar/uni-calendar-item.vue create mode 100644 uni_modules/uni-calendar/components/uni-calendar/uni-calendar.vue create mode 100644 uni_modules/uni-calendar/components/uni-calendar/util.js create mode 100644 uni_modules/uni-calendar/package.json create mode 100644 uni_modules/uni-calendar/readme.md create mode 100644 uni_modules/uni-captcha/changelog.md create mode 100644 uni_modules/uni-captcha/package.json create mode 100644 uni_modules/uni-captcha/readme.md create mode 100644 uni_modules/uni-captcha/uniCloud/cloudfunctions/common/uni-captcha/LICENSE.md create mode 100644 uni_modules/uni-captcha/uniCloud/cloudfunctions/common/uni-captcha/index.js create mode 100644 uni_modules/uni-captcha/uniCloud/cloudfunctions/common/uni-captcha/package.json create mode 100644 uni_modules/uni-card/changelog.md create mode 100644 uni_modules/uni-card/components/uni-card/uni-card.vue create mode 100644 uni_modules/uni-card/package.json create mode 100644 uni_modules/uni-card/readme.md create mode 100644 uni_modules/uni-clientDB/db_init.json create mode 100644 uni_modules/uni-clientDB/license.md create mode 100644 uni_modules/uni-clientDB/package.json create mode 100644 uni_modules/uni-clientDB/pages.json create mode 100644 uni_modules/uni-clientDB/readme.md create mode 100644 uni_modules/uni-collapse/changelog.md create mode 100644 uni_modules/uni-collapse/components/uni-collapse-item/uni-collapse-item.vue create mode 100644 uni_modules/uni-collapse/components/uni-collapse/uni-collapse.vue create mode 100644 uni_modules/uni-collapse/package.json create mode 100644 uni_modules/uni-collapse/readme.md create mode 100644 uni_modules/uni-combox/changelog.md create mode 100644 uni_modules/uni-combox/components/uni-combox/uni-combox.vue create mode 100644 uni_modules/uni-combox/package.json create mode 100644 uni_modules/uni-combox/readme.md create mode 100644 uni_modules/uni-countdown/changelog.md create mode 100644 uni_modules/uni-countdown/components/uni-countdown/uni-countdown.vue create mode 100644 uni_modules/uni-countdown/package.json create mode 100644 uni_modules/uni-countdown/readme.md create mode 100644 uni_modules/uni-data-checkbox/changelog.md create mode 100644 uni_modules/uni-data-checkbox/components/uni-data-checkbox/uni-data-checkbox.vue create mode 100644 uni_modules/uni-data-checkbox/package.json create mode 100644 uni_modules/uni-data-checkbox/readme.md create mode 100644 uni_modules/uni-data-picker/changelog.md create mode 100644 uni_modules/uni-data-picker/components/uni-data-picker/config.json create mode 100644 uni_modules/uni-data-picker/components/uni-data-picker/keypress.js create mode 100644 uni_modules/uni-data-picker/components/uni-data-picker/uni-data-picker.vue create mode 100644 uni_modules/uni-data-picker/components/uni-data-pickerview/uni-data-picker.js create mode 100644 uni_modules/uni-data-picker/components/uni-data-pickerview/uni-data-pickerview.vue create mode 100644 uni_modules/uni-data-picker/package.json create mode 100644 uni_modules/uni-data-picker/readme.md create mode 100644 uni_modules/uni-dateformat/changelog.md create mode 100644 uni_modules/uni-dateformat/components/uni-dateformat/date-format.js create mode 100644 uni_modules/uni-dateformat/components/uni-dateformat/uni-dateformat.vue create mode 100644 uni_modules/uni-dateformat/package.json create mode 100644 uni_modules/uni-dateformat/readme.md create mode 100644 uni_modules/uni-datetime-picker/changelog.md create mode 100644 uni_modules/uni-datetime-picker/components/uni-datetime-picker/keypress.js create mode 100644 uni_modules/uni-datetime-picker/components/uni-datetime-picker/uni-datetime-picker.vue create mode 100644 uni_modules/uni-datetime-picker/package.json create mode 100644 uni_modules/uni-datetime-picker/readme.md create mode 100644 uni_modules/uni-drawer/changelog.md create mode 100644 uni_modules/uni-drawer/components/uni-drawer/keypress.js create mode 100644 uni_modules/uni-drawer/components/uni-drawer/uni-drawer.vue create mode 100644 uni_modules/uni-drawer/package.json create mode 100644 uni_modules/uni-drawer/readme.md create mode 100644 uni_modules/uni-easyinput/changelog.md create mode 100644 uni_modules/uni-easyinput/components/uni-easyinput/common.js create mode 100644 uni_modules/uni-easyinput/components/uni-easyinput/uni-easyinput.vue create mode 100644 uni_modules/uni-easyinput/package.json create mode 100644 uni_modules/uni-easyinput/readme.md create mode 100644 uni_modules/uni-fab/changelog.md create mode 100644 uni_modules/uni-fab/components/uni-fab/uni-fab.vue create mode 100644 uni_modules/uni-fab/components/uni-fab/uni-fab.vue.bak create mode 100644 uni_modules/uni-fab/package.json create mode 100644 uni_modules/uni-fab/readme.md create mode 100644 uni_modules/uni-fav/changelog.md create mode 100644 uni_modules/uni-fav/components/uni-fav/uni-fav.vue create mode 100644 uni_modules/uni-fav/package.json create mode 100644 uni_modules/uni-fav/readme.md create mode 100644 uni_modules/uni-field/changelog.md create mode 100644 uni_modules/uni-field/components/uni-field/uni-field.vue create mode 100644 uni_modules/uni-field/package.json create mode 100644 uni_modules/uni-field/readme.md create mode 100644 uni_modules/uni-file-picker/changelog.md create mode 100644 uni_modules/uni-file-picker/components/uni-file-picker/choose-and-upload-file.js create mode 100644 uni_modules/uni-file-picker/components/uni-file-picker/uni-file-picker.vue create mode 100644 uni_modules/uni-file-picker/components/uni-file-picker/upload-file.vue create mode 100644 uni_modules/uni-file-picker/components/uni-file-picker/upload-image.vue create mode 100644 uni_modules/uni-file-picker/package.json create mode 100644 uni_modules/uni-file-picker/readme.md create mode 100644 uni_modules/uni-forms/changelog.md create mode 100644 uni_modules/uni-forms/components/uni-forms-item/uni-forms-item.vue create mode 100644 uni_modules/uni-forms/components/uni-forms/uni-forms.vue create mode 100644 uni_modules/uni-forms/components/uni-forms/validate.js create mode 100644 uni_modules/uni-forms/package.json create mode 100644 uni_modules/uni-forms/readme.md create mode 100644 uni_modules/uni-goods-nav/changelog.md create mode 100644 uni_modules/uni-goods-nav/components/uni-goods-nav/uni-goods-nav.vue create mode 100644 uni_modules/uni-goods-nav/package.json create mode 100644 uni_modules/uni-goods-nav/readme.md create mode 100644 uni_modules/uni-grid/changelog.md create mode 100644 uni_modules/uni-grid/components/uni-grid-item/uni-grid-item.vue create mode 100644 uni_modules/uni-grid/components/uni-grid/uni-grid.vue create mode 100644 uni_modules/uni-grid/package.json create mode 100644 uni_modules/uni-grid/readme.md create mode 100644 uni_modules/uni-group/changelog.md create mode 100644 uni_modules/uni-group/components/uni-group/uni-group.vue create mode 100644 uni_modules/uni-group/package.json create mode 100644 uni_modules/uni-group/readme.md create mode 100644 uni_modules/uni-icons/changelog.md create mode 100644 uni_modules/uni-icons/components/uni-icons/icons.js create mode 100644 uni_modules/uni-icons/components/uni-icons/uni-icons.vue create mode 100644 uni_modules/uni-icons/components/uni-icons/uni.ttf create mode 100644 uni_modules/uni-icons/package.json create mode 100644 uni_modules/uni-icons/readme.md create mode 100644 uni_modules/uni-id/changelog.md create mode 100644 uni_modules/uni-id/package.json create mode 100644 uni_modules/uni-id/readme.md create mode 100644 uni_modules/uni-id/uniCloud/cloudfunctions/common/uni-id/LICENSE.md create mode 100644 uni_modules/uni-id/uniCloud/cloudfunctions/common/uni-id/config.json create mode 100644 uni_modules/uni-id/uniCloud/cloudfunctions/common/uni-id/index.js create mode 100644 uni_modules/uni-id/uniCloud/cloudfunctions/common/uni-id/package.json create mode 100644 uni_modules/uni-indexed-list/changelog.md create mode 100644 uni_modules/uni-indexed-list/components/uni-indexed-list/uni-indexed-list-item.vue create mode 100644 uni_modules/uni-indexed-list/components/uni-indexed-list/uni-indexed-list.vue create mode 100644 uni_modules/uni-indexed-list/package.json create mode 100644 uni_modules/uni-indexed-list/readme.md create mode 100644 uni_modules/uni-link/changelog.md create mode 100644 uni_modules/uni-link/components/uni-link/uni-link.vue create mode 100644 uni_modules/uni-link/package.json create mode 100644 uni_modules/uni-link/readme.md create mode 100644 uni_modules/uni-list-detail/db_init.json create mode 100644 uni_modules/uni-list-detail/license.md create mode 100644 uni_modules/uni-list-detail/package.json create mode 100644 uni_modules/uni-list-detail/pages.json create mode 100644 uni_modules/uni-list-detail/readme.md create mode 100644 uni_modules/uni-list-news-title-image/db_init.json create mode 100644 uni_modules/uni-list-news-title-image/license.md create mode 100644 uni_modules/uni-list-news-title-image/package.json create mode 100644 uni_modules/uni-list-news-title-image/pages.json create mode 100644 uni_modules/uni-list-news-title-image/readme.md create mode 100644 uni_modules/uni-list/changelog.md create mode 100644 uni_modules/uni-list/components/uni-list-ad/uni-list-ad.vue create mode 100644 uni_modules/uni-list/components/uni-list-chat/uni-list-chat.scss create mode 100644 uni_modules/uni-list/components/uni-list-chat/uni-list-chat.vue create mode 100644 uni_modules/uni-list/components/uni-list-item/uni-list-item.vue create mode 100644 uni_modules/uni-list/components/uni-list/uni-list.vue create mode 100644 uni_modules/uni-list/components/uni-list/uni-refresh.vue create mode 100644 uni_modules/uni-list/components/uni-list/uni-refresh.wxs create mode 100644 uni_modules/uni-list/package.json create mode 100644 uni_modules/uni-list/readme.md create mode 100644 uni_modules/uni-load-more/changelog.md create mode 100644 uni_modules/uni-load-more/components/uni-load-more/uni-load-more.vue create mode 100644 uni_modules/uni-load-more/package.json create mode 100644 uni_modules/uni-load-more/readme.md create mode 100644 uni_modules/uni-nav-bar/changelog.md create mode 100644 uni_modules/uni-nav-bar/components/uni-nav-bar/uni-nav-bar.vue create mode 100644 uni_modules/uni-nav-bar/components/uni-nav-bar/uni-status-bar.vue create mode 100644 uni_modules/uni-nav-bar/package.json create mode 100644 uni_modules/uni-nav-bar/readme.md create mode 100644 uni_modules/uni-notice-bar/changelog.md create mode 100644 uni_modules/uni-notice-bar/components/uni-notice-bar/uni-notice-bar.vue create mode 100644 uni_modules/uni-notice-bar/package.json create mode 100644 uni_modules/uni-notice-bar/readme.md create mode 100644 uni_modules/uni-number-box/changelog.md create mode 100644 uni_modules/uni-number-box/components/uni-number-box/uni-number-box.vue create mode 100644 uni_modules/uni-number-box/package.json create mode 100644 uni_modules/uni-number-box/readme.md create mode 100644 uni_modules/uni-pagination/changelog.md create mode 100644 uni_modules/uni-pagination/components/uni-pagination/uni-pagination.vue create mode 100644 uni_modules/uni-pagination/package.json create mode 100644 uni_modules/uni-pagination/readme.md create mode 100644 uni_modules/uni-popup/changelog.md create mode 100644 uni_modules/uni-popup/components/uni-popup-dialog/keypress.js create mode 100644 uni_modules/uni-popup/components/uni-popup-dialog/uni-popup-dialog.vue create mode 100644 uni_modules/uni-popup/components/uni-popup-message/uni-popup-message.vue create mode 100644 uni_modules/uni-popup/components/uni-popup-share/uni-popup-share.vue create mode 100644 uni_modules/uni-popup/components/uni-popup/keypress.js create mode 100644 uni_modules/uni-popup/components/uni-popup/message.js create mode 100644 uni_modules/uni-popup/components/uni-popup/popup.js create mode 100644 uni_modules/uni-popup/components/uni-popup/share.js create mode 100644 uni_modules/uni-popup/components/uni-popup/uni-popup.vue create mode 100644 uni_modules/uni-popup/package.json create mode 100644 uni_modules/uni-popup/readme.md create mode 100644 uni_modules/uni-rate/changelog.md create mode 100644 uni_modules/uni-rate/components/uni-rate/uni-rate.vue create mode 100644 uni_modules/uni-rate/package.json create mode 100644 uni_modules/uni-rate/readme.md create mode 100644 uni_modules/uni-row/changelog.md create mode 100644 uni_modules/uni-row/components/uni-col/uni-col.vue create mode 100644 uni_modules/uni-row/components/uni-row/uni-row.vue create mode 100644 uni_modules/uni-row/package.json create mode 100644 uni_modules/uni-row/readme.md create mode 100644 uni_modules/uni-search-bar/changelog.md create mode 100644 uni_modules/uni-search-bar/components/uni-search-bar/uni-search-bar.vue create mode 100644 uni_modules/uni-search-bar/package.json create mode 100644 uni_modules/uni-search-bar/readme.md create mode 100644 uni_modules/uni-section/changelog.md create mode 100644 uni_modules/uni-section/components/uni-section/uni-section.vue create mode 100644 uni_modules/uni-section/package.json create mode 100644 uni_modules/uni-section/readme.md create mode 100644 uni_modules/uni-segmented-control/changelog.md create mode 100644 uni_modules/uni-segmented-control/components/uni-segmented-control/uni-segmented-control.vue create mode 100644 uni_modules/uni-segmented-control/package.json create mode 100644 uni_modules/uni-segmented-control/readme.md create mode 100644 uni_modules/uni-steps/changelog.md create mode 100644 uni_modules/uni-steps/components/uni-steps/uni-steps.vue create mode 100644 uni_modules/uni-steps/package.json create mode 100644 uni_modules/uni-steps/readme.md create mode 100644 uni_modules/uni-swipe-action/changelog.md create mode 100644 uni_modules/uni-swipe-action/components/uni-swipe-action-item/bindingx.js create mode 100644 uni_modules/uni-swipe-action/components/uni-swipe-action-item/index.wxs create mode 100644 uni_modules/uni-swipe-action/components/uni-swipe-action-item/isPC.js create mode 100644 uni_modules/uni-swipe-action/components/uni-swipe-action-item/mpalipay.js create mode 100644 uni_modules/uni-swipe-action/components/uni-swipe-action-item/mpother.js create mode 100644 uni_modules/uni-swipe-action/components/uni-swipe-action-item/mpwxs.js create mode 100644 uni_modules/uni-swipe-action/components/uni-swipe-action-item/uni-swipe-action-item.vue create mode 100644 uni_modules/uni-swipe-action/components/uni-swipe-action/uni-swipe-action.vue create mode 100644 uni_modules/uni-swipe-action/package.json create mode 100644 uni_modules/uni-swipe-action/readme.md create mode 100644 uni_modules/uni-swiper-dot/changelog.md create mode 100644 uni_modules/uni-swiper-dot/components/uni-swiper-dot/uni-swiper-dot.vue create mode 100644 uni_modules/uni-swiper-dot/package.json create mode 100644 uni_modules/uni-swiper-dot/readme.md create mode 100644 uni_modules/uni-table/changelog.md create mode 100644 uni_modules/uni-table/components/uni-table/uni-table.vue create mode 100644 uni_modules/uni-table/components/uni-td/uni-td.vue create mode 100644 uni_modules/uni-table/components/uni-th/uni-th.vue create mode 100644 uni_modules/uni-table/components/uni-tr/uni-tr.vue create mode 100644 uni_modules/uni-table/package.json create mode 100644 uni_modules/uni-table/readme.md create mode 100644 uni_modules/uni-tag/changelog.md create mode 100644 uni_modules/uni-tag/components/uni-tag/uni-tag.vue create mode 100644 uni_modules/uni-tag/package.json create mode 100644 uni_modules/uni-tag/readme.md create mode 100644 uni_modules/uni-test/changelog.md create mode 100644 uni_modules/uni-test/package.json create mode 100644 uni_modules/uni-test/readme.md create mode 100644 uni_modules/uni-title/changelog.md create mode 100644 uni_modules/uni-title/components/uni-title/uni-title.vue create mode 100644 uni_modules/uni-title/package.json create mode 100644 uni_modules/uni-title/readme.md create mode 100644 uni_modules/uni-transition/changelog.md create mode 100644 uni_modules/uni-transition/components/uni-transition/uni-transition.vue create mode 100644 uni_modules/uni-transition/package.json create mode 100644 uni_modules/uni-transition/readme.md create mode 100644 uni_modules/uni-ui/changelog.md create mode 100644 uni_modules/uni-ui/components/uni-ui/uni-ui.vue create mode 100644 uni_modules/uni-ui/package.json create mode 100644 uni_modules/uni-ui/readme.md diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..269295a --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +unpackage/ +.hbuilderx +node_modules +.DS_Store \ No newline at end of file diff --git a/App.vue b/App.vue new file mode 100644 index 0000000..42a70c2 --- /dev/null +++ b/App.vue @@ -0,0 +1,26 @@ + + + diff --git a/changelog.md b/changelog.md new file mode 100644 index 0000000..b4657f5 --- /dev/null +++ b/changelog.md @@ -0,0 +1,2 @@ +## 0.1.4(2021-03-01) +- 调整为uni_modules目录规范 diff --git a/common/login.css b/common/login.css new file mode 100644 index 0000000..f8b3557 --- /dev/null +++ b/common/login.css @@ -0,0 +1,504 @@ + + /* 头条小程序需要把 iconfont 样式放到组件外 */ + @font-face { + font-family: uniicons; + font-weight: normal; + font-style: normal; + src: url('/static/uni.ttf') format('truetype'); + } + + .m-icon { + font-family: uniicons; + /* font-size: 24px; */ + margin-left: 20px; + font-weight: normal; + font-style: normal; + line-height: 1; + display: inline-block; + text-decoration: none; + -webkit-font-smoothing: antialiased; + } + + .m-icon.uni-active { + color: #007aff; + } + + .m-icon-contact:before { + content: '\e100'; + } + + .m-icon-person:before { + content: '\e101'; + } + + .m-icon-personadd:before { + content: '\e102'; + } + + .m-icon-contact-filled:before { + content: '\e130'; + } + + .m-icon-person-filled:before { + content: '\e131'; + } + + .m-icon-personadd-filled:before { + content: '\e132'; + } + + .m-icon-phone:before { + content: '\e200'; + } + + .m-icon-email:before { + content: '\e201'; + } + + .m-icon-chatbubble:before { + content: '\e202'; + } + + .m-icon-chatboxes:before { + content: '\e203'; + } + + .m-icon-phone-filled:before { + content: '\e230'; + } + + .m-icon-email-filled:before { + content: '\e231'; + } + + .m-icon-chatbubble-filled:before { + content: '\e232'; + } + + .m-icon-chatboxes-filled:before { + content: '\e233'; + } + + .m-icon-weibo:before { + content: '\e260'; + } + + .m-icon-weixin:before { + content: '\e261'; + } + + .m-icon-pengyouquan:before { + content: '\e262'; + } + + .m-icon-chat:before { + content: '\e263'; + } + + .m-icon-qq:before { + content: '\e264'; + } + + .m-icon-videocam:before { + content: '\e300'; + } + + .m-icon-camera:before { + content: '\e301'; + } + + .m-icon-mic:before { + content: '\e302'; + } + + .m-icon-location:before { + content: '\e303'; + } + + .m-icon-mic-filled:before, + .m-icon-speech:before { + content: '\e332'; + } + + .m-icon-location-filled:before { + content: '\e333'; + } + + .m-icon-micoff:before { + content: '\e360'; + } + + .m-icon-image:before { + content: '\e363'; + } + + .m-icon-map:before { + content: '\e364'; + } + + .m-icon-compose:before { + content: '\e400'; + } + + .m-icon-trash:before { + content: '\e401'; + } + + .m-icon-upload:before { + content: '\e402'; + } + + .m-icon-download:before { + content: '\e403'; + } + + .m-icon-close:before { + content: '\e404'; + } + + .m-icon-redo:before { + content: '\e405'; + } + + .m-icon-undo:before { + content: '\e406'; + } + + .m-icon-refresh:before { + content: '\e407'; + } + + .m-icon-star:before { + content: '\e408'; + } + + .m-icon-plus:before { + content: '\e409'; + } + + .m-icon-minus:before { + content: '\e410'; + } + + .m-icon-circle:before, + .m-icon-checkbox:before { + content: '\e411'; + } + + .m-icon-close-filled:before, + .m-icon-clear:before { + content: '\e434'; + } + + .m-icon-refresh-filled:before { + content: '\e437'; + } + + .m-icon-star-filled:before { + content: '\e438'; + } + + .m-icon-plus-filled:before { + content: '\e439'; + } + + .m-icon-minus-filled:before { + content: '\e440'; + } + + .m-icon-circle-filled:before { + content: '\e441'; + } + + .m-icon-checkbox-filled:before { + content: '\e442'; + } + + .m-icon-closeempty:before { + content: '\e460'; + } + + .m-icon-refreshempty:before { + content: '\e461'; + } + + .m-icon-reload:before { + content: '\e462'; + } + + .m-icon-starhalf:before { + content: '\e463'; + } + + .m-icon-spinner:before { + content: '\e464'; + } + + .m-icon-spinner-cycle:before { + content: '\e465'; + } + + .m-icon-search:before { + content: '\e466'; + } + + .m-icon-plusempty:before { + content: '\e468'; + } + + .m-icon-forward:before { + content: '\e470'; + } + + .m-icon-back:before, + .m-icon-left-nav:before { + content: '\e471'; + } + + .m-icon-checkmarkempty:before { + content: '\e472'; + } + + .m-icon-home:before { + content: '\e500'; + } + + .m-icon-navigate:before { + content: '\e501'; + } + + .m-icon-gear:before { + content: '\e502'; + } + + .m-icon-paperplane:before { + content: '\e503'; + } + + .m-icon-info:before { + content: '\e504'; + } + + .m-icon-help:before { + content: '\e505'; + } + + .m-icon-locked:before { + content: '\e506'; + } + + .m-icon-more:before { + content: '\e507'; + } + + .m-icon-flag:before { + content: '\e508'; + } + + .m-icon-home-filled:before { + content: '\e530'; + } + + .m-icon-gear-filled:before { + content: '\e532'; + } + + .m-icon-info-filled:before { + content: '\e534'; + } + + .m-icon-help-filled:before { + content: '\e535'; + } + + .m-icon-more-filled:before { + content: '\e537'; + } + + .m-icon-settings:before { + content: '\e560'; + } + + .m-icon-list:before { + content: '\e562'; + } + + .m-icon-bars:before { + content: '\e563'; + } + + .m-icon-loop:before { + content: '\e565'; + } + + .m-icon-paperclip:before { + content: '\e567'; + } + + .m-icon-eye:before { + content: '\e568'; + } + + .m-icon-arrowup:before { + content: '\e580'; + } + + .m-icon-arrowdown:before { + content: '\e581'; + } + + .m-icon-arrowleft:before { + content: '\e582'; + } + + .m-icon-arrowright:before { + content: '\e583'; + } + + .m-icon-arrowthinup:before { + content: '\e584'; + } + + .m-icon-arrowthindown:before { + content: '\e585'; + } + + .m-icon-arrowthinleft:before { + content: '\e586'; + } + + .m-icon-arrowthinright:before { + content: '\e587'; + } + + .m-icon-pulldown:before { + content: '\e588'; + } + + .m-icon-scan:before { + content: "\e612"; + } + + + /*每个页面公共css */ + page { + min-height: 100%; + display: flex; + font-size: 14px; + } + + input, + textarea, + button { + font-size: 14px; + } + + /* #ifdef MP-BAIDU */ + page { + width: 100%; + height: 100%; + display: block; + } + + swan-template { + width: 100%; + min-height: 100%; + display: flex; + } + + /* 原生组件模式下需要注意组件外部样式 */ + custom-component { + width: 100%; + min-height: 100%; + display: flex; + } + + /* #endif */ + + /* #ifdef MP-ALIPAY */ + page { + min-height: 100vh; + } + + /* #endif */ + + /* 原生组件模式下需要注意组件外部样式 */ + m-input { + width: 100%; + /* min-height: 100%; */ + display: flex; + flex: 1; + } + + .content { + display: flex; + flex: 1; + flex-direction: column; + background-color: #efeff4; + padding: 10px; + } + + .input-group { + background-color: #ffffff; + margin-top: 20px; + position: relative; + } + + .input-group::before { + position: absolute; + right: 0; + top: 0; + left: 0; + height: 1px; + content: ''; + -webkit-transform: scaleY(.5); + transform: scaleY(.5); + background-color: #c8c7cc; + } + + .input-group::after { + position: absolute; + right: 0; + bottom: 0; + left: 0; + height: 1px; + content: ''; + -webkit-transform: scaleY(.5); + transform: scaleY(.5); + background-color: #c8c7cc; + } + + .input-row { + display: flex; + flex-direction: row; + position: relative; + /* font-size: 18px; */ + height: 40px; + line-height: 40px; + } + + .input-row .title { + width: 70px; + padding-left: 15px; + } + + .input-row.border::after { + position: absolute; + right: 0; + bottom: 0; + left: 8px; + height: 1px; + content: ''; + -webkit-transform: scaleY(.5); + transform: scaleY(.5); + background-color: #c8c7cc; + } + + .btn-row { + margin-top: 25px; + padding: 10px; + } + + button.primary { + background-color: #0faeff; + } \ No newline at end of file diff --git a/common/uni-ui.scss b/common/uni-ui.scss new file mode 100644 index 0000000..6ba0990 --- /dev/null +++ b/common/uni-ui.scss @@ -0,0 +1,120 @@ + +.uni-flex { + display: flex; +} + +.uni-flex-row { + @extend .uni-flex; + flex-direction: row; + box-sizing: border-box; +} + +.uni-flex-column { + @extend .uni-flex; + flex-direction: column; +} + +.uni-color-gary { + color: #3b4144; +} + +/* 标题 */ +.uni-title { + display: flex; + margin-bottom: $uni-spacing-col-base; + font-size: $uni-font-size-lg; + font-weight: bold; + color: #3b4144; +} + +.uni-title-sub { + display: flex; + // margin-bottom: $uni-spacing-col-base; + font-size: $uni-font-size-base; + font-weight: 500; + color: #3b4144; +} + +/* 描述 额外文本 */ +.uni-note { + margin-top: 10px; + color: #999; + font-size: $uni-font-size-sm; +} + +/* 列表内容 */ +.uni-list-box { + @extend .uni-flex-row; + flex: 1; + margin-top: 10px; +} + +/* 略缩图 */ +.uni-thumb { + flex-shrink: 0; + margin-right: $uni-spacing-row-base; + width: 125px; + height: 75px; + border-radius: $uni-border-radius-lg; + overflow: hidden; + border: 1px #f5f5f5 solid; + image { + width: 100%; + height: 100%; + } +} + +.uni-media-box { + @extend .uni-flex-row; + // margin-bottom: $uni-spacing-col-base; + border-radius: $uni-border-radius-lg; + overflow: hidden; + .uni-thumb { + margin: 0; + margin-left: 4px; + flex-shrink: 1; + width: 33%; + border-radius:0; + &:first-child { + margin: 0; + } + } +} + +/* 内容 */ +.uni-content { + @extend .uni-flex-column; + justify-content: space-between; +} + +/* 列表footer */ +.uni-footer { + @extend .uni-flex-row; + justify-content: space-between; + margin-top: $uni-spacing-col-lg; +} +.uni-footer-text { + font-size: $uni-font-size-sm; + color: $uni-text-color-grey; + margin-left: 5px; +} + +/* 标签 */ + +.uni-tag { + flex-shrink: 0; + padding: 0 5px; + border: 1px $uni-border-color solid; + margin-right: $uni-spacing-row-sm; + border-radius: $uni-border-radius-base; + background: $uni-bg-color-grey; + color: $uni-text-color; + font-size: $uni-font-size-sm; +} + +/* 链接 */ +.uni-link { + margin-left: 10px; + color: $uni-text-color; + text-decoration: underline; +} diff --git a/common/univerify.js b/common/univerify.js new file mode 100644 index 0000000..e92fab6 --- /dev/null +++ b/common/univerify.js @@ -0,0 +1,142 @@ +import Vuex from '@/store/index.js' + +export function univerifyLogin() { + const commit = Vuex.commit; + const PROVIDER = 'univerify'; + + /** + * reject(true) 点击其他登录方式 + * reject(false) 关闭登录框 + */ + return new Promise((resolve, reject) => { + uni.getProvider({ + service: 'oauth', + success: (res) => { + if (res.provider.indexOf(PROVIDER) !== -1) { + // 一键登录已在APP onLaunch的时候进行了预登陆,可以显著提高登录速度。登录成功后,预登陆状态会重置 + uni.login({ + provider: PROVIDER, + success: (res) => { + uni.closeAuthView(); + uni.showLoading(); + + uniCloud.callFunction({ + name: 'user-center', + data: { + action: 'loginByUniverify', + params: res.authResult + }, + success: (e) => { + console.log('login success', e); + + if (e.result.code == 0) { + const username = e.result.username || e.result.mobile || '一键登录新用户' + + uni.setStorageSync('uni_id_token', e.result.token) + uni.setStorageSync('username', username) + uni.setStorageSync('login_type', 'online') + + commit('login', username) + resolve(); + + uni.switchTab({ + url: '../main/main', + }); + } else { + uni.showModal({ + title: `登录失败: ${e.result.code}`, + content: e.result.message, + showCancel: false + }) + console.log('登录失败', e); + + e.result.errMsg = e.result.message; + } + }, + fail: (e) => { + uni.showModal({ + title: `登录失败`, + content: e.errMsg, + showCancel: false + }) + }, + complete: () => { + uni.hideLoading() + } + }) + }, + fail: (err) => { + console.error('授权登录失败:' + JSON.stringify(err)); + + // 一键登录点击其他登录方式 + if (err.code == 30002) { + uni.closeAuthView(); + reject(true); + return; + } + + // 关闭登录 + if (err.code == 30003) { + uni.closeAuthView(); + reject(false); + return; + } + + reject(err); + } + }) + } else { + reject(); + } + }, + fail: (err) => { + console.error('获取服务供应商失败:' + err.errMsg); + reject(err) + } + }); + }) +} + +export function univerifyErrorHandler(err, cb) { + if (!err) { + cb && cb() + return + }; + + const state = Vuex.state; + const obj = { + /* showCancel: true, + cancelText: '其他登录方式', + success(res) { + if (res.cancel) { + cb && cb() + } + } */ + } + + switch (true) { + // 未开通 + case err.code == 1000: + uni.showModal(Object.assign({ + title: `登录失败`, + content: `${err.errMsg},错误码:${err.code}\n开通指南:https://ask.dcloud.net.cn/article/37965`, + }, obj)); + break; + // 预登陆失败 + case err.code == 30005: + uni.showModal(Object.assign({ + showCancel: false, + title: `预登录失败`, + content: `${err.errMsg},错误码:${err.code}` + }, obj)); + break; + //用户关闭验证界面 + case err.code != 30003: + uni.showModal(Object.assign({ + showCancel: false, + title: `登录失败`, + content: `${err.errMsg},错误码:${err.code}`, + }, obj)); + break; + } +} diff --git a/common/uqrcode.js b/common/uqrcode.js new file mode 100644 index 0000000..22a947d --- /dev/null +++ b/common/uqrcode.js @@ -0,0 +1,1382 @@ +//--------------------------------------------------------------------- +// github https://github.com/Sansnn/uQRCode +//--------------------------------------------------------------------- + +let uQRCode = {}; + +(function() { + //--------------------------------------------------------------------- + // QRCode for JavaScript + // + // Copyright (c) 2009 Kazuhiko Arase + // + // URL: http://www.d-project.com/ + // + // Licensed under the MIT license: + // http://www.opensource.org/licenses/mit-license.php + // + // The word "QR Code" is registered trademark of + // DENSO WAVE INCORPORATED + // http://www.denso-wave.com/qrcode/faqpatent-e.html + // + //--------------------------------------------------------------------- + + //--------------------------------------------------------------------- + // QR8bitByte + //--------------------------------------------------------------------- + + function QR8bitByte(data) { + this.mode = QRMode.MODE_8BIT_BYTE; + this.data = data; + } + + QR8bitByte.prototype = { + + getLength: function(buffer) { + return this.data.length; + }, + + write: function(buffer) { + for (var i = 0; i < this.data.length; i++) { + // not JIS ... + buffer.put(this.data.charCodeAt(i), 8); + } + } + }; + + //--------------------------------------------------------------------- + // QRCode + //--------------------------------------------------------------------- + + function QRCode(typeNumber, errorCorrectLevel) { + this.typeNumber = typeNumber; + this.errorCorrectLevel = errorCorrectLevel; + this.modules = null; + this.moduleCount = 0; + this.dataCache = null; + this.dataList = new Array(); + } + + QRCode.prototype = { + + addData: function(data) { + var newData = new QR8bitByte(data); + this.dataList.push(newData); + this.dataCache = null; + }, + + isDark: function(row, col) { + if (row < 0 || this.moduleCount <= row || col < 0 || this.moduleCount <= col) { + throw new Error(row + "," + col); + } + return this.modules[row][col]; + }, + + getModuleCount: function() { + return this.moduleCount; + }, + + make: function() { + // Calculate automatically typeNumber if provided is < 1 + if (this.typeNumber < 1) { + var typeNumber = 1; + for (typeNumber = 1; typeNumber < 40; typeNumber++) { + var rsBlocks = QRRSBlock.getRSBlocks(typeNumber, this.errorCorrectLevel); + + var buffer = new QRBitBuffer(); + var totalDataCount = 0; + for (var i = 0; i < rsBlocks.length; i++) { + totalDataCount += rsBlocks[i].dataCount; + } + + for (var i = 0; i < this.dataList.length; i++) { + var data = this.dataList[i]; + buffer.put(data.mode, 4); + buffer.put(data.getLength(), QRUtil.getLengthInBits(data.mode, typeNumber)); + data.write(buffer); + } + if (buffer.getLengthInBits() <= totalDataCount * 8) + break; + } + this.typeNumber = typeNumber; + } + this.makeImpl(false, this.getBestMaskPattern()); + }, + + makeImpl: function(test, maskPattern) { + + this.moduleCount = this.typeNumber * 4 + 17; + this.modules = new Array(this.moduleCount); + + for (var row = 0; row < this.moduleCount; row++) { + + this.modules[row] = new Array(this.moduleCount); + + for (var col = 0; col < this.moduleCount; col++) { + this.modules[row][col] = null; //(col + row) % 3; + } + } + + this.setupPositionProbePattern(0, 0); + this.setupPositionProbePattern(this.moduleCount - 7, 0); + this.setupPositionProbePattern(0, this.moduleCount - 7); + this.setupPositionAdjustPattern(); + this.setupTimingPattern(); + this.setupTypeInfo(test, maskPattern); + + if (this.typeNumber >= 7) { + this.setupTypeNumber(test); + } + + if (this.dataCache == null) { + this.dataCache = QRCode.createData(this.typeNumber, this.errorCorrectLevel, this.dataList); + } + + this.mapData(this.dataCache, maskPattern); + }, + + setupPositionProbePattern: function(row, col) { + + for (var r = -1; r <= 7; r++) { + + if (row + r <= -1 || this.moduleCount <= row + r) continue; + + for (var c = -1; c <= 7; c++) { + + if (col + c <= -1 || this.moduleCount <= col + c) continue; + + if ((0 <= r && r <= 6 && (c == 0 || c == 6)) || + (0 <= c && c <= 6 && (r == 0 || r == 6)) || + (2 <= r && r <= 4 && 2 <= c && c <= 4)) { + this.modules[row + r][col + c] = true; + } else { + this.modules[row + r][col + c] = false; + } + } + } + }, + + getBestMaskPattern: function() { + + var minLostPoint = 0; + var pattern = 0; + + for (var i = 0; i < 8; i++) { + + this.makeImpl(true, i); + + var lostPoint = QRUtil.getLostPoint(this); + + if (i == 0 || minLostPoint > lostPoint) { + minLostPoint = lostPoint; + pattern = i; + } + } + + return pattern; + }, + + createMovieClip: function(target_mc, instance_name, depth) { + + var qr_mc = target_mc.createEmptyMovieClip(instance_name, depth); + var cs = 1; + + this.make(); + + for (var row = 0; row < this.modules.length; row++) { + + var y = row * cs; + + for (var col = 0; col < this.modules[row].length; col++) { + + var x = col * cs; + var dark = this.modules[row][col]; + + if (dark) { + qr_mc.beginFill(0, 100); + qr_mc.moveTo(x, y); + qr_mc.lineTo(x + cs, y); + qr_mc.lineTo(x + cs, y + cs); + qr_mc.lineTo(x, y + cs); + qr_mc.endFill(); + } + } + } + + return qr_mc; + }, + + setupTimingPattern: function() { + + for (var r = 8; r < this.moduleCount - 8; r++) { + if (this.modules[r][6] != null) { + continue; + } + this.modules[r][6] = (r % 2 == 0); + } + + for (var c = 8; c < this.moduleCount - 8; c++) { + if (this.modules[6][c] != null) { + continue; + } + this.modules[6][c] = (c % 2 == 0); + } + }, + + setupPositionAdjustPattern: function() { + + var pos = QRUtil.getPatternPosition(this.typeNumber); + + for (var i = 0; i < pos.length; i++) { + + for (var j = 0; j < pos.length; j++) { + + var row = pos[i]; + var col = pos[j]; + + if (this.modules[row][col] != null) { + continue; + } + + for (var r = -2; r <= 2; r++) { + + for (var c = -2; c <= 2; c++) { + + if (r == -2 || r == 2 || c == -2 || c == 2 || + (r == 0 && c == 0)) { + this.modules[row + r][col + c] = true; + } else { + this.modules[row + r][col + c] = false; + } + } + } + } + } + }, + + setupTypeNumber: function(test) { + + var bits = QRUtil.getBCHTypeNumber(this.typeNumber); + + for (var i = 0; i < 18; i++) { + var mod = (!test && ((bits >> i) & 1) == 1); + this.modules[Math.floor(i / 3)][i % 3 + this.moduleCount - 8 - 3] = mod; + } + + for (var i = 0; i < 18; i++) { + var mod = (!test && ((bits >> i) & 1) == 1); + this.modules[i % 3 + this.moduleCount - 8 - 3][Math.floor(i / 3)] = mod; + } + }, + + setupTypeInfo: function(test, maskPattern) { + + var data = (this.errorCorrectLevel << 3) | maskPattern; + var bits = QRUtil.getBCHTypeInfo(data); + + // vertical + for (var i = 0; i < 15; i++) { + + var mod = (!test && ((bits >> i) & 1) == 1); + + if (i < 6) { + this.modules[i][8] = mod; + } else if (i < 8) { + this.modules[i + 1][8] = mod; + } else { + this.modules[this.moduleCount - 15 + i][8] = mod; + } + } + + // horizontal + for (var i = 0; i < 15; i++) { + + var mod = (!test && ((bits >> i) & 1) == 1); + + if (i < 8) { + this.modules[8][this.moduleCount - i - 1] = mod; + } else if (i < 9) { + this.modules[8][15 - i - 1 + 1] = mod; + } else { + this.modules[8][15 - i - 1] = mod; + } + } + + // fixed module + this.modules[this.moduleCount - 8][8] = (!test); + + }, + + mapData: function(data, maskPattern) { + + var inc = -1; + var row = this.moduleCount - 1; + var bitIndex = 7; + var byteIndex = 0; + + for (var col = this.moduleCount - 1; col > 0; col -= 2) { + + if (col == 6) col--; + + while (true) { + + for (var c = 0; c < 2; c++) { + + if (this.modules[row][col - c] == null) { + + var dark = false; + + if (byteIndex < data.length) { + dark = (((data[byteIndex] >>> bitIndex) & 1) == 1); + } + + var mask = QRUtil.getMask(maskPattern, row, col - c); + + if (mask) { + dark = !dark; + } + + this.modules[row][col - c] = dark; + bitIndex--; + + if (bitIndex == -1) { + byteIndex++; + bitIndex = 7; + } + } + } + + row += inc; + + if (row < 0 || this.moduleCount <= row) { + row -= inc; + inc = -inc; + break; + } + } + } + + } + + }; + + QRCode.PAD0 = 0xEC; + QRCode.PAD1 = 0x11; + + QRCode.createData = function(typeNumber, errorCorrectLevel, dataList) { + + var rsBlocks = QRRSBlock.getRSBlocks(typeNumber, errorCorrectLevel); + + var buffer = new QRBitBuffer(); + + for (var i = 0; i < dataList.length; i++) { + var data = dataList[i]; + buffer.put(data.mode, 4); + buffer.put(data.getLength(), QRUtil.getLengthInBits(data.mode, typeNumber)); + data.write(buffer); + } + + // calc num max data. + var totalDataCount = 0; + for (var i = 0; i < rsBlocks.length; i++) { + totalDataCount += rsBlocks[i].dataCount; + } + + if (buffer.getLengthInBits() > totalDataCount * 8) { + throw new Error("code length overflow. (" + + buffer.getLengthInBits() + + ">" + + totalDataCount * 8 + + ")"); + } + + // end code + if (buffer.getLengthInBits() + 4 <= totalDataCount * 8) { + buffer.put(0, 4); + } + + // padding + while (buffer.getLengthInBits() % 8 != 0) { + buffer.putBit(false); + } + + // padding + while (true) { + + if (buffer.getLengthInBits() >= totalDataCount * 8) { + break; + } + buffer.put(QRCode.PAD0, 8); + + if (buffer.getLengthInBits() >= totalDataCount * 8) { + break; + } + buffer.put(QRCode.PAD1, 8); + } + + return QRCode.createBytes(buffer, rsBlocks); + } + + QRCode.createBytes = function(buffer, rsBlocks) { + + var offset = 0; + + var maxDcCount = 0; + var maxEcCount = 0; + + var dcdata = new Array(rsBlocks.length); + var ecdata = new Array(rsBlocks.length); + + for (var r = 0; r < rsBlocks.length; r++) { + + var dcCount = rsBlocks[r].dataCount; + var ecCount = rsBlocks[r].totalCount - dcCount; + + maxDcCount = Math.max(maxDcCount, dcCount); + maxEcCount = Math.max(maxEcCount, ecCount); + + dcdata[r] = new Array(dcCount); + + for (var i = 0; i < dcdata[r].length; i++) { + dcdata[r][i] = 0xff & buffer.buffer[i + offset]; + } + offset += dcCount; + + var rsPoly = QRUtil.getErrorCorrectPolynomial(ecCount); + var rawPoly = new QRPolynomial(dcdata[r], rsPoly.getLength() - 1); + + var modPoly = rawPoly.mod(rsPoly); + ecdata[r] = new Array(rsPoly.getLength() - 1); + for (var i = 0; i < ecdata[r].length; i++) { + var modIndex = i + modPoly.getLength() - ecdata[r].length; + ecdata[r][i] = (modIndex >= 0) ? modPoly.get(modIndex) : 0; + } + + } + + var totalCodeCount = 0; + for (var i = 0; i < rsBlocks.length; i++) { + totalCodeCount += rsBlocks[i].totalCount; + } + + var data = new Array(totalCodeCount); + var index = 0; + + for (var i = 0; i < maxDcCount; i++) { + for (var r = 0; r < rsBlocks.length; r++) { + if (i < dcdata[r].length) { + data[index++] = dcdata[r][i]; + } + } + } + + for (var i = 0; i < maxEcCount; i++) { + for (var r = 0; r < rsBlocks.length; r++) { + if (i < ecdata[r].length) { + data[index++] = ecdata[r][i]; + } + } + } + + return data; + + } + + //--------------------------------------------------------------------- + // QRMode + //--------------------------------------------------------------------- + + var QRMode = { + MODE_NUMBER: 1 << 0, + MODE_ALPHA_NUM: 1 << 1, + MODE_8BIT_BYTE: 1 << 2, + MODE_KANJI: 1 << 3 + }; + + //--------------------------------------------------------------------- + // QRErrorCorrectLevel + //--------------------------------------------------------------------- + + var QRErrorCorrectLevel = { + L: 1, + M: 0, + Q: 3, + H: 2 + }; + + //--------------------------------------------------------------------- + // QRMaskPattern + //--------------------------------------------------------------------- + + var QRMaskPattern = { + PATTERN000: 0, + PATTERN001: 1, + PATTERN010: 2, + PATTERN011: 3, + PATTERN100: 4, + PATTERN101: 5, + PATTERN110: 6, + PATTERN111: 7 + }; + + //--------------------------------------------------------------------- + // QRUtil + //--------------------------------------------------------------------- + + var QRUtil = { + + PATTERN_POSITION_TABLE: [ + [], + [6, 18], + [6, 22], + [6, 26], + [6, 30], + [6, 34], + [6, 22, 38], + [6, 24, 42], + [6, 26, 46], + [6, 28, 50], + [6, 30, 54], + [6, 32, 58], + [6, 34, 62], + [6, 26, 46, 66], + [6, 26, 48, 70], + [6, 26, 50, 74], + [6, 30, 54, 78], + [6, 30, 56, 82], + [6, 30, 58, 86], + [6, 34, 62, 90], + [6, 28, 50, 72, 94], + [6, 26, 50, 74, 98], + [6, 30, 54, 78, 102], + [6, 28, 54, 80, 106], + [6, 32, 58, 84, 110], + [6, 30, 58, 86, 114], + [6, 34, 62, 90, 118], + [6, 26, 50, 74, 98, 122], + [6, 30, 54, 78, 102, 126], + [6, 26, 52, 78, 104, 130], + [6, 30, 56, 82, 108, 134], + [6, 34, 60, 86, 112, 138], + [6, 30, 58, 86, 114, 142], + [6, 34, 62, 90, 118, 146], + [6, 30, 54, 78, 102, 126, 150], + [6, 24, 50, 76, 102, 128, 154], + [6, 28, 54, 80, 106, 132, 158], + [6, 32, 58, 84, 110, 136, 162], + [6, 26, 54, 82, 110, 138, 166], + [6, 30, 58, 86, 114, 142, 170] + ], + + G15: (1 << 10) | (1 << 8) | (1 << 5) | (1 << 4) | (1 << 2) | (1 << 1) | (1 << 0), + G18: (1 << 12) | (1 << 11) | (1 << 10) | (1 << 9) | (1 << 8) | (1 << 5) | (1 << 2) | (1 << 0), + G15_MASK: (1 << 14) | (1 << 12) | (1 << 10) | (1 << 4) | (1 << 1), + + getBCHTypeInfo: function(data) { + var d = data << 10; + while (QRUtil.getBCHDigit(d) - QRUtil.getBCHDigit(QRUtil.G15) >= 0) { + d ^= (QRUtil.G15 << (QRUtil.getBCHDigit(d) - QRUtil.getBCHDigit(QRUtil.G15))); + } + return ((data << 10) | d) ^ QRUtil.G15_MASK; + }, + + getBCHTypeNumber: function(data) { + var d = data << 12; + while (QRUtil.getBCHDigit(d) - QRUtil.getBCHDigit(QRUtil.G18) >= 0) { + d ^= (QRUtil.G18 << (QRUtil.getBCHDigit(d) - QRUtil.getBCHDigit(QRUtil.G18))); + } + return (data << 12) | d; + }, + + getBCHDigit: function(data) { + + var digit = 0; + + while (data != 0) { + digit++; + data >>>= 1; + } + + return digit; + }, + + getPatternPosition: function(typeNumber) { + return QRUtil.PATTERN_POSITION_TABLE[typeNumber - 1]; + }, + + getMask: function(maskPattern, i, j) { + + switch (maskPattern) { + + case QRMaskPattern.PATTERN000: + return (i + j) % 2 == 0; + case QRMaskPattern.PATTERN001: + return i % 2 == 0; + case QRMaskPattern.PATTERN010: + return j % 3 == 0; + case QRMaskPattern.PATTERN011: + return (i + j) % 3 == 0; + case QRMaskPattern.PATTERN100: + return (Math.floor(i / 2) + Math.floor(j / 3)) % 2 == 0; + case QRMaskPattern.PATTERN101: + return (i * j) % 2 + (i * j) % 3 == 0; + case QRMaskPattern.PATTERN110: + return ((i * j) % 2 + (i * j) % 3) % 2 == 0; + case QRMaskPattern.PATTERN111: + return ((i * j) % 3 + (i + j) % 2) % 2 == 0; + + default: + throw new Error("bad maskPattern:" + maskPattern); + } + }, + + getErrorCorrectPolynomial: function(errorCorrectLength) { + + var a = new QRPolynomial([1], 0); + + for (var i = 0; i < errorCorrectLength; i++) { + a = a.multiply(new QRPolynomial([1, QRMath.gexp(i)], 0)); + } + + return a; + }, + + getLengthInBits: function(mode, type) { + + if (1 <= type && type < 10) { + + // 1 - 9 + + switch (mode) { + case QRMode.MODE_NUMBER: + return 10; + case QRMode.MODE_ALPHA_NUM: + return 9; + case QRMode.MODE_8BIT_BYTE: + return 8; + case QRMode.MODE_KANJI: + return 8; + default: + throw new Error("mode:" + mode); + } + + } else if (type < 27) { + + // 10 - 26 + + switch (mode) { + case QRMode.MODE_NUMBER: + return 12; + case QRMode.MODE_ALPHA_NUM: + return 11; + case QRMode.MODE_8BIT_BYTE: + return 16; + case QRMode.MODE_KANJI: + return 10; + default: + throw new Error("mode:" + mode); + } + + } else if (type < 41) { + + // 27 - 40 + + switch (mode) { + case QRMode.MODE_NUMBER: + return 14; + case QRMode.MODE_ALPHA_NUM: + return 13; + case QRMode.MODE_8BIT_BYTE: + return 16; + case QRMode.MODE_KANJI: + return 12; + default: + throw new Error("mode:" + mode); + } + + } else { + throw new Error("type:" + type); + } + }, + + getLostPoint: function(qrCode) { + + var moduleCount = qrCode.getModuleCount(); + + var lostPoint = 0; + + // LEVEL1 + + for (var row = 0; row < moduleCount; row++) { + + for (var col = 0; col < moduleCount; col++) { + + var sameCount = 0; + var dark = qrCode.isDark(row, col); + + for (var r = -1; r <= 1; r++) { + + if (row + r < 0 || moduleCount <= row + r) { + continue; + } + + for (var c = -1; c <= 1; c++) { + + if (col + c < 0 || moduleCount <= col + c) { + continue; + } + + if (r == 0 && c == 0) { + continue; + } + + if (dark == qrCode.isDark(row + r, col + c)) { + sameCount++; + } + } + } + + if (sameCount > 5) { + lostPoint += (3 + sameCount - 5); + } + } + } + + // LEVEL2 + + for (var row = 0; row < moduleCount - 1; row++) { + for (var col = 0; col < moduleCount - 1; col++) { + var count = 0; + if (qrCode.isDark(row, col)) count++; + if (qrCode.isDark(row + 1, col)) count++; + if (qrCode.isDark(row, col + 1)) count++; + if (qrCode.isDark(row + 1, col + 1)) count++; + if (count == 0 || count == 4) { + lostPoint += 3; + } + } + } + + // LEVEL3 + + for (var row = 0; row < moduleCount; row++) { + for (var col = 0; col < moduleCount - 6; col++) { + if (qrCode.isDark(row, col) && + !qrCode.isDark(row, col + 1) && + qrCode.isDark(row, col + 2) && + qrCode.isDark(row, col + 3) && + qrCode.isDark(row, col + 4) && + !qrCode.isDark(row, col + 5) && + qrCode.isDark(row, col + 6)) { + lostPoint += 40; + } + } + } + + for (var col = 0; col < moduleCount; col++) { + for (var row = 0; row < moduleCount - 6; row++) { + if (qrCode.isDark(row, col) && + !qrCode.isDark(row + 1, col) && + qrCode.isDark(row + 2, col) && + qrCode.isDark(row + 3, col) && + qrCode.isDark(row + 4, col) && + !qrCode.isDark(row + 5, col) && + qrCode.isDark(row + 6, col)) { + lostPoint += 40; + } + } + } + + // LEVEL4 + + var darkCount = 0; + + for (var col = 0; col < moduleCount; col++) { + for (var row = 0; row < moduleCount; row++) { + if (qrCode.isDark(row, col)) { + darkCount++; + } + } + } + + var ratio = Math.abs(100 * darkCount / moduleCount / moduleCount - 50) / 5; + lostPoint += ratio * 10; + + return lostPoint; + } + + }; + + + //--------------------------------------------------------------------- + // QRMath + //--------------------------------------------------------------------- + + var QRMath = { + + glog: function(n) { + + if (n < 1) { + throw new Error("glog(" + n + ")"); + } + + return QRMath.LOG_TABLE[n]; + }, + + gexp: function(n) { + + while (n < 0) { + n += 255; + } + + while (n >= 256) { + n -= 255; + } + + return QRMath.EXP_TABLE[n]; + }, + + EXP_TABLE: new Array(256), + + LOG_TABLE: new Array(256) + + }; + + for (var i = 0; i < 8; i++) { + QRMath.EXP_TABLE[i] = 1 << i; + } + for (var i = 8; i < 256; i++) { + QRMath.EXP_TABLE[i] = QRMath.EXP_TABLE[i - 4] ^ + QRMath.EXP_TABLE[i - 5] ^ + QRMath.EXP_TABLE[i - 6] ^ + QRMath.EXP_TABLE[i - 8]; + } + for (var i = 0; i < 255; i++) { + QRMath.LOG_TABLE[QRMath.EXP_TABLE[i]] = i; + } + + //--------------------------------------------------------------------- + // QRPolynomial + //--------------------------------------------------------------------- + + function QRPolynomial(num, shift) { + + if (num.length == undefined) { + throw new Error(num.length + "/" + shift); + } + + var offset = 0; + + while (offset < num.length && num[offset] == 0) { + offset++; + } + + this.num = new Array(num.length - offset + shift); + for (var i = 0; i < num.length - offset; i++) { + this.num[i] = num[i + offset]; + } + } + + QRPolynomial.prototype = { + + get: function(index) { + return this.num[index]; + }, + + getLength: function() { + return this.num.length; + }, + + multiply: function(e) { + + var num = new Array(this.getLength() + e.getLength() - 1); + + for (var i = 0; i < this.getLength(); i++) { + for (var j = 0; j < e.getLength(); j++) { + num[i + j] ^= QRMath.gexp(QRMath.glog(this.get(i)) + QRMath.glog(e.get(j))); + } + } + + return new QRPolynomial(num, 0); + }, + + mod: function(e) { + + if (this.getLength() - e.getLength() < 0) { + return this; + } + + var ratio = QRMath.glog(this.get(0)) - QRMath.glog(e.get(0)); + + var num = new Array(this.getLength()); + + for (var i = 0; i < this.getLength(); i++) { + num[i] = this.get(i); + } + + for (var i = 0; i < e.getLength(); i++) { + num[i] ^= QRMath.gexp(QRMath.glog(e.get(i)) + ratio); + } + + // recursive call + return new QRPolynomial(num, 0).mod(e); + } + }; + + //--------------------------------------------------------------------- + // QRRSBlock + //--------------------------------------------------------------------- + + function QRRSBlock(totalCount, dataCount) { + this.totalCount = totalCount; + this.dataCount = dataCount; + } + + QRRSBlock.RS_BLOCK_TABLE = [ + + // L + // M + // Q + // H + + // 1 + [1, 26, 19], + [1, 26, 16], + [1, 26, 13], + [1, 26, 9], + + // 2 + [1, 44, 34], + [1, 44, 28], + [1, 44, 22], + [1, 44, 16], + + // 3 + [1, 70, 55], + [1, 70, 44], + [2, 35, 17], + [2, 35, 13], + + // 4 + [1, 100, 80], + [2, 50, 32], + [2, 50, 24], + [4, 25, 9], + + // 5 + [1, 134, 108], + [2, 67, 43], + [2, 33, 15, 2, 34, 16], + [2, 33, 11, 2, 34, 12], + + // 6 + [2, 86, 68], + [4, 43, 27], + [4, 43, 19], + [4, 43, 15], + + // 7 + [2, 98, 78], + [4, 49, 31], + [2, 32, 14, 4, 33, 15], + [4, 39, 13, 1, 40, 14], + + // 8 + [2, 121, 97], + [2, 60, 38, 2, 61, 39], + [4, 40, 18, 2, 41, 19], + [4, 40, 14, 2, 41, 15], + + // 9 + [2, 146, 116], + [3, 58, 36, 2, 59, 37], + [4, 36, 16, 4, 37, 17], + [4, 36, 12, 4, 37, 13], + + // 10 + [2, 86, 68, 2, 87, 69], + [4, 69, 43, 1, 70, 44], + [6, 43, 19, 2, 44, 20], + [6, 43, 15, 2, 44, 16], + + // 11 + [4, 101, 81], + [1, 80, 50, 4, 81, 51], + [4, 50, 22, 4, 51, 23], + [3, 36, 12, 8, 37, 13], + + // 12 + [2, 116, 92, 2, 117, 93], + [6, 58, 36, 2, 59, 37], + [4, 46, 20, 6, 47, 21], + [7, 42, 14, 4, 43, 15], + + // 13 + [4, 133, 107], + [8, 59, 37, 1, 60, 38], + [8, 44, 20, 4, 45, 21], + [12, 33, 11, 4, 34, 12], + + // 14 + [3, 145, 115, 1, 146, 116], + [4, 64, 40, 5, 65, 41], + [11, 36, 16, 5, 37, 17], + [11, 36, 12, 5, 37, 13], + + // 15 + [5, 109, 87, 1, 110, 88], + [5, 65, 41, 5, 66, 42], + [5, 54, 24, 7, 55, 25], + [11, 36, 12], + + // 16 + [5, 122, 98, 1, 123, 99], + [7, 73, 45, 3, 74, 46], + [15, 43, 19, 2, 44, 20], + [3, 45, 15, 13, 46, 16], + + // 17 + [1, 135, 107, 5, 136, 108], + [10, 74, 46, 1, 75, 47], + [1, 50, 22, 15, 51, 23], + [2, 42, 14, 17, 43, 15], + + // 18 + [5, 150, 120, 1, 151, 121], + [9, 69, 43, 4, 70, 44], + [17, 50, 22, 1, 51, 23], + [2, 42, 14, 19, 43, 15], + + // 19 + [3, 141, 113, 4, 142, 114], + [3, 70, 44, 11, 71, 45], + [17, 47, 21, 4, 48, 22], + [9, 39, 13, 16, 40, 14], + + // 20 + [3, 135, 107, 5, 136, 108], + [3, 67, 41, 13, 68, 42], + [15, 54, 24, 5, 55, 25], + [15, 43, 15, 10, 44, 16], + + // 21 + [4, 144, 116, 4, 145, 117], + [17, 68, 42], + [17, 50, 22, 6, 51, 23], + [19, 46, 16, 6, 47, 17], + + // 22 + [2, 139, 111, 7, 140, 112], + [17, 74, 46], + [7, 54, 24, 16, 55, 25], + [34, 37, 13], + + // 23 + [4, 151, 121, 5, 152, 122], + [4, 75, 47, 14, 76, 48], + [11, 54, 24, 14, 55, 25], + [16, 45, 15, 14, 46, 16], + + // 24 + [6, 147, 117, 4, 148, 118], + [6, 73, 45, 14, 74, 46], + [11, 54, 24, 16, 55, 25], + [30, 46, 16, 2, 47, 17], + + // 25 + [8, 132, 106, 4, 133, 107], + [8, 75, 47, 13, 76, 48], + [7, 54, 24, 22, 55, 25], + [22, 45, 15, 13, 46, 16], + + // 26 + [10, 142, 114, 2, 143, 115], + [19, 74, 46, 4, 75, 47], + [28, 50, 22, 6, 51, 23], + [33, 46, 16, 4, 47, 17], + + // 27 + [8, 152, 122, 4, 153, 123], + [22, 73, 45, 3, 74, 46], + [8, 53, 23, 26, 54, 24], + [12, 45, 15, 28, 46, 16], + + // 28 + [3, 147, 117, 10, 148, 118], + [3, 73, 45, 23, 74, 46], + [4, 54, 24, 31, 55, 25], + [11, 45, 15, 31, 46, 16], + + // 29 + [7, 146, 116, 7, 147, 117], + [21, 73, 45, 7, 74, 46], + [1, 53, 23, 37, 54, 24], + [19, 45, 15, 26, 46, 16], + + // 30 + [5, 145, 115, 10, 146, 116], + [19, 75, 47, 10, 76, 48], + [15, 54, 24, 25, 55, 25], + [23, 45, 15, 25, 46, 16], + + // 31 + [13, 145, 115, 3, 146, 116], + [2, 74, 46, 29, 75, 47], + [42, 54, 24, 1, 55, 25], + [23, 45, 15, 28, 46, 16], + + // 32 + [17, 145, 115], + [10, 74, 46, 23, 75, 47], + [10, 54, 24, 35, 55, 25], + [19, 45, 15, 35, 46, 16], + + // 33 + [17, 145, 115, 1, 146, 116], + [14, 74, 46, 21, 75, 47], + [29, 54, 24, 19, 55, 25], + [11, 45, 15, 46, 46, 16], + + // 34 + [13, 145, 115, 6, 146, 116], + [14, 74, 46, 23, 75, 47], + [44, 54, 24, 7, 55, 25], + [59, 46, 16, 1, 47, 17], + + // 35 + [12, 151, 121, 7, 152, 122], + [12, 75, 47, 26, 76, 48], + [39, 54, 24, 14, 55, 25], + [22, 45, 15, 41, 46, 16], + + // 36 + [6, 151, 121, 14, 152, 122], + [6, 75, 47, 34, 76, 48], + [46, 54, 24, 10, 55, 25], + [2, 45, 15, 64, 46, 16], + + // 37 + [17, 152, 122, 4, 153, 123], + [29, 74, 46, 14, 75, 47], + [49, 54, 24, 10, 55, 25], + [24, 45, 15, 46, 46, 16], + + // 38 + [4, 152, 122, 18, 153, 123], + [13, 74, 46, 32, 75, 47], + [48, 54, 24, 14, 55, 25], + [42, 45, 15, 32, 46, 16], + + // 39 + [20, 147, 117, 4, 148, 118], + [40, 75, 47, 7, 76, 48], + [43, 54, 24, 22, 55, 25], + [10, 45, 15, 67, 46, 16], + + // 40 + [19, 148, 118, 6, 149, 119], + [18, 75, 47, 31, 76, 48], + [34, 54, 24, 34, 55, 25], + [20, 45, 15, 61, 46, 16] + ]; + + QRRSBlock.getRSBlocks = function(typeNumber, errorCorrectLevel) { + + var rsBlock = QRRSBlock.getRsBlockTable(typeNumber, errorCorrectLevel); + + if (rsBlock == undefined) { + throw new Error("bad rs block @ typeNumber:" + typeNumber + "/errorCorrectLevel:" + errorCorrectLevel); + } + + var length = rsBlock.length / 3; + + var list = new Array(); + + for (var i = 0; i < length; i++) { + + var count = rsBlock[i * 3 + 0]; + var totalCount = rsBlock[i * 3 + 1]; + var dataCount = rsBlock[i * 3 + 2]; + + for (var j = 0; j < count; j++) { + list.push(new QRRSBlock(totalCount, dataCount)); + } + } + + return list; + } + + QRRSBlock.getRsBlockTable = function(typeNumber, errorCorrectLevel) { + + switch (errorCorrectLevel) { + case QRErrorCorrectLevel.L: + return QRRSBlock.RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 0]; + case QRErrorCorrectLevel.M: + return QRRSBlock.RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 1]; + case QRErrorCorrectLevel.Q: + return QRRSBlock.RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 2]; + case QRErrorCorrectLevel.H: + return QRRSBlock.RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 3]; + default: + return undefined; + } + } + + //--------------------------------------------------------------------- + // QRBitBuffer + //--------------------------------------------------------------------- + + function QRBitBuffer() { + this.buffer = new Array(); + this.length = 0; + } + + QRBitBuffer.prototype = { + + get: function(index) { + var bufIndex = Math.floor(index / 8); + return ((this.buffer[bufIndex] >>> (7 - index % 8)) & 1) == 1; + }, + + put: function(num, length) { + for (var i = 0; i < length; i++) { + this.putBit(((num >>> (length - i - 1)) & 1) == 1); + } + }, + + getLengthInBits: function() { + return this.length; + }, + + putBit: function(bit) { + + var bufIndex = Math.floor(this.length / 8); + if (this.buffer.length <= bufIndex) { + this.buffer.push(0); + } + + if (bit) { + this.buffer[bufIndex] |= (0x80 >>> (this.length % 8)); + } + + this.length++; + } + }; + + //--------------------------------------------------------------------- + // Support Chinese + //--------------------------------------------------------------------- + function utf16To8(text) { + var result = ''; + var c; + for (var i = 0; i < text.length; i++) { + c = text.charCodeAt(i); + if (c >= 0x0001 && c <= 0x007F) { + result += text.charAt(i); + } else if (c > 0x07FF) { + result += String.fromCharCode(0xE0 | c >> 12 & 0x0F); + result += String.fromCharCode(0x80 | c >> 6 & 0x3F); + result += String.fromCharCode(0x80 | c >> 0 & 0x3F); + } else { + result += String.fromCharCode(0xC0 | c >> 6 & 0x1F); + result += String.fromCharCode(0x80 | c >> 0 & 0x3F); + } + } + return result; + } + + uQRCode = { + + errorCorrectLevel: QRErrorCorrectLevel, + + defaults: { + size: 354, + margin: 0, + backgroundColor: '#ffffff', + foregroundColor: '#000000', + fileType: 'png', // 'jpg', 'png' + errorCorrectLevel: QRErrorCorrectLevel.H, + typeNumber: -1 + }, + + make: function(options) { + var defaultOptions = { + canvasId: options.canvasId, + componentInstance: options.componentInstance, + text: options.text, + size: this.defaults.size, + margin: this.defaults.margin, + backgroundColor: this.defaults.backgroundColor, + foregroundColor: this.defaults.foregroundColor, + fileType: this.defaults.fileType, + errorCorrectLevel: this.defaults.errorCorrectLevel, + typeNumber: this.defaults.typeNumber + }; + if (options) { + for (var i in options) { + defaultOptions[i] = options[i]; + } + } + options = defaultOptions; + if (!options.canvasId) { + console.error('uQRCode: Please set canvasId!'); + return; + } + + function createCanvas() { + var qrcode = new QRCode(options.typeNumber, options.errorCorrectLevel); + qrcode.addData(utf16To8(options.text)); + qrcode.make(); + + var ctx = uni.createCanvasContext(options.canvasId, options.componentInstance); + ctx.setFillStyle(options.backgroundColor); + ctx.fillRect(0, 0, options.size, options.size); + + var tileW = (options.size - options.margin * 2) / qrcode.getModuleCount(); + var tileH = tileW; + + for (var row = 0; row < qrcode.getModuleCount(); row++) { + for (var col = 0; col < qrcode.getModuleCount(); col++) { + var style = qrcode.isDark(row, col) ? options.foregroundColor : options.backgroundColor; + ctx.setFillStyle(style); + var x = Math.round(col * tileW) + options.margin; + var y = Math.round(row * tileH) + options.margin; + var w = Math.ceil((col + 1) * tileW) - Math.floor(col * tileW); + var h = Math.ceil((row + 1) * tileW) - Math.floor(row * tileW); + ctx.fillRect(x, y, w, h); + } + } + + setTimeout(function() { + ctx.draw(false, (function() { + setTimeout(function() { + uni.canvasToTempFilePath({ + canvasId: options.canvasId, + fileType: options.fileType, + width: options.size, + height: options.size, + destWidth: options.size, + destHeight: options.size, + success: function(res) { + options.success && options.success(res.tempFilePath); + }, + fail: function(error) { + options.fail && options.fail(error); + }, + complete: function(res) { + options.complete && options.complete(res); + } + }, options.componentInstance); + }, options.text.length + 100); + })()); + }, 150); + } + + createCanvas(); + } + + } + +})() + +export default uQRCode diff --git a/common/utils.js b/common/utils.js new file mode 100644 index 0000000..11276b2 --- /dev/null +++ b/common/utils.js @@ -0,0 +1,57 @@ +export function getDeviceUUID() { + let deviceId = uni.getStorageSync('uni_deviceId') || + uni.getSystemInfoSync().deviceId || + uni.getSystemInfoSync().system + '_' + Math.random().toString(36).substr(2); + + uni.setStorageSync('uni_deviceId', deviceId) + return deviceId; +} +export function friendlyDate(timestamp) { + var formats = { + 'year': '%n% 年前', + 'month': '%n% 月前', + 'day': '%n% 天前', + 'hour': '%n% 小时前', + 'minute': '%n% 分钟前', + 'second': '%n% 秒前', + }; + + var now = Date.now(); + var seconds = Math.floor((now - timestamp) / 1000); + var minutes = Math.floor(seconds / 60); + var hours = Math.floor(minutes / 60); + var days = Math.floor(hours / 24); + var months = Math.floor(days / 30); + var years = Math.floor(months / 12); + + var diffType = ''; + var diffValue = 0; + if (years > 0) { + diffType = 'year'; + diffValue = years; + } else { + if (months > 0) { + diffType = 'month'; + diffValue = months; + } else { + if (days > 0) { + diffType = 'day'; + diffValue = days; + } else { + if (hours > 0) { + diffType = 'hour'; + diffValue = hours; + } else { + if (minutes > 0) { + diffType = 'minute'; + diffValue = minutes; + } else { + diffType = 'second'; + diffValue = seconds === 0 ? (seconds = 1) : seconds; + } + } + } + } + } + return formats[diffType].replace('%n%', diffValue); +} \ No newline at end of file diff --git a/components/m-icon/m-icon.css b/components/m-icon/m-icon.css new file mode 100644 index 0000000..438151e --- /dev/null +++ b/components/m-icon/m-icon.css @@ -0,0 +1,378 @@ +@font-face { + font-family: uniicons; + font-weight: normal; + font-style: normal; + src: url('/static/uni.ttf') format('truetype'); +} + +.m-icon { + font-family: uniicons; + /* font-size: 24px; */ + margin-left: 20px; + font-weight: normal; + font-style: normal; + line-height: 1; + display: inline-block; + text-decoration: none; + -webkit-font-smoothing: antialiased; +} + +.m-icon.uni-active { + color: #007aff; +} + +.m-icon-contact:before { + content: '\e100'; +} + +.m-icon-person:before { + content: '\e101'; +} + +.m-icon-personadd:before { + content: '\e102'; +} + +.m-icon-contact-filled:before { + content: '\e130'; +} + +.m-icon-person-filled:before { + content: '\e131'; +} + +.m-icon-personadd-filled:before { + content: '\e132'; +} + +.m-icon-phone:before { + content: '\e200'; +} + +.m-icon-email:before { + content: '\e201'; +} + +.m-icon-chatbubble:before { + content: '\e202'; +} + +.m-icon-chatboxes:before { + content: '\e203'; +} + +.m-icon-phone-filled:before { + content: '\e230'; +} + +.m-icon-email-filled:before { + content: '\e231'; +} + +.m-icon-chatbubble-filled:before { + content: '\e232'; +} + +.m-icon-chatboxes-filled:before { + content: '\e233'; +} + +.m-icon-weibo:before { + content: '\e260'; +} + +.m-icon-weixin:before { + content: '\e261'; +} + +.m-icon-pengyouquan:before { + content: '\e262'; +} + +.m-icon-chat:before { + content: '\e263'; +} + +.m-icon-qq:before { + content: '\e264'; +} + +.m-icon-videocam:before { + content: '\e300'; +} + +.m-icon-camera:before { + content: '\e301'; +} + +.m-icon-mic:before { + content: '\e302'; +} + +.m-icon-location:before { + content: '\e303'; +} + +.m-icon-mic-filled:before, +.m-icon-speech:before { + content: '\e332'; +} + +.m-icon-location-filled:before { + content: '\e333'; +} + +.m-icon-micoff:before { + content: '\e360'; +} + +.m-icon-image:before { + content: '\e363'; +} + +.m-icon-map:before { + content: '\e364'; +} + +.m-icon-compose:before { + content: '\e400'; +} + +.m-icon-trash:before { + content: '\e401'; +} + +.m-icon-upload:before { + content: '\e402'; +} + +.m-icon-download:before { + content: '\e403'; +} + +.m-icon-close:before { + content: '\e404'; +} + +.m-icon-redo:before { + content: '\e405'; +} + +.m-icon-undo:before { + content: '\e406'; +} + +.m-icon-refresh:before { + content: '\e407'; +} + +.m-icon-star:before { + content: '\e408'; +} + +.m-icon-plus:before { + content: '\e409'; +} + +.m-icon-minus:before { + content: '\e410'; +} + +.m-icon-circle:before, +.m-icon-checkbox:before { + content: '\e411'; +} + +.m-icon-close-filled:before, +.m-icon-clear:before { + content: '\e434'; +} + +.m-icon-refresh-filled:before { + content: '\e437'; +} + +.m-icon-star-filled:before { + content: '\e438'; +} + +.m-icon-plus-filled:before { + content: '\e439'; +} + +.m-icon-minus-filled:before { + content: '\e440'; +} + +.m-icon-circle-filled:before { + content: '\e441'; +} + +.m-icon-checkbox-filled:before { + content: '\e442'; +} + +.m-icon-closeempty:before { + content: '\e460'; +} + +.m-icon-refreshempty:before { + content: '\e461'; +} + +.m-icon-reload:before { + content: '\e462'; +} + +.m-icon-starhalf:before { + content: '\e463'; +} + +.m-icon-spinner:before { + content: '\e464'; +} + +.m-icon-spinner-cycle:before { + content: '\e465'; +} + +.m-icon-search:before { + content: '\e466'; +} + +.m-icon-plusempty:before { + content: '\e468'; +} + +.m-icon-forward:before { + content: '\e470'; +} + +.m-icon-back:before, +.m-icon-left-nav:before { + content: '\e471'; +} + +.m-icon-checkmarkempty:before { + content: '\e472'; +} + +.m-icon-home:before { + content: '\e500'; +} + +.m-icon-navigate:before { + content: '\e501'; +} + +.m-icon-gear:before { + content: '\e502'; +} + +.m-icon-paperplane:before { + content: '\e503'; +} + +.m-icon-info:before { + content: '\e504'; +} + +.m-icon-help:before { + content: '\e505'; +} + +.m-icon-locked:before { + content: '\e506'; +} + +.m-icon-more:before { + content: '\e507'; +} + +.m-icon-flag:before { + content: '\e508'; +} + +.m-icon-home-filled:before { + content: '\e530'; +} + +.m-icon-gear-filled:before { + content: '\e532'; +} + +.m-icon-info-filled:before { + content: '\e534'; +} + +.m-icon-help-filled:before { + content: '\e535'; +} + +.m-icon-more-filled:before { + content: '\e537'; +} + +.m-icon-settings:before { + content: '\e560'; +} + +.m-icon-list:before { + content: '\e562'; +} + +.m-icon-bars:before { + content: '\e563'; +} + +.m-icon-loop:before { + content: '\e565'; +} + +.m-icon-paperclip:before { + content: '\e567'; +} + +.m-icon-eye:before { + content: '\e568'; +} + +.m-icon-arrowup:before { + content: '\e580'; +} + +.m-icon-arrowdown:before { + content: '\e581'; +} + +.m-icon-arrowleft:before { + content: '\e582'; +} + +.m-icon-arrowright:before { + content: '\e583'; +} + +.m-icon-arrowthinup:before { + content: '\e584'; +} + +.m-icon-arrowthindown:before { + content: '\e585'; +} + +.m-icon-arrowthinleft:before { + content: '\e586'; +} + +.m-icon-arrowthinright:before { + content: '\e587'; +} + +.m-icon-pulldown:before { + content: '\e588'; +} + +.m-icon-scan:before { + content: "\e612"; +} diff --git a/components/m-icon/m-icon.vue b/components/m-icon/m-icon.vue new file mode 100644 index 0000000..57cb1f7 --- /dev/null +++ b/components/m-icon/m-icon.vue @@ -0,0 +1,23 @@ + + + + + diff --git a/components/m-input.vue b/components/m-input.vue new file mode 100644 index 0000000..adc4327 --- /dev/null +++ b/components/m-input.vue @@ -0,0 +1,125 @@ + + + + + diff --git a/components/u-parse/components/wxParseAudio.vue b/components/u-parse/components/wxParseAudio.vue new file mode 100644 index 0000000..b277717 --- /dev/null +++ b/components/u-parse/components/wxParseAudio.vue @@ -0,0 +1,28 @@ + + + diff --git a/components/u-parse/components/wxParseImg.vue b/components/u-parse/components/wxParseImg.vue new file mode 100644 index 0000000..de9978b --- /dev/null +++ b/components/u-parse/components/wxParseImg.vue @@ -0,0 +1,94 @@ + + + diff --git a/components/u-parse/components/wxParseTable.vue b/components/u-parse/components/wxParseTable.vue new file mode 100644 index 0000000..e1e25bf --- /dev/null +++ b/components/u-parse/components/wxParseTable.vue @@ -0,0 +1,55 @@ + + + \ No newline at end of file diff --git a/components/u-parse/components/wxParseTemplate0.vue b/components/u-parse/components/wxParseTemplate0.vue new file mode 100644 index 0000000..01bf8e1 --- /dev/null +++ b/components/u-parse/components/wxParseTemplate0.vue @@ -0,0 +1,98 @@ + + + diff --git a/components/u-parse/components/wxParseTemplate1.vue b/components/u-parse/components/wxParseTemplate1.vue new file mode 100644 index 0000000..7054e35 --- /dev/null +++ b/components/u-parse/components/wxParseTemplate1.vue @@ -0,0 +1,88 @@ + + + diff --git a/components/u-parse/components/wxParseTemplate10.vue b/components/u-parse/components/wxParseTemplate10.vue new file mode 100644 index 0000000..11c252c --- /dev/null +++ b/components/u-parse/components/wxParseTemplate10.vue @@ -0,0 +1,88 @@ + + + diff --git a/components/u-parse/components/wxParseTemplate11.vue b/components/u-parse/components/wxParseTemplate11.vue new file mode 100644 index 0000000..0d04e53 --- /dev/null +++ b/components/u-parse/components/wxParseTemplate11.vue @@ -0,0 +1,86 @@ + + + diff --git a/components/u-parse/components/wxParseTemplate2.vue b/components/u-parse/components/wxParseTemplate2.vue new file mode 100644 index 0000000..f06782a --- /dev/null +++ b/components/u-parse/components/wxParseTemplate2.vue @@ -0,0 +1,88 @@ + + + diff --git a/components/u-parse/components/wxParseTemplate3.vue b/components/u-parse/components/wxParseTemplate3.vue new file mode 100644 index 0000000..b0943f8 --- /dev/null +++ b/components/u-parse/components/wxParseTemplate3.vue @@ -0,0 +1,88 @@ + + + diff --git a/components/u-parse/components/wxParseTemplate4.vue b/components/u-parse/components/wxParseTemplate4.vue new file mode 100644 index 0000000..8a43756 --- /dev/null +++ b/components/u-parse/components/wxParseTemplate4.vue @@ -0,0 +1,88 @@ + + + diff --git a/components/u-parse/components/wxParseTemplate5.vue b/components/u-parse/components/wxParseTemplate5.vue new file mode 100644 index 0000000..0c0993e --- /dev/null +++ b/components/u-parse/components/wxParseTemplate5.vue @@ -0,0 +1,88 @@ + + + diff --git a/components/u-parse/components/wxParseTemplate6.vue b/components/u-parse/components/wxParseTemplate6.vue new file mode 100644 index 0000000..0dca28a --- /dev/null +++ b/components/u-parse/components/wxParseTemplate6.vue @@ -0,0 +1,88 @@ + + + diff --git a/components/u-parse/components/wxParseTemplate7.vue b/components/u-parse/components/wxParseTemplate7.vue new file mode 100644 index 0000000..b62acaf --- /dev/null +++ b/components/u-parse/components/wxParseTemplate7.vue @@ -0,0 +1,88 @@ + + + diff --git a/components/u-parse/components/wxParseTemplate8.vue b/components/u-parse/components/wxParseTemplate8.vue new file mode 100644 index 0000000..f6fa037 --- /dev/null +++ b/components/u-parse/components/wxParseTemplate8.vue @@ -0,0 +1,88 @@ + + + diff --git a/components/u-parse/components/wxParseTemplate9.vue b/components/u-parse/components/wxParseTemplate9.vue new file mode 100644 index 0000000..47ac81a --- /dev/null +++ b/components/u-parse/components/wxParseTemplate9.vue @@ -0,0 +1,88 @@ + + + diff --git a/components/u-parse/components/wxParseVideo.vue b/components/u-parse/components/wxParseVideo.vue new file mode 100644 index 0000000..7d05285 --- /dev/null +++ b/components/u-parse/components/wxParseVideo.vue @@ -0,0 +1,15 @@ + + + diff --git a/components/u-parse/libs/html2json.js b/components/u-parse/libs/html2json.js new file mode 100644 index 0000000..0927382 --- /dev/null +++ b/components/u-parse/libs/html2json.js @@ -0,0 +1,261 @@ +/** + * html2Json 改造来自: https://github.com/Jxck/html2json + * + * + * author: Di (微信小程序开发工程师) + * organization: WeAppDev(微信小程序开发论坛)(http://weappdev.com) + * 垂直微信小程序开发交流社区 + * + * github地址: https://github.com/icindy/wxParse + * + * for: 微信小程序富文本解析 + * detail : http://weappdev.com/t/wxparse-alpha0-1-html-markdown/184 + */ + +import wxDiscode from './wxDiscode'; +import HTMLParser from './htmlparser'; + +function makeMap(str) { + const obj = {}; + const items = str.split(','); + for (let i = 0; i < items.length; i += 1) obj[items[i]] = true; + return obj; +} + +// Block Elements - HTML 5 +const block = makeMap('br,code,address,article,applet,aside,audio,blockquote,button,canvas,center,dd,del,dir,div,dl,dt,fieldset,figcaption,figure,footer,form,frameset,h1,h2,h3,h4,h5,h6,header,hgroup,hr,iframe,ins,isindex,li,map,menu,noframes,noscript,object,ol,output,p,pre,section,script,table,tbody,td,tfoot,th,thead,tr,ul,video'); + +// Inline Elements - HTML 5 +const inline = makeMap('a,abbr,acronym,applet,b,basefont,bdo,big,button,cite,del,dfn,em,font,i,iframe,img,input,ins,kbd,label,map,object,q,s,samp,script,select,small,span,strike,strong,sub,sup,textarea,tt,u,var'); + +// Elements that you can, intentionally, leave open +// (and which close themselves) +const closeSelf = makeMap('colgroup,dd,dt,li,options,p,td,tfoot,th,thead,tr'); + +function removeDOCTYPE(html) { + const isDocument = /([^]*)<\/body>/.test(html); + return isDocument ? RegExp.$1 : html; +} + +function trimHtml(html) { + return html + .replace(//gi, '') + .replace(/\/\*.*?\*\//gi, '') + .replace(/[ ]+/gi, '') + .replace(//gi, ''); +} + +function getScreenInfo() { + const screen = {}; + wx.getSystemInfo({ + success: (res) => { + screen.width = res.windowWidth; + screen.height = res.windowHeight; + }, + }); + return screen; +} + +function html2json(html, customHandler, imageProp, host) { + // 处理字符串 + html = removeDOCTYPE(html); + html = trimHtml(html); + html = wxDiscode.strDiscode(html); + // 生成node节点 + const bufArray = []; + const results = { + nodes: [], + imageUrls: [], + }; + + const screen = getScreenInfo(); + function Node(tag) { + this.node = 'element'; + this.tag = tag; + + this.$screen = screen; + } + + HTMLParser(html, { + start(tag, attrs, unary) { + // node for this element + const node = new Node(tag); + + if (bufArray.length !== 0) { + const parent = bufArray[0]; + if (parent.nodes === undefined) { + parent.nodes = []; + } + } + + if (block[tag]) { + node.tagType = 'block'; + } else if (inline[tag]) { + node.tagType = 'inline'; + } else if (closeSelf[tag]) { + node.tagType = 'closeSelf'; + } + + node.attr = attrs.reduce((pre, attr) => { + const { name } = attr; + let { value } = attr; + if (name === 'class') { + node.classStr = value; + } + // has multi attibutes + // make it array of attribute + if (name === 'style') { + node.styleStr = value; + } + if (value.match(/ /)) { + value = value.split(' '); + } + + // if attr already exists + // merge it + if (pre[name]) { + if (Array.isArray(pre[name])) { + // already array, push to last + pre[name].push(value); + } else { + // single value, make it array + pre[name] = [pre[name], value]; + } + } else { + // not exist, put it + pre[name] = value; + } + + return pre; + }, {}); + + // 优化样式相关属性 + if (node.classStr) { + node.classStr += ` ${node.tag}`; + } else { + node.classStr = node.tag; + } + if (node.tagType === 'inline') { + node.classStr += ' inline'; + } + + // 对img添加额外数据 + if (node.tag === 'img') { + let imgUrl = node.attr.src; + imgUrl = wxDiscode.urlToHttpUrl(imgUrl, imageProp.domain); + Object.assign(node.attr, imageProp, { + src: imgUrl || '', + }); + if (imgUrl) { + results.imageUrls.push(imgUrl); + } + } + + // 处理a标签属性 + if (node.tag === 'a') { + node.attr.href = node.attr.href || ''; + } + + // 处理font标签样式属性 + if (node.tag === 'font') { + const fontSize = [ + 'x-small', + 'small', + 'medium', + 'large', + 'x-large', + 'xx-large', + '-webkit-xxx-large', + ]; + const styleAttrs = { + color: 'color', + face: 'font-family', + size: 'font-size', + }; + if (!node.styleStr) node.styleStr = ''; + Object.keys(styleAttrs).forEach((key) => { + if (node.attr[key]) { + const value = key === 'size' ? fontSize[node.attr[key] - 1] : node.attr[key]; + node.styleStr += `${styleAttrs[key]}: ${value};`; + } + }); + } + + // 临时记录source资源 + if (node.tag === 'source') { + results.source = node.attr.src; + } + + if (customHandler.start) { + customHandler.start(node, results); + } + + if (unary) { + // if this tag doesn't have end tag + // like + // add to parents + const parent = bufArray[0] || results; + if (parent.nodes === undefined) { + parent.nodes = []; + } + parent.nodes.push(node); + } else { + bufArray.unshift(node); + } + }, + end(tag) { + // merge into parent tag + const node = bufArray.shift(); + if (node.tag !== tag) { + console.error('invalid state: mismatch end tag'); + } + + // 当有缓存source资源时于于video补上src资源 + if (node.tag === 'video' && results.source) { + node.attr.src = results.source; + delete results.source; + } + + if (customHandler.end) { + customHandler.end(node, results); + } + + if (bufArray.length === 0) { + results.nodes.push(node); + } else { + const parent = bufArray[0]; + if (!parent.nodes) { + parent.nodes = []; + } + parent.nodes.push(node); + } + }, + chars(text) { + if (!text.trim()) return; + + const node = { + node: 'text', + text, + }; + + if (customHandler.chars) { + customHandler.chars(node, results); + } + + if (bufArray.length === 0) { + results.nodes.push(node); + } else { + const parent = bufArray[0]; + if (parent.nodes === undefined) { + parent.nodes = []; + } + parent.nodes.push(node); + } + }, + }); + + return results; +} + +export default html2json; diff --git a/components/u-parse/libs/htmlparser.js b/components/u-parse/libs/htmlparser.js new file mode 100644 index 0000000..2939da3 --- /dev/null +++ b/components/u-parse/libs/htmlparser.js @@ -0,0 +1,156 @@ +/** + * + * htmlParser改造自: https://github.com/blowsie/Pure-JavaScript-HTML5-Parser + * + * author: Di (微信小程序开发工程师) + * organization: WeAppDev(微信小程序开发论坛)(http://weappdev.com) + * 垂直微信小程序开发交流社区 + * + * github地址: https://github.com/icindy/wxParse + * + * for: 微信小程序富文本解析 + * detail : http://weappdev.com/t/wxparse-alpha0-1-html-markdown/184 + */ +// Regular Expressions for parsing tags and attributes + +const startTag = /^<([-A-Za-z0-9_]+)((?:\s+[a-zA-Z0-9_:][-a-zA-Z0-9_:.]*(?:\s*=\s*(?:(?:"[^"]*")|(?:'[^']*')|[^>\s]+))?)*)\s*(\/?)>/; +const endTag = /^<\/([-A-Za-z0-9_]+)[^>]*>/; +const attr = /([a-zA-Z0-9_:][-a-zA-Z0-9_:.]*)(?:\s*=\s*(?:(?:"((?:\\.|[^"])*)")|(?:'((?:\\.|[^'])*)')|([^>\s]+)))?/g; + +function makeMap(str) { + const obj = {}; + const items = str.split(','); + for (let i = 0; i < items.length; i += 1) obj[items[i]] = true; + return obj; +} + +// Empty Elements - HTML 5 +const empty = makeMap('area,base,basefont,br,col,frame,hr,img,input,link,meta,param,embed,command,keygen,source,track,wbr'); + +// Block Elements - HTML 5 +const block = makeMap('address,code,article,applet,aside,audio,blockquote,button,canvas,center,dd,del,dir,div,dl,dt,fieldset,figcaption,figure,footer,form,frameset,h1,h2,h3,h4,h5,h6,header,hgroup,hr,iframe,ins,isindex,li,map,menu,noframes,noscript,object,ol,output,p,pre,section,script,table,tbody,td,tfoot,th,thead,tr,ul,video'); + +// Inline Elements - HTML 5 +const inline = makeMap('a,abbr,acronym,applet,b,basefont,bdo,big,br,button,cite,del,dfn,em,font,i,iframe,img,input,ins,kbd,label,map,object,q,s,samp,script,select,small,span,strike,strong,sub,sup,textarea,tt,u,var'); + +// Elements that you can, intentionally, leave open +// (and which close themselves) +const closeSelf = makeMap('colgroup,dd,dt,li,options,p,td,tfoot,th,thead,tr'); + +// Attributes that have their values filled in disabled="disabled" +const fillAttrs = makeMap('checked,compact,declare,defer,disabled,ismap,multiple,nohref,noresize,noshade,nowrap,readonly,selected'); + +function HTMLParser(html, handler) { + let index; + let chars; + let match; + let last = html; + const stack = []; + + stack.last = () => stack[stack.length - 1]; + + function parseEndTag(tag, tagName) { + // If no tag name is provided, clean shop + let pos; + if (!tagName) { + pos = 0; + } else { + // Find the closest opened tag of the same type + tagName = tagName.toLowerCase(); + for (pos = stack.length - 1; pos >= 0; pos -= 1) { + if (stack[pos] === tagName) break; + } + } + if (pos >= 0) { + // Close all the open elements, up the stack + for (let i = stack.length - 1; i >= pos; i -= 1) { + if (handler.end) handler.end(stack[i]); + } + + // Remove the open elements from the stack + stack.length = pos; + } + } + + function parseStartTag(tag, tagName, rest, unary) { + tagName = tagName.toLowerCase(); + + if (block[tagName]) { + while (stack.last() && inline[stack.last()]) { + parseEndTag('', stack.last()); + } + } + + if (closeSelf[tagName] && stack.last() === tagName) { + parseEndTag('', tagName); + } + + unary = empty[tagName] || !!unary; + + if (!unary) stack.push(tagName); + + if (handler.start) { + const attrs = []; + + rest.replace(attr, function genAttr(matches, name) { + const value = arguments[2] || arguments[3] || arguments[4] || (fillAttrs[name] ? name : ''); + + attrs.push({ + name, + value, + escaped: value.replace(/(^|[^\\])"/g, '$1\\"'), // " + }); + }); + + if (handler.start) { + handler.start(tagName, attrs, unary); + } + } + } + + while (html) { + chars = true; + + if (html.indexOf(' '); +// str = str.replace(/ | | /g, ' '); +// str = str.replace(/"|"|"/g, "\""); +// str = str.replace(/'|'|'/g, "'"); +// str = str.replace(/´|´|´/g, "´"); +// str = str.replace(/×|×|×/g, "×"); +// str = str.replace(/÷|÷|÷/g, "÷"); +// str = str.replace(/&|&|&/g, '&'); +// str = str.replace(/<|<|</g, '<'); +// str = str.replace(/>|>|>/g, '>'); + + + + +str = str.replace(/ | | /g, " "); +str = str.replace(/ | | /g, ''); +str = str.replace(/ | /g, ' '); +str = str.replace(/ | | /g, ''); +str = str.replace(/"|"|"/g, "\""); +str = str.replace(/"|'|'/g, "'"); +str = str.replace(/´|´|´/g, "´"); +str = str.replace(/×|×|×/g, "×"); +str = str.replace(/÷|÷|÷/g, "÷"); +str = str.replace(/&|&|&/g, '&'); +str = str.replace(/<|<|</g, '<'); +str = str.replace(/>|>|>/g, '>'); +return str; +} + +// HTML 支持的其他实体 +function strOtherDiscode(str) { +str = str.replace(/Œ|Œ|Œ/g, 'Œ'); +str = str.replace(/œ|œ|œ/g, 'œ'); +str = str.replace(/Š|Š|Š/g, 'Š'); +str = str.replace(/š|š|š/g, 'š'); +str = str.replace(/Ÿ|Ÿ|Ÿ/g, 'Ÿ'); +str = str.replace(/ƒ|ƒ|ƒ/g, 'ƒ'); +str = str.replace(/ˆ|ˆ|ˆ/g, 'ˆ'); +str = str.replace(/˜|˜|˜/g, '˜'); +str = str.replace(/ |$#8201;| /g, ''); +str = str.replace(/‌|‌|‌/g, ''); +str = str.replace(/‍|$#8205;|‍/g, ''); +str = str.replace(/‎|$#8206;|‎/g, ''); +str = str.replace(/‏|‏|‏/g, ''); +str = str.replace(/–|–|–/g, '–'); +str = str.replace(/—|—|—/g, '—'); +str = str.replace(/‘|‘|‘/g, '‘'); +str = str.replace(/’|’|’/g, '’'); +str = str.replace(/‚|‚|‚/g, '‚'); +str = str.replace(/“|“|“/g, '“'); +str = str.replace(/”|”|”/g, '”'); +str = str.replace(/„|„|„/g, '„'); +str = str.replace(/†|†|†/g, '†'); +str = str.replace(/‡|‡|‡/g, '‡'); +str = str.replace(/•|•|•/g, '•'); +str = str.replace(/…|…|…/g, '…'); +str = str.replace(/‰|‰|‰/g, '‰'); +str = str.replace(/′|′|′/g, '′'); +str = str.replace(/″|″|″/g, '″'); +str = str.replace(/‹|‹|‹/g, '‹'); +str = str.replace(/›|›|›/g, '›'); +str = str.replace(/‾|‾|‾/g, '‾'); +str = str.replace(/€|€|€/g, '€'); +str = str.replace(/™|™|™/g, '™'); +str = str.replace(/←|←|←/g, '←'); +str = str.replace(/↑|↑|↑/g, '↑'); +str = str.replace(/→|→|→/g, '→'); +str = str.replace(/↓|↓|↓/g, '↓'); +str = str.replace(/↔|↔|↔/g, '↔'); +str = str.replace(/↵|↵|↵/g, '↵'); +str = str.replace(/⌈|⌈|⌈/g, '⌈'); +str = str.replace(/⌉|⌉|⌉/g, '⌉'); +str = str.replace(/⌊|⌊|⌊/g, '⌊'); +str = str.replace(/⌋|⌋|⌋/g, '⌋'); +str = str.replace(/◊|◊|◊/g, '◊'); +str = str.replace(/♠|♠|♠/g, '♠'); +str = str.replace(/♣|♣|♣/g, '♣'); +str = str.replace(/♥|♥|♥/g, '♥'); +str = str.replace(/♦|♦|♦/g, '♦'); +return str; +} + +function strDiscode(str) { + str = strNumDiscode(str); + str = strGreeceDiscode(str); + str = strcharacterDiscode(str); + str = strOtherDiscode(str); + return str; +} + +function urlToHttpUrl(url, domain) { + if (/^\/\//.test(url)) { + return `https:${url}`; + } else if (/^\//.test(url)) { + return `https://${domain}${url}`; + } + return url; +} + +export default { + strDiscode, + urlToHttpUrl, +}; diff --git a/components/u-parse/parse.css b/components/u-parse/parse.css new file mode 100644 index 0000000..49c789c --- /dev/null +++ b/components/u-parse/parse.css @@ -0,0 +1,258 @@ +/** + * author: Di (微信小程序开发工程师) + * organization: WeAppDev(微信小程序开发论坛)(http://weappdev.com) + * 垂直微信小程序开发交流社区 + * + * github地址: https://github.com/icindy/wxParse + * + * for: 微信小程序富文本解析 + * detail : http://weappdev.com/t/wxparse-alpha0-1-html-markdown/184 + */ +/** + * 请在全局下引入该文件,@import '/static/wxParse.css'; + */ +.wxParse { + user-select:none; + width: 100%; + font-family: Helvetica, "PingFangSC", 'Microsoft Yahei', '微软雅黑', Arial, sans-serif; + color: #333; + line-height: 1.5; + font-size: 14px; + text-align:justify;/* //左右两端对齐 */ +} +.wxParse view ,.wxParse uni-view{ + word-break: break-word; +} +.wxParse .p { + padding-bottom: 0.5em; + clear: both; + /* letter-spacing: 0;//字间距 */ +} +.wxParse .inline { + display: inline; + margin: 0; + padding: 0; +} + +.wxParse .div { + margin: 0; + padding: 0; + display: block; +} + +.wxParse .h1{ + font-size: 2em; + line-height: 1.2em; + margin: 0.67em 0; +} +.wxParse .h2{ + font-size: 1.5em; + margin: 0.83em 0; +} +.wxParse .h3{ + font-size: 1.17em; + margin: 1em 0; +} +.wxParse .h4{ + margin: 1.33em 0; +} +.wxParse .h5{ + font-size: 0.83em; + margin: 1.67em 0; +} +.wxParse .h6{ + font-size: 0.83em; + margin: 1.67em 0; +} + +.wxParse .h1, +.wxParse .h2, +.wxParse .h3, +.wxParse .h4, +.wxParse .h5, +.wxParse .h6, +.wxParse .b, +.wxParse .strong{ + font-weight: bolder; +} + +.wxParse .i, +.wxParse .cite, +.wxParse .em, +.wxParse .var, +.wxParse .address { + font-style: italic; +} +.wxParse .spaceshow{ + white-space: pre; +} +.wxParse .pre, +.wxParse .tt, +.wxParse .code, +.wxParse .kbd, +.wxParse .samp { + font-family: monospace; +} +.wxParse .pre { + overflow: auto; + background: #f5f5f5; + padding: 16upx; + white-space: pre; + margin: 1em 0upx; + font-size: 24upx; +} +.wxParse .code { + overflow: auto; + padding: 16upx; + white-space: pre; + margin: 1em 0upx; + background: #f5f5f5; + font-size: 24upx; +} + +.wxParse .big { + font-size: 1.17em; +} + +.wxParse .small, +.wxParse .sub, +.wxParse .sup { + font-size: 0.83em; +} + +.wxParse .sub { + vertical-align: sub; +} +.wxParse .sup { + vertical-align: super; +} + +.wxParse .s, +.wxParse .strike, +.wxParse .del { + text-decoration: line-through; +} + +.wxParse .strong, +.wxParse .text, +.wxParse .span, +.wxParse .s { + display: inline; +} + +.wxParse .a { + color: deepskyblue; +} + +.wxParse .video { + text-align: center; + margin: 22upx 0; +} + +.wxParse .video-video { + width: 100%; +} +.wxParse .uni-image{ + max-width: 100%; +} +.wxParse .img { + display: block; + max-width: 100%; + margin-bottom: 0em;/* //与p标签底部padding同时修改 */ + overflow: hidden; +} + +.wxParse .blockquote { + margin: 10upx 0; + padding: 22upx 0 22upx 22upx; + font-family: Courier, Calibri, "宋体"; + background: #f5f5f5; + border-left: 6upx solid #dbdbdb; +} +.wxParse .blockquote .p { + margin: 0; +} +.wxParse .ul, .wxParse .ol { + display: block; + margin: 1em 0; + padding-left: 2em; +} +.wxParse .ol { + list-style-type: disc; +} +.wxParse .ol { + list-style-type: decimal; +} +.wxParse .ol>weixin-parse-template,.wxParse .ul>weixin-parse-template { + display: list-item; + align-items: baseline; + text-align: match-parent; +} + +.wxParse .ol>.li,.wxParse .ul>.li { + display: list-item; + align-items: baseline; + text-align: match-parent; +} +.wxParse .ul .ul, .wxParse .ol .ul { + list-style-type: circle; +} +.wxParse .ol .ol .ul, .wxParse .ol .ul .ul, .wxParse .ul .ol .ul, .wxParse .ul .ul .ul { + list-style-type: square; +} + +.wxParse .u { + text-decoration: underline; +} +.wxParse .hide { + display: none; +} +.wxParse .del { + display: inline; +} +.wxParse .figure { + overflow: hidden; +} +.wxParse .tablebox{ + overflow: auto; + background-color: #f5f5f5; + background: #f5f5f5; + font-size: 13px; + padding: 8px; +} +.wxParse .table .table,.wxParse .table{ + border-collapse:collapse; + box-sizing: border-box; + /* 内边框 */ + /* width: 100%; */ + overflow: auto; + white-space: pre; +} +.wxParse .tbody{ + border-collapse:collapse; + box-sizing: border-box; + /* 内边框 */ + border: 1px solid #dadada; +} +.wxParse .table .thead, .wxParse .table .tfoot, .wxParse .table .th{ + border-collapse:collapse; + box-sizing: border-box; + background: #ececec; + font-weight: 40; +} +.wxParse .table .tr { + border-collapse:collapse; + box-sizing: border-box; + /* border: 2px solid #F0AD4E; */ + overflow:auto; +} +.wxParse .table .th, +.wxParse .table .td{ + border-collapse:collapse; + box-sizing: border-box; + border: 2upx solid #dadada; + overflow:auto; +} +.wxParse .audio, .wxParse .uni-audio-default{ + display: block; +} \ No newline at end of file diff --git a/components/u-parse/parse.vue b/components/u-parse/parse.vue new file mode 100644 index 0000000..f255166 --- /dev/null +++ b/components/u-parse/parse.vue @@ -0,0 +1,228 @@ + + + + + diff --git a/components/uni-badge/uni-badge.vue b/components/uni-badge/uni-badge.vue new file mode 100644 index 0000000..4291fbc --- /dev/null +++ b/components/uni-badge/uni-badge.vue @@ -0,0 +1,153 @@ + + + + + diff --git a/components/uni-clientdb/license.md b/components/uni-clientdb/license.md new file mode 100644 index 0000000..2b0e438 --- /dev/null +++ b/components/uni-clientdb/license.md @@ -0,0 +1,30 @@ +# clientDB使用许可协议 +本协议是数字天堂(北京)网络技术有限公司(以下称“DCloud”)与您之间达成的关于clientDB框架(以下简称本框架)的协议。 +本协议签订地点为中华人民共和国北京市海淀区。 +您使用本框架即视为您已阅读并同意受本协议的约束。 + +## 知识产权及使用授权 +您可以自由下载、使用、复制本框架而不需要向DCloud付费。 +DCloud所拥有的知识产权,包括但不限于商标、专利、著作权、商业秘密、专有数据、源码,并不发生转移或共享。 +您使用本框架开发的代码及输出物,包括但不限于网站、移动应用,其知识产权归属您所有。 +本框架未包含第三方软件或技术,不涉及额外遵循第三方软件的授权协议问题。 + +## 您的义务 +您不得破解、反编译、逆向工程本框架,不得破解或劫持本框架网络请求,不得对DCloud服务进行网络攻击,不得利用DCloud系统漏洞谋利或侵害DCloud利益,不得替换、删改本框架自带的非用户自定义文件。 +未经书面许可您不可利用DCloud产品的全部或部分文件、模块、组件来制作与DCloud争夺用户的产品(通过DCloud插件市场服务开发者不属于此范围)。 +如果您违反您的义务,DCloud将有权停止您使用本框架,造成的损失由您自行承担。 +如果您给DCloud造成重大损失,或者在接收到DCloud的停止违约通知后拒不改正,DCloud将有权停止对您的DCloud所有产品和服务的使用授权,冻结您在DCloud所有产品服务中的预付款项和应收款项,因此造成的损失由您自行承担。 +如果您的行为产生法律问题,DCloud有权追责您的法律责任。 + +## 隐私条款 +本框架未进行任何数据采集、发送等涉及数据隐私的行为。 + +## 安全 +您理解并同意,本框架同其他软件一样,无法承诺绝对的安全性。 +当DCloud发现本框架的任何安全漏洞时,将及时在[社区](https://ask.dcloud.net.cn/explore/)发送公告,并将及时发布紧急更新补丁和升级推送通知。 + +## 免责声明 +DCloud不因开发者使用本框架而承担任何法律责任。 + +## 协议修订 +根据发展,DCloud可能会对本协议进行修改。修改时,DCloud会在产品或者网页中显著的位置发布相关信息以便及时通知到用户。如果您选择继续使用本框架,即表示您同意接受这些修改。 diff --git a/components/uni-clientdb/uni-clientdb.vue b/components/uni-clientdb/uni-clientdb.vue new file mode 100644 index 0000000..dea1ac4 --- /dev/null +++ b/components/uni-clientdb/uni-clientdb.vue @@ -0,0 +1,377 @@ + + + diff --git a/components/uni-forms-item/uni-forms-item.vue b/components/uni-forms-item/uni-forms-item.vue new file mode 100644 index 0000000..cb91412 --- /dev/null +++ b/components/uni-forms-item/uni-forms-item.vue @@ -0,0 +1,437 @@ + + + + + diff --git a/components/uni-forms/uni-forms.vue b/components/uni-forms/uni-forms.vue new file mode 100644 index 0000000..5065cde --- /dev/null +++ b/components/uni-forms/uni-forms.vue @@ -0,0 +1,420 @@ + + + + + diff --git a/components/uni-forms/validate.js b/components/uni-forms/validate.js new file mode 100644 index 0000000..e369abb --- /dev/null +++ b/components/uni-forms/validate.js @@ -0,0 +1,442 @@ + +var pattern = { + email: /^\S+?@\S+?\.\S+?$/, + url: new RegExp("^(?!mailto:)(?:(?:http|https|ftp)://|//)(?:\\S+(?::\\S*)?@)?(?:(?:(?:[1-9]\\d?|1\\d\\d|2[01]\\d|22[0-3])(?:\\.(?:1?\\d{1,2}|2[0-4]\\d|25[0-5])){2}(?:\\.(?:[0-9]\\d?|1\\d\\d|2[0-4]\\d|25[0-4]))|(?:(?:[a-z\\u00a1-\\uffff0-9]+-*)*[a-z\\u00a1-\\uffff0-9]+)(?:\\.(?:[a-z\\u00a1-\\uffff0-9]+-*)*[a-z\\u00a1-\\uffff0-9]+)*(?:\\.(?:[a-z\\u00a1-\\uffff]{2,})))|localhost)(?::\\d{2,5})?(?:(/|\\?|#)[^\\s]*)?$", 'i') +}; + +const FORMAT_MAPPING = { + "int": 'number', + "bool": 'boolean', + "double": 'number', + "long": 'number', + "password": 'string' +} + +function formatMessage(args, resources) { + var defaultMessage = ['label'] + defaultMessage.forEach((item) => { + if (args[item] === undefined) { + args[item] = '' + } + }) + + let str = resources + for (let key in args) { + let reg = new RegExp('{' + key + '}') + str = str.replace(reg, args[key]) + } + return str +} + +function isEmptyValue(value, type) { + if (value === undefined || value === null) { + return true; + } + + if (typeof value === 'string' && !value) { + return true; + } + + if (Array.isArray(value) && !value.length) { + return true; + } + + if (type === 'object' && !Object.keys(value).length) { + return true; + } + + return false; +} + +const types = { + integer(value) { + return types.number(value) && parseInt(value, 10) === value; + }, + string(value) { + return typeof value === 'string'; + }, + number(value) { + if (isNaN(value)) { + return false; + } + return typeof value === 'number'; + }, + "boolean": function (value) { + return typeof value === 'boolean'; + }, + "float": function (value) { + return types.number(value) && !types.integer(value); + }, + array(value) { + return Array.isArray(value); + }, + object(value) { + return typeof value === 'object' && !types.array(value); + }, + date(value) { + var v + if (value instanceof Date) { + v = value; + } else { + v = new Date(value); + } + return typeof v.getTime === 'function' && typeof v.getMonth === 'function' && typeof v.getYear === 'function' && !isNaN(v.getTime()); + }, + timestamp(value) { + if (!this.integer(value) || Math.abs(value).toString().length > 16) { + return false + } + + return this.date(value); + }, + email(value) { + return typeof value === 'string' && !!value.match(pattern.email) && value.length < 255; + }, + url(value) { + return typeof value === 'string' && !!value.match(pattern.url); + }, + pattern(reg, value) { + try { + return new RegExp(reg).test(value); + } catch (e) { + return false; + } + }, + method(value) { + return typeof value === 'function'; + } +} + +class RuleValidator { + + constructor(message) { + this._message = message + } + + async validateRule(key, value, data, allData) { + var result = null + + let rules = key.rules + + let hasRequired = rules.findIndex((item) => { + return item.required + }) + if (hasRequired < 0) { + if (value === null || value === undefined) { + return result + } + if (typeof value === 'string' && !value.length) { + return result + } + } + + var message = this._message + + if (rules === undefined) { + return message['default'] + } + + for (var i = 0; i < rules.length; i++) { + let rule = rules[i] + let vt = this._getValidateType(rule) + + if (key.label !== undefined) { + Object.assign(rule, { + label: key.label + }) + } + + if (RuleValidatorHelper[vt]) { + result = RuleValidatorHelper[vt](rule, value, message) + if (result != null) { + break + } + } + + if (rule.validateExpr) { + let now = Date.now() + let resultExpr = rule.validateExpr(value, allData, now) + if (resultExpr === false) { + result = this._getMessage(rule, rule.errorMessage || this._message['default']) + break + } + } + + if (rule.validateFunction) { + result = await this.validateFunction(rule, value, data, allData, vt) + if (result !== null) { + break + } + } + } + + return result + } + + async validateFunction(rule, value, data, allData, vt) { + let result = null + try { + let callbackMessage = null + const res = await rule.validateFunction(rule, value, allData || data, (message) => { + callbackMessage = message + }) + if (callbackMessage || (typeof res === 'string' && res) || res === false) { + result = this._getMessage(rule, callbackMessage || res, vt) + } + } catch (e) { + result = this._getMessage(rule, e.message, vt) + } + return result + } + + _getMessage(rule, message, vt) { + return formatMessage(rule, message || rule.errorMessage || this._message[vt] || message['default']) + } + + _getValidateType(rule) { + // TODO + var result = '' + if (rule.required) { + result = 'required' + } else if (rule.format) { + result = 'format' + } else if (rule.range) { + result = 'range' + } else if (rule.maximum || rule.minimum) { + result = 'rangeNumber' + } else if (rule.maxLength || rule.minLength) { + result = 'rangeLength' + } else if (rule.pattern) { + result = 'pattern' + } + return result + } +} + +const RuleValidatorHelper = { + required(rule, value, message) { + if (rule.required && isEmptyValue(value, rule.format || typeof value)) { + return formatMessage(rule, rule.errorMessage || message.required); + } + + return null + }, + + range(rule, value, message) { + const { range, errorMessage } = rule; + + let list = new Array(range.length); + for (let i = 0; i < range.length; i++) { + const item = range[i]; + if (types.object(item) && item.value !== undefined) { + list[i] = item.value; + } else { + list[i] = item; + } + } + + let result = false + if (Array.isArray(value)) { + result = (new Set(value.concat(list)).size === list.length); + } else { + if (list.indexOf(value) > -1) { + result = true; + } + } + + if (!result) { + return formatMessage(rule, errorMessage || message['enum']); + } + + return null + }, + + rangeNumber(rule, value, message) { + if (!types.number(value)) { + return formatMessage(rule, rule.errorMessage || message.pattern.mismatch); + } + + let { minimum, maximum, exclusiveMinimum, exclusiveMaximum } = rule; + let min = exclusiveMinimum ? value <= minimum : value < minimum; + let max = exclusiveMaximum ? value >= maximum : value > maximum; + + if (minimum !== undefined && min) { + return formatMessage(rule, rule.errorMessage || message['number'].min) + } else if (maximum !== undefined && max) { + return formatMessage(rule, rule.errorMessage || message['number'].max) + } else if (minimum !== undefined && maximum !== undefined && (min || max)) { + return formatMessage(rule, rule.errorMessage || message['number'].range) + } + + return null + }, + + rangeLength(rule, value, message) { + if (!types.string(value) && !types.array(value)) { + return formatMessage(rule, rule.errorMessage || message.pattern.mismatch); + } + + let min = rule.minLength; + let max = rule.maxLength; + let val = value.length; + + if (min !== undefined && val < min) { + return formatMessage(rule, rule.errorMessage || message['length'].min) + } else if (max !== undefined && val > max) { + return formatMessage(rule, rule.errorMessage || message['length'].max) + } else if (min !== undefined && max !== undefined && (val < min || val > max)) { + return formatMessage(rule, rule.errorMessage || message['length'].range) + } + + return null + }, + + pattern(rule, value, message) { + if (!types['pattern'](rule.pattern, value)) { + return formatMessage(rule, rule.errorMessage || message.pattern.mismatch); + } + + return null + }, + + format(rule, value, message) { + var customTypes = Object.keys(types); + var format = FORMAT_MAPPING[rule.format] ? FORMAT_MAPPING[rule.format] : rule.format; + + if (customTypes.indexOf(format) > -1) { + if (!types[format](value)) { + return formatMessage(rule, rule.errorMessage || message.types[format]); + } + } + + return null + } +} + +class SchemaValidator extends RuleValidator { + + constructor(schema, options) { + super(SchemaValidator.message); + + this._schema = schema + this._options = options || null + } + + updateSchema(schema) { + this._schema = schema + } + + async validate(data, allData) { + let result = this._checkFieldInSchema(data) + if (!result) { + result = await this.invokeValidate(data, false, allData) + } + return result.length ? result[0] : null + } + + async validateAll(data, allData) { + let result = this._checkFieldInSchema(data) + if (!result) { + result = await this.invokeValidate(data, true, allData) + } + return result + } + + async validateUpdate(data, allData) { + let result = this._checkFieldInSchema(data) + if (!result) { + result = await this.invokeValidateUpdate(data, false, allData) + } + return result.length ? result[0] : null + } + + async invokeValidate(data, all, allData) { + let result = [] + let schema = this._schema + for (let key in schema) { + let value = schema[key] + let errorMessage = await this.validateRule(value, data[key], data, allData) + if (errorMessage != null) { + result.push({ + key, + errorMessage + }) + if (!all) break + } + } + return result + } + + async invokeValidateUpdate(data, all, allData) { + let result = [] + for (let key in data) { + let errorMessage = await this.validateRule(this._schema[key], data[key], data, allData) + if (errorMessage != null) { + result.push({ + key, + errorMessage + }) + if (!all) break + } + } + return result + } + + _checkFieldInSchema(data) { + var keys = Object.keys(data) + var keys2 = Object.keys(this._schema) + if (new Set(keys.concat(keys2)).size === keys2.length) { + return '' + } + return [{ + key: 'invalid', + errorMessage: SchemaValidator.message['defaultInvalid'] + }] + } +} + +function Message() { + return { + default: '验证错误', + defaultInvalid: '字段超出范围', + required: '{label}必填', + 'enum': '{label}超出范围', + whitespace: '{label}不能为空', + date: { + format: '{label}日期{value}格式无效', + parse: '{label}日期无法解析,{value}无效', + invalid: '{label}日期{value}无效' + }, + types: { + string: '{label}类型无效', + array: '{label}类型无效', + object: '{label}类型无效', + number: '{label}类型无效', + date: '{label}类型无效', + boolean: '{label}类型无效', + integer: '{label}类型无效', + float: '{label}类型无效', + regexp: '{label}无效', + email: '{label}类型无效', + url: '{label}类型无效' + }, + length: { + min: '{label}长度不能少于{minLength}', + max: '{label}长度不能超过{maxLength}', + range: '{label}必须介于{minLength}和{maxLength}之间' + }, + number: { + min: '{label}不能小于{minimum}', + max: '{label}不能大于{maximum}', + range: '{label}必须介于{minimum}and{maximum}之间' + }, + pattern: { + mismatch: '{label}格式不匹配' + } + }; +} + + +SchemaValidator.message = new Message(); + +export default SchemaValidator diff --git a/components/uni-icons/icons.js b/components/uni-icons/icons.js new file mode 100644 index 0000000..60b7332 --- /dev/null +++ b/components/uni-icons/icons.js @@ -0,0 +1,132 @@ +export default { + "pulldown": "\ue588", + "refreshempty": "\ue461", + "back": "\ue471", + "forward": "\ue470", + "more": "\ue507", + "more-filled": "\ue537", + "scan": "\ue612", + "qq": "\ue264", + "weibo": "\ue260", + "weixin": "\ue261", + "pengyouquan": "\ue262", + "loop": "\ue565", + "refresh": "\ue407", + "refresh-filled": "\ue437", + "arrowthindown": "\ue585", + "arrowthinleft": "\ue586", + "arrowthinright": "\ue587", + "arrowthinup": "\ue584", + "undo-filled": "\ue7d6", + "undo": "\ue406", + "redo": "\ue405", + "redo-filled": "\ue7d9", + "bars": "\ue563", + "chatboxes": "\ue203", + "camera": "\ue301", + "chatboxes-filled": "\ue233", + "camera-filled": "\ue7ef", + "cart-filled": "\ue7f4", + "cart": "\ue7f5", + "checkbox-filled": "\ue442", + "checkbox": "\ue7fa", + "arrowleft": "\ue582", + "arrowdown": "\ue581", + "arrowright": "\ue583", + "smallcircle-filled": "\ue801", + "arrowup": "\ue580", + "circle": "\ue411", + "eye-filled": "\ue568", + "eye-slash-filled": "\ue822", + "eye-slash": "\ue823", + "eye": "\ue824", + "flag-filled": "\ue825", + "flag": "\ue508", + "gear-filled": "\ue532", + "reload": "\ue462", + "gear": "\ue502", + "hand-thumbsdown-filled": "\ue83b", + "hand-thumbsdown": "\ue83c", + "hand-thumbsup-filled": "\ue83d", + "heart-filled": "\ue83e", + "hand-thumbsup": "\ue83f", + "heart": "\ue840", + "home": "\ue500", + "info": "\ue504", + "home-filled": "\ue530", + "info-filled": "\ue534", + "circle-filled": "\ue441", + "chat-filled": "\ue847", + "chat": "\ue263", + "mail-open-filled": "\ue84d", + "email-filled": "\ue231", + "mail-open": "\ue84e", + "email": "\ue201", + "checkmarkempty": "\ue472", + "list": "\ue562", + "locked-filled": "\ue856", + "locked": "\ue506", + "map-filled": "\ue85c", + "map-pin": "\ue85e", + "map-pin-ellipse": "\ue864", + "map": "\ue364", + "minus-filled": "\ue440", + "mic-filled": "\ue332", + "minus": "\ue410", + "micoff": "\ue360", + "mic": "\ue302", + "clear": "\ue434", + "smallcircle": "\ue868", + "close": "\ue404", + "closeempty": "\ue460", + "paperclip": "\ue567", + "paperplane": "\ue503", + "paperplane-filled": "\ue86e", + "person-filled": "\ue131", + "contact-filled": "\ue130", + "person": "\ue101", + "contact": "\ue100", + "images-filled": "\ue87a", + "phone": "\ue200", + "images": "\ue87b", + "image": "\ue363", + "image-filled": "\ue877", + "location-filled": "\ue333", + "location": "\ue303", + "plus-filled": "\ue439", + "plus": "\ue409", + "plusempty": "\ue468", + "help-filled": "\ue535", + "help": "\ue505", + "navigate-filled": "\ue884", + "navigate": "\ue501", + "mic-slash-filled": "\ue892", + "search": "\ue466", + "settings": "\ue560", + "sound": "\ue590", + "sound-filled": "\ue8a1", + "spinner-cycle": "\ue465", + "download-filled": "\ue8a4", + "personadd-filled": "\ue132", + "videocam-filled": "\ue8af", + "personadd": "\ue102", + "upload": "\ue402", + "upload-filled": "\ue8b1", + "starhalf": "\ue463", + "star-filled": "\ue438", + "star": "\ue408", + "trash": "\ue401", + "phone-filled": "\ue230", + "compose": "\ue400", + "videocam": "\ue300", + "trash-filled": "\ue8dc", + "download": "\ue403", + "chatbubble-filled": "\ue232", + "chatbubble": "\ue202", + "cloud-download": "\ue8e4", + "cloud-upload-filled": "\ue8e5", + "cloud-upload": "\ue8e6", + "cloud-download-filled": "\ue8e9", + "headphones":"\ue8bf", + "shop":"\ue609" +} diff --git a/components/uni-icons/uni-icons.vue b/components/uni-icons/uni-icons.vue new file mode 100644 index 0000000..5f303e4 --- /dev/null +++ b/components/uni-icons/uni-icons.vue @@ -0,0 +1,67 @@ + + + + + diff --git a/components/uni-list-item/uni-list-item.vue b/components/uni-list-item/uni-list-item.vue new file mode 100644 index 0000000..7688e64 --- /dev/null +++ b/components/uni-list-item/uni-list-item.vue @@ -0,0 +1,440 @@ + + + + + diff --git a/components/uni-list/uni-list.vue b/components/uni-list/uni-list.vue new file mode 100644 index 0000000..d478729 --- /dev/null +++ b/components/uni-list/uni-list.vue @@ -0,0 +1,106 @@ + + + + diff --git a/components/uni-list/uni-refresh.vue b/components/uni-list/uni-refresh.vue new file mode 100644 index 0000000..3b4c5a2 --- /dev/null +++ b/components/uni-list/uni-refresh.vue @@ -0,0 +1,65 @@ + + + + + diff --git a/components/uni-list/uni-refresh.wxs b/components/uni-list/uni-refresh.wxs new file mode 100644 index 0000000..818a6b7 --- /dev/null +++ b/components/uni-list/uni-refresh.wxs @@ -0,0 +1,87 @@ +var pullDown = { + threshold: 95, + maxHeight: 200, + callRefresh: 'onrefresh', + callPullingDown: 'onpullingdown', + refreshSelector: '.uni-refresh' +}; + +function ready(newValue, oldValue, ownerInstance, instance) { + var state = instance.getState() + state.canPullDown = newValue; + // console.log(newValue); +} + +function touchStart(e, instance) { + var state = instance.getState(); + state.refreshInstance = instance.selectComponent(pullDown.refreshSelector); + state.canPullDown = (state.refreshInstance != null && state.refreshInstance != undefined); + if (!state.canPullDown) { + return + } + + // console.log("touchStart"); + + state.height = 0; + state.touchStartY = e.touches[0].pageY || e.changedTouches[0].pageY; + state.refreshInstance.setStyle({ + 'height': 0 + }); + state.refreshInstance.callMethod("onchange", true); +} + +function touchMove(e, ownerInstance) { + var instance = e.instance; + var state = instance.getState(); + if (!state.canPullDown) { + return + } + + var oldHeight = state.height; + var endY = e.touches[0].pageY || e.changedTouches[0].pageY; + var height = endY - state.touchStartY; + if (height > pullDown.maxHeight) { + return; + } + + var refreshInstance = state.refreshInstance; + refreshInstance.setStyle({ + 'height': height + 'px' + }); + + height = height < pullDown.maxHeight ? height : pullDown.maxHeight; + state.height = height; + refreshInstance.callMethod(pullDown.callPullingDown, { + height: height + }); +} + +function touchEnd(e, ownerInstance) { + var state = e.instance.getState(); + if (!state.canPullDown) { + return + } + + state.refreshInstance.callMethod("onchange", false); + + var refreshInstance = state.refreshInstance; + if (state.height > pullDown.threshold) { + refreshInstance.callMethod(pullDown.callRefresh); + return; + } + + refreshInstance.setStyle({ + 'height': 0 + }); +} + +function propObserver(newValue, oldValue, instance) { + pullDown = newValue; +} + +module.exports = { + touchmove: touchMove, + touchstart: touchStart, + touchend: touchEnd, + propObserver: propObserver +} diff --git a/components/uni-load-more/config.json b/components/uni-load-more/config.json new file mode 100644 index 0000000..12c5226 --- /dev/null +++ b/components/uni-load-more/config.json @@ -0,0 +1,10 @@ +{ + "id": "29", + "name": "LoadMore", + "desc": "加载更多", + "url": "load-more", + "type": "功能组件", + "edition": "1.1.5", + "path": "https://ext.dcloud.net.cn/plugin?id=29", + "update_log": "- 新增 颜色大小等配置项" +} diff --git a/components/uni-load-more/readme.md b/components/uni-load-more/readme.md new file mode 100644 index 0000000..7dc215a --- /dev/null +++ b/components/uni-load-more/readme.md @@ -0,0 +1,48 @@ +### LoadMore 加载更多 +*已经支持在nvue页面中使用* + +用于列表中,做滚动加载使用,展示 loading 的各种状态,组件名:``uni-load-more``,代码块: uLoadMore。 + +### 使用方式 + +在 ``script`` 中引用组件 + +```javascript +import uniLoadMore from '@/components/uni-load-more/uni-load-more.vue' +export default { + components: {uniLoadMore} +} +``` + +在 ``template`` 中使用组件 + +```html + +``` + + +### 属性说明 + +|属性名 |类型 |默认值 |说明 | +|--- |---- |--- |--- | +|iconSize |Number |24 |指定图标大小 | +|status |String |more |loading 的状态,可选值:more(loading前)、loading(loading中)、noMore(没有更多了) | +|showIcon |Boolean|true |是否显示 loading 图标 | +|iconType |String |auto |指定图标样式,可选值:snow(ios雪花加载样式)、circle(安卓环形加载样式)、auto(根据平台自动选择加载样式)。**注意:**APP-NVUE不支持此选项| +|color |String |#777777 |图标和文字颜色 | +|contentText |Object |`{contentdown: "上拉显示更多",contentrefresh: "正在加载...",contentnomore: "没有更多数据了"}` |各状态文字说明 | + +**说明** + +- `iconType`为`snow`时,在`APP-NVUE`平台不可设置大小,在非`APP-NVUE`平台不可设置颜色 + + +### 事件说明 + +|事件名 |说明 |返回值 | +|--- |--- |--- | +|clickLoadMore |点击加载更多时触发 |e.detail={status:'loading'}| + +### 插件预览地址 + +[https://uniapp.dcloud.io/h5/pages/extUI/load-more/load-more](https://uniapp.dcloud.io/h5/pages/extUI/load-more/load-more) \ No newline at end of file diff --git a/components/uni-load-more/uni-load-more.vue b/components/uni-load-more/uni-load-more.vue new file mode 100644 index 0000000..9430321 --- /dev/null +++ b/components/uni-load-more/uni-load-more.vue @@ -0,0 +1,359 @@ + + + + + diff --git a/components/uni-qrcode/uni-qrcode.vue b/components/uni-qrcode/uni-qrcode.vue new file mode 100644 index 0000000..a0ecada --- /dev/null +++ b/components/uni-qrcode/uni-qrcode.vue @@ -0,0 +1,196 @@ + + + diff --git a/components/uni-section/config.json b/components/uni-section/config.json new file mode 100644 index 0000000..43d5d01 --- /dev/null +++ b/components/uni-section/config.json @@ -0,0 +1,12 @@ +{ + "id": "99999", + "name": "Section", + "desc": "标题栏", + "edition": "0.0.1", + "url": "section", + "type": "布局组件", + "path": "https://ext.dcloud.net.cn/plugin?id=", + "hidden": true, + "test":true, + "update_log": [] +} diff --git a/components/uni-section/readme.md b/components/uni-section/readme.md new file mode 100644 index 0000000..c5998fa --- /dev/null +++ b/components/uni-section/readme.md @@ -0,0 +1,30 @@ +### Section 标题栏 + +标题栏,用于显示标题,组件名:``uni-section``,代码块: uSection。 + +### 使用方式 + +在 ``script`` 中引用组件 + +```javascript +import uniSection from "@/components/uni-section/uni-section.vue" +export default { + components: {uniSection} +} +``` + +在 ``template`` 中使用组件 + +```html + + + +``` + +### 属性说明 + +|属性名 |类型 |默认值 |说明 | +|--- |---- |--- |--- | +|type |String |- |标题装饰类型 ,可选值:line(竖线)、circle(圆形)| +|title |String |- |主标题 | +|sub-title |String |- |副标题 | diff --git a/components/uni-section/uni-section.vue b/components/uni-section/uni-section.vue new file mode 100644 index 0000000..52a1567 --- /dev/null +++ b/components/uni-section/uni-section.vue @@ -0,0 +1,136 @@ + + + + diff --git a/main.js b/main.js new file mode 100644 index 0000000..f9717db --- /dev/null +++ b/main.js @@ -0,0 +1,13 @@ +import Vue from 'vue' +import App from './App' +import store from './store/index.js'; + +Vue.config.productionTip = false + +App.mpType = 'app' + +const app = new Vue({ + ...App, + store +}) +app.$mount() diff --git a/manifest.json b/manifest.json new file mode 100644 index 0000000..b268147 --- /dev/null +++ b/manifest.json @@ -0,0 +1,63 @@ +{ + "name" : "云端一体搜索模板", + "appid" : "__UNI__BC54A00", + "description": "", + "versionName": "1.0.0", + "versionCode": "100", + "transformPx": false, + "app-plus": { + "usingComponents": true, + "nvueCompiler": "uni-app", + "compilerVersion": 3, + "splashscreen": { + "alwaysShowBeforeRender": true, + "waiting": true, + "autoclose": true, + "delay": 0 + }, + "modules": {}, + "distribute": { + "android": { + "permissions": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + "ios": {}, + "sdkConfigs": {} + } + }, + "quickapp": {}, + "mp-weixin": { + "appid": "", + "setting": { + "urlCheck": false + }, + "usingComponents": true + }, + "mp-alipay": { + "usingComponents": true + }, + "mp-baidu": { + "usingComponents": true + }, + "mp-toutiao": { + "usingComponents": true + }, + "uniStatistics": { + "enable": false + } +} \ No newline at end of file diff --git a/package.json b/package.json new file mode 100644 index 0000000..2961143 --- /dev/null +++ b/package.json @@ -0,0 +1,80 @@ +{ + "id": "uni-search-template", + "displayName": "云端一体搜索模板", + "version": "0.1.4", + "description": "uniCloud云端一体搜索模板,自带下拉候选、历史搜索、热搜。无需再开发服务器代码", + "keywords": [ + "uniCloud", + "搜索", + "search", + "usearch", + "unisearch" + ], + "repository": "https://gitee.com/dcloud/uniCloud-search", + "engines": { + "HBuilderX": "^3.1.0" + }, + "dcloudext": { + "category": [ + "uniCloud", + "云端一体项目模板" + ], + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "无", + "permissions": "无" + }, + "npmurl": "" + }, + "uni_modules": { + "dependencies": [], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "App": { + "app-vue": "y", + "app-nvue": "y" + }, + "H5-mobile": { + "Safari": "u", + "Android Browser": "u", + "微信浏览器(Android)": "u", + "QQ浏览器(Android)": "u" + }, + "H5-pc": { + "Chrome": "u", + "IE": "u", + "Edge": "u", + "Firefox": "u", + "Safari": "u" + }, + "小程序": { + "微信": "u", + "阿里": "u", + "百度": "u", + "字节跳动": "u", + "QQ": "u" + }, + "快应用": { + "华为": "u", + "联盟": "u" + } + } + } + } +} diff --git a/pages.json b/pages.json new file mode 100644 index 0000000..acf7166 --- /dev/null +++ b/pages.json @@ -0,0 +1,78 @@ +{ + "pages": [{ + "path": "pages/list/list", + "style": { + "enablePullDownRefresh": true, + "navigationBarTitleText": "列表" + } + }, { + "path":"pages/grid/grid", + "style":{ + "navigationBarTitleText": "宫格" + } + }, { + "path": "pages/search/search", + "style": { + "navigationBarTitleText": "" + } + }, { + "path": "pages/list/detail", + "style": { + "app-plus": { + "titleNView": { + "buttons": [{ + "type": "share" + }], + "type": "transparent" + } + }, + "h5": { + "titleNView": { + "buttons": [], + "type": "transparent" + } + }, + "navigationBarTitleText": "文章详情" + } + + }, { + "path": "pages/ucenter/ucenter", + "style":{ + "navigationBarTitleText": "个人中心", + "navigationBarBackgroundColor":"#2F85FC", + "navigationBarTextStyle":"white" + } + },{ + "path":"pages/login/login", + "style":{ + "navigationBarTitleText":"登录" + } + },{ + "path":"pages/reg/reg", + "style":{ + "navigationBarTitleText":"注册" + } + }], + "globalStyle": { + "navigationBarTextStyle": "black", + "navigationBarTitleText": "base-app", + "navigationBarBackgroundColor": "#F8F8F8", + "backgroundColor": "#F8F8F8" + }, + "tabBar": { + "color": "#7A7E83", + "selectedColor": "#007AFF", + "borderStyle": "black", + "backgroundColor": "#F8F8F8", + "list": [{ + "pagePath": "pages/list/list", + "text": "列表" + }, { + "pagePath": "pages/grid/grid", + "text": "宫格" + }, { + "pagePath": "pages/ucenter/ucenter", + "text": "我的" + }] + } +} diff --git a/pages/grid/banner.json b/pages/grid/banner.json new file mode 100644 index 0000000..359304a --- /dev/null +++ b/pages/grid/banner.json @@ -0,0 +1,34 @@ +{ + "bannerfile":"https://vkceyugu.cdn.bspapp.com/VKCEYUGU-dc-site/094a9dc0-50c0-11eb-b680-7980c8a877b8.jpg", + "open_url":"https://www.dcloud.io/", + "title":"内容 A", + "sort":0, + "category_id":"grid", + "status":true, + "description":"备注" +} +{ + "bannerfile":"https://vkceyugu.cdn.bspapp.com/VKCEYUGU-dc-site/094a9dc0-50c0-11eb-b680-7980c8a877b8.jpg", + "open_url":"https://www.dcloud.io/", + "title":"内容 A", + "sort":0, + "category_id":"grid", + "status":true, + "description":"备注" +}{ + "bannerfile":"https://vkceyugu.cdn.bspapp.com/VKCEYUGU-dc-site/094a9dc0-50c0-11eb-b680-7980c8a877b8.jpg", + "open_url":"https://www.dcloud.io/", + "title":"内容 A", + "sort":0, + "category_id":"grid", + "status":true, + "description":"备注" +}{ + "bannerfile":"https://vkceyugu.cdn.bspapp.com/VKCEYUGU-dc-site/094a9dc0-50c0-11eb-b680-7980c8a877b8.jpg", + "open_url":"https://www.dcloud.io/", + "title":"内容 A", + "sort":0, + "category_id":"grid", + "status":true, + "description":"备注" +} \ No newline at end of file diff --git a/pages/grid/grid.nvue b/pages/grid/grid.nvue new file mode 100644 index 0000000..c8c9fbd --- /dev/null +++ b/pages/grid/grid.nvue @@ -0,0 +1,313 @@ + + + + + diff --git a/pages/index/index.vue b/pages/index/index.vue new file mode 100644 index 0000000..7697316 --- /dev/null +++ b/pages/index/index.vue @@ -0,0 +1,29 @@ + + + + + diff --git a/pages/invite-reg/invite-reg.vue b/pages/invite-reg/invite-reg.vue new file mode 100644 index 0000000..f8d67f1 --- /dev/null +++ b/pages/invite-reg/invite-reg.vue @@ -0,0 +1,255 @@ + + + + + diff --git a/pages/invite/invite.vue b/pages/invite/invite.vue new file mode 100644 index 0000000..6230928 --- /dev/null +++ b/pages/invite/invite.vue @@ -0,0 +1,184 @@ + + + + + diff --git a/pages/invited-user/invited-user.vue b/pages/invited-user/invited-user.vue new file mode 100644 index 0000000..c5e2657 --- /dev/null +++ b/pages/invited-user/invited-user.vue @@ -0,0 +1,149 @@ + + + + + diff --git a/pages/list-news/list-news.vue b/pages/list-news/list-news.vue new file mode 100644 index 0000000..cdd5394 --- /dev/null +++ b/pages/list-news/list-news.vue @@ -0,0 +1,169 @@ + + + + + diff --git a/pages/list/detail.vue b/pages/list/detail.vue new file mode 100644 index 0000000..1b0bc53 --- /dev/null +++ b/pages/list/detail.vue @@ -0,0 +1,286 @@ + + + + + diff --git a/pages/list/list.nvue b/pages/list/list.nvue new file mode 100644 index 0000000..1199038 --- /dev/null +++ b/pages/list/list.nvue @@ -0,0 +1,321 @@ + + + + + diff --git a/pages/login/login.vue b/pages/login/login.vue new file mode 100644 index 0000000..6c516c7 --- /dev/null +++ b/pages/login/login.vue @@ -0,0 +1,654 @@ + + + + + diff --git a/pages/main/main.vue b/pages/main/main.vue new file mode 100644 index 0000000..5804203 --- /dev/null +++ b/pages/main/main.vue @@ -0,0 +1,134 @@ + + + + + diff --git a/pages/pwd/pwd.vue b/pages/pwd/pwd.vue new file mode 100644 index 0000000..1bead50 --- /dev/null +++ b/pages/pwd/pwd.vue @@ -0,0 +1,52 @@ + + + + + diff --git a/pages/pwd/update-password.vue b/pages/pwd/update-password.vue new file mode 100644 index 0000000..3954019 --- /dev/null +++ b/pages/pwd/update-password.vue @@ -0,0 +1,261 @@ + + + + + + diff --git a/pages/reg/reg.vue b/pages/reg/reg.vue new file mode 100644 index 0000000..25ee5e4 --- /dev/null +++ b/pages/reg/reg.vue @@ -0,0 +1,109 @@ + + + + + diff --git a/pages/search/search.nvue b/pages/search/search.nvue new file mode 100644 index 0000000..2e9193b --- /dev/null +++ b/pages/search/search.nvue @@ -0,0 +1,496 @@ + + + + + + + diff --git a/pages/ucenter/ucenter.nvue b/pages/ucenter/ucenter.nvue new file mode 100644 index 0000000..2f098c2 --- /dev/null +++ b/pages/ucenter/ucenter.nvue @@ -0,0 +1,182 @@ + + + + + diff --git a/pages/uni-feedback/uni-feedback.nvue b/pages/uni-feedback/uni-feedback.nvue new file mode 100644 index 0000000..a02203c --- /dev/null +++ b/pages/uni-feedback/uni-feedback.nvue @@ -0,0 +1,235 @@ + + + + + diff --git a/pages/user/user.vue b/pages/user/user.vue new file mode 100644 index 0000000..549d277 --- /dev/null +++ b/pages/user/user.vue @@ -0,0 +1,279 @@ + + + + + diff --git a/static/api.png b/static/api.png new file mode 100644 index 0000000000000000000000000000000000000000..58f93e13a4eabd82f830e125521d315f8332cbe3 GIT binary patch literal 1449 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 Y2Ux)ywvB@R=Kufz07*qoM6N<$f?2Mgb^rhX literal 0 HcmV?d00001 diff --git a/static/c1.png b/static/c1.png new file mode 100644 index 0000000000000000000000000000000000000000..9d38fdc45f54393919608143278902961ebfc03e GIT binary patch literal 401 zcmeAS@N?(olHy`uVBq!ia0vp^DImv+@EMfolJl@2-tdeIgiE72V3$+1a&#<;nGqB*6-wd0Dfno2^$& z7L}LYx}4kkKI1~4j2xSM#i^{e>mxFDC0DcwoaERsZFdmo&xZb=|e; zVChPF@z}uo`_jyFigEMR=cKgdY*81V{;5gJlXF9MvNaZ^cipGtGKCwGwYFdLih#FiI|b%1`}h zcD?9wzL;(MG`RGl!=KdO=X$Ia3G&T>{3@pZ$E>nWT~vAlEaktaqI1klarbacw7TzPB-Tm@A?1# z=DKt1Tm@&jBni*W72Dq8$U1XQ@j1)qcYd?AM-~6vdS%zgB|W!|l9z8;VdkK15fZWZ z0_Xa#{=&Tl?+&}Myixw!c0&2Cz{(%uYaLfyIpx20a+b;i&8Hu}PrN-Tsf8gx{xaWd zSEda)?3G(j%z6CKKWpOGAAJoS5gg_&aw+l?Pq*dmh)8I56YfnYkc%|gRM+fjvg@w| z$E(g+E=n8A7O8TmM)@~hDG@eQ_vn5n5wpR0%`A=`87W~$m7>*=T~gqVW%D$JmT%Wy00-NUV`g= zPWq+lU_K79dVw=Ll(hEL%sa^y|HiF3Bqng#c7b&Xt+%gdOo& V%D;5ZBtB5oc)I$ztaD0e0stIlwo?EA literal 0 HcmV?d00001 diff --git a/static/c3.png b/static/c3.png new file mode 100644 index 0000000000000000000000000000000000000000..216202ad01c5d093a15c247cf791bf66759cf54d GIT binary patch literal 511 zcmeAS@N?(olHy`uVBq!ia0vp^DImqEwn3#C`6axcex~Gd{NX4zUH%{jrQQ%<>_`I#L<;VZ} zZHv8>O^d80dDUJWN}qZ5sw(5+2E$_#$vr=hznV9v_(!hA^s)ehHzYuO_$GPFaj>L^Z^8*-5pGM3JjCnSB#oUXR4yIck*z;L5euG4hrQnMaF=Mr^If6ezqfPO{rmaH zG`Recv6gZBZ^h$ro*MqgZ`L;0*JWSQ?4MdEEc#Ycl^2Ku*&||7ybYSKxgR(e zUi8LbW#8LW_O;o`+{cdv9h)e%;+1X1dv+zh{}-wmlY4-{_IaWH_ctMZlX+XXL2>Bm L>gTe~DWM4f<{`=m literal 0 HcmV?d00001 diff --git a/static/c4.png b/static/c4.png new file mode 100644 index 0000000000000000000000000000000000000000..fb8b4770c323cc87544a502c4efcd9792ec6047a GIT binary patch literal 476 zcmeAS@N?(olHy`uVBq!ia0vp^DIm!v{Zmph6H*@EOQ`c;Jj35m?s8tsB!ig_bOsad3NWyNKsO#%u4s6f}!WF<$1wue~HTU+T}QZ;Gq4 z+^p*LR=oRR<2>VYrDayznw7JEgn9(s4mmKdKH{5e^24HIn&xXKq`oqWXf4s;nPY6> zl5RSUO)+g!*Qq{!;a&O8LAO2%J{IadS>Y&oFLd#-`B8Zi;r0eCLdRUCfQpstnaz}|9;&C$edE%qT=zMqcbI`S>(i_Uwsp-Jh?$Zac<}T=h6;^ V(bfHGPg+0`|eiw2lA( literal 0 HcmV?d00001 diff --git a/static/c5.png b/static/c5.png new file mode 100644 index 0000000000000000000000000000000000000000..310bfb123ba811240a23883c589557cced22af97 GIT binary patch literal 472 zcmeAS@N?(olHy`uVBq!ia0vp^DImMU#{OfDLKp{`iu-m;URIy-X0%w>4GPR z_aE3Db+En7Vpp-?y{8>c_3j;K1E(wImUzhRpIo-4)yng0f9$<4bN?NcJ+$)R>Cmd5 zPnT-Q*3a3qRzbM)VHC^C!+&Q!2$x98T^XQ1{a2U4m97Z?l}kQ1avTGN#j9nTb Uw;LB#rGg^I)78&qol`;+04O}Qp#T5? literal 0 HcmV?d00001 diff --git a/static/c6.png b/static/c6.png new file mode 100644 index 0000000000000000000000000000000000000000..c3c45d8814b2657a1c603b1a44c8207da134cb40 GIT binary patch literal 545 zcmeAS@N?(olHy`uVBq!ia0vp^DImqbxJT^6j8j=}L4 z`U~zp;jZGGq_3%#*Y{@jiL-*|KAoCX9M=6tMV3p`Xx_9LpK6YHtIv61@a%(@?tX{a zixmsYle>5975wq9?fBo`FZ<0Z_ST1U_$og>`Bwh@oq)-Q*IY8`n6H2IUEezHG>gnR z4m?JSR+TGA8lKK}%#OUITJo;LRm!DE@lpDwn1HB=DfxjiElxjmC-aCcb$n6qV?vwH z70D$Ac9y-Kb4tS6k2yc|sk#5)HGj$%vfgZBIOdhE(svqtDm`(*VzL-mu^Hy19AKPf2Xw<}^wvyk3;W5tc1>eFM@ s<<*_%cP|y0-yh@^lK=|O<{9 literal 0 HcmV?d00001 diff --git a/static/c7.png b/static/c7.png new file mode 100644 index 0000000000000000000000000000000000000000..a1e73908c282c8ce053a037a9b0d0ff2bcdb5f28 GIT binary patch literal 365 zcmeAS@N?(olHy`uVBq!ia0vp^DIm6ZD L`njxgN@xNA8ryiD literal 0 HcmV?d00001 diff --git a/static/c8.png b/static/c8.png new file mode 100644 index 0000000000000000000000000000000000000000..c32633c0b399d119fe940b19fb48ee0efd986ca1 GIT binary patch literal 587 zcmeAS@N?(olHy`uVBq!ia0vp^DImtDWKw)GSgG z<{?!7vyg^n3M^01LJZ}7srr_TW_zQ?t87k(~wwf+9)vT z%KQIoiZ6ORmsqxitIvdcU#@t4EXP6v-^(UI#Jk~jfg$H7CzX--mMU=ckjl- zO_N=n{=9#BNIpzt0(^6iu(G%&IbVv*qm>1hi!XSEd0U$OB}=(W(sDW)~2<6brG`eb|Eywk@UH2a9_S~2ou;@L{mE;Re4S!9(w0H>~IdYlxQPbf~&0B26{}evs0SCD6 b<@sM36JAtSn%f$@0;LB}S3j3^P6r-DwW=|@#WR(W@( zZdqJkeNu(zZcxH)-rk0j)>6#pwJ%5 z({0I4*ENL;Hg>s)Wo2yHMQWq+YVK10K1LEVCnUj62Kls6uex~DF( zmCs;?h^>{Qb=Fc@o?qGaU(P$0_Dg@wVQpV1_%AL~YBQ@%pW7wIWu-GZ7%RRBC{J)$ zYTez|@_3zqf=Wi}%JdkW31MA*>f4V5YcgIo@dcs(Z~1ke=Y_pcHP{M@c~4hAmvv4F FO#nHb*8Bhf literal 0 HcmV?d00001 diff --git a/static/component.png b/static/component.png new file mode 100644 index 0000000000000000000000000000000000000000..fbb116d59b9cbabc51476ce2ac48eb1fd15297da GIT binary patch literal 1146 zcmV-=1cm#FP)j7-VM8Kg`UcvX?~lM_ADVqd!AaNJ)r-kc_gzKPq}b zVbY5pqCGH6il{6|GctlM})hS_Iv_Bv~Rvma}(8G;}P zf*=TjAP9mW2!bF8f*=TjAP9n>JY8iw&YriR&N$j-FdoDVEXJHVoiCg}w^YCV>I|YE zI0rZ4U|h48W7)yJCgO!z`>nkeMGy965ntYGQS@M65^)^H7VT~^5=)Vf!d2L^w*u)& ze~CB=Gclxsk6gr8THJdOuEVJnp4T>=7O@Mn@h%?6qb2mxzP#0G3MUTlg2Z z;+CRamV7F|j%|C;w-Lk5Squl_F)YIV72?`K9U>0LtGFYx^)?F1vL~rcUo637{F2#j z$7`CSyfjrs94Dm_Q!?9U()zcuqHj0~Clu{%(nu`JJ5pSqX12-r5XV>WTS>$z_yEUd zwq?@Bvaw1~85d>k)zX?+g>R*N^M%Ydw(vc*w+`)4MZ~9YNYUOdB6+^x{j%QsT9}Ine930i{DhmaUFT$ z-?$cc;=jT+6wgbGcbN*xc#JCATcl%SS-LP6FG}kyDb6{#8h=&rjrvY3+i@>0#vg^P z3-hFOVpt#j`l9D=DcybD*n*+bXq&J3W&VljSg5%>SEBB-^DCH$^_gwDU8hki>Nus0 z!Fy6V(_n*?$1X4FvsXG%#raa&aNf*pjRk#T8~sOVR;0H}N6I~ALh-zlGusNOvQws# zv|Bn=PyAil7#3x=5xBpNzSA`0`UF3ec>aA-9@tx%boDSw?+#M2S#JYn?3Qt9x2oRsA5j=@rr-Jq<9v!r!zJ-#mKqiy;_MAC;@ z-}0_>%xmoAKTC;w8MaDgu6|*l{qCGk<>i`r=YVD)iP&Z5(pQ}YhmJCkL_DT=F~I&N z(u#p3;wCAV`v(shKz|bnf*=TjAP9mW2!bF8f*=TjAP9mW2!c-XKY!e{-pBT+t^fc4 M07*qoM6N<$f@?xEoB#j- literal 0 HcmV?d00001 diff --git a/static/componentHL.png b/static/componentHL.png new file mode 100644 index 0000000000000000000000000000000000000000..31f83a029feca7066cbf6139a9524fcbf508582c GIT binary patch literal 1142 zcmV-+1d02JP)!|by-d!04E*^jl?3_%bC zK@bE%5ClOG1VIo4K@bE%5ClO`o<`}Ob9-wHqhp5RLCnHJ%&XP={Bm;aRcjF4=L}qn z{c*)^j%6!*nuzCS?YDMY6n)r}MSOX;MbU>nNyG^lU$lF~NGwG@3Rhs$?h2$YyGq0< zn2li-eB>g&(&pa%a1~Ch@Vt)cwulYP#k+VMkCyZ^5~pU@?L=IJC$I{)sglZdKsQAk zhG%e3_MAgX`Z@>u6z#9DuFd^pi}wcZ#>_bVI}`Sd9}h+X_s==Oz3N!Sw99lhkGnPQvocHnE87loB!Qkh(>@ z8q08SW_tu@VPi?3C*#1P{To(x*l#1I;o;0Sx`^+ZlCktlT_O&_16VAbZ{c6uh#QJ_ zS@Nm;I=1XY-)0QgXEE%H$FKl*54>7%g&@W1F;BG@k?gA8Lw%L z^3qflae|aaOv`MaN$cP8ioW4698(}{yKC*6%n7p0Y$r4%EvBJ?{VyctX+00_hl0< z#hp^zq|(}xWgS)#u_tRcq#e1Ig}PvbR6lG|mx!b|N89!!Q+o5OBH|_ZF}uDFZ{wf} zK69pO?eyPCYi%8j!W&Z7(BvmvT-IR~5m!kI_3F%a8a~2t75p~IcjYBD_=97mjpWSC z_OVo`=rsS_j;g!!_c$F-XSQ*8UmB@pX<$ZnUB^_uP>SpD%=Vo0#c!zMxQ;yWZ(NC6 z@n2yZj_0MtyG#XTBE}T$P13QkEDhX_7o~NU6z4o#j=w7SMtvuiUfhfG@ke26;0`IB z7%@PIB#aQ=7K)CgZ^W*D$>2uk#c95R6Ota%(hIb?3Ae_?T~KO z6MvUBh6R~z6z=b!?+mTDKEV$qo`0W|2R2!Vv+-*QUv24TWqY$!l$foxrhU;tzdEM! zn&Q1j%3tRc@pOecPZ$HSSUUV4B_+8#VyKj4Hz_OP9BJKKi?2)i=$Kt0BI(1dZF^Tb z<~4WnpQXgT44b7g*DhhO{qCGk<)vDA=b&aViP*4h>8s9yLsuD0A|6q^7-WAFX~$p^ zaf6i0{ey=LqQ8j*K@bE%5ClOG1VIo4K@bE%5ClOG1VK0XA1Vv9-W9e~bN~PV07*qo IM6N<$f_Zi-wg3PC literal 0 HcmV?d00001 diff --git a/static/img/apple.png b/static/img/apple.png new file mode 100644 index 0000000000000000000000000000000000000000..5fd31c621254aff8bfb08f497ff8cc04a063da5e GIT binary patch literal 8569 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 M+PT?Q*DdjrX@u*4OGxl_ya_xREUZc5JW;z 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 LNkvXXu0mjfThfl& literal 0 HcmV?d00001 diff --git a/static/img/more.png b/static/img/more.png new file mode 100644 index 0000000000000000000000000000000000000000..cdfe39223017f5ed522e36b30d80f22f80c9bf8e GIT binary patch literal 3037 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

E;gXXV%wA7ai>u-H%54d8lac)} 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 Tcg8*umYd%{8iQA*1Un;j;#zXEj1e}u+lI2`Az zl&RF*yf}A1#&dP;>gpI4soNWcFd%k6zb0xSaB^PJ8xlyS#mwVMKcac~Nb`xo2b&jR z|Bg$OZ*^yvJI6!i`)1QJDKg~B+p~JQ_>k%9FN4ktZ}FH|bp0j&q=HqIxLt7GIwb>h z?DnjPAtsWWhvWNr*hIrt{$DMQPtEbV5Y9Y(u0gX6<5)RMx%y-tsm`S-L<3OF$O$$O>Q^snQtP zeeiMf&(fcuKX)sD;|N!AF^iNV5WHyDs$#H6r;(wv3szZz^TGP>KwyN1Y%d+>`wXsJ zhJOf}K*QmJtHGFrwXn+q#cSK5*ac3HpsNLrISMGxM^nWsMKg%lTP*91&q}{y{UX(x zDn2K(M2mKC=ZP>Z6^pzxK$m*4H?`--qz+|2(Xk*I-u)sc zIlyFWNgASB#M2_fSObL-egbjEgIP?Y7J=BUmUpWz!qU3X)s+4=Xc<po06IjL;Zt5ww-0cQHI&9qc_iuLh8EM{^(m&0P{kY0WE?IJclXi$ z4(>2-hp5`{xi!bn^s+-{Mgs~$31oyJmrg8%zvfu6K`Z4>BT~aZrt#7^%kgPpbDD1D z6|NN(pE^y+RT7f_bkEg~Si;$mk-l~~QcFb1qDBrG!}5DfA)uT)!82e1le+Y`*KYh~ zeNFch43@R|j7P0{k!>$Ogs@}Np=W$4_$0tEo_V+G|9chce( z&C>?QS9YEm?K^Aqx|wJ$Kker7gK4d}MmS!&r|VN5=zp2jTwF8rcZ!B)H zX||B0P*+BA+cc_~Jik&A7)7_K{?x23o49(`^h3;9#D#Sf!Z+%Na2E)wr=nds&c;?~ z<_Y3cv=i@w(*3t|ccIp-)m*}UQ_oyMX@!eN8T%^pgOf+QI5e!l0$HVv%!fcF-gk8Q zE$6eDsj@x-Y3ueK|ATyb?^%2|^wv|>{B zI&n|s=Mq>2!Xj{eG+%Ojk7EDVK2x6hnIVKBJ-T*xJy$?SV)CG_LuJHbE5;`K0cKmM zExZvIfF#VF{dqWc_h`96mrfaL8;;zH4}5#{40J&0>Q%2didqApy4xgp8F^h7Y#|xw zQ(EL;e@>>_TaifJd4JwXauc6AGw%;_GDyDVXd$5kior*n2Ra>D7VQzbC+1Q_k<5Yj z>07Y_&E`i>#k%`uKJB-WZPHmC2|sz}8~T@^MFuZhKVABP9YhYMsYRq~Ix7Ur zD`VoI(RLk5&?gPE7_Eq-3}~qZ^_PnS1onTa@_n4rjq__? zWpW){dn{~=AZ5ZEx$4KY){EDei%2oun)MlZDbpd0YFF3$JBzE|t4D+C{qM=h{ZVa6 z@tfEkfc;-NUpviXr!e~l|F;#G?4*xK6WxPMvn2>O;V-()wwVEC@8UTN}Y_>i*9mA0LT3pmi#*~0v! zn=Lw9qs1&U2Rtm)Y6$!;KwYgmxDV?-`ysTuUtiUkQq`$w?$t`j>j~FT%`{T#J7Uzn z_E`>=W9!+=J9y_<^f(qbgAx7)P#?7Wf$1wR-F&p|hoPcg>ziu+SSJBAN89la(L_KQzn=2^IDgayk8^#T8L#<5sAu; z$~4AvdxJ|Xt{zc;QZVN=A;Jt?Dw;o~vg@Aa^_mqu|JofmJ^1o>YkikEa)-j`X z!qKmPrn(IuJzpXPcqYzxuiN42t=%F<&`f2fp9f}6o;byTAk!r2bQueZwxHpn;=_j+ z{qXawC=iri#}V3vM>b&Pb-U0-PEj08ZA_%9lvN;&0_zaB){$hQ!NRHYUymyd{&|Pa znZlU|?sB)RBnY~z)&?!{17DyTmw$8M&_8S7rfY_=S2lt83w3%b;%LC#`eKkJjZur zUV{lEXT3LD^y-_Xeqtv)k9!Hv&m+CkTG=lg2ykDG-p}QAlc-%ckKVf#vzYa5vQ(gR zXyK|!IfU(v%Lp;2LD#q<*(bXy+jdToUAb7gYET+AlInn-I{Z9E0Tm`g3^7Rj4FN+x zvQWuQg>JjSr=SDxN~hYb;Eq)Tj(CO-f~Zok8kBIfN!ZMf0D$ENCRrq*A`D*ey>i=^85vv{m8tDCXi=AP|t`+C_^ ztTwEb#;3y^Dl;8)&KI!mrwPI?WxxmntzE^j_D`;+OJUZkpwar0br!JTXxWgR-`|m^ z^(nTf9fEv;+6k+M29=1|{o=N@-@UL0%Nq>gxr{ND(3%Z!Tk_8t9EPq_nf5!+9zpk% z-q%{`wB#ni=nN~!%uiqunlk)+uGJEvh`65cW)tP65rRec?;m-C(gvp|cNIxP|Lnxm zJbHeC60LCyYw8P1k$%_n4DSwjG98QCp8S0e9T4pOfdN@7`)8qXx>}-K9^KE8JvaFJ z3x`14;v1{eV0hJ7r>+ip<}R`KlZ%T=A}EuZo9!rP?c8%senS2dxI)qs6FCFatpfw2 zKA;3#GcLonj+ZCFY3-G>t_$aNdT!{^q)srKf^J>(ps8qFw`>c$3~ zRO=sFf8k7*L#d&yLLfhT$-0b|NO4jAmPmkK71+Y>FVU2;qf=v)y!U$EL^MuI%1#+k zXAQp=G0^dIX^dX>vEFjpv85*W^VJ3!q%$;Bt7nZ|+MO(qi zEx;tHuh4}7hEBbcu}K#s&SoeZxNtbm;fLw^_Wzey`Z=kO`n%A`6X;m)}E(NU-uJKi1DGiY)tVpxro05>s@+l1T; zCS~^FVM#y4uWsLID)BcpW^_@^juu1kQj3mU zh6h}T-S$XAq9U|@QXZQ=}{Zq7r%Il3IhoJ zih2P`%c&nM9=^yVRxQEdQ?z}$cQWnxm0hg#qVSgCW>|*~k}gV$g~y2!+S3&gf?4w( z!LPd)t|7(G!y7xP&Nx&Qq8E}O&#_cwQ^jQ+As8({;+`qCYS-n>#adBYQ`o*pk}q^$ zY_~)85wklCMU42Y-@&*WOCuD}bDFl__DPat?eDXl+3cPrCHKip?{;W7tbpNflS5uNZY$F?fPNbA}$%a(01NP3_U$1H(p|{MpCR)IqLrJ*b%V;s0v^KzuyTV?a&< zh{VKv>&qZ-m&oum+($fpt?F7`9Au;Oc`Hf2*rI`4^J91#DqU4tOJG#U>cbp|v;@PH zqWIXu_PVJgDC^Gd6#hE{2D!F%4#J|nN_O1^;_NLdNDEN5+IVHjKqs4x=O8)VIBG&w zjW5J7RpedrgG4q=xZud}Ws>Doc96@8So@MOS}hp ze4V&+HJ13@wQq4|K=9ynD%|L3jMl^7R&Mil>9-FVSKLySQ^wfTN6bdwsK8aYPxUts zsrJ0k;#3ydf4;jO6JfrV_hvUq<`6JSW>yv#_9lqF7i;w%$dg#U$AX{01JD1v;+F0w zFjRi|DI=fBs`XVkZj|?%jXD#zo^-(wT7{v{z7eKk4-$SuzQ|>K6%g7>){^-OW>3Q> zk5n_w5(tu{fdia!sv5Js8s9^kmA@@_CAe4Kr5ia^|6;?|%fsm$UcZhCu6;1q~+bvp*WJ;yT6DGSq znBSsmS!VLIM97I1#|N-V=fn0>LS(D)%5G@VOUKzwaM#J_j{;Fh_$@Zv%lgxDKb|AV zx&PzzhkD$$G!m)o4w2s22GNYc25W{~WErN5Lfk4yY$;8w&W-f=D|^p33g?(V zU1rN!Lw1b@>AQ9_;97$fbAs%H$hpdxQ1tK*kt>HNLN%&r7juJHzi7|b#pNdE%e*Q| z_F*qut-Vr6&*uyYJ1y?+0*03NKe$gM@YnP2B-tV6CvlKKO{XgK^_9T|JcB2@kc06F z=IAxsO+gub7lsVgMuZA8@P#zzqSg>ZdCNB8=h(n%20O@?34QSljOXf2TXgQqbx6R^ zU_tZyKWycN{B0{DO#>WBzPD|G8_)97k3)Ps=o&Z<4-O%l=QuItd9yAHBlg7;JiamX z$>BXICr=8N(^4o`*yyVsfuXxb@BW)lY;>G)*!rz5_<81f{h~4cFF4*8o6Koc&##fd zK;J4DPGf8fe={Xt0(aX*4Q7M|vshbXXVDA&8JagYOkiH#92g#tj_Znx-@*ueE1A4r zGYHoFJ5^dm`vnU-d)>Q4otGpE36{S|la9B!@_0l3HCxnyQyEdnrUDRx#ph*ap43w$ zHHdy^;GQtIl*&bWW=)5pMX=*<*mFDAjOo{bn=ez4GEA>bWKd~4dVtIuOc8qkC$p{n zn8pjRjzbZ+t|lb$-TT?s(d@J+?_V>J5v33UO5dr!%`G|kF8=Og zsj7!lj&FI17$0yMZqqTFiD&DibH8e)?^F|RH5AHVeD|s)49S4QgbVp2qswHVLz>)B z$Q5_l4-IkqBArY{_VpU)7AmUDURJ5xdpEfb3jEO#d!8p_g@aX572+HW^BOyqK)&NZ ztsr)Yd~8T|GO*m;#DVc5>NY|R3O%a{kjRjIqVN3BTKTe_-mnEPz2Ajzrr*8uY3DSOfNtsOMlp#Mgcb`!KVjD>aN$@=2h{t)!?*&t8z4W`Nd7w%2b4Ab~C zDMN{;lA+G5El5Hq%fdiP*Pp=ll6}lwEMab*7LYepbTqs{Bn!W@d#hf76!2o;qy=2c z9hC5vD7!BP_=6FPTz$N#1ab~rI8|L@ODY`O6%c?>$zn#J4&v^+!LDlgB~N>W-JMlZ+2Xm? zXjY@FmJsx{09jNf2-{$ z2$LRFXhc|-nP>>zQ6gt9#Yx3fv5}uutTyEyqb7C)@*{i999pe!`I(h) z9dofu-({s1J(7?$H=Q4~M~WGmkdY4XiPEVp?-RH7s^el=efnu8D+NTpGbISS_I3B` z@y+1~Z=N@SY5{jwzR`h9(MLB4LxMHuI87Uv4#u4zpSSkJbmJ74qB4PR>M4?;(lr zpLR34ti(zJK9glr7w zc7|XpTXvx>O%TLnwmk&<)6dO#${eS;KD*c&@2cfkiMh*;8p_15YK#tZM#9` zbIuFD!$}53%A}C!jDD%@XEt_)3rpZD}to)u<*eDO}SuN$DM%8%0~c_>2~n)PH%gn$(q`Dn43}% zCb}9g6!$iXeH^G5Dvp!=+UA|AAuU&BzJQT)p~9KTopVg#n7<6;+g{^9y^S?;AIe76 zZh$9ILYiHSJK(#qWh^z4)h)q)L2)l1$;Ir&pVrqN(5@|7sr4_?E+2inPJ`7;h971= z#;KzlH1wS-eqD;L&zL@wG<7+6lvn45-Pw;HNtBw~eMslpCjD2ILTO1xk@AJJf#tYO z@L|$N1v~n^Xd88;$$F*sc3d6oB!0F-Sw{GK`rgN+YcT<<-u? z-}&2M1+fdF);=@;1xiJ`$B&1nxYULwvXBD{5!$b4>l z|FDp%Ui6Rp!K$}3mOM?^tn|eSd}6n@zEJxI@@x9Rc~Z0SMvF$ynoPfy8&k|Xvu}Hs z-5FF}zPqTK@HaToAWM4e@L)SaH}d`j%dTe>jPHWPY~-=(=U0IG2s22d%ZefZLRV|I zcjRYQDD3)C@X3#AMc>v2*4pnwOrO@yb3NPu z^Xx1C{TcM3Ro(~RD(WGQ2FvYrD#b_0MeyE!NRK5H}vX2o$9modj_k_m78o{KeSszXEbex#F`KgcCk9 zJ@QjsEQp4y#E+S<_GHsR5PAky!W`^uVXRUH5lmOc370fhb+1NWs=Ke^ z#&u0BH=`-Vy02AWj7H-FL%X#$`qly78o5=e&+Ig78|2A9p-MMrcmgB_TO~eIb8!SW zb5>ib6*ijZ4}7Pzb)RSKqiA7F9@^K&I+#)R%c$)iotF(_hh7Y|4oCP7)_SOtpcf{z zLZ-B$64|15L82^_hm6I$^qt>8xoDP zqyr9Jky64qXJGV;rp=Wvgxx6oVis;{cP$ciHokgL5+{aAjpB2t z0`)0tJ^aJX+dgP7egE$x((|+;lk(?BIcqWx!UsYVuZZ$?SM^!!$_%pi4E!!IY4bM=BVAK@E|lX7a$H~!J*0eJ?=yW z^%9F^LZ$tOm4bu6-n#|eIn_$U>JsBjp(IzbbstvM^bRZEaDqwcSEwt;gzn8Jfw%PF z?th63qD0ijt*Lyal0s&_6qq%^N_7qu1eTV2F^vuOqG{kp7({c+i*{h6VdTuP49Ld_ zE&&^>5q>(qE(#?!s;o??-pH?OS{j@5{m1L1F2y%#4E(=JX5P|)h{XlwM!y}(F1?5R z+{Y{`g+TMX;}Rr_N1tiU_XikNRFu1ZcM()WUV60Pc@chO@XEn$m5QG3 znrUm=bZdszs4KJTqtx->4Askc5qo%*xGgeQaqOtX+^n5JjOnKbZ=CNy zt2p@Cz{7cp+2)2J>v4CS8Dq1nkUeO>dQ@G^a`rnMWm*nT_gJ9`T9a1M?z{|sluQMV z%l_Wxcb2Wk@axMxgNs+S;Z*D7er|zr710lzdFqOSuT7qAxh1kJoV80`AIi&QLm9`v zDFrZ_wlDuHknmZ2aVIeqN2)9uj;uIY5;Q?~F!6dDR&BZme`l16TiqQ_F3m@uZbX}; zycJn=ABqC9=9c+pR~q;o`~lx|d*|`P2HNx>JvBgB;NArE{2nG7vO{6nZo&bEA{{#^ z*CT|%ey4776Aci!F%?)%BQh0_Un(`$9#OYaPLlPS?~y$J_Oyu`dvTmohK}JHW#OmD zLPLuPLoXy_!kRARQu5RM(YxW13!1r)0>OQPPlT`6Xboys{ zV~vy@5ty&9`^`KfMyOSX9FR(;nNYIC4}@d2l}8?^(Dtn?BN3k z9QPk-yRm&(>!vu_e?YyNtggpY3nY5;^RFWc`nt0yGR($~mC93RQNuV!7TpY*zY%8A zSM=%Eg08FVL<2rAX*Qo|dEy-U5&QVa`|8w?G~TTtL+(dMY+e=E7`2RTKSWhhW2!U{ z6|e>cU+aOlw6=H_uSTq*RL-&9*!l?(oVS z?WMG! zc#M)sL5| zhe}Q_KG2qJM%*#=wA85@yu2}zNE=FLs5RC<>dh(S7B?ew)Bo&>;1xK6{plOX9_;sW zH{tu({l`W|2rGk#(3^*+!>Dg4wA4^ zDR^Vm9=fKIMwACdS*@gGhg13hri7>vt^AIi#bH0ovlVJ3^;tZ@W>M$;bP`K1A_jJc z!*k_JS&Yk}KIq=@@^1$YUpSuZ3vNiwD}TKfS{q?0;VpeyCE#F7PS;20lU>dwZPW-k z_lbq(;B91*7^s7-eIzVtSnK#hVhQnWglfxQ13S+IcX--g%^D>NU>Cc^?$%z7R18%- zKEOt!FsFCV3CA(Ne+8TGGS*c_)~M0}%`%KiLh;Fbq*RcQpzlYOs2v`px-1#3<+V1y zNThs4gddrIkA^>YQiY4HN?Knkdbcy&P7pHl`@A;N3SuL4gK=aU$wdl+pg2hF4XW^S zNnGR}gI|j=f;gJfc-{n+X$CQ%*G>+P37?tEk1gj8Fj;WX_?PeF(ekhEHJwkI#-K4{ zT{12I{@w-uZbt;oat+9yBZa0a=ku53Ws>cV)seKz%a0_FQ@N_Fu+*B~fE_{g{vu6b zmJR`Q0xcLtM(6^5j=cK`QouS`Hs<=$jX|0I-@Y8v5`|MVy#ZD-P*LQvkF zbZk)(g$XsN_WG6LC_x|rL&<`6I!RnFRvZ4Iy*U}!S^i|)6wU~u@CKsNk# zarXC1gdm45(f6Q74sSoFC0iu0%z#k%7;TVt6c$)y4w*SS+$=BelU77${*@s&wSYTV zVCL1|XG6aJc;N9AuBt^F;7NM%2>{{J;BhPz{)<}D;WkOLQ}2M9Ja#*E7>T}ZuDVaY zCn{z?bS*Hg`r7s+plnQGnA!AoImgeI&g6f`WGE+E@&dGD8$2nA=pfe%;?wpAko?mj|_4~O^aCUI)K6`$e1)Yww?^VaL21k-b=2P-fqabFpN42f$%3SL*$ZYSXdA%kx z^Bp|Bc}BgBwz;SEjVQ2o_?*ZbMiSU^(pa(m5HpV*Bpp;CdoP300cnDjgz{jZ6Tt&! z+@Q0>yRT1Qgw)=<;=Q)qLAKs3OQ*h{{LKSV(0-_5kI!g?5J)F zS^hb5*lGSX?VPGfMGJd2j9;re)V+94PTI5dUuY5IaB3tr&@I-Q zD7)O}W-G+uB0f*%yYR0lx;QK;APzLe%Zd6o{`u2==)eUXKmZ`=S|v3p2kGjf|emiXpBsNoyRe zT2$nc9>Cd_Iks`>i#=L-H#ZDS*P%K^SU*h~!J{c0QFu#>4pdw`$9lHa4qD^pyp&tY%6Fd}X#!;V(}UHmSGMQt2h@xfWar?>(3E~QaK1aQ zz(FRaz=*m^BN3?WkgWZ|kP(E}`eaK*ncl*dbQJn-{+*e=j#t$@e_NIaMtF(PcTc^u{{0wK={(32AJ!c3NcS_NM~i#* zPzh3*^g8#?)Wlcn3!hy&{`URpaiLuqp9(urXQBwC73++R4Nv=l4Q@31h8Cd_;X(PE z`O@We(zeeIVdnqf>20_#mUwMZvHcFe)I2#TIT~*{9g}QAAH(zAKmd_cvrRD4m^crv)tfRH?8k&#(3W%vx48B;rwgPhc z68!a^vW}akH2I7v%ux%0tpOd?`AgPWaArMto3_;Di+1mJnJO9ry?XD>iKo*k>!8KxzNo}){8=afTq zl0|2Oj1tAGe?1!->_O;6WO|O_oDuGN@el4h98Y)6u~z%mR=5`Kxw(&-*&vVD>Z^oy zoi+3Ir+l0-MRILR^{T3i<*z}I|nn{&GxvQ z=)k^t!m6l|x4enMWg?-}quY&%K8c@qM&`9rZvy^`uXDs%?R%xTna{QD&z#eke)`E_ z5c=6a1^0#nzNc|?*L7a_&hK5ODa(k~KKHKXotg3UdL(k%vGMPm}_%pa9t}g085_OTU;lswHul(Z1UU-u-ZM} zNA@yPzG2|=poojmnyKC?2QJFKm(5#GChaxv>1k`u=)ju9PxBGWBa+oCAIrKeFL6g|WP#Q*u# z??bcFkzU%ME~0Amh-P-q+5W)xPfGvvdZFmMWMUwU#Vwy2>(0w{cmZ=7U+J?8a~Hvk z>WA^nV}N+=IbegHUD06E<2?0K)wL|0&Tmn#VzpSpk^HS`lIA`Rj&#)vXf}b?=m%ar zwW{dew@`<>a`oTC*+2fw&R{3p>w1hwZ3V)Q2nISom4h3V`T${SJULt&J0A(oz?FZe zmIkzL%;d&`<|kXf3-cRj&H?lE^Zt#fkz$awrI<(GavB1fY zMI%Gb>-<8n}ijVXtPYiZ&@s*NeeLTgBj~UFoi8&kMIIIoeqRJAz)PfTTKxrx(cy%<2|NJJB z1)MrtTBw9Yt|?lR!8jpEbFUW+5ms{ z2OmQSHdl~B;XGxI^Ir`bZpURrP$}-aO0T1!i^6O#`jU2Z`~qv^UHmWHtH@lDb zP@gOKkL&Y9K=ygpo2q|)Z&Kw*4G}5PhgM90kcnK2Z7%XX7XK<*(jVts=ggjIc>L3a zVT-*(yyS4=UzM7NRqcqpER$YuY_E5?ZZ;x~RZ`u5IgGty+B*|BaWZfGiLLp|SUjXF zJQUzN%}dg#4+@pHIsiTJ7Zo9NK>^F&_`nJtiHuE5^u_1q0Lp=Ov4a#q6)k=%P&c~u z+1ugx$K@*?Z<2FoI-v6T)R^hnbSxeS_n;k{P>cC&Ex?GO{8;a%5F6e|@WyVFlUp~Q z%a=#itF^OZ{(-Y614-;&ZCSxz3=t^KqA?;scD{A@StT@28j-bdGI&NkRhzGWZFnh) z)BfD$n{Znl?r7+B4Os;EgpKgQUT6R|lH;(YyO10uFn&6H!ceo*rfmE2mq51@ziA_& zp_P%Ug_i0GWz`wnGpdLGASOAO1$52x#)4m22Ak!!DKN+N2*t4uJLY;-ll(Gpc(&A@ zST3diykr+%Nj+0NP02qTWGpAruY2Aox<b51bS;u;2=gogy8FdIZ9Ih zJlpNe41CNS(jeuB@Msi;5Db2GMVs4;ci*d1x?l36M{i4SE~6I<|%c+!l?NOC$p3uJr5w^DWA8SMyYv#3ZD#Hpv($hC&7bYgM;L;lIy2%U%L(j-}3fhxfGm-_?rX`v6a3~{#-wAVwm+5 zY0*u~g9oV4vr4m|>6TuMDg4JTinpZt&rlz9-j+J7Z-Re+kDW7~KGE1Aa-gjKgj>o+ z$yli`Er^?&Z%e`kWUH1aXll=HX{w~%)y5BJY?{_>lD7-l;J5n<<2i{cv5XgENj?bM(JMO>{O>{cv_3Kk)Zl?}5*zFyl)LF`D%Pkjyh2m>%>W z`4rGN%MqoH!0tYP@lr*u{FWzWaY_=@Da9?$eG4q_KxBVB2@FP~|xIdCfUi8CqS>FdlaeXTl% z+8_8USq-Aon1cp_3xkpDHUhxXtUn^goU{6SX*9N1h)Y)Y(F>ssKXrg#q)J>4*m zJ~zsAW4D|<+M{T2nC|Anw-|27yG;pz|LfRIj)rI0Lb3=oMoJ)cc87kxK`wG4z0E^3 z(j!wALlJ=ns0z{FcB2M#scAdYT|1Sg+K+XL z!U^b5hb2PjWyXr23D0;ipy37gs3|G93a82AA*>mPmpiD!Dc&gxs`{P!N#%F`gyf=9 ze6e*g^|Hb?9MQ4YL?0$qH0WcWjjpF6kqTyGUpK;cambpiX~;fxwP`jM$MrwLGd`w& zU^*8h9I_+QYm7KJsKn({rWGyKk^U|E=X}cdV%pv2u-Y7=+OCa#@r|3m#?NGlYX+TH zBTf+yoD*-l1YvBlf;ETE-I`Yln;VmVQPD=TlYL|)Rfj1zN#hOits2)GQ#VH+;eu84 z^9K=J)Q>5w+^JWM^tyfg0^SXCC&{`l|23h)ZP>(~( znsC^;Fl~*#Kg=M|s|>9fy8PgetRaBiua%CR=h@HH=*-MINzy->t#tgB4?^r1d5e$w z-UaU!Uq}c}kXP;-ok72bC^M`Jp4a}OuL=AnMEbYXv^UX!X5O!& z;OF@7yHL}!+3)DFYA*xn879W_-E}!# z9i-<|@*vJy$YAhHzriUr-Tv^AJ_ zdGE2H^NBRxl^Hez?8z=}>$W5S%ZVPBAA|+EYXla&bhzko~+C#dd5TT=60I~CJ)_kxkn@m`DEJ@eZ{dx(e%7fcipF)wuy zJt7VJ^{RcG?xsC?84pQ!8$!x7LW3~5U%b3qi4Za@r(3l10mA5=<+$udgVMO;Rxs;N zj{V*|#&MKMi}uFN69Ra$huGMWnxR}0}R{`^&fkL|nhr7{d{uPXw?M1`L>$Kf1w;vnk@ zg|J*{hf6cUg0+8`PD}klN0SXO>Vd2U4qwc)r*Cr24mYQn*zvOHu6W6#-m;|7sL^Y%u*g&MyU>v zi2xRm!7O>b|CLKW$OVT3e>IcJ%+z2GvYxA7+gr&oSfBl%Z@t#ar&!i+r&)i+^11G~ zycVtKv^B(b9u@!I8)FnNZ7W*owzzsjx)gaM>Y~4cap5)o(`!?DXx$bUef&g>!~ijT z;F&Xl(av5CLVrL5n%n$j)?|0CVpO|NA@57h%Vu~??C5q%<9(1E_l*3t#WGxLZQNCk zJw3V%q(D*jvXn)?j=mXas^sQ4KAFJ&!{Ij~;7Vy+Itpe#Q3R8d%gTt{F;)jH^A*j2 zzVmJI9Ju0Ht(P2vu+$AOdRem#(nU@bwo!0pr(%l89(=40&}K=XN`=G3r!2LoCl7-~J~D4+xi( zIeyMvCGgB1gevYLC(my9uSZw7Y1jFMW(`mCDD$8ZfSp)WH3VU$uCwY6BpAGo>WP)w zRuE*P&JXL+6G#+23^ju=2hp4Z&Qs5drTwN3nBF)%40eH(Fo+B0i-kFiw>&!m8@vS= z`?g#AI=wK*>)>|B;vrn9pWzJtatRxXau?GH4R7-@^EzcZNlu(op~9=IvYHvXC`W#v z9ArAZ3tra5)@Sj!V(B&OlSXj0 za%^7KYt>SNvB$NwjRaaMlXG@K21-u!ntysq4}{T$RO! zAH)~7%M5qeA|+Q>xCtZ*?HcY?J2_b|s`fjaa@$JtH#rk{X%Q7jnaO%B!85mwQ?Irf z!}M8Y#h5TAwYRVO25`%4Fho-#CO)#flqRokG1Y9w7dKFG729RRE;or|;OX*;?atJf zE^s%4y*&~4&&7I2uMH#iHXn3&)ZAZ6!Br`!1N5=Z*&=64=YjigaoJkrI4~_Igs$Vt2N{$~RKY^SyCkAJ$E2Mn3 zCX8AvsEv8F-&MeVQkP&kEk<+hsNJX)Wv_46s8h^#E{q` zv$2)aTN1er9c&_c4gt&>kqJ6+Tz>v5VdiZ{AOG>wytE|Yi#vqZlfXEjA!VtglX8{J z@*UbnVn5IqUfKNycD-E6T;fL;cgcz}$jWxAi|(oeEEPNXp0F5H(~XzW)7uaBOs7oN zH3Yr%x9V}M^rLKz_J1%_cFO+pX5W<~_PTL@q*z@x%j91!DZxs_vj3aymyrI!Np19Y`FwT2m_?ajFI4b88T51^E3N7xDYNf=wi( z&?BK@dxgOIr$Bst0ia7W7O*xKMclg?&$906v)zR%eBFtaUA9~8gt!AnwI``fbvF<) zq4*z%DJwN^7>+MD+dUUkBu1R~0=IIbJrtcNwzQgD-Wkt$AeS%h3VnIlZz7kUZ`2F_ zL^b~c=gq!{m`ZHb;SgmSdQm?Y{`q1gja48p-8?cntkR48FmmveJZ6`i2c1-!*sds06_s*Hc9li8< z%oD=_cI+FLugW|AJd7?gV|jPQrBmOGkr$L=14ZzRs^!VIvkDadN!2H7S#!(tXhT-gA16mpGrG8`J zDt$^HFN7t_bdRC_6T-b1{(7#Izp>!SO}Ko^o9}g|I??$G;I(aTG|~1SvF4IM!la^b zBb<7-Xp^hhr2yDqh;+sGr4@e?`jzml#TrL3yoIin)$Up*HXYElhYP%;y}O3+@<4l@ zJKgJllV{ucvD7Cqz#?gwG@LkOV>ZQ^^#*^q-N7G!oWhcAVq(&<=AjKemW6A;jqU)y zdg&T|W8)ky7{EKn%|nXAOCkGc6@*$-LdZ$!d_y{TA8C*M*b!H9PJ*B(U{M|A5!Ohj z7*9t>UY0p+Rlj|A=Sxt&97CMb)aC(k>1~VSL1|7B+(<?&*c8;~E>6*q=APKp}wA zz{@khl87R9)cN*PKF&fY*2?<#vesn|*!2dRG+_pkG)#@8fuaW(Ny8SU7M?i`FS|>> zX-!KS2+-2TH4}%|GQ2;RFuaD_Vhyh?VVr3#9#YfKc7PA6AeA(fhGuiz;ftYukOJIL z;NW{-0C-Iom)`9M9Ra+Kr?>iE-`_2;H+m;JYW2D5Z*w=T+0R6q@MCOLD*HOIL`s8V zE^VkGkH5EWYH-)P?nk;m*f&%gD^>kOVhewr0J<3H#%RKWUiap)yg^lsH+MD>(kDtQ1Y70|LijoGp1KB_QyV36AmoMMMr#2tPWlV7S;1D~9b8Igv z(>GdFpePL{YL5#;Mh&SaBFx~)Xrb%S+jUBPgubVQwhHw&-f`J8mur1jzU6(nz|C-S zOGSk#Ozaop_9|X#oi`Oh|{x zJH(RYA-r!oAmuu?%#cH1F~$Mh-ORkK*}B*FU2gEo3Fe%bs|<;nPL531TZvIu+h>K@ zHTRe2l|Werkg0MB_|0AI8D4&lL}?%m?Qd>=T4(7L&moVpv`rw0^U$o61I@A ziW=-nPfe{$^Yd;MMcY_I~!nNTciPC$_iHzJ?gyJB$@Rq@{NlB3{Px;8T&||La&TZZyaafK;pI(-9I3?4V&s-Zpqq0#X?=!% zG4|K~d_HfPKhJsD<(@JepT+>ip)Gdfp11m0u|Hn+IiBt=d7`Uoz4GVBGutUMH?f`} z)7*NzjW6Vlzw|$Aqe13YUQ6b5=(KUR!fd_4W9v2k@SSV;&rUL|t!_T{iW9&K;Kx6I zvH#>jhZm{|?$p4%THui5G`L{!;@bVz39dms;A=o@T#t(0;1^WAL-DP)jF}v<3$TzNSzN}KB6v*59vIA7{d$lAbwKV)(UE(o+^WC%tIJv(t0@h*X?`n8f zziYRm%~O`)CBWNIrZw8MHpjzTlxa;Tp5QymrZswu1H9lU4YwC0Y3T5?JHY4mdhAf_ zSfkg~ad^3goQBu#=uGWD1sCp!V>n|8!xBk@O}U$&u;rFGbr z-(^4jBY#G`ncQeIsn=B$9}^?=uFc0HK&4DqnNg#b5vgLL5ao+@Ye=3B>9#Upu{ zsSE+x5{5U<;1+#$qW=)_09gt;CW9~*N{c=y1cWV2jmN)u^& z-5IJ`N9KnCbrkq{ssr)!loMG@_a4m ziGhCW^4|_91(g)lSRgBL#JO+T2=LMuwA4GPCz#A8m~K?~rujDh!lP?=VtNK^M$%AW zYJ?4;?ve2bv8Op9tg8NXeQT7g31iWsjI-nu90PKC|237*|(@PoIm;SZhw-Xj~{3E&0r ze}3^|{~P-)KGRQewE}i2#juUk=)#k^@J?i=!+_VjLOq0rk_D~p3kR^YEj2VMxrX?7 z=!}nSAIXJdpC1nOvh^?iz047-?~4v6bwl2vEo078t!-M5aTVz2#c)c_&AY~+9V397 zL~BrwjU^2fBbET~y3MrqSks%-!r!sAFdE(*!z+N7-cK{U`5puu{Yo?tpT_Ux&as{1n=y1EQv3G?2~Ja;(jjb3yH%Kb;uyfAY)%`P zK)9w$D$q7W>G)XRuRY%ietD!;wmfcVrdXakw8uiGrzOck0hXo#@RN!e0?y^ACM!xB zq6~v>T55~UttgTPj=wvrfm7=<{LWd0zxnvqAnqR9+Q;?06Tl1LAHH<4|I~hmPqz&& zR~2s69rpXygk&P7%cT1=Q!k^e@g|uY&=LkWw9njvmY8_h;bL+9(7aSRyVa(z-e<=T zKT?mlTc^9)Lv!_2o`za%DNNnd}TZ$uhFv;Lk&y0q{t%6BvAmDoR&vEstfN_%J*gnv;k^@%0d_fDw zDQ^`Z^W~KWvgKFNDqP?dUye!6Z= z$20~^W*Mw``%k4T%7mO})yL#b0>Eo-*qcNlb=_b}ai^zqJT+_a(X}3b;DHBm#?$~M z2dNF$OHv%^MGI8eM~6E&z;9oHwq+LI5gI*_e4 zsD727eFAs^{KPAl`rqDL;M0o+=c@`gYXSn4ZLP&Z<+~RRBSR30#~Zp28L*^Fg#-Cu zR~Rt0AshEk$N_-z%(@_Ph%$l2*Xus6OC{$CR9X4CD>4Q7$_ndAyPzQ#n+_O5%<$bx z8vH;RxX{s(2I8v-@Djs2HDSq!;eB6!h~G~dUc>M*;HCSsq=7$D%&l}K+k+r zjE8B5w1nxj6=!~hK$puWP(IY`x-*OQ!sYaS!j{`jn8Rowx=7o(l)rT*I}mx4*Ldk z0=qWsoCi|2y%Rr~0#yygO2F1vbq+LZua)`U+Mo7c%lxx%?Hse3W`ew@emq#Q$uZzV z%<{5LYU+E-z~{%ORq!I8TTalTI!aN}5K&w)u62?IFI^FfH;Hd5V7=+_=*Aj8-0k5% zdFqi>USI%I9M7*#055=_di`?$x!o3@omY4j6|Pk<`Y!r!ZXB#wsb_d~-XH1_dW(i} zK+aj~fh}aH{D3FN)0yWohx68$Z3NKhxpDdtKm%mFAv;g#wH~KWm>B!EiOQkhTXQq z<^3K%vEAag_v$Re>j^G-AE|Y5&$h%V-t<^O!MODUfT4!UFN#pXBvarU#1@PLH3Iky|#c(}ous&(AF{|+Oq{6?yw!jC^ ztl^BA8uG>;o2Ssk-aY7B?6xglyR(bmywl?4wNto;HC&iixO!M&w*wYk&H7zRB9e_L zq3vJ2Krk_i{a4n??UXc{IH(m6eo_ul7b-3`jYLyC&aWQ*tRsvUqg`{XpNcPB_Stz{ zHQg)&ZEu@}0xk(d<|m@QHuasP=i6x%`vN-%ke{c}-=U(fsQ!fYweWdl!_)V_B?(-N?qU3 zZu4Ac8*p|Cdn^OYtADSV0ny|R&CCl-@`{XZshoM^7ig%159oSIa|)sX0@0Z zPMPA87R+gQbAZEUTH}$iGR&4^c&8IQHi2PyzcXNXncbDQmKdUR`&h%fyXbLwzr#;% zclfRS%0y}43{$OtXYjAf%|M(x)3sl5Gt131?_J&t-9SpI|z|- zIKbFDjR3xa#PWc{gIx^?eK~_6Olh4%=9bU*enkd6Z-4Rd=wYOP|NJ@m`icFFFR?j4 z%Yf&YTdDEf61)d!C14!1rj$>0LF2CTlvZO)G4zP4GLK1wL{L zcy3l<-SE5wU@K$yw4y;0p6zad7x(7)bT`8r%@!`UQ(T@`*qZ|f9c@;tjjYFpH(@4T zm($LN<$C}CAOJ~3K~x{GMb*7T{7!B&S;%arXy4u^*`$}+TWFVK{p_mD>e&0n=M@;_ zA-^AC*{olVGEt^}I=1g2Bs~IUn`+OWSMD!<+|hPyajZKecTN1D0A7>Y95^%W@b=jR zKiKc#!*4rDDSX#}_xjcA{X-8wG@|wI=22hX*Z%F7F85!g&}3bOH&I~+Ee_2;ibHCb zgiQ^xnAUMw9FhOae@H@tn0-mx+czw!ji4m6KolV7kFPa#~+}?6Q^eo4KLl>NE&QP zVbSq&rnSn*8i?WDYdc)A4DY|u46lpB>xX3@mMqV}4gpm?xW@_U1RlC!GRat|TGsZ% zxUI7Q&pt?R6LVNXO$;3{3jm)?bCaI#Hz@^PV0acgL}jaJu(u9LBU$LD!sIOcxicMyit0A4LKGg+P~0Y#75q{g%X9@(hz zyQVFE|E$F`U5|~b$D-|V(015abhzF2xL8;CVmrml%@$s5C%8JFVsFu-UG$h!C^9qQ zlk(X*P&!^eoe`iHEnNr38F&2fbI5$h69`%A_Q(CLGY)0&xp(EHGZ){D-`2Owy+^h; z$4=lbKIgngbSx-VEU9orY*H`jh|x=M8h5VTP1a*V4KGiDjYfT9Gpx;kzxU+v#%TA# zdQTW$TZ@1H)yw@W`z>BrRCo~C>}4Fq76@G&K2!04^jd{WGIN^W;)>Ow0vQA z(EN(-;sFD4#FieqUwr@a=OfJ2-D1&EnBN?OTw;UIOu_v?4q}?>Ba_iZaky~o79$Qev81_T$f?aGkqjj z+>hhRCQPOUEYU7||K=L3`H^s78=G@npIDXcuRK-r83DsJkes6# zVkA8P9@ePlnNC+hBS4y|M=LKg$?eok(a0L=9+L?H-`W7*$JRQ0({zq+Mu*31ply3B z4i~uD0@pg=wPp>U?bq>YKf{%_#-gp!E;_SGZP9c6aO`T`?v?@{EN_WHWzgg8IzBHC zblnunh4U+2S7Ktn^o;Jf;mh|a5d-D=d49ZHzOpuc#ZJ|uld2CyjTo3X%6rRHHjKpM zr>Dk0JIRVMbl!hq0B?my)+_uw{TzSu=@b3#I9n>8WdQF9!wdX_*RS@k?Jw}c9C)R# zaTPswvA{m1l&m-ezjyCS+7Lx$Fz!V$yP2a4v-VRCx$I!9)Azc z5#~hE*GIT(3`Em`zBKfQZ4(2O;J)O9RJCQ7(t>bB;Q*xJZvcZF18FTFU={RJOhjnA z_nbAnYs~~(Bx$I7JYO&HT^8_ePA8bEC=HZB&RlJmWLeU{3@F8EIEGA}7u3H3&N4JaUCG|cw^9+{MFf(^ zO1?*X@THkLxzJ5#Z3}3a>)s@RK~gf^xBbLGhC$Eu#9Cf=eI_zPXn%S@PJ<$sfp6H^ z((}TK(@_GlOY!dXsKOH+kDf62eo_?kO5@l~S^?m-g{Gz7isJG%6t}d&M$_T(*#aME zDm;T88wYdD59YYs^|*{RoS$yuJQ`f<)(rcLwlZLs^tzO6!nJ(zhjx{5{lrp^*qIH~ zOR(&q?Jl%IQ%4Hyr|vR-#t|H9a!EXGQ*|&j2$hBzcmGw&nzQ2aWN&b#En6k(UO}99 zIl0h_3VSm6D&=47tL94V{e+yvQnb1P>S=>VHyZrj`EC65x1Y!v?$(-50I#jV|L={f z{l&ex0lY7EH7)_TjTU=-XLO7do=k%l8gS@{2e@M5K6-3ZF)RcE$|075Af)jbt`G$_l_kE97I3dv_`td>%{Qx zbodPdyo=T)o-mMCflmhqRXKTr7yg6{Z9W=9808?e!|-~=;AHwuX`5EiTrr~?Grlq{ zbsKy%GbZJae+#7d?_Pigdg!zLKL)yNsfiTI9G3S_{YYrT+z{IAbgK*v3m|hsr`|xanXL{h#uEW7$ zhd28M7pobr_Z4pU7238&*Y>E4#+N%D;oqQM?L;y3SD}=ljO}s^tL_i#d#7#Jc9vm& zGtn7z{dtCTx&PGmItIIXKexilU&cR#Jtp1CP)3CxF+s^-sQe zqrbd=h?nL)zPKPAFR+acyS>@EW1=-^DLR|8-o(Z}Qp`M;IVl8wq3!w(Zo5J>u#Yjx z0$$_s#6G>9az`u8G$VUnV%~b7i#zam%Z`S``{3mAdqfCyy188@R`;NpRo++hS!xrDxa6vl9qs6+Mi;mD_2JLW2?q-U}7(# zX_c2Uy2suCUSfI~_*Ura+H7j8%to{dZ9k=u4d(BzWq?cl!RTvgbtaM}`TiYFkkaFM zt!%D7O#P|MalYOavm1mZqvI*l>+T&RtMSf1d!{K*u<|BTZTWpP<~Vs+iWq}ae7%fe zcylXxX+Mm|2XB|keaHa3DO@OzeXbmi4FoV9@SQ5nJbpyZBfC+Px zXm&%}&2>B}T4?|q+xF~WX(ceXc_eb=Bcnm21K5y2;2tv%qh36>q@|g(_$Fh0NqnAz zs&+yYbB{~ztH}<>Msj_HSBi$0A}>((C}wy!CJi2KfajY9zI*c!kDgh>#sI@h7N9k} z`?S>C0o(huX|2P@cWc~gJ1m6ZH5u1R!?p)0%)I5{4jt8-jLhe#`hC;}4|sGXlr6|V zG*{EH+#y_6w0Dgr83IXNgL*}$Ep^PgmEYUfkS(2Jbk%TJW_Xj$uA#k^D?JtRXxO5y zG=>ElfTdk6*Am`d*)Qam>~poGYf^Kn?kN!{@+%44ahQOxHA!_P{|NNj#1xdA!Z5jg zjo$pD__}rnnSdM7?dqk9aRwOKL|S8crq{k<5`Ikgj^#{m=!Y}@-6o1*|1aZ!UaQPG z)BEkON8CRd^h$oTXGuwv1lxJ3|!*t%>`P+OAK#?Sv|$30N%RA_YlK-mNdMa zVag2tE-V?-(Y$$0Hmy+#Rr<$(_osFk@REjiE)1{I@JcDTd=bNImX$q_)%Iuxo@E)< z-1iZ~7gcL$=N`i4>N$qOQs4f#mNvu#mK}&3v#Wtz2_UfA_E-r**=G z%}t*CC}Zs1MyCktqvXf$-oM{3f1R(g<>e*0N`8D>&funuZce(UoJ_Vj!&sC3N_t^1 z(NV;PKxgX-Y&Z7T*A>N%u1u)CjkPs=+Z6cmCr=F*V#GLna*9nnasBGG{-KA@9s3IX zXXmf<=jT0MBUwWWTxfe->pSdQhF8Lqv7;5|7)E9AKv;m1RIB}Mf2A|e00srN89JaL zCbeYJd8d-QZwWXb^*EO(hCgpb*DIOx&~YheT0Z{<>E?*=?D+nE3rV&eRny4W7XUJs zvCFS8FvD9h!`m>!`&`rF!^H5OWex9?^o$ndYYne3yrki!6syAU?(BE?sqGg3(rS2# z;Wd&57o~w~z!g_0Bm461xU=sZ1d6nnfo0e`1lOl_EB$7<1?lMxpB=PJAS2Yz(J?c_ zIV2|D){3*$I75&yn_K#OoK-2;xi`ICxtNYe)dHo_GZHv%F&jD)ZQ{-!FfiA3s7n$b05x zu*CK!wGtxroayy}B0YOvV(!bHA9zJ;=z;>WrfYk;vR6@yTNa)q4aDwF8sPN$3?HsL z{OH@xEHB82wm@M2ftjh1B%yOMx{Le{t?G_pU6 z!)w>jf}zi6T1y5hXSR9!je+oxfvyHvLk6o1?e2G%7=q46dv?AamhaL{uM3%kd}#!* z_z8`_Pnn4*zF8t^$iruj!z+%|Yj_FpK4K&dEj}Vq8fKG#;pMPo!wm1vev6;k=?viA zUXY}LY<tX8Mc+KmvH}@`GY>4OFp= zud7$5tx<+Nq}53b&LgJ4zgR%)0i|3h6TJx7mSi+pMp#n{c`fn1^Y{1Oe}`3=hv2z> z9UL>w<@K~=c)dwqt8U5vbYSPfAHTLW;YXkCoEwEcoi<7IO|PaV{Ovoq1hUK z0EhVVPd#`7c#j4Tf~%~g;e_FpTKRjgUG2{wF3iTY*A3w9On9;b0~%~RUS*s<wOso1XVpYltKCWnLy~hoWXVWoGkG zG<0Lj`FC3@cK4T4hRL|69zsCX+|LYhR?^UOxEj*%&gu!)iQzR-8ajMri^Gy_&SHkw z??Bg48c3!?ad=76aEk!%c87mKfVb_@cC=wlF}$`c4iEUczmWG~q2GxU9N{w+y~C5GtATJSgFoiGi+%6(Q`A_t8tR^fV7{ zV+PpUk(4T~h|sU-;dU6<+B1s`x0Y_$a!0A4!+t#ge6>Af>nksH@ina{TYNN-#<+}Y zna<-RHR;bo;xjMz;;TmxFb6fwPdf1LU^t^)0Uz4XT~d6zb;X$gtf zdYbxojBtGaqx*Havh3g4kAxcScp`K!KFf2`cPRr|U3%@*Eu&vZ{3KVI_lh>Fi5Do< zXi1xGdS>7+ymBQcXK>Rw6YHI{=e5bOwqAF5a&3yg(C*_SZ-4Xz@ZP;?Nd{B9GsAw zOb<=4{RD@BoArnGp2DcRl?0Vx%$%Y#j>Rhst~&S+=Z780wP4pWyG9%87++Nw-VGNp z^@?&{;)2q5=YF67t4k1>u_=$1T#dvveVA}m3y?LX*uz!e`DaG&txX|_3MvFTg$0a4*qnoiCF+Drc zVBu3|TFa&gRVJ3rxTXid)Erj>foN}jvZ(GtZ*r9 z8AkB>T^s8x+Tuvr{=DO?FsYc~-Kc9LX&?g0wGs+FP zzDL<_6^f6yzL?Jn2&aG}1}YlR$a`}6G$W-4R|d3Rq>=#M!bCYfFQwN*K%Y+JWS|b2 zx;&_g`$wt22I$$pbVfKFw!6Q-wy~hzBEZYcrk)VRZ4tk}t!E2tUA-GAg9X4QLWA^I z4|ZMYtgU#v@~N3Ue76&xZ2a`xghEGPP-BV!<0LGZOsG6?R<-BA9hl!QV}&4UW#x z%qDnb+T#P5<9~hTgxy_bq#io=1n@?+^OF~D^q2Mz@Cq@!iwfr{D1X;-Jl=|8^763H zE{e3eG2j&`gB?PmSiE5eX0319(U;9E)tEBSx}I5(Mc;@)Jwk$s)B)X#B`g69g>pvQ z-o`mb&+vrjTZg&wz>or3KQQOo%ZU}z7P7uk51_&znycLRzP26Uwak@B8a8Uu@b(af z_wffdnBjGaCum7m051at9fwyKUefUX!cK>e8HTsVypv69lxfhvsY@;Fq#~safGYf)-#irdGYwL? zn0|sR-BBI%aw! zse()?U7ypC$hTXnagUyp9aofHMu}JMzh935dpK?^k;@j>IemZ1t+3?%a$tXIrPUpG zW?mkLLz#-8fv8`pE))N4?oB}#)0cOyW+)utUziyET% zdp{FgwOZT&?>bs;&|3AbZ^ildvz&Re)-!kkX5)Z#9{5HSrK+?@3!F>+ssOMi#r%M6 zV5$qG$uSyP(y&epZw)**Y4OpGeGuT?oXvtL4VvNAk_MW*ag>J2FucF8)8d!zG`MLQ zUV^-oa3#y|noVn=6d}MDf!X+7^ch@g&$N@sC_I@S?n3}uvdavxwWo$HXPFi~D4FxL zE!w{WIYSJ9`I^Ln-O7#(#PW0oUIMN2k_XLX>FX4LizE=fHlp_rEKxJpIiMTAMN&CI zTjg4S+qat@cBiJ*J$Hf*BO?V!jqAtq3;C*Sf<8F8`MB0 z{?Tnr;lU~$@RcpQKlAoI29RY|5#1m)=KA|L(+`K_GQ_=m@ax|*Uaa=6DcdyyW~#(o zYpFuI7%q?`tVh+Jnb*rjUXtsD4>THH`(m7hM*y#8cm?o^q#@SuDu&mDC1b!#sa9#z z+Aoo$VYkM0VR%WyTZIg-FTQrv3VM_>q$MWphwyY@_XA^Uk32Bs?KEG{d^D1n6f+}f zrp)D;RY1=}FF&wGjjAP0_St^$m3mW4=<1ws$u$j$ee^`4#2n|C&S4->8W)yB(P+i+ z$SZN>`*=^_R|3-VrhdL8eaIirjmy5Th4qk5VtjejcdDNmi!yej0laTNnNQOhlm>gf z0Up>~$9t<5f9Gu{`rYL)cKjJ9fHzZD|K$9Y{^dggymsSS+u=snVy{}@z}PHtU-DBM z4?~;RWZ-ebfw6S!Knq}2cfhbChXb?+K;s)X+Y!fKeoxOF2c!$k&bDaZp2xju5&(eCeXe~?%Q4G20cS?x5uj^U-SWE=Z<;=v7UnJ5he zb{Xas8D7%w_MYMWrJWYPc&EV)!|--!dkRd}(S~-nX{$3kiN&t-o68h_^T0G)pMHRF z@Yht2?9ML$t3j+4NlEOvv7$OGj*h*Xd!{^4SQ&jz1l$u-@&GrqHxI&iJoGC8>3Mqa zwf76d6{x3{rUQBng3IjdARWZhLEgjr<;%|joHe(~r~vqQKnN(fXA9?Ro@OY%{yoFX z$Kxe_zsXGAlF|#)^LQmrqBR(%*QFDVq$Uz2B`|2YUktnQp2w6cFg9&V%8ue$ue+UY zn^^ZNCoP+NEC-Zv=}Z1P<0-#Hhiv^PD=FH~#?m5h^*Pw8EIjB>xx4V4{CE|w3^YY|L~5JmG^sTU?+e#Q=32Y#+Ck+!w&yH zdvDrw$&sChJyms=cj*Su-Pm_vFaQR?P-Dq+4 zZ;tRMNB9>w>`z`I95!X`G9{5;6tZPW)<~2%8wNlF=*HgYMz3$b@7=1(an8w;c`_^O z-nwr$hO%`V({uaQt;)(gnR)WbC!aj|$*RSry2QtIi)&4TV+i2o0A=iC!=NQv-ek!n zWqOhmW8#6$W@H1}O7ffqSZi8|+^Hmy~7*lBqG*!~HgeCPlN)39lcr(teD zXIMZdsJWBYtfYZ7y#JSDc)wtVw?*Aj9NzT|uX^nie{~>FVwUiGtm#cf5;2hJPKY{v zD5tq}6&JD)Dp*3l#eYKoFo4AC_Pd%(`*as5Sb(GhZs2d#peyh<6U9K8-Pak=_ddHAOJ~3 zK~yMWgEn??p2U3VvY8zwb$ai+MiP~wZ|TK$ww%Kl(nh<_b(xnT>4bsj%U#0Ky!2`S zw_tj6z+*jd?{Uk{-E^7wb)Z*= zYqM#M%gaDmr2)qNX(lD*4e}0W!33xVI3JA`NyX&=ReHZ$eM$S9$=Uq_oSXgs(D7vW zeKz;usjh!_zh(TjeOI@Cg;6IR=lb#}ugHU4-;BMaK@WYAa%eS$r`^=3C7Bv9+8g8X z2lnv#$zA-ya*iK=X{X;E-c~l>DS-F-wf4gK9d&Na_3Iy9Yd@K z5O_0BG@_I)T0>~kzC)%64q^mS>>1 z%Rv|o*1a#C(fjc%{)cmSspKRlL0Pj)M+YPZyw1M<-=X{i0sN`cAKC=IU{D|~Z* zh9}PjhBrtWq+K#(-~&`zEZbPaOAPNna18IY6|i7Q!+M6-L6R`!TfmY6+{}QS4jTcb z3Aj;E5L%xw)SW-kH9z9XT+>vzd=DY%QV1G)WDaOcZsnIW6X9f~bU>9f!m9Dg^=t^>`X{sJJ*PtX&;cOInnCBJFPFeF=Hyw(1dv^!^dZ56_($;SYRq6aUpKPYvvaLoBqrhb+K=_uBPq z?ZZ338?}hP{_&0WllcPgFAKb110OfQt+vK-%Zt2NMu0bjC+l>FK7gBV8w;lR#43d0+sG_-i5TH%{}q~TSDR|a^7Q~aLp!4nIw;RSBb8vH}Y@LqEa zFTq_eX>iDkr8_P?4>W9%6BOwe0uB1?a3c=Pcv$YgOXeesdMp|nPYw`>|L8EISAEvP zi5HQMHKY&&5h}TTihW4E>>E2|y2A^vOX}e(59Mzn1=n9(rXSUI66{YER-?NQh>-eP& zD`|c1H~6_o(2f}EYW-a%uZ?B0vNc&IMg7E|E?H9FDmksS}&Ud(5qL#vm z#@b!(mLz3p3+#;woH=`luZ~*$#Pu8avtN6r>(ov)_U#^03+x!)p0@CtpI&c2qXQ_G zE#9YS4GnO;ZE%<3@p^_=8$L0-4pbP&&JG|Go=C2z!*G7M-lnMzaa>V)8Gk(debyyx ze(K&GaE>wAyu>E&?TgkB@;xknIjvWB@axt?kKeLRG2__R8kTIIPFgElyiqKf z;eF!Vq1W(s8D6L1O&H#jroheF3g5cj;_sbQxVmbws2i+^;q?(o#6qm4tlwtT!33NQXSXnxq}$W{qP7QB0U}B8sH`)5%cSe>W0riRA(d{zP-7E+4iSiN$nHPPmLo`#N`XX ziV0&kA@&CBZV~fZTW^QHq1s5gI-u8R=e=gvw;M{Cm|l5F> z2{u}TvyfX|5icVruqlAkW~Q6l?Dch?ugm;~qmg6JV;VANCvHvIbUI>+dvfNR9e8v{ zs9g1%TPAS&+l?Oy?K~HyA-|%~CuvwavFjZ)wRcLp3q3vfCF^T~|B&CMMayP2+GKn% z1|B&)#P3<1;JKM$-S}j^SNn)xUV@v-aJE0N%^3geSYxG+2~!07YoPxd$$}y#pQ>tmy@Qu14dNgT!&_B&v}o`~DUycABZk*S8}%C_gxI4^YYPBD!wcLz zY4EK(HU7_&5w0#<%g*xW>clMazN98ZzU}K0L;vZl$RJ3mo>3@@?EtL0XXW?xdTvM%wV_FsXbz_;y3nZ zk)LJ9U5+w`9>@$Lz;Fh_Q5T3$`ig7BaK>u4sQz@~=!g-1HUG zKLWCKZN$}w0k~R0Tz}q70U&Y?JrJ~;*5t@-lIjG&8<<%sp0S_VycUiYHcYPCJ*k&q ze+yx3tC9&({*S%x{v9!vVKZiD>Xd-r{M4%ZUO&Ek30hv?(XC!6UWf7h?f&J%`dinz zjlKH-s~u;xr*t{c5mZz{^=dyU1Qb%SpB*o)A#P46k3D)-s0y+@MN9Ee6u_z@Sk|XfqU5 z3ICN)JoIncrCbyZDgyNidflf&3xnMPvuemn4|q*JI}jycb1UhUGP)NS_$10v7y3#q zVSf*hH`Fo@cL_)h-;l3pkO%hQ6h5qBSzw#=@B}Km zGT1{Wq65T3UCRWmsY3;Pvbu15I7N4M}Ruk7Ru+qI=(ckcl220Q(C?|$08 zw*cO2N_^6^xY;&1DQe8!@Gk?PI8geJfrVi-(ix^*Kn)J73&=vYLXYmaozzzjtMmJK z*O#9GHxKS`3EKeHWCU6JReuccbpx;)@Z#T7i9=WN&{3>qOlBnlvYWj77Ju-BGQ4!~ zL^T3Q8Xhehd>u>t^ugRPywW07!z=3%f#IbCR21;eNUn2Ie zv$K&6Y0%Kx3Ik4nVlteWEcxzfL7@i?0bhCm$dHO-Z3~l4@1yVXX@w36^yme=8a2SJ z-#DO4=43eKKZEWxTvuE!zmYxYIhr8QbNop*b1sEGDW6`qTeLjk;qtItg?yF)ynI~< zW-+VCV6?mn4kF<1R#3c}z_5K<0;O%GS@^5mPNYq^Yub)VXFNC2khUhL4a$EG=sK{= zW#HqmDV(1BThp}`O${^zdiigG#)Tu3^$%0w3SZ1*L$%al0uxW4EF&2Fvt?{;UpD_v zfSR_^*sq0jlrYINyjm+mh=UZ!h3~@#hT$M}eR|y$w=S&iFKz50b4QrRZ%@bJb&PN> z-)X(XJzd(WZy9DeCbSmqG0rbKpH(ykMg(~GCU|1M!W)Yv{^;xo-+cACP74`UKfAlu zSzrfvH?)uc`Mpot_vQ`WZ7O`wl=#8}US%5W&}yX(-T0C+R>$pFI+6iOM&gij08w^( z@MfRm_}#glgQlnHlznsed|G)xY#Hdp@n;60cqqvEpY&RvkJ3Rk&a1BvCvV`EVCpoq z3TijCM~*a1k5FN+8sT6xV!-=GyTBhkPz`S!mWWDe*+mjk=RYK%s}sHDFICZiIQqQH~^ujqJ3 zhUwJ_CBMl662BSG4ml1Ky1t~mjRk{zx5*c`7tXI#00TT1|CO%PZrPvY9r~T_(_nG> znS(mPLxlQejOWV1Q)Lf&os`3U7u+X0Kl_Xvb0c<=>+%+Vz`5Tg9wsHOWRhohEVPs} zgsIg@jWF7dF{MujfKwJ&Q|B}-E6t5t@@W6x!vY1k?hXl7VHjUI&qts*vDAe-c%=|7 zn%X7hg@flYz?DN%NOQhwsqHpct{SW;o-}>dK)nKL2EQfhmVmFfo*2*fJ<;&;CC~Uu z{$%f;`uR|^p=aluasWiq&J2+C_UV7l7|~`jb|(H?-t%>#aQyhtr|#{(93jwC40n0m z`|Oip1+~9iTE$#{#wDvC4!_6N>ZYhyv|dBqaS7em0Cpwi=sk|%Eork_Rbu~O56@13 zf9>`i{MWna4C@=kJ^cE`7uR=D8rIqGFI~RUUOZXht)|4~ngDN$yM@H#Wyh<7yz@%B z#l{2M6zll!VTLR3-vE|OCN~1%duR}+dbAgdh95RMO0zj856si0!H`qyNKTc1EB(mq z2JYr3T@qUleB;e7G0?VbrQ$97KD|4fwB|Hl4)E@eDm+FSUM%p_2MauQ{s4!Qi9cyg z4xSLDnZi~pX$XL~!EfKH@sEh%tqJhfSP_V59mAW^@b-9iN9Ki&K`bOKG@S)kTV1zC z3GNhkr~#$8yA^jY9^Bo7L$Ts5?ohnAYj7*>ZUKr*f;+u=?-<`-$jLru?X{jYCynOU z@4xAO2>q5zoH6OPbM-RZ`9;9bj73H8hLtImPwg%5C|>{p({Ns#xpq{Qd-;2|$9YW% zRXPDnEuz7LmSIYu8#toNo-pU9UDT!rB5fYXUTdZH;aB_E~wsilRJ zpqL6&Pc)LeOR`!drj~G}BjdnT403itErEEeRy{pS>vj^WytzuxqV$BVgy;d z&SGonin06sm-6eo>e|!B&5J-`Yk!L^6BAd9EtfLKNuHmLI8{hp%|wAyA@XdG8%1mr zO;_}MW>3JkTYf#&XyA5=J$e|IId&rkarrWI;T;0C9V?amVu8_(1rEZTeJSpKeQ)t2YyKm{ zrN^-NM6m#JxCrF)-o9-kMFi}D6R!&1A z=up#R;8Ns#kYg#YzWr9nTzRSgCh4-blxxns&ZIpyBvIXJ(nAn4KLtD;H-dgqODp$pDh6bwc)kh7#B!$z8!cU^+hBx>gwAK0tO z3v1{fFp&I~5U%I^1ULAPj}zSX^jzmcaAxc!F|Rg~8K#kAyLoh*aY!5|e!8ou?cz$$ zFxpcQ_qeXWjtA8ncJ7ac$50u@NE%So*c6z_ufLXMB{FF4gln_DXL>KFo??TCdgB+g z(XCu{va)mZV~O57I3;}g9q~;rwba7ymnZf;ygT2tnVXpl-_eZ`E=7xr3v?H z_~NrR&&tvLI$BZE2ihoYlfE?lGFPG!jyKV=zcT@!A^R>oZzM#x2~Q$946 z@#CANw5)x&^A^+VtitxWG82C|Q_6H~WPg|a;y3%~sw-#!Jx2LNi9I`G7D2(_87g!} z(2_;LS2sXcPGJzymv?X^N;& zlscP36$2^TnJMUlxMtfA9&^s83f{}Zs z3jGE`EYIzi$<5o$=QR~SGx^M-PbG;wyxq2mg2!*NyTis`J6AjxP~GfqbQ}vDiK+JRZ+3zBLTROWOnz^`fY}e zd<(a#vf#X1f!)^1+~4!NZ84t~HTcw?bEx$!CX0WI^`+ow>WElgtS*rR1R1g#{!MtzL zsFJL{;4#-uvC2DlcU_!h?qxZh{JgSt)6UY3sFaC5{qndnEa&`L)vnZY%TbKNj zb7N6O;;yo)%pT1^G-2CFMrwjGJs>(k6m3w!ct=KPcwvE~+AKcHGOmKy1*IoWFK*2p zVgWSesHrtf)?H}4`1u+=7_cIDa3b!gGgfg|Jlm+eIrK0CJen^du2k-J2DVYgYV#2n z-`$zM^|qlL{V5^Q{w6_jF(IaVRQ1d5lg+~W@8XLIsw6$-0HXVS{){(t;a9s>>3=nj zU~gADVE3EoY{Yb3u21x@F*(`W^HolNLWLsWZ17rf%< zM2-$N+OFz{i@F5x0-y>f1A)+rn!oL|cg(Oj(`t5diP`)c$sa#bU++foPr7NC>{7X( zXBwDo2s7e1!CJiFgbiZm)x=*s9OH_zq_)BvARH9y=}oP!8t_K@ z&`#K296CG1PGNkuGgDpDK~^_Ne-oH8Kq(=f@87!kR?9_kzw`1YbnU|Y3e?ERu>JBd z<4|bD*Sd6G9y(Y`32h+6F~GB$7#qU$M!^zdpfVMwC5o;@8L|vNf*;u1&tPGLZP^4k za_;$$4lmw)R&4WA=Mo|!$l1`5R6f&-UPK~jQZGXo90#tt4Xa<2?Yuwv=* ztLXJ6gJJe}IHZAhjS9HYRY@zWF*iO2*Cw&o<|awT$!CugII@d;x`=DgeBNopRDIJh zroRzg$oU51nTjsHA^VP>8lp_;W*jpD*!G;lZ4(O+MR5{%n}zteen)h=1{I5Sb&{i{ z#ti0Demh&Q(LNen8l2O`1f!c)^gSo1pbEV;$cF46OJ#b3W6z?~HSQb?2&GpEbaBP&g@3 zmrVR)+Tk(q!{d>mbSFrI$*Xb|$)@nh_bav}E;obgNm3E@ktO=)pbZBfa~ya3c!JF= zNE-*NNr>zD)i)w9V0VxjLOtuD;xmN{!{uK8cNsc%Hb@7fA8K7sZ4FQ5QyAaa^!EA` zvcnm#mK6YQG)s#hzLwIv=(2ERgG;Jl5wGNav<>!8Tkvm9*L;FY`G;8VA-|dwM(u2< zlWtyMf9z?wEXYjeM)nIZQ| z3uYZ5#x&6*26(J70b z`B5l<;E--84HrGLaHt;0e)#fwNb)N0`OSMD$7!;p)t$4~;j3vKf+A(+S1BUEAJpad zOdroXMDo9JW#9f&p8Y13`9qFsNAM`?i^B{8@48^)Is+QDZH(fs$9x5p{y=(!Slz}xOBA%#{H+~E(|Yk51;m9WvA zj{6tOII+uBEVv!wU#2HRG5oRGtarao?%mE-4&8|}L&=st1v1v5v0@8)h6kU>5&k7Z zXpkN73TfTNF+t{IPtu5mC`1U>cJ17WbxTMthMMx>M8BgQ`dxYUc+z_`eF>kqO7ghX z@$y;un(6M?7Z*P8EaFA_O9R4NRj45g56S=4N(2xVJFxoH1sC2Yh;ku!YtC)EBrt)* z37(~_4#BhTxpU^ZhgVUMYB=Z=-s`+BXNAN)P)FhR5DIM6ekE9DQP=J%w}Bl$Futy@ z5U{Cy4#kSs8&scj_0B2Z(zK(MISe}-cdbOrRZ!Fs40X>yLv;`3?#b7TwCMhkdPSbvT@#} zZQ_F^tajYH@b;ap(8Q~L9^e1yn2+Ot?2A+DNyt`1sFQDRj=N<(9|0(DT2`0Bb3lsN zrJ-Ds*T*Wg1+0nAK_PrCbZvzVo#S*F`h!7t`bH!6t!(maBl_(J1Lx?qVc~W?mfT;p z-a02Hz1o;Nh1g;Vvy*RMbTa1FScA@PIbQpqE7I1>%_xq3|KPj&rs*SrR~vY1s#c2r zE!8l3`ukW59O+O2sF`zZL5SYYvXpRg9-5a`Znf+~e2Ukr=cKJ}?q2n?zaZ1zfhaUV zH=6i<4eSQ%^uk)5&ZdX$s^c2Rz+hQ}f%Z!W98lnnk#(aon!GbOA%M-V!~=0OT&c{;e+j{fMqdaTT~~=ik;9(XC_L@7%&7DnL_LxgDkp zBy9?LA80d=de%py^hAhNRKk7kTP9IwDrRz$r&eLvL9=G}!1pwwOcT_xHJ8$T`sZgX zm;9Rku2p|dX2nhDaILb<>aU%Yo-&|daP!)lfb6-=xmp-|RlPXhM}|H0E$Tzh>0p(w z<~;^Pt?cBxM@Pt06X!c|yM)he&hTbx=&yc8=XDOS0ogg*3uNQAiVn8n^$l+ob4i_j z%zz7`&0oMJy<+!4ostSyrGV1~&7Fv^KqtEblU}tQGNL{`8+st95LW zT&aB#?B54*eP1+8{)x|7C(t;rlRq^*+Y0W>txk-;rpKBu-x8F(17X4p#YBJP$X6@jm{TU_}vc~l(B8p)GEvd3pK#mbi;=JL<0B0 z&+(ZZNGN!TINAc6`yuHNn^;CWWQOSe7|Hzk*&^JT>Z`6ms_y_cn>-nJ_ozp-_H|et z0&>6S!^ZOD^&XW6mZUb#+m)@Q&~N?*XQAKpm)89Ed8;0HlQLvhzJhU$r5qhYp(j~n zMGt=@wuvsCx2>RKRmlt$N5wG9#-DM|*VqjAISbbJ9XHg^CMrKEZ(W4*OzO&NbyIXN zF8ckoqH}A;Bb{9`u910DX~K`9!}(7b+5|-hRIeYZ{*aNF=8P&lU`+fdYQC$mtMS~O zZg-u0^ocW}6!c>iGc+Rc?U*B&JDKsePJE?d>FkjS|IvJQ%of$b6wv<-cn20x02z`j zGbsx5Qg64}g&kPQ-s@N?KF`K)Q_m7Xk8-K|JHj7c_t!|*6k`ybn+d@iTKCu}@d9c> z)b_tOKG7@|8GOuIs=rV&nz|A_x}KEx4H%tYy>50jHX!@6-u{Z?W97Y^g*t<>QN)W) za+F`yuOX^>@hpPUcznJi(OoKP)L|X9;3d2t^8| z`WvIVhKUVVbJlubL(jD1@b>ADHe0MwL@Ov$xtX#1*9ah;;$K{xJkGuh~Bt ze7zsU?R5Hd!i`_Ch5LXd`W8D1fL*jb^N8SVOxDy&#oL`I5^nW4u{x1zaAu8_l7)VK zvmp9(^1}FL5h~fZ(*G>kst8~Uh;9t|XoHffyYty;7fKxz>&!xW4{AzSYrwFI!Qc1z zghDH#^fRBwsa!?ttVH=($0%Y+AlZDRd|qcPr-)ggeUdN=-pd#TH$T- z&2P&U>D!%qWScD*ut}`VMlWl|;3Y0_+<={&DrPcZ8RtzA&wg8KOs~PLb<|ARfXzB2 z#5Oz)Pxf9Cj|kLe}47V91=O`==dc3g;l&3`RjR1--*R{m;V6ky1iQ3aZk9Q1lw?p=Y-^juA zh4hmY-=h>?xPPFLjAj1fy(W-Gt5S>K=fh{F=OSaB?4be|K zoNJdOmkNoEuLp~v<$@Hr6|ymRec_n50)PGLpDuL=)xFfRUUYhewPfOtQCN963Av+J zdi~8M-MJiE56_`=Yq@OwgqC@#CdysdZ(^QDV1H;Z`}AJcp1ZORX;M~)>{cZKcWFHr zsgzP}eL6#H=Ntg?L^)e!}W zS&r3)s=+|jSP74w>0A0t$s}#MA??sk*C_WS0%u{h9obto07QenCtZ3LIZmp@;b5I{{omlYj*OKW|eknM+J zu6|wX14p|5t}19=w@(q&oArf?Q1X{(7e$X8)<(OPojmyR>9gpKTA`P+M; zbsO>BgVeW&zPlc+gWilU0x zT{jdThZ@GYG89zVZaM|JXokL@zg(`-L+l4yHdT=oS1y?3C>o_!uZlNLJjQP57>p?S zdU`>zXeETgnuu&HBp^$lSmQOoW*p0H;Cd|*{I76P(|M!f=cxx#j)lGWhN)%|$kK&_ z5-04j{WjF|0@HW)EHb{8TwP5A_>juFDkE@xD9)U{tym;2(^jZ0%4xQ!sHR%cK78RJrDrnI_^CEFs1tLWut3$OG00(5W@?f37D>PNuOdm3c5)EW892l>n-vCF* zgFid|;Q*)YqinXZ1mBHDlWhtj0OLywgLOhW@r}uD`iMdpXfw%?Bd}mV1 z*G)HlC=&bo!6PFlm`oafS{1i+&=m0_k&(QQje*uVTL9ZpdxARiF`Z~hWBy#0%}6pY zGD&)BPkIegC~Mu9wV@HsvTSfv9e_GqR+I8`3l*DE-nH=vgMvnC845aja&cf4UKPo2 z;v80e6@%)NqWsUv3u%Q#wuGwM3U38x0~C2$N06y!4j2f(e4M6~D`dUM+Dka|5vVN+ zP8$^uPQxv}FKCP5OK^g$RS2+FE1-7D#$aAqhWjY*l{A}JVw?7nssJ12ej)@c0-E2c zH9S4rzF5(Q`qm^53&OI{I&$1jWLUZIZ$#VB*ql+joV15ToQJ7Tpnf4x)RJYD4C?nP z>~63aK@^RM76+`@HAFn6A&`Y&FX0(x%{a-uzED3~ce6PNZ9B#fY>NhJ;f6SauLAwd z>-zjA(6{V|K`pGV4L{}r4#h<6(#e5mc3vZ6{HosdnUOkOp`{`LF&USu_1A4H&ysqP z8)NIYY&S9%IcJjwvJ_I?2r2lq(9FJ|LM`6@ zIIz7>d5RL)D-4%~>vwp7{fJ_BCY>SM#1UV3;Po1BYm)=4w_sqcg%T{p20Kc8&o`g$ z6Ok5N3iHEcsZ>dM_Y3Kpz6VMt@&G0(xM-Kyr@!&Ds}(Y87wIb9q&CVV5eiM&N5iQ= zjMz*P^Q8pzzl^Q#y)uFHnLc-VL}ob!1JS)+_mz8p_+E1^-`x?HwdG;*fBnHgs8O|r z;5GOBfR|l)y=);--?^ zo(-jMcd&y(sRM<4OZ8sEZ@QNf(|lz}_B->ndZn=QEP^-Al&9`wMI>l+;UR?|av5O( zf5ZUx_4XUwy4*O2{6{_?9zJ3qjF_fcWGjfjT~W8dL3AQteXR9ObY`ovv)p~Rm(UyZ zAqiPQ+?<^YR3!ucSz0awhf$Qfg{jj~xNJPjo#k#Crt}njt`+<2+Jmo%xK;tqYzJ6^ zEnniyu4a!TsN`I!xxjw@l+M%}J%c4ZPdDf~2Xrc5KLEfiFL7;xTM2Wa45wDSSiR7g zCz>6k78fsjoobDLUU*w^v@xY0H^8_VZ>3bFgTF4>_faS2J{DiMhg7XRjw~DWA4qY` z?z-7%V0sY0akpcoB9|`yb%>pyQVJ>u?l5^Lz~baX@_hC(o@OMT<~Bv(th`tEsh^o(*e zl8Y}S%?00Zt^ymF!CmMSSrBpM!2`drWzBx&Iz;kW&KV&Y?jrl4rZhQy zdj8V}!xfz`1e z4db+>khX1YvU9No?(F1{kjl^2I=J{T2B*PA(ayRR0@Na)_XxncEHv=950AW~d4HzM^h~4dggo%&ADdYy5pP&$ifYQK{ z*lKg%wsq`PizN}-y79Xiz)vo~|F#$yGHCuGCp8HbkX^Efj=?J;ldcHpg6 zaC)%eW2Ho_-J?7|yV8#p^VZ!AOAKT29a{tKHLmD#T`|T6j z(FwP@F4)NN{gd%Tjp7Qp@&`W5;pb*5!3HjoYc@rCgDyWzZFGd7YE7Jzm<+>m3y7cN zTDBZ(SVI&i$hLsQt+AN0L?=J{lYTOIcld488$v?*64Sey-Q7|s^E+1B69RU$l+NBr z;#j=r-CXPp$&j3A$@`=`=_>aMUJxSVo?`#YJ#19sB~sROH#}At==8UqZmXl#=xrji zn5L*LIcS`rDy~kfTz3}6V+JpbfN;Y3K%MpP2)=$8FV25d&nLJn7^LWb41gx?!e$eB z<@)Wx{&3Vf{QP^vO?5y~&$vH|Q4?bqKJr@z1YK@pb0{niGZ+qTFysJ@j0^#~kzgze zwt7Uf_Hb+B4!M7C;gMyXrxR#kdThD!Uu@i1pMfDY0R*G-rSngkDMHJt-lbg<==v=K z#|Smw7@}@IJ9I##mUzcQP#xG19VyJ>i?LMtAP{1EKLH&1@0OH-?jW^v4T@`Ku4xBZ z0Qi06w0yJ*eKyemz^1qCy|o%MQ@$$2$EDW5S>kSBs1o z^pL29{7a1>a}OMwoi8Y?JUE*bA&OX#A-h<(Q-x6~Ln*n>crBNkJHs}J7kjTgs@iM6 z$%*M82$i#1FX#w8HJ+AdAVy{V#z!*QLqzj(oiTm4)~vD3&`Z$##nYnCW`{yG80;6f z=(_Ib7pWseV)RWpY5j%2yVr=@AiH-nTo)ky||kI=;u<)MbHLd(DtHlY^m0 z@RlIZo-Nz&Ui5vr-{@R74Da8*5VTq6fJbzgY|HU8SX-xclZ2m<&MdTSJ^6UHxEsV* zbDOlu52lte;h(dAy!!2!ffg)DWk?3;3>{~kxf5uOv*GVe+jyF*`v@)L0uVJUM%$#) z_}$u;&ap0J{PRnw>^?LlHv1RMZZ026waQ*aU$D(W;a^49(=m`l9ihVw9-nlj0@~*I zH`cB-dbzJaF29g%dXu7v8vGdlH6-6*LElR6mFAI`JCXv}Ol3s?Mh31Yq{1N^zVYkg zdG&jWL8KUA^?mKE@AvoV0u}>C4Z@F-cOx@k#NYQqsu6)5Mq@43LEQ$I*Be@EEFt1( zt6)Lh^i7RIHK`>!>Nt(c8xrMdDwiUEd>Wz%-O;ae&$^z&xc4i!$79yKNSK?dXKY?+ z{B@&}l)rH8&E<{75gJV2DCar2FT&be1l!XxTpIcf#oNBQ^Szk8Ipv<_b7YI zgt#IsfnRzks(3Y0OI_qD_3PcS!sd*MYbM6{?Bs1|{lE%`OLI{-56uvPYLg=P5%z9U zl}T*Ged3#60wnrQqS(fDG_@O)b1U%v;QAW0beWdQ~UE1L5R`h+uz@U}tK>kgJ~bB{O9*cWE1|(J$A~DBxyi ze=9HfP8JKAAj1zO+sq3x31?tb=no?U0>VGrszpTeDZ1)%{^VJA)OSgakfy_i77UbP zC307~m~n$0Sxjf2MBQ3pGJt)mvpgW6pj-3&Uxzxr2pBMBkvT9%31&c^`Po`kfe# zoM~mb(wBdCQ*ENtY4KI<>^q}WtdBGpdZ%QkpAZ-Ve!`oLlgdM&lFt{XcHsxsviDQn zuV2KDpFLsg0<{p!FyNR{xnW-~Yp^M^?Of60J9M>fY(TH7 z<_3bfLj?Ms!vaa^z<|YLnt?3mRv!umE6xyuE>96vjo{y;WqS%b=8R8t*&Z4@FgxA) zl3wNL{*F(ub9|}(4jUKuHq5NWPl)n`!D()gR_nPpZb(tJ)X~019cosy#&>1>RBh?n4Cf~2$Tb2YV?=rIWyjLyBWD~0KT zb;3U(<{M4z$JZan>C3z$KW zpIo5JSO=52bva{S^#7&_aOdV2&`@=~`RB#?I4{MFSzp%4w70q@Lu^!S5=}-5= zu>MiiQ>hQl?#B!*SEHpDF>9TsSsjt_c=mHthrZ_jNQHx|mYo83213O!Y3BE7V@_Eemqz-2N8!3QFDJNULBCja&_ z*BG)*tE0k%#>QJG1ii*wlW5A?SX)xm>yk5ncS>x31qE^tsB(s(vls($KJ-0x?e?5ukk!7BIA6EkG{>&!$E=ki z2A6fE%897>T=Mw)-&8IG@`dLDE;hGa#=?c?7A7K=_*udHL}R3@=# zrGdYT#;!hBpR2*eZ+iet&?=`;Wnk5XM|&KW`A9i1Uw!A?YdpZJ`|`TqmE64x%)|TL zZrlA6hOD}7bhOG1+;gM!^Exqi%MF@?(jPc=i{r`-D+`HjuGl6-uj&D%>Zzg=`)0^x zK;L$tyoz9uTWn1nh5yw8b-&-LmtW?ASMVM8S0q@=R`)v1gw8#f6$S|ZWPnK9NF4tu zOjX_dh_~wyKqSZ<2^bORM~6@#?D?&fU_eT?u2851&7tDMDnSW6+Q&P5{U(y6RTW4l z#3Jb;%Efw8Z7V5W=YKNWWIIl-V_D0S6DEJU!!$lVNQXEJBalZd9ZelZ+ky0E)wn^$ zx;vzk%rK9L?c(9aUM7}d0YVonb5Y*_ zu8TuneLu5m!Y~wkEt(^z19J(#AeLZ_&!V0}ivE?Tj;%)*X@hhWroI8=9eQp^MCpvY zW5d_V_D!R<&PchN5KZV8%Y7_Ed26+oDO310 z8$o8G{j}K#Vi(V%vJUwNbmh+DFfRn?C}6V?9?Mv4o#m#11*!zM{9<=S1o?2~8#g2^ z?&t`P>jNE1=kE8x2f}gPo5-J_YtR{*xSq28cjvxaoz>Y!LHH#Q#ypex6N%ldN{4~K zW@lB|GQ1`8hE<0X9dLZ^&B@1M##-ZKkca+u+YFg1ytnP|7Hj*_Q;syW5aW~t9F++DKPlwUaig;D5t$P=< zJIh4_L4neG(?+8VI9br?cQ)YJ|?prp zdx3#Qdv^jtcjLhTGjm?wTV4kcYbIHipV00Q>L+r9dj8~d(AwUy(P^6sZhwVV`rp3! zHW$DD`c2$@N$@Kt8?+TR>#Y* z;VPXW3vSa$E537bn>@c`*)<&16v2k_!l_%tF#5BB*Pp)gp$y-X3#XL{icP!AU8)@} zK68QHh26KAZ{c#Z7DR!nGCQfLx&jyTcH1+V)NSG(#nNE)WK_|dF+A+AqrbAs8malk zQ%$|*Zf(Xgka{ZZCb(!Nw=nP6X#issfPF&}!Pn9!j6{VTY6Bk8-vw2r(glk~^?56>S{EFC&= zg915ZG1;59gq$dSn4k^c$S^kde;06hgpMo$TJ)6AP)2!ATl3J;F?rxkcmwFK_|Ag{ zl{FUVh&XjSr>Q4rfgo>+^#1xj3;FpRJp&i#Zv{%T64XFsI$KxVKdCXgB0x{EP z1N-*0F}!Lzu+^NZwk8!SID;L(hnZCz3LJNyB_AY1&u$V<=8|q#oJ(O(?MeLRk*1|? zu1`y$)`o4JdGUbyN1}-o?`{8}ka7U+kIQL`Z>7U@Ks$Zm2L8Si$57fJM+R#$bj0&D zM|eU7ujE-MP1K==)y`i%4b)u?yCt|U0?68@w=MrBI0Q!C_TVC0F#y`n13mAJ$Velg ztigYXt@^cEN}qGc8@7ZOa-N_3J*We_ zpMY+KXSvc0ueGya1H-F7s>m+{(pp=H)}f~>h&yi%QmgIePvSe#|Ca^8M+Kwg{NWuk z)!Q*thoo4=8~a#AGtiWQb}0ZrziW2d6^GYJ3R6(cc-p-Kuem_~fyey-RVx^t;AM4P zZ}#V;84I~DlEBfWLTJC4qdAqr?bEO7|L|C6is1O;I?)lWx`}-iwB|V1X?(Z#Tx>g3 zs|9WJMj^|d{_OBt?fF4$&UU%&$Xh`&tVQ;9aIlx86-&({f-4E1RjCx@qy-s#pkiBO zxX1H0xeMgUu9}4hx2wh%Iv;{MKy96M4g&i9gO(wROb~i~QJ*SCeecW6TKPWLKjQlU zByV0W@%zaow1P#X<>lgAjvo&h*S?ySk?)@?E(ig&IPQDzZf>x@1kvE+kOD>Xz5Fg) zP)ofc<5@C*VjS!R;hVKRmD z-tw&1m@EvI#39rbk;>Yk-|6+7NVH*?5%&fz9q7eD`eRYV#K{v|y9y?X`R3$Z&4L(Q zVOdLNK?F5#kD@gUo!@7C50SuJuap*2`*=hN2u@FTmY-7WurL&=riDp68b>^MRxn;; z4PMgO_Lq^F8Y;W!e&yFm0sS`GS)!?d&9`yf-uGbsWuG{d`z8GrABOx3rtw`dmULe_Kf;LWkV8_ue{iVfC}b}D#W13dF$gO zIFvNUn9E2B_Hg@_7L5{kouR(A z*C#ltJ<|pU5g*Y+4WSozN>HN#d2#r9zuH+R8Jx8-baAUlYj(GFFfAFl6nfO<7Uj1! z{S{PvFn>8UU3rPGe6K)0`S0O)e4SidEcX$wTSEb z!v@q}!c&(vv|Sv^@Cg?>u}UrMI=@3*y4~5N>l=~QTJhz*^f!(`H1L`W`KyU52n638jDU^nh=VT((~o@Puv+_)0LMvx?~ndMZ_Li z9p0rS6k*{qmAgpoUJLTD+iecWI22O-V$Rxd8?U}$^9^fb47uVm>dC6)&KQkDaJD-& zJUErIIozDTd2=yaClcv5%Yk#>={3X# z83gD-3|%#AYO6*|YrWxil|WAO;*N|F1Q|#5{_t8nk(-@k`^AG5{m{AcXfOuOvGk`#|NbD!9_w&~hm%R77S`6at0`Sx~dH_o26@-w&tS=7;By(FnJ`o9LX z?k*ZtOY*^{v#McCeKNu}e+Nf@Z3d(66vD?C340boM3+0j;T&?^B1S%ZN?SRe>DM1jfUR#+!tKM z>Lv~i>b&rYmW!@7=+WdGX*ox3_SPU%40+(g4Rwc~YTPyr%_d;ek3CoPk(4cPI#6Hd zzLj22G6p{L;9DbMKnAVQ@&TfWKFmO7v^avHjh71{lB=|&|<0(5^)-ez$P zDd5)P2^^8O`qO~FxIB$$&PPoZK_!e(>Se=^bA$tfgp=IU3Z*reO1icAyN zK>#0NN~28|Suy|LTO%Nx$JSQ{dzw-`N{| zBGJrxi9f^YKprW;J%i*x6nSmI&Jxm;foFZnu=8>|v8cIKDd~KEV{L2ad#Qh!kMG|W z(1Q;thFJ{20-MTEV8CVb+KS*M1q$?2PKaa3e=DjvY!@gToyuc`ozN+&{xt-yV+JZg zl`lMUI-YYyllwv=-cTtPbFe7FLZ@e$>guV0s^73+Pn&D;#9#(4+PMWfPRnDR3MS7V z)sGrEO<~_{J671OL=@9E=xOPtD4IffE7X_4ktOEB-F$=Yje3rOXf?lvRL{(yxy|I8 zSMKm4Yl^&k6g#L9+EM(+WN8aHw%BHUeEOnTr?(=tX;aTeALvS$sxgU`@0 zY@#Cg*ul+})FrhsoF6(Itn79uu94IcLGCwHo$Vh2)ZSF6>PIYv7zfG#9G>+A_tS_Q zokA&SXY9Y7HaI14w;_9M)U|#<>?o#5Ffh~jfvO!`7yReWu@GgmKVp6tz5VuW> znbmNko-9- zE?x+av3hXe)<*B!4X5x)MGC`yJVL`Z_Vu6}znF8ax6D<}S+AYz-79IULYI5c`$5su zT<*ws4=N(knUt2m&VuKM#*L(tM$6g*UrVs~{+;28I@K`i8&)ZTb#y9sUn-qkOKsSl z?KZ(OvN$o4q^N(~-L9?sNMcT!m% zE$l{<4w08-k!}cdF21d7~SZgi66vwDUIvjH)+c|wb$U^jg z?jG7`H~~+6mKLSsTE2pkC}jKAY|t%&a*Vio5poYt8^ZtFzO_5uva zUkKK4uYKhHWXU&W#oCijmr^SGzD$&{>y;p*&h#z8z0|oXsRhSi6D?vy(2=?sYG{!J zH@Jqd{{#W*Av`p2B#S|%xk@q5%ntr&Ym;3RqFaRsr2>ehllH+_b#y;L_Hu^X0~A6u zaDk}cTuNA>`mAU*Qsv6WSq}A*Dvywm{F3Jz1R(LzOv>5tf;xH3i=**HDTd3HTE0rM*XlZKEs4B$WV;loAXc zv3t@G$T+%qI66hU>T{<_=w~UqmwN9j%>-Hz3Y*TkfO!VXh_Ld(^anS1X`cyq%)80yVx_Xz zTg48X#|}RAQ%a6_Bg67{4w20^+(+e|^-z;n9je3TB6xCt>B4<5Y+10D@k$@}PL5iW`ECq#TjdnNuh$a`# zxEdY?*&;qK>v&}?M7)b-JE*3HbgFv2RHTX7*09<6uf}KW1$fUu^fh-|f7d}^7W4KV zPn`p4MD>b>zJj@a@a=jN0oj@1PpFX{UEkaAC;NKhEL?&vQ-3Q48*XwqTUiLP?Q$?A zWIv%sI7RqPYn52M+sbO3y~v-KI{Mi!AMc3IuPw5=5TGECSZl$m01pYl$w&e75Y-%` zohWy-WjM$RiKD@Gf@RW*d~*yQer_o0g@b#E_s=lLnzxCgH5Dm1Z$yj6R*Joh6EX;& z9ucIf<5_sGL|8wVoBSD6et)g9rI@p*GiTPLh!&#uH#VAV1AnLxA9ob9Ou9SFwQ^? z|1fqICWTN7%JnEPGxZZ^;tjkU@{R6s!X-|($5>!}=?z}{Ey6n^?tQzAjsoak2&6%X@Y~}4(vGW3-3z^1Mx6Xq<32%X$-LwtG!{3ffcCRU8xj@ zw^cqdqTm+0Mpr=T=Q6M8zq+k@FU_F3$7r2?5GN5^^&i{EtIKHZ+rJ!uN-#KEq2(An4y z?)P%CO*{6V=+-;oW%)>1&`H0lKIY;-J)@m|tFV{~MA{nt^^!d~Om&iEFn-WGq}YwE zD%@euia&VQ0^xzyb(?_Slv9AC8=zZ~c@kajbGCoy2pZ^M;CGBvQQpcJjyTDzbwBx3PF(p=o?u50;Q{VD zZ1}Ii$51s>o52bGKbp?^t?Bn|Fmk{nVw&bAvOm{wgI&Wt>u1tZGA)HX`lVzyW$i*}O-@w2cCB5{i)@#NHO{lDMU~1yiHCdMvtUjtm}{mIR_G zP?eR}Z>;QpFm4uFpS_b7H;L4?!VIw2lUvMGIGDT428{i>ZaU1BULlKknv2X6b!q+h z!t3g@+sb0jBBj{?zlJDV1{iOeusNCUe!Z7Qzi4~!B}oB5NcZI@wDPxsNMiVEC^i%k z9M`=E)y=n|;&A=>y=)#%MK~2cDf#}!k@0j1FW@+kmBt+^O|9gd>s#z%QDwN2_@BOp zj8yX`$>coP;n&REr$ z;Xif=7+2|L$vGa>6()5k7zg~HCLZCz6t(+6W-)&jsn&*@IMrX{8;i@ExcqZ|nbq!F za!^`ye%g9Ez$&L1spAb&479&87%eQ{*VR{xN!>XOuCLxso~!R>{%rvMaWC+1$+1tt zRF`B#EomnJY#~Y?uvTi#p`}V!eBF5e2`z}riX@=vkf$)mB&l(d$b%V*v=X^bBN+)5 zuNua5p1*Mw*4|Us-9fX{&Mx1@O6}n&7OzN~Qy{FSoOmKn&NIL-j++;Lv|Z4xFj}~! zG{{*=5oqG#s&9OD4A`O?)qS%$pqLo@9`A|MxSM?7gyn(RNZKNW4gsvuDlD1Y%X^pb zkSGqpUUabeGKDuqVHqJ_QST+p{#Dx`Ge38Wq1zqdvV_pXViEy(2{$JkP?xB9RAxzH zBf-B7IHq3xwdww==^aR!I|)Dg*x3DeFXkH6mSq>Ijk9#geJU&d?xur{RWPnVnio+- zMa@E&a<+7UA9Z;|I9sx@w*$VYkeD}|cmJ~Gc!2*>3(K@R((@gf;a=`_Hr6(Fy4iRZ z8v=_A(+d;c*CZ86$AYXIsJuF1MM(6^Qv3_D{YCTGP%Ya1-#>+nlot>3!TOQmrj%Kq z?Afnw?C-!3tG-ih6Pmk{!{6JkkDaV@TvP1}A}nhqzt(&c_MF8at21ZLL$@X(RR5U2RnqSYOxD(-G{| z%ia8qEuky)TZoJUlT<@htashvs1OsF0<-v~f)kGJNYWx|)3X+`tL1C{HB9;!CvRCz@Jq{qUz_%uhn zzbRp+(G6dXk!8nu(?=O!Y%R(CEqvuy+jj_Q)u>rmXhGoy$Pr*1UfzXKOMPsQI2C5y z5hcUA#*(zAYLXc`?P+++DAs~WsO!(H+s;G>@;-E5%Fj0FFRrU2k^sJChnytj6R)^ro2R>q@v-CK zgXF89soQqb{HOi@7^D(h*RV~@f|*o7q})1 z0DbnJ#M-<_^=UVjiclnOFW~jSLcoP*Q@7p!tzFqXhMMb(@QZ1qxcUn-|*O^ljY6Ugtv5ZU3jM!_w}GMURo zPJnD7{=M9}+V*R&Ol!-hJK^Y!W}_4Rh*;Qhm@wKauCnr=ST6Shf0sgPEh1YR$+Ac> zW%VPt1A&U=a0UfLC027A$`8p7o9sUfWzF2u1?Y5y@9B%-(Mc5chlD8s8*h_ zTYB+A2413E1+W%JTu-PXuV0AEelWtT6O7HZ58}L2`3M7Lwc0P+40z!3^dy6M!%Fv?yE_t+GJSu2wFytRTasnMbx)?kCF3K3`^Bb3e%S$@^JJ#?JU@K)s@jM-NCh8IfacBVtMYAkWUx5>N;lzt;VM^#?QhB3N>K&&V1% z54Ys^X=g@?C7;EA0aKp;zzRU>c? z9PR75=#WSR`*sj!fGz52)L)(z$w@@sog`wM5@4W@h>m7G|I0jvkV2~NR^6cXE_3V0 zpKkN69T#^Sa)Vx;apx5cmuUj}CsvGifv2EO%{JfljKGN3kt*qWxsBeYQkc?=2Z@ZH z#s$f!=dQur)Wz0wB4@O|d z@5~hj^XQ5v0~;#bx|eRTtZ)5J1aofA6?>hxKBxS}mu2@8)$q0>2j}_WN9$TOhFkBo zNRkMzZMWY|^T&QpvwP-8t6G;nq{uZ;e{)P6{x~`RaTc91jSI;}GGh(-NW<*OcoEbG zvE#^2L}E+5Gsvue6#)zRMtpiI4BJ5b&;m4f7)O}@^L~x_qvaraa{KP`_@c9Z|IzlV zBuAF>GUlp5SQS=2BkEqUUYaS}y6s&1fCB7c{zaND3*;j^OytaaU)(mjfJX^$5v9+f z>*feaxBn=^t6Js%I`G#j5ND|D6uqrdsC-&CzO=@a<5lAGkRH{$Km|!i$qlvps986H z(t$;URhf_!yr$O>-w&#MnHSu<87z<9gdCkI*|Pj1I*{E<^dPs?fcqjL+Dho}FJT|{ zHaYOmO?s#jaBE)tih>R@7b>s!HcS%Le(HqHu6LAQKs+<>5_^C^r_f}R9gnM^7 zj??{Zhl)YZ!Mo>7Xa~o#=7VlY_3|AgO6=~zPI-fD^hm>xL5Xhf`|VKf3q=LMiM81g zvzSi2t=zdw-rctiPwSiDI4XXG{^{}M_FI1r&$6x{Cj;c?SOs|t3DAK9xY;Hq>Z-oK zryu4sO!mLK{{zL*y_C{@4Y~(-6vt8Ixk6#d_5}iWNIik&U(X;h-=#y+h)2BKz8g=U z2hooejth2w$qHDbQs4?&mAAL{?m^wRa1LHaBvkR<)ghrWz-VoXZ^C9b8Dp23_d!dg zRmT5>2&ow#PD09ciJL!*qy4RIqp)&J>k`Z;zbNno%lgEy!v_LZ|9W2#CsUr*f;{X{ zQfaQLCM{&aJT^*_?`+sW9D){i)zs_zut-lTWJx0Iu85C!XF%1Q__947I51X zyxj?>xr`LdkwFTOoQO08ggn`B)0JM0aZc}c`0EzAYTFVJom}mqCH=wfc-nQDL0P$R zzH&^Zvn=M9LNq-8?*)L#H4H{d2Ok4Yb8PmuZ-4Jxu7@YsCmx&XNpqc!;ao$42wC*G zIpq46m5f3d4<6KL%cyCSVFit#E>*N;q0GPI;H)&t+MQL zq1pJd2;fK;ODdBQ@E=sNHpg-i*V>~Fgn-(v3Hqv zCXE4vcc2CFlgvpnNErgoT^-u1>mC@pQIE?yYhejlK$QF-3~xy%F>F8zypGQFTGu?3 zEgbzq%$`T^Ms_6wL$K+zlah;z-_R4N^pZ4M^FNw5_9%4%Z8am+@7smB8ENEyu39DN zQ7ms)TVW!_MagI7c$~moy;dc9|9ue#05xj5{XxM9qI_?{K18_4_MC45IsXpU?c{Gc z81_Nx^v4;pY)nA*Yng!ZJYM3rZ~SQH22png2i}$jB{_g6(ZiK?F416-@z*tEEp#Dt ze{@S%{0plLLnW?x@7M{x8N{AlIw+`9Mvl{WXy zCV%yHy2_XDZs9rwD{cwL8nKil>+-1mFUuqovchYla$4*#$SCR8lC!O*8X4v8HQTDM zfkiu3a?wFS-0ssdHVZM<@QhgcWD^<-kEam}Q^>L0Uf_SO^UI{q5Ftmv}=2XkbAVXEQn(&PH_^5ZvW#Ve>wQHV>3 zL2%Lz%D{oy5rozZl`NjYvwpe7jJreN-esH7XWxScho z(`|*}?$bg9jM`_Q)-;NDj^Vd3Q62&xR-i?{-)~8#(`?Rm-1shPaPM(zN&j|e1D)x&sptkCsbe5J{B573 znav_5UgonO%ty$%y0N4rPGDo&*&Yxcv-QgJzxeP4bnBRa`&6H^?cKZtP3aoJ%S9ZA z#PabaL}-bK^X!K+Gh34v+5p}&{<*vVCp-0ll{EkM*Tn#Zl9iD-PNyNZ&^xj{cF2&6Z(A9OyEeQ-)pm*_+~j9& zyz848avT9~zX%wYiP9EXTNa7B*UV zy2;$vpCb?xmlL3)VKKTK9IhE@-u8NQIEkZ0QuYES(6h)~A8B~L!V$v;m8*B3p&_!& z6G9yycB9~BV@rJ_MO`C>6=c(>&>KRS7g^H>YRi5fN@uJGEBBeJ9B9WL$D7sx>V+|_ ztB%DWJG(T{a^F%uVFs?CKF`IwtPzxA&>!+`e&_21fA+$XqcCtz2jrYv!8L`01QWDd zA;HFWQU<+BGY>!XO3~MxIFW#KI)ehs5dOz`{(O#~Y~Ba8dlHU<%ri!#bcJipET&dc zPL+VXOQ%AH(Zzbaazp(l<2x}i+s4x^zPSX-Q36oi`2*2`+klfe-#c-ci>Kd~4!Rr% ze}Y|l@LtMdxdwm3bgrf>+}?&!nj+)+)vpKa5qs9_uEA20vDC0D zJJStlhw#kvL=KX`{!s%7h~i__A2TIR7|S>ZcVI|=|3-V`NU}UK*kqQmqjW8%q5SMS zz`A)WC8X;sTED2jdC>)V$xAAw#$8>Mr+0RGBylbEqi|RiFRWps^1B;H@LPISVhQ_8 z0}Rh~`^D_reoTpcriJlNdQDwpK1*wURFOsZ8GMR@RfuoXgKy?-i(~;^xSh(>2hmbJ zF5c9eU4mpR-q7E@aph)1`QmQkp+6OFaF}B+KX$A&k$DMZx^K$rept>UMR=;>bF` zjUToxFElqsaPK!=Z?VYeBT9`4-Rfg>A$BiCLTt zx!ipIU9z*_S17mBt_k9>N>*#}WcybZ%Y;s7Jt0*K(q;W?qFxSkQp&@!&JNb@Kn5s( z0N~IrCZwrmEi8W$;XvE}f}4sOe9o3Bp03cB;k{9grWQ9I{!HR?11TEmUApt1sfOc) z8{IrE)y00wyy(UDn5l-RJ~%~W+N-8z>uJdh*WIPtr;|*wb^O{h$yauucfVS&S=I^= zY0Na&>v`?cg?iVfbBP$a!u=U#lZ+WRl{9Y z6CtLj1G7F8!P@|GfF}8K{6v7ACYR@Dzax#HwPgp3E`B*Zp2|sT{aOyaO5Q9j&RUMA zjQgO-)pvCUP46itYFD+`ER5gRYW3dED=#@E4^ zpotDh!fW36=B@!l-9QGRwUq(Pl=GCE{*BlBY)qz=e8uh(+cn6>(ps*Tlnn5L)%Dsf z_T%px9?Qbx^a>0qQbO1_c8yiPuOBIBP%Gwte2>QVDp}Jb4^t|^mf$NdnOBX z?ArN#jV&{^!r^nD9k|UR#aqLgMg>k*QG*iMcZ~kt<;s^cP^s(kew!eD|6U$MFqT?z z&N-t}(eLS*#+GIMbGa(vkb%2M4^OgnlEssg@4~QO*etnvNMt!9Dr6sNz2;yn*O;)~ zzAc589(Y_J92Rfo5iJrT-Wb>kLcB#^UAtFUGq9T(X=;UDV(lf8jvKxp06HW zZ!yPRdzeGbNAGRv%K%LUi|bZL5$RX(zh_ag5}rq(TuB`cGfjN_feDwAF%Y;3)bJW zo2-u-<2JRHm8tm+I7#7+6u+b5dbcg8^Gs!{G_t$)t=Kx$YXQdIPJds&SB-*Rl6vTJ z3BN)uJ%9OU6Ub)YLco1Ask5y${`H&_0|Id*l&HaK=tBp_Y~nLCfx+>M*Lt@0axEyCHHAJYCGrQm_Wup};?)cDf8)2K?TC zu5bN3=?`pNUwnMs2=Ve(kr8Gg`NiHKo`Nz@s(MRzMxYhW^p~$kz&S3mZTyjbF;h+< zQX7t(bq6d?W1#F@_#MzV13g}lUp-g}xXlI)^9?KLtPs&sefu6Sh_*;1u8$2I3|K@B z`a?eKc?lv*1kfxfgMA3KsA;XU82`UFjDgFvUhfo3bFfP)-@f{ z&(bq~Lszi`>8%ZJg*%hFcdq6xvQVm@tdoYm0;w>LF#=GvjRMzkcU`tovfNNP_jF$m zz*&=3xh+)gWV&*Z2K7tip4$d3`~UomjUxqN=~mbTGQpC%y+{1HnZw=9U~*eu?7sba z4Muq-^O6I+bB$IxLk{*X4fB_D-|MKRdXhSb85I}qpHWeLJ72eUX2&tGQmfi-_-MO5 z&L4yga`t&*!Gu%a|L>WSd(!igWS(psEv!QX;z415$Ps+;0+1KcImXhMFh-8&vU5VO zUBAXxio34i?$7Tr)|$hkdp;siQ7$Z+CylD;*kJQ_b>0I#I&{rsjrW3i@Kx2s{L zTzl`wABJs|RD{STe3ucqpR4#C>p$j*A*uw4>6|}CZ}{Z)_Qb9=uuya5awr+oVe7Sz zY!)kDPH(&!!B=5Fv7dft?ZtP$T^9CXOWdOYcy~~55+;+JG^puTQcJdEzK)&NDLQIN z6NJ%oF{5@-x_zU&B;T)3ER^8iACknP?0wYEiX>v}cb}P7_NN6p36e;hB>LBsNO=*s ztLyxt6Oah`D?RT?+y&G!$oQ`-9;5`zCE}-$l)Mi4hxy7->sg*KKfPD3%S#r1F$f^4 zqn9L&c?O9o3hAlEdxbV){QUTg&GYMTN?g=nAcR8`)+|(o8o}J@v-?1`)xjl@jmhOp zxaQRPR)WwMw9+0Y-^!vzzx?as;I-OGrdS^h!cQ&@Lpab$ewwaA!(HoJSg!fA{v?3= z5DVhY$pS@0`=_OUK(~#8m`pu7M^qQ(FTWT_UToW z&iYmrIO2=gOqGukKl1KmGiKIXqTn^N*o*?U<2i*-2qa#V8d7|z(_*QBt4u8;CwQ%xv0;fm6{41_`M19#eVtsn!`@) z5QjsaMii0@zr=6=IRlgow!rGM-ouri*bw|4@w1OmB}~YRXE@^?Z@{!UfzMEiVfHxI zuc7_e=CTvgBxOiWz^*uCnHjgc0AQX!SOMU*Pw#0Q*tuBW6ah;qGzn1U+c~UlVaBy% z02PVM0`I#`Oi-wB(x~I;!%#_g8!%;ZRZQKu`N}g}PLgGrw3OGlM)ywqjy3~<&Hy2| zrqe>EVQqDFR7xgkvDLCqwddD2&<(69N{0o8G@3aeQTTratDw!$aX~DV_cq5Zhg?*C z#Y?EW+SCDBc*3ciWKl&i&5;T}#u#$!vc^WTV7L<9f&9xPeLT7$C@eWiUpAL)v}N>J zM8hxaE|oia)tR*z(0>&yVDchr<{8wR`4Z){(pK>T0CbumX?{sbpbDTu?zu!BhqHC) z&3|21tCV(Soz`vYjOP{p39oG|>>Aqa-z4);K;=C`%FdLQZVGW1GnrmhZC~&CnwY^* z`De9pd(|7EmsZ6l8>ammP&gHATNg3!fXS-ROH$&VgIbX+Skm*{xw`#G0=rXii?NQ_ zy+P{re{iQN^B@uoCV{kJuD{SX2ND~ipCdCEjD=a!91{F5Sbo#l)0iwRV>SO*&$#os zd>@oBQHS%~^5Zce>_MEO%`+nxN%!sLT zjjVL&#t3E-QyN7tCuaJWe&z);HrNIfi>}gk9>&__4J*g9@bTsT$Vp@_mNNf!*8xns zgJMG*qoGZpp#agC9Aju+f9Mh_QM;UjN|O$*0Cq?}YT(|yW zU3D8!utuntn3yXpUn{1)Q>1pFQWH#&$>raSVWU!jleg6y)rF%pq!h;&s*Q5{-B475@JI5qP>|(P)p?)z|#+4DQt1Z z+aI3h3qbDO_6z%CFV|i5TQO_KyEipW9VM#-Usm-mp2>8lZwd7MuOj!!s4{cpqCEP&Xk9A(-;AzK;UAP9dvziF464E|5bRkI znVqJ+me)0Y8ul4Q7dio$$YD;b0!*7rMe`vV#CT|uk^A>XS>e-{)0aZVDRO4St+U3uILEjbuF8SR-HnqG$ZUXVJ76^R{GEN#`l$)bjrJ zZ}OIX*uZlDajjTP5?vn;`d3ClTC|xa_R(%-QW}+v2=^FY$vOHBrrp$y>Nw7$*E@&N zbVXjzwO6k6$cjHsZ~Ch5B0;Z)EX`Hbajb#u(k?DHP(~C2Z{4 z(D@lN58FO>j>Fq#q7)Oi(VHwZkgd$~kB!L-n#M~qOB|wEYH&Ah?)NGmTW{LP&~=zK zL^v*%zzw8;7&~J}*Bo>*JsjAG;8No;BjNA_o%DdWWf>4DO|h^fIsQGl;#Y;mm);HMMP&#)OIp`D}PkIU^8=-i-b!uN< zlU)xBUj`!|Sfrp&k0ae+MpY7%I{I+?cd(_ds_zsN%vFA49|10K&`t7_ATnGMjd z2%c64f4=IhT3Y^gkO2lYPm0qdcl*9zdiBMb2OETjfS=$(?;I9J$X2@1(@D>sp7!tB zN24fQl4eScmIe%ZAT~rQn;DWAedRgxsGH8h0cAhz^F9v zG?@#*&Q_JPO%O}*YT>z*PSZXf+6|(BQgW54F}hD&$R1#p?9s#LZyqDvOr*bM<-RPm zK~!}DKv!4@1*I5&%9#$ylnmTKR)0u`8KtlasTic&0t2F;$yhAccT z?(B(!xUy~|W%Qlo?!8vAWP3kQ&b%MDX!56^b0v~tf5@b?y}DRC!9zzo@5 zrcu~mXIw}19IWm3fcgvDPYqb_NrWojlb|oU3(%8}7`(q2#U9xx*ab7_`d-pvdcltqHAKf6|N~cvgjmr5zm+N19E?*L94z zox&W9=!o`iknL%+8Sg$!zRWqoh~2_>;9S?n?pkME#)Ma}hmEIhtYMnX{@m#5P&R3T zZSNMMTyxT~qTkVbv{1hWaIR^E;{+zM>+0k zfeQ2t^w#--7e2kf38`s7g=7Te{3}uur%lSb|tywQxo1a&rcwckLQj0%$Lv*uSi|o@xy@&RUg62ICP2y_foif4K=qY8I{SfK6L zs+*;px9dM)+QPBTL6kjh4alI4e}5$Ak+!lXM2xRvrAA6P3L>?V9d7gCzOLh(jM55H z?>Q0jY!Rm1c|JD4K{{t+k4zDt0@iB3YPdtn4vpABv;7M44?vSGee-?ON{iz~2(CK! ziQ!_-ejxd1S%qzX9u$4ebBgA+!LZJSgX779=up3K>j9xShLZ*jm~fU8Vrodl{4kL^ zAL!NzPoI?xFI%Lh_Zj zg5}TUe>!^8&;La0yaNO9@j#AJ!5$A#fIaWKO>F6}g$^UO34a+_igl0^tbO<;8wJDR z=Bn0WGoyp(eZXlou9#3;!}l7o+8096v@fY|M8H4H`H|~$6vZ%MKTo`7A#>A!RV}o_ zMIf#AQG@pV$nyttjOI9k!6EnFe>?1ynUe_IuX#GcWjN(Qdr_pq7MiNL_vTP{PLfG9 zoDd7H9VUmWu2Q(~)%KUJ*=v!&1jQj0QVHaJ3=2{L8x|`ioEZ1%E>Nlh+^^2E7SLkx!R56Qnq!OF3PS-h|?*; z5>E431mm#@-~W37tdjt_e_!)Ad})3kW*7bCIevEa^FUMrn~E}qiL)3~`Z9q&yM9lQ=b z`sqjaPBpmK0iDsa`d%=0+91SWk-tO5Gdlk|i!|RZU_n+X%m?U+IIPfR{tGXH<(={CyAB z`>w&vZ`jx7@d*<(%POF5CxnMPc4#U1p$}aB<8*{|poJ*ySg*7;tmZIAb!1F~5kKqS zE|8~o(UtfOjY?AIDy|jn$OOhF5Z#+N;0P7*BYWQvH8*Da_$Tmum7{?8I7xuhRgD%r z?B(xG!`nY4@H5fHwx9eyN@@-}o@H70kGf3uKEj$(z-pjkGwR+!eoU2YBx#W-fkuRF zjG`X%?t&5WGd4-)=;w>^um6-BK_d2B6kbi)DC1AdsF5kE!BEkd`fnH~?``9-7To2a z--!EGo#g&RfChEwC`~BXa3!=^D$kntioCc-ThuZOgoVtqA82{?Jd=N3 z2JemWR|lJmo*y|Aoo0^hb#I}nT?-v`*)ke=JppRPDmAU(ch!Ge10th><3|%itID9i z^QH48%L^UFAy|`nC#_N)q?*$`dQ`(hak}mue!$@d6>xXVfF>4eEgpzC8x?n;3p&3i zwOrqdr;q!o0{v#&*0IU!s{DPgaqxpwstIc59np551oYd40wnew;FIlZ=r_d2ub3FT zMJ~t)oQ4F|*W*UFm3Wwsvia+DvyKwIgIo7o)9YJbNd#O%FMxyFFAteF1MkhU^O;N3 zqiO9Kq|Vc%nsw_4-e5s@zgJ%dBZzW>5TB0;gQ@_Zqz(yfpJ8b)K53O`V>IFPp$$ym zohMH)`8PNydQmLvP|>&&%1OFtou72h z6RK~_T>fIDs2IqyaJkE-&R04NWL^$=gi@ISy$8ZA<}NTRenr0`@y5x-wFz^_WL;bP zP*Qw>vcEbWmT>`Ox@T5!Lpy%BfkZ;oXXy{gQD_<`!t+aF11<=Ou26D$!|wGMsWv!# z>pltfULq$NJ>`0I9tvZ(!k4S5N*mq1EQW8qUuBSkl?li<9=~VuE|4BHyh+iOy^y?o z;p%+#^S_GkH(4F&&Zy?)REr(t@v>~K3LOk-7d&K&S3JD?Sk*N~V29KA|p=qM72O- zXbA^!f5d)UtD?wV>3a-7heR(k{f@H0awah+MBHDA2w!d0=t*v{gNN{|f7ja6z=h)z zUj5kWaP~9%_3RgmVW|q>$%D3ip!Kn65Um7@dHsw-?pAcNxdJdD{h5R(%@{16vezns z%!+}&cqbcZu)JL1ah& z=CUPhM&rNWl20mWe5br!AI-~!8+wWteBJcLk0}H3ea)%z!iDBVS0-jW*I70x$37VS z)N#udS2&vCMnT~;_i-{%*4`d6JZzAROp?yk+jR1BapD>z2~WO>cF&+}Ot;8}jT|(I z+wgkb4!2n-Od8wa$2;IM49&%A_-q7q_XJAX3I~l~Y&YonBlxPk6n;uT1$wJ-B9}?W zd};BL24k!~`<-Tu2F{-3yi8r#mo@IUP9C&p$;Lp8){frdpYp+fE@d(<%%6^=d}trt z7qKHeFE;1t(Gp|E)q9cLmS;wCMW!I%CI4}D1)y}1mlAZ5h0t5GT$ znAnhQMc{}OnH&g73ay{$38{{?U>16?6Pm$j2FFv>XweU_1(3Y`1ntZbtXOxmx;?j< z=(K-vB53W5k+bqaO*tFjh~o_&CW-qcg&F{^$B8auKr5W9fS3=i71t>_hhV-``Je2SOy#0qqMI-vk};pwX6QDAw6X2{hm%vj1z6r)B0^`; z0hbxLKXAji1zrF?osydqaLP@h^l(?V+z{n*7AXHPiSWoMyr5FBCm|b}&kV=^l!=|3 z82fwV`x0i85W2ASe+V{TMCl=ev;9F463{c~2bT2{$(FGt7ihP%)H z`cU7aqkm`c4*uYX1v-uCy1|=Olnci(gGUmaeo8hiT&gW|UwNf*?|MdFx6Eb*3ndn2Zv{jBqx){7X z;|mYE0BhRn<8GtfHD01~+4jQF6XKm=gH;nP=l-qtKDGwK>ebZuK2cba2oj1l}x{$fK>HD;ff$yhk4o+b$24m(biW8*I z5~f;Uh6225U#_Zak-#O=!D3VOj^hXXv#C)iG{gn(^FU@&#~e5B^X!o!!++*9Bxe zn%r)s_+re#<HR9?tiUPn$`HVtr7w} zfZ;n@zZHCURMh@tf!lLve_YJZcN22ni1@ohl*;l~UAw|=;HaQ{c(a?qlZ$Cly({rdjlZeg%y=Tt%J+-n zVDottQT2B($VeZW@QJrHGJr}u{=S@;iggR&%e|O9XG4sgkB~%oeHRWL z|7geIZChwMgKI2h%Wk2e;K4@jBZ*TL!lOdeMZ#77%7(^nY;Z{ssTQX4?Wo?C8esWp zhFrXVGpVOg5|+=DHdGGJp*u`(ofEEJ2i}{=mVR#K*x@L#yiJG)(CS{)1;0ly!nYOP zjlafx9`||Fg)@_($}l>%5x01?XvA7EcVy?E=c>w|qAK=j#WLnME!sT!A}Uy#48}gp zQVjwo*r4qbH_&AZc-ytw$KPn!&*oJcu6X+naGEoSZMA*oF;zvXysaXi&6VjE%O9&TD(#?qMNgO z1iDG8Jy6zIq$})hjYZqV03v5^>xf6GTH!tYr#AgI=;<`J9Q{W69)I|3$0Z&5PTV0J z;j?e4TXq8bMAO7>#H1+MW~*+g}BDIG{D~S?do{^&4s{|>6xrTc>(5a1oJo^ zCNG))Ni+&yd70ZNd=+TzyfM_ek5S4lE`_4444AbBRcb%@mQohIr{*fmUA9C2lEVHo zpUzbmU>Ad6I;QWwc^-#s4XTo`TrD2iGg(2Z{~$p@d$Dr$oP=u`b4iY_=l*EleJe^w z4lEd<{@4-Z=ri>Ay&qmGr}5&?LynQW!w2!~cFrlQ)#?IXpDRq#Vsjl}&tO$Yb47IM ztkXFZX4L-D=}Uj(iJAu!mvNruavGVe*EW%~jp9pobCmYVhNQ&g~ZIdRHur#ePf>5jyk%7Ky=K z!(DkPOu)s4=+tR+3?VPUFZ*wL*vC9Ut8tr@DCB zC17dM$xrXf2trS-gZp`yZ2$DJ&;vKgKlwkS;j6K_I1w#)=?oWFu(`|8QsbXt9AFc1 za#bi9Biw^ZZC2v1MjXnR*s3LT)FnF*iLGQ!6?@Ohxfl8s^V2M^*A!Qr-WZ%|h4~P zjQA+KMO;iKif&Pcip>bqlv*vu2KR2g=XrTaG)paPzyc#oFE~dv_+%^G8qb5iJz1nT z=Gn}zR$fDwf>p*_@~Bl2GnW0(NN6981#2&rN}*?MnD0Q1>4#0t7agPuDUWF{c!i4o zW0P=vB$#99s-j%o&L1Yb>_(({3L)o+_G}c34Ef>o!(wWtO;PEov@aLdFUAOgmdidj zJzx_u^pqIc)N*ReI?5Te4pDtb58mGp@0q^;uT3OJI-Khr+jv;gRYyui} z_e1@JRSJ&wFK@5q0-`$xdvkHuxwdyrz`f{9gClAY2*84>q#G>oMMgX~_k$t%4p`EX zVeAwAsPwe6i}{I6kHZfM_BLE>i*JK*8>)ESx15_XEt=m^DU0lE?$(raFsr9c*K5`b z(fT!siCUI&ut{mv$VZB(!?1w5xn;q_cX`kJKQg+6X)<3^?BlluVb6{cU>S3XLjE-p z$oELaC`qy+oM%0UZ>9<{GmzM-aBF~&=9^E*T@v@;bxzO6Frqapotr@q1fx1&HjvUZ zsHXZ)1QkWRd37COPLCV``6cE50q8&%zh0`x0&~jsuDwlaRNr<_rXdJC@rQzjBrX z+qC`446P3K5PU1GKrZ-?s_CwSi zP1~m4OwLL-r|H$jh56Wu788d@5u}ZPm)n&YUk15^w}zVP6gRIC+fJd%DgwNyokr$; zQsbtl$SzZOZ0?d$2#5!LP;BDb(Si&(z44}++XahJbKKDfpL&o)GfNqT3 zpkvxcYtU7lbh=>SC^Kl>`&A%P8lht#S4LL;lnm^O=r%HcmpgPl|jeu)D=GOsR|U$dK_f#K!dKbf_3mZUlbdQap(O+B460qacYZPluKv0)1|w&H z*`IJpJQL+jr@VgzSixCZM$|6I<_;!hK*nk&aWT%3dB!)o!VyUW!b}8DxO6+k@MN=z#C~_R?9NMpm2z_d zmT1>7d?>SL7T~gGmw_(-Cea#DC?ZTRr?5q!i@Un{Z)_I{3y173wiN=k2zZI@4bt5( zF%a1Z@`@O#1;dUVLJP;k3Klfk;4oP{?ZF(z#COuWWMRidK#;V126(N|z$81&056_L zEVKaM-1(KY(4mYtLhJ}lOccApmxB+l$-oVA(IXpG5;pevi9^2o6 zy29G$NG5nSP7FvQLaP)wiQo;vM;L>*UBR0Ocw2xsRsi2Tso`6T30&_g3J=GzcSCAz zdXaJMKG#f{=@t8xgIk5X`o=OwCF(-?s*K^|M2-M!&eSh@QrE<-k!|iR*S}Y1xrdu(S?-53{Z1&z%Cqy zVIIRpS-`_i+`+GykxR@&zGUwWQV!}yVP1}5U9IbVb7rF4JYzRBz{mn>D^CtLOz#lk zrht%GZ-M;I7>*FT$%4rEcWUm_w=fJvY=!Y-jiCrTLbKho|}xGgl5IE5I4fdK9T+1;vz6HI^*YLg+Dktz%Z@VY22f~W<^B;!4kGKAklJ)|o} z3UpgoBif=}QRIu8?TYlf*H#t0w5Z_giyB^DP2mXRAosFr z!6}8cJ}gln{k0^G61!m*&%!$;0YjpYrflmxV_H0?0PvD-o?m8~TLF1~S|mV5jl1-( z+)g^+oZ90ew{1OAQkF!cYeB5FYbC~)ykcrHY#*iHP%4At7hrcjg#*;?PAmBMY6+jK zR`6FJ-+>7Awx(j!P3U03y^hyAA0lcYUOARx* ziI5l|%zqQG8!VYHLD|N&lBHAdbSl$es;XoFOC~lww%%~2%x)PBr@qG5o8836=F@7} zvY7>i`6?NBf1h>b_N-7^M*}=}T*DhD72N1B-8E+W;)o5n*(Yjw15o4I z4&VTpU(xu6Pl+ZScrubi5K~B9h{2ncKE!Ab@pl0X_DR}>g>zK5%lGx)`I-8k-{eBm zKM6+^;_dRW!0Zk+G!X!^tRel!8eQD%f&e&t(syPXiQx_Zbgmi#@X`h}t_7SZkkkZv zz*r0jc=>q0z~ z;7zB9#I%PwJ=GfmUXe0PD%hG#;b3b5pWSQVC(fUP?;Bdmx`rDy<@r)ieUCAVMJBQ$ zz_QMGfCrP2gHPfkkK1X(P)UHXHhN0<9N%zXE{Ffn;h+#Ukf+ zV-55RBPNWC&~MZFOYL&@-5RI3qE!-0B!Je$?Jd7wT9R>Jd73}qe&eYbdw2f|J`S-w zHP$%xzofv@f;6QV2AE9Hj&cg&^YbY@&~)(R$qD>{tp*eQ$uO6=8Taz7ld$I*Lakutr$!r@MZ(N+CR1H7(Qyy452_ESd00hh#Zi+LVnI0(p!B#}-|9Xc;v zr?6S29_jBTC$_#1lm!s{MAnX)IxtJQ!tx5}#rq(TYA8Cu09#E3_s^#Aqw^E^eFqb` zxU&nBW=64indRlpaU^drOM$p?2>}%{y@y=|SMIFf%25s1S_Hi{ob&@MTb9*eWCz+r z88qd}@Nz?>k_Jw)pv*7xzYKtAla&F^_B-7-fIm5h{F17IslE&+oPgXEss#vPHU}!u zNDUD@IX45BQ*_XrH4T$~ zbg-&ASip+J447&h>x7d`aPOuKYoVjlU1GwB0HACFiBR4+E3F@*_L?87F@T0YVQT89xwHb~_+RNtX~5b!eN3oxBjFrUrgiR~JG^85^*oXue$ zHNChwP)07sJRW#z$bh$v@po~>48!idgMfFjf>#ObP65-r-&)oLj;TGUofPmo%OnhW zGW=uxu7yXXA4_`xY?rpzjKSHn`<~1`X78cpDc(gr%W0Cf!Ts>ujr*svD?66iW} z0tn^)W20X;C3sVpEbe)RqO`Onv{PuC^>+&lZ&oON)3w0Y09!uKN7k(1_~$%?}$lGmQ@9ZZ3izO4e;Wkg4Y)V+-fUW3>7Rp)ItKZ2na~Wo5W-Ya)!wG z63|t^D}b2d&4${ei5r1m<_CEqXMnR|jPVj-iW!VZ!U}=W*7M2oxU#6Rbt9Y0Eld9h z$ZCQK2DYr>jX;=U@G|qufY$?KWqlbG3zRj}2G2RpK z?JCZw#)%Uc@CIDU^=S3{@^_rraXH+7vchXMy8__igjFOv3E(A^9;jB^|3wmI9wY#l z$Ae_G;)lA4ilOZ=K?hwI7;};|;NK1Ec3C++X)1VZdj>ytFoh?l4P3-D+BKdhQV~hB zjI20M&|2F3ixM5Qqb*#gP-H#4x@_TvtLh`1v_Jb zuiArA%b9y2Y2awVQY(7*-|fT70Db*RRncW8066**XMuwUA%Z2WF@-p}C8+Cb%dSZk zJW(2dSNsaSpbz=TRzf=+W>lNN0J}2;yEC|msjB-99$g*5fBN{xHemN2#YlHktPSA3 zn_BxGT=UCUo*%w>>lj{`Y{Rwr4!pVQST`ExPX2ivN2G_u+;4H=M zlc!Ob8I7)e;e7n3@e;+@F?3-VX?$AdeC2@JOgj@lt+LDKjz?!uDFPY3gz>ciR-Zg3 zVQ^e*K-X5=>&xzZf>c_PiAq~cT}I^7qK+3YVlhBH;I4IE3FI#p001BWNklcuBaD1=_+_*Il!wY1H5+9 z!`p2IM?JE@Rb+T+Q;$Rs2>_N{No*3s=29=f^V!+ZvjWiNY*rj5jXr5KE$oRF}FpJT%^Xc#cdn$3?I0WWuK z8GSkmL%{@eO7sP;&>+lZJHR77u&!|%7~30y^o&fyj4ap%w@FSqf=)YmE^8)A*at-7 zV(bmy6V~pwyE0ndkBxmSWaDtoF zdW_Dnf_Ij>nyIl-oDq^@zbpLI?qzX&^FsmZ?`WzQTkdn>LtHt%h@36G{($ ze*^Hb#WDO~-NVm+YQyfnn>M`H&)optd$@)E$EUwJd~-R#)vY~vr<%g+Z4bAW3pnX` zw=wA>qqM=oMlt;!@Uo9L;5NkP)CJwZSiTF5s$csr%)GPu_2I`xfpEM|ja1pdT1cHY z=DM(C_G|{erCrvkqcPu&gSHIuI!9n#r8np)Cm(>3oq~i|%*6H*Yr%S6Tq;K}i%jpl zp1}EO4NuJgK6@~Q2e+8@#Y|tgAp{xy$Nh2Eo905ORYhhTtR72QFf~5#>3B*+dcJ))1@q=`%xI;(FmrdV8-48Iq@A%p4aXt^P=Q<)Fj!a?L_1{$u zWh(3OGjQz;h#4f(^N89;Mx6m&6~H%tV!1lT;(Z&S6m72xTp^-o{1>t-BE}@0L z!#b(~hFa>XhE8I25jkqdVc6^y5+~sEE%=WKH_URfKwN^HA~OhfL%s{pWqivqfLXA? z>?}`07<7gQhMvq|pBdB;(vBuKTy9S9AoYl0_kcpYott7d!3jJ(pTei{@5vNq*lx6H z5rX8&W_OSrlm;MrvbFLX2b_G$`uFfs#fSR(+g zoTHU8_!S+Qiu$>(jB6e1Ipp;KaXq7&iUH07G)n-~*}J%+6&P%3oq|R;f1kT`n$j=x z34sT`LY4UEI7?hgG+|DUb3nuV^3!Ef$14Z;B#O#_8Pza_@T7(ZpoOQF3;1_Fyo$P*UTqlw_|+?yhv#n}!b|lG-kI;i)d827S7fvoEymN{s-boD) zPbcu%a}9iIr-FmojI)0=n23TmRrw`(!B&C23%~@;k zKIOV_YTzRSqm5WGkf;;VFeBjQdPGJR!DQWsO;JKmV_Yi2&0!;6$GiLy5UmJE$tN=6 z%uZ8%5HMDZhmaVHiS2`Bn_xIOoS-0ciA$-dAH@0~ycn2aT%KqA$Sg8`!3R*sq>5!- zYGBEk4F~8E^kV(t`vl-gy6q4L7~6xQMc{LSw1p%tvHmM+2VM2x`%!%(7z_iHCfQOi zc$`UF-gqaULADYuRj3g*HsXB|w9}L%fKwiGJbt9CSl;ahGurjAJ#ApGLNz)^Vn9|G zCor6}gFz~dpzv&3A)qj1U63+_&1%T*E>`f$vVv#Z3B24*;mvkJ8ef*+=qiMc$j~>% zkVNw~rgaTADH=7koAFR#FTq-OysAZA4|r2% zH!e>KU^M{Gfmks-B9lz&FftNFyy~^9XJdFh$Kb!o!~Mh5kOu}hpvQHR1^XH$#>tsdR-B(r( zJk!nKYCna;wjw4NOA;f6U@r+ETvoC?=9KBFHi)0tu4gj!s&R(bS~o9G(LOvj7VN+( z+q1Kk+jX}w6nX}eS1M<`>2-RWqiJz(Sgw@er;+98AjKn(w7eEe2e`X?3{l#!)iiKvUc>kAP2q|CEx6DC>C}h;CT64N%|H}-3zvm$*sM@evkG7q+f84R z8fIW8;kWQ=3Bx6c7Hq-=yvhQ{6lk91`?~?WDG1^EEd$)Nx2J$F2X=mei0!A*&I8gWFIUjop_oSc8XdEc* zFaF1Xm;MUcVA@cL8+$`mHHy2tT)`dOtcGF87A?Ho0$gdQaJiquE!3vBJdtxN2yW!* z_;;liGx=Sp!?Q{kti2kyhzYZsg{d23ezncM(>_reOQrITomUzwzIS^zSgn!RP;<5k zONjT?s0?+8$}ofbUePv8gVQ~0S*eB`XfA8Ufm@q4faHh}jYY?QP}zkKj``B2&*fESnQknP=>Ht_JghNt#t@c7OI4w?qGD%{wH zy2yqk5SW*Wr3kX2jl-4^B#Il5gm-1OH~mjEmmH-)fwKj`6agUtx_BS$sXAG)$JL4X z-%H2e4ZCKYdFDh zvSTR)wmcO(4e;t)`4KV305g+IBS@qSK|e06E&|?eU@~C2TEa=!!JWktZmv3bYl*hA zgUfvbFZMHdy_->@i54Xq!7gbQ%X~bKX?R_AzH6T{)*Huev|jUTuM)eRny7VS^7o$p#&G47SP(B{6jZ0SJjBRcZ*F<-4wWa5cVb3x4NbP2T zlkrsrURw4mI2t46$Q@vrmGh08gQKE`mjsz^`Vtk@R1zwpYI+H{q9hYFy2#=-HS9MH zJiLvdcM6a0Y*D;YWO(Nl?s`WFL`|WyMB|E@R@(nW-A7@P_W&L~Y46FIUJG<(Dus7n z$9Sed*n->A-=_`X(d3#`}WFm|+wHzb+pyOy$3o-CJe zxWc%*9lX74;p(b|SNjH@>n8A8*TD6zVOdy+5W=DE%<5Ryxr*>B$VI#zIt}2tTieib zg$_M7flqtlxSdP1#>s1(Hd!3IuZ-2P>&s(PLFrilZt7RcEg&OAo+y4sY=?j^BSJqo53fyXRy~)FsHb^05ghVDw)AViohCE0lhiw zjIBKnq4`C%2kQ5l9}2U$zbG*eca|c|sCG+67H?)aRNQxst}3 z!q^e3iy_E53PaYlD_C?L9G)!UHiBJDA-rhewV{R=yBePFCUC8} z@4@lK4PcCwv94B5?}ckMxg++=)^jR>7_)P7UTPoL_5XJRfX_N9(q7B!96GHC-({Do z@nH5mDQ|8o#2zV-&fhJF_b|c4q=vm|4d*fL?qmY@O*(jLaRNU$so}>zxd}t|?(E|G z>+B8SeIK>gFMaEq!KC62n*<8>-Cw7s`ZVX6ZUj2bt>hbr3<$_Fs~JZYUqhdeF}_io zw??~bfVN{?*8030@NzAS(bi9H4QtG`HRT!(zb5I2DS{R4LT>7s5>KFke|T#GPwh_O zk)1j0Qq0~8X4L?50=x*00VYAqEAeR=uu7U&g}D4&{hk6_2EGb-rMLM_Ukb-kCsz7y z0dU$U?Dw&1PmlZWDWKKwetY41C{PBl3QclnodaXrL)S654upj+Uj`p3G|JB!11-@8 zti8WCqT@ALHn#qJ0lFMkj+2z|F=Am&QWD-g$v~GhyIlv!?6z$Os}<^YTVi%G$;6v& z4{!Dryg=-31+Nbik}+WTUfBr8!J8#3rNS#ssH5vJB?*JALw={6@f~+JXM>Gd-;QP0 zRSN$MvF{^obeb_fi+>CasP%NV$>F*&Y#+PsJo_8{O;PVmEtx+lN=gM3?c)G5s?8g? zP}lIuVF7=zU%_8|{Ne9LZJedXHs`!YHLwA^?@`6y?PLGDuYYy8da{Jo-T_>jZo}ne z4=*oU+K{mX-bqi+fda4VvUG$&<@W!b~A!>t48u0ys zv>`|wD61ESry_Yn4HFEkPMY2dKC?H2$F`8^#Z7D&yBC?>3TE_)L7#NfSp>3Ff7~|| z=<44&;N^2Q0Rw|Bku_N8%w9(B%{6O*VF~Ewz%g%;bpY4?mIB`#Fpoj#u~DpkbF7@} z%dgMVUhP>^+gD4a@Fmb*m$Hfq>q;=mwuQ8k9+SJK&o9-x*nm=51r|nN8}zv`8()aN zpujg|okK=f*xinq-F~%#W!u5g$%2^O8>=4PT6XYe)xe8w1>fpxcm=mn|Z zlE^s*l7N^+7mr-VbFhzV;?=H)t|Cl1n|&CAj+xyG4esrW+OhH^#Mre+3`h(zb483( zm$!YP2u9ahKJiFJkc-V z-+p`}Ww={R@_xE*19;z0tpx!8Mn3D)x%>>wZH8N1Nxy`u1lEyb&Gd_)0_+0|7^c=(3u48tk zS=T!ZjklY#Wy*}O0nT}bl=<LqJXIn$j7u79iM*bdOUrR(iD_+6r(07d zw!LWuADuVw%~=D$%2C26#Po9r%?tt#evqOZ5{r_2J5mlo`OjMlJWn-gQOc3oU6RlJ)UMT>EdvbZh6TUp3eeXVyWW&m}~ToAz^q8 z^W%F#YLd&0^Oy@#*Ao&BxYkmDE9bfU5W_25ez5esP>aiZb%kkQc_SPC+nYA<(6oY2 z@6O;;bIi=vz)sV^ykUlShM#~sV3j45qAcL^STU{uSGG(_79(Ya1>o9VrotJyPs#v$ z34}7gW1HSeqtZiMapNVODW56lr&}S@NtkV2FL?3n9hXUQf(^eTAbXF}63qA{)Bj=;42Sr)LAoFeuOyIg;l>#Fc9=34KT*Db zNkG~T7HtoAmMgeLQih%~Q(i?zx3A&bLj_mKOks{@&c=t@T^TV{U%_Tt`=yhB5->D| z$W)$=L!EY|b(>A-GsZY?BL{F33rhDhX4nDq0)&=nXL&Mm7R#yUSo`hAM7ih6mA0O; z>(*pawo*z-yE)a_h(Q<~Fx3Q#jWx=wJ0l&0K)Sy~LV>m1E?5FW@<=;J^RRCd&U4jt4qzY-w z@sal~F&YAP6woU4;ugrGHbm#)Dwz{f2-Az_pwX{uj>s@UR=2L;{&@qRp4IT^_7pBn z8rYvrXhR1AUu1fx2$Ic4GzPfJ)C%KEpTS`Z;N{R}Hr}oRWA1_SUEG)b-80G7y{(Ji zD|L~9iSUDO3hhfC;O1RbV6eZhk09cm{w)LR(Dm`1?hQEtMK_V{jchTf>ieCybh6y1ky>m|)-nx!Im-u%( zz{vn`)D3W>?cn;dBX;-AZh)7%0bZ{fxY}b%Y)s7}%q~8>cWK#Cz7Te-B^|&6s}um2 z>pHayXN@*vd$6}}TGu)7=2}&$MX6t;cCQ48OKm6X0;jdLZDBVSQa?~|1gT|R*O$}! zwzi>oA50^Tp%@#KGECvzWCE8a03UCc@P(#@U-xgFK6t+n;C=i0JHw?57svYD z2k)&v0B`h9u3Pw+x2#CS%NpcMz$jw_u`^ zCDHV`+6A?8)Rl<~GoMkzn{xC9#8}W9GO^LZtz>8m8Pt&FML>#idM{2Zcy!hf(|iA{ zfrCi{TTKO9lO{5~6yG;Yd29j+2H~=yjmr@MZ?f49?-9<9I$$}X?%F13V7IBvukDq5 z9AQNInQBzU`EpHKKw(7>;;u`O*fYX>Ki?N~vA{Sykn*L_Q|>DZ$^s4j`;?ejoxDmt z>dtoil#&iz;hXkg3#gR=w)Jcm*h}vt@Xj*WSdwu@ms9#8pv6y27=fvq=@Y*b;AK{~ zNBIIC>jqeM11vg#!w%p^5AY6cQ0w9KRS)0p2l#ef!EFFIM7b5|Bse=ENhpFmf^CRV zlxGvvl)JYOOQB_6lO>j4$Mb0bGM(Bp9?vJ{slC#@3gz{*ar@@EdVL@MOZxn{>-6^9 z`Uh{K)3Kv>9Gf(zCf% zyRMie2U+en7Cc!1%=PA{CJL%jX@f#J2iqg~#rxnj;WI>UkXXH_YdeP#9I753*_y&b z(+2L}n!xU~fvrgmvyizBmjoM$xHNN5KQP1~)VDnjr!KeP;zw zsIjD;9p2LMto5wU-oCE|&K9O|3TZEOh)k!|PR;1~7C3CD>`(0hR-1M(g2ZsNfK4xHZ)9Ry)A8WlL$-Uuipd zt8U;3?@Lh_=;kc5qBy&u9N1@Nk5;f%T4(8a7t1(y{M`Vzb#~4Fmf10Sd@8vrOt}m| zF7@$o*lEu`-TqQk1eZ?R*8_hOTjonrwtohAo5vUJLmYQj%q+wVk4=fna1K|nrZrrw zDtNM5!VgzH{OQd`wX*s903Y2jyzleI{jb0L#o=Z(g~f%7aHXr@xkV3e4g(zHlHb76 z1~ND%M44*6Fyom3G=?r}nhfxbpf$jjS5WSNaGjw@VXlYIbuEgjfilsU{M z4eZna57q!5pAH0iAKaS3!3?#%sOd#{1BW_82SR#YNlpV36=6Oqt2P|_>=E1(YBMQ+lKMB z@2eny?n}22)~*f_KDa%kU92r&W)>qnGdh${EH5#);l1#a&I@Qg_Ia~9fhnvdhV(EX z*NW}SpEyCs^5G|GZ1G7wKsx}15F?=50W5|JPKFxpV7m1V;95ISB!<_!9^UF(c&El_ zH5Dm1Ozl_>YGt}+$9KFg8T2wvWyEKegQ{_4#mcN6q|lRk zngP6GR|HbVz8WV*`AU?XgrtnIw^OIBxcM=9y7)`ct9?#-U7T=?Y#Ow68HQx=ZNUOZ zn>@f2Lo#AihG_%mFss_Ef=AjV{QkOwzq$dt?{nmHcg5cT-n*-}d*-TN{?<2!=ia&j z#|IbS`t~_^_N0YZx(;skJsc10B+#u6C~crp2WB_?&3L#BbmLq*FudL|1k)1@Q!t-t zXs!ZDV8bNFij0u@M8HVe@Pt>_xfFAB^05FsMLt72pPuYlS()=Ru zWu`X(?%;d_6m;90qBueN$H2N=!W(vlA=%0(^*uVk+$)BZcdjE?#~N6@&_L`U3kr;dM=n2?)vOl~ zh}0g2;59&)&FnJ zN)e3+9~-k<@pud`sdkaCOP)S*o)*_zFFx+KYbHfAZ(6W7ZjxE7<=8<=PtM;UrAw^k z4ItOnSlFb7(>F>m(eT~`)b4&{SitvpOxq>j001BWNkln;AU2SixHzz|k;J1~y`ng5eW}CqNc9tOoF=0FN19 zg;eacjBYRma0U$0Rf$c{w7#? zD;n~WZ*zUm0ySH43Si_txnA@01O7D7#>O93rdJ>ell~mV0so_Ty>&(Dhxeg_OLY$q zOaMMY8HsAxZ7^0Zvc2qRh!YGzu*bTg$ras{p&0$f6D|5HgvlcaMb9*!Az=!HAH2T8*t1d}@?HX7xrIVp z4+gMwJ_CIMwc&bv3NyY6Zt48M81wM}+N6tGhMtZMz)Y`5BfPd2Cj!jqqE5Gm1#ZM0 zfHtQccRk$f0d98#yxjxb7<#x3J)B^qh5&9+^NaV!a+6k=_;?mL|4|fn?*FSp{$Bf)yx)Axoj4Eqf^rxyW4BQwiRNYvKIZvOP=fl#G>d zRd_W%n$|}?CjHc-RR7+>OM6gQ#R_0&TEn^7lvb)PbS*sE9m9`qZ^2JJ`oIS8CVlzC z@^u4vKOimri~szK!>iR4Zd|+{UKkp9d9i{!C~fFESV7Oy2BM7+h@|G5otL`E;L<}% zO$R;-o7W-)2t-D-CdRZ^eB1(CA7V}3-I{lWU?sb0 z++gysF-Ainmp9;|kMnPB*y;Fu`|N8boQm&3^Mclp%*q3_G3+RR457f`xD0^z9DO-+1SG{u;wjOS!sCkMd(N$E;fI-QQ= z)G@jxqnX2XzY{UoPMe%`5o1Pj6!Gen244UA@Kz@ZMFm z-Fp}P$~S*!c=q~jc>UaYcy0R}yu3s`TMvg_$Bsibfw0&xaBgBp81M>|V%?-VxCm&; z@Q7)#OmDblLC%mF#u05+tkD!LpHkJ%Kzkn?me?~WQ8;cKgo!qhnBQ1$ddITMiw4?U zG43FQUr|TFms#*;fvp17{JgZpiPtd&bJ|`xE*sBk&C-W#$u=$zLJzwzkk)q>(-C7N zhiafC6;okw1IJ1Is6r-Cfs`=6#Nz~wEVHCM(Nd{RRQ+o0#Z=e|5u)pKKGet+9B#;E z3_39oHy(KJ0H|dNA8&&Il|Catn|cZ=dMZ(H2eMZl-ynoCuZ4kW7<;if4Njo*t2ClpHZ zc_jcmZWncGq)fNh+n0@U98(Eq4?Web6PBVr*fGhIeQ!Y1xh|V6MZy?<3|Bg~Da7KG zHshWf2Dl$q@Iylf|Hc!Ws0^pL(+~X58^HSkYU02Dl`jvMR{*aaT!fcl3UA_)U)RF% z&=VsfQ5(qEgk|jLF5Tue0k#%)iRCpC2MchMXbf?0h(WT-c%*Kp&>yIul(Vojx;E^PKI)wcj$2XKRQLq@#-T$!eLAjlP@k5s0Y%P+u}`x^t_0Dwc? z@%jtD1-Pa@-Q&Dyq+}=Uy-|*Z zAr<#9b?{^c=js72wJUfEmhc}u^~f1LO4-kBj(#v|U;}tR80{F};_rUxi^H>%E%^5S zd3a@L;GM3AW6Ukzcd)|U&IWvt!3vwyl}QQ)F_AcsxwNP#XnUh!Hq0o`ytQIW-z{TN zWE4!)h2rli@Cd8j7O=>5&OwZ{Hvs@6$?y(i6iWIh`1LXgOK6XS%H5UCVZzX%v2M~`uQ0}Ck88fZB^^a1zWfOccM#Fc|kdbg5* zK*u`d0DVopYWvE0fxk*8TmmfOgkoH=SZ3Nn`I3IfKu7ql0G*QzSJ;up6q^<$asN!9 zu-&v~89;M9kh~$0l-|Ym_tN-MSi!&Y`JUOuUxK7U`S}BJzg1iKsN;9o&tSs+Ve#@X2C_a5V$NDDF)saBkYbL0!Z7x`W3TC-B*M4L|evhTZ*uL7lsL9R|Gb zyfa+7xJf*5S2cJKUi4r6`mYbq?q7hHch14<6qvn(qjp6sFGg*ka6ggZP2rWXtYN8{ z%#>k(+1{9?XA6XlO$%^^(XRtCQfX@8N(O!m=oW!&d<_8rYM`Y^#p_Iz0QS!cxV&j! zNF>F^s>8C5fOA|wu&N)n1GkV{qq^6%-y%P>?)J6Yf+&n0K*CNQbH_YU0mKUFx#o@xNt zSiiIld+LPFOwc^=R3I3EctO&e_7r_y+E4wNT0djwc~(t8MFhq+_G!4a)`#}fQhn<9 z3(+$ISXD@>b|FIJ@I1%dN@NEC!e)M*GrR(;@_HzYP93?)1j>ve$5@ue^_Zn7Pgu>M z81*Hr2{+RT9bfL6FisucpzmL@fA+od^^1`Lg~^I9k-d{gu4xP8-|Y&F)}F0L{X0R$ zm`M#I$Y9EJjK(mX!oj45^L-Bwx5x0grh=b)ViT2Nv}=9He%LU)AJ7K>FMs3LhiA^+ z4_9Z~@b*x_?XH7m+rml5I=L?5+QJf-iNe6PP0S6!o8X`Hm;wvcilq#1E^#=e;@A7_ z%;1xQbxhlO!0R2dY})gHSGg;3`?k!n0%M)11Mr29-_|fdYdFDBQVh@Wz3STc39;1%C7?kafosqu|ukP70!3B1G zEKXo^kwfg6Nw=}qQfoOE8Q6Nwn0||-r5^?zxQL+q^}$AkgUtArx5=f~S-Vv#hdV#c zjq|Zm2DaMvDQJ!7XLd1_GL-sim~amROk*as2F_2XaDEE#vBN`nsvh8PJo)G;p5y}x z05-2xtbq-~`vL73zxwsB4FB)V6L{|6K6rC$m*P~SwBfj2@#c@PS;THy5hhj~LMCIN zwNx=v!6+rpL9a1@hYZ>}N18Kgh0|S2W$q)neQJ(N-@PGE%U5<=`W_bW^81y6fz*>_ zKoTIDDnpF}uuw1&NG6KXF+iLwMW*$X;C2OU7AjZ_${sHTcK!&zpMR9e&Xtb2(1&zl zV6WuAsTK?UsK`ee;2Rrd%{WgTwf6tqsY^}7_xE`#LS+|rEXC)S;Ku1j$V@LB(>HeI z7#vyqq*1i4Xweakv2*etMJ;*>EoJSK))${ZR>5kd4I><+$h4tQ+6%Apz1DBuvhTj8 z#HO#6`mv03)4xl5LreWX0kI0OMZ%GeB5g(2-<&d5-=FViSEvj>af(4LHoZMKvd=)r zx$mJ`s`AQ89#%267k)Y-79kP?p=;2l+8HO7IG9b~d{x6k?J+#HTEgG_{>L_8_jJ?p zp*mv&ct60+{Yzi_^6-Bjw{YeB1Mp5ggWJOZciNU>TVl8$+94e`&)6kov&bGmMsyGk zbQC~Hs^wMmU;tsNf-Gssl(7}ZkUK0bCzbE68Qu`F&FyCPT2gDy)lu2q&*i1ybOK=C zf$w9s4;2~E3>|VkW^s$tZBf}aDRy~^Dj8H5z##WEO=etlxSzXTe)jN6PhljGhi3}c zIfp9u;zm>%u}(Y$`g-4+)_d;bVus-2^YXXV{$}2*h*L{|`1i)3WI!f;Oj5p6&tEqI zNSI=mIZ@!H+jQsAUETtt6`#z;^t|*62Dl;An3FJY`$^&q+n(_R@RN`y0kLecus%#ONTk*K0Rg&tNkY z7dy)>lGp3l1S7ZnXn8SiIBrtIOlk-7863=O_}K9=Jl-zgv-`X7V~;$z0ldFA=IDKU z*A3u(-!|RZ3jRNQ<%`4r(>CzJ-X*v>nZs?|#D<~Dx)xdly)HOTa!)I5i1r$7h;;~T zQ=-N%Wqe~8vK$cRZ(to>*ka-~vsm-$7foI967I7M;N<#zvzm7ZehEF6Fwrz?$<)Tu zU#4Jba3E)m*O7v*qCAl0pDaV9zx&z>-`2SR8~)1x;qZhoVX+|3|E;&?oJ#f@gtIP zob+c~YYKR?o?PT&{RFTu7>v|obgE#+C%1Syu=V|=N96rvglLEp@zP38K6ciRa|`sX zUGNhC<;`(%cgy?+TxzcpP)*M(0g}`_t-FuDjb4?XUj}%wU&Xr1 zOE>;rV}Ljs1M?b5Jr|>~sKm)Lwp!1u-SygDi&K3pgt0iZX3s&6<1&$w^v4WZ#(tYw zij2vWRLi!7e7%}M;A+j2;W@8R*o$F6aH-$u?Z;Ynopa15-h7u(^RY|hQ7Ht9+j_L4 zx?InEL%cs_gscFzrVX5%&EVX;h6h(Gcx-hHU)b4#Klj+jHemNdfNSpN6*qwQZffm) zc+KDX=l^W@r;{Ccb@u`sLc<9uFbiAXQ2=*jdKnOvqzxuYLmIEwdKrhPJX2?vSWDJu z)F6)lSZRXD{Kx@wehy~}4Hs@8fV9l~SjSk_k_tnifK&^TImpDhj#=k2&@Fi8c*sUu z5CF_TGrtE}K!2l~u>$HfD$!WKSv#Z*P1X_&6h{N_D`GjVeo`P;1jM7e>eE&86qJk% zW-64vV;N|AARN13vQJDV5~l%S+l+asd@YRwUvr+l#Ds$@mt#zWZeh_F@Gl+DImc|0 zmcFDZuU*nt6T@N1tjS4%?^zjM`&L;oMx;dw#Q3jR+ytX~AZMOr;wtm?X}y{6E{aOt z8?yF~4;46>PVmp#e-dEr_9fbht$#1Iduo}rBr<}%E%LzDLf-MdgV$hGhHcEIHlM-% zbO!gs5~}HixkWHh}j-)DQmiFMVGUMPQxxsq}sp@Qv4RS!1$RTX}k8MWCed zuSZrM*4ia~qw+*?Y+S9st{km zKzidqlfq}fFGb~{IP0be>S&a~wT{7fZ0S9?>w$*9bXedm^9eQE7@TKBAUT4AOo#mhXb z@~7Amr4s->voz)8U;XvTXivsDO=K&>?8?v${Wu4_VI0TsZ`?=xgsq&jD~>w{Or2oM z4=+1jMzuLrm!=e!9ml*V~b<>(OC_D$9i7m0}GRSI%G2vnM4v~qJk~+j6|XCWR2y??sW#ad>eNI>rp!4`&lhujjsuAl=6QgbGr&31 zYrxrvM1dV07b2_oBC}N5AHUKxMfuN44mZKRrgvqIy5sUI1sYTxxE19;s8&J4p80LoA6HR56XB)Hbs z_Zp3IK_hMZ;%V)j{;so!d|d1MNWEzbSVmi4C0j$2)-p|{J#SLiusxl?&a{D@x`K}l zC-BGX3jXE>?B0!e`A}Z70lXi=X8*^RpBaAb+D-WF{qyifwFSqRjG|jn)CS(fhKxvJ z-XoyZO0Ih^QazJZrUe65_-DPBe^7HjP3Dlo5JK;VVdRPa{C5l67 zTZO)NQNwEhuXVP8oXUD$nX5@OsHgN-el-o>Wc;nyq!t`#xt`t8a61ED$m`q9Nfy}f z-^JP;#`cvb0C=qi*xb1wX($5Q4A7+RU;A6UK2yGwLGQaYC7x*uQAv`mQsaQ6+*|bg zvERp-zw&YWP8OJrziSEDt^vSBAUC#Y%}mh3br$d{fKPy~v1d{`XOH|K$)Z%GHCY0* zb{>=i<8rDz3xM+pMLu%r{YJID>+Pqv&jsSZR$kV)I*w19_*iL^mS~L~a00ocA%f+{ zjE+rJ!E8E(?Ye=T3BUt=3xBlf;6HrwlVfJ{-44gi`5%HB*Z|%SK_i!5@qd2i8^iy3 zX93?trnj2GqHUo=wzuyH@M3&k-eZw4N6w#FW|z!#axLl=BSjq2B1Y)3VLBlJKHp@g;P&*d^n<;3y-V&)pR$l=U z2Zn64-r{vC2GK|7pf>+a&q-aeX#Um%iO}K%jQyFphYRhIU@bi_ftF{8ckF@YSYm*? zGahNXmD*W>#X4X+)}K|Bl)_I7h&@2G6Dy6AUD7O<`{mdqpu7SQYc9SXUvKN3zMFn1 zzx(5SC#T`J%&v^%fEH6tZ!E`}iBJjPihYQmMM;BL5Pq>zyPv9S9!dC6mN=Z2S?#pn zPhY{YJ)YmEu!0j?l3Oh8FSbXI)h({1@NXQIVLF+>eA2)+RB+I&;76(f{);CzS=8>% z0)2R|+5p}UZ`;Fv|Mb^~|Ld@WXLk1Cjjn-3*F)DWq3Z|eC{!6Uz5Jg+PS*3-MW_If zz2k~oI}(E*?w9y;%e>g8iNGwLFXoWX${c05c--MzmzA1vdE)>m%zOC>K-pZUk_M?e z_o}gADV$rw=qB_^>Oj-_3O>H5BZpybZER##z)o+E!1r$1(=dRluU)1~pm z6{cs#syR!vhIa#aX`)mHycRH?#f+2zkJi?y_edw3<^pX`lLoJ-;k*S4#l5G2}8 z_ac7cqg~jK%rbMCCz_D{miAAbxT#%m(gugRlAdO?`MD*?CvL^Ho-<1tobim7HJe}+ zw9duxzQ%s8>z}E;T-W#fb4w8v_?^5(=9Q+hWmUd8wE@EI)A0(3*_}=rm{kqTCp8>Y z0Dllx@RK_;_|uzMyQi9r%?Z8+Hh}j--Xs3@@Ba4i8(jmJr#tXwU&9KSUexmn(@P<~ zy_+Hf=t68N7%l_Wd`|BTyvBXCu*qxj46rR^RLdD2%K)qC%^h{BeYD>#$S)jE7VFh9 zq?@S<@je~n9YUlcGBmlL6tA(iqN;5+N_lG(BS$KA&ObYD7s zx8it8x{f~c^tiO+?@@}%@a_R`#vEsv14D1JL(po@v*X-va1Vm^`}{pQpn!I2u~#WD zD{D@rU-J{(R6dJ3qWw6wQt1DsiBD=_(#eTo|0v3`;B$*1+#yr25w&ZUCQZZ4ZUvL3foW3{;N6)5e70}l&+g9QXEs^XKIF*d?p}Wbc<-*>K2TTv zt*`&~@a29Am#5osZ3Pscx9?WO@?!d7G+tz$!nE4~Ub26wfh{eadBB*$9uMHk0M%j? zVV*MpHv(I-=Vc7axJFmQhvmS%%=ikfpX0A_ueye-uImQzL$^7%jYFUN(y5EQ6yMF5I!V6BuAEEI8gv2 zum!{h^2h!a{)qtt0+Jwrkpw{y=SKusQYeWgC59jZM7E+h5d)dxL!>E*(x_iz&Gjq<&y3*mEy?5{Gs;{cMzWVyBwQRTZ&smtW6ex;Z6I9tD z$dd`5w2G)hi6~Rt7=BZ6eT#i%hb6p~OPhCM(LXsMDN88}CG1s`tBuS80V1M`%`PNo0BJgk@bUwj|_pHX%w1FYR+~c*AqZ z%P!2M*4R*Vmh3`nGpe2M7Vs{!4?ll?1OC=qp00IO<>J+k6#<8U5?&n%7J+~KCtoyQ zTAqg&VF@ptW2 zjuDb*NeBcY&c=zr%F!su_aswYPI&2pf!3p>G7f3yJq})4KLN(DOR_gGOq~+J z=kRsEEPt1jy>Of>hkl+BT~BaB8&l7_PZCAr?*m@a@wQ(6G&yld@5^vyoRIQg(s;oifwSZ9>mTe1Ln;pEf zU&F^QZouDu(^E=z=iGGk7!d&_ygD!}0-yWl*UTU79Kct*3-Ik`39lWvOl*C>hTaTO z>5X@#;O)%`FPrDcjW*t)>UjP6g07*naRKhFLA76e++&E2=y{7r2eXbbO^KrUS zMwf820=>sd)`mpi++S|PpGb5g(JPZ))b8XGA&b+W#fd7kHIHUaZ27?FaZ2YXy(2_7 zOr>!waPkv+qeg(|5#y3*&-IYfFH=!nlAw0}NiY*X|&fs^CYX8MXCfthgM>4>beV#39qq0ve z3Npz}*QewI#xdli2A4Xxf#ni6s%^lVVFe#Mzl6X4oRZzCdx?HOj(`$g9U&2cPyhL! zntyd?1>e}Z0^eT)ytW!(pD4X7|qQ%P`AyJ&Bx$&VA=^oTU{iilIDtceO*7A>PrP-P{I zj(9n00mYpw@$_8fc&jMA5xO)U>jbnUE~UlD_ZLQ9A=U#z#YW>>kJX!w2YXy4++2xU z<^`@r4I$%^k3&~``XD`hFW)!Z_Y%<)JofQOic-4z=yjMp=HXL5Qe!WQ9KT!~jE|H2 zI?tZ`ROYi{{P_E;tnuI}Y_g|My6x8LQ{LLi1joXdl^)+PfpVH0XJ}v0$QCOy z0p@zJLxZvV@nOa*Av~(gCi<+JTscb$Z(fBl!kbQ7sz6l9sw=#K2up-Gl_?Tna>@jS z`zub^1-Hn)7asA__Gb{Y{*Z`vI6xvWWoMGoC4n@1UQiO(oXGLo#_X@zlatiG^7ycp z8XtHPVaq(9Br*phI&qMfWkgy>#%Yc4vd?{w%fwzr5T2ATNwcqAXw!+pA@_ZrTMq6#5ZCdCW zuu&N{ms{{u+rx*pI{3u%s_dR7j&YK0QNnwY=s%$6#&BhSbYS4y=N^IARtC1$J?x^N zca7QD21|U=Lz{v(cp^*g!a2cow>F~q+8bfMIgNhLCvfM79LH< z)S{`LZj)T5=pn&nk7ntVMrl;82vOqX6>K39LYi7jyxe!GoPte}4cTM!Hil3-m(t(EaEzQ51c zW0gBp&J)Mup`$X4E0>PO1xri1t~h*|XMQ9K2ql>1Bl(H~82iV6FGOYF#5Enq>hCL^ z$J0%tOuDbg7N_z$;w{VjuQvYTxXoB-AiJ@gjPOp45AizB;@Z;d+l`;(sg@Se{P+>C zaNHwM_h`HNk!OBI`_rmDUE85I)97<+um;)|QwO)Oxw(L6ng;&rRs;X|`Db$2@AFlv z#hoPtl<=OV-abTI|LIr1WWKO&;k(O=aJ^Z;jr{|chIl}=7c;WqJFz^g@Zdyx9Y5G0&`ckVyUZOjPn~sx{loQ?D!a%JKoB#*-3WSUJx(Ugs zB}FXLucwH|Aub!=&Wcrm6(sk&t!I`XrKDl0pwutCy!`XL*}01{eJ>N@9D}r6A__Vi zNokOmHDecm052JD{>R1mi{qW%H^Mj`vovr*EcI<(U-?STu3TZ$S}{&N$TbEh5nNus z>_#wSVA64rmtX!|E}vf?^iIM1vBW9d-ek{iSYlyRhSoS`cVoE)k9Ix$%(8+1`W??I z*`3kHddPePl<>~S>dYPaKYaB|=Kota@Pl(#;pS?9n_lT%`HXBaIR%N+>xfOhIVPWg zq+R25qAitRDe3~JRZ>)k+QgT8HIw(YR7~iE&hNieAr6#|&iRFcoRix)0hZoTTArP7 zs+pSHktu$qe=mA9%SW4hvzm~xO7K=X+&RI`-%|?hCd}HV7EW}N-62h^0ri}Ui4!cD zv#H`0FWxNvaqfAZbCFBLq^6vWmFLP4VslgoZz8^_<VzmMk=qp|q$9-ibBRut~(rwayGZr!U*`zs%}c~3>c=Ho=?PiRsv zr8v^1BAzc8$`QkH;)-i++|{XTet(!(9=9ZA%5GL=c3nnGLp~0|fbq&MG_bL`gh$&3 zeq!0fFFbM?KKR5VN_gkoko1_@2q@v54b|B^@SlA7OXiQw0=~bv0JouoTdNi9uGVnS zJEga`WXvhOj+G^P!Yv5pBh!3yjhpBKt>N@0kGm@q;JTt)BL?Wwb(R!e zks!1Fy9xh;m7=^N|+rno@jTepipvL0rbTn-yN)LD|K4 zyBo_*xZDl!6Rm-dU%dz)d;02hM;)%odbA>-ad>qMOe64LedWvMU-uonvUM5m^agIN z)^K;dhEj zvZ=*4!fk@WxWeV5PCEfw2x?275P!E+id=oYR?5gnj*x3)iRbh+z=<38N=k~M9wYbsJ=oHqh@vwCL_~8BT6yks$=Z+)SgGG+UuR->XgA2B%au z|15d&YZzpGn*|`op6CEGskN}tZNi16f%lp<{Ix3=;BUO?@xxz`hiR`Kd!`Yvgctwk z+BIEOo#~M<(fH4O_eJwZH+JC5LkF*IT!h`hz#UY2`!%4a*G6x!;mX`37$@X7!7^G> zIR0{iI%ZY=}Ygr_jeyE;m6iIU5XD+mB5 z6wxBWqBl?{uA^eZ45c@omqc&iC3&JclkjqaK{vA{#V`J4X^*BpruhjvLrt{kuYs6@!alLqN|0#{b^ z`&RM38a1QdpX9D)|Ky`GJlUhlusgy=V}RBwyB8K6ymi=xU%Gq|{-ZZPsbp74$dMwT z3h$A^d%6n$z3;qezHt3Ee7V_xR~P4C&opq?D!o1I4?H7V@bo&5UHC_755KorO9b=q zX74j4f)ZppA(IE`vAq0yKB3Th)c&UZNRA;BUrDq06u{?liQo#}Tv5o$J;L+GSW>_o z%ISe^A`o=e;tC&$#^AwAim;&V#(L8Rgo%^%kY}<1(P(S1&}G&JQf4|{XuCi#_{1z2 zL+3%r9?6dp7J5GUxH{pjDZC}|<7FhI-RJr7y#EESyO7zC!ot@GWz>#r6uF_~7r=Q< zB?4IdULdHfKEh@{2|Gy%mk4}*g*&`*Wz!v1uRs4DEf$qKNAbBhPO|Giy9LU|U|}p5 z1iJX8tQb=zH{wB>RN|1A!)}n)v+I=I4mP_DIKR=rTh|Bh@$(z-pT1qgkIlRd>0z$} z0abWk2Y6@kr~mvr-!cEsjXUsF)4`3!dDu4wcGoNC>9yg?jP>+VrPocsbRw3O*f3G! zYp(EyxUVd#Ko)No<(v>l*Lr?~r!S_8%_sU=w1(uw<4TA>UWk)Qr@A!3)Q+zS8JtW@ z6O}aO)+RLfIj26g_`1a=K%)3i0>zc!OaW%N9faqkFM0;^vTEE@sRK$ z{awUmPImxG?0En9Zz=|B={n>DIBbQY%4SYk(=TfMOpi!WKGIc}*ME%AI>IY2g#&Sx zh;GEC@a{{ak9&>hw9EA~{avXP7xtuJT_K4i%F!8c@^>A-pbbj|tL!!%Y%LdXe$m0R z!ybHWYXkn?+co^yS>zHY(PkyQCxQAye$L-{@jK>UUEhJPHA}d$*n)jeT!+iFyf65%bpyFLsPCA=j)Dkp9yz|_hWqCyb1=ZLZ2a zBl(&^aLJf(bABZn13iu?d9@)`DubRlWmV$ZjN5#e6RAL-+2|2v1#ReY{4*nsis<%1Y7Q)Xj=gXo8gNq*T$QzoSE3 z=mpZ><)$|Zex8FbD1WRO#A_Xu!ED^px-nWh0bQc$2iWOFAC?1JYt3b_D zTld;BrKWh4IrY1w1lOj>Fvm!WP(CKZgeDRmKUbxw7m2b2MavPQ{<)9F5rHi|yRJU@1}EQ6G1FVA z*t&YmyI$w?ak|b*YMm3#Vre2QxcGI;sV1#AtD7%JBBmu#<_d4Ujb)F?$L5N$;I;M* zkL{{1}D{^^rq>}cv2V%uboBH{f~W4xIwNp zq~mIYH_@y_3}j+al1+(9j`Ve$sKyAc;K8-OEARc|6J9!gu5v{gR!R-*+EdkZJRzn1 z5xjjl@hyp$q(Eg}-sshJ^$3)PlH;Tx@tVeVSBOT@Q}Ho@m*b9uKRzz=_4G|15?7xisTlAbi8}xAY+s)$9jw-u3?D_$nRb!Ar`hw>8`dOdN|Sb3+cw%30V@5nwf z4|;YNZ3mkRr|e#9*YHyt+^nIB4rOaz#3yiCe zOt;hTU3*A|ri#Lw2*tF*7LX`5o7(&@}T*#-EB1y<&u26P;fu)iw zc;M-ilSpg@?|ZDI6rF)DfVfghE@tbQC%z1!Iq@TD@cQ4&%M*Elny{UBz2<#U-Wl8x z_d;}~@i1Pix`#i%JJrfb`~ON0FS!Gc%uX)kNxi-F0&|(uEIwA*1+VNbt+M+#82E|B z06)FCgpa&M!;g)Cu3sG?0!ny~5Ztp=^k=^JL-YHu-Gnc$jorwGO7FfIoVCGkVna0$ zC#(>s7uiuFw(bT$#CW7`)(hJp+;O=#H#t4+L>O(HX){{BIZcYKDT!#M^U+_$?`xTs81a;LV<*ZPmAOcGGGde|a#R_1G`1u> zIq`M%&8!R&YRS7BC?Rcisp!&ef+X^D2)>&2SADw^CCnAB#X5}=VRn3l?aNAWIS!)Y zE2Ny3>m^+edH>~JY_I6EjB6NQx%^$Y{%pO7wT1U*?JieS6rHy>URQz020~1VD{;<= z?M!ccwh*iKUu6?0U-;CP80Eq=4>%#6mtWTt*L!5mbjie*?qN+)_KI*^=FR8zLjuc7 zk%(_tDBC+RD!bmsuxMM@w4U7#uC+b5bDdHC{xx4TgA$pR-_kKuBp<;4XlBgE49s1w}02MS!WK_=rS4d{tM?nlxbf-81) z_Mt0>q{b%WjT6_BD2Af)T) zO-thJVl;*ho-hOamBj!*wYh+gs0g-Nzq=1V?9M@t zN-qGchBXWrvJ7vxK7Ou!^$OWv}ppWaBE4<--iaVMVAIZa;q7ZOpC`|Y@1(!}j zValmZkaZ<4D6O(G9B5vk=yM3}tckp4dyKe;`f%2f6QqDanCPnBU0*3w1YOuS*P&^` z&zB7T8+*K)t=&(`B}vVrYtNI#6{Y5i^gI74TQEu61?z<6@We$LJ;^!~!6B!l3m`t8 z%5j_erK0Q>Q90Z%Lb*ZNEtPwITw2KF#CDuiVJUP$QOLWo-|E(#xltH6Zv1+aaGtt5 zOV?MrJ_V~yrV!T_JW~sye4Nwq%kcCKVE7i}sO+z)Wdi>`U!aoZkiWM$vfJ1UYKx|W z&E*o#buB#Ftl=j+fS=l0z|UzGwW;Bz-yZ`4N_dX}6ap5mlaH=;sk%Kr|7`g`h2DJ^?TD0)Q(8Et|8u-bL1$_89_3WNS4)7qh zSqblh*ej=`PXE)l|I&QwwOjBPW(g~3;h2`p8o{?LJxY%@n?@zmsA^J$e6kT^zK^U{>43d{u^7PUPz1}bKwx}@D^55m{ zNaHOphfuYNOnt@WUz6L(f%(Fvx(TsDa3zHo4=wsP%fLsek?W^1YlAz2UT@N^juZcq zQZlb|+{`9>?8nQOuIt?M9tfXw{qfRk3nXa)ClTe6aHjDu5?_(%rYAPj1UU3pdUC)C zZbp1V{ASxA18vhmp`Rs&LeXEsLHII>MzTnC80{h#!Y|xzo-~8!kVH% zh!c43-OYg*4KGHNsJya5(-Ywsm3{3mYec5#r-@5Y?#EL1OA8)u?2wjMlEJ_pmla!8 za4Q5j^`HAIEnIkSPmLQ16576e9B?AY8{z44<%!1#j;Uxeor}+n+8QIB|XG*NVVVBcO!$s1erk;nOc~n_vIIYw*YW0C$@f)=dL_PZ=w8=O<%bZ6?@)~3#q*h^XwZT zu4%4N*DuFh*_$9bGl(!Ju5P^1p0D;Ji7U(Nn|?915OW@CA&zcNaQ&m{!jm1NIAjZ( zs=~{kER^*lp4#l!G$VOcXLdFC&Da6^SaMV^>xxd1?Wah$i3Jn46fWH+hWs zGc*$Kj6X?ty09dud*+iniIQ25UxlKE@@>?H25d43RCT+yg(WnwwcLPnix!?)@4<)8 zE#U9JU6oy(_8&|Hl<+>7{c_aCMe_%@4&cUOX)O&f;1;%|^g6=i6^D2~_P5(2 zdV_SErxu6W_W|1c`|x?DXi3vb%3@pXr=*CHaB11mGLb81ohgNP-ZafOHL;yU!4oQ2 z8Yn7hBF`5NZrcPtKQov6$6Z~C+(l!v)&(u6;T-&lzielY2|mI;#-dpD;+V|2aT z3~75sBDka8-L#OQ3z(!3b3=JTv3A{*b*5p-(zj!AXZ?Ml5KBvB`Q@@)u7DTsi4s_Pj^)i>G7(H3 z?1Gq9hzuoB)NH{BGV^{W<+?Oyl%>_{DYq+>Q2s7sqr3~qc$$hgJ7Uo(;^(@P)Wejy zo~*@Zj-FnBQI=le5v5m%FI-c+J;(C8jIH(f{JxFPY!{!7cdVa^XC@mh|>u2K4k&df=u# zJF&zYx4R<;8w7vQ7^auf%bRbBDz`{^B0x6XYXwp=A3VWi|O*b<_nHgdB-vfPcPxx;k=gi=bsmxJSn;C zdY}uX7)EgFo>f6C>*tcF$<~H=oIrG?ny>{>r1|64pyKvaSX;_*B@xZ+7T|6T*?1o% zvVsfP-x=fZ93!~&I~w!aS0vtW@i>=I!bM?NHVtfa9h~o$a1B=Qu3-f~b7c#D>3Jo) zQ=?tKKY0X{@Sc1hoXHyem*0KaeCh|c;QM&z?-n*O1@xGl0yQLe`*;6kk9zY&6=Gru zneZl{YjJq#qxy1FR!*o&0!$TQ-mRQadPTab^oEv8Q5uq`*VRYzp60*fp4_o^gj%Qi z*1fHGtQ7sheqJcxay{dbMY=oMTj8i_rPKauK9?m*q5Mc&A||0`62YduUj5$JFMU70 zY4I>O2nqMRpIHAyLhF@XpXxb47|KhT*b?DQM7i{QOXE`NQG10~!tT`-+;O5@TVSyM z5WKK~DN6lTTM$x?T3(Ow4o2co*H8%eylCo*2lCd|qnWs|UsHTjUFi4?Z4S5E^qsRe z;JJg1VTsw(+7`|&I(XXj@B$pbPhUC@zwrE1hg+Q;WLwbdZxrFm%0v{xrZ`U^bHXOQ z&s$nk*lJ30nkds;F`GcmBy@9#ZD_}s!b^!wt%s>)V|)};wQq6fI;RKYB~#*5PW!2) zV}vH1p$>A5Q028_EPxb8iSAg7s`boM^Nw)*+?qi9JCU3$a~`QwPJGK0!-+D<1eoI( z758ilU%9ZzxA=u6Fuz`;#ZAt>;(I~)<)cyV^Kk;~N18zSYAjHypRD-u(NS%eKy>M` z;cxz#)K)Jw_ybYZMY4;^E?O9n>|Sg;cp47iM_~Zm@2!6oAmVP6GcD??}@^% zC;uN`xnX|&TQ9>m27qC?X*aSV@kMWM$i$X34^MrqB18!@X=nZ!oChGTSdY&6PBa;fY^LPerCj1z`( zvsHO~McHK@YyK#@PT=|Z4(r)X@qNpsLg7`;;sx^zS~L1tT8&gXsiw4t_SNI^dSy4a z@_5pdFXU|W2STum?}@UXFBGX4Uv7rKzAH~Y!Xy7&5iS=X?vs4MA&o=6z)8QWD!TCp zBV@xXmxPJ zH|Z2%T1*KgQY>GqQTXH8#Ef@vMwBU%lrZxNJ#mgwsgn945oSIurRg!qCsRFHDqL)? zoe>sm>I~xqmn<6u`RQJXbHU+8h;eFf7W%={{MXYy`L|x-5*7?|&NU~RhEz_C5RG|! z3w=%?sBRg>|Kr3reLLpe}{Nb)+eawhc%eN zM2iFU_Bz5Fh@rc+JHqQcvMEzrV>iR$N2RqPO#|*HrGn+ktr6i;p>$Q?mI+SuN)NA0 z1oElgD@7BjhUJOc*E8F-Jy!`W6y6wHNq!7GzubK57rg>f`+0fOUfz2-KgX?VMu`=S z$5%b5hg0?_Npque+z5=vvE@|9r3~Aq? zA*J}{8X3{VBEhERb7Jd=Z$9x;Vlrn>c(HkBWFjxdhRjDNhEQGU93zskUDB-W&vo1zm-`a!gi*wK!fPNUjDZPVDSTPJ3J}D%2_k`E#8I83+ zxCu8ArSLvXU}>V}-rxLt_udsqiJE&ac^Q-P7&BMd39ktJ6P$A3Jdt(9l1^EXFbNr> zq!Gh6am^!qxsp3qW8{h=kK>xhF_r3CQ@C^7B|P%}$qD1@y_&)}u$lgB1~WQRQt4xa zZDb9=q7>vfi2W*z$8a3oq$cCw$FoFaNkEiX56_Y~p-yIr^12AuA02Pucu!a((VSN5 z9buC_?h?_p^$`{h6i047Nz7PYXvib5jLuL|c;iJY6LmT+CKpP!s;NGq{WP2zepV9P z^cf?--m{BD*QvTLzV7+u63#aUo>=d}`!`zn(F+Us`M15Hx=wq&*O&fY5jZXcl<*!G z(t4glA@Hl;`l0#Eja~R&-vM+T4E-9`z1z@+q05l?I&W`MdMO!lb3-1UEKM(AnhSG? zwIIX<7qa(}1OtwVE~0g!AQ1k6BAX`4aA>8t!}TmqfC&2#&}0*KHSALU!^4N;I#fsc zgDbQlvV{7kD`B3skC;;iJDGl##Oq$_9SA}oQb8fD5z#4vI<+tvtD{87Br*4HZ#aBEd$c(bu3StRfu#yKSET(ng|$Jr z{^Fg><61=d;BBX#<}tEM3AVL8*!=~L@GhFph8^341}-i-cno@YZhaSi;`|2u?H^GK z!#zw}`jZD30VTW-aOY^%0DkS2+vazEcpd)D?f`q;0(vmeuTkY)LqC|P^kT*~_g^Bu zj`QZkm!nEEw&ldZy&ogMsjQ@!AIqKwH3 zQy|);${F*7jBA9*+B1+%UG$8scK!*=*aCyKzcOgT0yZD*HJrn7#qnO* zEw2x0nVDK5FC^SDVC+9uzl2?M0?DyfvFK)tLfA^b(n~Tm!ionB-fD+z^yZ_Ea?SFfF$NcWg+wjF(E4bUV zu*QF0>0R5Pw;v45sKR3A-LIIsT9H*{GT!{k8%83&{w*tiI4}RvM zbGI#DAhyDDPG7n_*OZ>zq&!+;&f?P66{OJEF~X2@4?56_c(b;B{`{E&7WleLc5fw!*OHV7lq`px>oI&jGF|MkJrzc<%p0an^VKqh|=cIxz@U?4&ENTOZ zR*(}~{C$dc;;)|&x0=;&oD!ybBtjfOE#crPjdnO%Lzs*6<_eHsNRA zp?=*nF|nS(Mk?VwgPr~`Hu-bgJLX^BxC4Lq${l#MYhk}>q3>}6+ZvGc;>I?dga=Fd z>;t=uJOKMqKIy zt@L6}Ej;qFBx040N#j~1U|IL@1zBQC{PSrgw>UmlC|qw71l^vx+`Lx9an9$l{eEzy zribOO+}*V&Aq-EScw=n9u<;Rg(2*a=*I}yVETZdyr=&hC9ph*I+H)Jy05FNf0veY{ zqFcbl2H@Jz!&};YcwcMa@BY}^Di`sgE)P9e5qMw`P{RAbc8yj{Lf}`w`-=G&uiS?3 z4h9a|r6swznQhf$=rXi8AnA3Rnp~(dZ)xy^GR5Qd3N2B7BOyxrT4EKd9@Gl)9f)T) zmCKdh)V|t0GjskCl%aw^N(#_OJkx?u+se9@hzjqB^2qzKLd-H2StG!Oa!$@m&yy2u z`aW06%ldKL$BAY@rBno~#F(ZAu7uf=+AoiWoN~&oiANQi(tLkTWl$sI9RDm7UcZV+ zO7TQJyf=5;vo0&{V+#)3&VuN=rL06G(>O0zjQl*QP;o&~^keFmsqqt#qR|$@)kaZ_ zMAkLOZ9>c1nvO}zZr7rH0Yi?tC=3^t8*m;BTwCwKdzv-;=(z^|=DT%sn$EbV9|0x2 zr@xO+T?_x0m$uFS@%Y@omLV_5T+jgoFodBky87eJA5W7&nh%d(`03l zE=WRglEO(yr2KDhXhA$(6mBAFQFp228-*aq4f=fcyfOi-m_T2`_6B`M_Y59F38Hu{q zl-x*YM=T1oEpeeih#9p|j715Ux&Y=WdNu1ul5<(K0aCegSAU&YPZ9L=z3f$$7G!K8 z;opp<47TIj_6v>LKqw?tuvx~k%yT{xe_C2_REaB5Ik{p>DR|CR<#2qI1WWy%0)udT z%j;@xxIey-waRV0E?tWyQcFK)-`j^;4YbCtNYodf*l=E*5avtl_Es9r(AG z4g6<6t`>%=YhS-VT?i=QJzf2I=34WKKl{G0S=J#4*1W&+NLFT zk6>L=iWIehPV`K(6$vkAmy}=yf@{n3vri=0Y?i(^rMKwR&<_8FI57)kxTcs<I7a&RBhuf|uG> ztww--*+RxNdfkMDaDDuT`lZ^(zx?&gi7h=&R&;HfiM7Fn8v|Ih=+kXrbFqMPEt1^^ zE;lV)H3#s9{k!nv7Z&iJy!WlI_adHmsq0aSzypMU65a=>GqfuAhQNRGy;sctb^SK{ zrCC7VEMXVG#q3@8*6QHGmw9imC$rfc88fPdd9#cwDn(^*iZ6@uz=%ScCEb)o6x=NS zE~h9pr8kAMa%ZhjSV8fcMYzTYbXNbIh)}{brikXz03?E&FGT1eFz znnZ=*%x_2i>Gqt3ML~2)YTm>AzN~LuS)^CjT;e;f^d`kNzg~Dh@h234o=&xs5=xQy z#*5gMRAX@Ab9Yoaj-NkYBnS$wFGyTq7KFR5ursf&-?Yc?4(>#}J(34GcthNgF8YG8 z)`fG61#Go_WmJ@Jv@gTZDUGC*N`nYPDEhcLohXerdN1zO7z^HWXs)$h~xNn$0n@qT?uNqHw+H+MPd_05L1P!Xl4JN;p` z7lBNEbqT{z8iUZ^d-=R6)9CxW+#MZg!@%Em>-`Rr-<0~>-x)2vKtJ2uGJUSq*e9BhzJl`fV`+jy4x6JY*<%uD!hpWRO(|^-kq#p%+YW;%obei0GhYfM;oXS`@+aDP>#lfRg2E1 z;qJyJ3J{5@)%7a`ATKkpnbz%;1H}Mtq&*hhhHF!_^@4>mVgT!Q;$tT5e1JMPI0^1rtnY z4x!tm)m!tjBu5z#JMM-fhgY26ynA7nF3uvG(kcq-_Q3&4#e12GS$4ha#H~5q#k?I& zp+^97o(a7{nf3uH+Je0{CABis;GS0<`kC7gi4`8SXNhG(+*?CONV^Aau<~SPBj_^m zLNW9xZYApP*I*Iv?BniHX0IwFDikQ6}$f~xzxtcgJI(i`scUsjSah;4?hbjRLpui~DXaUxZ6`@^%?o>cHL8iKHzg zK=9&1RLP9*>XHfZ`39N?13k{DP|nxK9F4r0Jel?V%Toi__kznZq1Ah6)J{!gql0Dj z;eK=za$ijhKdW+#(p+WlGwRLzI+(H(s$NUi%ZUCFWzi?ve1jk_nNR1@vY8TZ^b00=t>>m#(*d(lj8kp|seaaz{4RZwOO4xQ3WB z)6IQTy*ijMK%qSOi+CL2H{r*GQam%!7vChi*r>Y-&nHmb!s885C?t`!+z`^+&I^^xK5_ zckdujPViUZgkFg2RF9~N4;{qcuy0^V3RN7!YSvN{X&%)4!b*Hy=aX3egO8C0F@2>< z$YT(CH0x{zH6+D*KHe4;Y;Uphu(X@h#fh<(j~o8d2cNE2RWs;E5%X8$ zLjk?1SlsW>kc67otG~2=dGAW165)qTexxt%K z69B3bwpc$0#j?bep>{`~!`$TieoWJtb}^kMTD+f*{cN1~jC&|3te2PS?a&%Y3B%Mb zXRz^oQi|-=W)C>^Fw9fptPdx>`@q_SXP(J24D-6u|PaDPAdyVUH{f$=qD zUS9D>8#8lN!iU&e^n|0y=^{ofi@HPodVjtmg3WYB>y-Q4wR4nHM+lAboQDYJED6Bw z6)ri}K<^?!{>MxdzD2*Lm>-8+pwl5*?2NG{>NwE84CW2{E$~4?Mu(uN;yWe zrQMpZyzQTe8D^=jK;Inq9fso1fBuy?#$5&2_ai@FcHMWSaBa-wA=N?vHC~{!ma5U) zlt*~lt>qdmJ|;i z@pbDvCJr^fIPy)Z;3JcoKlM{Wo?y5HeR5LN^adwv1ul~PY)&HdS?5BZ(=`?dKa?ib zOgF&5iEhmD`G7AZ5@gKOG2K%~&er##1fCOU3w?;~{!Y5n(l)tYfV-(mqIc1TQy#1n z;GZ7z1({k`9yziuk*xm6C;c1m`hK(kPpsCU?RRt@mR-in$Y#z-iQ0|B9~_R7;9~0K zd9*d%5)-)9ivG1{B7baSO)39$`Q9z}+K9J1nb6W_TGYDuLu2u`0C##8eU8jhy;UCK zqHhl1SiJrH*Mu7ha%njUu5yE26VMv4x})`u5_I`;qE4CSBta|;=V>S{o+@bql(T6b zPryXU7l3HPtHSP%iZE?y>mr_TX+n)01`b(1pOH|Y5ZAdg#B`Q|n;5SyOs(PY=IH80 znb1R)6G)+(r6|^3HDY;T*O{zyWmarf%>_swL>ec^*7E9i0Z~ohL$Dt0zE?Vx)sx25 zL#h-M4oH?KgIdHPkIIn!G*+KIYbN%?xqs%ocw!Axm^;^#$Y36f1tuy$&>|WZ5KI?jO{Q}&fR_<|n{N=%7~G02C&QT?C(cFZ2!&q^Gi zan#T=`to3|G0v5Eq$)~H^?~Iy_+-}y^%x7xGy~bNV9lc^Lym2MR;wMp*4E4PIP5;c zICD~jDJ+ord*^n(2^TxAs!daci}^nOlJjq^(owgwIdce{@D zP;S=a9tt}3m+uQk3M5e?58R7yUoo(h2p(+D<)l)}Dp~Y>((w{BruC@NF5J4H#i?=H zPo;g+&|Dsg$ma-{+7f#*Q~B`urVLkD&kzS!6?D&|mm$`z<_Rae>eA2wDCfNRSftu* z=GN=vB?8E=L}W|HM^c4d6*)6F?efvd1g5ywTM)(TW6fYpFWF)h&{FdjE6boAHChk> z0xyP>cb<}pT9gRLU1K7UB6qAJVp>UBL=bdYCABu{UDQ5_Tmegk7=!a1xbLjBx#tCxKRt3F&H^QCCZGAB=K#p}vpi)@y zVscZ_>D`w?MG_qumGGUl+_ni~EB(ar?&S0*ksH@(2;OHaew|JxLpxK9y@GKb$J5bo z^E=wnv_qL^`}9X@`>u;E<9W|xuOIl0aX9heO;c}>+tIfx4?|hmKXJjPDKEG-Qfth@ z9*^J{X!;p75|!o4JW8Q@IjPOTaHi1p%jw;ATcU%#Y4=;krQUhEin0Z4={2fXV8i{s z!fS@*mc~%?fK~q2Ufzy6IJWE`BYhug2F(6eL?V0=FTRa4+yphp?1zNrhJ%;P~e_{v=H0Q12x4^h( zPcrO{Gmz20#i>>tMV!?L%ae0-A#$O^;oaA=9NkA(ag=)+#zPWsPs}LyYEf3smOTm+ zN#8qj7QWwnp|o6E@{W3hoijKlP0>=dr=3ofh>64#R|j@+oR8NFT7Rqh%Pe}L=wZ^o zSwt=JxaHNb+7{PL3?G@VdhA?_hEX2}N#UpnnWDL11NI#2gJJL6$&&cnac^eu$ywA8 z#yl$$hSVOe{<*{wIF*rJ21o~563d=s+GXr5Up@F~o+o#wYmQC{w~WIg15Q0Qh5O3;;7P32WoD8#b~aOGxd4l7k6~uQxi%vWxmg2 zu5!uW3PGALUea_gQoW>kB>OCh!n9YI_kEGaPRDn3-YP6uejZ5%dVNL|G<|?y4%>qf;i1 zd_AXnXKR_UM&-ZXQS85_^Mg{c>eGm)o)CPpAx?UpBZAGuz+Vz1unXoopbW|2jpN7p zB2Q23%c{Nm^~8Tm+3w@?8cya;?wh|vGkD7lg}+Qw+f-=g8%{+ibgGbd#5?`zan)&F z6Ndmm=btaAK_S{OY>z1=9}H4fHDMV<0|e0c5cj3N z!pg8mVj$$s%)=nmm=K5%@K9S|qkD`JvVMEt^c1y`+m2cS0t4ycBv@pZ z0J0fgx+%7Yl@RW@sf7iO-}O^Wi<}>P>I3E1N=m6UW~ky{{ydi+q+T&($)9Hqd#xzx z@2N5X(prdosqQr--F6Y_wmT$FXt1`Un0T0{0j@4U;_)iHuvZ8s8t`BTn(X^(^Q?nQ zVb`+BBC7m^@@$Lcu=F1ewrNC+9D|;;SWf^|k%)4~o5pe%B8fjzO*|jVsptCQMSt~+ z@pU}0g0a%=6WctEslln>KOdwGZ{3n@A|b4vsGD6aZxr&XX#{uUa<<0PvY0lZV(%lr z_rUeMQnqEA47;he#E`&=(%{t^w1d{E-uU`)=e^ zAEYE@wINbw!=#{H(`%PNpS9*pQJvn$&Fy_cfR>??DDoTP{s0`Rl}}&CRv=2#lT;?| z6(5+2I~?X2`quDXCZnVIt?lb7YSxQoK~?`Wlf-lVXOGrx%IKD`V8xh#Mp^DFhNG&d z(oS*1jJnH2t6VTdYR^~GdasW9-LR+eO`1&XZyqSIyHY8Or!H6)H;lWy?(3&8m~iQB zR3b)TfM5WTw{4N_{hjphy(BR3^2Dst-}}R=653S_*AML zwYDs~_=LFvhIbYNIGeHe-nL}z?0gyG@)Tb;NLUBP0r&BQ<*ER~*6$LPV-)`W!aWt6hoUo-a%?X%FlhJCUl&@t@`~fh>5!lFl7oPmD=S|*isaGmbdkox zvOJF$xGHYPyTx|?YMujPoz>j!e?1GZ7Cxm?ty-|XBJv0^{bfMrQc%e+05;0B)M)Ee zzRyp>=HFl7Qc)I&OQq~Au$qEN8lMue7*(&h7@An>XsADZ(a}jbLsE)vFV3`@Lv10@4g7P4D5ouhU9E7B8hv`JBXt=TW2jPtsf;hWp-JRLDK0YK;pVg7( zSi4Gk# zN6PIJ@;fHgG5$0`glmGeeTTRDMR+MK>gM==<{Ah#OMXSf^hxk( z_Gawi!QxAZ1-Kv!y|##6e_ih^W@$LMmu7qQ&oYbjGOJ<1)h~?5*fX72;YI#XP)^pw z85hTZEhf&fCO0RPkt~l(@-{su zY_#Kci3GT^(^0ScMQja;#c5$!I#2QR1vucpVG=|rdb!LOQ%qc9{K4X%Qg`}j)&uyU zIg`cuw(g%ql$tTg9H!qF2E@#7Zw%5Rv(R3Kvz%6pjxPzT8SM^O+4@BYs>?I>NCgVy zYIa3U)qd75Tt2jxw4nBFr-ix#N2($`O^LH6%NH6UjrWm`D}9aAveMRge(M*c=jZLq z#foT1gi5kL4%uDaNfr$!h1_+b31QH&voSx9ihtqVu#uZUci%~`=glvo}OaH(Hj1v@W={JgZesVVA?tEtOoV_1i za1t%~`AFELR!o4;EH*V`Jv&yAc+vYUgPO{F&TcQ9AH3`d^-q`AHbpZn3Z%(8@i)Gw zm~&GKt%4SJ*51-dx48gY*hn)>gOu_G%G&6J`)92H$pQ?1B%s1d^s1Ifw+N%kIpd*! zJLS^Vv$_UFrRNwZK{XkP5|ZWK`QI~U&tREuUo?6(@QSy^fn+Zm?~J57@4iJf`gU@8 zvT(YG!aU*7Y5hE)5y1nWS>OGNn_E!&WQdS{rNBC)i)b}58QfWtrM_SFH^BCBS;d?O zeb+|1^y4b7^dHG({5@9g9z|+4i$p!i8oD6vzN&|!y&v8RL_JE&*tpOND4{WXZJdTD z5X{31{}jw6Y_rc{`XE`5C9|T8K&2dO{%aptIqj*Sf!VP=iMAJB*0m5H;Jo}+nxn(v z{mVg-xo-Wl*H0*;WC8>fjDaqi7;Vu+nxkCpy3jp6)4fjG-57$aK`JBNxrcOvZ!xD4 zFyX1o=u>Fo6yJF)i7A+RLtTpVzZf>ypm|uay*lkpUR{B|d$c5a?iSjqdZdI)F9YXQ z2_ikotdJZ4QLfOt8L)S+0$d+>g)E;$f+%vIzfowwzp_0pdb0B6m5@hZWgYgAl;Brr4G#5FO6 zz(qT{C`u0eSPA91^N63TE=8mix!DuzZ=&Q@#Y&n!I^QK?14{JKI9kWz>FhdsO&L>i zI|)LV1;ghve-#ugG>KheKYVA1A%PQCl>i-Twjk_LLai2E6@~<@_N#84Xw%nTb|elm ziWK5R7$cMgx6F9+y#lhndif~=A@dh$f%^DHCivEMB@w5Ilr>8zX!0peZYUd&X+ zNy6V@zE?y|Bdc0VhMqMop(6PIIsPN_@%29=&qW;O}Bjs1MiazVMjcX@2 zKp5c|=#!cv9f!b2W#1`!n7GwcBZQ0u{M%T?Io}147fmBANrEz5=ze?7QMSzzGPx~C z9aboZ37AhI%Zl>cab%DGH0cGsZ8=yiiV$6NG=_DoB?;FokVDTIbc684vFN4&m1GLf z#0Nk;U6JPnr)-16CCg*|e6Ka!3fjC3T8l!lKdtJ={7g9_xj(f*UU!Tw5yro^Np$4H zJyp~%LHUI*?S0|WQy!q~JUNlgrL?nC{r+)cO04zABMGgNi?ktvEhcstmGO}W#awfc z<qF;#M+*^Ub{70DtVV=B} z=o(cg(;C?1U)!hUn{6Zx+fy>lwUP0OValrH8jV;Jy$pGx>QmR}#IL;`4MnqjBw!M` zEAY7wky)CPN9qW=zzhs{&wF~X79zrSfn}X|KA*x&8^m!25R@1#upP5ZVV>V@Mc@6X zuDixowhhPuf2yThfSvRaCEoF>wVb;xT|5o`r~f&-qo;JoMR8LZHk0~&!r$2&Y}^A} zi5|E|+vMq!tyKL9cK3zLGwJGhNaqdY%L-I~Es(;*?bM+`4@I zS)JcFcK~qT0G?1f?Y!AIW}to{g0D5)h?DN}`||`(c%2HhS;4vScfQEaHI*ptxBRz> z_ov?dy0j#q|7S*^Of^j>IhH ztkXR)qQqwAbcn1-&@rd@@7Ah^+~a~P-4CZ|&3p?mHSHC}+kgIe2v)0tJzo#n7gP!u zV0yKGlcl3JnWt3`YDI`rnp^6ar~$}qh7Rj>d!R3^e_@q87CCeY(tTE!Ru#aVkyBQT z+Eko{mmK-J$aJtDnD1XXQ&}3pQT7%yMftDmDj!_UeAnhrFj4ndM< zaovQNa0MEt2ceTMgA;Nbv#^;l&0uCm4*7w#*iY)Rebg9tIPdCMKeyog6u;yodd%g^ zc@;iq>-kOxybsw452=S80rV^DoFt$ngqh6u3KZc~T-?2Oj;VT=;F;UhOhXJx{iy_d z>e}xYRv6zEC85JJGUkw;9dPDmE>1yB$)|d6I~+9_@Mb2?zA>9_+?j-Xp1kVjwEy18 zm7#5lq@jLjUvCsYJv|^ZDI1=7AzunfTbNN?;q!#W{GwFsu_5G$U1DQxK9ji+^7Di$ zgIwhmxDdQ;#0hPat)vbx3*?`IC}m@y#s`)>hZz(Jy`RrqkMi=hx}H}_yBWq@WFf%l z1=)K`A2Y#Y%KnPB|05j%*Squ?MTviV-$RWn59xC(ESz9UttQVg27B1$Ai3dWF z25!MZnIzT?F~|#VP6W5ZoZd3YkS=+e+x$=!=P54by@>@!MffB&gc>Av^H!yzS;=Hk#VJ?c+O>iHv* zKRCpz9X~1yBcCY+6KsCabp7)y)sLNRF{?V7u~XE|_4gDecR-&qUTF4$hR^^oPm6L( zXhKpi&G5916xXsWjSXOrbIe7tupE*|TkE61PDoN1@%fyueQ#{N&&14`>|cyK6?}fB zX@Yvkj_T_2=mQ@D%uLXzKW#A!cu3lZ)mV!^@n+WJVRM>CGS68B;Q{4+-{9m>zMMY` z98=6eh9b8+)aE08>*a;rG?sC~WuL#$G$i;3kRSUkFq_1=fBYv)pXDZOqde~PUN>ks#8Ya(`;lsW-?l-rEpFy_^Jgu_x@(((; ze+;~R>A^fD3W4t;<*kuVFw=6e@*-LCTu7uFosoryx=IFaix`+1rt9KzOecQhO$lDu zM5oUP7}FfLskg!<;uKx5(@q?rX4K)9(;FY>hC0I=KyY^hKmKuo)&wWBn3r5)jJlMbEzqAvH-uayGaL@%ohVpMI?M~!jyYlMX4 znKT$;h1tHE%?@aU>-D(G9z)r4QWs_u?9Zm@4Y6lqiMNCs=mWf@LY*v-!>*x^B!S8N zlIO9MOMPUzn25-K0IK%*I8a@k9t+OaWosd%3)fi9&Sh5CP{Fc}D`bHLa)tNgDxkWW zt9$!`tDmkDK7J4y=VmPfKY-R0(x0YNRpB!Mcskn;7W{ppQ|+hDTS`mH6-QM38xP|r zWOPz9#x3lsxO10znF@FbDw&)#G~;#`e&Q7AYNnQAo1Zdl!OnPKbBat>UFu3UUl7eC zC$wLj2x1>OtJeqj$+XyPHYkSnok>foM-b)2)^XI?tHru|YIQc^&;_^Bn~_vJqqF|) z`T;Nw!ZI)pEmtGg@WM*=A(fsHMQztbk$3K2iSv?;=db*J%a>?Eg7dYU0QW7eUNn5* z3cDRg$L;GJc99afYP$A_mxr$;%-j!E0@m1IHCcpussZUtfXNT0_DQ7YNl^WDQRO4F zA#&4;{&dwWMFi5H?_|C;>lU*P$wXw0$Ap0oP+PY@><|u`?DLKeqh}ST-T*WZtMA~j(q7wg^ zYX>52X4E=FbH&9_KXRwvHSP#vsvF&K!6zdFFy{uB6o&-PLr%ri|37KFHo} z8Ll+%Nn}YgYT0wi9>tzE)eTTcj|pxNH!N3Rr7?$nE%1dc$m4;^&j+ao%_0gp#bv*3 zEl&jS7(-d8$lZz~Utse^36?)jK`S4Pft=iN#VL-okJHy?k|@xDjZY!$`8#ql@RN>X zXce_u`1hZ6pFh8AU&jWh4_B0$Mn7(cho{h+^fEpvX^ka1H;wl~P|nW;dZuh!EiTe# zhECCRM^p3}H1Om&0R(2>S&@QWNx%+xemLe*Km(IdCr0L==bf$O7t9*v)dY)D7#(uR zEOlMPj_Q7Zy4Y{u)L-d4J;g%omxq}sko!9Oi6s27u$Tx8BCps&7_o#;TPB|2x%pe@ z<2OiSAS5?a;(DP}iK{%U6HxuKE-^5VmWNZEGqvEO^c9}kazC&5%^;FcwXNRV=w)_RL)Smrw{fwqc3 z`pumP`6{VeUXF=@giV0EteXP2PL~b>odR2&63E@fx@ECA2M`qI%AvtL){NtPE|>`M zVi1wFN)U4^5p8U@=dTC0y1%{OX3bYSF+Z}$U?Z`gOR5V%jhQ_P#9uHCg@B6tqfsv4 zi{j`Q=rUEht*@+rW)c;evf7~+hEUm&E7>XjAU+zA${3I~Lw)N*$OWFQK{@IzWnYj~ z5)D$C1vSFPN0Dp4F254d%kTXuh~PEF&&py3?-`4)w9&V{^lBCwr8j1vWez%banlt= z3xNnRp&W6JJ1xM$TsfwTBiq<%ZDv}HwSKiM1l)UY(Fj}AycqaOCeRjfddUF9m(8mt zcA9C~Ci}8uysKcnepx`t^!JAf!+SB_E@7G+gN@~E4GP9_;#MPt-ikadBA3w# z4$^Jm@fFB@V$L$`01s1L+!`W*hvBo%j4h#rY_yenj)MG><=gDT0}Wj;3kz$Zny@$Y zOjDh+O{h=JU2@Q>F+!s?^_kB!=W}$fu6PDONoljkn3at%h{@pmt@62PJ zHAPw|B|d;C67u<04LJF0^{`p*kkZ(qMMT9<7%uoCIQCn0q53!)c0;V_OnIr=Qc2m8 zu=A68%zXfq>kO8ok?s_kcs9LUuw1(+LF6{}t($pT$D3dUKYS!vgT9r)-$Z^ieUsX> zeDCtD?yyUx5@4SYPwd@dco?yZb=q_Aj&aLRiPJNAL~mS5gc&(W#@?( z{@qi*I$NeU5F;CLBisy zr43%HSMK}2baaSh7*Qq;zqTvbRC1#8!a!uoH!Gdkii6-3> z#8U-0TUhdw4c?GJ50qCf(^J8n!FS&Cr@KB|k6TVGl#pKRsCJOgXr(17D6m0N{7?K8 z^Sko{JnV#ix_2naH7Aj_)pD+0IRGZw{%N9{r~75VQrEq+1fFg=!eVGVF3b9R%Zt$b zvnbVUm57LDaKhudj-T%g!>K%#A0MZ8tkXu;rYK}=xsODHi3~nN1+5bF7792Q{Y(@F zWy)tM!*|occ6v3i@xM+8_Eu3@fvT`d+6*vf3p4mRF2a~v5_WG*e!)0Aex+~+Q%c3t z`Z7QZ7qgTuv?4mfEd&fb_}zi)P);4jp^OoLDGC*jFfO40PRQY)TEu6x*bUXXuW=5guMsDIel9Sgl0SLgUfUV-DN@dr zuKV?BA2@70VuVoO(k%tqhM*Ng9acr~ClrTfM&MP*0AyNcijisZ4|NDy%*9INh=JlpJsj#V>pN&@tz6|JZ5$SL99hrx;#Lv*78|@48al?Z@9vyzi<39N5+vTmxHjl+SoeH$Y--B`sZo7&}PJYpp;F8?_xV+e8XE#<}6Cn zlAUP7)>p%gurVP3PFeMr@5bQ^z5Wfnh8r_cEcOsb7Cz8t4|6R zD0>eZ3fW!%D>i=X1Zw@X)N{RyUvgf6%kCGV&|yxug`g7C2nBKx8_u^h@wtYf7gI?+ zL>pV++?DD|4yZ49iob5@Em;zIcox_ita9+4GKIP=p zs2YK6isa7uweWugAWzpoLrNGi4Z}=4(nyyu$qM4WDB45@vUED zVG-SXr6{NCJp%WI{S<4TaWULAb_zU4GO}oe2Yzt9H&3gC1l(0n1LuW}`IV5Ca!9o6 zVKy@m;zVD8MmL=Tu4?S`3B@43_7>ziEGF#{N8CyH+dcjvDX2DslN&OzZ$M*~oJq#? z>^h+-eA;^1<$VX5J2XDquW4g)W{c6fVa$ijQ2S!@uVt0xMgl}};49h3 zP5ODHu$A!W_%}1T&s<)3MrLuhCe~W^(vrHe^o`l74}0rJkzvZD>WL zrAlk@ICSg33K{`Ax9mOFlOkCei?V!lO*1+a;x>0$%7(dYObdsF8b>yGJyWhOkP!+= zR&0rp0*cE^)3=B`l_i4!uZnBo<|o+JvGw=PMwNn|SG&cYAa4fu=rY$X5BcUA^DLAD z_HXB&LS(fguSF=9Kdx){!el+Y-Z5Z%EcqsR@cBnruPB}w|9N($=dxn-poa4Uwv6mO z1LtP76N}p}wJBm+hsoHL_NkPXTeTFxtfCzRXZ=j@G*siFXFoA z?hvwPV|flpA2;NtQ1>YSG-g@cBDx5!wzNxxZOzog_z!Xk9t$K+vrGXklhw!qqaM8L+mRhWR z0)ZfsXfdBWiyR^xS@gH2RwYc4b7! zvqnfY0k{iZnHe33tMRtvj%n~Q15$caY$r%+R;(|7u^i0%^{NxXBVLIJB{1-Gh}A}` z#D&eRYmPUH5k^$MlqUVS4l4uPI*i= z*~)TGvqA6OxNK9-Ak%k@ewsrCd-fSg^9M8H~oeLjKTr+!`z% zT{NSONo^)k0IE^0FeiiR9koC7VF(?JffD*J{QWNeLH)mLR zGT0^QdM`l!AH={=FBZf1=vcta8qL2^`ro!qd$(=cw=(Vj+&0BsNa4S|9Mg0-zAMl4 zpL@pKo&1mjSTTS>)BPtt$l<$_416~MKL1!w7{^^4=D)rC_5ZLKmSqk+!+3-L%O`iM z7dOJB5&lDgU1==6~Ai|B~*# zf&ExcNB`W?qj-!9lr~^KQT5L)_1|sDDzwq>pRXhB&ITG@tG4?u^tHm!mqobSxZ|I^ zF?^T5dUJ%R|L4nQ62?wJu^joUV+NszG<^YtDp1G9OkBJDF_b=Jn|Ov^9B@y|Xx&O3 zVTF(T)E%S{Ggi-q}nrKGM{C2tY_e*h@HA>;r6 literal 0 HcmV?d00001 diff --git a/static/img/user.png b/static/img/user.png new file mode 100644 index 0000000000000000000000000000000000000000..aa2d3b43787c35c051abcfae87b2555bf21fa0e6 GIT binary patch literal 4793 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 V3Flfy&hhyH+Uf>sl`3}6{sRV>9E$(| literal 0 HcmV?d00001 diff --git a/static/img/userHL.png b/static/img/userHL.png new file mode 100644 index 0000000000000000000000000000000000000000..ffcb4fc0dbb112b9e13867b61e64f4ea3a65fe94 GIT binary patch literal 4214 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 LRIgFTDeiv&xhWP7 literal 0 HcmV?d00001 diff --git a/static/img/weixin.png b/static/img/weixin.png new file mode 100644 index 0000000000000000000000000000000000000000..c6f6076260e3688aaefaa3ce1ebe3ee3498d3ef9 GIT binary patch literal 2421 zcmbVOX;c$g77qKOhyg?plrkWSP4)zmNR%Z+5CUO`MwFsbArZ2W1PRziP#Q!)pb<=? z2(B!~w78&6WDv0h8=YXg0wUl>GYTz=O^b7If{HUgJpE(poT~Tkd-uEdyW2Tczz$h& zVZOv1fk0RU1~9^PD=_<-8tcB&tgK1hVlVTLl|_iSvJ6lHBYZfbBp3)3fXQ$;401Bl zuESmkgn^VF87qrr1=Apr00YkIVB`X^4vj!~t&@vECNJsslX+r^g4jmOk zX5m<3KbXf4$dbSjSs{^7RtiMrpw_JgyyP^U0Rb!n0l6SmD5c5isE>AOy8Y}i76p7% zk)_a4pGd{B*npo%0s~|W84cm^B*2r3!ISYM3f>(c;P6B&j)=t*(Rcz4N2TG(z~=|0 z^CsbNY2gg!XJ0yrj^fE=Vj32kk&%JPAYw$4WGtRarDAaeEP;U5X`rQ$MjPO0x^sA#jsHNIZ?WlVdbD0i^t%w0>NxtAGM{j zaQMG8zN#&a%oM}ea9Aozmq5CDaGmGCy4?M}qgh2A8(OG@uPX|e$`C>60$3;uWYAH% z8w`ifp%Fk3hog`wXdHz@L6bmFE*j)eh-jjx2S_5~VLXvan6vXWyg$>I=}TZx@dP3R zkM}3}l5q@wUn+s==Rx)*P?>YsK%rCy3L$vTH(%%bGnVqVSel;%24x~iq)3!H*9B~z zNG6i#S9#%&RJKHJ$(>ZfTx^|r1ewhQE@MV%

BL6 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 literal 0 HcmV?d00001 diff --git a/static/templateHL.png b/static/templateHL.png new file mode 100644 index 0000000000000000000000000000000000000000..4018448570ec27da1d0ab57496f094ffe028eab0 GIT binary patch literal 459 zcmeAS@N?(olHy`uVBq!ia0vp^fgsGm1|(PYdzmpXFi!GxaSW-L^Y+$8ujoXH_K)hW zvR2c?=5RGlp5Xd^;o{)Cu1B&Bl=y;X-D}!@!OE&a*iTRIk!;DE1 zQ(ITC?87r_n>qfUW;UpJP6DC5XBK=saxvx7!P+xYjQi(R=JLpt?fP}z@v)lxt{wf~ z(^eY%=D)#v_qch&{)cBQKbUX%XSU&1*$$zPj6Z^B%>TOc=o!rd*{J$vCztKT4T8)) z5(!5bl-VQ<4|FiP@vNx1F>kwYk@~c+rwZmP*UkUVYg1^={zdmu$IJcickPjS9et!V z1+Kof+k#C^Hoo_(?jxsHpF5vQ?BLmZowfMaqAbZ9nrF`6$}ucvk7>QOe?3pQQXNZO zxLCdRpV<-@o_Xe!?yEUnBZRPgf$x!Z=hxl+*Rh$|u9I=9@M+!4@=#2R`TAztbQ#C=+#^CAd=d#Wzp$P!7P{$Sk literal 0 HcmV?d00001 diff --git a/static/text-icon.ttf b/static/text-icon.ttf new file mode 100644 index 0000000000000000000000000000000000000000..69772689e05fb74224fdae19840fc21660c13520 GIT binary patch literal 3512 zcmd^Cdv6=Z5#QN6-jR3YNfe(FWxkFkWlAL_iVyh_%64qYGE&Et9kqoW$uvbtl*9)p z%9Z8BRT{WSipI$Y2#lgY+&}8nMvE3mP&=v7M~Wsz5e0=&pn-!HjElx7`fyPcCe_&^ zWjl7hL6@4_nc11&&g|^&od^&@WU@v$(m#6Ssl8VkKe|l_454=KlSiVlU26wQC_jVp zM7EGA&#aP8l>deF>Fna^ncipA1wuHKg%9U)nQ80fPmm`!k&<($(4Xg1$o~{6FjuIq zcz?LDfxaK2>|HEnGve=bhtU5f${mHwN*TJyA8_2s#*3LkE`7A|EFsdngwR5{v{W5h zAJP$GV(~poFm`TjV~rf=FK=MuuQ1JLnqJeO_D^?yZJBD@b%)5jW^m)c_7%pk9$mlA zU*TRvQBSBgj3H>!Z&AY<(@OXw1f$m)8<&Wi^by!M^2AZJYXUbtVKG0O(R`U5;20YP z)Bq7Q4j%+~JG@GCL{DF$@1gukvxmQu7~s5==s0HfXgfT!f12#B8ER9_{4w_D(2C84 zjZJlrI9wMdU%szH5!VnaPB3~+4KKEQzkynY(uX}}i+Y|+psZlzln6MZTx+XYYujs6 ztd0-JlT3b~0s7qkvDtXc9B^hzL_}t*@c-V7+5$|smH}6#W@r+tO-*hRD`l;%No?=b ztW9Eds%>u)t7mPpNo=pyrkcc78rwLTgV*4{bcKG(&7+Kn8{g*s&J~D}I7xtf0qfxx zY-X!HmQ0xAK~5l|oj8&t6(n2)LTO03!Jz=B05gdPDUlV$t|;<)S0>U51; z>(}n;ba$^cpSJGqaCbNSN|77CmlQ>Uu&lsEUE`Av)*GLoSLgZ%(0O-)uV1@b=lS~8 zYjye_Fqd#Q#)#Q%T&H)qJuEi^4H*FX;N8ZM3a>Ygal0FP8hibi)N3q1K|8^edk$|h z2l*2D0l7}zM+i4nXao`%zCzs;y9jU|YWG0OAv)|HYHI_b4IE+=M4^qUQ3xUzN`-<^ zniz)UFoaT$RC1V8gJ>p*p`hw-0|h+HOMxx87#^@YM1ggKv0=d84Lc!*p2?I$Q>7uw zfb6McC=o~aU?`Pj9YexC0;q|gbsFrVf?#e0RxJ@oBa*04Dtr1J#@?YJFQm2&91dDW zCXXk89vgJ&{XUPU>>Re(P132e2Fct$>^S81sv+-I)gS2VakDY2ES)(c8J(70&Wd|$ z&sJYzq|L#1_4j5Ca=URr;>3Y1O5S8Po8}Z}Qs4~(Mzd_l^e0@rRT))moF^KdG)T;p z7gJW_j3P_aY|6`yd&X12u!plX{$?_`-Owfm9R?ZfR*~1YNno~^EL+X8AhyHD;2j$3 zm7V?WZK*wwI6gVr5j-5*cMN>T1Cng+NIS}2f5@+T)PT?9t~h%;EOw*3wkpVW+px3j zQG5IWzpD0yyhZ15yHyrecY|4(F*=5H7@W)abR^;CY#6hZ_e8=OW2ZD=6b45B7mOzJXbgJC!5jqM|fjdw>iyM9@hv>VGNbNv_?+)o}2bqJmg*JCN0Xz7rk3%b1? z@V6VRcpULmZhVLPm^(pKJTv%S)A{gpm~mtI++Y<%pI;Eocv5_^WD2!0yTgo!MomC6 z=D;<9K}g0!LB9y}R{b~WBa|LVLz)HHxE|=Iv_C)-{uqF{%MA3$KYj-1!i(Xap89|0 zVaaZH>~b_-J^|xty5q6&rcqR_|1uDT0TqsFD3{XXF#ZmFGZYFJ!i_g!34Ls~#>?!C z;QM4_4c~HW$Q$r(w-77YLK5T&JSVCf_iQ}q7j&P)flmP~t3lkHY-{^4UvmU3sP^G5 z4h2K1Ke)LH4*Hcb*p}Xge=xhrHKa|B+jaM;)IorQsfDayv0HUn8XFp;bj%82U;XWN z{fQI$_Em2fAnfJ7@5BBt9>fZVJ)h}d1rh4MK%`3sSvFjvV=1~bb+EqA+Y6?P7fsOX zr8}D_EO)#?HrBW|xia2%J~BXdld=1?+o@d;ST);Vt6*4D%+2O=L_ob)QcQZQO-(#- z8;1Ns^ETvG>qeIfpt{a-=NA^vb7wW_23A_$Z~*}j=0d>L=y9p^p9q0K7tXo@sJYlg$v*$Qytj{ek0$%}z7a?S z@UOW)&v75&*MLfPkT2fPadUsRDyda4o@}OzmybOa;9_aKiGrd)Il<1ZE_VM|1hwhI<*&iRUujDe-+_d-P zX>UGTD$bOORcVtM&&@6`W-6QFW;wOQ&XI)#{9Qrcx?+ zM-VW#xLER*E2a5dwi=nMR?9o0Q8p3NN3x{?UK)>M+BuRTReVkpFF8q0<1cs;aA^nedjiOaivwS$7C2|U9i(!;i zjLC~sL8Jn5BdrK?7|9~?UQ*V^<`E~0))6wNd6n__MDe$o(WZSw%e25Y3fpn4vHuA^ zujzpT2R!IN01@DdjrX@u*4OGxl_ya_xREUZc5JW;z zvH}VSi39;s{)kjnpoUdjNUMsbX_JO3(0sK`Dv{l?^}HE-v&q_?8GG#ce(xQ0#-6Qr z?fHHm_s#lBtF<)uo_o%@zjr^+2f`SZY&NR`z@hO!vyw6d}iYBuq$h~^>yEt)`! z2y`<5z7=)`*^W{Lp#LMl^Aa#9@B$H@H;lO-ojQeeJ36$RrY8Zgw6bza(#;PM(1!rv z7i=8xUiz;Rz_UpBb)QfA`pJ_gf848qXuo>~0Gg&P65($F&~E^?zH;FT0sJo#oKqC( z3-j~yOTsaD07F6pV0n3YLD$Vs5W>e0;2mC2=pG(_fPm-Bfba2zt&!cHRFg^o+{Q%NaBuRghp+5PV?kA0J7Qa zEe6432=Fsb3oCMe1n@sH!Y5Oy)OjcQbPNDQBx_pkEFjzu0J4)pdZ;f05I(CWlV=gp zaDs0~0Kj+i2Eo4~z|T1$l-K*%oeh55iMI#a0ibEiA2Z2(3=t;0J}^%5PXyZ%N}p8K z`Ez#mYa0NTmI_lKl^(rOclcHf8Ug$pn3JDcSeV|lisoKAwgBMr<;&q}z40{!xWf*n zZ#0@j@N_8Xzx(*{XrfE(xppt^@jd!M0kr;%pKC%uK^;u7!3H|f8xZ6 z6)W^(2>@1BR;HV}@e%-}tzhbqMt2Pmz>;5)&zwAYvM{QyMh3v@>gvSycKI1VJUuEi zhwTT@0MUyR6Os4N&dzQR&}v`RkpOVs$zLAD9&u;@ z>|X6Y0SLb`9Q)3-l4S*aiVqYY|F3|e_(75+Fio@d9wtfH`dil<(A0I%n>y%56Lej7 zj>(~WqOYo{)IGyKBn=IKB`x~}1o+LN`L?;CB*_p6_#xmALLd+vsyD;Xp;oU!wOR%K zTi8PI&*^mP4~F4yC;((K%Xb5sUm2!DyW1#=0^#rkgo4&uhF5Dlt$`0sKqzGGz+cZZ&jyvMkU-b~3N5D7N3RT`=Yaq~ zM5t-m7ew0eBO*k?M<5c33?lc)b<5>4lq*~8RWvd!s|fIwaav7&V37U5Kmb_Mw1*Jz zL8}-Zm5$G+z|>?6c$4Qw;eEkosR+%cIQs(vI=i5%5A~~$z5$?V+U*4RGyq8b61TIS z-yeXf$!Kdg?`GlC!)9p%8VzAQ!%PX`1F2N%nSS)r7Xa9XFO$u^hyXv^4^g}8@UET* zpQnEj3NHf;f_l9s0y{tiFQ?Vyt%%6y+^(fB4K8WgeF*q)FJeyo9t?(IYEn!)(#_H) z)M}Q$*bb#u0{YB?sy@=IaZdoOtgM`9G>r=)SoH9;AB#@+lF8NIiyH+YmIET%3iy3* zpPQSz)J-8h0g%zOCjjsxu47O=`MvbOdxAnSFUZ9aolC1~SD%Zn0MIn; z9s>N2UP3$ZI}g6k=Xav3k^5*g8c^JD&DY}^{t@U7RaKwuBve-bWHjwr0A&ArS4$)u zfr*J$Fb~g^t?d$2DrEuqrT)9`sPO4*(f0 z%h9b|x9$xFL#_M%aVW)N9vaPt>!J|Bj~CLZQypgjQ8s_f;Kalch=jep{=mtih%dJ4plZcipE;@eB)5~m2hLTD1;~k^bZTFdfz?( z5RsD6vache5DPCK|JclH910tZ6pEI4bB(4FqARMJnnT2v70cBbK&0uP89O?A(`bSU z)S4fNcq1rE+50|l6#$~_{#i-<@)w^;h@vk`_*h+gQ;3rQ3$yn$a1{UpqX2br z>;`MHgvXP~WU)2iBE9=FKY>61qElj9{tOC$;zkh~4KZv6cQ$`JjwCxXfTlfyfPXls zP&n8| zp;I>gWFydVD*3`X=z3Eqk@#JJ0q{En_&Jd{8^?>F_57+3mO*>R8G(Kmmo)8f5b)1L z0sy;w%_feC#L`H-umkbx+8ZO$u%j{G2x2Ca{SqL2)Q%2Dp&6e!3bO33X)s7Cn85gV{0gWc<>nn;uZQ4W-{8FfOu3i=Emtg zfSpB~0@wuZ8)KpzigpXwW|G6aCE`LDCyo4Vh-3?JjW9%47yvay42&$L4FuRI#I5*0 zR*BQpn@}jMTSd-NIz&_#8UT}%QxFPnmkBAu+tk)>8Gl(dm;|}I^=OReRtKc@nJpCu)M?JR;h(Gwvc{Rcdc`1E|-fL zCh?=S=ge^30)cMmu(44TBrJU2?IK`g!|Q;-|uhT7TQ^aw(#jga3WewtEm(F!o;;Mgair{*@r9#R3-4M2i(TjDQ?njH8U%QAD=z?N{Eep<-LJKqh+;5#G`-LDA~j8DgHD zJJ`v?!zGheQww|f7dBk{uu5jPa=RXj_|}h|JiJ=^3KuU@!iYf??L=e|VcooXD~lwA zg;Xk~b)5nDM^RG7^p@$`8cswQ=SW|C58%CWaN;PTlSU1qWGAhMOIsUIt$O6ycUOs> z5=aW4Hm)BK`29O!<(x_;&LLlR3_rw){MlVk1E!7h(vdJ6j=&KYvWhYY*ypbzNG6bO z0O*!J))T2?4-$^OhI!!K_8Q_@ptQ9m@T=gEsbgDr0=e9sXwoC#-i(R>XN9S_*U-ob4D$H}Akp~p*w6Gqk>wU&`6+YdNhh+y0AlNV2(Jo$R} z{Xrj`Eos_)2>5UxRV}H)8N);2FoZ)9VW#@y`XN5|&>gcI~fIhRJs*m*IyXO+X z1c*q=Xt@^<;oZFm4*NT==Nu+J7z~5o=dG{3UzwZDCRA%>V9y~2hFygKzL!oV&mdyY zsi!Xhv^Ipx%cs#WU$mNO-pz9)5FYq(i459HN2Y1CE|S=|grkUBT}YPBEX>cp)DPXh z0nh@0ragp!5B5X2R~!;-Ckgk@o;?0z`zGmVF)&&kQqY zt!X|Ggit8r`K;i>$lt9^Yk8=ap;jMZc_4a8Ra3VjV&Ch_Kr;XfkjY$50ybXZ?5_PP zfir=Jf)NOXLclxw!_rv;d}7#H9?FA;m)`*L|8zQiJU57b2L=EW?>EaB2YZZ!dEmvl zv>8M>Zq{vGE>$bQfhKs*(6f;Ak#u_gt3B&oS79gs?Cb|}4$HVkGGysT5*0R}u2f(}A9rGH`L7vCq{635_?QFw9;1u+gO8MF&B*E8I zHF@_S>;7IohXw!>xpN-482~h*3TS0 zI{iZ{da?`v%*^KI<|#zwRasU-Rxo!+<5~^qx?Uk_zSD{?|LVrwY9;6Ml{rPB^NONO zSWWvzrq^sXwwq1qZHYwWvXy$UbOvZMRw|Wd3=?1T`~2gP^217v4?(L|tFOwkxfqQ` zEe}3u3jo?OuB{cm9}Y)u8A9g6Caq_9fNE{~%XQbp?~rD z6mMsP8gz7f)NeNRimq2b5s$~eVlnBif?ym$Gfk!@NfkHZ4rva@+}1B69K<}-deG|L9O0sEF(zw#A1;jxW%!n0B8%nx|;tz zpU?Mqet#h5mLi<&x7lnIbkhGQ9*ce6$$k&&O9%k$xi`4i@Av<;qWH!V2)f=ZRvYy{ zJ(iex%CwgmH^l*RH0D#Frsq5EX${5*`_#f z!)kH2onaUaUDsbU&BobyJpQc_$vM(o=oz4s2J-oh4-&w=vLwG(QIv#RrsjNv)Ai=6 zVHn>r4Em?p+1Pg+88r(#@gxBD%Ae2YCyC@w0l=?IvUEyOlu22VZIR0`4AKp~WSZs$ zGL0`9M)T2Q$BvaP91q7y*`g@NrMRxcVzKxx!=SrB!rNp?emjE1_KJQ)Nk#-203}5B zQQ2`)*>&GGiHMyk4I<)y4FYqGOyf1vr0>cyJ{gO}UUgeGtNZ_dseLjVuJC5l00000 LNkvXXu0mjfThfl& literal 0 HcmV?d00001 diff --git a/static/uni.png b/static/uni.png new file mode 100644 index 0000000000000000000000000000000000000000..8e3a80f4b84ca9dfad7bc1ab724810a1b3be3ba8 GIT binary patch literal 4162 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 literal 0 HcmV?d00001 diff --git a/static/uni.ttf b/static/uni.ttf new file mode 100644 index 0000000000000000000000000000000000000000..60a1968d08cc6056c70b5402b2effac43c6f96a3 GIT binary patch literal 26164 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 literal 0 HcmV?d00001 diff --git a/store/index.js b/store/index.js new file mode 100644 index 0000000..883f933 --- /dev/null +++ b/store/index.js @@ -0,0 +1,20 @@ +import Vue from 'vue' +import Vuex from 'vuex' + +const modulesFiles = require.context('./modules', false, /\.js$/) + +const modules = modulesFiles.keys().reduce((modules, modulePath) => { + const moduleName = modulePath.replace(/^\.\/(.*)\.\w+$/, '$1') + const value = modulesFiles(modulePath) + modules[moduleName] = value.default + modules[moduleName]['namespaced'] = true; + return modules +}, {}) +Vue.use(Vuex) + +const store = new Vuex.Store({ + modules, + strict: true +}) + +export default store \ No newline at end of file diff --git a/store/modules/user.js b/store/modules/user.js new file mode 100644 index 0000000..30bf176 --- /dev/null +++ b/store/modules/user.js @@ -0,0 +1,42 @@ +// 上次启动时的用户信息 +let userHistory = uni.getStorageSync('userInfo') || null; + +let state = { + /** + * 是否需要强制登录 + */ + forcedLogin: false, + hasLogin: Boolean(userHistory), + info: userHistory + }, + getters = { + info(state) { + return state.info; + }, + hasLogin(state){ + return state.hasLogin; + } + }, + mutations = { + login(state, info) { + state.info = info; + state.hasLogin = true; + uni.setStorageSync('userInfo', info); + }, + logout(state) { + state.info = null; + state.hasLogin = false; + uni.setStorageSync('userInfo', null); + } + }, + actions = { + + } + + +export default { + state, + getters, + mutations, + actions +} diff --git a/uni.scss b/uni.scss new file mode 100644 index 0000000..845142d --- /dev/null +++ b/uni.scss @@ -0,0 +1,76 @@ +/** + * 这里是uni-app内置的常用样式变量 + * + * uni-app 官方扩展插件及插件市场(https://ext.dcloud.net.cn)上很多三方插件均使用了这些样式变量 + * 如果你是插件开发者,建议你使用scss预处理,并在插件代码中直接使用这些变量(无需 import 这个文件),方便用户通过搭积木的方式开发整体风格一致的App + * + */ + +/** + * 如果你是App开发者(插件使用者),你可以通过修改这些变量来定制自己的插件主题,实现自定义主题功能 + * + * 如果你的项目同样使用了scss预处理,你也可以直接在你的 scss 代码中使用如下变量,同时无需 import 这个文件 + */ + +/* 颜色变量 */ + +/* 行为相关颜色 */ +$uni-color-primary: #007aff; +$uni-color-success: #4cd964; +$uni-color-warning: #f0ad4e; +$uni-color-error: #dd524d; + +/* 文字基本颜色 */ +$uni-text-color:#333;//基本色 +$uni-text-color-inverse:#fff;//反色 +$uni-text-color-grey:#999;//辅助灰色,如加载更多的提示信息 +$uni-text-color-placeholder: #808080; +$uni-text-color-disable:#c0c0c0; + +/* 背景颜色 */ +$uni-bg-color:#ffffff; +$uni-bg-color-grey:#f8f8f8; +$uni-bg-color-hover:#f1f1f1;//点击状态颜色 +$uni-bg-color-mask:rgba(0, 0, 0, 0.4);//遮罩颜色 + +/* 边框颜色 */ +$uni-border-color:#c8c7cc; + +/* 尺寸变量 */ + +/* 文字尺寸 */ +$uni-font-size-sm:24rpx; +$uni-font-size-base:28rpx; +$uni-font-size-lg:32rpx; + +/* 图片尺寸 */ +$uni-img-size-sm:40rpx; +$uni-img-size-base:52rpx; +$uni-img-size-lg:80rpx; + +/* Border Radius */ +$uni-border-radius-sm: 4rpx; +$uni-border-radius-base: 6rpx; +$uni-border-radius-lg: 12rpx; +$uni-border-radius-circle: 50%; + +/* 水平间距 */ +$uni-spacing-row-sm: 10px; +$uni-spacing-row-base: 20rpx; +$uni-spacing-row-lg: 30rpx; + +/* 垂直间距 */ +$uni-spacing-col-sm: 8rpx; +$uni-spacing-col-base: 16rpx; +$uni-spacing-col-lg: 24rpx; + +/* 透明度 */ +$uni-opacity-disabled: 0.3; // 组件禁用态的透明度 + +/* 文章场景相关 */ +$uni-color-title: #2C405A; // 文章标题颜色 +$uni-font-size-title:40rpx; +$uni-color-subtitle: #555555; // 二级标题颜色 +$uni-font-size-subtitle:36rpx; +$uni-color-paragraph: #3F536E; // 文章段落颜色 +$uni-font-size-paragraph:30rpx; \ No newline at end of file diff --git a/uniCloud-aliyun/cloudfunctions/uni-analyse-searchhot/index.js b/uniCloud-aliyun/cloudfunctions/uni-analyse-searchhot/index.js new file mode 100644 index 0000000..1f16dc2 --- /dev/null +++ b/uniCloud-aliyun/cloudfunctions/uni-analyse-searchhot/index.js @@ -0,0 +1,49 @@ +'use strict'; +exports.main = async (event, context) => { + /** + * 根据搜索记录,设定时间间隔来归纳出热搜数据并存储在热搜表中 + */ + const SEARCHHOT = 'opendb-search-hot'; // 热搜数据库名称 + const SEARCHLOG = 'opendb-search-log'; // 搜索记录数据库名称 + const SEARCHLOG_timeZone = 604800000; // 归纳搜索记录时间间隔,毫秒数,默认为最近7天 + const SEARCHHOT_size = 10; // 热搜条数 + + const DB = uniCloud.database(); + const DBCmd = DB.command; + const $ = DB.command.aggregate; + const SEARCHHOT_db = DB.collection(SEARCHHOT); + const SEARCHLOG_db = DB.collection(SEARCHLOG); + const timeEnd = Date.now() - SEARCHLOG_timeZone; + + let { + data: searchHotData + } = await SEARCHLOG_db + .aggregate() + .match({ + create_date: DBCmd.gt(timeEnd) + }) + .group({ + _id: { + 'content': '$content', + }, + count: $.sum(1) + }) + .replaceRoot({ + newRoot: $.mergeObjects(['$_id', '$$ROOT']) + }) + .project({ + _id: false + }) + .sort({ + count: -1 + }) + .end(); + + let now = Date.now(); + searchHotData.map(item => { + item.create_date = now; + return item; + }).slice(0, SEARCHHOT_size); + // searchHotData = searchHotData.sort((a, b) => b.count - a.count).slice(0, SEARCHHOT_size); + return searchHotData.length ? await SEARCHHOT_db.add(searchHotData) : '' +}; diff --git a/uniCloud-aliyun/cloudfunctions/uni-analyse-searchhot/package.json b/uniCloud-aliyun/cloudfunctions/uni-analyse-searchhot/package.json new file mode 100644 index 0000000..6005add --- /dev/null +++ b/uniCloud-aliyun/cloudfunctions/uni-analyse-searchhot/package.json @@ -0,0 +1,14 @@ +{ + "name": "uni-analyse-searchhot", + "version": "1.0.0", + "description": "定时归纳热搜", + "main": "index.js", + "dependencies": {}, + "cloudfunction-config": { + "triggers": [{ + "name": "analyse-searchHot", + "type": "timer", + "config": "0 0 */2 * * * *" + }] + } +} diff --git a/uniCloud-aliyun/cloudfunctions/user-center/index.js b/uniCloud-aliyun/cloudfunctions/user-center/index.js new file mode 100644 index 0000000..fc48912 --- /dev/null +++ b/uniCloud-aliyun/cloudfunctions/user-center/index.js @@ -0,0 +1,210 @@ +'use strict'; + +const uniID = require('uni-id') +const uniCaptcha = require('uni-captcha') +const db = uniCloud.database() +const dbCmd = db.command + +exports.main = async (event, context) => { + let params = event.params || {} + + // 登录记录 + const loginLog = async (res = {}, type = 'login') => { + const now = Date.now() + const uniIdLogCollection = db.collection('uni-id-log') + let logData = { + deviceId: params.deviceId || context.DEVICEID, + ip: params.ip || context.CLIENTIP, + type, + ua: context.CLIENTUA, + create_date: now + }; + + Object.assign(logData, + res.code === 0 ? { + user_id: res.uid, + state: 1 + } : { + state: 0 + }) + + return uniIdLogCollection.add(logData) + } + + const getNeedCaptcha = async () => { + const now = Date.now() + // 查询是否在 {2小时} 内 {前2条} 有 {登录失败} 数据,来确定是否需要验证码 + const recordSize = 2; + const recordDate = 120 * 60 * 1000; + + const uniIdLogCollection = db.collection('uni-id-log') + let recentRecord = await uniIdLogCollection.where({ + deviceId: params.deviceId || context.DEVICEID, + create_date: dbCmd.gt(now - recordDate), + type: 'login' + }) + .orderBy('create_date', 'desc') + .limit(recordSize) + .get(); + + return recentRecord.data.filter(item => item.state === 0).length === recordSize; + } + + //event为客户端上传的参数 + console.log('event : ' + event) + + let payload = {} + let noCheckAction = [ + 'register', 'loginByWeixin', 'checkToken', + 'login', 'logout', 'sendSmsCode', + 'loginBySms', 'inviteLogin', 'loginByUniverify', + 'loginByApple', 'createCaptcha', 'verifyCaptcha', + 'refreshCaptcha' + ] + + if (noCheckAction.indexOf(event.action) === -1) { + if (!event.uniIdToken) { + return { + code: 403, + msg: '缺少token' + } + } + payload = await uniID.checkToken(event.uniIdToken) + if (payload.code && payload.code > 0) { + return payload + } + params.uid = payload.uid + } + + let res = {} + + switch (event.action) { + case 'register': + res = await uniID.register(params); + break; + case 'login': + let passed = false; + let needCaptcha = await getNeedCaptcha(); + + if (needCaptcha) { + res = await uniCaptcha.verify(params) + if (res.code === 0) passed = true; + } + + if (!needCaptcha || passed) { + res = await uniID.login(params); + await loginLog(res); + needCaptcha = await getNeedCaptcha(); + } + + res.needCaptcha = needCaptcha; + break; + case 'loginByWeixin': + res = await uniID.loginByWeixin(params); + loginLog(res) + break; + case 'checkToken': + res = await uniID.checkToken(event.uniIdToken); + break; + case 'logout': + res = await uniID.logout(event.uniIdToken) + break; + case 'sendSmsCode': + // 简单限制一下客户端调用频率 + const ipLimit = await db.collection('uni-verify').where({ + ip: context.CLIENTIP, + created_at: dbCmd.gt(Date.now() - 60000) + }).get() + if (ipLimit.data.length > 0) { + return { + code: 429, + msg: '请求过于频繁' + } + } + const templateId = '' // 替换为自己申请的模板id + if (!templateId) { + return { + code: 500, + msg: 'sendSmsCode需要传入自己的templateId,参考https://uniapp.dcloud.net.cn/uniCloud/uni-id?id=sendsmscode' + } + } + const randomStr = '00000' + Math.floor(Math.random() * 1000000) + const code = randomStr.substring(randomStr.length - 6) + res = await uniID.sendSmsCode({ + mobile: params.mobile, + code, + type: params.type, + templateId + }) + break; + case 'loginBySms': + if (!params.code) { + return { + code: 500, + msg: '请填写验证码' + } + } + if (!/^1\d{10}$/.test(params.mobile)) { + return { + code: 500, + msg: '手机号码填写错误' + } + } + res = await uniID.loginBySms(params) + loginLog(res) + break; + case 'inviteLogin': + if (!params.code) { + return { + code: 500, + msg: '请填写验证码' + } + } + res = await uniID.loginBySms({ + ...params, + type: 'register' + }) + break; + case 'getInviteCode': + res = await uniID.getUserInfo({ + uid: params.uid, + field: ['my_invite_code'] + }) + if (res.code === 0) { + res.myInviteCode = res.userInfo.my_invite_code + delete res.userInfo + } + break; + case 'getInvitedUser': + res = await uniID.getInvitedUser(params) + break; + case 'loginByUniverify': + res = await uniID.loginByUniverify(params) + break; + case 'loginByApple': + res = await uniID.loginByApple(params) + loginLog(res) + break; + case 'updatePwd': + res = await uniID.updatePwd({ + uid: params.uid, + ...params + }) + break; + case 'createCaptcha': + res = await uniCaptcha.create(params) + break; + case 'refreshCaptcha': + res = await uniCaptcha.refresh(params) + break; + default: + res = { + code: 403, + msg: '非法访问' + } + break; + } + + //返回数据给客户端 + return res +}; diff --git a/uniCloud-aliyun/cloudfunctions/user-center/package-lock.json b/uniCloud-aliyun/cloudfunctions/user-center/package-lock.json new file mode 100644 index 0000000..1dbe97b --- /dev/null +++ b/uniCloud-aliyun/cloudfunctions/user-center/package-lock.json @@ -0,0 +1,14 @@ +{ + "name": "user-center", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "uni-captcha": { + "version": "file:../../../uni_modules/uni-captcha/uniCloud/cloudfunctions/common/uni-captcha" + }, + "uni-id": { + "version": "file:../../../uni_modules/uni-id/uniCloud/cloudfunctions/common/uni-id" + } + } +} diff --git a/uniCloud-aliyun/cloudfunctions/user-center/package.json b/uniCloud-aliyun/cloudfunctions/user-center/package.json new file mode 100644 index 0000000..7b569dc --- /dev/null +++ b/uniCloud-aliyun/cloudfunctions/user-center/package.json @@ -0,0 +1,15 @@ +{ + "name": "user-center", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "author": "", + "license": "ISC", + "dependencies": { + "uni-captcha": "file:../../../uni_modules/uni-captcha/uniCloud/cloudfunctions/common/uni-captcha", + "uni-id": "file:../../../uni_modules/uni-id/uniCloud/cloudfunctions/common/uni-id" + } +} diff --git "a/uniCloud-aliyun/database/JQL\346\237\245\350\257\242.jql" "b/uniCloud-aliyun/database/JQL\346\237\245\350\257\242.jql" new file mode 100644 index 0000000..680e898 --- /dev/null +++ "b/uniCloud-aliyun/database/JQL\346\237\245\350\257\242.jql" @@ -0,0 +1,9 @@ +// 本查询文件用于,使用JQL语法查询项目关联的uniCloud空间的数据库,方便开发调试 +// 选中查询代码,点击工具栏上的运行按钮或者【F5】运行查询语句 +// 如果没有选中代码,直接运行,则会执行整个文档的JQL语句。但如果文档中存在多条JQL语句,只有最后一条语句生效 +// 本文档支持简单js,但不支持clientDB的action +// 数据库查询有最大返回条数限制,详见:https://uniapp.dcloud.net.cn/uniCloud/cf-database?id=limit +// 详细JQL语法,请参考 https://uniapp.dcloud.net.cn/uniCloud/clientdb?id=jsquery + +// 下面示例查询uni-id-users表的所有数据 +db.collection('uni-id-users').get(); diff --git a/uniCloud-aliyun/database/db_init.json b/uniCloud-aliyun/database/db_init.json new file mode 100644 index 0000000..b62093a --- /dev/null +++ b/uniCloud-aliyun/database/db_init.json @@ -0,0 +1,163 @@ +// 在本文件中可配置云数据库初始化,数据格式见:https://uniapp.dcloud.io/uniCloud/cf-database?id=db_init +// 编写完毕后对本文件点右键,可按配置规则创建表和添加数据 +{ + "opendb-news-articles-detail": { + "data": [ + { + "article_status": 1, + "author_avatar": "https://pic.36krcnd.com/avatar/201804/11034847/2w2w8ix0d1x98939.jpg!120", + "author_name": "土土土槽", + "category_id": "223", + "comment_count": 1204, + "comment_status": 0, + "content": "

编者按:本文来自微信公众号“土土土槽”(ID:xtutux6),作者:林安,36氪经授权发布。

大家好,我是林安。今天想跟你们聊一聊自由职业者的五险一金问题。

因为这个是想做自由职业的朋友问我最多的问题,也是自由职业初期必须思考的问题,所以今天就展开给大家讲讲。

在成为自由职业者以前,我没有任何一次裸辞经历,基本都是找好下家才跳槽,所以你应该看得出来,我不是一名“冲动型”选手,做任何决定前一定会三思后行。

所以产生了辞职想法后,我着手准备的第一件事,就是“搞清楚社保和公积金怎么交”,“断交或不交会对我的生活产生哪些影响”。

这些也是想做自由职业的朋友问我最多的问题。下面我就结合自己的实际情况,分4部分给大家讲讲。

 一、自由职业后,还有必要交五险一金吗?

其实五险一金中最重要的是“养老险”和“医疗险”。

一般社保交满15年后养老保险终身有效,养老金也是“多缴多得、长缴多得”;

社保交满25年后,医疗保险终身有效,看病时医保可以报销一部分费用。

关于“五险一金”交或不交,要根据不同人的不同情况来看。

如果你在户口所在地的城市工作,且在本地已有房,那么交不交、交多少完全看你需求。

如果你已经购买了性价比更高的商业保险,并且没有在本地再买房的打算,那你可以不交五险一金。

当然,如果你还是想买一份国民保险,图个安心,或者害怕以后办理一些事情被社保拖住(毕竟不同城市的政策也是经常变动),也可以自己在当地的社保局缴纳。

但如果你是外地户口且没有当地房产,将来又想在所在地买房落户,那我建议你最好继续缴纳五险,因为社保和大部分城市的落户买房政策挂钩,交不满年限,就无法买房落户。

而且五险中除了养老保险可以断交之外,其他一旦停交则不能补缴,需要重新开始再次缴纳。

我当初就是考虑到应该会在上海定居,才决定继续在上海缴纳五险的。

至于公积金,如果你近1年内没有买房需求,可以暂时不缴,等到你决定买房了,再开始重新缴纳也不迟。

停缴的公积金账户会暂时封存,等你重新交的时候,再去公积金中心解封就可以了。

但如果你没有在所在地定居的打算,比如很多朋友想年轻的时候在一线城市工作生活,等年纪大了或结婚成家了再退居二三线城市工作,这种情况其实可以不在当地缴纳社保,在户籍所在地缴纳或者给自己买一份商业保险也是OK的。

 二、不交五险一金会有什么影响?

公积金断交只对已经存在公积金贷款者或者准备申请公积金贷款者存在影响,其他则无直接影响。

如果你还有房贷要还却断交公积金,那么剩余的贷款就会按照商业利率来计算了。

社保断交的影响主要有2点:

1.影响医疗报销和报销上限

很多城市社保只要断缴一个月,第二月就不能继续使用了。

而且有的城市政策是连续缴纳社保的时间越久,报销上限就越高。这个具体看不同城市的政策,你们可以自行上网查一下。

2.影响买房买车、积分落户、孩子上学

部分热门城市要求社保交够一定年份,才可以买房买车。

还有的一线城市会把社保缴纳的额度和积分落户、孩子上学捆绑在一起,比如北上广深。

我所在的上海,就是连续缴纳5年社保才有资格买房买车,交满7年,才有资格申请落户。

 三、自由职业者如何缴纳五险一金?

那么自由职业者应该如何缴纳五险一金呢?常见的方式有4种。

1.自己去社保局和公积金中心以灵活就业的方式缴纳

这种只适合本地户籍的人,社保部分也只能缴纳养老保险和医疗保险。

你们可以根据自身的需求和具体状况,自由选择社保和公积金的缴费级别。

2.如果你是外地户籍,可以找第三方机构代缴

通过这种方式缴纳的社保一般会像上班时一样把五险交齐,不同的是以前公司替员工缴纳的部分也要你自己承担。

现在网上类似的代理机构挺多的,支付宝、淘宝和小程序上有很多,一般每个月会收几十块的代理费。

记得一定要找正规、有名的机构,每次交完以后,也要登陆自己的账号查询是否有按时缴纳。

3.挂靠在朋友公司下缴纳

如果你有朋友本身就是开公司的,可以把你的社保挂靠在他们公司下缴纳,这种比找机构省点钱,但是公司缴纳的部分金额也完全是你自己承担的。

4.开一家公司自行缴纳

这种比较适合有稳定客户且业务量比较大的自由职业者,公司的用途除了可以帮你缴纳五险一金外,还可以给客户开正规发票。

但开一家公司又会面临很多税务上的问题,不太建议自由职业新人或收入不稳定的自由职业者开公司。具体原因我和自由税务师骆盈合开的课程里有详细讲到(传送门:不懂一点税务知识,你“敢”成为自由职业者吗?)。

以上,就是不同类型自由职业者交五险一金的方式了。我目前的情况是挂靠在朋友公司下缴纳五险,公积金暂时断交了,等到要买房的时候再重新开始交。

大家可以根据自己的实际情况选择交或不交,以及缴纳方式和数额。

", + "cover": "https://img.36krcdn.com/20200410/v2_d748f06964014bafbd0e9cd9371de6d1_img_000?x-oss-process=image/resize,m_mfit,w_432,h_288/crop,w_432,h_288,g_center", + "excerpt": "自由职业前,应该想清楚的问题。", + "is_essence": false, + "is_sticky": false, + "last_comment_user_id": "", + "last_modify_date": "2020-04-10 18:44:10", + "last_modify_ip": "", + "like_count": 4603, + "publish_date": "2020-04-10 18:39:00", + "publish_ip": "", + "title": "干货:自由职业者如何搞定五险一金?", + "user_id": 121321, + "user_name": "未来汽车日报", + "view_count": 32053 + } + ], + "schema": { + "bsonType": "object", + "required": [ + "user_id", + "title", + "content", + "article_status", + "view_count", + "like_count", + "is_sticky", + "is_essence", + "comment_status", + "comment_count", + "mode" + ], + "permission": { + "read": true, + "create": "auth.uid != null", + "update": "doc.uid == auth.uid", + "delete": "doc.uid == auth.uid" + }, + "properties": { + "_id": { + "description": "存储文档 ID(用户 ID),系统自动生成" + }, + "user_id": { + "bsonType": "string", + "description": "文章作者ID, 参考`uni-id-users` 表" + }, + "category_id": { + "bsonType": "string", + "description": "分类 id,参考`uni-news-categories`表" + }, + "title": { + "bsonType": "string", + "description": "标题", + "label": "标题" + }, + "content": { + "bsonType": "string", + "description": "文章内容", + "label": "文章内容" + }, + "excerpt": { + "bsonType": "string", + "description": "文章摘录", + "label": "摘要" + }, + "article_status": { + "bsonType": "int", + "minimum": 0, + "maximum": 1, + "description": "文章状态:0 草稿箱 1 已发布" + }, + "view_count": { + "bsonType": "int", + "description": "阅读数量", + "permission": { + "write": false + } + }, + "like_count": { + "bsonType": "int", + "description": "喜欢数、点赞数", + "permission": { + "write": false + } + }, + "is_sticky": { + "bsonType": "bool", + "description": "是否置顶", + "permission": { + "write": false + } + }, + "is_essence": { + "bsonType": "bool", + "description": "阅读加精", + "permission": { + "write": false + } + }, + "comment_status": { + "bsonType": "int", + "minimum": 0, + "maximum": 1, + "description": "评论状态:0 关闭 1 开放" + }, + "comment_count": { + "bsonType": "int", + "description": "评论数量", + "permission": { + "write": false + } + }, + "last_comment_user_id": { + "bsonType": "string", + "description": "最后回复用户 id,参考`uni-id-users` 表" + }, + "avatar": { + "bsonType": "string", + "description": "缩略图地址", + "label": "封面大图" + }, + "publish_date": { + "bsonType": "timestamp", + "description": "发表时间", + "defaultValue": { + "$env": "now" + } + }, + "publish_ip": { + "bsonType": "string", + "description": "发表时 IP 地址", + "forceDefaultValue": { + "$env": "clientIP" + } + }, + "last_modify_date": { + "bsonType": "timestamp", + "description": "最后修改时间" + }, + "last_modify_ip": { + "bsonType": "string", + "description": "最后修改时 IP 地址" + }, + "mode": { + "bsonType": "number", + "description": "排版显示模式" + } + } + } + } +} \ No newline at end of file diff --git a/uniCloud-aliyun/database/opendb-banner.schema.json b/uniCloud-aliyun/database/opendb-banner.schema.json new file mode 100644 index 0000000..a027517 --- /dev/null +++ b/uniCloud-aliyun/database/opendb-banner.schema.json @@ -0,0 +1,54 @@ +{ + "bsonType": "object", + "required": ["bannerfile"], + "permission": { + "read": true + }, + "properties": { + "_id": { + "description": "ID,系统自动生成" + }, + "bannerfile": { + "bsonType": "file", + "fileMediaType": "image", + "title": "图片文件", + "description": "图片文件信息,包括文件名、url等" + }, + "open_url": { + "bsonType": "string", + "description": "点击跳转目标地址。如果是web地址则使用内置web-view打开;如果是本地页面则跳转本地页面;如果是schema地址则打开本地的app", + "title": "点击目标地址", + "format": "url", + "pattern": "^(http:\/\/|https:\/\/|\/|.\/|@\/)\\S", + "trim": "both" + }, + "title": { + "bsonType": "string", + "description": "注意标题文字颜色和背景图靠色导致看不清的问题", + "maxLength": 20, + "title": "标题", + "trim": "both" + }, + "sort": { + "bsonType": "int", + "description": "数字越小,排序越前", + "title": "排序" + }, + "category_id": { + "bsonType": "string", + "description": "多个栏目的banner都存在一个表里时可用这个字段区分", + "title": "分类id" + }, + "status": { + "bsonType": "bool", + "defaultValue": true, + "title": "生效状态" + }, + "description": { + "bsonType": "string", + "description": "维护者自用描述", + "title": "备注", + "trim": "both" + } + } +} diff --git a/uniCloud-aliyun/database/opendb-mall-goods.schema.json b/uniCloud-aliyun/database/opendb-mall-goods.schema.json new file mode 100644 index 0000000..b3c24cc --- /dev/null +++ b/uniCloud-aliyun/database/opendb-mall-goods.schema.json @@ -0,0 +1,123 @@ +{ + "bsonType": "object", + "permission": { + "create": false, + "delete": false, + "read": "doc.is_on_sale == true", + "update": false + }, + "properties": { + "_id": { + "description": "存储文档 ID(商品 ID),系统自动生成" + }, + "add_date": { + "bsonType": "timestamp", + "defaultValue": { + "$env": "now" + }, + "description": "上架时间" + }, + "category_id": { + "bsonType": "string", + "description": "分类 id,参考`opendb-mall-categories`表", + "foreignKey": "opendb-mall-categories._id" + }, + "comment_count": { + "bsonType": "int", + "description": "累计评论数" + }, + "goods_banner_imgs": { + "bsonType": "array", + "description": "商品详情页的banner图地址" + }, + "goods_desc": { + "bsonType": "string", + "description": "商品详细描述", + "title": "详细描述", + "trim": "both" + }, + "goods_sn": { + "bsonType": "string", + "description": "商品的唯一货号", + "title": "货号", + "trim": "both" + }, + "goods_thumb": { + "bsonType": "string", + "description": "商品缩略图,用于在列表或搜索结果中预览显示", + "pattern": "^(http:\/\/|https:\/\/|\/|.\/|@\/)\\S", + "title": "缩略图地址", + "trim": "both" + }, + "is_alone_sale": { + "bsonType": "bool", + "description": "是否能单独销售;如果不能单独销售,则只能作为某商品的配件或者赠品销售" + }, + "is_best": { + "bsonType": "bool", + "description": "是否精品" + }, + "is_hot": { + "bsonType": "bool", + "description": "是否热销" + }, + "is_new": { + "bsonType": "bool", + "description": "是否新品", + "title": "是否新品" + }, + "is_on_sale": { + "bsonType": "bool", + "description": "是否上架销售", + "title": "是否上架" + }, + "is_real": { + "bsonType": "bool", + "description": "是否实物", + "title": "是否为实物" + }, + "keywords": { + "bsonType": "string", + "description": "商品关键字,为搜索引擎收录使用", + "title": "关键字", + "trim": "both" + }, + "last_modify_date": { + "bsonType": "timestamp", + "defaultValue": { + "$env": "now" + }, + "description": "最后修改时间" + }, + "month_sell_count": { + "bsonType": "int", + "description": "月销量" + }, + "name": { + "bsonType": "string", + "description": "商品名称", + "title": "名称", + "trim": "both" + }, + "remain_count": { + "bsonType": "int", + "description": "库存数量", + "title": "库存数量" + }, + "seller_note": { + "bsonType": "string", + "description": "商家备注,仅商家可见", + "permission": { + "read": false + }, + "trim": "both" + }, + "total_sell_count": { + "bsonType": "int", + "description": "总销量" + } + }, + "required": ["goods_sn", "name", "remain_count", "month_sell_count", "total_sell_count", "comment_count", "is_real", + "is_on_sale", "is_alone_sale", "is_best", "is_new", "is_hot" + ] +} diff --git a/uniCloud-aliyun/database/opendb-news-articles.schema.json b/uniCloud-aliyun/database/opendb-news-articles.schema.json new file mode 100644 index 0000000..eb2160f --- /dev/null +++ b/uniCloud-aliyun/database/opendb-news-articles.schema.json @@ -0,0 +1,175 @@ +{ + "bsonType": "object", + "required": ["user_id", "title", "content"], + "permission": { + "read": "doc.uid == auth.uid && doc.article_status == 0 || doc.article_status == 1", + "create": "auth.uid != null", + "update": "doc.uid == auth.uid", + "delete": "doc.uid == auth.uid" + }, + "properties": { + "_id": { + "description": "存储文档 ID(用户 ID),系统自动生成" + }, + "user_id": { + "bsonType": "string", + "description": "文章作者ID, 参考`uni-id-users` 表", + "foreignKey": "uni-id-users._id", + "defaultValue": { + "$env": "uid" + } + }, + "author": { + "bsonType": "string", + "title": "作者信息", + "description": "冗余字段,用于保存联表查询结果,参考`uni-id-users`表", + "foreignKey": "uni-id-users._id", + "enum": { + "collection": "uni-id-users", + "field": "username, _id as text, _id as value" + } + }, + "category_id": { + "bsonType": "string", + "title": "分类", + "description": "分类 id,参考`uni-news-categories`表", + "foreignKey": "opendb-news-categories._id", + "enum": { + "collection": "opendb-news-categories", + "field": "name as text, _id as value" + } + }, + "title": { + "bsonType": "string", + "title": "标题", + "description": "标题", + "label": "标题", + "trim": "both" + }, + "content": { + "bsonType": "string", + "title": "文章内容", + "description": "文章内容", + "label": "文章内容", + "trim": "right" + }, + "excerpt": { + "bsonType": "string", + "title": "文章摘录", + "description": "文章摘录", + "label": "摘要", + "trim": "both" + }, + "article_status": { + "bsonType": "int", + "title": "文章状态", + "description": "文章状态:0 草稿箱 1 已发布", + "defaultValue": 0, + "enum": [{ + "value": 0, + "text": "草稿箱" + }, { + "value": 1, + "text": "已发布" + }] + }, + "view_count": { + "bsonType": "int", + "title": "阅读数量", + "description": "阅读数量", + "permission": { + "write": false + } + }, + "like_count": { + "bsonType": "int", + "description": "喜欢数、点赞数", + "permission": { + "write": false + } + }, + "is_sticky": { + "bsonType": "bool", + "title": "是否置顶", + "description": "是否置顶", + "permission": { + "write": false + } + }, + "is_essence": { + "bsonType": "bool", + "title": "阅读加精", + "description": "阅读加精", + "permission": { + "write": false + } + }, + "comment_status": { + "bsonType": "int", + "title": "开放评论", + "description": "评论状态:0 关闭 1 开放", + "enum": [{ + "value": 0, + "text": "关闭" + }, { + "value": 1, + "text": "开放" + }] + }, + "comment_count": { + "bsonType": "int", + "description": "评论数量", + "permission": { + "write": false + } + }, + "last_comment_user_id": { + "bsonType": "string", + "description": "最后回复用户 id,参考`uni-id-users` 表", + "foreignKey": "uni-id-users._id" + }, + "avatar": { + "bsonType": "string", + "title": "封面大图", + "description": "缩略图地址", + "label": "封面大图", + "trim": "both" + }, + "publish_date": { + "bsonType": "timestamp", + "title": "发表时间", + "description": "发表时间", + "defaultValue": { + "$env": "now" + } + }, + "publish_ip": { + "bsonType": "string", + "title": "发布文章时IP地址", + "description": "发表时 IP 地址", + "forceDefaultValue": { + "$env": "clientIP" + } + }, + "last_modify_date": { + "bsonType": "timestamp", + "title": "最后修改时间", + "description": "最后修改时间", + "defaultValue": { + "$env": "now" + } + }, + "last_modify_ip": { + "bsonType": "string", + "description": "最后修改时 IP 地址", + "forceDefaultValue": { + "$env": "clientIP" + } + }, + "mode": { + "bsonType": "number", + "title": "排版显示模式", + "description": "排版显示模式,如左图右文、上图下文等" + } + } +} diff --git a/uniCloud-aliyun/database/opendb-news-categories.schema.json b/uniCloud-aliyun/database/opendb-news-categories.schema.json new file mode 100644 index 0000000..976c8a8 --- /dev/null +++ b/uniCloud-aliyun/database/opendb-news-categories.schema.json @@ -0,0 +1,50 @@ +{ + "bsonType": "object", + "required": ["name"], + "permission": { + "read": true, + "create": false, + "update": false, + "delete": false + }, + "properties": { + "_id": { + "description": "存储文档 ID(文章 ID),系统自动生成" + }, + "name": { + "bsonType": "string", + "description": "类别名称", + "label": "名称", + "trim": "both" + }, + "description": { + "bsonType": "string", + "description": "类别描述", + "label": "描述", + "trim": "both" + }, + "icon": { + "bsonType": "string", + "description": "类别图标地址", + "label": "图标地址", + "pattern": "^(http:\/\/|https:\/\/|\/|.\/|@\/)\\S", + "trim": "both" + }, + "sort": { + "bsonType": "int", + "description": "类别显示顺序", + "label": "排序" + }, + "article_count": { + "bsonType": "int", + "description": "该类别下文章数量" + }, + "create_date": { + "bsonType": "timestamp", + "description": "创建时间", + "forceDefaultValue": { + "$env": "now" + } + } + } +} diff --git a/uniCloud-aliyun/database/opendb-news-comments.schema.json b/uniCloud-aliyun/database/opendb-news-comments.schema.json new file mode 100644 index 0000000..e8e855c --- /dev/null +++ b/uniCloud-aliyun/database/opendb-news-comments.schema.json @@ -0,0 +1,68 @@ +{ + "bsonType": "object", + "required": ["article_id", "user_id", "comment_content", "like_count", "comment_type", "reply_user_id", + "reply_comment_id" + ], + "permission": { + "read": true, + "create": "auth.uid != null && get(`database.opendb-news-article.${doc.article_id}`).comment_status == 1", + "update": "doc.uid == auth.uid", + "delete": "doc.uid == auth.uid" + }, + "properties": { + "_id": { + "description": "存储文档 ID(文章 ID),系统自动生成" + }, + "article_id": { + "bsonType": "string", + "description": "文章ID,opendb-news-posts 表中的`_id`字段", + "foreignKey": "opendb-news-articles._id" + }, + "user_id": { + "bsonType": "string", + "description": "评论者ID,参考`uni-id-users` 表", + "forceDefaultValue": { + "$env": "uid" + }, + "foreignKey": "uni-id-users._id" + }, + "comment_content": { + "bsonType": "string", + "description": "评论内容", + "title": "评论内容", + "trim": "right" + }, + "like_count": { + "bsonType": "int", + "description": "评论喜欢数、点赞数" + }, + "comment_type": { + "bsonType": "int", + "description": "回复类型: 0 针对文章的回复 1 针对评论的回复" + }, + "reply_user_id": { + "bsonType": "string", + "description": "被回复的评论用户ID,comment_type为1时有效", + "foreignKey": "uni-id-users._id" + }, + "reply_comment_id": { + "bsonType": "string", + "description": "被回复的评论ID,comment_type为1时有效", + "foreignKey": "opendb-news-comments._id" + }, + "comment_date": { + "bsonType": "timestamp", + "description": "评论发表时间", + "forceDefaultValue": { + "$env": "now" + } + }, + "comment_ip": { + "bsonType": "string", + "description": "评论发表时 IP 地址", + "forceDefaultValue": { + "$env": "clientIP" + } + } + } +} diff --git a/uniCloud-aliyun/database/opendb-news-favorite.schema.json b/uniCloud-aliyun/database/opendb-news-favorite.schema.json new file mode 100644 index 0000000..c18e969 --- /dev/null +++ b/uniCloud-aliyun/database/opendb-news-favorite.schema.json @@ -0,0 +1,35 @@ +{ + "bsonType": "object", + "required": ["user_id", "article_id"], + "permission": { + "read": true, + "create": "auth.uid != null", + "update": false, + "delete": "doc.uid == auth.uid" + }, + "properties": { + "_id": { + "description": "ID,系统自动生成" + }, + "article_id": { + "bsonType": "string", + "description": "文章id,参考opendb-news-articles表", + "foreignKey": "opendb-news-articles._id" + }, + "user_id": { + "bsonType": "string", + "description": "收藏者id,参考uni-id-users表", + "forceDefaultValue": { + "$env": "uid" + }, + "foreignKey": "uni-id-users._id" + }, + "create_date": { + "bsonType": "timestamp", + "description": "收藏时间", + "forceDefaultValue": { + "$env": "now" + } + } + } +} diff --git a/uniCloud-aliyun/database/opendb-search-hot.schema.json b/uniCloud-aliyun/database/opendb-search-hot.schema.json new file mode 100644 index 0000000..1230be4 --- /dev/null +++ b/uniCloud-aliyun/database/opendb-search-hot.schema.json @@ -0,0 +1,27 @@ +{ + "bsonType": "object", + "permission": { + "create": false, + "delete": false, + "read": true, + "update": false + }, + "properties": { + "_id": { + "description": "ID,系统自动生成" + }, + "content": { + "bsonType": "string", + "description": "搜索内容" + }, + "count": { + "bsonType": "long", + "description": "搜索次数" + }, + "create_date": { + "bsonType": "timestamp", + "description": "统计时间" + } + }, + "required": ["content", "count"] +} diff --git a/uniCloud-aliyun/database/opendb-search-log.schema.json b/uniCloud-aliyun/database/opendb-search-log.schema.json new file mode 100644 index 0000000..421ee8c --- /dev/null +++ b/uniCloud-aliyun/database/opendb-search-log.schema.json @@ -0,0 +1,31 @@ +{ + "bsonType": "object", + "permission": { + "create": true, + "delete": false, + "read": false, + "update": false + }, + "properties": { + "_id": { + "description": "ID,系统自动生成" + }, + "content": { + "bsonType": "string", + "description": "搜索内容" + }, + "create_date": { + "bsonType": "timestamp", + "description": "统计时间" + }, + "device_id": { + "bsonType": "string", + "description": "设备id" + }, + "user_id": { + "bsonType": "string", + "description": "收藏者id,参考uni-id-users表" + } + }, + "required": ["content"] +} diff --git a/uniCloud-aliyun/database/opendb-verify-codes.schema.json b/uniCloud-aliyun/database/opendb-verify-codes.schema.json new file mode 100644 index 0000000..91a0962 --- /dev/null +++ b/uniCloud-aliyun/database/opendb-verify-codes.schema.json @@ -0,0 +1,45 @@ +{ + "bsonType": "object", + "properties": { + "_id": { + "description": "ID,系统自动生成" + }, + "code": { + "bsonType": "string", + "description": "验证码" + }, + "create_date": { + "bsonType": "timestamp", + "description": "创建时间" + }, + "device_uuid": { + "bsonType": "string", + "description": "设备UUID,常用于图片验证码" + }, + "email": { + "bsonType": "string", + "description": "邮箱" + }, + "expired_date": { + "bsonType": "timestamp", + "description": "过期时间" + }, + "ip": { + "bsonType": "string", + "description": "请求时客户端IP地址" + }, + "mobile": { + "bsonType": "string", + "description": "手机号码" + }, + "scene": { + "bsonType": "string", + "description": "使用验证码的场景,如:login, bind, unbind, pay" + }, + "state": { + "bsonType": "int", + "description": "验证状态:0 未验证、1 已验证、2 已作废" + } + }, + "required": [] +} diff --git a/uniCloud-aliyun/database/uni-id-log.schema.json b/uniCloud-aliyun/database/uni-id-log.schema.json new file mode 100644 index 0000000..33e0ad8 --- /dev/null +++ b/uniCloud-aliyun/database/uni-id-log.schema.json @@ -0,0 +1,41 @@ +{ + "bsonType": "object", + "properties": { + "_id": { + "description": "ID,系统自动生成" + }, + "create_date": { + "bsonType": "timestamp", + "description": "创建时间", + "forceDefaultValue": { + "$env": "now" + } + }, + "device_uuid": { + "bsonType": "string", + "description": "设备唯一标识" + }, + "ip": { + "bsonType": "string", + "description": "ip地址" + }, + "state": { + "bsonType": "int", + "description": "结果:0 失败、1 成功" + }, + "type": { + "bsonType": "string", + "description": "登录类型", + "enum": ["login", "logout"] + }, + "ua": { + "bsonType": "string", + "description": "userAgent" + }, + "user_id": { + "bsonType": "string", + "description": "用户id,参考uni-id-users表" + } + }, + "required": [] +} diff --git a/uniCloud-aliyun/database/uni-id-users.schema.json b/uniCloud-aliyun/database/uni-id-users.schema.json new file mode 100644 index 0000000..854eb17 --- /dev/null +++ b/uniCloud-aliyun/database/uni-id-users.schema.json @@ -0,0 +1,269 @@ +{ + "bsonType": "object", + "permission": { + "read": true, + "create": false, + "update": false, + "delete": false + }, + "properties": { + "_id": { + "description": "存储文档 ID(用户 ID),系统自动生成" + }, + "ali_openid": { + "bsonType": "string", + "description": "支付宝平台openid" + }, + "apple_openid": { + "bsonType": "string", + "description": "苹果登录openid" + }, + "avatar": { + "bsonType": "string", + "description": "头像地址", + "title": "头像地址", + "trim": "both" + }, + "comment": { + "bsonType": "string", + "description": "备注", + "title": "备注", + "trim": "both" + }, + "department_id": { + "bsonType": "array", + "description": "部门ID", + "enum": { + "collection": "opendb-department", + "field": "_id as value, name as text", + "orderby": "name asc" + }, + "enumType": "tree", + "title": "部门" + }, + "email": { + "bsonType": "string", + "description": "邮箱地址", + "format": "email", + "title": "邮箱", + "trim": "both" + }, + "email_confirmed": { + "bsonType": "int", + "defaultValue": 0, + "description": "邮箱验证状态:0 未验证 1 已验证", + "enum": [{ + "text": "未验证", + "value": 0 + }, { + "text": "已验证", + "value": 1 + }], + "title": "邮箱验证状态" + }, + "gender": { + "bsonType": "int", + "defaultValue": 0, + "description": "用户性别:0 未知 1 男性 2 女性", + "enum": [{ + "text": "未知", + "value": 0 + }, { + "text": "男", + "value": 1 + }, { + "text": "女", + "value": 2 + }], + "title": "性别" + }, + "inviter_uid": { + "bsonType": "array", + "description": "用户全部上级邀请者", + "trim": "both" + }, + "last_login_date": { + "bsonType": "timestamp", + "description": "最后登录时间" + }, + "last_login_ip": { + "bsonType": "string", + "description": "最后登录时 IP 地址" + }, + "mobile": { + "bsonType": "string", + "description": "手机号码", + "pattern": "^\\+?[0-9-]{3,20}$", + "title": "手机号码", + "trim": "both" + }, + "mobile_confirmed": { + "bsonType": "int", + "defaultValue": 0, + "description": "手机号验证状态:0 未验证 1 已验证", + "enum": [{ + "text": "未验证", + "value": 0 + }, { + "text": "已验证", + "value": 1 + }], + "title": "手机号验证状态" + }, + "my_invite_code": { + "bsonType": "string", + "description": "用户自身邀请码" + }, + "nickname": { + "bsonType": "string", + "description": "用户昵称", + "title": "昵称", + "trim": "both" + }, + "password": { + "bsonType": "password", + "description": "密码,加密存储", + "title": "密码", + "trim": "both" + }, + "password_secret_version": { + "bsonType": "int", + "description": "密码使用的passwordSecret版本", + "title": "passwordSecret" + }, + "realname_auth": { + "bsonType": "object", + "description": "实名认证信息", + "properties": { + "auth_date": { + "bsonType": "timestamp", + "description": "认证通过时间" + }, + "auth_status": { + "bsonType": "int", + "description": "认证状态:0 未认证 1 等待认证 2 认证通过 3 认证失败", + "maximum": 3, + "minimum": 0 + }, + "contact_email": { + "bsonType": "string", + "description": "联系人邮箱" + }, + "contact_mobile": { + "bsonType": "string", + "description": "联系人手机号码" + }, + "contact_person": { + "bsonType": "string", + "description": "联系人姓名" + }, + "id_card_back": { + "bsonType": "string", + "description": "身份证反面照 URL" + }, + "id_card_front": { + "bsonType": "string", + "description": "身份证正面照 URL" + }, + "identity": { + "bsonType": "string", + "description": "身份证号码\/营业执照号码" + }, + "in_hand": { + "bsonType": "string", + "description": "手持身份证照片 URL" + }, + "license": { + "bsonType": "string", + "description": "营业执照 URL" + }, + "real_name": { + "bsonType": "string", + "description": "真实姓名\/企业名称" + }, + "type": { + "bsonType": "int", + "description": "用户类型:0 个人用户 1 企业用户", + "maximum": 1, + "minimum": 0 + } + }, + "required": ["type", "auth_status"] + }, + "register_date": { + "bsonType": "timestamp", + "description": "注册时间", + "forceDefaultValue": { + "$env": "now" + } + }, + "register_ip": { + "bsonType": "string", + "description": "注册时 IP 地址", + "forceDefaultValue": { + "$env": "clientIP" + } + }, + "role": { + "bsonType": "array", + "description": "用户角色", + "enum": { + "collection": "uni-id-roles", + "field": "role_id as value, role_name as text" + }, + "foreignKey": "uni-id-roles.role_id", + "permission": { + "write": false + }, + "title": "角色" + }, + "status": { + "bsonType": "int", + "defaultValue": 0, + "description": "用户状态:0 正常 1 禁用 2 审核中 3 审核拒绝", + "enum": [{ + "text": "正常", + "value": 0 + }, { + "text": "禁用", + "value": 1 + }, { + "text": "审核中", + "value": 2 + }, { + "text": "审核拒绝", + "value": 3 + }], + "title": "用户状态" + }, + "token": { + "bsonType": "array", + "description": "用户token" + }, + "username": { + "bsonType": "string", + "description": "用户名,不允许重复", + "title": "用户名", + "trim": "both" + }, + "wx_openid": { + "bsonType": "object", + "description": "微信各个平台openid", + "properties": { + "app-plus": { + "bsonType": "string", + "description": "app平台微信openid" + }, + "mp-weixin": { + "bsonType": "string", + "description": "微信小程序平台openid" + } + } + }, + "wx_unionid": { + "bsonType": "string", + "description": "微信unionid" + } + }, + "required": [] +} diff --git a/uni_modules/m-icon/m-icon.css b/uni_modules/m-icon/m-icon.css new file mode 100644 index 0000000..438151e --- /dev/null +++ b/uni_modules/m-icon/m-icon.css @@ -0,0 +1,378 @@ +@font-face { + font-family: uniicons; + font-weight: normal; + font-style: normal; + src: url('/static/uni.ttf') format('truetype'); +} + +.m-icon { + font-family: uniicons; + /* font-size: 24px; */ + margin-left: 20px; + font-weight: normal; + font-style: normal; + line-height: 1; + display: inline-block; + text-decoration: none; + -webkit-font-smoothing: antialiased; +} + +.m-icon.uni-active { + color: #007aff; +} + +.m-icon-contact:before { + content: '\e100'; +} + +.m-icon-person:before { + content: '\e101'; +} + +.m-icon-personadd:before { + content: '\e102'; +} + +.m-icon-contact-filled:before { + content: '\e130'; +} + +.m-icon-person-filled:before { + content: '\e131'; +} + +.m-icon-personadd-filled:before { + content: '\e132'; +} + +.m-icon-phone:before { + content: '\e200'; +} + +.m-icon-email:before { + content: '\e201'; +} + +.m-icon-chatbubble:before { + content: '\e202'; +} + +.m-icon-chatboxes:before { + content: '\e203'; +} + +.m-icon-phone-filled:before { + content: '\e230'; +} + +.m-icon-email-filled:before { + content: '\e231'; +} + +.m-icon-chatbubble-filled:before { + content: '\e232'; +} + +.m-icon-chatboxes-filled:before { + content: '\e233'; +} + +.m-icon-weibo:before { + content: '\e260'; +} + +.m-icon-weixin:before { + content: '\e261'; +} + +.m-icon-pengyouquan:before { + content: '\e262'; +} + +.m-icon-chat:before { + content: '\e263'; +} + +.m-icon-qq:before { + content: '\e264'; +} + +.m-icon-videocam:before { + content: '\e300'; +} + +.m-icon-camera:before { + content: '\e301'; +} + +.m-icon-mic:before { + content: '\e302'; +} + +.m-icon-location:before { + content: '\e303'; +} + +.m-icon-mic-filled:before, +.m-icon-speech:before { + content: '\e332'; +} + +.m-icon-location-filled:before { + content: '\e333'; +} + +.m-icon-micoff:before { + content: '\e360'; +} + +.m-icon-image:before { + content: '\e363'; +} + +.m-icon-map:before { + content: '\e364'; +} + +.m-icon-compose:before { + content: '\e400'; +} + +.m-icon-trash:before { + content: '\e401'; +} + +.m-icon-upload:before { + content: '\e402'; +} + +.m-icon-download:before { + content: '\e403'; +} + +.m-icon-close:before { + content: '\e404'; +} + +.m-icon-redo:before { + content: '\e405'; +} + +.m-icon-undo:before { + content: '\e406'; +} + +.m-icon-refresh:before { + content: '\e407'; +} + +.m-icon-star:before { + content: '\e408'; +} + +.m-icon-plus:before { + content: '\e409'; +} + +.m-icon-minus:before { + content: '\e410'; +} + +.m-icon-circle:before, +.m-icon-checkbox:before { + content: '\e411'; +} + +.m-icon-close-filled:before, +.m-icon-clear:before { + content: '\e434'; +} + +.m-icon-refresh-filled:before { + content: '\e437'; +} + +.m-icon-star-filled:before { + content: '\e438'; +} + +.m-icon-plus-filled:before { + content: '\e439'; +} + +.m-icon-minus-filled:before { + content: '\e440'; +} + +.m-icon-circle-filled:before { + content: '\e441'; +} + +.m-icon-checkbox-filled:before { + content: '\e442'; +} + +.m-icon-closeempty:before { + content: '\e460'; +} + +.m-icon-refreshempty:before { + content: '\e461'; +} + +.m-icon-reload:before { + content: '\e462'; +} + +.m-icon-starhalf:before { + content: '\e463'; +} + +.m-icon-spinner:before { + content: '\e464'; +} + +.m-icon-spinner-cycle:before { + content: '\e465'; +} + +.m-icon-search:before { + content: '\e466'; +} + +.m-icon-plusempty:before { + content: '\e468'; +} + +.m-icon-forward:before { + content: '\e470'; +} + +.m-icon-back:before, +.m-icon-left-nav:before { + content: '\e471'; +} + +.m-icon-checkmarkempty:before { + content: '\e472'; +} + +.m-icon-home:before { + content: '\e500'; +} + +.m-icon-navigate:before { + content: '\e501'; +} + +.m-icon-gear:before { + content: '\e502'; +} + +.m-icon-paperplane:before { + content: '\e503'; +} + +.m-icon-info:before { + content: '\e504'; +} + +.m-icon-help:before { + content: '\e505'; +} + +.m-icon-locked:before { + content: '\e506'; +} + +.m-icon-more:before { + content: '\e507'; +} + +.m-icon-flag:before { + content: '\e508'; +} + +.m-icon-home-filled:before { + content: '\e530'; +} + +.m-icon-gear-filled:before { + content: '\e532'; +} + +.m-icon-info-filled:before { + content: '\e534'; +} + +.m-icon-help-filled:before { + content: '\e535'; +} + +.m-icon-more-filled:before { + content: '\e537'; +} + +.m-icon-settings:before { + content: '\e560'; +} + +.m-icon-list:before { + content: '\e562'; +} + +.m-icon-bars:before { + content: '\e563'; +} + +.m-icon-loop:before { + content: '\e565'; +} + +.m-icon-paperclip:before { + content: '\e567'; +} + +.m-icon-eye:before { + content: '\e568'; +} + +.m-icon-arrowup:before { + content: '\e580'; +} + +.m-icon-arrowdown:before { + content: '\e581'; +} + +.m-icon-arrowleft:before { + content: '\e582'; +} + +.m-icon-arrowright:before { + content: '\e583'; +} + +.m-icon-arrowthinup:before { + content: '\e584'; +} + +.m-icon-arrowthindown:before { + content: '\e585'; +} + +.m-icon-arrowthinleft:before { + content: '\e586'; +} + +.m-icon-arrowthinright:before { + content: '\e587'; +} + +.m-icon-pulldown:before { + content: '\e588'; +} + +.m-icon-scan:before { + content: "\e612"; +} diff --git a/uni_modules/m-icon/m-icon.vue b/uni_modules/m-icon/m-icon.vue new file mode 100644 index 0000000..57cb1f7 --- /dev/null +++ b/uni_modules/m-icon/m-icon.vue @@ -0,0 +1,23 @@ + + + + + diff --git a/uni_modules/m-input.vue b/uni_modules/m-input.vue new file mode 100644 index 0000000..adc4327 --- /dev/null +++ b/uni_modules/m-input.vue @@ -0,0 +1,125 @@ + + + + + diff --git a/uni_modules/uni-badge/changelog.md b/uni_modules/uni-badge/changelog.md new file mode 100644 index 0000000..bd9ce33 --- /dev/null +++ b/uni_modules/uni-badge/changelog.md @@ -0,0 +1,2 @@ +## 1.0.6(2021-02-04) +- 调整为uni_modules目录规范 diff --git a/uni_modules/uni-badge/components/uni-badge/uni-badge.vue b/uni_modules/uni-badge/components/uni-badge/uni-badge.vue new file mode 100644 index 0000000..670b532 --- /dev/null +++ b/uni_modules/uni-badge/components/uni-badge/uni-badge.vue @@ -0,0 +1,156 @@ + + + + + diff --git a/uni_modules/uni-badge/package.json b/uni_modules/uni-badge/package.json new file mode 100644 index 0000000..02789c0 --- /dev/null +++ b/uni_modules/uni-badge/package.json @@ -0,0 +1,83 @@ +{ + "id": "uni-badge", + "displayName": "Badge 数字角标", + "version": "1.0.6", + "description": "数字角标(徽章)组件,在元素周围展示消息提醒,一般用于列表、九宫格、按钮等地方。", + "keywords": [ + "", + "badge", + "uni-ui", + "数字角标", + "徽章" +], + "repository": "https://github.com/dcloudio/uni-ui", + "engines": { + "HBuilderX": "" + }, + "directories": { + "example": "../../temps/example" + }, + "dcloudext": { + "category": [ + "前端组件", + "通用组件" + ], + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "无", + "permissions": "无" + }, + "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui" + }, + "uni_modules": { + "dependencies": [], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "App": { + "app-vue": "u", + "app-nvue": "u" + }, + "H5-mobile": { + "Safari": "u", + "Android Browser": "u", + "微信浏览器(Android)": "u", + "QQ浏览器(Android)": "u" + }, + "H5-pc": { + "Chrome": "u", + "IE": "u", + "Edge": "u", + "Firefox": "u", + "Safari": "u" + }, + "小程序": { + "微信": "u", + "阿里": "u", + "百度": "u", + "字节跳动": "u", + "QQ": "u" + }, + "快应用": { + "华为": "u", + "联盟": "u" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uni-badge/readme.md b/uni_modules/uni-badge/readme.md new file mode 100644 index 0000000..ecb886c --- /dev/null +++ b/uni_modules/uni-badge/readme.md @@ -0,0 +1,43 @@ + + +## Badge 数字角标 +> 代码块: `uBadge` + + +数字角标一般和其它控件(列表、9宫格等)配合使用,用于进行数量提示,默认为实心灰色背景, + +### 安装方式 + +本组件符合[easycom](https://uniapp.dcloud.io/collocation/pages?id=easycom)规范,`HBuilderX 2.5.5`起,只需将本组件导入项目,在页面`template`中即可直接使用,无需在页面中`import`和注册`components`。 + +如需通过`npm`方式使用`uni-ui`组件,另见文档:[https://ext.dcloud.net.cn/plugin?id=55](https://ext.dcloud.net.cn/plugin?id=55) + +### 基本用法 + +在 ``template`` 中使用组件 + +```html + + + +``` + + +## API + +### Badge Props + +|属性名 |类型 |默认值 |说明 | +|:-: |:-: |:-: |:-: | +|text |String |- |角标内容 | +|type |String |default|颜色类型,可选值:default(灰色)、primary(蓝色)、success(绿色)、warning(黄色)、error(红色)| +|size |String |normal|Badge 大小,可取值:normal、small| +|inverted |Boolean |false |是否无需背景颜色,为 true 时,背景颜色将变为文字的字体颜色 | + +### Badge Events + +|事件名 |事件说明 |返回参数 | +|:-: |:-: |:-: | +|@click |点击 Badge 触发事件| - | + + diff --git a/uni_modules/uni-calendar/changelog.md b/uni_modules/uni-calendar/changelog.md new file mode 100644 index 0000000..cd8fdb9 --- /dev/null +++ b/uni_modules/uni-calendar/changelog.md @@ -0,0 +1,2 @@ +## 1.3.15(2021-02-04) +- 调整为uni_modules目录规范 diff --git a/uni_modules/uni-calendar/components/uni-calendar/calendar.js b/uni_modules/uni-calendar/components/uni-calendar/calendar.js new file mode 100644 index 0000000..b8d7d6f --- /dev/null +++ b/uni_modules/uni-calendar/components/uni-calendar/calendar.js @@ -0,0 +1,546 @@ +/** +* @1900-2100区间内的公历、农历互转 +* @charset UTF-8 +* @github https://github.com/jjonline/calendar.js +* @Author Jea杨(JJonline@JJonline.Cn) +* @Time 2014-7-21 +* @Time 2016-8-13 Fixed 2033hex、Attribution Annals +* @Time 2016-9-25 Fixed lunar LeapMonth Param Bug +* @Time 2017-7-24 Fixed use getTerm Func Param Error.use solar year,NOT lunar year +* @Version 1.0.3 +* @公历转农历:calendar.solar2lunar(1987,11,01); //[you can ignore params of prefix 0] +* @农历转公历:calendar.lunar2solar(1987,09,10); //[you can ignore params of prefix 0] +*/ +/* eslint-disable */ +var calendar = { + + /** + * 农历1900-2100的润大小信息表 + * @Array Of Property + * @return Hex + */ + lunarInfo: [0x04bd8, 0x04ae0, 0x0a570, 0x054d5, 0x0d260, 0x0d950, 0x16554, 0x056a0, 0x09ad0, 0x055d2, // 1900-1909 + 0x04ae0, 0x0a5b6, 0x0a4d0, 0x0d250, 0x1d255, 0x0b540, 0x0d6a0, 0x0ada2, 0x095b0, 0x14977, // 1910-1919 + 0x04970, 0x0a4b0, 0x0b4b5, 0x06a50, 0x06d40, 0x1ab54, 0x02b60, 0x09570, 0x052f2, 0x04970, // 1920-1929 + 0x06566, 0x0d4a0, 0x0ea50, 0x06e95, 0x05ad0, 0x02b60, 0x186e3, 0x092e0, 0x1c8d7, 0x0c950, // 1930-1939 + 0x0d4a0, 0x1d8a6, 0x0b550, 0x056a0, 0x1a5b4, 0x025d0, 0x092d0, 0x0d2b2, 0x0a950, 0x0b557, // 1940-1949 + 0x06ca0, 0x0b550, 0x15355, 0x04da0, 0x0a5b0, 0x14573, 0x052b0, 0x0a9a8, 0x0e950, 0x06aa0, // 1950-1959 + 0x0aea6, 0x0ab50, 0x04b60, 0x0aae4, 0x0a570, 0x05260, 0x0f263, 0x0d950, 0x05b57, 0x056a0, // 1960-1969 + 0x096d0, 0x04dd5, 0x04ad0, 0x0a4d0, 0x0d4d4, 0x0d250, 0x0d558, 0x0b540, 0x0b6a0, 0x195a6, // 1970-1979 + 0x095b0, 0x049b0, 0x0a974, 0x0a4b0, 0x0b27a, 0x06a50, 0x06d40, 0x0af46, 0x0ab60, 0x09570, // 1980-1989 + 0x04af5, 0x04970, 0x064b0, 0x074a3, 0x0ea50, 0x06b58, 0x05ac0, 0x0ab60, 0x096d5, 0x092e0, // 1990-1999 + 0x0c960, 0x0d954, 0x0d4a0, 0x0da50, 0x07552, 0x056a0, 0x0abb7, 0x025d0, 0x092d0, 0x0cab5, // 2000-2009 + 0x0a950, 0x0b4a0, 0x0baa4, 0x0ad50, 0x055d9, 0x04ba0, 0x0a5b0, 0x15176, 0x052b0, 0x0a930, // 2010-2019 + 0x07954, 0x06aa0, 0x0ad50, 0x05b52, 0x04b60, 0x0a6e6, 0x0a4e0, 0x0d260, 0x0ea65, 0x0d530, // 2020-2029 + 0x05aa0, 0x076a3, 0x096d0, 0x04afb, 0x04ad0, 0x0a4d0, 0x1d0b6, 0x0d250, 0x0d520, 0x0dd45, // 2030-2039 + 0x0b5a0, 0x056d0, 0x055b2, 0x049b0, 0x0a577, 0x0a4b0, 0x0aa50, 0x1b255, 0x06d20, 0x0ada0, // 2040-2049 + /** Add By JJonline@JJonline.Cn**/ + 0x14b63, 0x09370, 0x049f8, 0x04970, 0x064b0, 0x168a6, 0x0ea50, 0x06b20, 0x1a6c4, 0x0aae0, // 2050-2059 + 0x0a2e0, 0x0d2e3, 0x0c960, 0x0d557, 0x0d4a0, 0x0da50, 0x05d55, 0x056a0, 0x0a6d0, 0x055d4, // 2060-2069 + 0x052d0, 0x0a9b8, 0x0a950, 0x0b4a0, 0x0b6a6, 0x0ad50, 0x055a0, 0x0aba4, 0x0a5b0, 0x052b0, // 2070-2079 + 0x0b273, 0x06930, 0x07337, 0x06aa0, 0x0ad50, 0x14b55, 0x04b60, 0x0a570, 0x054e4, 0x0d160, // 2080-2089 + 0x0e968, 0x0d520, 0x0daa0, 0x16aa6, 0x056d0, 0x04ae0, 0x0a9d4, 0x0a2d0, 0x0d150, 0x0f252, // 2090-2099 + 0x0d520], // 2100 + + /** + * 公历每个月份的天数普通表 + * @Array Of Property + * @return Number + */ + solarMonth: [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31], + + /** + * 天干地支之天干速查表 + * @Array Of Property trans["甲","乙","丙","丁","戊","己","庚","辛","壬","癸"] + * @return Cn string + */ + Gan: ['\u7532', '\u4e59', '\u4e19', '\u4e01', '\u620a', '\u5df1', '\u5e9a', '\u8f9b', '\u58ec', '\u7678'], + + /** + * 天干地支之地支速查表 + * @Array Of Property + * @trans["子","丑","寅","卯","辰","巳","午","未","申","酉","戌","亥"] + * @return Cn string + */ + Zhi: ['\u5b50', '\u4e11', '\u5bc5', '\u536f', '\u8fb0', '\u5df3', '\u5348', '\u672a', '\u7533', '\u9149', '\u620c', '\u4ea5'], + + /** + * 天干地支之地支速查表<=>生肖 + * @Array Of Property + * @trans["鼠","牛","虎","兔","龙","蛇","马","羊","猴","鸡","狗","猪"] + * @return Cn string + */ + Animals: ['\u9f20', '\u725b', '\u864e', '\u5154', '\u9f99', '\u86c7', '\u9a6c', '\u7f8a', '\u7334', '\u9e21', '\u72d7', '\u732a'], + + /** + * 24节气速查表 + * @Array Of Property + * @trans["小寒","大寒","立春","雨水","惊蛰","春分","清明","谷雨","立夏","小满","芒种","夏至","小暑","大暑","立秋","处暑","白露","秋分","寒露","霜降","立冬","小雪","大雪","冬至"] + * @return Cn string + */ + solarTerm: ['\u5c0f\u5bd2', '\u5927\u5bd2', '\u7acb\u6625', '\u96e8\u6c34', '\u60ca\u86f0', '\u6625\u5206', '\u6e05\u660e', '\u8c37\u96e8', '\u7acb\u590f', '\u5c0f\u6ee1', '\u8292\u79cd', '\u590f\u81f3', '\u5c0f\u6691', '\u5927\u6691', '\u7acb\u79cb', '\u5904\u6691', '\u767d\u9732', '\u79cb\u5206', '\u5bd2\u9732', '\u971c\u964d', '\u7acb\u51ac', '\u5c0f\u96ea', '\u5927\u96ea', '\u51ac\u81f3'], + + /** + * 1900-2100各年的24节气日期速查表 + * @Array Of Property + * @return 0x string For splice + */ + sTermInfo: ['9778397bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e', '97bcf97c3598082c95f8c965cc920f', + '97bd0b06bdb0722c965ce1cfcc920f', 'b027097bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e', + '97bcf97c359801ec95f8c965cc920f', '97bd0b06bdb0722c965ce1cfcc920f', 'b027097bd097c36b0b6fc9274c91aa', + '97b6b97bd19801ec9210c965cc920e', '97bcf97c359801ec95f8c965cc920f', '97bd0b06bdb0722c965ce1cfcc920f', + 'b027097bd097c36b0b6fc9274c91aa', '9778397bd19801ec9210c965cc920e', '97b6b97bd19801ec95f8c965cc920f', + '97bd09801d98082c95f8e1cfcc920f', '97bd097bd097c36b0b6fc9210c8dc2', '9778397bd197c36c9210c9274c91aa', + '97b6b97bd19801ec95f8c965cc920e', '97bd09801d98082c95f8e1cfcc920f', '97bd097bd097c36b0b6fc9210c8dc2', + '9778397bd097c36c9210c9274c91aa', '97b6b97bd19801ec95f8c965cc920e', '97bcf97c3598082c95f8e1cfcc920f', + '97bd097bd097c36b0b6fc9210c8dc2', '9778397bd097c36c9210c9274c91aa', '97b6b97bd19801ec9210c965cc920e', + '97bcf97c3598082c95f8c965cc920f', '97bd097bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa', + '97b6b97bd19801ec9210c965cc920e', '97bcf97c3598082c95f8c965cc920f', '97bd097bd097c35b0b6fc920fb0722', + '9778397bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e', '97bcf97c359801ec95f8c965cc920f', + '97bd097bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e', + '97bcf97c359801ec95f8c965cc920f', '97bd097bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa', + '97b6b97bd19801ec9210c965cc920e', '97bcf97c359801ec95f8c965cc920f', '97bd097bd07f595b0b6fc920fb0722', + '9778397bd097c36b0b6fc9210c8dc2', '9778397bd19801ec9210c9274c920e', '97b6b97bd19801ec95f8c965cc920f', + '97bd07f5307f595b0b0bc920fb0722', '7f0e397bd097c36b0b6fc9210c8dc2', '9778397bd097c36c9210c9274c920e', + '97b6b97bd19801ec95f8c965cc920f', '97bd07f5307f595b0b0bc920fb0722', '7f0e397bd097c36b0b6fc9210c8dc2', + '9778397bd097c36c9210c9274c91aa', '97b6b97bd19801ec9210c965cc920e', '97bd07f1487f595b0b0bc920fb0722', + '7f0e397bd097c36b0b6fc9210c8dc2', '9778397bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e', + '97bcf7f1487f595b0b0bb0b6fb0722', '7f0e397bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa', + '97b6b97bd19801ec9210c965cc920e', '97bcf7f1487f595b0b0bb0b6fb0722', '7f0e397bd097c35b0b6fc920fb0722', + '9778397bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e', '97bcf7f1487f531b0b0bb0b6fb0722', + '7f0e397bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e', + '97bcf7f1487f531b0b0bb0b6fb0722', '7f0e397bd07f595b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa', + '97b6b97bd19801ec9210c9274c920e', '97bcf7f0e47f531b0b0bb0b6fb0722', '7f0e397bd07f595b0b0bc920fb0722', + '9778397bd097c36b0b6fc9210c91aa', '97b6b97bd197c36c9210c9274c920e', '97bcf7f0e47f531b0b0bb0b6fb0722', + '7f0e397bd07f595b0b0bc920fb0722', '9778397bd097c36b0b6fc9210c8dc2', '9778397bd097c36c9210c9274c920e', + '97b6b7f0e47f531b0723b0b6fb0722', '7f0e37f5307f595b0b0bc920fb0722', '7f0e397bd097c36b0b6fc9210c8dc2', + '9778397bd097c36b0b70c9274c91aa', '97b6b7f0e47f531b0723b0b6fb0721', '7f0e37f1487f595b0b0bb0b6fb0722', + '7f0e397bd097c35b0b6fc9210c8dc2', '9778397bd097c36b0b6fc9274c91aa', '97b6b7f0e47f531b0723b0b6fb0721', + '7f0e27f1487f595b0b0bb0b6fb0722', '7f0e397bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa', + '97b6b7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722', '7f0e397bd097c35b0b6fc920fb0722', + '9778397bd097c36b0b6fc9274c91aa', '97b6b7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722', + '7f0e397bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa', '97b6b7f0e47f531b0723b0b6fb0721', + '7f0e27f1487f531b0b0bb0b6fb0722', '7f0e397bd07f595b0b0bc920fb0722', '9778397bd097c36b0b6fc9274c91aa', + '97b6b7f0e47f531b0723b0787b0721', '7f0e27f0e47f531b0b0bb0b6fb0722', '7f0e397bd07f595b0b0bc920fb0722', + '9778397bd097c36b0b6fc9210c91aa', '97b6b7f0e47f149b0723b0787b0721', '7f0e27f0e47f531b0723b0b6fb0722', + '7f0e397bd07f595b0b0bc920fb0722', '9778397bd097c36b0b6fc9210c8dc2', '977837f0e37f149b0723b0787b0721', + '7f07e7f0e47f531b0723b0b6fb0722', '7f0e37f5307f595b0b0bc920fb0722', '7f0e397bd097c35b0b6fc9210c8dc2', + '977837f0e37f14998082b0787b0721', '7f07e7f0e47f531b0723b0b6fb0721', '7f0e37f1487f595b0b0bb0b6fb0722', + '7f0e397bd097c35b0b6fc9210c8dc2', '977837f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721', + '7f0e27f1487f531b0b0bb0b6fb0722', '7f0e397bd097c35b0b6fc920fb0722', '977837f0e37f14998082b0787b06bd', + '7f07e7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722', '7f0e397bd097c35b0b6fc920fb0722', + '977837f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722', + '7f0e397bd07f595b0b0bc920fb0722', '977837f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721', + '7f0e27f1487f531b0b0bb0b6fb0722', '7f0e397bd07f595b0b0bc920fb0722', '977837f0e37f14998082b0787b06bd', + '7f07e7f0e47f149b0723b0787b0721', '7f0e27f0e47f531b0b0bb0b6fb0722', '7f0e397bd07f595b0b0bc920fb0722', + '977837f0e37f14998082b0723b06bd', '7f07e7f0e37f149b0723b0787b0721', '7f0e27f0e47f531b0723b0b6fb0722', + '7f0e397bd07f595b0b0bc920fb0722', '977837f0e37f14898082b0723b02d5', '7ec967f0e37f14998082b0787b0721', + '7f07e7f0e47f531b0723b0b6fb0722', '7f0e37f1487f595b0b0bb0b6fb0722', '7f0e37f0e37f14898082b0723b02d5', + '7ec967f0e37f14998082b0787b0721', '7f07e7f0e47f531b0723b0b6fb0722', '7f0e37f1487f531b0b0bb0b6fb0722', + '7f0e37f0e37f14898082b0723b02d5', '7ec967f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721', + '7f0e37f1487f531b0b0bb0b6fb0722', '7f0e37f0e37f14898082b072297c35', '7ec967f0e37f14998082b0787b06bd', + '7f07e7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722', '7f0e37f0e37f14898082b072297c35', + '7ec967f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722', + '7f0e37f0e366aa89801eb072297c35', '7ec967f0e37f14998082b0787b06bd', '7f07e7f0e47f149b0723b0787b0721', + '7f0e27f1487f531b0b0bb0b6fb0722', '7f0e37f0e366aa89801eb072297c35', '7ec967f0e37f14998082b0723b06bd', + '7f07e7f0e47f149b0723b0787b0721', '7f0e27f0e47f531b0723b0b6fb0722', '7f0e37f0e366aa89801eb072297c35', + '7ec967f0e37f14998082b0723b06bd', '7f07e7f0e37f14998083b0787b0721', '7f0e27f0e47f531b0723b0b6fb0722', + '7f0e37f0e366aa89801eb072297c35', '7ec967f0e37f14898082b0723b02d5', '7f07e7f0e37f14998082b0787b0721', + '7f07e7f0e47f531b0723b0b6fb0722', '7f0e36665b66aa89801e9808297c35', '665f67f0e37f14898082b0723b02d5', + '7ec967f0e37f14998082b0787b0721', '7f07e7f0e47f531b0723b0b6fb0722', '7f0e36665b66a449801e9808297c35', + '665f67f0e37f14898082b0723b02d5', '7ec967f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721', + '7f0e36665b66a449801e9808297c35', '665f67f0e37f14898082b072297c35', '7ec967f0e37f14998082b0787b06bd', + '7f07e7f0e47f531b0723b0b6fb0721', '7f0e26665b66a449801e9808297c35', '665f67f0e37f1489801eb072297c35', + '7ec967f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722'], + + /** + * 数字转中文速查表 + * @Array Of Property + * @trans ['日','一','二','三','四','五','六','七','八','九','十'] + * @return Cn string + */ + nStr1: ['\u65e5', '\u4e00', '\u4e8c', '\u4e09', '\u56db', '\u4e94', '\u516d', '\u4e03', '\u516b', '\u4e5d', '\u5341'], + + /** + * 日期转农历称呼速查表 + * @Array Of Property + * @trans ['初','十','廿','卅'] + * @return Cn string + */ + nStr2: ['\u521d', '\u5341', '\u5eff', '\u5345'], + + /** + * 月份转农历称呼速查表 + * @Array Of Property + * @trans ['正','一','二','三','四','五','六','七','八','九','十','冬','腊'] + * @return Cn string + */ + nStr3: ['\u6b63', '\u4e8c', '\u4e09', '\u56db', '\u4e94', '\u516d', '\u4e03', '\u516b', '\u4e5d', '\u5341', '\u51ac', '\u814a'], + + /** + * 返回农历y年一整年的总天数 + * @param lunar Year + * @return Number + * @eg:var count = calendar.lYearDays(1987) ;//count=387 + */ + lYearDays: function (y) { + var i; var sum = 348 + for (i = 0x8000; i > 0x8; i >>= 1) { sum += (this.lunarInfo[y - 1900] & i) ? 1 : 0 } + return (sum + this.leapDays(y)) + }, + + /** + * 返回农历y年闰月是哪个月;若y年没有闰月 则返回0 + * @param lunar Year + * @return Number (0-12) + * @eg:var leapMonth = calendar.leapMonth(1987) ;//leapMonth=6 + */ + leapMonth: function (y) { // 闰字编码 \u95f0 + return (this.lunarInfo[y - 1900] & 0xf) + }, + + /** + * 返回农历y年闰月的天数 若该年没有闰月则返回0 + * @param lunar Year + * @return Number (0、29、30) + * @eg:var leapMonthDay = calendar.leapDays(1987) ;//leapMonthDay=29 + */ + leapDays: function (y) { + if (this.leapMonth(y)) { + return ((this.lunarInfo[y - 1900] & 0x10000) ? 30 : 29) + } + return (0) + }, + + /** + * 返回农历y年m月(非闰月)的总天数,计算m为闰月时的天数请使用leapDays方法 + * @param lunar Year + * @return Number (-1、29、30) + * @eg:var MonthDay = calendar.monthDays(1987,9) ;//MonthDay=29 + */ + monthDays: function (y, m) { + if (m > 12 || m < 1) { return -1 }// 月份参数从1至12,参数错误返回-1 + return ((this.lunarInfo[y - 1900] & (0x10000 >> m)) ? 30 : 29) + }, + + /** + * 返回公历(!)y年m月的天数 + * @param solar Year + * @return Number (-1、28、29、30、31) + * @eg:var solarMonthDay = calendar.leapDays(1987) ;//solarMonthDay=30 + */ + solarDays: function (y, m) { + if (m > 12 || m < 1) { return -1 } // 若参数错误 返回-1 + var ms = m - 1 + if (ms == 1) { // 2月份的闰平规律测算后确认返回28或29 + return (((y % 4 == 0) && (y % 100 != 0) || (y % 400 == 0)) ? 29 : 28) + } else { + return (this.solarMonth[ms]) + } + }, + + /** + * 农历年份转换为干支纪年 + * @param lYear 农历年的年份数 + * @return Cn string + */ + toGanZhiYear: function (lYear) { + var ganKey = (lYear - 3) % 10 + var zhiKey = (lYear - 3) % 12 + if (ganKey == 0) ganKey = 10// 如果余数为0则为最后一个天干 + if (zhiKey == 0) zhiKey = 12// 如果余数为0则为最后一个地支 + return this.Gan[ganKey - 1] + this.Zhi[zhiKey - 1] + }, + + /** + * 公历月、日判断所属星座 + * @param cMonth [description] + * @param cDay [description] + * @return Cn string + */ + toAstro: function (cMonth, cDay) { + var s = '\u9b54\u7faf\u6c34\u74f6\u53cc\u9c7c\u767d\u7f8a\u91d1\u725b\u53cc\u5b50\u5de8\u87f9\u72ee\u5b50\u5904\u5973\u5929\u79e4\u5929\u874e\u5c04\u624b\u9b54\u7faf' + var arr = [20, 19, 21, 21, 21, 22, 23, 23, 23, 23, 22, 22] + return s.substr(cMonth * 2 - (cDay < arr[cMonth - 1] ? 2 : 0), 2) + '\u5ea7'// 座 + }, + + /** + * 传入offset偏移量返回干支 + * @param offset 相对甲子的偏移量 + * @return Cn string + */ + toGanZhi: function (offset) { + return this.Gan[offset % 10] + this.Zhi[offset % 12] + }, + + /** + * 传入公历(!)y年获得该年第n个节气的公历日期 + * @param y公历年(1900-2100);n二十四节气中的第几个节气(1~24);从n=1(小寒)算起 + * @return day Number + * @eg:var _24 = calendar.getTerm(1987,3) ;//_24=4;意即1987年2月4日立春 + */ + getTerm: function (y, n) { + if (y < 1900 || y > 2100) { return -1 } + if (n < 1 || n > 24) { return -1 } + var _table = this.sTermInfo[y - 1900] + var _info = [ + parseInt('0x' + _table.substr(0, 5)).toString(), + parseInt('0x' + _table.substr(5, 5)).toString(), + parseInt('0x' + _table.substr(10, 5)).toString(), + parseInt('0x' + _table.substr(15, 5)).toString(), + parseInt('0x' + _table.substr(20, 5)).toString(), + parseInt('0x' + _table.substr(25, 5)).toString() + ] + var _calday = [ + _info[0].substr(0, 1), + _info[0].substr(1, 2), + _info[0].substr(3, 1), + _info[0].substr(4, 2), + + _info[1].substr(0, 1), + _info[1].substr(1, 2), + _info[1].substr(3, 1), + _info[1].substr(4, 2), + + _info[2].substr(0, 1), + _info[2].substr(1, 2), + _info[2].substr(3, 1), + _info[2].substr(4, 2), + + _info[3].substr(0, 1), + _info[3].substr(1, 2), + _info[3].substr(3, 1), + _info[3].substr(4, 2), + + _info[4].substr(0, 1), + _info[4].substr(1, 2), + _info[4].substr(3, 1), + _info[4].substr(4, 2), + + _info[5].substr(0, 1), + _info[5].substr(1, 2), + _info[5].substr(3, 1), + _info[5].substr(4, 2) + ] + return parseInt(_calday[n - 1]) + }, + + /** + * 传入农历数字月份返回汉语通俗表示法 + * @param lunar month + * @return Cn string + * @eg:var cnMonth = calendar.toChinaMonth(12) ;//cnMonth='腊月' + */ + toChinaMonth: function (m) { // 月 => \u6708 + if (m > 12 || m < 1) { return -1 } // 若参数错误 返回-1 + var s = this.nStr3[m - 1] + s += '\u6708'// 加上月字 + return s + }, + + /** + * 传入农历日期数字返回汉字表示法 + * @param lunar day + * @return Cn string + * @eg:var cnDay = calendar.toChinaDay(21) ;//cnMonth='廿一' + */ + toChinaDay: function (d) { // 日 => \u65e5 + var s + switch (d) { + case 10: + s = '\u521d\u5341'; break + case 20: + s = '\u4e8c\u5341'; break + break + case 30: + s = '\u4e09\u5341'; break + break + default : + s = this.nStr2[Math.floor(d / 10)] + s += this.nStr1[d % 10] + } + return (s) + }, + + /** + * 年份转生肖[!仅能大致转换] => 精确划分生肖分界线是“立春” + * @param y year + * @return Cn string + * @eg:var animal = calendar.getAnimal(1987) ;//animal='兔' + */ + getAnimal: function (y) { + return this.Animals[(y - 4) % 12] + }, + + /** + * 传入阳历年月日获得详细的公历、农历object信息 <=>JSON + * @param y solar year + * @param m solar month + * @param d solar day + * @return JSON object + * @eg:console.log(calendar.solar2lunar(1987,11,01)); + */ + solar2lunar: function (y, m, d) { // 参数区间1900.1.31~2100.12.31 + // 年份限定、上限 + if (y < 1900 || y > 2100) { + return -1// undefined转换为数字变为NaN + } + // 公历传参最下限 + if (y == 1900 && m == 1 && d < 31) { + return -1 + } + // 未传参 获得当天 + if (!y) { + var objDate = new Date() + } else { + var objDate = new Date(y, parseInt(m) - 1, d) + } + var i; var leap = 0; var temp = 0 + // 修正ymd参数 + var y = objDate.getFullYear() + var m = objDate.getMonth() + 1 + var d = objDate.getDate() + var offset = (Date.UTC(objDate.getFullYear(), objDate.getMonth(), objDate.getDate()) - Date.UTC(1900, 0, 31)) / 86400000 + for (i = 1900; i < 2101 && offset > 0; i++) { + temp = this.lYearDays(i) + offset -= temp + } + if (offset < 0) { + offset += temp; i-- + } + + // 是否今天 + var isTodayObj = new Date() + var isToday = false + if (isTodayObj.getFullYear() == y && isTodayObj.getMonth() + 1 == m && isTodayObj.getDate() == d) { + isToday = true + } + // 星期几 + var nWeek = objDate.getDay() + var cWeek = this.nStr1[nWeek] + // 数字表示周几顺应天朝周一开始的惯例 + if (nWeek == 0) { + nWeek = 7 + } + // 农历年 + var year = i + var leap = this.leapMonth(i) // 闰哪个月 + var isLeap = false + + // 效验闰月 + for (i = 1; i < 13 && offset > 0; i++) { + // 闰月 + if (leap > 0 && i == (leap + 1) && isLeap == false) { + --i + isLeap = true; temp = this.leapDays(year) // 计算农历闰月天数 + } else { + temp = this.monthDays(year, i)// 计算农历普通月天数 + } + // 解除闰月 + if (isLeap == true && i == (leap + 1)) { isLeap = false } + offset -= temp + } + // 闰月导致数组下标重叠取反 + if (offset == 0 && leap > 0 && i == leap + 1) { + if (isLeap) { + isLeap = false + } else { + isLeap = true; --i + } + } + if (offset < 0) { + offset += temp; --i + } + // 农历月 + var month = i + // 农历日 + var day = offset + 1 + // 天干地支处理 + var sm = m - 1 + var gzY = this.toGanZhiYear(year) + + // 当月的两个节气 + // bugfix-2017-7-24 11:03:38 use lunar Year Param `y` Not `year` + var firstNode = this.getTerm(y, (m * 2 - 1))// 返回当月「节」为几日开始 + var secondNode = this.getTerm(y, (m * 2))// 返回当月「节」为几日开始 + + // 依据12节气修正干支月 + var gzM = this.toGanZhi((y - 1900) * 12 + m + 11) + if (d >= firstNode) { + gzM = this.toGanZhi((y - 1900) * 12 + m + 12) + } + + // 传入的日期的节气与否 + var isTerm = false + var Term = null + if (firstNode == d) { + isTerm = true + Term = this.solarTerm[m * 2 - 2] + } + if (secondNode == d) { + isTerm = true + Term = this.solarTerm[m * 2 - 1] + } + // 日柱 当月一日与 1900/1/1 相差天数 + var dayCyclical = Date.UTC(y, sm, 1, 0, 0, 0, 0) / 86400000 + 25567 + 10 + var gzD = this.toGanZhi(dayCyclical + d - 1) + // 该日期所属的星座 + var astro = this.toAstro(m, d) + + return { 'lYear': year, 'lMonth': month, 'lDay': day, 'Animal': this.getAnimal(year), 'IMonthCn': (isLeap ? '\u95f0' : '') + this.toChinaMonth(month), 'IDayCn': this.toChinaDay(day), 'cYear': y, 'cMonth': m, 'cDay': d, 'gzYear': gzY, 'gzMonth': gzM, 'gzDay': gzD, 'isToday': isToday, 'isLeap': isLeap, 'nWeek': nWeek, 'ncWeek': '\u661f\u671f' + cWeek, 'isTerm': isTerm, 'Term': Term, 'astro': astro } + }, + + /** + * 传入农历年月日以及传入的月份是否闰月获得详细的公历、农历object信息 <=>JSON + * @param y lunar year + * @param m lunar month + * @param d lunar day + * @param isLeapMonth lunar month is leap or not.[如果是农历闰月第四个参数赋值true即可] + * @return JSON object + * @eg:console.log(calendar.lunar2solar(1987,9,10)); + */ + lunar2solar: function (y, m, d, isLeapMonth) { // 参数区间1900.1.31~2100.12.1 + var isLeapMonth = !!isLeapMonth + var leapOffset = 0 + var leapMonth = this.leapMonth(y) + var leapDay = this.leapDays(y) + if (isLeapMonth && (leapMonth != m)) { return -1 }// 传参要求计算该闰月公历 但该年得出的闰月与传参的月份并不同 + if (y == 2100 && m == 12 && d > 1 || y == 1900 && m == 1 && d < 31) { return -1 }// 超出了最大极限值 + var day = this.monthDays(y, m) + var _day = day + // bugFix 2016-9-25 + // if month is leap, _day use leapDays method + if (isLeapMonth) { + _day = this.leapDays(y, m) + } + if (y < 1900 || y > 2100 || d > _day) { return -1 }// 参数合法性效验 + + // 计算农历的时间差 + var offset = 0 + for (var i = 1900; i < y; i++) { + offset += this.lYearDays(i) + } + var leap = 0; var isAdd = false + for (var i = 1; i < m; i++) { + leap = this.leapMonth(y) + if (!isAdd) { // 处理闰月 + if (leap <= i && leap > 0) { + offset += this.leapDays(y); isAdd = true + } + } + offset += this.monthDays(y, i) + } + // 转换闰月农历 需补充该年闰月的前一个月的时差 + if (isLeapMonth) { offset += day } + // 1900年农历正月一日的公历时间为1900年1月30日0时0分0秒(该时间也是本农历的最开始起始点) + var stmap = Date.UTC(1900, 1, 30, 0, 0, 0) + var calObj = new Date((offset + d - 31) * 86400000 + stmap) + var cY = calObj.getUTCFullYear() + var cM = calObj.getUTCMonth() + 1 + var cD = calObj.getUTCDate() + + return this.solar2lunar(cY, cM, cD) + } +} + +export default calendar diff --git a/uni_modules/uni-calendar/components/uni-calendar/uni-calendar-item.vue b/uni_modules/uni-calendar/components/uni-calendar/uni-calendar-item.vue new file mode 100644 index 0000000..c66a58d --- /dev/null +++ b/uni_modules/uni-calendar/components/uni-calendar/uni-calendar-item.vue @@ -0,0 +1,170 @@ + + + + + diff --git a/uni_modules/uni-calendar/components/uni-calendar/uni-calendar.vue b/uni_modules/uni-calendar/components/uni-calendar/uni-calendar.vue new file mode 100644 index 0000000..9c856cc --- /dev/null +++ b/uni_modules/uni-calendar/components/uni-calendar/uni-calendar.vue @@ -0,0 +1,505 @@ + + + + + diff --git a/uni_modules/uni-calendar/components/uni-calendar/util.js b/uni_modules/uni-calendar/components/uni-calendar/util.js new file mode 100644 index 0000000..37f4432 --- /dev/null +++ b/uni_modules/uni-calendar/components/uni-calendar/util.js @@ -0,0 +1,352 @@ +import CALENDAR from './calendar.js' + +class Calendar { + constructor({ + date, + selected, + startDate, + endDate, + range + } = {}) { + // 当前日期 + this.date = this.getDate(new Date()) // 当前初入日期 + // 打点信息 + this.selected = selected || []; + // 范围开始 + this.startDate = startDate + // 范围结束 + this.endDate = endDate + this.range = range + // 多选状态 + this.cleanMultipleStatus() + // 每周日期 + this.weeks = {} + // this._getWeek(this.date.fullDate) + } + /** + * 设置日期 + * @param {Object} date + */ + setDate(date) { + this.selectDate = this.getDate(date) + this._getWeek(this.selectDate.fullDate) + } + + /** + * 清理多选状态 + */ + cleanMultipleStatus() { + this.multipleStatus = { + before: '', + after: '', + data: [] + } + } + + /** + * 重置开始日期 + */ + resetSatrtDate(startDate) { + // 范围开始 + this.startDate = startDate + + } + + /** + * 重置结束日期 + */ + resetEndDate(endDate) { + // 范围结束 + this.endDate = endDate + } + + /** + * 获取任意时间 + */ + getDate(date, AddDayCount = 0, str = 'day') { + if (!date) { + date = new Date() + } + if (typeof date !== 'object') { + date = date.replace(/-/g, '/') + } + const dd = new Date(date) + switch (str) { + case 'day': + dd.setDate(dd.getDate() + AddDayCount) // 获取AddDayCount天后的日期 + break + case 'month': + if (dd.getDate() === 31) { + dd.setDate(dd.getDate() + AddDayCount) + } else { + dd.setMonth(dd.getMonth() + AddDayCount) // 获取AddDayCount天后的日期 + } + break + case 'year': + dd.setFullYear(dd.getFullYear() + AddDayCount) // 获取AddDayCount天后的日期 + break + } + const y = dd.getFullYear() + const m = dd.getMonth() + 1 < 10 ? '0' + (dd.getMonth() + 1) : dd.getMonth() + 1 // 获取当前月份的日期,不足10补0 + const d = dd.getDate() < 10 ? '0' + dd.getDate() : dd.getDate() // 获取当前几号,不足10补0 + return { + fullDate: y + '-' + m + '-' + d, + year: y, + month: m, + date: d, + day: dd.getDay() + } + } + + + /** + * 获取上月剩余天数 + */ + _getLastMonthDays(firstDay, full) { + let dateArr = [] + for (let i = firstDay; i > 0; i--) { + const beforeDate = new Date(full.year, full.month - 1, -i + 1).getDate() + dateArr.push({ + date: beforeDate, + month: full.month - 1, + lunar: this.getlunar(full.year, full.month - 1, beforeDate), + disable: true + }) + } + return dateArr + } + /** + * 获取本月天数 + */ + _currentMonthDys(dateData, full) { + let dateArr = [] + let fullDate = this.date.fullDate + for (let i = 1; i <= dateData; i++) { + let isinfo = false + let nowDate = full.year + '-' + (full.month < 10 ? + full.month : full.month) + '-' + (i < 10 ? + '0' + i : i) + // 是否今天 + let isDay = fullDate === nowDate + // 获取打点信息 + let info = this.selected && this.selected.find((item) => { + if (this.dateEqual(nowDate, item.date)) { + return item + } + }) + + // 日期禁用 + let disableBefore = true + let disableAfter = true + if (this.startDate) { + let dateCompBefore = this.dateCompare(this.startDate, fullDate) + disableBefore = this.dateCompare(dateCompBefore ? this.startDate : fullDate, nowDate) + } + + if (this.endDate) { + let dateCompAfter = this.dateCompare(fullDate, this.endDate) + disableAfter = this.dateCompare(nowDate, dateCompAfter ? this.endDate : fullDate) + } + let multiples = this.multipleStatus.data + let checked = false + let multiplesStatus = -1 + if (this.range) { + if (multiples) { + multiplesStatus = multiples.findIndex((item) => { + return this.dateEqual(item, nowDate) + }) + } + if (multiplesStatus !== -1) { + checked = true + } + } + let data = { + fullDate: nowDate, + year: full.year, + date: i, + multiple: this.range ? checked : false, + beforeMultiple: this.dateEqual(this.multipleStatus.before, nowDate), + afterMultiple: this.dateEqual(this.multipleStatus.after, nowDate), + month: full.month, + lunar: this.getlunar(full.year, full.month, i), + disable: !disableBefore || !disableAfter, + isDay + } + if (info) { + data.extraInfo = info + } + + dateArr.push(data) + } + return dateArr + } + /** + * 获取下月天数 + */ + _getNextMonthDays(surplus, full) { + let dateArr = [] + for (let i = 1; i < surplus + 1; i++) { + dateArr.push({ + date: i, + month: Number(full.month) + 1, + lunar: this.getlunar(full.year, Number(full.month) + 1, i), + disable: true + }) + } + return dateArr + } + + /** + * 获取当前日期详情 + * @param {Object} date + */ + getInfo(date) { + if (!date) { + date = new Date() + } + const dateInfo = this.canlender.find(item => item.fullDate === this.getDate(date).fullDate) + return dateInfo + } + + /** + * 比较时间大小 + */ + dateCompare(startDate, endDate) { + // 计算截止时间 + startDate = new Date(startDate.replace('-', '/').replace('-', '/')) + // 计算详细项的截止时间 + endDate = new Date(endDate.replace('-', '/').replace('-', '/')) + if (startDate <= endDate) { + return true + } else { + return false + } + } + + /** + * 比较时间是否相等 + */ + dateEqual(before, after) { + // 计算截止时间 + before = new Date(before.replace('-', '/').replace('-', '/')) + // 计算详细项的截止时间 + after = new Date(after.replace('-', '/').replace('-', '/')) + if (before.getTime() - after.getTime() === 0) { + return true + } else { + return false + } + } + + + /** + * 获取日期范围内所有日期 + * @param {Object} begin + * @param {Object} end + */ + geDateAll(begin, end) { + var arr = [] + var ab = begin.split('-') + var ae = end.split('-') + var db = new Date() + db.setFullYear(ab[0], ab[1] - 1, ab[2]) + var de = new Date() + de.setFullYear(ae[0], ae[1] - 1, ae[2]) + var unixDb = db.getTime() - 24 * 60 * 60 * 1000 + var unixDe = de.getTime() - 24 * 60 * 60 * 1000 + for (var k = unixDb; k <= unixDe;) { + k = k + 24 * 60 * 60 * 1000 + arr.push(this.getDate(new Date(parseInt(k))).fullDate) + } + return arr + } + /** + * 计算阴历日期显示 + */ + getlunar(year, month, date) { + return CALENDAR.solar2lunar(year, month, date) + } + /** + * 设置打点 + */ + setSelectInfo(data, value) { + this.selected = value + this._getWeek(data) + } + + /** + * 获取多选状态 + */ + setMultiple(fullDate) { + let { + before, + after + } = this.multipleStatus + + if (!this.range) return + if (before && after) { + this.multipleStatus.before = '' + this.multipleStatus.after = '' + this.multipleStatus.data = [] + } else { + if (!before) { + this.multipleStatus.before = fullDate + } else { + this.multipleStatus.after = fullDate + if (this.dateCompare(this.multipleStatus.before, this.multipleStatus.after)) { + this.multipleStatus.data = this.geDateAll(this.multipleStatus.before, this.multipleStatus.after); + } else { + this.multipleStatus.data = this.geDateAll(this.multipleStatus.after, this.multipleStatus.before); + } + } + } + this._getWeek(fullDate) + } + + /** + * 获取每周数据 + * @param {Object} dateData + */ + _getWeek(dateData) { + const { + fullDate, + year, + month, + date, + day + } = this.getDate(dateData) + let firstDay = new Date(year, month - 1, 1).getDay() + let currentDay = new Date(year, month, 0).getDate() + let dates = { + lastMonthDays: this._getLastMonthDays(firstDay, this.getDate(dateData)), // 上个月末尾几天 + currentMonthDys: this._currentMonthDys(currentDay, this.getDate(dateData)), // 本月天数 + nextMonthDays: [], // 下个月开始几天 + weeks: [] + } + let canlender = [] + const surplus = 42 - (dates.lastMonthDays.length + dates.currentMonthDys.length) + dates.nextMonthDays = this._getNextMonthDays(surplus, this.getDate(dateData)) + canlender = canlender.concat(dates.lastMonthDays, dates.currentMonthDys, dates.nextMonthDays) + let weeks = {} + // 拼接数组 上个月开始几天 + 本月天数+ 下个月开始几天 + for (let i = 0; i < canlender.length; i++) { + if (i % 7 === 0) { + weeks[parseInt(i / 7)] = new Array(7) + } + weeks[parseInt(i / 7)][i % 7] = canlender[i] + } + this.canlender = canlender + this.weeks = weeks + } + + //静态方法 + // static init(date) { + // if (!this.instance) { + // this.instance = new Calendar(date); + // } + // return this.instance; + // } +} + + +export default Calendar diff --git a/uni_modules/uni-calendar/package.json b/uni_modules/uni-calendar/package.json new file mode 100644 index 0000000..158377b --- /dev/null +++ b/uni_modules/uni-calendar/package.json @@ -0,0 +1,81 @@ +{ + "id": "uni-calendar", + "displayName": "Calendar 日历", + "version": "1.3.15", + "description": "日历组件", + "keywords": [ + "日历", + "打卡", + "日历选择" +], + "repository": "https://github.com/dcloudio/uni-ui", + "engines": { + "HBuilderX": "" + }, + "directories": { + "example": "../../temps/example_temps" + }, + "dcloudext": { + "category": [ + "前端组件", + "通用组件" + ], + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "无", + "permissions": "无" + }, + "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui" + }, + "uni_modules": { + "dependencies": [], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "App": { + "app-vue": "y", + "app-nvue": "y" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y" + }, + "快应用": { + "华为": "u", + "联盟": "u" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uni-calendar/readme.md b/uni_modules/uni-calendar/readme.md new file mode 100644 index 0000000..5475fec --- /dev/null +++ b/uni_modules/uni-calendar/readme.md @@ -0,0 +1,96 @@ + + +## Calendar 日历 +> 代码块: `uCalendar` + + +日历组件 + +> 为了避免错误使用,给大家带来不好的开发体验,请在使用组件前仔细阅读下面的注意事项,可以帮你避免一些错误。 +> - 本组件农历转换使用的js是 [@1900-2100区间内的公历、农历互转](https://github.com/jjonline/calendar.js) +> - 仅支持自定义组件模式 +> - `date`属性传入的应该是一个 String ,如: 2019-06-27 ,而不是 new Date() +> - 通过 `insert` 属性来确定当前的事件是 @change 还是 @confirm 。理应合并为一个事件,但是为了区分模式,现使用两个事件,这里需要注意 +> - 弹窗模式下无法阻止后面的元素滚动,如有需要阻止,请在弹窗弹出后,手动设置滚动元素为不可滚动 + + +### 安装方式 + +本组件符合[easycom](https://uniapp.dcloud.io/collocation/pages?id=easycom)规范,`HBuilderX 2.5.5`起,只需将本组件导入项目,在页面`template`中即可直接使用,无需在页面中`import`和注册`components`。 + +如需通过`npm`方式使用`uni-ui`组件,另见文档:[https://ext.dcloud.net.cn/plugin?id=55](https://ext.dcloud.net.cn/plugin?id=55) + +### 基本用法 + +在 ``template`` 中使用组件 + +```html + + + +``` + +### 通过方法打开日历 + +需要设置 `insert` 为 `false` + +```html + + + + +``` + +```javascript + +export default { + data() { + return {}; + }, + methods: { + open(){ + this.$refs.calendar.open(); + }, + confirm(e) { + console.log(e); + } + } +}; + +``` + + +## API + +### Calendar Props + +| 属性名 | 类型 | 默认值| 说明 | +| | | +| date | String |- | 自定义当前时间,默认为今天 | +| lunar | Boolean | false | 显示农历 | +| startDate | String |- | 日期选择范围-开始日期 | +| endDate | String |- | 日期选择范围-结束日期 | +| range | Boolean | false | 范围选择 | +| insert | Boolean | false | 插入模式,可选值,ture:插入模式;false:弹窗模式;默认为插入模式 | +|clearDate |Boolean |true |弹窗模式是否清空上次选择内容 | +| selected | Array |- | 打点,期待格式[{date: '2019-06-27', info: '签到', data: { custom: '自定义信息', name: '自定义消息头',xxx:xxx... }}] | +|showMonth | Boolean | true | 是否显示月份为背景 | + +### Calendar Events + +| 事件名 | 说明 |返回值| +| | | | +| open | 弹出日历组件,`insert :false` 时生效|- | + + + diff --git a/uni_modules/uni-captcha/changelog.md b/uni_modules/uni-captcha/changelog.md new file mode 100644 index 0000000..73b1692 --- /dev/null +++ b/uni_modules/uni-captcha/changelog.md @@ -0,0 +1,2 @@ +## 0.1.0(2021-03-01) +- 调整为uni_modules目录规范 diff --git a/uni_modules/uni-captcha/package.json b/uni_modules/uni-captcha/package.json new file mode 100644 index 0000000..0a36849 --- /dev/null +++ b/uni_modules/uni-captcha/package.json @@ -0,0 +1,80 @@ +{ + "id": "uni-captcha", + "displayName": "uni-captcha", + "version": "0.1.0", + "description": "简洁、高效、灵活可配置的云端验证码模块", + "keywords": [ + "uniCloud", + "captcha", + "验证码", + "图形验证码", + "人机验证" +], + "repository": "https://gitee.com/dcloud/uni-captcha", + "engines": { + "HBuilderX": "^3.1.0" + }, + "dcloudext": { + "category": [ + "uniCloud", + "云函数模板" + ], + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "无", + "permissions": "无" + }, + "npmurl": "" + }, + "uni_modules": { + "dependencies": [], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "App": { + "app-vue": "u", + "app-nvue": "u" + }, + "H5-mobile": { + "Safari": "u", + "Android Browser": "u", + "微信浏览器(Android)": "u", + "QQ浏览器(Android)": "u" + }, + "H5-pc": { + "Chrome": "u", + "IE": "u", + "Edge": "u", + "Firefox": "u", + "Safari": "u" + }, + "小程序": { + "微信": "u", + "阿里": "u", + "百度": "u", + "字节跳动": "u", + "QQ": "u" + }, + "快应用": { + "华为": "u", + "联盟": "u" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uni-captcha/readme.md b/uni_modules/uni-captcha/readme.md new file mode 100644 index 0000000..295d852 --- /dev/null +++ b/uni_modules/uni-captcha/readme.md @@ -0,0 +1,92 @@ +## uni 验证码验证文档 + +> 用途:主要使用在登录、需要人机校验或其他限制调用的场景 + +> 验证码生成、校验都在服务端。页面使用返回的 base64 显示。[云端一体登陆模板](https://ext.dcloud.net.cn/plugin?id=13)已集成,可下载体验。 + +> 数据表使用[opendb-verify-codes](https://gitee.com/dcloud/opendb/blob/master/collection/opendb-verify-codes/collection.json) + +### 获取验证码@create + +用法:`uniCaptcha.create(Object params);` + +**参数说明** + +| 字段 | 类型 | 必填 | 默认值 | 说明 | +| --------------- | ------ | ---- | ------- | ----------------------------------------------- | +| scene | String | 是 | 4 | 使用场景值,用于防止不同功能的验证码混用 | +| deviceId | String | - | - | 设备 id,如果不传,将自动从 uniCloud 上下文获取 | +| width | Number | - | 100 | 图片宽度 | +| height | Number | - | 40 | 图片高度 | +| backgroundColor | String | - | #FFFAE8 | 验证码背景色 | +| size | Number | - | 4 | 验证码长度,最多 6 个字符 | +| noise | Number | - | 4 | 验证码干扰线条数 | +| expiresDate | Number | - | 180 | 验证码过期时间(s) | + +**响应参数** + +| 字段 | 类型 | 说明 | +| ------------- | ------ | ------------------- | +| code | Number | 错误码,0 表示成功 | +| message | String | 详细信息 | +| captchaBase64 | String | 验证码:base64 格式 | + +`注意:` + +- 重新生成后,上条验证码作废 + +### 校验验证码@verify + +用法:`uniCaptcha.verify(Object params);` + +**参数说明** + +| 字段 | 类型 | 必填 | 默认值 | 说明 | +| -------- | ------ | ---- | ------ | ----------------------------------------------- | +| scene | String | 是 | - | 类型,用于防止不同功能的验证码混用 | +| captcha | String | 是 | - | 验证码 | +| deviceId | String | - | - | 设备 id,如果不传,将自动从 uniCloud 上下文获取 | + +**响应参数** + +| 字段 | 类型 | 说明 | +| ------- | ------ | ------------------ | +| code | Number | 错误码,0 表示成功 | +| message | String | 详细信息 | + +`注意:` + +- 若提示验证码失效,请重新获取 + +### 刷新验证码@refresh + +用法:`uniCaptcha.refresh(Object params);` + +**参数说明** + +| 字段 | 类型 | 必填 | 默认值 | 说明 | +| -------- | ------ | ---- | ------ | ----------------------------------------------- | +| scene | String | 是 | - | 类型,用于防止不同功能的验证码混用 | +| deviceId | String | - | - | 设备 id,如果不传,将自动从 uniCloud 上下文获取 | + +**响应参数** + +| 字段 | 类型 | 说明 | +| ------------- | ------ | ------------------- | +| code | Number | 错误码,0 表示成功 | +| message | String | 详细信息 | +| captchaBase64 | String | 验证码:base64 格式 | + +`注意:` + +- 支持传入 create 方法的所有参数,如果不传,则自动按照 deviceId 匹配上次生成时的配置生成新的验证码 + +## 错误码 + +_详细信息请查看 message 中查看_ + +| 模块 | 模块码 | 错误代码 | 错误信息 | +| :----: | :----: | :------: | :---------------------: | +| 验证码 | 100 | 01 | (10001)验证码生成失败 | +| | | 02 | (10002)验证码校验失败 | +| | | 03 | (10003)验证码刷新失败 | diff --git a/uni_modules/uni-captcha/uniCloud/cloudfunctions/common/uni-captcha/LICENSE.md b/uni_modules/uni-captcha/uniCloud/cloudfunctions/common/uni-captcha/LICENSE.md new file mode 100644 index 0000000..261eeb9 --- /dev/null +++ b/uni_modules/uni-captcha/uniCloud/cloudfunctions/common/uni-captcha/LICENSE.md @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/uni_modules/uni-captcha/uniCloud/cloudfunctions/common/uni-captcha/index.js b/uni_modules/uni-captcha/uniCloud/cloudfunctions/common/uni-captcha/index.js new file mode 100644 index 0000000..3bc88f4 --- /dev/null +++ b/uni_modules/uni-captcha/uniCloud/cloudfunctions/common/uni-captcha/index.js @@ -0,0 +1 @@ +"use strict";var t,e=(t=require("fs"))&&"object"==typeof t&&"default"in t?t.default:t,n="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{};function r(t){return t&&t.__esModule&&Object.prototype.hasOwnProperty.call(t,"default")?t.default:t}function o(t,e){return t(e={exports:{}},e.exports),e.exports}var i=o((function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.font16x32=e.font12x24=e.font8x16=void 0;var n="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";e.font8x16={w:8,h:16,fonts:n,data:[[0,0,0,0,0,0,0,60,66,30,34,66,66,63,0,0],[0,0,0,192,64,64,64,88,100,66,66,66,100,88,0,0],[0,0,0,0,0,0,0,28,34,64,64,64,34,28,0,0],[0,0,0,6,2,2,2,30,34,66,66,66,38,27,0,0],[0,0,0,0,0,0,0,60,66,126,64,64,66,60,0,0],[0,0,0,15,17,16,16,126,16,16,16,16,16,124,0,0],[0,0,0,0,0,0,0,62,68,68,56,64,60,66,66,60],[0,0,0,192,64,64,64,92,98,66,66,66,66,231,0,0],[0,0,0,48,48,0,0,112,16,16,16,16,16,124,0,0],[0,0,0,12,12,0,0,28,4,4,4,4,4,4,68,120],[0,0,0,192,64,64,64,78,72,80,104,72,68,238,0,0],[0,0,0,112,16,16,16,16,16,16,16,16,16,124,0,0],[0,0,0,0,0,0,0,254,73,73,73,73,73,237,0,0],[0,0,0,0,0,0,0,220,98,66,66,66,66,231,0,0],[0,0,0,0,0,0,0,60,66,66,66,66,66,60,0,0],[0,0,0,0,0,0,0,216,100,66,66,66,68,120,64,224],[0,0,0,0,0,0,0,30,34,66,66,66,34,30,2,7],[0,0,0,0,0,0,0,238,50,32,32,32,32,248,0,0],[0,0,0,0,0,0,0,62,66,64,60,2,66,124,0,0],[0,0,0,0,0,16,16,124,16,16,16,16,16,12,0,0],[0,0,0,0,0,0,0,198,66,66,66,66,70,59,0,0],[0,0,0,0,0,0,0,231,66,36,36,40,16,16,0,0],[0,0,0,0,0,0,0,215,146,146,170,170,68,68,0,0],[0,0,0,0,0,0,0,110,36,24,24,24,36,118,0,0],[0,0,0,0,0,0,0,231,66,36,36,40,24,16,16,224],[0,0,0,0,0,0,0,126,68,8,16,16,34,126,0,0],[0,0,0,16,16,24,40,40,36,60,68,66,66,231,0,0],[0,0,0,248,68,68,68,120,68,66,66,66,68,248,0,0],[0,0,0,62,66,66,128,128,128,128,128,66,68,56,0,0],[0,0,0,248,68,66,66,66,66,66,66,66,68,248,0,0],[0,0,0,252,66,72,72,120,72,72,64,66,66,252,0,0],[0,0,0,252,66,72,72,120,72,72,64,64,64,224,0,0],[0,0,0,60,68,68,128,128,128,142,132,68,68,56,0,0],[0,0,0,231,66,66,66,66,126,66,66,66,66,231,0,0],[0,0,0,124,16,16,16,16,16,16,16,16,16,124,0,0],[0,0,0,62,8,8,8,8,8,8,8,8,8,8,136,240],[0,0,0,238,68,72,80,112,80,72,72,68,68,238,0,0],[0,0,0,224,64,64,64,64,64,64,64,64,66,254,0,0],[0,0,0,238,108,108,108,108,84,84,84,84,84,214,0,0],[0,0,0,199,98,98,82,82,74,74,74,70,70,226,0,0],[0,0,0,56,68,130,130,130,130,130,130,130,68,56,0,0],[0,0,0,252,66,66,66,66,124,64,64,64,64,224,0,0],[0,0,0,56,68,130,130,130,130,130,178,202,76,56,6,0],[0,0,0,252,66,66,66,124,72,72,68,68,66,227,0,0],[0,0,0,62,66,66,64,32,24,4,2,66,66,124,0,0],[0,0,0,254,146,16,16,16,16,16,16,16,16,56,0,0],[0,0,0,231,66,66,66,66,66,66,66,66,66,60,0,0],[0,0,0,231,66,66,68,36,36,40,40,24,16,16,0,0],[0,0,0,214,146,146,146,146,170,170,108,68,68,68,0,0],[0,0,0,231,66,36,36,24,24,24,36,36,66,231,0,0],[0,0,0,238,68,68,40,40,16,16,16,16,16,56,0,0],[0,0,0,126,132,4,8,8,16,32,32,66,66,252,0,0],[0,0,0,24,36,66,66,66,66,66,66,66,36,24,0,0],[0,0,0,16,112,16,16,16,16,16,16,16,16,124,0,0],[0,0,0,60,66,66,66,4,4,8,16,32,66,126,0,0],[0,0,0,60,66,66,4,24,4,2,2,66,68,56,0,0],[0,0,0,4,12,20,36,36,68,68,126,4,4,30,0,0],[0,0,0,126,64,64,64,88,100,2,2,66,68,56,0,0],[0,0,0,28,36,64,64,88,100,66,66,66,36,24,0,0],[0,0,0,126,68,68,8,8,16,16,16,16,16,16,0,0],[0,0,0,60,66,66,66,36,24,36,66,66,66,60,0,0],[0,0,0,24,36,66,66,66,38,26,2,2,36,56,0,0]]},e.font12x24={w:12,h:24,fonts:n,data:[[0,0,0,0,0,0,0,0,0,0,15,48,48,7,28,48,96,96,96,113,62,0,0,0,0,0,0,0,0,0,0,0,0,0,128,192,192,192,192,192,192,192,192,208,240,0,0,0],[0,0,0,0,16,112,48,48,48,48,51,60,56,48,48,48,48,48,48,56,47,0,0,0,0,0,0,0,0,0,0,0,0,0,128,192,96,96,96,96,96,96,64,192,128,0,0,0],[0,0,0,0,0,0,0,0,0,0,15,49,49,97,96,96,96,96,48,48,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,128,128,0,0,0,64,64,128,0,0,0,0],[0,0,0,0,0,1,0,0,0,0,30,49,48,96,96,96,96,96,32,49,30,0,0,0,0,0,0,0,64,192,192,192,192,192,192,192,192,192,192,192,192,192,192,224,128,0,0,0],[0,0,0,0,0,0,0,0,0,0,7,24,16,48,63,48,48,48,24,28,7,0,0,0,0,0,0,0,0,0,0,0,0,0,128,192,96,96,224,0,0,0,32,64,128,0,0,0],[0,0,0,0,0,3,6,12,12,12,127,12,12,12,12,12,12,12,12,12,63,0,0,0,0,0,0,0,0,192,96,96,0,0,192,0,0,0,0,0,0,0,0,0,128,0,0,0],[0,0,0,0,0,0,0,0,0,0,15,25,48,48,48,25,31,48,62,31,96,96,112,31,0,0,0,0,0,0,0,0,0,0,112,144,192,192,192,128,0,0,0,192,96,96,224,128],[0,0,0,0,16,112,48,48,48,48,55,56,48,48,48,48,48,48,48,48,121,0,0,0,0,0,0,0,0,0,0,0,0,0,128,192,192,192,192,192,192,192,192,192,224,0,0,0],[0,0,0,0,0,6,6,0,0,0,62,6,6,6,6,6,6,6,6,6,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,192,0,0,0],[0,0,0,0,0,1,1,0,0,0,15,1,1,1,1,1,1,1,1,1,1,1,51,62,0,0,0,0,0,128,128,0,0,0,128,128,128,128,128,128,128,128,128,128,128,128,0,0],[0,0,0,0,16,112,48,48,48,48,51,49,51,50,54,62,59,51,49,49,121,0,0,0,0,0,0,0,0,0,0,0,0,0,192,0,0,0,0,0,0,0,128,128,224,0,0,0],[0,0,0,0,2,62,6,6,6,6,6,6,6,6,6,6,6,6,6,6,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,192,0,0,0],[0,0,0,0,0,0,0,0,0,0,238,119,102,102,102,102,102,102,102,102,247,0,0,0,0,0,0,0,0,0,0,0,0,0,224,96,96,96,96,96,96,96,96,96,112,0,0,0],[0,0,0,0,0,0,0,0,0,0,115,60,48,48,48,48,48,48,48,48,121,0,0,0,0,0,0,0,0,0,0,0,0,0,128,192,192,192,192,192,192,192,192,192,224,0,0,0],[0,0,0,0,0,0,0,0,0,0,15,25,48,96,96,96,96,96,48,48,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,192,96,96,96,96,96,192,192,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,119,56,48,48,48,48,48,48,48,56,55,48,48,124,0,0,0,0,0,0,0,0,0,0,128,192,96,96,96,96,96,96,192,192,128,0,0,0],[0,0,0,0,0,0,0,0,0,0,30,49,48,96,96,96,96,96,32,49,30,0,0,3,0,0,0,0,0,0,0,0,0,0,64,192,192,192,192,192,192,192,192,192,192,192,192,224],[0,0,0,0,0,0,0,0,0,0,249,26,28,24,24,24,24,24,24,24,255,0,0,0,0,0,0,0,0,0,0,0,0,0,224,96,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,15,24,48,48,28,15,1,32,32,48,63,0,0,0,0,0,0,0,0,0,0,0,0,0,224,96,32,0,0,128,192,96,96,192,128,0,0,0],[0,0,0,0,0,0,4,4,12,12,127,12,12,12,12,12,12,12,12,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,128,0,0,0,0,0,0,0,64,64,128,0,0,0],[0,0,0,0,0,0,0,0,0,16,113,48,48,48,48,48,48,48,48,57,30,0,0,0,0,0,0,0,0,0,0,0,0,64,192,192,192,192,192,192,192,192,192,224,128,0,0,0],[0,0,0,0,0,0,0,0,0,0,124,56,24,24,12,12,12,7,7,7,2,0,0,0,0,0,0,0,0,0,0,0,0,0,240,96,64,64,128,128,128,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,247,99,99,103,55,53,57,57,57,16,16,0,0,0,0,0,0,0,0,0,0,0,0,0,176,32,32,32,32,192,192,192,192,128,128,0,0,0],[0,0,0,0,0,0,0,0,0,0,125,24,25,13,14,6,7,11,25,17,123,0,0,0,0,0,0,0,0,0,0,0,0,0,224,128,128,0,0,0,0,0,128,192,224,0,0,0],[0,0,0,0,0,0,0,0,0,0,125,56,24,24,13,13,13,6,6,2,4,4,40,56,0,0,0,0,0,0,0,0,0,0,224,128,128,128,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,63,33,35,3,7,6,14,12,28,24,63,0,0,0,0,0,0,0,0,0,0,0,0,0,192,128,128,0,0,0,0,32,32,96,192,0,0,0],[0,0,0,0,0,6,6,14,11,11,19,17,17,17,31,32,32,32,32,96,240,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,128,128,128,192,192,192,96,96,240,0,0,0],[0,0,0,0,0,255,97,96,96,96,96,97,127,96,96,96,96,96,96,96,255,0,0,0,0,0,0,0,0,0,128,192,192,192,192,128,0,192,64,96,96,96,96,192,128,0,0,0],[0,0,0,0,0,7,24,48,48,32,96,96,96,96,96,96,96,48,48,24,15,0,0,0,0,0,0,0,0,224,96,32,32,0,0,0,0,0,0,0,32,32,64,128,0,0,0,0],[0,0,0,0,0,254,97,96,96,96,96,96,96,96,96,96,96,96,96,99,254,0,0,0,0,0,0,0,0,0,128,192,192,96,96,96,96,96,96,96,96,192,192,128,0,0,0,0],[0,0,0,0,0,255,96,96,96,96,97,97,127,97,97,96,96,96,96,96,255,0,0,0,0,0,0,0,0,192,64,32,0,0,0,0,0,0,0,0,0,32,32,64,192,0,0,0],[0,0,0,0,0,255,96,96,96,96,97,97,127,97,97,96,96,96,96,96,240,0,0,0,0,0,0,0,0,192,192,32,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,15,24,48,48,32,96,96,96,96,99,96,96,48,48,24,15,0,0,0,0,0,0,0,0,64,192,64,64,0,0,0,0,0,240,192,192,192,192,192,0,0,0,0],[0,0,0,0,0,240,96,96,96,96,96,96,127,96,96,96,96,96,96,96,240,0,0,0,0,0,0,0,0,240,96,96,96,96,96,96,224,96,96,96,96,96,96,96,240,0,0,0],[0,0,0,0,0,63,6,6,6,6,6,6,6,6,6,6,6,6,6,6,63,0,0,0,0,0,0,0,0,192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,192,0,0,0],[0,0,0,0,0,15,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,97,99,62,0,0,0,0,0,240,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,0,0],[0,0,0,0,0,243,96,97,98,98,100,108,124,118,103,99,99,97,96,96,241,0,0,0,0,0,0,0,0,224,128,0,0,0,0,0,0,0,0,0,128,128,192,224,240,0,0,0],[0,0,0,0,0,240,96,96,96,96,96,96,96,96,96,96,96,96,96,96,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32,32,64,192,0,0,0],[0,0,0,0,0,240,112,112,112,89,89,89,89,90,78,78,78,78,68,68,228,0,0,0,0,0,0,0,0,240,224,224,224,96,96,96,96,96,96,96,96,96,96,96,240,0,0,0],[0,0,0,0,0,224,112,112,88,88,76,70,70,67,67,65,64,64,64,64,224,0,0,0,0,0,0,0,0,112,32,32,32,32,32,32,32,32,32,160,224,224,96,96,32,0,0,0],[0,0,0,0,0,15,25,48,48,96,96,96,96,96,96,96,96,48,48,25,15,0,0,0,0,0,0,0,0,0,128,192,64,96,96,96,96,96,96,96,96,64,192,128,0,0,0,0],[0,0,0,0,0,255,96,96,96,96,96,96,96,127,96,96,96,96,96,96,240,0,0,0,0,0,0,0,0,128,192,96,96,96,96,96,192,128,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,15,25,48,48,96,96,96,96,96,96,96,110,50,49,17,15,1,0,0,0,0,0,0,0,0,128,192,64,96,96,96,96,96,96,96,96,64,192,128,128,224,192,0],[0,0,0,0,0,255,96,96,96,96,96,96,127,102,99,99,97,97,96,96,240,0,0,0,0,0,0,0,0,128,192,96,96,96,96,192,0,0,0,0,128,128,192,192,112,0,0,0],[0,0,0,0,0,31,48,96,96,96,112,60,15,3,0,0,64,64,96,112,79,0,0,0,0,0,0,0,0,32,224,32,32,0,0,0,0,192,192,96,96,96,96,192,128,0,0,0],[0,0,0,0,0,127,70,134,134,6,6,6,6,6,6,6,6,6,6,6,15,0,0,0,0,0,0,0,0,224,32,16,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,240,96,96,96,96,96,96,96,96,96,96,96,96,96,48,31,0,0,0,0,0,0,0,0,112,32,32,32,32,32,32,32,32,32,32,32,32,32,64,128,0,0,0],[0,0,0,0,0,248,112,48,48,48,48,24,24,24,24,13,13,13,15,6,6,0,0,0,0,0,0,0,0,240,96,64,64,64,128,128,128,128,128,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,247,102,102,102,102,103,55,55,59,59,59,59,57,17,17,17,0,0,0,0,0,0,0,0,112,32,32,64,64,64,64,64,128,128,128,128,128,0,0,0,0,0,0],[0,0,0,0,0,121,48,24,24,25,13,14,6,6,7,11,11,25,17,48,121,0,0,0,0,0,0,0,0,224,192,128,128,0,0,0,0,0,0,0,128,128,128,192,224,0,0,0],[0,0,0,0,0,248,112,48,48,24,24,13,13,14,6,6,6,6,6,6,31,0,0,0,0,0,0,0,0,240,96,64,128,128,128,0,0,0,0,0,0,0,0,0,128,0,0,0],[0,0,0,0,0,63,32,65,1,3,3,3,6,6,12,12,24,24,56,48,127,0,0,0,0,0,0,0,0,224,192,192,128,128,0,0,0,0,0,0,0,32,32,64,192,0,0,0],[0,0,0,0,0,15,25,48,48,96,96,96,96,96,96,96,96,48,48,25,15,0,0,0,0,0,0,0,0,0,128,192,192,96,96,96,96,96,96,96,96,192,192,128,0,0,0,0],[0,0,0,0,0,2,6,62,6,6,6,6,6,6,6,6,6,6,6,6,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,192,0,0,0],[0,0,0,0,0,31,33,64,96,96,0,1,1,3,4,8,16,32,64,127,127,0,0,0,0,0,0,0,0,0,128,192,192,192,192,128,128,0,0,0,64,64,64,192,192,0,0,0],[0,0,0,0,0,30,35,97,97,97,1,3,14,1,0,0,96,96,96,33,31,0,0,0,0,0,0,0,0,0,0,128,128,128,128,0,0,128,128,192,192,192,192,128,0,0,0,0],[0,0,0,0,0,1,3,3,5,9,9,17,33,33,65,127,1,1,1,1,7,0,0,0,0,0,0,0,128,128,128,128,128,128,128,128,128,128,128,224,128,128,128,128,224,0,0,0],[0,0,0,0,0,63,63,32,32,32,32,47,49,32,0,0,96,96,65,33,31,0,0,0,0,0,0,0,0,192,192,0,0,0,0,0,128,192,192,192,192,192,128,128,0,0,0,0],[0,0,0,0,0,7,24,48,48,32,96,103,104,112,96,96,96,32,48,24,15,0,0,0,0,0,0,0,0,128,192,192,0,0,0,128,192,96,96,96,96,96,64,192,0,0,0,0],[0,0,0,0,0,31,63,48,32,32,0,1,1,2,2,2,6,6,6,6,6,0,0,0,0,0,0,0,0,224,224,64,128,128,128,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,31,48,96,96,96,112,60,15,51,32,96,96,96,96,48,15,0,0,0,0,0,0,0,0,128,192,96,96,96,64,192,0,128,192,96,96,96,96,192,128,0,0,0],[0,0,0,0,0,15,48,48,96,96,96,96,96,49,30,0,0,0,48,49,30,0,0,0,0,0,0,0,0,0,128,192,64,96,96,96,224,96,96,96,192,192,128,128,0,0,0,0]]},e.font16x32={w:16,h:32,fonts:n,data:[[0,0,0,0,0,0,0,0,0,0,0,0,0,15,24,48,48,0,1,14,56,48,96,96,96,48,31,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,192,96,48,48,48,240,48,48,48,48,48,50,242,28,0,0,0,0,0],[0,0,0,0,0,8,120,24,24,24,24,24,24,24,27,28,28,24,24,24,24,24,24,24,28,30,19,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,24,12,6,6,6,6,6,6,6,4,12,24,224,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,3,14,24,24,48,48,48,48,48,48,24,24,12,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,224,48,24,24,24,0,0,0,0,4,4,8,16,224,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,24,24,48,48,48,48,48,48,16,24,12,7,0,0,0,0,0,0,0,0,0,0,8,120,24,24,24,24,24,24,216,56,24,24,24,24,24,24,24,24,24,56,94,144,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,3,12,24,16,48,48,63,48,48,48,24,24,14,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,224,48,24,8,12,12,252,0,0,0,4,8,24,224,0,0,0,0,0],[0,0,0,0,0,0,0,1,1,3,3,3,3,63,3,3,3,3,3,3,3,3,3,3,3,3,31,0,0,0,0,0,0,0,0,0,0,0,124,195,3,3,0,0,0,248,0,0,0,0,0,0,0,0,0,0,0,0,240,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,3,12,8,24,24,24,8,12,15,24,24,15,15,16,48,48,48,28,7,0,0,0,0,0,0,0,0,0,0,0,0,0,238,54,24,24,24,24,24,48,224,0,0,240,252,14,6,6,6,28,240],[0,0,0,0,0,8,120,24,24,24,24,24,24,25,27,28,24,24,24,24,24,24,24,24,24,24,126,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,24,12,12,12,12,12,12,12,12,12,12,12,63,0,0,0,0,0],[0,0,0,0,0,0,1,1,1,0,0,0,0,31,1,1,1,1,1,1,1,1,1,1,1,1,31,0,0,0,0,0,0,0,0,0,0,0,192,192,192,0,0,0,128,128,128,128,128,128,128,128,128,128,128,128,128,128,248,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,24,24,15,0,0,0,0,0,0,28,28,28,0,0,0,8,248,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,48,96,192],[0,0,0,0,0,8,120,24,24,24,24,24,24,24,24,24,24,24,25,27,28,24,24,24,24,24,126,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,124,48,96,192,128,128,128,192,224,96,48,56,24,62,0,0,0,0,0],[0,0,0,0,0,0,31,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,31,0,0,0,0,0,0,0,0,0,0,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,248,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,16,119,57,49,49,49,49,49,49,49,49,49,49,49,123,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,56,204,140,140,140,140,140,140,140,140,140,140,140,222,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,8,120,27,28,24,24,24,24,24,24,24,24,24,24,126,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,24,12,12,12,12,12,12,12,12,12,12,12,63,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,3,14,8,24,48,48,48,48,48,48,24,24,12,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,224,56,12,12,6,6,6,6,6,6,12,12,24,224,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,8,121,26,28,24,24,24,24,24,24,24,24,28,30,25,24,24,24,24,126,0,0,0,0,0,0,0,0,0,0,0,0,0,240,24,12,4,6,6,6,6,6,6,12,12,24,224,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,3,12,24,24,48,48,48,48,48,48,16,24,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,196,60,28,12,12,12,12,12,12,12,12,28,60,204,12,12,12,12,63],[0,0,0,0,0,0,0,0,0,0,0,0,6,126,6,6,7,7,6,6,6,6,6,6,6,6,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,60,102,134,0,0,0,0,0,0,0,0,0,0,224,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,7,12,24,24,24,14,7,1,0,32,32,48,56,55,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,228,28,12,4,0,0,192,240,56,12,12,12,24,240,0,0,0,0,0],[0,0,0,0,0,0,0,0,1,1,1,3,7,63,3,3,3,3,3,3,3,3,3,3,3,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,248,0,0,0,0,0,0,0,0,0,4,4,136,240,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,8,120,24,24,24,24,24,24,24,24,24,24,24,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,60,12,12,12,12,12,12,12,12,12,12,28,47,200,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,126,24,24,28,12,12,14,6,6,7,3,3,3,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,60,24,16,16,32,32,64,64,64,128,128,128,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,251,113,48,49,49,25,25,26,26,14,14,14,4,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,239,198,196,196,196,200,200,104,104,112,112,112,32,32,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,63,14,14,7,3,3,1,1,2,6,4,8,24,124,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,124,16,32,32,64,128,192,192,224,96,48,48,24,126,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,126,24,24,12,12,12,6,6,3,3,3,1,1,1,1,1,1,50,60,0,0,0,0,0,0,0,0,0,0,0,0,0,62,24,16,16,16,32,32,32,64,64,64,128,128,128,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,63,48,32,32,0,1,1,3,7,14,12,28,56,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,248,48,112,96,192,192,128,0,0,4,4,12,24,248,0,0,0,0,0],[0,0,0,0,0,0,3,3,3,2,6,4,4,4,12,8,8,8,31,16,16,16,48,32,32,96,248,0,0,0,0,0,0,0,0,0,0,128,128,128,128,128,192,192,192,192,96,96,96,96,240,48,48,48,48,24,24,24,62,0,0,0,0,0],[0,0,0,0,0,0,127,24,24,24,24,24,24,24,24,31,24,24,24,24,24,24,24,24,24,24,127,0,0,0,0,0,0,0,0,0,0,0,224,56,28,12,12,12,12,24,48,224,24,12,4,6,6,6,6,6,12,24,240,0,0,0,0,0],[0,0,0,0,0,0,3,6,8,24,48,48,32,96,96,96,96,96,96,96,96,48,48,48,24,12,3,0,0,0,0,0,0,0,0,0,0,0,228,28,12,4,2,2,0,0,0,0,0,0,0,0,0,2,2,4,12,24,224,0,0,0,0,0],[0,0,0,0,0,0,127,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,127,0,0,0,0,0,0,0,0,0,0,0,192,112,24,12,12,12,6,6,6,6,6,6,6,6,6,12,12,8,24,112,192,0,0,0,0,0],[0,0,0,0,0,0,127,24,24,24,24,24,24,24,24,31,24,24,24,24,24,24,24,24,24,24,127,0,0,0,0,0,0,0,0,0,0,0,252,12,4,6,2,0,16,16,48,240,48,16,16,0,0,0,2,2,4,12,252,0,0,0,0,0],[0,0,0,0,0,0,127,24,24,24,24,24,24,24,24,31,24,24,24,24,24,24,24,24,24,24,126,0,0,0,0,0,0,0,0,0,0,0,254,14,2,3,1,0,8,8,24,248,24,8,8,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,3,14,8,24,48,48,32,96,96,96,96,96,96,96,96,48,48,24,24,12,3,0,0,0,0,0,0,0,0,0,0,0,200,56,8,8,4,4,0,0,0,0,0,0,63,12,12,12,12,12,12,16,224,0,0,0,0,0],[0,0,0,0,0,0,252,48,48,48,48,48,48,48,48,48,63,48,48,48,48,48,48,48,48,48,252,0,0,0,0,0,0,0,0,0,0,0,126,24,24,24,24,24,24,24,24,24,248,24,24,24,24,24,24,24,24,24,126,0,0,0,0,0],[0,0,0,0,0,0,31,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,31,0,0,0,0,0,0,0,0,0,0,0,248,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,248,0,0,0,0,0],[0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,112,112,113,63,0,0,0,0,0,0,254,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,96,192,128,0],[0,0,0,0,0,0,126,24,24,24,24,24,24,25,25,27,29,28,24,24,24,24,24,24,24,24,126,0,0,0,0,0,0,0,0,0,0,0,62,24,16,32,96,64,128,128,128,128,192,192,224,96,112,48,56,24,12,12,63,0,0,0,0,0],[0,0,0,0,0,0,126,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,4,12,252,0,0,0,0,0],[0,0,0,0,0,0,248,56,56,56,56,44,44,44,44,46,38,38,38,38,35,35,35,35,35,33,249,0,0,0,0,0,0,0,0,0,0,0,31,28,28,28,60,44,44,44,108,76,76,76,76,140,140,140,140,12,12,12,63,0,0,0,0,0],[0,0,0,0,0,0,248,56,60,44,44,46,38,39,35,35,33,33,32,32,32,32,32,32,32,32,248,0,0,0,0,0,0,0,0,0,0,0,62,8,8,8,8,8,8,8,8,136,136,200,200,232,104,120,56,56,56,24,24,0,0,0,0,0],[0,0,0,0,0,0,3,12,24,16,48,48,96,96,96,96,96,96,96,96,96,48,48,16,24,12,3,0,0,0,0,0,0,0,0,0,0,0,192,48,24,8,12,12,6,6,6,6,6,6,6,6,6,4,12,8,24,48,192,0,0,0,0,0],[0,0,0,0,0,0,127,24,24,24,24,24,24,24,24,24,31,24,24,24,24,24,24,24,24,24,126,0,0,0,0,0,0,0,0,0,0,0,240,24,12,6,6,6,6,6,12,24,240,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,3,12,24,48,48,48,96,96,96,96,96,96,96,96,96,39,52,56,24,12,3,0,0,0,0,0,0,0,0,0,0,0,192,48,24,8,12,4,6,6,6,6,6,6,6,6,6,134,204,76,104,112,224,50,62,28,0,0],[0,0,0,0,0,0,127,24,24,24,24,24,24,24,24,31,25,24,24,24,24,24,24,24,24,24,126,0,0,0,0,0,0,0,0,0,0,0,224,56,28,12,12,12,12,24,48,224,192,192,224,96,96,112,48,48,56,24,30,0,0,0,0,0],[0,0,0,0,0,0,7,12,24,48,48,48,48,24,30,7,1,0,0,0,0,32,32,16,24,28,19,0,0,0,0,0,0,0,0,0,0,0,228,28,12,4,4,0,0,0,0,192,240,120,28,14,6,6,6,6,12,24,240,0,0,0,0,0],[0,0,0,0,0,0,63,49,33,65,65,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,7,0,0,0,0,0,0,0,0,0,0,0,252,132,134,130,130,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,224,0,0,0,0,0],[0,0,0,0,0,0,252,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,16,28,7,0,0,0,0,0,0,0,0,0,0,0,62,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,16,32,192,0,0,0,0,0],[0,0,0,0,0,0,124,24,24,24,12,12,12,12,6,6,6,7,3,3,3,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,31,4,4,4,8,8,8,8,16,16,16,48,32,32,32,192,192,192,192,128,128,0,0,0,0,0],[0,0,0,0,0,0,251,97,97,97,49,48,49,49,49,49,50,26,26,26,28,28,28,12,8,8,8,0,0,0,0,0,0,0,0,0,0,0,207,134,132,132,132,132,196,200,200,200,200,72,104,112,112,112,112,48,32,32,32,0,0,0,0,0],[0,0,0,0,0,0,126,24,28,12,12,14,6,7,3,3,1,1,2,2,4,4,8,8,16,16,124,0,0,0,0,0,0,0,0,0,0,0,124,16,16,32,32,64,64,128,128,128,128,192,192,224,96,96,48,48,24,24,62,0,0,0,0,0],[0,0,0,0,0,0,126,56,24,24,12,12,14,6,6,3,3,3,1,1,1,1,1,1,1,1,7,0,0,0,0,0,0,0,0,0,0,0,62,8,8,16,16,48,32,32,64,64,64,128,128,128,128,128,128,128,128,128,224,0,0,0,0,0],[0,0,0,0,0,0,31,24,16,32,32,0,0,0,1,1,3,3,7,6,14,12,28,24,56,48,127,0,0,0,0,0,0,0,0,0,0,0,252,24,24,48,112,96,224,192,192,128,128,0,0,0,0,0,4,4,8,24,248,0,0,0,0,0],[0,0,0,0,0,0,3,6,12,24,24,24,48,48,48,48,48,48,48,48,48,24,24,24,12,6,3,0,0,0,0,0,0,0,0,0,0,0,224,48,24,12,12,4,6,6,6,6,6,6,6,6,6,4,12,12,24,48,224,0,0,0,0,0],[0,0,0,0,0,0,0,1,31,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,31,0,0,0,0,0,0,0,0,0,0,0,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,192,248,0,0,0,0,0],[0,0,0,0,0,0,7,8,16,32,32,48,48,0,0,0,0,0,0,1,2,4,8,16,32,63,63,0,0,0,0,0,0,0,0,0,0,0,224,56,24,12,12,12,12,12,24,16,32,64,128,0,0,4,4,4,12,248,248,0,0,0,0,0],[0,0,0,0,0,0,7,24,48,48,48,48,0,0,0,3,0,0,0,0,0,48,48,48,48,24,7,0,0,0,0,0,0,0,0,0,0,0,192,112,48,24,24,24,24,48,96,192,112,24,8,12,12,12,12,8,24,48,192,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,1,1,2,6,4,8,8,16,32,32,127,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,48,112,112,240,112,112,112,112,112,112,112,112,112,112,254,112,112,112,112,112,112,254,0,0,0,0],[0,0,0,0,0,0,15,15,8,8,8,16,16,19,20,24,16,0,0,0,0,48,48,32,32,16,15,0,0,0,0,0,0,0,0,0,0,0,252,252,0,0,0,0,0,224,48,24,8,12,12,12,12,12,12,24,24,48,192,0,0,0,0,0],[0,0,0,0,0,0,1,3,4,8,24,24,16,48,49,54,60,56,48,48,48,48,24,24,12,6,3,0,0,0,0,0,0,0,0,0,0,0,240,8,12,12,0,0,0,0,240,24,12,6,6,6,6,6,6,4,12,24,224,0,0,0,0,0],[0,0,0,0,0,0,31,31,56,48,32,32,0,0,0,0,0,0,1,1,1,3,3,3,3,3,3,0,0,0,0,0,0,0,0,0,0,0,252,252,8,16,16,32,32,64,64,128,128,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,7,12,24,48,48,48,56,28,14,7,13,24,48,96,96,96,96,96,48,24,7,0,0,0,0,0,0,0,0,0,0,0,224,48,24,12,12,12,12,24,16,224,224,112,56,28,12,12,12,12,24,48,192,0,0,0,0,0],[0,0,0,0,0,0,7,24,48,48,96,96,96,96,96,96,48,24,15,0,0,0,0,48,48,48,15,0,0,0,0,0,0,0,0,0,0,0,192,32,16,24,8,12,12,12,12,28,60,108,140,12,24,24,24,48,96,192,128,0,0,0,0,0]]}}));r(i);i.font16x32,i.font12x24,i.font8x16;var a=o((function(t,r){var o=n&&n.__awaiter||function(t,e,n,r){return new(n||(n=Promise))((function(o,i){function a(t){try{s(r.next(t))}catch(t){i(t)}}function c(t){try{s(r.throw(t))}catch(t){i(t)}}function s(t){var e;t.done?o(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(a,c)}s((r=r.apply(t,e||[])).next())}))},a=n&&n.__generator||function(t,e){var n,r,o,i,a={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]};return i={next:c(0),throw:c(1),return:c(2)},"function"==typeof Symbol&&(i[Symbol.iterator]=function(){return this}),i;function c(i){return function(c){return function(i){if(n)throw new TypeError("Generator is already executing.");for(;a;)try{if(n=1,r&&(o=2&i[0]?r.return:i[0]?r.throw||((o=r.return)&&o.call(r),0):r.next)&&!(o=o.call(r,i[1])).done)return o;switch(r=0,o&&(i=[2&i[0],o.value]),i[0]){case 0:case 1:o=i;break;case 4:return a.label++,{value:i[1],done:!1};case 5:a.label++,r=i[1],i=[0];continue;case 7:i=a.ops.pop(),a.trys.pop();continue;default:if(!(o=a.trys,(o=o.length>0&&o[o.length-1])||6!==i[0]&&2!==i[0])){a=0;continue}if(3===i[0]&&(!o||i[1]>o[0]&&i[1]>16&255,green:n>>8&255,blue:255&n})},t.prototype.drawPointRGB=function(t,e,n){if(!(t>=this.w||e>=this.h||t<0||e<0)){var r=this.h-e-1,o=54+3*t+this._lineByteNum*r;this._data.writeUInt8(n.blue,o),this._data.writeUInt8(n.green,o+1),this._data.writeUInt8(n.red,o+2)}},t.prototype.getPointRGB=function(t,e){if(t>=this.w||e>=this.h||t<0||e<0)throw new Error("out of range");var n=this.h-e-1,r=54+3*t+this._lineByteNum*n;return{blue:this._data.readUInt8(r),green:this._data.readUInt8(r+1),red:this._data.readUInt8(r+2)}},t.prototype.drawLineH=function(t,e,n,r){if(t>e){var o=e;e=t,t=o}for(;t<=e;t++)this.drawPoint(t,n,r)},t.prototype.drawLineV=function(t,e,n,r){if(t>e){var o=e;e=t,t=o}for(;t<=e;t++)this.drawPoint(n,t,r)},t.prototype.drawLine=function(t,e,n,r,o){var i=t,a=e,c=n>t?n-t:t-n,s=r>e?r-e:e-r,d=!1,f=n>t?1:-1,u=r>e?1:-1;if(s>c){var h=c;c=s,s=h,d=!0}for(var l=(s<<1)-c,w=0;w<=c;w++)this.drawPoint(i,a,o),l>=0&&(d?i+=f:a+=u,l-=c<<1),d?a+=u:i+=f,l+=s<<1},t.prototype.drawRect=function(t,e,n,r,o){var i=t+n-1,a=e+r-1;this.drawLineH(t,i,e,o),this.drawLineH(t,i,a,o),this.drawLineV(e,a,t,o),this.drawLineV(e,a,i,o)},t.prototype.fillRect=function(t,e,n,r,o){var i=t+n-1,a=e+r-1;if(t>i){var c=i;i=t,t=c}if(e>a){c=a;a=e,e=c}for(;e<=a;e++)for(var s=t;s<=i;s++)this.drawPoint(s,e,o)},t.prototype.drawCircle=function(t,e,n,r){for(var o=0,i=n,a=3-2*n;o0;f<<=1)128&f&&this.drawPoint(c,a,o),c++;++a-n>=r.h&&(a=n,e+=8)}},t.prototype.drawString=function(t,e,n,r,o){for(var i=0,a=t;i(t.includes(r)&&n.push(e[r]),n),[]);return n[Math.random()*n.length|0]}function u(t={}){const e=["small","medium","big"],n={backgroundColor:16775912,size:4,noise:4,width:100,height:40,fontSize:["medium","big"]};let{backgroundColor:r,size:o,noise:i,width:a,height:s,fontSize:f}=Object.assign({},n,t);"string"==typeof r&&(r=r.replace("#","0x")),f instanceof Array||(f=[]),f.filter(t=>e.includes(t)),f.length||(f=n.fontSize),o=o>6?6:o;const u=new c(a,s);u.fillRect(0,0,a,s,r),function(t,e){for(let n=1;n>16,r=e>>8&255,o=255&e,i=Math.max(n,r,o),a=Math.min(n,r,o);return(i+a)/510}(t):1;let o,i;r>=.5?(o=Math.round(100*r)-45,i=Math.round(100*r)-25):(o=Math.round(100*r)+25,i=Math.round(100*r)+45);const a=h(o,i)/100,c=a<.5?a*(a+n):a+n-a*n,s=2*a-c,d=Math.floor(255*w(s,c,e+1/3)),f=Math.floor(255*w(s,c,e));return"#"+(Math.floor(255*w(s,c,e-1/3))|f<<8|d<<16|1<<24).toString(16).slice(1)};function w(t,e,n){return 6*(n=(n+1)%1)<1?t+(e-t)*n*6:2*n<1?e:3*n<2?t+(e-t)*(2/3-n)*6:t}const p=Object.prototype.toString;function g(t){return"[object Object]"===p.call(t)}function y(){"development"===process.env.NODE_ENV&&console.log(...arguments)}const v=async function(){};function m(t){return v.constructor===t.constructor?async function(){const e=await t.apply(this,arguments);return g(e)&&e.msg&&(e.message=e.msg),e}:function(){const e=t.apply(this,arguments);return g(e)&&e.msg&&(e.message=e.msg),e}}const b=uniCloud.database().collection("opendb-verify-codes"),_={};var I=Object.freeze({__proto__:null,create:async function(t={}){let{scene:e,expiresDate:n,deviceId:r,...o}=t;if(r=r||__ctx__.DEVICEID,!r)throw new Error("deviceId不可为空");if(!e)throw new Error("scene验证码场景不可为空");try{const{text:i,base64:a}=u(o),c=await this.setVerifyCode({deviceId:r,code:i,expiresDate:n,scene:e});return c.code>0?{...c,code:10001}:(_[r]=t,{code:0,msg:"验证码获取成功",captchaBase64:a})}catch(t){return{code:10001,msg:"验证码生成失败:"+t.message}}},verify:async function({deviceId:t,captcha:e,scene:n}){if(!(t=t||__ctx__.DEVICEID))throw new Error("deviceId不可为空");if(!n)throw new Error("scene验证码场景不可为空");try{const r=await this.verifyCode({deviceId:t,code:e,scene:n});return r.code>0?{...r,code:10002}:{code:0,msg:"验证码通过"}}catch(t){return{code:10002,msg:"验证码校验失败:"+t.message}}},refresh:async function(t={}){let{scene:e,expiresDate:n,deviceId:r,...o}=t;if(r=r||__ctx__.DEVICEID,!r)throw new Error("deviceId不可为空");if(!e)throw new Error("scene验证码场景不可为空");const i=await b.where({deviceId:r,scene:e,state:0}).orderBy("created_date","desc").limit(1).get();if(i&&i.data&&i.data.length>0){const t=i.data[0];await b.doc(t._id).update({state:2});let a={};Object.keys(o).length>0&&(_[r]=Object.assign({},_[r],o)),a=_[r];let c={};try{c=await this.create(Object.assign({},a,{deviceId:r,scene:e,expiresDate:n}))}catch(t){return{code:50403,msg:t.message}}return c.code>0?{...c,code:10003}:{code:0,msg:"验证码刷新成功",captchaBase64:c.captchaBase64}}return{code:10003,msg:"验证码刷新失败:无此设备信息,请重新获取"}},setVerifyCode:async function({deviceId:t,code:e,expiresDate:n,scene:r}){if(!t)return{code:10101,msg:"deviceId不可为空"};if(!e)return{code:10102,msg:"验证码不可为空"};n||(n=180);const o=Date.now(),i={deviceId:t,scene:r,code:e.toLocaleLowerCase(),state:0,ip:__ctx__.CLIENTIP,created_date:o,expired_date:o+1e3*n};return y("addRes",await b.add(i)),{code:0,deviceId:t}},verifyCode:async function({deviceId:t,code:e,scene:n}){if(!t)return{code:10101,msg:"deviceId不可为空"};if(!e)return{code:10102,msg:"验证码不可为空"};const r=Date.now(),o={deviceId:t,scene:n,code:e.toLocaleLowerCase(),state:0},i=await b.where(o).orderBy("created_date","desc").limit(1).get();if(y("verifyRecord:",i),i&&i.data&&i.data.length>0){const t=i.data[0];if(t.expired_date + + + + + + + {{ title }} + {{ extra }} + + + + + + + + + {{ title }} + {{ subTitle }} + + + + {{ extra }} + + + + + + + + {{ title }} + + + + {{ extra }} + + + + + + {{ note }} + + + + + + + + diff --git a/uni_modules/uni-card/package.json b/uni_modules/uni-card/package.json new file mode 100644 index 0000000..902399c --- /dev/null +++ b/uni_modules/uni-card/package.json @@ -0,0 +1,81 @@ +{ + "id": "uni-card", + "displayName": "Card 卡片", + "version": "1.1.6", + "description": "Card 组件,提供常见的卡片样式。", + "keywords": [ + "card", + "uni-ui", + "卡片" +], + "repository": "https://github.com/dcloudio/uni-ui", + "engines": { + "HBuilderX": "" + }, + "directories": { + "example": "../../temps/example_temps" + }, + "dcloudext": { + "category": [ + "前端组件", + "通用组件" + ], + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "无", + "permissions": "无" + }, + "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui" + }, + "uni_modules": { + "dependencies": [], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "App": { + "app-vue": "y", + "app-nvue": "y" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y" + }, + "快应用": { + "华为": "u", + "联盟": "u" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uni-card/readme.md b/uni_modules/uni-card/readme.md new file mode 100644 index 0000000..1b8f63c --- /dev/null +++ b/uni_modules/uni-card/readme.md @@ -0,0 +1,97 @@ + + +## Card 卡片 +> 代码块: `uCard` + + +卡片视图组件。 + +### 安装方式 + +本组件符合[easycom](https://uniapp.dcloud.io/collocation/pages?id=easycom)规范,`HBuilderX 2.5.5`起,只需将本组件导入项目,在页面`template`中即可直接使用,无需在页面中`import`和注册`components`。 + +如需通过`npm`方式使用`uni-ui`组件,另见文档:[https://ext.dcloud.net.cn/plugin?id=55](https://ext.dcloud.net.cn/plugin?id=55) + +> 为了避免错误使用,给大家带来不好的开发体验,请在使用组件前仔细阅读下面的注意事项,可以帮你避免一些错误。 +> - 因为平台兼容问题 , 目前 APP-NVUE 安卓平台下不支持阴影 + + +### 基本用法 + +在 ``template`` 中使用组件 + +```html + + + 内容主体,可自定义内容及样式 + + + + + + + + + + uni-app 是一个使用 Vue.js 开发所有前端应用的框架,开发者编写一套代码,可编译到iOS、Android、H5、以及各种小程序等多个平台。即使不跨端,uni-app同时也是更好的小程序开发框架。 + + + + + uni-app 是一个使用 Vue.js 开发所有前端应用的框架,开发者编写一套代码,可编译到iOS、Android、H5、以及各种小程序等多个平台。即使不跨端,uni-app同时也是更好的小程序开发框架。 + + + + + 默认内容 + + +``` + +## API + +### Card Props + +|属性名 |类型 |默认值 |说明 | +|:-: |:-: |:-: |:-: | +|title |String |- |标题文字 | +|extra |String |- |标题额外信息 | +|note |String |- |底部信息 | +|thumbnail |String |- |标题左侧缩略图,支持网络图片,本地图片,本图片需要传入一个绝对路径,如:`/static/xxx.png` | +|mode |String |basic |卡片模式 ,可选值, basic:基础卡片 ;style :图文卡片 ; title :标题卡片 | +|isFull |Boolean|false |卡片内容是否通栏,为true时将去除padding值 | +|isShadow |Boolean|false |卡片内容是否开启阴影 | + + +### Card Events + +|事件称名 |事件说明 |返回参数 | +|:-: |:-: |:-: | +|@click |点击 Card 触发事件 |- | + + +### Card Slots + +|插槽称名 |说明 | +|:-: |:-: | +|footer |卡片底部插槽 | \ No newline at end of file diff --git a/uni_modules/uni-clientDB/db_init.json b/uni_modules/uni-clientDB/db_init.json new file mode 100644 index 0000000..e69de29 diff --git a/uni_modules/uni-clientDB/license.md b/uni_modules/uni-clientDB/license.md new file mode 100644 index 0000000..2b0e438 --- /dev/null +++ b/uni_modules/uni-clientDB/license.md @@ -0,0 +1,30 @@ +# clientDB使用许可协议 +本协议是数字天堂(北京)网络技术有限公司(以下称“DCloud”)与您之间达成的关于clientDB框架(以下简称本框架)的协议。 +本协议签订地点为中华人民共和国北京市海淀区。 +您使用本框架即视为您已阅读并同意受本协议的约束。 + +## 知识产权及使用授权 +您可以自由下载、使用、复制本框架而不需要向DCloud付费。 +DCloud所拥有的知识产权,包括但不限于商标、专利、著作权、商业秘密、专有数据、源码,并不发生转移或共享。 +您使用本框架开发的代码及输出物,包括但不限于网站、移动应用,其知识产权归属您所有。 +本框架未包含第三方软件或技术,不涉及额外遵循第三方软件的授权协议问题。 + +## 您的义务 +您不得破解、反编译、逆向工程本框架,不得破解或劫持本框架网络请求,不得对DCloud服务进行网络攻击,不得利用DCloud系统漏洞谋利或侵害DCloud利益,不得替换、删改本框架自带的非用户自定义文件。 +未经书面许可您不可利用DCloud产品的全部或部分文件、模块、组件来制作与DCloud争夺用户的产品(通过DCloud插件市场服务开发者不属于此范围)。 +如果您违反您的义务,DCloud将有权停止您使用本框架,造成的损失由您自行承担。 +如果您给DCloud造成重大损失,或者在接收到DCloud的停止违约通知后拒不改正,DCloud将有权停止对您的DCloud所有产品和服务的使用授权,冻结您在DCloud所有产品服务中的预付款项和应收款项,因此造成的损失由您自行承担。 +如果您的行为产生法律问题,DCloud有权追责您的法律责任。 + +## 隐私条款 +本框架未进行任何数据采集、发送等涉及数据隐私的行为。 + +## 安全 +您理解并同意,本框架同其他软件一样,无法承诺绝对的安全性。 +当DCloud发现本框架的任何安全漏洞时,将及时在[社区](https://ask.dcloud.net.cn/explore/)发送公告,并将及时发布紧急更新补丁和升级推送通知。 + +## 免责声明 +DCloud不因开发者使用本框架而承担任何法律责任。 + +## 协议修订 +根据发展,DCloud可能会对本协议进行修改。修改时,DCloud会在产品或者网页中显著的位置发布相关信息以便及时通知到用户。如果您选择继续使用本框架,即表示您同意接受这些修改。 diff --git a/uni_modules/uni-clientDB/package.json b/uni_modules/uni-clientDB/package.json new file mode 100644 index 0000000..ea5c786 --- /dev/null +++ b/uni_modules/uni-clientDB/package.json @@ -0,0 +1,16 @@ +{ + "id": "uni-clientDB", // 必选 插件标识,需要保证唯一性 + "name": "uni-clientDB", // 必选 插件名称 + "version": "1.0.8", // 必选 插件版本 + "description": "写法更灵活的客户端访问云端数据方案", // 插件描述 + "author": "DCloud", // 插件作者 + "license": "MIT", + "homepage": "https://ext.dcloud.net.cn/plugin?id=2314", // 插件地址 + "files": [ // 必选 插件自身文件列表(支持通配,规范:https://docs.npmjs.com/files/package.json#files) + ], + "bundledFiles": [ // 插件依赖的文件列表,通常是依赖的三方插件的 files 合并 + "cloudfunctions/uni-clientDB", + "cloudfunctions/common/uni-id", + "js_sdk" + ] +} diff --git a/uni_modules/uni-clientDB/pages.json b/uni_modules/uni-clientDB/pages.json new file mode 100644 index 0000000..e69de29 diff --git a/uni_modules/uni-clientDB/readme.md b/uni_modules/uni-clientDB/readme.md new file mode 100644 index 0000000..d99af46 --- /dev/null +++ b/uni_modules/uni-clientDB/readme.md @@ -0,0 +1,248 @@ +## 简介 + +每个查询业务,都要写一个云函数,很麻烦,也占用云函数的总数量。 + +本插件提供了一个通用的数据库查询云函数,由前端向云函数传递要查询的条件,比如查询哪个表、查询哪些字段、where条件和排序是什么。 + +> 举例:在前端的list.vue列表页面,可以调用本云函数,传入列表查询条件。然后写content.vue详情页面时,无需再新建一个云函数,可以直接在content.vue页面继续调用相同的本云函数,传入详情的查询条件。 + +客户端的查询条件语法,与云函数里查询数据库的语法是相同的。[查询api手册](https://uniapp.dcloud.io/uniCloud/cf-database?id=%e6%9f%a5%e8%af%a2%e6%96%87%e6%a1%a3) + +与某些小程序云的客户端直接操作数据库不同,本方案有2个明显优势: +- 安全:查询权限是在云函数里控制台的,能查什么表、什么字段,在云端控制。如果全部放在前端,由于前端的不可信任,相当于无法控制权限了。而某些小程序云提供的客户端权限,并不可编程,无法满足开发者的实际业务权限需求 +- 包体积:某些小程序云的客户端操作数据库是一个数M大小的js sdk,如果迁移到H5和App,对应用的启动速度、性能、体积影响非常大 + +综上,本插件的优势在于: +1. 提高开发效率 +2. 减少云函数数量 +3. 安全,可控制权限 +4. 性能好 + +本项目包括云函数和客户端两部分,需要搭配使用,具体请参考下面文档。 + +**示例项目使用须知** + +1. 下载示例项目后选择服务空间 +2. 在db_init.json上右键初始化数据库 +3. 上传公共模块及云函数,公共模块用法参考[使用公共模块](https://uniapp.dcloud.net.cn/uniCloud/cf-common) +4. 运行项目即可 + +示例项目文件介绍: + +
+	
+┌─cloudfunctions    云函数
+│  ├─common         公共模块
+|  │  └─uni-curd    数据库查询通用公共模块
+|  ├─uni-clientDB   在云函数中控制权限,并调用uni-curd完成查询
+|  └─db_init.json   初始化数据库
+├─js_sdk            前端公共js目录
+|  └─uni-clientDB   前端的js库,封装了查询语法
+├─pages             业务页面文件存放的目录
+│  ├─index
+│  │  └─index.vue   index示例页面
+├─main.js           Vue初始化入口文件
+├─App.vue           应用配置,用来配置App全局样式以及监听 应用生命周期
+├─manifest.json     配置应用名称、appid、logo、版本等打包信息,详见
+└─pages.json        配置页面路由、导航条、选项卡等页面类信息,详见
+	
+
+ +- 云函数里包括一个公共模块`uni-curd`和一个云函数`uni-clientDB` +- 前端包括一个js sdk`uni-clientDB`,然后就是index.vue里的示例调用 +- index示例页面,里面包含两个示例一个简单查询一个分页查询 + +## 客户端公共模块 + +客户端js-sdk主要负责组装查询逻辑 + +**示例代码** + +```js +// 引入公共模块 +import db from '@/js_sdk/uni-clientDB/index.js' +const dbCmd = db.command + +// 使用uni-clientDB +uniCloud.callFunction({ + name: 'uni-clientDB', + data: { + command: db.collection('list').where({ + name: new RegExp('龚','g'), + time: dbCmd.gt(1105885393581) + }).field({ + extra: false + }).get() + }, + success(res) { + // ... + }, + fail(err) { + // ... + } +}) +``` + +**使用说明** + +语法与云函数写查询数据库一致,目前有以下限制: + +- 不可使用db.serverDate、db.Geo、db.RegExp +- 上传时会对query进行序列化,除Date类型、RegExp之外的所有不可序列化的参数类型均不支持(例如:undefined) +- 为方便控制禁止前端使用set方法,一般情况下也不需要前端使用set + +## 云函数公共模块 + +云函数公共模块`uni-curd`主要负责解析客户端查询逻辑,对客户端行为做简单的限制 + +**使用示例** + +```js +'use strict'; +const uniCurd = require('uni-curd') +const db = uniCloud.database() +const dbCmd = db.command +exports.main = async (event, context) => { + // 这里可以判断用户身份给予不同权限,例如:可以从event里拿到uni-id的token,根据token和客户端参数决定查询权限限制 + try { + const res = await uniCurd({ + command: event.command, + pagination: event.pagination, + rules: { + list: { // 数据表名 + // CRUD权限 + create: false, + read: true, + update: false, + delete: false, + // 是否允许使用聚合 + aggregate: false, + // 是否允许使用联表查询,联表查询时blockedField不会对被连接的数据表生效 + lookup: false, + // 使用聚合时blockField不会覆盖客户端的project,而是在聚合第一阶段插入project,不使用聚合时会在最后阶段插入一个field(会覆盖客户端的field方法) + blockedField: ['extra'], + // 不使用聚合时mixinCondition会在没有where的时候在collection方法之后插入where,有where时会跟where条件进行合并,取原条件且mixinCondition。使用聚合时会在第一阶段插入match使用混入的条件,如果有blockedField会插入在blockedField对应的project之前 + mixinCondition: { + time: dbCmd.gt(1000000000000) + }, + // 更多用法请参考下方参数说明文档 + } + } + }) + return res + + } catch (e) { + return { + code: 10001, + msg: e.message + } + } +}; + +``` + +**参数说明** + +|参数名 |类型 |是否必填 |默认值 |说明 | +|:-: |:-: |:-: |:-: |:-: | +|command |Object |是 |- |客户端上传的查询条件 | +|pagination |Object |否 |- |如需分页,请在此字段内配置 | +|rules |Object |是 |- |权限规则 | + +**pagination参数说明** + +|参数名 |类型 |是否必填 |默认值 |说明 | +|:-: |:-: |:-: |:-: |:-: | +|pageSize |Object |是 |- |每页数量 | +|current |Object |是 |- |当前页码 | + +**rules参数说明** + +rules下可以对不同的数据表配置不同的权限,比如以下规则代表”数据表list允许插入,数据表goods允许更新“ + +```js +{ + list: { + create: true, + }, + goods: { + update: true + } +} +``` + +|参数名 |类型 |是否必填 |默认值 |说明 | +|:-: |:-: |:-: |:-: |:-: | +|create |Boolean|否 |false |是否开启插入权限 | +|read |Boolean|否 |true |是否开启读权限 | +|update |Boolean|否 |false |是否开启更新权限 | +|delete |Boolean|否 |false |是否开启删除权限 | +|aggregate |Boolean|否 |false |是否允许聚合 | +|lookup |Boolean|否 |false |是否允许联表查询 | +|blockedField |Array |否 |- |屏蔽的数据库字段,请阅读注意事项 | +|mixinCondition |Object |否 |- |混入条件,请阅读注意事项 | +|hooks |Object |否 |- |回调方法 | + +**hooks参数说明** + +|参数名 |类型 |是否必填 |默认值 |说明 | +|:-: |:-: |:-: |:-: |:-: | +|beforeStageAppend |Function |否 |- |每个阶段被添加之前执行 | +|afterStageAppend |Function |否 |- |每个阶段被添加之后执行 | +|beforeSend |Function |否 |- |最终阶段'get', 'end', 'count', 'add', 'remove', 'update'添加之前执行,在beforeStageAppend之后 | + +**回调方法的使用** + +回调参数如下: + +```js +{ + state: { + useAggregate, // 是否使用了聚合 + useLookup, // 是否使用了联表查询 + type, // 操作类型,可能的值为create、read、update、delete + collection, // 当前数据表名 + methodList // 使用到的方法列表 + }, + stage: { + method, // 当前阶段方法名 + args // 当前阶段方法参数 + }, + exec // 已经组装的查询指令 +} +``` + +回调方法中可以通过返回结果修改数据库指令,例如以下示例在skip之后插入一个limit + +```js +afterStageAppend: function({ + state, + stage, + exec +}) { + if(stage.method === 'skip') { + return exec.limit(1) + } +}, +``` + +**注意事项** + +- 关于blockedField + + 使用聚合时blockField不会覆盖客户端的project,而是在聚合第一阶段插入project + + 不使用聚合时会在最后阶段插入一个field(会覆盖客户端的field方法) + + blockedField仅对读操作生效 + +- 关于mixinCondition + + mixinCondition内可以使用数据库操作符 + + 不使用聚合时mixinCondition会在没有where的时候在collection方法之后插入where,有where时会跟where条件进行合并,取原条件且mixinCondition。 + + 使用聚合时会在第一阶段插入match使用混入的条件,如果有blockedField会插入在blockedField对应的project之前 + + mixinCondition会对除插入以外的所有操作生效 + + 使用mixinCondition时客户端不可使用`collection('xxx').doc('xxx')`方法(1.0.8版本起即使有mixinCondition客户端也可以使用doc方法) + +- 关于联表查询 + + 连接的数据表也会受所配置的权限规则中对应数据表规则限制,主要是read,目前连接的数据表不会受blockedField限制 + +**参考** + +在线通讯录项目,完整的演示了如何基于clientDB在客户端代码里实现数据的增删改查,是学习clientDB的重要示例项目。该项目插件地址:[https://ext.dcloud.net.cn/plugin?id=2574](https://ext.dcloud.net.cn/plugin?id=2574) \ No newline at end of file diff --git a/uni_modules/uni-collapse/changelog.md b/uni_modules/uni-collapse/changelog.md new file mode 100644 index 0000000..f8f136f --- /dev/null +++ b/uni_modules/uni-collapse/changelog.md @@ -0,0 +1,4 @@ +## 1.1.6(2021-02-05) +- 优化 组件引用关系,通过uni_modules引用组件 +## 1.1.5(2021-02-05) +- 调整为uni_modules目录规范 \ No newline at end of file diff --git a/uni_modules/uni-collapse/components/uni-collapse-item/uni-collapse-item.vue b/uni_modules/uni-collapse/components/uni-collapse-item/uni-collapse-item.vue new file mode 100644 index 0000000..b404200 --- /dev/null +++ b/uni_modules/uni-collapse/components/uni-collapse-item/uni-collapse-item.vue @@ -0,0 +1,220 @@ + + + + + diff --git a/uni_modules/uni-collapse/components/uni-collapse/uni-collapse.vue b/uni_modules/uni-collapse/components/uni-collapse/uni-collapse.vue new file mode 100644 index 0000000..bb3745f --- /dev/null +++ b/uni_modules/uni-collapse/components/uni-collapse/uni-collapse.vue @@ -0,0 +1,59 @@ + + + diff --git a/uni_modules/uni-collapse/package.json b/uni_modules/uni-collapse/package.json new file mode 100644 index 0000000..8297315 --- /dev/null +++ b/uni_modules/uni-collapse/package.json @@ -0,0 +1,84 @@ +{ + "id": "uni-collapse", + "displayName": "Collapse 折叠面板", + "version": "1.1.6", + "description": " collapse uni-ui 折叠面板 手风琴", + "keywords": [ + "Collapse", + "组件,可以折叠", + "/", + "展开的内容区域。" +], + "repository": "https://github.com/dcloudio/uni-ui", + "engines": { + "HBuilderX": "" + }, + "directories": { + "example": "../../temps/example_temps" + }, + "dcloudext": { + "category": [ + "前端组件", + "通用组件" + ], + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "无", + "permissions": "无" + }, + "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui" + }, + "uni_modules": { + "dependencies": [ + "uni-icons" + ], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "App": { + "app-vue": "y", + "app-nvue": "y" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y" + }, + "快应用": { + "华为": "u", + "联盟": "u" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uni-collapse/readme.md b/uni_modules/uni-collapse/readme.md new file mode 100644 index 0000000..6fefb29 --- /dev/null +++ b/uni_modules/uni-collapse/readme.md @@ -0,0 +1,107 @@ + + +## Collapse 折叠面板 +> 代码块: `uCollapse` +> 关联组件:`uni-collapse-item`、`uni-icons`。 + + +展示可以折叠 / 展开的内容区域。 + +### 安装方式 + +本组件符合[easycom](https://uniapp.dcloud.io/collocation/pages?id=easycom)规范,`HBuilderX 2.5.5`起,只需将本组件导入项目,在页面`template`中即可直接使用,无需在页面中`import`和注册`components`。 + +如需通过`npm`方式使用`uni-ui`组件,另见文档:[https://ext.dcloud.net.cn/plugin?id=55](https://ext.dcloud.net.cn/plugin?id=55) + +### 基本用法 + +在 ``template`` 中引用组件 + +```html + + + + + + + + + + + 折叠内容主体,可自定义内容及样式 + + + 禁用状态 + + + + + + + + 手风琴效果 + + + + + 手风琴效果 + + + + + 手风琴效果 + + + + + + + + + 折叠内容主体,可自定义内容及样式 + + + + + 折叠内容主体,可自定义内容及样式 + + + +``` + +## API + +### Collapse Props + +|属性名 |类型 |默认值 |说明 | +|:-: |:-: |:-: |:-: | +|accordion |Boolean|false |是否开启手风琴效果 | + + +### Collapse Event + +|事件称名 |说明 |返回值 | +|:-: |:-: :-: | +|@change |切换面板时触发 |activeNames(Array):展开状态的uniCollapseItem的name值| + + +### Collapse Methods + +|方法名称 |说明 | +|:-: |:-: | +|resize |更新当前列表高度,只有 `animation:true` 下生效| + + +> - resize 方法解决动态添加数据,带动画的折叠面板高度不更新的问题 +> - 需要在数据渲染完毕之后使用 `resize` 方法。推荐在 `this.nextTick()` 中使用 + + +### CollapseItem Props + +|属性名 |类型 |默认值 |说明 | +|:-: |:-: |:-: |:-: | +|title |String |- |标题文字 | +|thumb |String |- |标题左侧缩略图 | +|disabled |Boolean|false |是否禁用 | +|open |Boolean|false |是否展开面板 | +|showAnimation |Boolean |false |开启动画 | \ No newline at end of file diff --git a/uni_modules/uni-combox/changelog.md b/uni_modules/uni-combox/changelog.md new file mode 100644 index 0000000..7e2e909 --- /dev/null +++ b/uni_modules/uni-combox/changelog.md @@ -0,0 +1,4 @@ +## 0.0.4(2021-02-05) +- 优化 组件引用关系,通过uni_modules引用组件 +## 0.0.3(2021-02-04) +- 调整为uni_modules目录规范 diff --git a/uni_modules/uni-combox/components/uni-combox/uni-combox.vue b/uni_modules/uni-combox/components/uni-combox/uni-combox.vue new file mode 100644 index 0000000..e815b20 --- /dev/null +++ b/uni_modules/uni-combox/components/uni-combox/uni-combox.vue @@ -0,0 +1,218 @@ + + + + + diff --git a/uni_modules/uni-combox/package.json b/uni_modules/uni-combox/package.json new file mode 100644 index 0000000..acbca00 --- /dev/null +++ b/uni_modules/uni-combox/package.json @@ -0,0 +1,82 @@ +{ + "id": "uni-combox", + "displayName": "Combox 组合框", + "version": "0.0.4", + "description": "可以选择也可以输入的表单项 ", + "keywords": [ + "combox", + "组合框", + "可下拉输入框", + "select" +], + "repository": "https://github.com/dcloudio/uni-ui", + "engines": { + "HBuilderX": "" + }, + "directories": { + "example": "../../temps/example_temps" + }, + "dcloudext": { + "category": [ + "前端组件", + "通用组件" + ], + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "无", + "permissions": "无" + }, + "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui" + }, + "uni_modules": { + "dependencies": [], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "App": { + "app-vue": "y", + "app-nvue": "n" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y" + }, + "快应用": { + "华为": "u", + "联盟": "u" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uni-combox/readme.md b/uni_modules/uni-combox/readme.md new file mode 100644 index 0000000..b812056 --- /dev/null +++ b/uni_modules/uni-combox/readme.md @@ -0,0 +1,46 @@ + + +## Combox 组合框 +> 代码块: `uCombox` + + +组合框组件。 + +### 平台兼容性说明 + +**暂不支持nvue** + +### 安装方式 + +本组件符合[easycom](https://uniapp.dcloud.io/collocation/pages?id=easycom)规范,`HBuilderX 2.5.5`起,只需将本组件导入项目,在页面`template`中即可直接使用,无需在页面中`import`和注册`components`。 + +如需通过`npm`方式使用`uni-ui`组件,另见文档:[https://ext.dcloud.net.cn/plugin?id=55](https://ext.dcloud.net.cn/plugin?id=55) + +### 基本用法 + +在 ``template`` 中使用组件 +```html + +``` + +## API + +### Combox Props + +|属性名 |类型 |默认值 |说明 | +|:-: |:-: |:-: |:-: | +|label |String |- |标签文字 | +|value |String |- |combox的值 | +|labelWidth |String |auto |标签宽度,有单位字符串,如:'100px' | +|placeholder|String |- |输入框占位符 | +|candidates |Array/String |[] |候选字段 | +|emptyTips |String |无匹配项 |无匹配项时的提示语 | + +### Combox Events + +|事件称名 |说明 |返回值 | +|:-: |:-: |:-: | +|@input |combox输入事件 |返回combox值| + + + diff --git a/uni_modules/uni-countdown/changelog.md b/uni_modules/uni-countdown/changelog.md new file mode 100644 index 0000000..733ef50 --- /dev/null +++ b/uni_modules/uni-countdown/changelog.md @@ -0,0 +1,2 @@ +## 1.0.2(2021-02-04) +- 调整为uni_modules目录规范 diff --git a/uni_modules/uni-countdown/components/uni-countdown/uni-countdown.vue b/uni_modules/uni-countdown/components/uni-countdown/uni-countdown.vue new file mode 100644 index 0000000..7e9c508 --- /dev/null +++ b/uni_modules/uni-countdown/components/uni-countdown/uni-countdown.vue @@ -0,0 +1,211 @@ + + + diff --git a/uni_modules/uni-countdown/package.json b/uni_modules/uni-countdown/package.json new file mode 100644 index 0000000..91ed1a1 --- /dev/null +++ b/uni_modules/uni-countdown/package.json @@ -0,0 +1,81 @@ +{ + "id": "uni-countdown", + "displayName": "Countdown 倒计时", + "version": "1.0.2", + "description": "CountDown 倒计时组件", + "keywords": [ + "countdown", + "uni-ui", + "倒计时" +], + "repository": "https://github.com/dcloudio/uni-ui", + "engines": { + "HBuilderX": "" + }, + "directories": { + "example": "../../temps/example_temps" + }, + "dcloudext": { + "category": [ + "前端组件", + "通用组件" + ], + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "无", + "permissions": "无" + }, + "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui" + }, + "uni_modules": { + "dependencies": [], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "App": { + "app-vue": "y", + "app-nvue": "y" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y" + }, + "快应用": { + "华为": "u", + "联盟": "u" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uni-countdown/readme.md b/uni_modules/uni-countdown/readme.md new file mode 100644 index 0000000..567fd05 --- /dev/null +++ b/uni_modules/uni-countdown/readme.md @@ -0,0 +1,50 @@ + + +## CountDown 倒计时 +> 代码块: `uCountDown` + + +倒计时组件。 + +### 安装方式 + +本组件符合[easycom](https://uniapp.dcloud.io/collocation/pages?id=easycom)规范,`HBuilderX 2.5.5`起,只需将本组件导入项目,在页面`template`中即可直接使用,无需在页面中`import`和注册`components`。 + +如需通过`npm`方式使用`uni-ui`组件,另见文档:[https://ext.dcloud.net.cn/plugin?id=55](https://ext.dcloud.net.cn/plugin?id=55) + +### 基本用法 + +在 ``template`` 中使用组件 + +```html + + + + + + + + +``` + +## API + +### Countdown Props + +|属性名 |类型 |默认值 |说明 | +|:-: |:-: |:-: |:-: | +|backgroundColor |String |#FFFFFF|背景色 | +|color |String |#000000|文字颜色 | +|splitorColor |String |#000000|分割符号颜色 | +|day |Number |0 |天数 | +|hour |Number |0 |小时 | +|minute |Number |0 |分钟 | +|second |Number |0 |秒 | +|showDay |Boolean|true |是否显示天数 | +|showColon |Boolean|true |是否以冒号为分隔符 | + +### Countdown Events + +|事件称名 |说明 |返回值 | +|:-: |:-: |:-: | +|@timeup|倒计时时间到触发事件 |- | diff --git a/uni_modules/uni-data-checkbox/changelog.md b/uni_modules/uni-data-checkbox/changelog.md new file mode 100644 index 0000000..5fa34d2 --- /dev/null +++ b/uni_modules/uni-data-checkbox/changelog.md @@ -0,0 +1,8 @@ +## 0.1.3(2021-03-22) +- 新增 disabled属性 +## 0.1.2(2021-02-24) +- 优化 默认颜色显示 +## 0.1.1(2021-02-24) +- 新增 支持nvue +## 0.1.0(2021-02-18) +- “暂无数据”显示居中 diff --git a/uni_modules/uni-data-checkbox/components/uni-data-checkbox/uni-data-checkbox.vue b/uni_modules/uni-data-checkbox/components/uni-data-checkbox/uni-data-checkbox.vue new file mode 100644 index 0000000..c6bf68a --- /dev/null +++ b/uni_modules/uni-data-checkbox/components/uni-data-checkbox/uni-data-checkbox.vue @@ -0,0 +1,785 @@ + + + + + diff --git a/uni_modules/uni-data-checkbox/package.json b/uni_modules/uni-data-checkbox/package.json new file mode 100644 index 0000000..c5fcbfc --- /dev/null +++ b/uni_modules/uni-data-checkbox/package.json @@ -0,0 +1,81 @@ +{ + "id": "uni-data-checkbox", + "displayName": "DataCheckbox 数据选择器", + "version": "0.1.3", + "description": "通过数据驱动的单选框和复选框", + "keywords": [ + "checkbox", + "uni-data-checkbox", + "单选多选" +], + "repository": "https://github.com/dcloudio/uni-ui", + "engines": { + "HBuilderX": "^3.1.1" + }, + "directories": { + "example": "../../temps/example_temps" + }, + "dcloudext": { + "category": [ + "前端组件", + "通用组件" + ], + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "无", + "permissions": "无" + }, + "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui" + }, + "uni_modules": { + "dependencies": ["uni-load-more"], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "App": { + "app-vue": "y", + "app-nvue": "y" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y" + }, + "快应用": { + "华为": "u", + "联盟": "u" + } + } + } + } +} diff --git a/uni_modules/uni-data-checkbox/readme.md b/uni_modules/uni-data-checkbox/readme.md new file mode 100644 index 0000000..c34450c --- /dev/null +++ b/uni_modules/uni-data-checkbox/readme.md @@ -0,0 +1,291 @@ + + +## DataCheckbox 数据驱动的单选复选框 +> 代码块: `uDataCheckbox` + + +本组件是基于uni-app基础组件checkbox的封装。本组件要解决问题包括: + +1. 数据绑定型组件:给本组件绑定一个data,会自动渲染一组候选内容。再以往,开发者需要编写不少代码实现类似功能 +2. 自动的表单校验:组件绑定了data,且符合[uni-forms](https://ext.dcloud.net.cn/plugin?id=2773)组件的表单校验规范,搭配使用会自动实现表单校验 +3. 本组件合并了单选多选 +4. 本组件有若干风格选择,如普通的单选多选框、并列button风格、tag风格。开发者可以快速选择需要的风格。但作为一个封装组件,样式代码虽然不用自己写了,却会牺牲一定的样式自定义性 + +在uniCloud开发中,`DB Schema`中配置了enum枚举等类型后,在web控制台的[自动生成表单](https://uniapp.dcloud.io/uniCloud/schema?id=autocode)功能中,会自动生成``uni-data-checkbox``组件并绑定好data + +> 为了避免错误使用,给大家带来不好的开发体验,请在使用组件前仔细阅读下面的注意事项,可以帮你避免一些错误。 +> - 组件需要依赖 `sass` 插件 ,请自行手动安装 +> - 本组件为数据驱动,目的是快速投入使用,只可通过 style 覆盖有限样式,不支持自定义更多样式 +> - 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 +> - 组件支持 nvue ,需要在 `manifest.json > app-plus` 节点下配置 `"nvueStyleCompiler" : "uni-app"` +> - 如组件显示有问题 ,请升级 `HBuilderX` 为 `v3.1.0` 以上 + + +### 安装方式 + +本组件符合[easycom](https://uniapp.dcloud.io/collocation/pages?id=easycom)规范,`HBuilderX 2.5.5`起,只需将本组件导入项目,在页面`template`中即可直接使用,无需在页面中`import`和注册`components`。 + +如需通过`npm`方式使用`uni-ui`组件,另行文档:[https://ext.dcloud.net.cn/plugin?id=55](https://ext.dcloud.net.cn/plugin?id=55) + +### 基本用法 + +设置 `localdata` 属性后,组件会通过数据渲染出对应的内容,默认显示的是单选框 + +需要注意 `:multiple="false"` 时(单选) , `value/v-model` 的值是 `String|Number` 类型 + +```html + + +``` + +```javascript + +export default { + data() { + return { + value: 0, + range: [{"value": 0,"text": "篮球" },{"value": 1,"text": "足球"},{"value": 2,"text": "游泳"}] + } + }, + methods: { + change(e){ + console.log('e:',e); + } + } +} +``` + +### 多选框 + +设置 `multiple` 属性,组件显示为多选框 + +需要注意 `:multiple="true"` 时(多选) , `value/v-model` 的值是 `Array` 类型 + +```html + + +``` + +```javascript + +export default { + data() { + return { + value: [0,2], + range: [{"value": 0,"text": "篮球" },{"value": 1,"text": "足球"},{"value": 2,"text": "游泳"}] + } + }, + methods: { + change(e){ + console.log('e:',e); + } + } +} +``` + +### 设置最大最小值 + +设置 `:multiple="true"` 时(多选) ,可以设置 `min`、`max` 属性 + +如果选中个数小于 `min` 属性设置的值,那么选中内容将不可取消,只有当选中个数大于等于 `min`且小于 `max` 时,才可取消选中 + +如果选中个数大于等于 `max` 属性设置的值,那么其他未选中内容将不可选 + +```html + + +``` + +```javascript + +export default { + data() { + return { + value: [0,2], + range: [{"value": 0,"text": "篮球" },{"value": 1,"text": "足球"},{"value": 2,"text": "游泳"}] + } + }, + methods: { + change(e){ + console.log('e:',e); + } + } +} +``` + +### 设置禁用 + +如果需要禁用某项,需要在 `localdata` 属性的数据源中添加 `disable` 属性,而不是在组件中添加 `disable` 属性 + +```html + + +``` + +```javascript + +export default { + data() { + return { + value: 0, + range: [{ + "value": 0, + "text": "篮球" + }, + { + "value": 1, + "text": "足球", + // 禁用当前项 + "disable":true + }, + { + "value": 2, + "text": "游泳" + } + ] + } + }, + methods: { + change(e){ + console.log('e:',e); + } + } +} +``` + + +### 自定义选中颜色 + +设置 `selectedColor` 属性,可以修改组件选中后的图标及边框颜色 + +设置 `selectedTextColor` 属性,可以修改组件选中后的文字颜色,如不填写默认同 `selectedColor` 属性 ,`mode` 属性为 `tag` 时,默认为白色 + +```html + + +``` + +```javascript + +export default { + data() { + return { + value: [0,2], + range: [{"value": 0,"text": "篮球" },{"value": 1,"text": "足球"},{"value": 2,"text": "游泳"}] + } + }, + methods: { + change(e){ + console.log('e:',e); + } + } +} +``` + +### 更多模式 + +设置 `mode` 属性,可以设置更多显示样式,目前内置样式有四种 `default/list/button/tag` + +如果需要禁用某项,需要在 `localdata` 属性的数据源中添加 `disable` 属性,而不是在组件中添加 `disable` 属性 + +```html + + +``` + +```javascript + +export default { + data() { + return { + value: 0, + range: [{"value": 0,"text": "篮球" },{"value": 1,"text": "足球"},{"value": 2,"text": "游泳"}] + } + }, + methods: { + change(e){ + console.log('e:',e); + } + } +} +``` + + +## API + +### DataCheckbox Props + +| 属性名 | 类型 |可选值 | 默认值| 说明 | +| :-: | :-: |:-: |:-: | :-: | +|value/v-model|Array/String/Number|- |- |默认值,multiple=true时为 Array类型,否则为 String或Number类型 | +|localdata |Array |- |- |本地渲染数据, | +|mode | String |default/list/button/tag|default|显示模式 | +|multiple |Boolean |- |false |是否多选 | +|min |String/Number |- |- |最小选择个数 ,multiple为true时生效 | +|max |String/Number |- |- |最大选择个数 ,multiple为true时生效 | +|wrap |Boolean |- |- |是否换行显示 | +|icon |String |left/right |left |list 列表模式下 icon 显示的位置 | +|selectedColor|String |- |#007aff|选中颜色| +|selectedTextColor|String |- |#333 |选中文本颜色,如不填写则自动显示| +|emptyText |String |- |暂无数据 |没有数据时显示的文字 ,本地数据无效| + +#### Localdata Options + +`localdata` 属性的格式为数组,数组内每项是对象,需要严格遵循如下格式 + +|属性名 | 说明 | +|:-: | :-: | +|text |显示文本 | +|value |选中后的值 | +|disable |是否禁用 | + +#### Mode Options + +|属性名 | 说明 | +|:-: | :-: | +|default |默认值,横向显示 | +|list |列表 | +|button |按钮 | +|tag |标签 | + + +### DataCheckbox Events + +| 事件名 | 事件说明 | 返回参数| +| :-: | :-: | :-: | +| @chage| 选中状态改变时触发事件 | - | + + diff --git a/uni_modules/uni-data-picker/changelog.md b/uni_modules/uni-data-picker/changelog.md new file mode 100644 index 0000000..8ad6f35 --- /dev/null +++ b/uni_modules/uni-data-picker/changelog.md @@ -0,0 +1,8 @@ +## 0.2.0(2021-03-15) +- 修复 nodeclick、popupopened、popupclosed事件无法触发的问题 +## 0.1.9(2021-03-09) +- 修复 微信小程序某些情况下无法选择的问题 +## 0.1.8(2021-02-05) +- 优化 部分样式在nvue上的兼容表现 +## 0.1.7(2021-02-05) +- 调整为uni_modules目录规范 diff --git a/uni_modules/uni-data-picker/components/uni-data-picker/config.json b/uni_modules/uni-data-picker/components/uni-data-picker/config.json new file mode 100644 index 0000000..dc6b403 --- /dev/null +++ b/uni_modules/uni-data-picker/components/uni-data-picker/config.json @@ -0,0 +1,12 @@ +{ + "id": "3796", + "name": "DataPicker", + "desc": "数据驱动的picker选择器", + "url": "data-picker", + "type": "表单组件", + "edition": "0.0.8", + "suffix": "vue", + "module": ["uni-data-picker","uni-data-pickerview","uni-load-more"], + "path": "https://ext.dcloud.net.cn/plugin?id=3796", + "update_log": ["- 优化 增加下拉箭头"] +} diff --git a/uni_modules/uni-data-picker/components/uni-data-picker/keypress.js b/uni_modules/uni-data-picker/components/uni-data-picker/keypress.js new file mode 100644 index 0000000..6ef26a2 --- /dev/null +++ b/uni_modules/uni-data-picker/components/uni-data-picker/keypress.js @@ -0,0 +1,45 @@ +// #ifdef H5 +export default { + name: 'Keypress', + props: { + disable: { + type: Boolean, + default: false + } + }, + mounted () { + const keyNames = { + esc: ['Esc', 'Escape'], + tab: 'Tab', + enter: 'Enter', + space: [' ', 'Spacebar'], + up: ['Up', 'ArrowUp'], + left: ['Left', 'ArrowLeft'], + right: ['Right', 'ArrowRight'], + down: ['Down', 'ArrowDown'], + delete: ['Backspace', 'Delete', 'Del'] + } + const listener = ($event) => { + if (this.disable) { + return + } + const keyName = Object.keys(keyNames).find(key => { + const keyName = $event.key + const value = keyNames[key] + return value === keyName || (Array.isArray(value) && value.includes(keyName)) + }) + if (keyName) { + // 避免和其他按键事件冲突 + setTimeout(() => { + this.$emit(keyName, {}) + }, 0) + } + } + document.addEventListener('keyup', listener) + this.$once('hook:beforeDestroy', () => { + document.removeEventListener('keyup', listener) + }) + }, + render: () => {} +} +// #endif diff --git a/uni_modules/uni-data-picker/components/uni-data-picker/uni-data-picker.vue b/uni_modules/uni-data-picker/components/uni-data-picker/uni-data-picker.vue new file mode 100644 index 0000000..a3bd821 --- /dev/null +++ b/uni_modules/uni-data-picker/components/uni-data-picker/uni-data-picker.vue @@ -0,0 +1,462 @@ + + + + + diff --git a/uni_modules/uni-data-picker/components/uni-data-pickerview/uni-data-picker.js b/uni_modules/uni-data-picker/components/uni-data-pickerview/uni-data-picker.js new file mode 100644 index 0000000..af69e74 --- /dev/null +++ b/uni_modules/uni-data-picker/components/uni-data-pickerview/uni-data-picker.js @@ -0,0 +1,468 @@ +export default { + props: { + localdata: { + type: [Array, Object], + default () { + return [] + } + }, + collection: { + type: String, + default: '' + }, + action: { + type: String, + default: '' + }, + field: { + type: String, + default: '' + }, + orderby: { + type: String, + default: '' + }, + where: { + type: [String, Object], + default: '' + }, + pageData: { + type: String, + default: 'add' + }, + pageCurrent: { + type: Number, + default: 1 + }, + pageSize: { + type: Number, + default: 20 + }, + getcount: { + type: [Boolean, String], + default: false + }, + getone: { + type: [Boolean, String], + default: false + }, + gettree: { + type: [Boolean, String], + default: false + }, + manual: { + type: Boolean, + default: false + }, + value: { + type: [Array, String, Number], + default () { + return [] + } + }, + preload: { + type: Boolean, + default: false + }, + stepSearh: { + type: Boolean, + default: true + }, + selfField: { + type: String, + default: '' + }, + parentField: { + type: String, + default: '' + }, + multiple: { + type: Boolean, + default: false + } + }, + data() { + return { + loading: false, + errorMessage: '', + loadMore: { + contentdown: '', + contentrefresh: '', + contentnomore: '' + }, + dataList: [], + selected: [], + selectedIndex: 0, + page: { + current: this.pageCurrent, + size: this.pageSize, + count: 0 + } + } + }, + computed: { + isLocaldata() { + return this.localdata.length > 0 + }, + postField() { + return `${this.field}, ${this.parentField} as parent_value` + } + }, + created() { + this.$watch(() => { + var al = []; + ['pageCurrent', + 'pageSize', + 'value', + 'localdata', + 'collection', + 'action', + 'field', + 'orderby', + 'where', + 'getont', + 'getcount', + 'gettree' + ].forEach(key => { + al.push(this[key]) + }); + return al + }, (newValue, oldValue) => { + let needReset = false + for (let i = 2; i < newValue.length; i++) { + if (newValue[i] != oldValue[i]) { + needReset = true + break + } + } + if (newValue[0] != oldValue[0]) { + this.page.current = this.pageCurrent + } + this.page.size = this.pageSize + + this.onPropsChange() + }) + this._treeData = [] + }, + methods: { + onPropsChange() { + this._treeData = [] + }, + getCommand(options = {}) { + /* eslint-disable no-undef */ + let db = uniCloud.database() + + const action = options.action || this.action + if (action) { + db = db.action(action) + } + + const collection = options.collection || this.collection + db = db.collection(collection) + + const where = options.where || this.where + if (!(!where || !Object.keys(where).length)) { + db = db.where(where) + } + + const field = options.field || this.field + if (field) { + db = db.field(field) + } + + const orderby = options.orderby || this.orderby + if (orderby) { + db = db.orderBy(orderby) + } + + const current = options.pageCurrent !== undefined ? options.pageCurrent : this.page.current + const size = options.pageSize !== undefined ? options.pageSize : this.page.size + const getCount = options.getcount !== undefined ? options.getcount : this.getcount + const getTree = options.gettree !== undefined ? options.gettree : this.gettree + + const getOptions = { + getCount, + getTree + } + if (options.getTreePath) { + getOptions.getTreePath = options.getTreePath + } + + db = db.skip(size * (current - 1)).limit(size).get(getOptions) + + return db + }, + getTreePath(callback) { + if (this.loading) { + return + } + this.loading = true + + this.getCommand({ + field: this.postField, + getTreePath: { + startWith: `${this.selfField}=='${this.value}'` + } + }).then((res) => { + this.loading = false + let treePath = [] + this._extractTreePath(res.result.data, treePath) + this.selected = treePath + callback && callback() + }).catch((err) => { + this.loading = false + this.errorMessage = err + }) + }, + loadData() { + if (this.isLocaldata) { + this._processLocalData() + return + } + + if (this.value.length) { + this._loadNodeData((data) => { + this._treeData = data + this._updateBindData() + this._updateSelected() + }) + return + } + + if (this.stepSearh) { + this._loadNodeData((data) => { + this._treeData = data + this._updateBindData() + }) + } else { + this._loadAllData((data) => { + this._treeData = [] + this._extractTree(data, this._treeData, null) + this._updateBindData() + }) + } + }, + _loadAllData(callback) { + if (this.loading) { + return + } + this.loading = true + + this.getCommand({ + field: this.postField, + gettree: true, + startwith: `${this.selfField}=='${this.value}'` + }).then((res) => { + this.loading = false + callback(res.result.data) + this.onDataChange() + }).catch((err) => { + this.loading = false + this.errorMessage = err + }) + }, + _loadNodeData(callback, pw) { + if (this.loading) { + return + } + this.loading = true + + this.getCommand({ + field: this.postField, + where: pw || this._postWhere(), + pageSize: 500 + }).then((res) => { + this.loading = false + callback(res.result.data) + this.onDataChange() + }).catch((err) => { + this.loading = false + this.errorMessage = err + }) + }, + _postWhere() { + let result = [] + let selected = this.selected + result.push(`${this.parentField} == null`) + if (selected.length) { + for (var i = 0; i < selected.length - 1; i++) { + result.push(`${this.parentField} == '${selected[i].value}'`) + } + } + + if (this.where) { + return `(${this.where}) && (${result.join(' || ')})` + } + + return result.join(' || ') + }, + _nodeWhere() { + let result = [] + let selected = this.selected + if (selected.length) { + result.push(`${this.parentField} == '${selected[selected.length - 1].value}'`) + } + + if (this.where) { + return `(${this.where}) && (${result.join(' || ')})` + } + + return result.join(' || ') + }, + _updateSelected() { + var dl = this.dataList + var sl = this.selected + for (var i = 0; i < sl.length; i++) { + var value = sl[i].value + var dl2 = dl[i] + for (var j = 0; j < dl2.length; j++) { + var item2 = dl2[j] + if (item2.value === value) { + sl[i].text = item2.text + break + } + } + } + }, + _updateBindData(node) { + const { + dataList, + hasNodes + } = this._filterData(this._treeData, this.selected) + + let isleaf = this._stepSearh === false && !hasNodes + + if (node) { + node.isleaf = isleaf + } + + this.dataList = dataList + this.selectedIndex = dataList.length - 1 + + if (!isleaf && this.selected.length < dataList.length) { + this.selected.push({ + value: null, + text: "请选择" + }) + } + + return { + isleaf, + hasNodes + } + }, + _filterData(data, paths) { + let dataList = [] + + let hasNodes = true + + dataList.push(data.filter((item) => { + return item.parent_value === undefined + })) + for (let i = 0; i < paths.length; i++) { + var value = paths[i].value + var nodes = data.filter((item) => { + return item.parent_value === value + }) + + if (nodes.length) { + dataList.push(nodes) + } else { + hasNodes = false + } + } + + return { + dataList, + hasNodes + } + }, + _extractTree(nodes, result, parent_value) { + let list = result || [] + for (let i = 0; i < nodes.length; i++) { + let node = nodes[i] + + let child = {} + for (let key in node) { + if (key !== 'children') { + child[key] = node[key] + } + } + if (parent_value !== null) { + child.parent_value = parent_value + } + result.push(child) + + let children = node.children + if (children) { + this._extractTree(children, result, node.value) + } + } + }, + _extractTreePath(nodes, result) { + let list = result || [] + for (let i = 0; i < nodes.length; i++) { + let node = nodes[i] + + let child = {} + for (let key in node) { + if (key !== 'children') { + child[key] = node[key] + } + } + result.push(child) + + let children = node.children + if (children) { + this._extractTreePath(children, result) + } + } + }, + _findNodePath(key, nodes, path = []) { + for (let i = 0; i < nodes.length; i++) { + let { + value, + text, + children + } = nodes[i] + + path.push({ + value, + text + }) + + if (value === key) { + return path + } + + if (children) { + const p = this._findNodePath(key, children, path) + if (p.length) { + return p + } + } + + path.pop() + } + return [] + }, + _processLocalData() { + this._treeData = [] + this._extractTree(this.localdata, this._treeData) + + var inputValue = this.value + if (inputValue === undefined) { + return + } + + if (Array.isArray(inputValue)) { + inputValue = inputValue[inputValue.length - 1] + if (typeof inputValue === 'object' && inputValue.value) { + inputValue = inputValue.value + } + } + + this.selected = this._findNodePath(inputValue, this.localdata) + } + } +} diff --git a/uni_modules/uni-data-picker/components/uni-data-pickerview/uni-data-pickerview.vue b/uni_modules/uni-data-picker/components/uni-data-pickerview/uni-data-pickerview.vue new file mode 100644 index 0000000..80075ac --- /dev/null +++ b/uni_modules/uni-data-picker/components/uni-data-pickerview/uni-data-pickerview.vue @@ -0,0 +1,289 @@ + + + + + diff --git a/uni_modules/uni-data-picker/package.json b/uni_modules/uni-data-picker/package.json new file mode 100644 index 0000000..72cd4ce --- /dev/null +++ b/uni_modules/uni-data-picker/package.json @@ -0,0 +1,86 @@ +{ + "id": "uni-data-picker", + "displayName": "DataPicker 数据驱动的picker选择器", + "version": "0.2.0", + "description": "Picker选择器", + "keywords": [ + "", + "picker", + "级联", + "uni-data-picker", + "省市区选择", + "地址选择" +], + "repository": "https://github.com/dcloudio/uni-ui", + "engines": { + "HBuilderX": "" + }, + "directories": { + "example": "../../temps/example_temps" + }, + "dcloudext": { + "category": [ + "前端组件", + "通用组件" + ], + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "无", + "permissions": "无" + }, + "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui" + }, + "uni_modules": { + "dependencies": [ + "uni-load-more" + ], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "App": { + "app-vue": "y", + "app-nvue": "y" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y" + }, + "快应用": { + "华为": "u", + "联盟": "u" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uni-data-picker/readme.md b/uni_modules/uni-data-picker/readme.md new file mode 100644 index 0000000..b449f73 --- /dev/null +++ b/uni_modules/uni-data-picker/readme.md @@ -0,0 +1,253 @@ +## DataPicker 级联选择 +> 代码块: `uDataPicker` +> 关联组件:`uni-data-pickerview`、`uni-load-more`。 + + +`` 是一个选择类[datacom组件](https://uniapp.dcloud.net.cn/component/datacom)。 + +支持单列、和多列级联选择。列数没有限制,如果屏幕显示不全,顶部tab区域会左右滚动。 + +候选数据支持一次性加载完毕,也支持懒加载,比如示例图中,选择了“北京”后,动态加载北京的区县数据。 + +`` 组件尤其适用于地址选择、分类选择等选择类。 + +`` 支持本地数据、云端静态数据(json),uniCloud云数据库数据。 + +`` 可以通过JQL直连uniCloud云数据库,配套[DB Schema](https://uniapp.dcloud.net.cn/uniCloud/schema),可在schema2code中自动生成前端页面,还支持服务器端校验。 + +在uniCloud数据表中新建表“uni-id-address”和“opendb-city-china”,这2个表的schema自带foreignKey关联。在“uni-id-address”表的表结构页面使用schema2code生成前端页面,会自动生成地址管理的维护页面,自动从“opendb-city-china”表包含的中国所有省市区信息里选择地址。 + + +> 为了避免错误使用,给大家带来不好的开发体验,请在使用组件前仔细阅读下面的注意事项,可以帮你避免一些错误。 +> - 组件需要依赖 `sass` 插件 ,请自行手动安装 +> - 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 +> - `` 内部包含了弹出层组件 `` 外层的布局可能会影响弹出层,[详情](https://developer.mozilla.org/zh-CN/docs/Web/CSS/Common_CSS_Questions) + + + +### 平台差异说明 + +暂不支持在nvue页面中使用 + +### 安装方式 + +本组件符合[easycom](https://uniapp.dcloud.io/collocation/pages?id=easycom)规范,`HBuilderX 2.5.5`起,只需将本组件导入项目,在页面`template`中即可直接使用,无需在页面中`import`和注册`componets`。 + +如需通过`npm`方式使用`uni-ui`组件,另见文档:[https://ext.dcloud.net.cn/plugin?id=55](https://ext.dcloud.net.cn/plugin?id=55) + +## API + +### DataPicker Props + +|属性名 | 类型 | 可选值 | 默认值 | 说明| +|:-: | :-: |:-: | :-: | :-: | +|v-model |String/ Number | - | - |绑定数据| +|localdata |Array | | |数据,[详情](https://gitee.com/dcloud/datacom)| +|preload |Boolean | true/false | false |预加载数据| +|step-searh |Boolean | true/false | true |分步查询时,点击节点请求数据| +|step-search-url |String | | |分步查询时,动态加载云端数据url格式,`https://xxx.com/{parentValue}`(当前版本暂不支持,下版支持)| +|self-field |String | | |分步查询时当前字段名称| +|parent-field |String | | |分步查询时父字段名称| +|collection |String | | |表名。支持输入多个表名,用 `,` 分割| +|field |String | | |查询字段,多个字段用 `,` 分割| +|where |String | | |查询条件,内容较多,另见jql文档:[详情](https://uniapp.dcloud.net.cn/uniCloud/uni-clientDB?id=jsquery)| +|orderby |String | | |排序字段及正序倒叙设置| +|popup-title |String | | |弹出层标题| + + +> `collection/where/orderby` 和 `` 的用法一致,[详情](https://uniapp.dcloud.net.cn/uniCloud/unicloud-db) + + + +### DataPicker Events + +|事件称名 | 类型 | 说明 | +|:-: | :-: | :-: | +|@change |EventHandle | 选择完成时触发 {detail: {value}} | +|@nodeclick |EventHandle | 节点被点击时触发 | +|@stepsearch |EventHandle | 动态加载节点数据前触发(当前版本暂不支持,下版支持) | +|@popupopened |EventHandle | 弹出层弹出时触发 | +|@popupclosed |EventHandle | 弹出层关闭时触发 | + + + +### 基本用法 + +#### 云端数据 + +> - 云端数据需要关联服务空间 +> - 下面示例中使用的表 `opendb-city-china`(中国城市省市区数据,含港澳台), 在[uniCloud控制台](https://unicloud.dcloud.net.cn/)使用opendb创建,[详情](https://gitee.com/dcloud/opendb) + + +```html + + + + +``` + + + + + +#### 本地数据 + +```html + + + + +``` + + +#### 自定义solt + +```html + + + {{error}} + + + + {{item.text}} + + + + 请选择 + + +``` + + +> `localdata` 和 `collection` 同时配置时,`localdata` 优先 + + + +#### 完整示例 + +```html + + + + +``` diff --git a/uni_modules/uni-dateformat/changelog.md b/uni_modules/uni-dateformat/changelog.md new file mode 100644 index 0000000..9dee446 --- /dev/null +++ b/uni_modules/uni-dateformat/changelog.md @@ -0,0 +1,3 @@ +## 0.0.3(2021-02-04) +- 调整为uni_modules目录规范 +- 修复 iOS 平台日期格式化出错的问题 diff --git a/uni_modules/uni-dateformat/components/uni-dateformat/date-format.js b/uni_modules/uni-dateformat/components/uni-dateformat/date-format.js new file mode 100644 index 0000000..579aded --- /dev/null +++ b/uni_modules/uni-dateformat/components/uni-dateformat/date-format.js @@ -0,0 +1,197 @@ +// yyyy-MM-dd hh:mm:ss.SSS 所有支持的类型 +function pad(str, length = 2) { + str += '' + while (str.length < length) { + str = '0' + str + } + return str.slice(-length) +} + +const parser = { + yyyy: (dateObj) => { + return pad(dateObj.year, 4) + }, + yy: (dateObj) => { + return pad(dateObj.year) + }, + MM: (dateObj) => { + return pad(dateObj.month) + }, + M: (dateObj) => { + return dateObj.month + }, + dd: (dateObj) => { + return pad(dateObj.day) + }, + d: (dateObj) => { + return dateObj.day + }, + hh: (dateObj) => { + return pad(dateObj.hour) + }, + h: (dateObj) => { + return dateObj.hour + }, + mm: (dateObj) => { + return pad(dateObj.minute) + }, + m: (dateObj) => { + return dateObj.minute + }, + ss: (dateObj) => { + return pad(dateObj.second) + }, + s: (dateObj) => { + return dateObj.second + }, + SSS: (dateObj) => { + return pad(dateObj.millisecond, 3) + }, + S: (dateObj) => { + return dateObj.millisecond + }, +} + +// 这都n年了iOS依然不认识2020-12-12,需要转换为2020/12/12 +function getDate(time) { + if (time instanceof Date) { + return time + } + switch (typeof time) { + case 'string': + { + // 2020-12-12T12:12:12.000Z、2020-12-12T12:12:12.000 + if (time.indexOf('T') > -1) { + return new Date(time) + } + return new Date(time.replace(/-/g, '/')) + } + default: + return new Date(time) + } +} + +export function formatDate(date, format = 'yyyy/MM/dd hh:mm:ss') { + if (!date && date !== 0) { + return '' + } + date = getDate(date) + const dateObj = { + year: date.getFullYear(), + month: date.getMonth() + 1, + day: date.getDate(), + hour: date.getHours(), + minute: date.getMinutes(), + second: date.getSeconds(), + millisecond: date.getMilliseconds() + } + const tokenRegExp = /yyyy|yy|MM|M|dd|d|hh|h|mm|m|ss|s|SSS|SS|S/ + let flag = true + let result = format + while (flag) { + flag = false + result = result.replace(tokenRegExp, function(matched) { + flag = true + return parser[matched](dateObj) + }) + } + return result +} + +export function friendlyDate(time, { + locale = 'zh', + threshold = [60000, 3600000], + format = 'yyyy/MM/dd hh:mm:ss' +}) { + if (!time && time !== 0) { + return '' + } + const localeText = { + zh: { + year: '年', + month: '月', + day: '天', + hour: '小时', + minute: '分钟', + second: '秒', + ago: '前', + later: '后', + justNow: '刚刚', + soon: '马上', + template: '{num}{unit}{suffix}' + }, + en: { + year: 'year', + month: 'month', + day: 'day', + hour: 'hour', + minute: 'minute', + second: 'second', + ago: 'ago', + later: 'later', + justNow: 'just now', + soon: 'soon', + template: '{num} {unit} {suffix}' + } + } + const text = localeText[locale] || localeText.zh + let date = getDate(time) + let ms = date.getTime() - Date.now() + let absMs = Math.abs(ms) + if (absMs < threshold[0]) { + return ms < 0 ? text.justNow : text.soon + } + if (absMs >= threshold[1]) { + return formatDate(date, format) + } + let num + let unit + let suffix = text.later + if (ms < 0) { + suffix = text.ago + ms = -ms + } + const seconds = Math.floor((ms) / 1000) + const minutes = Math.floor(seconds / 60) + const hours = Math.floor(minutes / 60) + const days = Math.floor(hours / 24) + const months = Math.floor(days / 30) + const years = Math.floor(months / 12) + switch (true) { + case years > 0: + num = years + unit = text.year + break + case months > 0: + num = months + unit = text.month + break + case days > 0: + num = days + unit = text.day + break + case hours > 0: + num = hours + unit = text.hour + break + case minutes > 0: + num = minutes + unit = text.minute + break + default: + num = seconds + unit = text.second + break + } + + if (locale === 'en') { + if (num === 1) { + num = 'a' + } else { + unit += 's' + } + } + + return text.template.replace(/{\s*num\s*}/g, num + '').replace(/{\s*unit\s*}/g, unit).replace(/{\s*suffix\s*}/g, + suffix) +} diff --git a/uni_modules/uni-dateformat/components/uni-dateformat/uni-dateformat.vue b/uni_modules/uni-dateformat/components/uni-dateformat/uni-dateformat.vue new file mode 100644 index 0000000..af45205 --- /dev/null +++ b/uni_modules/uni-dateformat/components/uni-dateformat/uni-dateformat.vue @@ -0,0 +1,90 @@ + + + + + diff --git a/uni_modules/uni-dateformat/package.json b/uni_modules/uni-dateformat/package.json new file mode 100644 index 0000000..718062f --- /dev/null +++ b/uni_modules/uni-dateformat/package.json @@ -0,0 +1,83 @@ +{ + "id": "uni-dateformat", + "displayName": "Dateformat 日期格式化", + "version": "0.0.3", + "description": "日期格式化组件,可以将日期格式化为1分钟前、刚刚等形式", + "keywords": [ + "日期格式化", + "时间格式化", + "格式化时间", + "", + "date-format" +], + "repository": "https://github.com/dcloudio/uni-ui", + "engines": { + "HBuilderX": "" + }, + "directories": { + "example": "../../temps/example_temps" + }, + "dcloudext": { + "category": [ + "前端组件", + "通用组件" + ], + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "无", + "permissions": "无" + }, + "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui" + }, + "uni_modules": { + "dependencies": [], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "App": { + "app-vue": "y", + "app-nvue": "y" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y" + }, + "快应用": { + "华为": "y", + "联盟": "y" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uni-dateformat/readme.md b/uni_modules/uni-dateformat/readme.md new file mode 100644 index 0000000..e54f7a8 --- /dev/null +++ b/uni_modules/uni-dateformat/readme.md @@ -0,0 +1,71 @@ + + +### DateFormat 日期格式化 +> 代码块: `uDateformat` + + +日期格式化组件。 + +### 安装方式 + +本组件符合[easycom](https://uniapp.dcloud.io/collocation/pages?id=easycom)规范,`HBuilderX 2.5.5`起,只需将本组件导入项目,在页面`template`中即可直接使用,无需在页面中`import`和注册`components`。 + +如需通过`npm`方式使用`uni-ui`组件,另见文档:[https://ext.dcloud.net.cn/plugin?id=55](https://ext.dcloud.net.cn/plugin?id=55) + +### 基本用法 + +在 ``template`` 中使用组件 + +```html + + + + + +``` + +## API + +### Dateformat Props + +|属性名 |类型 |默认值 |说明 | +|:-: |:-: |:-: |:-: | +|date |Object|String|Number |Date.now() |要格式化的日期对象/日期字符串/时间戳 | +|threshold |Array |[0, 0] |转化类型阈值 | +|format |String |'yyyy/MM/dd hh:mm:ss' |格式字符串 | +|locale |String |zh |格式化使用的语言,目前支持zh(中文)、en(英文) | + + +#### Threshold Options + +格式化组件会对时间进行用户友好转化,threshold就是用来控制转化的时间阈值的。 + +以`[60000, 3600000]`为例,将传入时间与当前时间差的绝对值记为delta(单位毫秒) + +- `delta < 60000`时,时间会被转化为“刚刚|马上” +- `delta >= 60000 && delta < 3600000`时,时间会被转化为“xx分钟前|xx分钟后”,如果超过1小时会显示成“xx小时前|xx小时后”,以此类推 +- `delta >= 3600000`时,会按照format参数传入的格式进行格式化 + +如果不想转化为“马上|刚刚”可以传入`:threshold = "[0,3600000]"`。默认值`[0,0]`既不会转换为“马上|刚刚”也不会转化为“xx分钟前|xx分钟后” + +#### Format Options + +format接收字符以及含义如下: + +|字符 |说明 | +|:-: |:-: | +|yyyy |四位年份 | +|yy |两位年份 | +|MM |两位月份(不足两位在前面补0) | +|M |月份,不自动补0 | +|dd |两位天(不足两位在前面补0) | +|d |天,不自动补0 | +|hh |两位小时(不足两位在前面补0) | +|h |小时,不自动补0 | +|mm |两位分钟(不足两位在前面补0) | +|m |分钟,不自动补0 | +|ss |两位秒(不足两位在前面补0) | +|s |秒,不自动补0 | +|SSS |三位毫秒(不足三位在前面补0) | +|S |毫秒,不自动补0 | + diff --git a/uni_modules/uni-datetime-picker/changelog.md b/uni_modules/uni-datetime-picker/changelog.md new file mode 100644 index 0000000..223a003 --- /dev/null +++ b/uni_modules/uni-datetime-picker/changelog.md @@ -0,0 +1,6 @@ +## 1.0.6(2021-03-18) +- 新增 hide-second 属性,时间支持仅选择时、分 +- 修复 选择跟显示的日期不一样的 bug +- 修复 chang事件触发2次的 bug +- 修复 分、秒 end 范围错误的 bug +- 优化 更好的 nvue 适配 diff --git a/uni_modules/uni-datetime-picker/components/uni-datetime-picker/keypress.js b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/keypress.js new file mode 100644 index 0000000..9601aba --- /dev/null +++ b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/keypress.js @@ -0,0 +1,45 @@ +// #ifdef H5 +export default { + name: 'Keypress', + props: { + disable: { + type: Boolean, + default: false + } + }, + mounted () { + const keyNames = { + esc: ['Esc', 'Escape'], + tab: 'Tab', + enter: 'Enter', + space: [' ', 'Spacebar'], + up: ['Up', 'ArrowUp'], + left: ['Left', 'ArrowLeft'], + right: ['Right', 'ArrowRight'], + down: ['Down', 'ArrowDown'], + delete: ['Backspace', 'Delete', 'Del'] + } + const listener = ($event) => { + if (this.disable) { + return + } + const keyName = Object.keys(keyNames).find(key => { + const keyName = $event.key + const value = keyNames[key] + return value === keyName || (Array.isArray(value) && value.includes(keyName)) + }) + if (keyName) { + // 避免和其他按键事件冲突 + setTimeout(() => { + this.$emit(keyName, {}) + }, 0) + } + } + document.addEventListener('keyup', listener) + this.$once('hook:beforeDestroy', () => { + document.removeEventListener('keyup', listener) + }) + }, + render: () => {} +} +// #endif \ No newline at end of file diff --git a/uni_modules/uni-datetime-picker/components/uni-datetime-picker/uni-datetime-picker.vue b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/uni-datetime-picker.vue new file mode 100644 index 0000000..4a09b4b --- /dev/null +++ b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/uni-datetime-picker.vue @@ -0,0 +1,903 @@ + + + + + diff --git a/uni_modules/uni-datetime-picker/package.json b/uni_modules/uni-datetime-picker/package.json new file mode 100644 index 0000000..40ce95d --- /dev/null +++ b/uni_modules/uni-datetime-picker/package.json @@ -0,0 +1,82 @@ +{ + "id": "uni-datetime-picker", + "displayName": "DatetimePicker 日期选择器", + "version": "1.0.6", + "description": "DatetimePicker 可以同时选择日期和时间的选择器", + "keywords": [ + "DatetimePicker", + "uni-ui", + "日期时间选择器", + "日期时间" +], + "repository": "https://github.com/dcloudio/uni-ui", + "engines": { + "HBuilderX": "" + }, + "directories": { + "example": "../../temps/example_temps" + }, + "dcloudext": { + "category": [ + "前端组件", + "通用组件" + ], + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "无", + "permissions": "无" + }, + "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui" + }, + "uni_modules": { + "dependencies": [], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "App": { + "app-vue": "y", + "app-nvue": "n" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y" + }, + "快应用": { + "华为": "u", + "联盟": "u" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uni-datetime-picker/readme.md b/uni_modules/uni-datetime-picker/readme.md new file mode 100644 index 0000000..f263ca8 --- /dev/null +++ b/uni_modules/uni-datetime-picker/readme.md @@ -0,0 +1,61 @@ + + +## DatetimePicker 时间选择器 +> 代码块: `uDatetimePicker` + + +该组件的优势是,支持**时间戳**输入和输出(起始时间、终止时间也支持时间戳),可**同时选择**日期和时间。 + +若只是需要单独选择日期和时间,不需要时间戳输入和输出,可使用原生的 picker 组件。 + + +___点击 picker 默认值规则:___ + +- 若设置初始值 value, 会显示在 picker 显示框中; 若无初始值 value,则初始值 value 为当前本地时间 Date.now(), 但不会显示在 picker 显示框中 + - 设置了起始时间 start、终止时间 end,并 start < value < end,初始值为 value, 否则初始值为 start + - 只设置了起始时间 start,并 start < value,初始值为 value,否则初始值为 start + - 只设置了终止时间 end,并 value < end,初始值为 value,否则初始值为 end + - 无起始终止时间,则初始值为 value + +### 安装方式 + +本组件符合[easycom](https://uniapp.dcloud.io/collocation/pages?id=easycom)规范,`HBuilderX 2.5.5`起,只需将本组件导入项目,在页面`template`中即可直接使用,无需在页面中`import`和注册`components`。 + +如需通过`npm`方式使用`uni-ui`组件,另见文档:[https://ext.dcloud.net.cn/plugin?id=55](https://ext.dcloud.net.cn/plugin?id=55) + +### 基本用法 + +在 ``template`` 中使用组件 + +```html + + + + + +``` + +## API + +### DatetimePicker Props + +|属性名 |类型 |默认值 |值域 |说明 | +|:-: |:-: |:-: | |:-: | +|type |String |datetime |datetime、date、time |选择器类型 | +|value |String、Number |- |- |输入框当前值 | +|start |String、Number |- |- |最小值,可以使用日期的字符串(String)、时间戳(Number) | +|end |String、Number |- |- |最大值,可以使用日期的字符串(String)、时间戳(Number) | +|return-type|String |timestamp|timestamp 、string |返回值格式 | +|border |Boolean、String|true | |是否有边框 | +|hide-second|Boolean、String|false | |是否隐藏秒 | +|disabled |Boolean、String|false | |是否不可选择 | + + + +注:如 type 为 time 类型,无对应的时间戳,则返回值格式 return-type 无论为何值,都会返回 string + +### DatetimePicker Events + +|事件名称 |说明 |返回值 | +|:-: |:-: |:-: | +|change |确定日期时间时触发的事件,参数为当前选择的 value |- | \ No newline at end of file diff --git a/uni_modules/uni-drawer/changelog.md b/uni_modules/uni-drawer/changelog.md new file mode 100644 index 0000000..bd9ce33 --- /dev/null +++ b/uni_modules/uni-drawer/changelog.md @@ -0,0 +1,2 @@ +## 1.0.6(2021-02-04) +- 调整为uni_modules目录规范 diff --git a/uni_modules/uni-drawer/components/uni-drawer/keypress.js b/uni_modules/uni-drawer/components/uni-drawer/keypress.js new file mode 100644 index 0000000..6ef26a2 --- /dev/null +++ b/uni_modules/uni-drawer/components/uni-drawer/keypress.js @@ -0,0 +1,45 @@ +// #ifdef H5 +export default { + name: 'Keypress', + props: { + disable: { + type: Boolean, + default: false + } + }, + mounted () { + const keyNames = { + esc: ['Esc', 'Escape'], + tab: 'Tab', + enter: 'Enter', + space: [' ', 'Spacebar'], + up: ['Up', 'ArrowUp'], + left: ['Left', 'ArrowLeft'], + right: ['Right', 'ArrowRight'], + down: ['Down', 'ArrowDown'], + delete: ['Backspace', 'Delete', 'Del'] + } + const listener = ($event) => { + if (this.disable) { + return + } + const keyName = Object.keys(keyNames).find(key => { + const keyName = $event.key + const value = keyNames[key] + return value === keyName || (Array.isArray(value) && value.includes(keyName)) + }) + if (keyName) { + // 避免和其他按键事件冲突 + setTimeout(() => { + this.$emit(keyName, {}) + }, 0) + } + } + document.addEventListener('keyup', listener) + this.$once('hook:beforeDestroy', () => { + document.removeEventListener('keyup', listener) + }) + }, + render: () => {} +} +// #endif diff --git a/uni_modules/uni-drawer/components/uni-drawer/uni-drawer.vue b/uni_modules/uni-drawer/components/uni-drawer/uni-drawer.vue new file mode 100644 index 0000000..1081fe5 --- /dev/null +++ b/uni_modules/uni-drawer/components/uni-drawer/uni-drawer.vue @@ -0,0 +1,181 @@ + + + + + diff --git a/uni_modules/uni-drawer/package.json b/uni_modules/uni-drawer/package.json new file mode 100644 index 0000000..c425744 --- /dev/null +++ b/uni_modules/uni-drawer/package.json @@ -0,0 +1,83 @@ +{ + "id": "uni-drawer", + "displayName": "Drawer 抽屉", + "version": "1.0.6", + "description": "抽屉式导航,用于展示侧滑菜单,侧滑导航。", + "keywords": [ + "drawer", + "uni-ui", + "抽屉", + "侧滑导航", + "侧滑" +], + "repository": "https://github.com/dcloudio/uni-ui", + "engines": { + "HBuilderX": "" + }, + "directories": { + "example": "../../temps/example_temps" + }, + "dcloudext": { + "category": [ + "前端组件", + "通用组件" + ], + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "无", + "permissions": "无" + }, + "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui" + }, + "uni_modules": { + "dependencies": [], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "App": { + "app-vue": "y", + "app-nvue": "y" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y" + }, + "快应用": { + "华为": "u", + "联盟": "u" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uni-drawer/readme.md b/uni_modules/uni-drawer/readme.md new file mode 100644 index 0000000..00e2ba4 --- /dev/null +++ b/uni_modules/uni-drawer/readme.md @@ -0,0 +1,59 @@ + + +## Drawer 抽屉 +> 代码块: `uDrawer` + + +抽屉侧滑菜单。 + +> 为了避免错误使用,给大家带来不好的开发体验,请在使用组件前仔细阅读下面的注意事项,可以帮你避免一些错误。 +> - `width` 属性仅在 `vue` 页面生效,`nvue` 页面因性能问题,不支持动态设置宽度,如需修改,请下载组件修改源码 + + +### 安装方式 + +本组件符合[easycom](https://uniapp.dcloud.io/collocation/pages?id=easycom)规范,`HBuilderX 2.5.5`起,只需将本组件导入项目,在页面`template`中即可直接使用,无需在页面中`import`和注册`components`。 + +如需通过`npm`方式使用`uni-ui`组件,另见文档:[https://ext.dcloud.net.cn/plugin?id=55](https://ext.dcloud.net.cn/plugin?id=55) + +### 基本用法 + + +在 ``template`` 中使用组件 + +```html + + + 抽屉式导航 + + +``` + +## API + +### Drawer Props + +|属性名 |类型 |默认值 |说明 | +|:-: |:-: |:-: |:-: | +|mask |Boolean|true |是否显示遮罩 | +|maskClick |Boolean|true |点击遮罩是否可以关闭抽屉 | +|mode |String |left |Drawe滑出位置,可选值:left(从左侧滑出), right(从右侧滑出)| +|width |Number |220 |Drawe 宽度,仅vue页面设置生效 | + + + + +### Drawer Events + +|事件名 |说明 |返回值 | +|:-: |:-: |:-: | +|@change|抽屉状态发生变化触发事件 |true:抽屉已经打开;false:抽屉已经关闭; | + +### Drawer Methods + +|方法称名 |说明 |参数| +|:-: |:-: |:-:| +|open |打开抽屉 |-| +|close |关闭抽屉 |-| + + diff --git a/uni_modules/uni-easyinput/changelog.md b/uni_modules/uni-easyinput/changelog.md new file mode 100644 index 0000000..c6516a8 --- /dev/null +++ b/uni_modules/uni-easyinput/changelog.md @@ -0,0 +1,3 @@ +## 0.0.9(2021-02-05) +- 调整为uni_modules目录规范 +- 优化 兼容 nvue 页面 diff --git a/uni_modules/uni-easyinput/components/uni-easyinput/common.js b/uni_modules/uni-easyinput/components/uni-easyinput/common.js new file mode 100644 index 0000000..df9abe1 --- /dev/null +++ b/uni_modules/uni-easyinput/components/uni-easyinput/common.js @@ -0,0 +1,56 @@ +/** + * @desc 函数防抖 + * @param func 目标函数 + * @param wait 延迟执行毫秒数 + * @param immediate true - 立即执行, false - 延迟执行 + */ +export const debounce = function(func, wait = 1000, immediate = true) { + let timer; + console.log(1); + return function() { + console.log(123); + let context = this, + args = arguments; + if (timer) clearTimeout(timer); + if (immediate) { + let callNow = !timer; + timer = setTimeout(() => { + timer = null; + }, wait); + if (callNow) func.apply(context, args); + } else { + timer = setTimeout(() => { + func.apply(context, args); + }, wait) + } + } +} +/** + * @desc 函数节流 + * @param func 函数 + * @param wait 延迟执行毫秒数 + * @param type 1 使用表时间戳,在时间段开始的时候触发 2 使用表定时器,在时间段结束的时候触发 + */ +export const throttle = (func, wait = 1000, type = 1) => { + let previous = 0; + let timeout; + return function() { + let context = this; + let args = arguments; + if (type === 1) { + let now = Date.now(); + + if (now - previous > wait) { + func.apply(context, args); + previous = now; + } + } else if (type === 2) { + if (!timeout) { + timeout = setTimeout(() => { + timeout = null; + func.apply(context, args) + }, wait) + } + } + } +} diff --git a/uni_modules/uni-easyinput/components/uni-easyinput/uni-easyinput.vue b/uni_modules/uni-easyinput/components/uni-easyinput/uni-easyinput.vue new file mode 100644 index 0000000..ac338bb --- /dev/null +++ b/uni_modules/uni-easyinput/components/uni-easyinput/uni-easyinput.vue @@ -0,0 +1,427 @@ + + + + + diff --git a/uni_modules/uni-easyinput/package.json b/uni_modules/uni-easyinput/package.json new file mode 100644 index 0000000..03d399c --- /dev/null +++ b/uni_modules/uni-easyinput/package.json @@ -0,0 +1,83 @@ +{ + "id": "uni-easyinput", + "displayName": "Easyinput 增强输入框", + "version": "0.0.9", + "description": "Easyinput 组件是对原生input组件的增强", + "keywords": [ + "input", + "uni-easyinput", + "输入框" +], + "repository": "https://github.com/dcloudio/uni-ui", + "engines": { + "HBuilderX": "" + }, + "directories": { + "example": "../../temps/example_temps" + }, + "dcloudext": { + "category": [ + "前端组件", + "通用组件" + ], + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "无", + "permissions": "无" + }, + "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui" + }, + "uni_modules": { + "dependencies": [ + "uni-icons" + ], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "App": { + "app-vue": "y", + "app-nvue": "y" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y" + }, + "快应用": { + "华为": "u", + "联盟": "u" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uni-easyinput/readme.md b/uni_modules/uni-easyinput/readme.md new file mode 100644 index 0000000..945d635 --- /dev/null +++ b/uni_modules/uni-easyinput/readme.md @@ -0,0 +1,192 @@ + + +### Easyinput 增强输入框 +> 代码块: `uEasyinput` + + +easyinput 组件是对原生input组件的增强 ,是专门为配合表单组件[uni-forms](https://ext.dcloud.net.cn/plugin?id=2773)而设计的,easyinput 内置了边框,图标等,同时包含 input 所有功能 + + +> 为了避免错误使用,给大家带来不好的开发体验,请在使用组件前仔细阅读下面的注意事项,可以帮你避免一些错误。 +> - 组件需要依赖 `sass` 插件 ,请自行手动安装 +> - 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 + + +### 平台差异说明 + +暂不支持在nvue页面中使用 + +### 安装方式 + +本组件符合[easycom](https://uniapp.dcloud.io/collocation/pages?id=easycom)规范,`HBuilderX 2.5.5`起,只需将本组件导入项目,在页面`template`中即可直接使用,无需在页面中`import`和注册`components`。 + +如需通过`npm`方式使用`uni-ui`组件,另见文档:[https://ext.dcloud.net.cn/plugin?id=55](https://ext.dcloud.net.cn/plugin?id=55) + +### 基本用法 + +输入内容后,输入框尾部会显示清除按钮,点击可清除内容,如不需要展示图标,`clearable` 属性设置为 `false` 即可 + +`clearable` 属性设置为 `true` ,输入框聚焦且内容不为空时,才会显示内容 + +```html + +``` + + +### 输入框带左右图标 + +设置 `prefixIcon` 属性来显示输入框的头部图标 + +设置 `suffixIcon` 属性来显示输入框的尾部图标 + +注意图标当前只支持 `uni-icons` 内置的图标,当配置 `suffixIcon` 属性后,会覆盖 `:clearable="true"` 和 `type="password"` 时的原有图标 + +绑定 `@iconClick` 事件可以触发图标的点击 ,返回 `prefix` 表示点击左侧图标,返回 `suffix` 表示点击右侧图标 + +```html + + + + + +``` + +### 输入框禁用 + +设置 `disable` 属性可以禁用输入框,此时输入框不可编辑 + +```html + +``` + +### 密码框 + +设置 `type="password"` 时,输入框内容将会不可见,由实心点代替,同时输入框尾部会显示眼睛图标,点击可切换内容显示状态 + +```html + +``` + +### 输入框聚焦 + +设置 `focus` 属性可以使输入框聚焦 + +如果页面存在多个设置 `focus` 属性的输入框,只有最后一个输入框的 `focus` 属性会生效 + +```html + +``` + + +### 多行文本 + +设置 `type="textarea"` 时可输入多行文本 + +```html + +``` + +### 多行文本自动高度 + +设置 `type="textarea"` 时且设置 `autoHeight` 属性,可使用多行文本的自动高度,会跟随内容调整输入框的显示高度 + +```html + +``` + +### 取消边框 + +设置 `:inputBorder="false"` 时可取消输入框的边框显示,同时搭配 `uni-forms` 的 `:border="true"` 有较好的效果 + +```html + + + + + + + + +``` + + +## API + +### Easyinput Props + +|属性名 | 类型 | 可选值 | 默认值 | 说明| +|:-: | :-: |:-: | :-: | :-: | +|value |String/ Number | - | - |输入内容| +|type |String | 见 type Options |text| 输入框的类型(默认text) | +|clearable |Boolean | - |true| 是否显示右侧清空内容的图标控件(输入框有内容,且获得焦点时才显示),点击可清空输入框内容| +|autoHeight |Boolean | - |false| 是否自动增高输入区域,type为textarea时有效| +|placeholder |String | - | - | 输入框的提示文字| +|placeholderStyle |String | - | - | placeholder的样式(内联样式,字符串),如"color: #ddd"| +|focus |Boolean | - |false| 是否自动获得焦点| +|disabled |Boolean | - |false| 是否不可输入| +|maxlength |Number | - |140| 最大输入长度,设置为 -1 的时候不限制最大长度| +|confirmType |String | - |done| 设置键盘右下角按钮的文字,仅在type="text"时生效| +|clearSize |Number | - |15| 清除图标的大小,单位px| +|prefixIcon |String | - | - |输入框头部图标 | +|suffixIcon |String | - | - |输入框尾部图标| +|trim |Boolean/String | 见 trim Options | false | 是否自动去除空格,传入类型为 Boolean 时,自动去除前后空格| +|inputBorder |Boolean | - |false| 是否显示input输入框的边框| +|styles |Object | - | - | 样式自定义| + + +#### Type Options + +|属性名 | 说明 | +|:-: | :-: | +|text |文本输入键盘 | +|textarea |多行文本输入键盘 | +|password |密码输入键盘 | +|number |数字输入键盘,注意iOS上app-vue弹出的数字键盘并非9宫格方式 | +|idcard |身份证输入键盘,仅支持微信、支付宝、百度、QQ小程序 | +|digit |带小数点的数字键盘,仅支持微信、支付宝、百度、头条、QQ小程序 | + +#### ConfirmType Options + +平台差异与 [input](https://uniapp.dcloud.io/component/input) 相同 + +|属性名 | 说明 | +|:-: | :-: | +|send |右下角按钮为“发送” | +|search |右下角按钮为“搜索” | +|next |右下角按钮为“下一个”| +|go |右下角按钮为“前往” | +|done |右下角按钮为“完成” | + + +#### Styles Options + +|属性名 | 默认值 |说明 | +|:-: | :-: | :-: | +|color | #333 | 输入文字颜色 | +|disableColor |#eee | 输入框禁用背景色 | +|borderColor |#e5e5e5 | 边框颜色 | + +#### Trim Options + +传入类型为 `Boolean` 时,自动去除前后空格,传入类型为 `String` 时,可以单独控制,下面是可选值 + +|属性名 |说明 | +|:-: | :-: | +|both | 去除两端空格 | +|left | 去除左侧空格 | +|right | 去除右侧空格 | +|all | 去除所有空格 | +|none | 不去除空格 | + + +### Easyinput Events + +|事件称名 | 说明 |返回值 | +|:-: | :-: |:-: | +|@input |输入框内容发生变化时触发 | - | +|@focus |输入框获得焦点时触发 | - | +|@blur |输入框失去焦点时触发 | - | +|@confirm |点击完成按钮时触发 | - | +|@iconClick |点击图标时触发 | prefix/suffix | + + diff --git a/uni_modules/uni-fab/changelog.md b/uni_modules/uni-fab/changelog.md new file mode 100644 index 0000000..d8e69eb --- /dev/null +++ b/uni_modules/uni-fab/changelog.md @@ -0,0 +1,4 @@ +## 1.0.6(2021-02-05) +- 调整为uni_modules目录规范 +- 优化 按钮背景色调整 +- 优化 兼容pc端 diff --git a/uni_modules/uni-fab/components/uni-fab/uni-fab.vue b/uni_modules/uni-fab/components/uni-fab/uni-fab.vue new file mode 100644 index 0000000..e6fe5a9 --- /dev/null +++ b/uni_modules/uni-fab/components/uni-fab/uni-fab.vue @@ -0,0 +1,447 @@ + + + + + diff --git a/uni_modules/uni-fab/components/uni-fab/uni-fab.vue.bak b/uni_modules/uni-fab/components/uni-fab/uni-fab.vue.bak new file mode 100644 index 0000000..9df4dcd --- /dev/null +++ b/uni_modules/uni-fab/components/uni-fab/uni-fab.vue.bak @@ -0,0 +1,383 @@ + + + + + diff --git a/uni_modules/uni-fab/package.json b/uni_modules/uni-fab/package.json new file mode 100644 index 0000000..4fbe376 --- /dev/null +++ b/uni_modules/uni-fab/package.json @@ -0,0 +1,82 @@ +{ + "id": "uni-fab", + "displayName": "Fab 悬浮按钮", + "version": "1.0.6", + "description": "悬浮按钮 fab button ,点击可展开一个图标按钮菜单。", + "keywords": [ + "按钮", + "悬浮按钮", + "fab", + "uni-fab" +], + "repository": "https://github.com/dcloudio/uni-ui", + "engines": { + "HBuilderX": "" + }, + "directories": { + "example": "../../temps/example_temps" + }, + "dcloudext": { + "category": [ + "前端组件", + "通用组件" + ], + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "无", + "permissions": "无" + }, + "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui" + }, + "uni_modules": { + "dependencies": [], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "App": { + "app-vue": "y", + "app-nvue": "y" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y" + }, + "快应用": { + "华为": "u", + "联盟": "u" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uni-fab/readme.md b/uni_modules/uni-fab/readme.md new file mode 100644 index 0000000..725f67a --- /dev/null +++ b/uni_modules/uni-fab/readme.md @@ -0,0 +1,84 @@ + + +## Fab 悬浮按钮 +> 代码块: `uFab` + + +点击可展开一个图形按钮菜单 + +### 安装方式 + +本组件符合[easycom](https://uniapp.dcloud.io/collocation/pages?id=easycom)规范,`HBuilderX 2.5.5`起,只需将本组件导入项目,在页面`template`中即可直接使用,无需在页面中`import`和注册`components`。 + +如需通过`npm`方式使用`uni-ui`组件,另见文档:[https://ext.dcloud.net.cn/plugin?id=55](https://ext.dcloud.net.cn/plugin?id=55) + +> 为了避免错误使用,给大家带来不好的开发体验,请在使用组件前仔细阅读下面的注意事项,可以帮你避免一些错误。 +> - 不建议动态修改属性,可能会耗损部分性能。 +> - 展开菜单暂不支持字体图标,使用图片路径时建议使用绝对路径,相对路径可能会有问题。 +> - 选中状态要通过自己控制,如果不希望有选中状态,不处理 `active` 即可。 +> - 展开菜单建议最多显示四个,如果过多对于小屏手机可能会超出屏幕。 + + +### 基本用法 + +在 `template` 中使用组件 + +```html + +``` + + +## API + +### Fab Props + +| 属性名 | 类型 | 默认值 | 说明 | +| :-: | :-: | :-: | :-: | +| pattern | Object | - | 可选样式配置项 | +| horizontal| String | 'left' | 水平对齐方式。`left`:左对齐,`right`:右对齐 | +| vertical | String | 'bottom' | 垂直对齐方式。`bottom`:下对齐,`top`:上对齐 | +| direction | String | 'horizontal' | 展开菜单显示方式。`horizontal`:水平显示,`vertical`:垂直显示 | +| popMenu | Boolean | true | 是否使用弹出菜单 | +| content | Array | - | 展开菜单内容配置项 | + + + +**pattern配置项:** + +| 参数 | 类型 | 默认值 | 说明 | +| :-: | :-: | :-: | :-: | +| color | String | #3c3e49 | 文字默认颜色 | +| selectedColor | String | #007AFF | 文字选中时的颜色 | +| backgroundColor | String | #ffffff | 背景色 | +| buttonColor | String | #3c3e49 | 按钮背景色 | + +**content配置项:** + +| 参数 | 类型 | 说明 | +| :-: | :-: | :-: | :-: | +| iconPath | String | 图片路径 | +| selectedIconPath | String | 选中后图片路径| +| text | String | 文字 | +| active | Boolean | 是否选中当前 | + +### Fab Events + +| 参数 | 类型 | 说明 | +| :-: | :-: | :-: | +| @trigger | Function | 展开菜单点击事件,返回点击信息| +| @fabClick | Function | 悬浮按钮点击事件 | + + + + diff --git a/uni_modules/uni-fav/changelog.md b/uni_modules/uni-fav/changelog.md new file mode 100644 index 0000000..33e5d90 --- /dev/null +++ b/uni_modules/uni-fav/changelog.md @@ -0,0 +1,6 @@ +## 1.0.4(2021-02-05) +- 优化 组件引用关系,通过uni_modules引用组件 +## 1.0.3(2021-02-05) +- 优化 组件引用关系,通过uni_modules引用组件 +## 1.0.2(2021-02-05) +- 调整为uni_modules目录规范 diff --git a/uni_modules/uni-fav/components/uni-fav/uni-fav.vue b/uni_modules/uni-fav/components/uni-fav/uni-fav.vue new file mode 100644 index 0000000..42144b5 --- /dev/null +++ b/uni_modules/uni-fav/components/uni-fav/uni-fav.vue @@ -0,0 +1,139 @@ + + + + + diff --git a/uni_modules/uni-fav/package.json b/uni_modules/uni-fav/package.json new file mode 100644 index 0000000..11e28e3 --- /dev/null +++ b/uni_modules/uni-fav/package.json @@ -0,0 +1,81 @@ +{ + "id": "uni-fav", + "displayName": "Fav 收藏按钮", + "version": "1.0.4", + "description": " Fav 收藏组件,可自定义颜色、大小。", + "keywords": [ + "fav", + "uni-ui", + "收藏" +], + "repository": "https://github.com/dcloudio/uni-ui", + "engines": { + "HBuilderX": "" + }, + "directories": { + "example": "../../temps/example_temps" + }, + "dcloudext": { + "category": [ + "前端组件", + "通用组件" + ], + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "无", + "permissions": "无" + }, + "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui" + }, + "uni_modules": { + "dependencies": [], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "App": { + "app-vue": "y", + "app-nvue": "y" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y" + }, + "快应用": { + "华为": "u", + "联盟": "u" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uni-fav/readme.md b/uni_modules/uni-fav/readme.md new file mode 100644 index 0000000..d4a7009 --- /dev/null +++ b/uni_modules/uni-fav/readme.md @@ -0,0 +1,44 @@ + + +## Fav 收藏按钮 +> 代码块: `uFav` + + +用于收藏功能,可点击切换选中、不选中的状态。 + +### 安装方式 + +本组件符合[easycom](https://uniapp.dcloud.io/collocation/pages?id=easycom)规范,`HBuilderX 2.5.5`起,只需将本组件导入项目,在页面`template`中即可直接使用,无需在页面中`import`和注册`components`。 + +如需通过`npm`方式使用`uni-ui`组件,另见文档:[https://ext.dcloud.net.cn/plugin?id=55](https://ext.dcloud.net.cn/plugin?id=55) + +### 基本用法 + +在 ``template`` 中使用组件 + +```html + + +``` + +## API + +### Fav Props + +|属性名 |类型 |默认值 |说明 | +|:-: |:-: |:-: |:-: | +|star |Boolean|true |按钮是否带星星 | +|bgColor |String |#eeeeee |未收藏时的背景色 | +|bgColorChecked |String |#007aff |已收藏时的背景色 | +|fgColor |String |#666666 |未收藏时的文字颜色 | +|fgColorChecked |String |#FFFFFF |已收藏时的文字颜色 | +|circle |Boolean|false |是否为圆角 | +|checked |Boolean|false |是否为已收藏 | +|contentText |Object |```{contentDefault: '收藏',contentFav: '已收藏'}```|收藏按钮文字 | + + +### Fav Events + +|事件称名 |说明 |返回值 | +|:-: |:-: |:-: | +|click |点击 fav按钮 触发事件 |- | diff --git a/uni_modules/uni-field/changelog.md b/uni_modules/uni-field/changelog.md new file mode 100644 index 0000000..e69de29 diff --git a/uni_modules/uni-field/components/uni-field/uni-field.vue b/uni_modules/uni-field/components/uni-field/uni-field.vue new file mode 100644 index 0000000..e55d8ce --- /dev/null +++ b/uni_modules/uni-field/components/uni-field/uni-field.vue @@ -0,0 +1,712 @@ +

ktwV#^Nt;nn@R<0; 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%0AcRv)S-(`uI$)#QV}bv@`Z^Dm2wCC5 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�QBW?J@a7T^&6Ir$r=46s*2TWE~WZ2-{-}_0^ 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 z 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