From 0bbb3d0a478d45b3f0db0f4de20b104c548016a9 Mon Sep 17 00:00:00 2001 From: admin Date: Tue, 9 Dec 2025 02:45:30 +0800 Subject: [PATCH] Initial commit --- .gitignore | 7 + README.md | 175 +++ admin/.gitattributes | 1 + admin/.gitignore | 8 + admin/LICENSE | 21 + admin/README.md | 153 +++ admin/client/.editorconfig | 14 + admin/client/.env.development | 14 + admin/client/.env.production | 6 + admin/client/.env.staging | 8 + admin/client/.eslintignore | 4 + admin/client/.eslintrc.js | 198 ++++ admin/client/.gitignore | 16 + admin/client/.travis.yml | 5 + admin/client/Dockerfile | 6 + admin/client/Dockerfile_dev | 7 + admin/client/LICENSE | 21 + admin/client/README-zh.md | 98 ++ admin/client/README.md | 91 ++ admin/client/babel.config.js | 5 + admin/client/build/index.js | 35 + admin/client/jest.config.js | 24 + admin/client/jsconfig.json | 9 + admin/client/mock/index.js | 67 ++ admin/client/mock/mock-server.js | 68 ++ admin/client/mock/table.js | 29 + admin/client/mock/user.js | 84 ++ admin/client/package.json | 72 ++ admin/client/postcss.config.js | 8 + admin/client/public/favicon.ico | Bin 0 -> 67646 bytes admin/client/public/index.html | 17 + admin/client/src/App.vue | 11 + admin/client/src/api/crm.js | 330 ++++++ admin/client/src/api/dict.js | 57 + admin/client/src/api/file.js | 18 + admin/client/src/api/moritor.js | 26 + admin/client/src/api/org.js | 35 + admin/client/src/api/perm.js | 28 + admin/client/src/api/position.js | 31 + admin/client/src/api/role.js | 38 + admin/client/src/api/table.js | 9 + admin/client/src/api/task.js | 45 + admin/client/src/api/user.js | 70 ++ admin/client/src/api/workflow.js | 258 +++++ admin/client/src/assets/404_images/404.png | Bin 0 -> 98071 bytes .../src/assets/404_images/404_cloud.png | Bin 0 -> 4766 bytes .../src/components/Breadcrumb/index.vue | 78 ++ .../client/src/components/Hamburger/index.vue | 44 + .../src/components/Pagination/index.vue | 101 ++ admin/client/src/components/SvgIcon/index.vue | 62 + .../client/src/directive/el-table/adaptive.js | 42 + admin/client/src/directive/el-table/index.js | 13 + admin/client/src/icons/index.js | 9 + admin/client/src/icons/svg/404.svg | 1 + admin/client/src/icons/svg/bug.svg | 1 + admin/client/src/icons/svg/chart.svg | 1 + admin/client/src/icons/svg/clipboard.svg | 1 + admin/client/src/icons/svg/component.svg | 1 + admin/client/src/icons/svg/dashboard.svg | 1 + admin/client/src/icons/svg/documentation.svg | 1 + admin/client/src/icons/svg/drag.svg | 1 + admin/client/src/icons/svg/edit.svg | 1 + admin/client/src/icons/svg/education.svg | 1 + admin/client/src/icons/svg/email.svg | 1 + admin/client/src/icons/svg/example.svg | 1 + admin/client/src/icons/svg/excel.svg | 1 + .../client/src/icons/svg/exit-fullscreen.svg | 1 + admin/client/src/icons/svg/eye-open.svg | 1 + admin/client/src/icons/svg/eye.svg | 1 + admin/client/src/icons/svg/form.svg | 1 + admin/client/src/icons/svg/fullscreen.svg | 1 + admin/client/src/icons/svg/guide.svg | 1 + admin/client/src/icons/svg/icon.svg | 1 + admin/client/src/icons/svg/international.svg | 1 + admin/client/src/icons/svg/language.svg | 1 + admin/client/src/icons/svg/link.svg | 1 + admin/client/src/icons/svg/list.svg | 1 + admin/client/src/icons/svg/lock.svg | 1 + admin/client/src/icons/svg/message.svg | 1 + admin/client/src/icons/svg/money.svg | 1 + admin/client/src/icons/svg/nested.svg | 1 + admin/client/src/icons/svg/password.svg | 1 + admin/client/src/icons/svg/pdf.svg | 1 + admin/client/src/icons/svg/people.svg | 1 + admin/client/src/icons/svg/peoples.svg | 1 + admin/client/src/icons/svg/position.svg | 1 + admin/client/src/icons/svg/qq.svg | 1 + admin/client/src/icons/svg/search.svg | 1 + admin/client/src/icons/svg/shopping.svg | 1 + admin/client/src/icons/svg/size.svg | 1 + admin/client/src/icons/svg/skill.svg | 1 + admin/client/src/icons/svg/star.svg | 1 + admin/client/src/icons/svg/tab.svg | 1 + admin/client/src/icons/svg/table.svg | 1 + admin/client/src/icons/svg/theme.svg | 1 + admin/client/src/icons/svg/tree-table.svg | 1 + admin/client/src/icons/svg/tree.svg | 1 + admin/client/src/icons/svg/user.svg | 1 + admin/client/src/icons/svg/wechat.svg | 1 + admin/client/src/icons/svg/zip.svg | 1 + admin/client/src/icons/svgo.yml | 22 + .../client/src/layout/components/AppMain.vue | 40 + admin/client/src/layout/components/Navbar.vue | 148 +++ .../layout/components/Sidebar/FixiOSBug.js | 26 + .../src/layout/components/Sidebar/Item.vue | 29 + .../src/layout/components/Sidebar/Link.vue | 36 + .../src/layout/components/Sidebar/Logo.vue | 82 ++ .../layout/components/Sidebar/SidebarItem.vue | 95 ++ .../src/layout/components/Sidebar/index.vue | 54 + admin/client/src/layout/components/index.js | 3 + admin/client/src/layout/index.vue | 93 ++ .../client/src/layout/mixin/ResizeHandler.js | 45 + admin/client/src/main.js | 44 + admin/client/src/permission.js | 73 ++ admin/client/src/router/index.js | 267 +++++ admin/client/src/settings.js | 16 + admin/client/src/store/getters.js | 10 + admin/client/src/store/index.js | 21 + admin/client/src/store/modules/app.js | 48 + admin/client/src/store/modules/permission.js | 68 ++ admin/client/src/store/modules/settings.js | 31 + admin/client/src/store/modules/user.js | 108 ++ admin/client/src/styles/element-ui.scss | 49 + admin/client/src/styles/index.scss | 125 ++ admin/client/src/styles/mixin.scss | 28 + admin/client/src/styles/sidebar.scss | 209 ++++ admin/client/src/styles/transition.scss | 48 + admin/client/src/styles/variables.scss | 25 + admin/client/src/utils/auth.js | 25 + admin/client/src/utils/get-page-title.js | 10 + admin/client/src/utils/index.js | 384 +++++++ admin/client/src/utils/permission.js | 27 + admin/client/src/utils/request.js | 88 ++ admin/client/src/utils/scroll-to.js | 58 + admin/client/src/utils/validate.js | 20 + admin/client/src/vendor/Export2Excel.js | 220 ++++ admin/client/src/vendor/Export2Zip.js | 24 + admin/client/src/views/404.vue | 228 ++++ admin/client/src/views/crm/activity.vue | 260 +++++ admin/client/src/views/crm/banner.vue | 238 ++++ admin/client/src/views/crm/category.vue | 174 +++ admin/client/src/views/crm/coupon.vue | 297 +++++ admin/client/src/views/crm/exam.vue | 223 ++++ admin/client/src/views/crm/honor.vue | 213 ++++ admin/client/src/views/crm/project.vue | 357 ++++++ admin/client/src/views/crm/showcase.vue | 221 ++++ admin/client/src/views/crm/student.vue | 277 +++++ admin/client/src/views/dashboard/index.vue | 32 + admin/client/src/views/form/index.vue | 85 ++ admin/client/src/views/login/index.vue | 237 ++++ admin/client/src/views/monitor/service.vue | 177 +++ admin/client/src/views/nested/menu1/index.vue | 7 + .../src/views/nested/menu1/menu1-1/index.vue | 7 + .../src/views/nested/menu1/menu1-2/index.vue | 7 + .../nested/menu1/menu1-2/menu1-2-1/index.vue | 5 + .../nested/menu1/menu1-2/menu1-2-2/index.vue | 5 + .../src/views/nested/menu1/menu1-3/index.vue | 5 + admin/client/src/views/nested/menu2/index.vue | 5 + .../src/views/system/changepassword.vue | 78 ++ admin/client/src/views/system/dict.vue | 370 ++++++ admin/client/src/views/system/file.vue | 134 +++ .../client/src/views/system/organization.vue | 225 ++++ admin/client/src/views/system/perm.vue | 239 ++++ admin/client/src/views/system/position.vue | 211 ++++ admin/client/src/views/system/role.vue | 301 +++++ admin/client/src/views/system/task.vue | 410 +++++++ admin/client/src/views/system/user.vue | 378 ++++++ admin/client/src/views/table/index.vue | 79 ++ admin/client/src/views/tree/index.vue | 78 ++ .../src/views/workflow/configuration.vue | 52 + .../client/src/views/workflow/customfield.vue | 447 ++++++++ admin/client/src/views/workflow/index.vue | 515 +++++++++ admin/client/src/views/workflow/state.vue | 487 ++++++++ admin/client/src/views/workflow/test.vue | 133 +++ admin/client/src/views/workflow/ticket.vue | 1020 +++++++++++++++++ .../src/views/workflow/ticketDetail.vue | 563 +++++++++ .../src/views/workflow/ticketHandle.vue | 816 +++++++++++++ .../client/src/views/workflow/transitions.vue | 267 +++++ .../src/views/workflow/workFlowTickets.vue | 197 ++++ admin/client/tests/unit/.eslintrc.js | 5 + .../tests/unit/components/Breadcrumb.spec.js | 98 ++ .../tests/unit/components/Hamburger.spec.js | 18 + .../tests/unit/components/SvgIcon.spec.js | 22 + .../tests/unit/utils/formatTime.spec.js | 30 + .../client/tests/unit/utils/parseTime.spec.js | 28 + .../client/tests/unit/utils/validate.spec.js | 17 + admin/client/vue.config.js | 128 +++ admin/docker-compose.yml | 25 + admin/img/dict.png | Bin 0 -> 40884 bytes admin/img/docs.png | Bin 0 -> 72543 bytes admin/img/task.png | Bin 0 -> 64666 bytes admin/img/ticket.png | Bin 0 -> 587323 bytes admin/img/user.png | Bin 0 -> 49852 bytes admin/server/.gitignore | 15 + admin/server/Dockerfile | 10 + admin/server/apps/crm/__init__.py | 0 admin/server/apps/crm/admin.py | 94 ++ admin/server/apps/crm/apps.py | 6 + admin/server/apps/crm/management/__init__.py | 0 .../apps/crm/management/commands/__init__.py | 0 .../crm/management/commands/init_crm_data.py | 104 ++ .../apps/crm/migrations/0001_initial.py | 99 ++ .../crm/migrations/0002_project_detail.py | 18 + .../crm/migrations/0003_banner_project.py | 19 + .../crm/migrations/0004_auto_20251128_1719.py | 40 + ...vity_exam_activityregistration_and_more.py | 140 +++ admin/server/apps/crm/migrations/__init__.py | 0 admin/server/apps/crm/models.py | 246 ++++ admin/server/apps/crm/serializers.py | 110 ++ admin/server/apps/crm/tests.py | 3 + admin/server/apps/crm/urls.py | 29 + admin/server/apps/crm/views.py | 172 +++ admin/server/apps/monitor/__init__.py | 0 admin/server/apps/monitor/admin.py | 3 + admin/server/apps/monitor/apps.py | 6 + admin/server/apps/monitor/middleware.py | 1 + .../apps/monitor/migrations/__init__.py | 0 admin/server/apps/monitor/models.py | 3 + admin/server/apps/monitor/tests.py | 3 + admin/server/apps/monitor/urls.py | 10 + admin/server/apps/monitor/views.py | 93 ++ admin/server/apps/system/__init__.py | 1 + admin/server/apps/system/admin.py | 11 + admin/server/apps/system/apps.py | 9 + admin/server/apps/system/authentication.py | 23 + admin/server/apps/system/filters.py | 11 + .../apps/system/migrations/0001_initial.py | 239 ++++ .../migrations/0002_auto_20210718_0918.py | 23 + .../migrations/0003_auto_20220227_1732.py | 18 + .../migrations/0004_auto_20251128_1413.py | 58 + ...t_options_alter_file_create_by_and_more.py | 34 + .../server/apps/system/migrations/__init__.py | 0 admin/server/apps/system/mixins.py | 48 + admin/server/apps/system/models.py | 218 ++++ admin/server/apps/system/permission.py | 97 ++ admin/server/apps/system/permission_data.py | 98 ++ admin/server/apps/system/serializers.py | 187 +++ admin/server/apps/system/signals.py | 12 + admin/server/apps/system/tasks.py | 9 + admin/server/apps/system/tests.py | 3 + admin/server/apps/system/urls.py | 19 + admin/server/apps/system/views.py | 355 ++++++ admin/server/apps/wf/__init__.py | 0 admin/server/apps/wf/admin.py | 3 + admin/server/apps/wf/apps.py | 7 + admin/server/apps/wf/filters.py | 26 + .../server/apps/wf/migrations/0001_initial.py | 177 +++ admin/server/apps/wf/migrations/__init__.py | 0 admin/server/apps/wf/models.py | 237 ++++ admin/server/apps/wf/scripts.py | 56 + admin/server/apps/wf/serializers.py | 193 ++++ admin/server/apps/wf/services.py | 353 ++++++ admin/server/apps/wf/tests.py | 3 + admin/server/apps/wf/urls.py | 18 + admin/server/apps/wf/views.py | 373 ++++++ admin/server/db.json | 498 ++++++++ admin/server/log/.gitignore | 2 + admin/server/manage.py | 21 + admin/server/media/default/avatar.png | Bin 0 -> 22934 bytes admin/server/requirements.txt | 12 + admin/server/server/__init__.py | 5 + admin/server/server/asgi.py | 16 + admin/server/server/celery.py | 22 + admin/server/server/conf_e.py | 15 + admin/server/server/settings.py | 315 +++++ admin/server/server/urls.py | 66 ++ admin/server/server/wsgi.py | 16 + admin/server/start.sh | 10 + admin/server/utils/__init__.py | 0 admin/server/utils/model.py | 87 ++ admin/server/utils/pagination.py | 23 + admin/server/utils/queryset.py | 70 ++ admin/server/utils/response.py | 63 + admin/server/utils/serializer.py | 39 + admin/server/utils/test.py | 4 + admin/server/utils/view.py | 51 + admin/server/utils/workflow.py | 36 + admin/specification.md | 53 + create_repo.py | 145 +++ db.sqlite3 | Bin 0 -> 520192 bytes wechat-mini-program/app.js | 11 + wechat-mini-program/app.json | 41 + wechat-mini-program/app.wxss | 10 + wechat-mini-program/config/env.js | 11 + wechat-mini-program/pages/coupon/coupon.js | 76 ++ wechat-mini-program/pages/coupon/coupon.json | 3 + wechat-mini-program/pages/coupon/coupon.wxml | 38 + wechat-mini-program/pages/coupon/coupon.wxss | 110 ++ wechat-mini-program/pages/detail/detail.js | 69 ++ wechat-mini-program/pages/detail/detail.json | 5 + wechat-mini-program/pages/detail/detail.wxml | 59 + wechat-mini-program/pages/detail/detail.wxss | 139 +++ wechat-mini-program/pages/index/index.js | 78 ++ wechat-mini-program/pages/index/index.json | 6 + wechat-mini-program/pages/index/index.wxml | 65 ++ wechat-mini-program/pages/index/index.wxss | 224 ++++ wechat-mini-program/pages/profile/profile.js | 58 + .../pages/profile/profile.json | 3 + .../pages/profile/profile.wxml | 71 ++ .../pages/profile/profile.wxss | 112 ++ wechat-mini-program/project.config.json | 61 + .../project.private.config.json | 24 + wechat-mini-program/utils/request.js | 25 + 303 files changed, 22764 insertions(+) create mode 100644 .gitignore create mode 100644 README.md create mode 100644 admin/.gitattributes create mode 100644 admin/.gitignore create mode 100644 admin/LICENSE create mode 100644 admin/README.md create mode 100644 admin/client/.editorconfig create mode 100644 admin/client/.env.development create mode 100644 admin/client/.env.production create mode 100644 admin/client/.env.staging create mode 100644 admin/client/.eslintignore create mode 100644 admin/client/.eslintrc.js create mode 100644 admin/client/.gitignore create mode 100644 admin/client/.travis.yml create mode 100644 admin/client/Dockerfile create mode 100644 admin/client/Dockerfile_dev create mode 100644 admin/client/LICENSE create mode 100644 admin/client/README-zh.md create mode 100644 admin/client/README.md create mode 100644 admin/client/babel.config.js create mode 100644 admin/client/build/index.js create mode 100644 admin/client/jest.config.js create mode 100644 admin/client/jsconfig.json create mode 100644 admin/client/mock/index.js create mode 100644 admin/client/mock/mock-server.js create mode 100644 admin/client/mock/table.js create mode 100644 admin/client/mock/user.js create mode 100644 admin/client/package.json create mode 100644 admin/client/postcss.config.js create mode 100644 admin/client/public/favicon.ico create mode 100644 admin/client/public/index.html create mode 100644 admin/client/src/App.vue create mode 100644 admin/client/src/api/crm.js create mode 100644 admin/client/src/api/dict.js create mode 100644 admin/client/src/api/file.js create mode 100644 admin/client/src/api/moritor.js create mode 100644 admin/client/src/api/org.js create mode 100644 admin/client/src/api/perm.js create mode 100644 admin/client/src/api/position.js create mode 100644 admin/client/src/api/role.js create mode 100644 admin/client/src/api/table.js create mode 100644 admin/client/src/api/task.js create mode 100644 admin/client/src/api/user.js create mode 100644 admin/client/src/api/workflow.js create mode 100644 admin/client/src/assets/404_images/404.png create mode 100644 admin/client/src/assets/404_images/404_cloud.png create mode 100644 admin/client/src/components/Breadcrumb/index.vue create mode 100644 admin/client/src/components/Hamburger/index.vue create mode 100644 admin/client/src/components/Pagination/index.vue create mode 100644 admin/client/src/components/SvgIcon/index.vue create mode 100644 admin/client/src/directive/el-table/adaptive.js create mode 100644 admin/client/src/directive/el-table/index.js create mode 100644 admin/client/src/icons/index.js create mode 100644 admin/client/src/icons/svg/404.svg create mode 100644 admin/client/src/icons/svg/bug.svg create mode 100644 admin/client/src/icons/svg/chart.svg create mode 100644 admin/client/src/icons/svg/clipboard.svg create mode 100644 admin/client/src/icons/svg/component.svg create mode 100644 admin/client/src/icons/svg/dashboard.svg create mode 100644 admin/client/src/icons/svg/documentation.svg create mode 100644 admin/client/src/icons/svg/drag.svg create mode 100644 admin/client/src/icons/svg/edit.svg create mode 100644 admin/client/src/icons/svg/education.svg create mode 100644 admin/client/src/icons/svg/email.svg create mode 100644 admin/client/src/icons/svg/example.svg create mode 100644 admin/client/src/icons/svg/excel.svg create mode 100644 admin/client/src/icons/svg/exit-fullscreen.svg create mode 100644 admin/client/src/icons/svg/eye-open.svg create mode 100644 admin/client/src/icons/svg/eye.svg create mode 100644 admin/client/src/icons/svg/form.svg create mode 100644 admin/client/src/icons/svg/fullscreen.svg create mode 100644 admin/client/src/icons/svg/guide.svg create mode 100644 admin/client/src/icons/svg/icon.svg create mode 100644 admin/client/src/icons/svg/international.svg create mode 100644 admin/client/src/icons/svg/language.svg create mode 100644 admin/client/src/icons/svg/link.svg create mode 100644 admin/client/src/icons/svg/list.svg create mode 100644 admin/client/src/icons/svg/lock.svg create mode 100644 admin/client/src/icons/svg/message.svg create mode 100644 admin/client/src/icons/svg/money.svg create mode 100644 admin/client/src/icons/svg/nested.svg create mode 100644 admin/client/src/icons/svg/password.svg create mode 100644 admin/client/src/icons/svg/pdf.svg create mode 100644 admin/client/src/icons/svg/people.svg create mode 100644 admin/client/src/icons/svg/peoples.svg create mode 100644 admin/client/src/icons/svg/position.svg create mode 100644 admin/client/src/icons/svg/qq.svg create mode 100644 admin/client/src/icons/svg/search.svg create mode 100644 admin/client/src/icons/svg/shopping.svg create mode 100644 admin/client/src/icons/svg/size.svg create mode 100644 admin/client/src/icons/svg/skill.svg create mode 100644 admin/client/src/icons/svg/star.svg create mode 100644 admin/client/src/icons/svg/tab.svg create mode 100644 admin/client/src/icons/svg/table.svg create mode 100644 admin/client/src/icons/svg/theme.svg create mode 100644 admin/client/src/icons/svg/tree-table.svg create mode 100644 admin/client/src/icons/svg/tree.svg create mode 100644 admin/client/src/icons/svg/user.svg create mode 100644 admin/client/src/icons/svg/wechat.svg create mode 100644 admin/client/src/icons/svg/zip.svg create mode 100644 admin/client/src/icons/svgo.yml create mode 100644 admin/client/src/layout/components/AppMain.vue create mode 100644 admin/client/src/layout/components/Navbar.vue create mode 100644 admin/client/src/layout/components/Sidebar/FixiOSBug.js create mode 100644 admin/client/src/layout/components/Sidebar/Item.vue create mode 100644 admin/client/src/layout/components/Sidebar/Link.vue create mode 100644 admin/client/src/layout/components/Sidebar/Logo.vue create mode 100644 admin/client/src/layout/components/Sidebar/SidebarItem.vue create mode 100644 admin/client/src/layout/components/Sidebar/index.vue create mode 100644 admin/client/src/layout/components/index.js create mode 100644 admin/client/src/layout/index.vue create mode 100644 admin/client/src/layout/mixin/ResizeHandler.js create mode 100644 admin/client/src/main.js create mode 100644 admin/client/src/permission.js create mode 100644 admin/client/src/router/index.js create mode 100644 admin/client/src/settings.js create mode 100644 admin/client/src/store/getters.js create mode 100644 admin/client/src/store/index.js create mode 100644 admin/client/src/store/modules/app.js create mode 100644 admin/client/src/store/modules/permission.js create mode 100644 admin/client/src/store/modules/settings.js create mode 100644 admin/client/src/store/modules/user.js create mode 100644 admin/client/src/styles/element-ui.scss create mode 100644 admin/client/src/styles/index.scss create mode 100644 admin/client/src/styles/mixin.scss create mode 100644 admin/client/src/styles/sidebar.scss create mode 100644 admin/client/src/styles/transition.scss create mode 100644 admin/client/src/styles/variables.scss create mode 100644 admin/client/src/utils/auth.js create mode 100644 admin/client/src/utils/get-page-title.js create mode 100644 admin/client/src/utils/index.js create mode 100644 admin/client/src/utils/permission.js create mode 100644 admin/client/src/utils/request.js create mode 100644 admin/client/src/utils/scroll-to.js create mode 100644 admin/client/src/utils/validate.js create mode 100644 admin/client/src/vendor/Export2Excel.js create mode 100644 admin/client/src/vendor/Export2Zip.js create mode 100644 admin/client/src/views/404.vue create mode 100644 admin/client/src/views/crm/activity.vue create mode 100644 admin/client/src/views/crm/banner.vue create mode 100644 admin/client/src/views/crm/category.vue create mode 100644 admin/client/src/views/crm/coupon.vue create mode 100644 admin/client/src/views/crm/exam.vue create mode 100644 admin/client/src/views/crm/honor.vue create mode 100644 admin/client/src/views/crm/project.vue create mode 100644 admin/client/src/views/crm/showcase.vue create mode 100644 admin/client/src/views/crm/student.vue create mode 100644 admin/client/src/views/dashboard/index.vue create mode 100644 admin/client/src/views/form/index.vue create mode 100644 admin/client/src/views/login/index.vue create mode 100644 admin/client/src/views/monitor/service.vue create mode 100644 admin/client/src/views/nested/menu1/index.vue create mode 100644 admin/client/src/views/nested/menu1/menu1-1/index.vue create mode 100644 admin/client/src/views/nested/menu1/menu1-2/index.vue create mode 100644 admin/client/src/views/nested/menu1/menu1-2/menu1-2-1/index.vue create mode 100644 admin/client/src/views/nested/menu1/menu1-2/menu1-2-2/index.vue create mode 100644 admin/client/src/views/nested/menu1/menu1-3/index.vue create mode 100644 admin/client/src/views/nested/menu2/index.vue create mode 100644 admin/client/src/views/system/changepassword.vue create mode 100644 admin/client/src/views/system/dict.vue create mode 100644 admin/client/src/views/system/file.vue create mode 100644 admin/client/src/views/system/organization.vue create mode 100644 admin/client/src/views/system/perm.vue create mode 100644 admin/client/src/views/system/position.vue create mode 100644 admin/client/src/views/system/role.vue create mode 100644 admin/client/src/views/system/task.vue create mode 100644 admin/client/src/views/system/user.vue create mode 100644 admin/client/src/views/table/index.vue create mode 100644 admin/client/src/views/tree/index.vue create mode 100644 admin/client/src/views/workflow/configuration.vue create mode 100644 admin/client/src/views/workflow/customfield.vue create mode 100644 admin/client/src/views/workflow/index.vue create mode 100644 admin/client/src/views/workflow/state.vue create mode 100644 admin/client/src/views/workflow/test.vue create mode 100644 admin/client/src/views/workflow/ticket.vue create mode 100644 admin/client/src/views/workflow/ticketDetail.vue create mode 100644 admin/client/src/views/workflow/ticketHandle.vue create mode 100644 admin/client/src/views/workflow/transitions.vue create mode 100644 admin/client/src/views/workflow/workFlowTickets.vue create mode 100644 admin/client/tests/unit/.eslintrc.js create mode 100644 admin/client/tests/unit/components/Breadcrumb.spec.js create mode 100644 admin/client/tests/unit/components/Hamburger.spec.js create mode 100644 admin/client/tests/unit/components/SvgIcon.spec.js create mode 100644 admin/client/tests/unit/utils/formatTime.spec.js create mode 100644 admin/client/tests/unit/utils/parseTime.spec.js create mode 100644 admin/client/tests/unit/utils/validate.spec.js create mode 100644 admin/client/vue.config.js create mode 100644 admin/docker-compose.yml create mode 100644 admin/img/dict.png create mode 100644 admin/img/docs.png create mode 100644 admin/img/task.png create mode 100644 admin/img/ticket.png create mode 100644 admin/img/user.png create mode 100644 admin/server/.gitignore create mode 100644 admin/server/Dockerfile create mode 100644 admin/server/apps/crm/__init__.py create mode 100644 admin/server/apps/crm/admin.py create mode 100644 admin/server/apps/crm/apps.py create mode 100644 admin/server/apps/crm/management/__init__.py create mode 100644 admin/server/apps/crm/management/commands/__init__.py create mode 100644 admin/server/apps/crm/management/commands/init_crm_data.py create mode 100644 admin/server/apps/crm/migrations/0001_initial.py create mode 100644 admin/server/apps/crm/migrations/0002_project_detail.py create mode 100644 admin/server/apps/crm/migrations/0003_banner_project.py create mode 100644 admin/server/apps/crm/migrations/0004_auto_20251128_1719.py create mode 100644 admin/server/apps/crm/migrations/0005_activity_exam_activityregistration_and_more.py create mode 100644 admin/server/apps/crm/migrations/__init__.py create mode 100644 admin/server/apps/crm/models.py create mode 100644 admin/server/apps/crm/serializers.py create mode 100644 admin/server/apps/crm/tests.py create mode 100644 admin/server/apps/crm/urls.py create mode 100644 admin/server/apps/crm/views.py create mode 100644 admin/server/apps/monitor/__init__.py create mode 100644 admin/server/apps/monitor/admin.py create mode 100644 admin/server/apps/monitor/apps.py create mode 100644 admin/server/apps/monitor/middleware.py create mode 100644 admin/server/apps/monitor/migrations/__init__.py create mode 100644 admin/server/apps/monitor/models.py create mode 100644 admin/server/apps/monitor/tests.py create mode 100644 admin/server/apps/monitor/urls.py create mode 100644 admin/server/apps/monitor/views.py create mode 100644 admin/server/apps/system/__init__.py create mode 100644 admin/server/apps/system/admin.py create mode 100644 admin/server/apps/system/apps.py create mode 100644 admin/server/apps/system/authentication.py create mode 100644 admin/server/apps/system/filters.py create mode 100644 admin/server/apps/system/migrations/0001_initial.py create mode 100644 admin/server/apps/system/migrations/0002_auto_20210718_0918.py create mode 100644 admin/server/apps/system/migrations/0003_auto_20220227_1732.py create mode 100644 admin/server/apps/system/migrations/0004_auto_20251128_1413.py create mode 100644 admin/server/apps/system/migrations/0005_alter_historicaldict_options_alter_file_create_by_and_more.py create mode 100644 admin/server/apps/system/migrations/__init__.py create mode 100644 admin/server/apps/system/mixins.py create mode 100644 admin/server/apps/system/models.py create mode 100644 admin/server/apps/system/permission.py create mode 100644 admin/server/apps/system/permission_data.py create mode 100644 admin/server/apps/system/serializers.py create mode 100644 admin/server/apps/system/signals.py create mode 100644 admin/server/apps/system/tasks.py create mode 100644 admin/server/apps/system/tests.py create mode 100644 admin/server/apps/system/urls.py create mode 100644 admin/server/apps/system/views.py create mode 100644 admin/server/apps/wf/__init__.py create mode 100644 admin/server/apps/wf/admin.py create mode 100644 admin/server/apps/wf/apps.py create mode 100644 admin/server/apps/wf/filters.py create mode 100644 admin/server/apps/wf/migrations/0001_initial.py create mode 100644 admin/server/apps/wf/migrations/__init__.py create mode 100644 admin/server/apps/wf/models.py create mode 100644 admin/server/apps/wf/scripts.py create mode 100644 admin/server/apps/wf/serializers.py create mode 100644 admin/server/apps/wf/services.py create mode 100644 admin/server/apps/wf/tests.py create mode 100644 admin/server/apps/wf/urls.py create mode 100644 admin/server/apps/wf/views.py create mode 100644 admin/server/db.json create mode 100644 admin/server/log/.gitignore create mode 100644 admin/server/manage.py create mode 100644 admin/server/media/default/avatar.png create mode 100644 admin/server/requirements.txt create mode 100644 admin/server/server/__init__.py create mode 100644 admin/server/server/asgi.py create mode 100644 admin/server/server/celery.py create mode 100644 admin/server/server/conf_e.py create mode 100644 admin/server/server/settings.py create mode 100644 admin/server/server/urls.py create mode 100644 admin/server/server/wsgi.py create mode 100644 admin/server/start.sh create mode 100644 admin/server/utils/__init__.py create mode 100644 admin/server/utils/model.py create mode 100644 admin/server/utils/pagination.py create mode 100644 admin/server/utils/queryset.py create mode 100644 admin/server/utils/response.py create mode 100644 admin/server/utils/serializer.py create mode 100644 admin/server/utils/test.py create mode 100644 admin/server/utils/view.py create mode 100644 admin/server/utils/workflow.py create mode 100644 admin/specification.md create mode 100644 create_repo.py create mode 100644 db.sqlite3 create mode 100644 wechat-mini-program/app.js create mode 100644 wechat-mini-program/app.json create mode 100644 wechat-mini-program/app.wxss create mode 100644 wechat-mini-program/config/env.js create mode 100644 wechat-mini-program/pages/coupon/coupon.js create mode 100644 wechat-mini-program/pages/coupon/coupon.json create mode 100644 wechat-mini-program/pages/coupon/coupon.wxml create mode 100644 wechat-mini-program/pages/coupon/coupon.wxss create mode 100644 wechat-mini-program/pages/detail/detail.js create mode 100644 wechat-mini-program/pages/detail/detail.json create mode 100644 wechat-mini-program/pages/detail/detail.wxml create mode 100644 wechat-mini-program/pages/detail/detail.wxss create mode 100644 wechat-mini-program/pages/index/index.js create mode 100644 wechat-mini-program/pages/index/index.json create mode 100644 wechat-mini-program/pages/index/index.wxml create mode 100644 wechat-mini-program/pages/index/index.wxss create mode 100644 wechat-mini-program/pages/profile/profile.js create mode 100644 wechat-mini-program/pages/profile/profile.json create mode 100644 wechat-mini-program/pages/profile/profile.wxml create mode 100644 wechat-mini-program/pages/profile/profile.wxss create mode 100644 wechat-mini-program/project.config.json create mode 100644 wechat-mini-program/project.private.config.json create mode 100644 wechat-mini-program/utils/request.js diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..552db1b --- /dev/null +++ b/.gitignore @@ -0,0 +1,7 @@ +.venv/ +__pycache__/ +*.pyc +.trae/ +.vscode/ +.idea/ +*.log \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..436eb2d --- /dev/null +++ b/README.md @@ -0,0 +1,175 @@ +# Django-Vue-Admin 管理系统 + +## 📖 项目简介 +本项目是一个全栈管理系统解决方案,包含: +1. **管理后台**:基于 **Django** + **Vue.js** 的前后端分离管理系统。包含用户管理、权限管理 (RBAC)、CRM 客户关系管理以及工作流 (Workflow) 等功能模块。 +2. **微信小程序**:基于原生微信小程序开发,提供移动端服务。 + +## 🛠 技术栈 + +### 后端 (Backend) - `admin/server` +- **核心框架**: Django 3.2.23 +- **API 框架**: Django REST Framework (DRF) 3.12.4 +- **异步任务**: Celery 5.2.7 +- **缓存/消息队列**: Redis +- **认证**: SimpleJWT +- **文档**: drf-yasg (Swagger/Redoc) + +### 后端管理前端 (Web Client) - `admin/client` +- **核心框架**: Vue.js 2.6.10 +- **UI 组件库**: Element UI 2.15.14 +- **状态管理**: Vuex +- **路由管理**: Vue Router +- **脚手架**: Vue CLI + +### 微信小程序 (Mini Program) - `wechat-mini-program` +- **开发框架**: 微信原生小程序 (Native) +- **UI 样式**: WXSS (支持 PostCSS) +- **配置文件**: `project.config.json` + +## 📂 目录结构 + +``` +gemini测试/ +├── admin/ # 管理后台项目 +│ ├── client/ # 管理后台前端源码 (Vue) +│ │ ├── src/ # 源代码 +│ │ ├── package.json # 依赖配置 +│ │ └── ... +│ └── server/ # 后端服务源码 (Django) +│ ├── apps/ # 业务应用模块 (crm, system, wf) +│ ├── server/ # 项目核心配置 +│ ├── manage.py # Django 管理脚本 +│ └── ... +├── wechat-mini-program/ # 微信小程序源码 +│ ├── pages/ # 小程序页面 (index, detail, etc.) +│ ├── utils/ # 工具函数 +│ ├── app.json # 全局配置 +│ └── project.config.json # 项目配置 +└── README.md # 项目说明文档 +``` + +## 🚀 快速开始 + +### 1. 环境准备 +确保您的开发环境已安装以下软件: +- Python 3.8+ +- Node.js 12+ +- Redis (用于缓存和 Celery) +- Git +- 微信开发者工具 (用于小程序开发) + +### 2. 后端启动 (Server) + +进入后端目录: +```bash +cd admin/server +``` + +创建并激活虚拟环境 (推荐): +```bash +# Windows +python -m venv .venv +.venv\Scripts\activate + +# Linux/macOS +python3 -m venv .venv +source .venv/bin/activate +``` + +安装依赖: +```bash +pip install -r requirements.txt +``` + +配置数据库: +默认使用 SQLite,配置文件位于 `admin/server/server/conf_e.py`。如需修改为 MySQL/PostgreSQL,请修改该文件中的 `DATABASES` 配置。 + +执行数据库迁移: +```bash +python manage.py makemigrations +python manage.py migrate +``` + +创建超级管理员: +```bash +python manage.py createsuperuser +``` + +启动开发服务器: +```bash +python manage.py runserver +``` +后端服务默认运行在 `http://127.0.0.1:8000`。 + +启动 Celery Worker (可选,用于异步任务): +```bash +# Windows (需安装 gevent 或 eventlet) +celery -A server worker -l info -P eventlet + +# Linux/macOS +celery -A server worker -l info +``` + +### 3. 后端管理前端启动 (Web Client) + +进入前端目录: +```bash +cd admin/client +``` + +安装依赖: +```bash +npm install +# 或者使用 yarn / cnpm +# npm install --registry=https://registry.npmmirror.com +``` + +启动开发服务器: +```bash +npm run dev +``` +前端服务启动后,通常访问地址为 `http://localhost:9528`。 + +### 4. 微信小程序启动 (Mini Program) + +1. 下载并安装 [微信开发者工具](https://developers.weixin.qq.com/miniprogram/dev/devtools/download.html)。 +2. 打开微信开发者工具,选择 **导入项目**。 +3. 目录选择本项目下的 `wechat-mini-program` 文件夹。 +4. AppID 请在 `project.config.json` 中查看或替换为您自己的 AppID。 +5. 点击 **编译** 即可预览。 + +**注意**: 请确保后端服务已启动,并在小程序代码中 (`utils/request.js` 或类似文件) 配置正确的后端 API 地址。 + +## 📦 功能模块 + +- **系统管理 (System)** + - 用户/角色/菜单/部门管理。 + +- **客户关系管理 (CRM)** + - 客户信息维护与线索管理。 + +- **工作流 (Workflow)** + - 审批流程配置与流转。 + +- **移动端 (Mini Program)** + - 首页展示、详情浏览、个人中心等功能。 + +## 🔧 部署构建 + +### Web 前端构建 +```bash +cd admin/client +npm run build:prod +``` +构建生成的静态文件位于 `admin/client/dist` 目录。 + +### 后端部署 +推荐使用 Gunicorn + Nginx 进行部署。 +参考 `admin/server/start.sh` 进行容器化部署。 + +### 小程序发布 +在微信开发者工具中点击 **上传**,然后在微信公众平台进行版本管理和发布。 + +## 📄 许可证 +MIT License diff --git a/admin/.gitattributes b/admin/.gitattributes new file mode 100644 index 0000000..6e51dee --- /dev/null +++ b/admin/.gitattributes @@ -0,0 +1 @@ +*.vue linguist-language=python diff --git a/admin/.gitignore b/admin/.gitignore new file mode 100644 index 0000000..fee402c --- /dev/null +++ b/admin/.gitignore @@ -0,0 +1,8 @@ +unpackage/dist/* +node_modules/* +deploy.sh +package-lock.json +.idea/ +.vscode/ +server/static/ +img/wechat_group.jpg diff --git a/admin/LICENSE b/admin/LICENSE new file mode 100644 index 0000000..09310e6 --- /dev/null +++ b/admin/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2018 blackholll + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/admin/README.md b/admin/README.md new file mode 100644 index 0000000..06bd676 --- /dev/null +++ b/admin/README.md @@ -0,0 +1,153 @@ +# Django-Vue-Admin 管理系统 + +## 📖 项目简介 +本项目是一个基于 **Django** + **Vue.js** 的前后端分离管理系统。包含用户管理、权限管理 (RBAC)、CRM 客户关系管理以及工作流 (Workflow) 等功能模块。 + +## 🛠 技术栈 + +### 后端 (Backend) +- **核心框架**: Django 3.2.23 +- **API 框架**: Django REST Framework (DRF) 3.12.4 +- **异步任务**: Celery 5.2.7 +- **缓存/消息队列**: Redis +- **认证**: SimpleJWT +- **文档**: drf-yasg (Swagger/Redoc) + +### 前端 (Frontend) +- **核心框架**: Vue.js 2.6.10 +- **UI 组件库**: Element UI 2.15.14 +- **状态管理**: Vuex +- **路由管理**: Vue Router +- **脚手架**: Vue CLI + +## 📂 目录结构 + +``` +admin/ +├── client/ # 前端项目源码 (Vue) +│ ├── build/ # 构建脚本 +│ ├── src/ # 源代码 +│ ├── package.json # 前端依赖配置 +│ └── ... +├── server/ # 后端项目源码 (Django) +│ ├── apps/ # 业务应用模块 (crm, system, wf) +│ ├── server/ # 项目核心配置 +│ ├── utils/ # 通用工具类 +│ ├── manage.py # Django 管理脚本 +│ ├── requirements.txt # 后端依赖配置 +│ └── ... +└── README.md # 项目说明文档 +``` + +## 🚀 快速开始 + +### 1. 环境准备 +确保您的开发环境已安装以下软件: +- Python 3.8+ +- Node.js 12+ +- Redis (用于缓存和 Celery) +- Git + +### 2. 后端启动 (Server) + +进入后端目录: +```bash +cd server +``` + +创建并激活虚拟环境 (推荐): +```bash +# Windows +python -m venv .venv +.venv\Scripts\activate + +# Linux/macOS +python3 -m venv .venv +source .venv/bin/activate +``` + +安装依赖: +```bash +pip install -r requirements.txt +``` + +配置数据库: +默认使用 SQLite,配置文件位于 `server/server/conf_e.py`。如需修改为 MySQL/PostgreSQL,请修改该文件中的 `DATABASES` 配置。 + +执行数据库迁移: +```bash +python manage.py makemigrations +python manage.py migrate +``` + +创建超级管理员: +```bash +python manage.py createsuperuser +``` + +启动开发服务器: +```bash +python manage.py runserver +``` +后端服务默认运行在 `http://127.0.0.1:8000`。 + +启动 Celery Worker (可选,用于异步任务): +```bash +# Windows (需安装 gevent 或 eventlet) +celery -A server worker -l info -P eventlet + +# Linux/macOS +celery -A server worker -l info +``` + +### 3. 前端启动 (Client) + +进入前端目录: +```bash +cd client +``` + +安装依赖: +```bash +npm install +# 或者使用 yarn / cnpm +# npm install --registry=https://registry.npmmirror.com +``` + +启动开发服务器: +```bash +npm run dev +``` +前端服务启动后,通常访问地址为 `http://localhost:9528` (具体端口见终端输出)。 + +## 📦 功能模块 + +- **系统管理 (System)** + - 用户管理:用户的增删改查及角色分配。 + - 角色管理:角色权限分配。 + - 菜单管理:动态路由菜单配置。 + - 部门管理:组织架构管理。 + +- **客户关系管理 (CRM)** + - 客户信息的录入与维护。 + - 销售线索管理。 + +- **工作流 (Workflow)** + - 审批流程配置。 + - 流程实例流转。 + +## 🔧 部署构建 + +### 前端构建 +```bash +cd client +npm run build:prod +``` +构建生成的静态文件位于 `client/dist` 目录。 + +### 后端部署 +推荐使用 Gunicorn + Nginx 进行部署。 +参考 `server/start.sh` 和 `server/Dockerfile` (如果存在) 进行容器化部署。 + +## 📄 许可证 +MIT License diff --git a/admin/client/.editorconfig b/admin/client/.editorconfig new file mode 100644 index 0000000..ea6e20f --- /dev/null +++ b/admin/client/.editorconfig @@ -0,0 +1,14 @@ +# http://editorconfig.org +root = true + +[*] +charset = utf-8 +indent_style = space +indent_size = 2 +end_of_line = lf +insert_final_newline = true +trim_trailing_whitespace = true + +[*.md] +insert_final_newline = false +trim_trailing_whitespace = false diff --git a/admin/client/.env.development b/admin/client/.env.development new file mode 100644 index 0000000..f0aff47 --- /dev/null +++ b/admin/client/.env.development @@ -0,0 +1,14 @@ +# just a flag +ENV = 'development' + +# base api +VUE_APP_BASE_API = 'http://localhost:8000/api' + +# vue-cli uses the VUE_CLI_BABEL_TRANSPILE_MODULES environment variable, +# to control whether the babel-plugin-dynamic-import-node plugin is enabled. +# It only does one thing by converting all import() to require(). +# This configuration can significantly increase the speed of hot updates, +# when you have a large number of pages. +# Detail: https://github.com/vuejs/vue-cli/blob/dev/packages/@vue/babel-preset-app/index.js + +VUE_CLI_BABEL_TRANSPILE_MODULES = true diff --git a/admin/client/.env.production b/admin/client/.env.production new file mode 100644 index 0000000..07d391e --- /dev/null +++ b/admin/client/.env.production @@ -0,0 +1,6 @@ +# just a flag +ENV = 'production' + +# base api +VUE_APP_BASE_API = '/api' + diff --git a/admin/client/.env.staging b/admin/client/.env.staging new file mode 100644 index 0000000..a8793a0 --- /dev/null +++ b/admin/client/.env.staging @@ -0,0 +1,8 @@ +NODE_ENV = production + +# just a flag +ENV = 'staging' + +# base api +VUE_APP_BASE_API = '/stage-api' + diff --git a/admin/client/.eslintignore b/admin/client/.eslintignore new file mode 100644 index 0000000..e6529fc --- /dev/null +++ b/admin/client/.eslintignore @@ -0,0 +1,4 @@ +build/*.js +src/assets +public +dist diff --git a/admin/client/.eslintrc.js b/admin/client/.eslintrc.js new file mode 100644 index 0000000..c977505 --- /dev/null +++ b/admin/client/.eslintrc.js @@ -0,0 +1,198 @@ +module.exports = { + root: true, + parserOptions: { + parser: 'babel-eslint', + sourceType: 'module' + }, + env: { + browser: true, + node: true, + es6: true, + }, + extends: ['plugin:vue/recommended', 'eslint:recommended'], + + // add your custom rules here + //it is base on https://github.com/vuejs/eslint-config-vue + rules: { + "vue/max-attributes-per-line": [2, { + "singleline": 10, + "multiline": { + "max": 1, + "allowFirstLine": false + } + }], + "vue/singleline-html-element-content-newline": "off", + "vue/multiline-html-element-content-newline":"off", + "vue/name-property-casing": ["error", "PascalCase"], + "vue/no-v-html": "off", + 'accessor-pairs': 2, + 'arrow-spacing': [2, { + 'before': true, + 'after': true + }], + 'block-spacing': [2, 'always'], + 'brace-style': [2, '1tbs', { + 'allowSingleLine': true + }], + 'camelcase': [0, { + 'properties': 'always' + }], + 'comma-dangle': [2, 'never'], + 'comma-spacing': [2, { + 'before': false, + 'after': true + }], + 'comma-style': [2, 'last'], + 'constructor-super': 2, + 'curly': [2, 'multi-line'], + 'dot-location': [2, 'property'], + 'eol-last': 2, + 'eqeqeq': ["error", "always", {"null": "ignore"}], + 'generator-star-spacing': [2, { + 'before': true, + 'after': true + }], + 'handle-callback-err': [2, '^(err|error)$'], + 'indent': [2, 2, { + 'SwitchCase': 1 + }], + 'jsx-quotes': [2, 'prefer-single'], + 'key-spacing': [2, { + 'beforeColon': false, + 'afterColon': true + }], + 'keyword-spacing': [2, { + 'before': true, + 'after': true + }], + 'new-cap': [2, { + 'newIsCap': true, + 'capIsNew': false + }], + 'new-parens': 2, + 'no-array-constructor': 2, + 'no-caller': 2, + 'no-console': 'off', + 'no-class-assign': 2, + 'no-cond-assign': 2, + 'no-const-assign': 2, + 'no-control-regex': 0, + 'no-delete-var': 2, + 'no-dupe-args': 2, + 'no-dupe-class-members': 2, + 'no-dupe-keys': 2, + 'no-duplicate-case': 2, + 'no-empty-character-class': 2, + 'no-empty-pattern': 2, + 'no-eval': 2, + 'no-ex-assign': 2, + 'no-extend-native': 2, + 'no-extra-bind': 2, + 'no-extra-boolean-cast': 2, + 'no-extra-parens': [2, 'functions'], + 'no-fallthrough': 2, + 'no-floating-decimal': 2, + 'no-func-assign': 2, + 'no-implied-eval': 2, + 'no-inner-declarations': [2, 'functions'], + 'no-invalid-regexp': 2, + 'no-irregular-whitespace': 2, + 'no-iterator': 2, + 'no-label-var': 2, + 'no-labels': [2, { + 'allowLoop': false, + 'allowSwitch': false + }], + 'no-lone-blocks': 2, + 'no-mixed-spaces-and-tabs': 2, + 'no-multi-spaces': 2, + 'no-multi-str': 2, + 'no-multiple-empty-lines': [2, { + 'max': 1 + }], + 'no-native-reassign': 2, + 'no-negated-in-lhs': 2, + 'no-new-object': 2, + 'no-new-require': 2, + 'no-new-symbol': 2, + 'no-new-wrappers': 2, + 'no-obj-calls': 2, + 'no-octal': 2, + 'no-octal-escape': 2, + 'no-path-concat': 2, + 'no-proto': 2, + 'no-redeclare': 2, + 'no-regex-spaces': 2, + 'no-return-assign': [2, 'except-parens'], + 'no-self-assign': 2, + 'no-self-compare': 2, + 'no-sequences': 2, + 'no-shadow-restricted-names': 2, + 'no-spaced-func': 2, + 'no-sparse-arrays': 2, + 'no-this-before-super': 2, + 'no-throw-literal': 2, + 'no-trailing-spaces': 2, + 'no-undef': 2, + 'no-undef-init': 2, + 'no-unexpected-multiline': 2, + 'no-unmodified-loop-condition': 2, + 'no-unneeded-ternary': [2, { + 'defaultAssignment': false + }], + 'no-unreachable': 2, + 'no-unsafe-finally': 2, + 'no-unused-vars': [2, { + 'vars': 'all', + 'args': 'none' + }], + 'no-useless-call': 2, + 'no-useless-computed-key': 2, + 'no-useless-constructor': 2, + 'no-useless-escape': 0, + 'no-whitespace-before-property': 2, + 'no-with': 2, + 'one-var': [2, { + 'initialized': 'never' + }], + 'operator-linebreak': [2, 'after', { + 'overrides': { + '?': 'before', + ':': 'before' + } + }], + 'padded-blocks': [2, 'never'], + 'quotes': [2, 'single', { + 'avoidEscape': true, + 'allowTemplateLiterals': true + }], + 'semi': [2, 'never'], + 'semi-spacing': [2, { + 'before': false, + 'after': true + }], + 'space-before-blocks': [2, 'always'], + 'space-before-function-paren': [2, 'never'], + 'space-in-parens': [2, 'never'], + 'space-infix-ops': 2, + 'space-unary-ops': [2, { + 'words': true, + 'nonwords': false + }], + 'spaced-comment': [2, 'always', { + 'markers': ['global', 'globals', 'eslint', 'eslint-disable', '*package', '!', ','] + }], + 'template-curly-spacing': [2, 'never'], + 'use-isnan': 2, + 'valid-typeof': 2, + 'wrap-iife': [2, 'any'], + 'yield-star-spacing': [2, 'both'], + 'yoda': [2, 'never'], + 'prefer-const': 2, + 'no-debugger': process.env.NODE_ENV === 'production' ? 2 : 0, + 'object-curly-spacing': [2, 'always', { + objectsInObjects: false + }], + 'array-bracket-spacing': [2, 'never'] + } +} diff --git a/admin/client/.gitignore b/admin/client/.gitignore new file mode 100644 index 0000000..9ad28d2 --- /dev/null +++ b/admin/client/.gitignore @@ -0,0 +1,16 @@ +.DS_Store +node_modules/ +dist/ +npm-debug.log* +yarn-debug.log* +yarn-error.log* +package-lock.json +tests/**/coverage/ + +# Editor directories and files +.idea +.vscode +*.suo +*.ntvs* +*.njsproj +*.sln diff --git a/admin/client/.travis.yml b/admin/client/.travis.yml new file mode 100644 index 0000000..f4be7a0 --- /dev/null +++ b/admin/client/.travis.yml @@ -0,0 +1,5 @@ +language: node_js +node_js: 10 +script: npm run test +notifications: + email: false diff --git a/admin/client/Dockerfile b/admin/client/Dockerfile new file mode 100644 index 0000000..35534e1 --- /dev/null +++ b/admin/client/Dockerfile @@ -0,0 +1,6 @@ +FROM node:10-alpine3.9 as builder +WORKDIR /code +COPY . . +RUN npm install --registry=https://registry.npm.taobao.org && npm run build:prod +FROM nginx:1.19.2-alpine +COPY --from=builder /code/dist /usr/share/nginx/html diff --git a/admin/client/Dockerfile_dev b/admin/client/Dockerfile_dev new file mode 100644 index 0000000..6f5a6ad --- /dev/null +++ b/admin/client/Dockerfile_dev @@ -0,0 +1,7 @@ +FROM node:10-alpine3.9 +ENV NODE_ENV=development +WORKDIR /code +COPY . . +RUN npm config set sass_binary_site=https://npm.taobao.org/mirrors/node-sass &&\ + npm install --registry=https://registry.npm.taobao.org +ENTRYPOINT ["npm","run","dev:docker"] diff --git a/admin/client/LICENSE b/admin/client/LICENSE new file mode 100644 index 0000000..6151575 --- /dev/null +++ b/admin/client/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2017-present PanJiaChen + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/admin/client/README-zh.md b/admin/client/README-zh.md new file mode 100644 index 0000000..d248632 --- /dev/null +++ b/admin/client/README-zh.md @@ -0,0 +1,98 @@ +# vue-admin-template + +> 这是一个极简的 vue admin 管理后台。它只包含了 Element UI & axios & iconfont & permission control & lint,这些搭建后台必要的东西。 + +[线上地址](http://panjiachen.github.io/vue-admin-template) + +[国内访问](https://panjiachen.gitee.io/vue-admin-template) + +目前版本为 `v4.0+` 基于 `vue-cli` 进行构建,若你想使用旧版本,可以切换分支到[tag/3.11.0](https://github.com/PanJiaChen/vue-admin-template/tree/tag/3.11.0),它不依赖 `vue-cli`。 + +## Extra + +如果你想要根据用户角色来动态生成侧边栏和 router,你可以使用该分支[permission-control](https://github.com/PanJiaChen/vue-admin-template/tree/permission-control) + +## 相关项目 + +- [vue-element-admin](https://github.com/PanJiaChen/vue-element-admin) + +- [electron-vue-admin](https://github.com/PanJiaChen/electron-vue-admin) + +- [vue-typescript-admin-template](https://github.com/Armour/vue-typescript-admin-template) + +- [awesome-project](https://github.com/PanJiaChen/vue-element-admin/issues/2312) + +写了一个系列的教程配套文章,如何从零构建后一个完整的后台项目: + +- [手摸手,带你用 vue 撸后台 系列一(基础篇)](https://juejin.im/post/59097cd7a22b9d0065fb61d2) +- [手摸手,带你用 vue 撸后台 系列二(登录权限篇)](https://juejin.im/post/591aa14f570c35006961acac) +- [手摸手,带你用 vue 撸后台 系列三 (实战篇)](https://juejin.im/post/593121aa0ce4630057f70d35) +- [手摸手,带你用 vue 撸后台 系列四(vueAdmin 一个极简的后台基础模板,专门针对本项目的文章,算作是一篇文档)](https://juejin.im/post/595b4d776fb9a06bbe7dba56) +- [手摸手,带你封装一个 vue component](https://segmentfault.com/a/1190000009090836) + +## Build Setup + +```bash +# 克隆项目 +git clone https://github.com/PanJiaChen/vue-admin-template.git + +# 进入项目目录 +cd vue-admin-template + +# 安装依赖 +npm install + +# 建议不要直接使用 cnpm 安装以来,会有各种诡异的 bug。可以通过如下操作解决 npm 下载速度慢的问题 +npm install --registry=https://registry.npm.taobao.org + +# 启动服务 +npm run dev +``` + +浏览器访问 [http://localhost:9528](http://localhost:9528) + +## 发布 + +```bash +# 构建测试环境 +npm run build:stage + +# 构建生产环境 +npm run build:prod +``` + +## 其它 + +```bash +# 预览发布环境效果 +npm run preview + +# 预览发布环境效果 + 静态资源分析 +npm run preview -- --report + +# 代码格式检查 +npm run lint + +# 代码格式检查并自动修复 +npm run lint -- --fix +``` + +更多信息请参考 [使用文档](https://panjiachen.github.io/vue-element-admin-site/zh/) + +## Demo + +![demo](https://github.com/PanJiaChen/PanJiaChen.github.io/blob/master/images/demo.gif) + +## Browsers support + +Modern browsers and Internet Explorer 10+. + +| [IE / Edge](http://godban.github.io/browsers-support-badges/)
IE / Edge | [Firefox](http://godban.github.io/browsers-support-badges/)
Firefox | [Chrome](http://godban.github.io/browsers-support-badges/)
Chrome | [Safari](http://godban.github.io/browsers-support-badges/)
Safari | +| --------- | --------- | --------- | --------- | +| IE10, IE11, Edge| last 2 versions| last 2 versions| last 2 versions + +## License + +[MIT](https://github.com/PanJiaChen/vue-admin-template/blob/master/LICENSE) license. + +Copyright (c) 2017-present PanJiaChen diff --git a/admin/client/README.md b/admin/client/README.md new file mode 100644 index 0000000..b99f942 --- /dev/null +++ b/admin/client/README.md @@ -0,0 +1,91 @@ +# vue-admin-template + +English | [简体中文](./README-zh.md) + +> A minimal vue admin template with Element UI & axios & iconfont & permission control & lint + +**Live demo:** http://panjiachen.github.io/vue-admin-template + + +**The current version is `v4.0+` build on `vue-cli`. If you want to use the old version , you can switch branch to [tag/3.11.0](https://github.com/PanJiaChen/vue-admin-template/tree/tag/3.11.0), it does not rely on `vue-cli`** + +## Build Setup + + +```bash +# clone the project +git clone https://github.com/PanJiaChen/vue-admin-template.git + +# enter the project directory +cd vue-admin-template + +# install dependency +npm install + +# develop +npm run dev +``` + +This will automatically open http://localhost:9528 + +## Build + +```bash +# build for test environment +npm run build:stage + +# build for production environment +npm run build:prod +``` + +## Advanced + +```bash +# preview the release environment effect +npm run preview + +# preview the release environment effect + static resource analysis +npm run preview -- --report + +# code format check +npm run lint + +# code format check and auto fix +npm run lint -- --fix +``` + +Refer to [Documentation](https://panjiachen.github.io/vue-element-admin-site/guide/essentials/deploy.html) for more information + +## Demo + +![demo](https://github.com/PanJiaChen/PanJiaChen.github.io/blob/master/images/demo.gif) + +## Extra + +If you want router permission && generate menu by user roles , you can use this branch [permission-control](https://github.com/PanJiaChen/vue-admin-template/tree/permission-control) + +For `typescript` version, you can use [vue-typescript-admin-template](https://github.com/Armour/vue-typescript-admin-template) (Credits: [@Armour](https://github.com/Armour)) + +## Related Project + +- [vue-element-admin](https://github.com/PanJiaChen/vue-element-admin) + +- [electron-vue-admin](https://github.com/PanJiaChen/electron-vue-admin) + +- [vue-typescript-admin-template](https://github.com/Armour/vue-typescript-admin-template) + +- [awesome-project](https://github.com/PanJiaChen/vue-element-admin/issues/2312) + +## Browsers support + +Modern browsers and Internet Explorer 10+. + +| [IE / Edge](http://godban.github.io/browsers-support-badges/)
IE / Edge | [Firefox](http://godban.github.io/browsers-support-badges/)
Firefox | [Chrome](http://godban.github.io/browsers-support-badges/)
Chrome | [Safari](http://godban.github.io/browsers-support-badges/)
Safari | +| --------- | --------- | --------- | --------- | +| IE10, IE11, Edge| last 2 versions| last 2 versions| last 2 versions + +## License + +[MIT](https://github.com/PanJiaChen/vue-admin-template/blob/master/LICENSE) license. + +Copyright (c) 2017-present PanJiaChen diff --git a/admin/client/babel.config.js b/admin/client/babel.config.js new file mode 100644 index 0000000..ba17966 --- /dev/null +++ b/admin/client/babel.config.js @@ -0,0 +1,5 @@ +module.exports = { + presets: [ + '@vue/app' + ] +} diff --git a/admin/client/build/index.js b/admin/client/build/index.js new file mode 100644 index 0000000..0c57de2 --- /dev/null +++ b/admin/client/build/index.js @@ -0,0 +1,35 @@ +const { run } = require('runjs') +const chalk = require('chalk') +const config = require('../vue.config.js') +const rawArgv = process.argv.slice(2) +const args = rawArgv.join(' ') + +if (process.env.npm_config_preview || rawArgv.includes('--preview')) { + const report = rawArgv.includes('--report') + + run(`vue-cli-service build ${args}`) + + const port = 9526 + const publicPath = config.publicPath + + var connect = require('connect') + var serveStatic = require('serve-static') + const app = connect() + + app.use( + publicPath, + serveStatic('./dist', { + index: ['index.html', '/'] + }) + ) + + app.listen(port, function () { + console.log(chalk.green(`> Preview at http://localhost:${port}${publicPath}`)) + if (report) { + console.log(chalk.green(`> Report at http://localhost:${port}${publicPath}report.html`)) + } + + }) +} else { + run(`vue-cli-service build ${args}`) +} diff --git a/admin/client/jest.config.js b/admin/client/jest.config.js new file mode 100644 index 0000000..143cdc8 --- /dev/null +++ b/admin/client/jest.config.js @@ -0,0 +1,24 @@ +module.exports = { + moduleFileExtensions: ['js', 'jsx', 'json', 'vue'], + transform: { + '^.+\\.vue$': 'vue-jest', + '.+\\.(css|styl|less|sass|scss|svg|png|jpg|ttf|woff|woff2)$': + 'jest-transform-stub', + '^.+\\.jsx?$': 'babel-jest' + }, + moduleNameMapper: { + '^@/(.*)$': '/src/$1' + }, + snapshotSerializers: ['jest-serializer-vue'], + testMatch: [ + '**/tests/unit/**/*.spec.(js|jsx|ts|tsx)|**/__tests__/*.(js|jsx|ts|tsx)' + ], + collectCoverageFrom: ['src/utils/**/*.{js,vue}', '!src/utils/auth.js', '!src/utils/request.js', 'src/components/**/*.{js,vue}'], + coverageDirectory: '/tests/unit/coverage', + // 'collectCoverage': true, + 'coverageReporters': [ + 'lcov', + 'text-summary' + ], + testURL: 'http://localhost/' +} diff --git a/admin/client/jsconfig.json b/admin/client/jsconfig.json new file mode 100644 index 0000000..ed079e2 --- /dev/null +++ b/admin/client/jsconfig.json @@ -0,0 +1,9 @@ +{ + "compilerOptions": { + "baseUrl": "./", + "paths": { + "@/*": ["src/*"] + } + }, + "exclude": ["node_modules", "dist"] +} diff --git a/admin/client/mock/index.js b/admin/client/mock/index.js new file mode 100644 index 0000000..90e2ffe --- /dev/null +++ b/admin/client/mock/index.js @@ -0,0 +1,67 @@ +import Mock from 'mockjs' +import { param2Obj } from '../src/utils' + +import user from './user' +import table from './table' + +const mocks = [ + ...user, + ...table +] + +// for front mock +// please use it cautiously, it will redefine XMLHttpRequest, +// which will cause many of your third-party libraries to be invalidated(like progress event). +export function mockXHR() { + // mock patch + // https://github.com/nuysoft/Mock/issues/300 + Mock.XHR.prototype.proxy_send = Mock.XHR.prototype.send + Mock.XHR.prototype.send = function() { + if (this.custom.xhr) { + this.custom.xhr.withCredentials = this.withCredentials || false + + if (this.responseType) { + this.custom.xhr.responseType = this.responseType + } + } + this.proxy_send(...arguments) + } + + function XHR2ExpressReqWrap(respond) { + return function(options) { + let result = null + if (respond instanceof Function) { + const { body, type, url } = options + // https://expressjs.com/en/4x/api.html#req + result = respond({ + method: type, + body: JSON.parse(body), + query: param2Obj(url) + }) + } else { + result = respond + } + return Mock.mock(result) + } + } + + for (const i of mocks) { + Mock.mock(new RegExp(i.url), i.type || 'get', XHR2ExpressReqWrap(i.response)) + } +} + +// for mock server +const responseFake = (url, type, respond) => { + return { + url: new RegExp(`${process.env.VUE_APP_BASE_API}${url}`), + type: type || 'get', + response(req, res) { + console.log('request invoke:' + req.path) + res.json(Mock.mock(respond instanceof Function ? respond(req, res) : respond)) + } + } +} + +export default mocks.map(route => { + return responseFake(route.url, route.type, route.response) +}) diff --git a/admin/client/mock/mock-server.js b/admin/client/mock/mock-server.js new file mode 100644 index 0000000..4c4cb2a --- /dev/null +++ b/admin/client/mock/mock-server.js @@ -0,0 +1,68 @@ +const chokidar = require('chokidar') +const bodyParser = require('body-parser') +const chalk = require('chalk') +const path = require('path') + +const mockDir = path.join(process.cwd(), 'mock') + +function registerRoutes(app) { + let mockLastIndex + const { default: mocks } = require('./index.js') + for (const mock of mocks) { + app[mock.type](mock.url, mock.response) + mockLastIndex = app._router.stack.length + } + const mockRoutesLength = Object.keys(mocks).length + return { + mockRoutesLength: mockRoutesLength, + mockStartIndex: mockLastIndex - mockRoutesLength + } +} + +function unregisterRoutes() { + Object.keys(require.cache).forEach(i => { + if (i.includes(mockDir)) { + delete require.cache[require.resolve(i)] + } + }) +} + +module.exports = app => { + // es6 polyfill + require('@babel/register') + + // parse app.body + // https://expressjs.com/en/4x/api.html#req.body + app.use(bodyParser.json()) + app.use(bodyParser.urlencoded({ + extended: true + })) + + const mockRoutes = registerRoutes(app) + var mockRoutesLength = mockRoutes.mockRoutesLength + var mockStartIndex = mockRoutes.mockStartIndex + + // watch files, hot reload mock server + chokidar.watch(mockDir, { + ignored: /mock-server/, + ignoreInitial: true + }).on('all', (event, path) => { + if (event === 'change' || event === 'add') { + try { + // remove mock routes stack + app._router.stack.splice(mockStartIndex, mockRoutesLength) + + // clear routes cache + unregisterRoutes() + + const mockRoutes = registerRoutes(app) + mockRoutesLength = mockRoutes.mockRoutesLength + mockStartIndex = mockRoutes.mockStartIndex + + console.log(chalk.magentaBright(`\n > Mock Server hot reload success! changed ${path}`)) + } catch (error) { + console.log(chalk.redBright(error)) + } + } + }) +} diff --git a/admin/client/mock/table.js b/admin/client/mock/table.js new file mode 100644 index 0000000..ba95f76 --- /dev/null +++ b/admin/client/mock/table.js @@ -0,0 +1,29 @@ +import Mock from 'mockjs' + +const data = Mock.mock({ + 'items|30': [{ + id: '@id', + title: '@sentence(10, 20)', + 'status|1': ['published', 'draft', 'deleted'], + author: 'name', + display_time: '@datetime', + pageviews: '@integer(300, 5000)' + }] +}) + +export default [ + { + url: '/vue-admin-template/table/list', + type: 'get', + response: config => { + const items = data.items + return { + code: 20000, + data: { + total: items.length, + items: items + } + } + } + } +] diff --git a/admin/client/mock/user.js b/admin/client/mock/user.js new file mode 100644 index 0000000..f007cd9 --- /dev/null +++ b/admin/client/mock/user.js @@ -0,0 +1,84 @@ + +const tokens = { + admin: { + token: 'admin-token' + }, + editor: { + token: 'editor-token' + } +} + +const users = { + 'admin-token': { + roles: ['admin'], + introduction: 'I am a super administrator', + avatar: 'https://wpimg.wallstcn.com/f778738c-e4f8-4870-b634-56703b4acafe.gif', + name: 'Super Admin' + }, + 'editor-token': { + roles: ['editor'], + introduction: 'I am an editor', + avatar: 'https://wpimg.wallstcn.com/f778738c-e4f8-4870-b634-56703b4acafe.gif', + name: 'Normal Editor' + } +} + +export default [ + // user login + { + url: '/vue-admin-template/user/login', + type: 'post', + response: config => { + const { username } = config.body + const token = tokens[username] + + // mock error + if (!token) { + return { + code: 60204, + message: 'Account and password are incorrect.' + } + } + + return { + code: 20000, + data: token + } + } + }, + + // get user info + { + url: '/vue-admin-template/user/info\.*', + type: 'get', + response: config => { + const { token } = config.query + const info = users[token] + + // mock error + if (!info) { + return { + code: 50008, + message: 'Login failed, unable to get user details.' + } + } + + return { + code: 20000, + data: info + } + } + }, + + // user logout + { + url: '/vue-admin-template/user/logout', + type: 'post', + response: _ => { + return { + code: 20000, + data: 'success' + } + } + } +] diff --git a/admin/client/package.json b/admin/client/package.json new file mode 100644 index 0000000..4d35b04 --- /dev/null +++ b/admin/client/package.json @@ -0,0 +1,72 @@ +{ + "name": "vue-admin-template", + "version": "4.2.1", + "description": "A vue admin template with Element UI & axios & iconfont & permission control & lint", + "author": "Pan ", + "license": "MIT", + "scripts": { + "dev": "set NODE_OPTIONS=--openssl-legacy-provider && vue-cli-service serve", + "dev:docker": "NODE_ENV=development PORT=80 ./node_modules/.bin/vue-cli-service serve", + "build:prod": "set NODE_OPTIONS=--openssl-legacy-provider && vue-cli-service build", + "build:stage": "vue-cli-service build --mode staging", + "preview": "node build/index.js --preview", + "lint": "eslint --ext .js,.vue src", + "test:unit": "jest --clearCache && vue-cli-service test:unit", + "test:ci": "npm run lint && npm run test:unit", + "svgo": "svgo -f src/icons/svg --config=src/icons/svgo.yml" + }, + "dependencies": { + "@riophae/vue-treeselect": "^0.4.0", + "axios": "1.6", + "d3": "^7.6.1", + "dagre-d3": "^0.6.4", + "element-ui": "2.15.14", + "file-saver": "^2.0.2", + "js-cookie": "2.2.0", + "normalize.css": "7.0.0", + "nprogress": "0.2.0", + "path-to-regexp": "3.3.0", + "vue": "2.6.10", + "vue-json-editor": "^1.4.3", + "vue-router": "3.0.6", + "vuex": "3.1.0", + "webpack": "^4.36.0", + "xlsx": "^0.15.5" + }, + "devDependencies": { + "@babel/core": "^7.4.0", + "@babel/register": "7.0.0", + "@vue/cli-plugin-babel": "3.6.0", + "@vue/cli-plugin-eslint": "^3.9.1", + "@vue/cli-plugin-unit-jest": "3.6.3", + "@vue/cli-service": "3.6.0", + "@vue/test-utils": "1.0.0-beta.29", + "autoprefixer": "^9.8.8", + "babel-core": "7.0.0-bridge.0", + "babel-eslint": "10.0.1", + "babel-jest": "23.6.0", + "chalk": "2.4.2", + "connect": "3.6.6", + "eslint": "5.15.3", + "eslint-plugin-vue": "5.2.2", + "html-webpack-plugin": "3.2.0", + "mockjs": "1.1.0", + "runjs": "^4.3.2", + "sass": "^1.69.5", + "sass-loader": "^8.0", + "script-ext-html-webpack-plugin": "2.1.3", + "script-loader": "0.7.2", + "serve-static": "^1.15.0", + "svg-sprite-loader": "4.1.3", + "svgo": "1.2.2", + "vue-template-compiler": "2.6.10" + }, + "engines": { + "node": ">=8.9", + "npm": ">= 3.0.0" + }, + "browserslist": [ + "> 1%", + "last 2 versions" + ] +} diff --git a/admin/client/postcss.config.js b/admin/client/postcss.config.js new file mode 100644 index 0000000..10473ef --- /dev/null +++ b/admin/client/postcss.config.js @@ -0,0 +1,8 @@ +// https://github.com/michael-ciniawsky/postcss-load-config + +module.exports = { + 'plugins': { + // to edit target browsers: use "browserslist" field in package.json + 'autoprefixer': {} + } +} diff --git a/admin/client/public/favicon.ico b/admin/client/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..34b63ac63a87ee3ea8e7a0f3f5b5406c437e2112 GIT binary patch literal 67646 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 X;@D+E7Ad=S_FbjlW&KY_+xPzm3MBT? literal 0 HcmV?d00001 diff --git a/admin/client/public/index.html b/admin/client/public/index.html new file mode 100644 index 0000000..fa2be91 --- /dev/null +++ b/admin/client/public/index.html @@ -0,0 +1,17 @@ + + + + + + + + <%= webpackConfig.name %> + + + +
+ + + diff --git a/admin/client/src/App.vue b/admin/client/src/App.vue new file mode 100644 index 0000000..ec9032c --- /dev/null +++ b/admin/client/src/App.vue @@ -0,0 +1,11 @@ + + + diff --git a/admin/client/src/api/crm.js b/admin/client/src/api/crm.js new file mode 100644 index 0000000..ba2a079 --- /dev/null +++ b/admin/client/src/api/crm.js @@ -0,0 +1,330 @@ +import request from '@/utils/request' + +// Categories +export function getCategories(query) { + return request({ + url: '/categories/', + method: 'get', + params: query + }) +} + +export function createCategory(data) { + return request({ + url: '/categories/', + method: 'post', + data + }) +} + +export function updateCategory(id, data) { + return request({ + url: `/categories/${id}/`, + method: 'put', + data + }) +} + +export function deleteCategory(id) { + return request({ + url: `/categories/${id}/`, + method: 'delete' + }) +} + +// Projects +export function getProjects(query) { + return request({ + url: '/projects/', + method: 'get', + params: query + }) +} + +export function createProject(data) { + return request({ + url: '/projects/', + method: 'post', + data + }) +} + +export function updateProject(id, data) { + return request({ + url: `/projects/${id}/`, + method: 'put', + data + }) +} + +export function deleteProject(id) { + return request({ + url: `/projects/${id}/`, + method: 'delete' + }) +} + +// Coupons +export function getCoupons(query) { + return request({ + url: '/coupons/', + method: 'get', + params: query + }) +} + +export function createCoupon(data) { + return request({ + url: '/coupons/', + method: 'post', + data + }) +} + +export function updateCoupon(id, data) { + return request({ + url: `/coupons/${id}/`, + method: 'put', + data + }) +} + +export function deleteCoupon(id) { + return request({ + url: `/coupons/${id}/`, + method: 'delete' + }) +} + +// Banners +export function getBanners(query) { + return request({ + url: '/banners/', + method: 'get', + params: query + }) +} + +export function createBanner(data) { + return request({ + url: '/banners/', + method: 'post', + data + }) +} + +export function updateBanner(id, data) { + return request({ + url: `/banners/${id}/`, + method: 'put', + data + }) +} + +export function deleteBanner(id) { + return request({ + url: `/banners/${id}/`, + method: 'delete' + }) +} + +// Students +export function getStudents(query) { + return request({ + url: '/students/', + method: 'get', + params: query + }) +} + +export function createStudent(data) { + return request({ + url: '/students/', + method: 'post', + data + }) +} + +export function updateStudent(id, data) { + return request({ + url: `/students/${id}/`, + method: 'put', + data + }) +} + +export function deleteStudent(id) { + return request({ + url: `/students/${id}/`, + method: 'delete' + }) +} + +// Activities +export function getActivities(query) { + return request({ + url: '/activities/', + method: 'get', + params: query + }) +} + +export function createActivity(data) { + return request({ + url: '/activities/', + method: 'post', + data + }) +} + +export function updateActivity(id, data) { + return request({ + url: `/activities/${id}/`, + method: 'put', + data + }) +} + +export function deleteActivity(id) { + return request({ + url: `/activities/${id}/`, + method: 'delete' + }) +} + +// Showcases +export function getShowcases(query) { + return request({ + url: '/showcases/', + method: 'get', + params: query + }) +} + +export function createShowcase(data) { + return request({ + url: '/showcases/', + method: 'post', + data + }) +} + +export function updateShowcase(id, data) { + return request({ + url: `/showcases/${id}/`, + method: 'put', + data + }) +} + +export function deleteShowcase(id) { + return request({ + url: `/showcases/${id}/`, + method: 'delete' + }) +} + +// Exams +export function getExams(query) { + return request({ + url: '/exams/', + method: 'get', + params: query + }) +} + +export function createExam(data) { + return request({ + url: '/exams/', + method: 'post', + data + }) +} + +export function updateExam(id, data) { + return request({ + url: `/exams/${id}/`, + method: 'put', + data + }) +} + +export function deleteExam(id) { + return request({ + url: `/exams/${id}/`, + method: 'delete' + }) +} + +// Honors +export function getHonors(query) { + return request({ + url: '/student-honors/', + method: 'get', + params: query + }) +} + +export function createHonor(data) { + return request({ + url: '/student-honors/', + method: 'post', + data + }) +} + +export function updateHonor(id, data) { + return request({ + url: `/student-honors/${id}/`, + method: 'put', + data + }) +} + +export function deleteHonor(id) { + return request({ + url: `/student-honors/${id}/`, + method: 'delete' + }) +} + +// Levels +export function getLevels(query) { + return request({ + url: '/student-levels/', + method: 'get', + params: query + }) +} + +export function createLevel(data) { + return request({ + url: '/student-levels/', + method: 'post', + data + }) +} + +export function updateLevel(id, data) { + return request({ + url: `/student-levels/${id}/`, + method: 'put', + data + }) +} + +export function deleteLevel(id) { + return request({ + url: `/student-levels/${id}/`, + method: 'delete' + }) +} + +export function assignCouponToStudent(id, couponId) { + return request({ + url: `/students/${id}/assign_coupon/`, + method: 'post', + data: { coupon_id: couponId } + }) +} + diff --git a/admin/client/src/api/dict.js b/admin/client/src/api/dict.js new file mode 100644 index 0000000..d46429f --- /dev/null +++ b/admin/client/src/api/dict.js @@ -0,0 +1,57 @@ +import request from '@/utils/request' + +export function getDictTypeList(query) { + return request({ + url: '/system/dicttype/', + method: 'get', + params: query + }) +} +export function createDictType(data) { + return request({ + url: '/system/dicttype/', + method: 'post', + data + }) +} +export function updateDictType(id, data) { + return request({ + url: `/system/dicttype/${id}/`, + method: 'put', + data + }) +} +export function deleteDictType(id) { + return request({ + url: `/system/dicttype/${id}/`, + method: 'delete' + }) +} + +export function getDictList(query) { + return request({ + url: '/system/dict/', + method: 'get', + params: query + }) +} +export function createDict(data) { + return request({ + url: '/system/dict/', + method: 'post', + data + }) +} +export function updateDict(id, data) { + return request({ + url: `/system/dict/${id}/`, + method: 'put', + data + }) +} +export function deleteDict(id) { + return request({ + url: `/system/dict/${id}/`, + method: 'delete' + }) +} diff --git a/admin/client/src/api/file.js b/admin/client/src/api/file.js new file mode 100644 index 0000000..01c683e --- /dev/null +++ b/admin/client/src/api/file.js @@ -0,0 +1,18 @@ +import { getToken } from "@/utils/auth" +import request from '@/utils/request' + +export function upUrl() { + return process.env.VUE_APP_BASE_API + '/file/' +} + +export function upHeaders() { + return { Authorization: "Bearer " + getToken() } +} + +export function getFileList(query) { + return request({ + url: '/file/', + method: 'get', + params: query + }) +} \ No newline at end of file diff --git a/admin/client/src/api/moritor.js b/admin/client/src/api/moritor.js new file mode 100644 index 0000000..659ca27 --- /dev/null +++ b/admin/client/src/api/moritor.js @@ -0,0 +1,26 @@ +import { getToken } from "@/utils/auth" +import request from '@/utils/request' + +//查看日志列表 + +export function getlogList(query) { + return request({ + url: '/monitor/log/', + method: 'get', + params: query + }) +} +//查看日志详情 +export function getLog(name) { + return request({ + url: `/monitor/log/${name}/`, + method: 'get' + }) +} +//获取服务器状态信息 +export function getServerList() { + return request({ + url: '/monitor/server/', + method: 'get' + }) +} \ No newline at end of file diff --git a/admin/client/src/api/org.js b/admin/client/src/api/org.js new file mode 100644 index 0000000..2880ec4 --- /dev/null +++ b/admin/client/src/api/org.js @@ -0,0 +1,35 @@ +import request from '@/utils/request' + +export function getOrgAll() { + return request({ + url: '/system/organization/', + method: 'get' + }) +} +export function getOrgList(query) { + return request({ + url: '/system/organization/', + method: 'get', + params: query + }) +} +export function createOrg(data) { + return request({ + url: '/system/organization/', + method: 'post', + data + }) +} +export function updateOrg(id, data) { + return request({ + url: `/system/organization/${id}/`, + method: 'put', + data + }) +} +export function deleteOrg(id) { + return request({ + url: `/system/organization/${id}/`, + method: 'delete' + }) +} diff --git a/admin/client/src/api/perm.js b/admin/client/src/api/perm.js new file mode 100644 index 0000000..29ebf53 --- /dev/null +++ b/admin/client/src/api/perm.js @@ -0,0 +1,28 @@ +import request from '@/utils/request' + +export function getPermAll() { + return request({ + url: '/system/permission/', + method: 'get' + }) +} +export function createPerm(data) { + return request({ + url: '/system/permission/', + method: 'post', + data + }) +} +export function updatePerm(id, data) { + return request({ + url: `/system/permission/${id}/`, + method: 'put', + data + }) +} +export function deletePerm(id) { + return request({ + url: `/system/permission/${id}/`, + method: 'delete' + }) +} \ No newline at end of file diff --git a/admin/client/src/api/position.js b/admin/client/src/api/position.js new file mode 100644 index 0000000..2ea116f --- /dev/null +++ b/admin/client/src/api/position.js @@ -0,0 +1,31 @@ +import request from '@/utils/request' + +export function getPositionAll() { + return request({ + url: '/system/position/', + method: 'get' + }) +} + +export function createPosition(data) { + return request({ + url: '/system/position/', + method: 'post', + data + }) +} + +export function updatePosition(id, data) { + return request({ + url: `/system/position/${id}/`, + method: 'put', + data + }) +} + +export function deletePosition(id) { + return request({ + url: `/system/position/${id}/`, + method: 'delete' + }) +} diff --git a/admin/client/src/api/role.js b/admin/client/src/api/role.js new file mode 100644 index 0000000..e25e097 --- /dev/null +++ b/admin/client/src/api/role.js @@ -0,0 +1,38 @@ +import request from '@/utils/request' + +export function getRoutes() { + return request({ + url: '/system/permission/', + method: 'get' + }) +} + +export function getRoleAll() { + return request({ + url: '/system/role/', + method: 'get' + }) +} + +export function createRole(data) { + return request({ + url: '/system/role/', + method: 'post', + data + }) +} + +export function updateRole(id, data) { + return request({ + url: `/system/role/${id}/`, + method: 'put', + data + }) +} + +export function deleteRole(id) { + return request({ + url: `/system/role/${id}/`, + method: 'delete' + }) +} diff --git a/admin/client/src/api/table.js b/admin/client/src/api/table.js new file mode 100644 index 0000000..2752f52 --- /dev/null +++ b/admin/client/src/api/table.js @@ -0,0 +1,9 @@ +import request from '@/utils/request' + +export function getList(params) { + return request({ + url: '/vue-admin-template/table/list', + method: 'get', + params + }) +} diff --git a/admin/client/src/api/task.js b/admin/client/src/api/task.js new file mode 100644 index 0000000..1e3b397 --- /dev/null +++ b/admin/client/src/api/task.js @@ -0,0 +1,45 @@ +import request from '@/utils/request' + +export function getptaskList(query) { + return request({ + url: '/system/ptask/', + method: 'get', + params: query + }) +} + +export function getTaskAll() { + return request({ + url: '/system/task/', + method: 'get' + }) +} +export function createptask(data) { + return request({ + url: '/system/ptask/', + method: 'post', + data + }) +} + +export function updateptask(id, data) { + return request({ + url: `/system/ptask/${id}/`, + method: 'put', + data + }) +} + +export function toggletask(id) { + return request({ + url: `/system/ptask/${id}/toggle/`, + method: 'put' + }) +} + +export function deleteptask(id) { + return request({ + url: `/system/ptask/${id}/`, + method: 'delete' + }) +} \ No newline at end of file diff --git a/admin/client/src/api/user.js b/admin/client/src/api/user.js new file mode 100644 index 0000000..8edf3ab --- /dev/null +++ b/admin/client/src/api/user.js @@ -0,0 +1,70 @@ +import request from '@/utils/request' + +export function login(data) { + return request({ + url: '/token/', + method: 'post', + data + }) +} + +export function logout() { + return request({ + url: '/token/black/', + method: 'get' + }) +} + +export function getInfo() { + return request({ + url: '/system/user/info/', + method: 'get' + }) +} + +export function getUserList(query) { + return request({ + url: '/system/user/', + method: 'get', + params: query + }) +} + +export function getUser(id) { + return request({ + url: `/system/user/${id}/`, + method: 'get' + }) +} + +export function createUser(data) { + return request({ + url: '/system/user/', + method: 'post', + data + }) +} + +export function updateUser(id, data) { + return request({ + url: `/system/user/${id}/`, + method: 'put', + data + }) +} + +export function deleteUser(id, data) { + return request({ + url: `/system/user/${id}/`, + method: 'delete', + data + }) +} + +export function changePassword(data) { + return request({ + url: '/system/user/password/', + method: 'put', + data + }) +} diff --git a/admin/client/src/api/workflow.js b/admin/client/src/api/workflow.js new file mode 100644 index 0000000..f5a13de --- /dev/null +++ b/admin/client/src/api/workflow.js @@ -0,0 +1,258 @@ +import request from '@/utils/request' + +export function getWorkflowList(query) { + return request({ + url: '/wf/workflow/', + method: 'get', + params: query + }) +} +export function createWorkflow(data) { + return request({ + url: '/wf/workflow/', + method: 'post', + data + }) +} +export function updateWorkflow(id, data) { + return request({ + url: `/wf/workflow/${id}/`, + method: 'put', + data + }) +} +export function deleteWorkflow(id, data) { + return request({ + url: `/wf/workflow/${id}/`, + method: 'delete', + data + }) +} +//流转状态列表 +export function getWfStateList(id) { + return request({ + url: `/wf/workflow/${id}/states`, + method: 'get' + }) +} +//工单流转step +export function getWfFlowSteps(id) { + return request({ + url: `/wf/ticket/${id}/flowsteps/`, + method: 'get' + }) +} + +//流转状态创建 +export function createWfState(data) { + return request({ + url: '/wf/state/', + method: 'post', + data + }) +} +//处理工单 +export function ticketHandle(id,data) { + return request({ + url: `/wf/ticket/${id}/handle/`, + method: 'post', + data + }) +} + +//流转状态更新 +export function updateWfState(id, data) { + return request({ + url: `/wf/state/${id}/`, + method: 'put', + data + }) +} +//流转状态删除 +export function deleteWfState(id, data) { + return request({ + url: `/wf/state/${id}/`, + method: 'delete', + data + }) +} +//自定义字段列表 +export function getWfCustomfieldList(id) { + return request({ + url: `/wf/workflow/${id}/customfields`, + method: 'get' + }) +} +//自定义字段创建 +export function createWfCustomfield(data) { + return request({ + url: '/wf/customfield/', + method: 'post', + data + }) +} +//自定义字段更新 +export function updateWfCustomfield(id, data) { + return request({ + url: `/wf/customfield/${id}/`, + method: 'put', + data + }) +} +//自定义字段删除 +export function deleteWfCustomfield(id, data) { + return request({ + url: `/wf/customfield/${id}/`, + method: 'delete', + data + }) +} +//流转列表 +export function getWfTransitionList(id) { + return request({ + url: `/wf/workflow/${id}/transitions/`, + method: 'get' + }) +} +//流转创建 +export function createWfTransition(data) { + return request({ + url: '/wf/transition/', + method: 'post', + data + }) +} +//流转更新 +export function updateWfTransition(id, data) { + return request({ + url: `/wf/transition/${id}/`, + method: 'put', + data + }) +} +//流转删除 +export function deleteWfTransition(id, data) { + return request({ + url: `/wf/transition/${id}/`, + method: 'delete', + data + }) +} +//工单列表 +export function getTickets(query) { + return request({ + url: `/wf/ticket/`, + method: 'get', + params:query + }) +} +//新建工单 +export function createTicket(data) { + return request({ + url: '/wf/ticket/', + method: 'post', + data + }) +} + //详情 +export function ticketread(id) { + return request({ + url: `/wf/ticket/${id}/`, + method: 'get', + + }) + +} +//接单 +export function ticketAccpet(id,data) { + return request({ + url: `/wf/ticket/${id}/accpet/`, + method: 'post', + data + }) +} +//撤回工单,允许创建人在指定状态撤回工单至初始状态 +export function ticketRetreat(id,data) { + return request({ + url: `/wf/ticket/${id}/retreat/`, + method: 'post', + data + }) +} +//关闭工单,仅允许创建人在初始状态关闭工单 +export function ticketAddNode(id,data) { + return request({ + url: `/wf/ticket/${id}/add_node/`, + method: 'post', + data + }) +} +//加签 +export function ticketClose(id,data) { + return request({ + url: `/wf/ticket/${id}/close/`, + method: 'post', + data + }) +} +//加签 +export function ticketAddNodeEnd(id,data) { + return request({ + url: `/wf/ticket/${id}/add_node_end/`, + method: 'post', + data + }) +} +//工单删除 +export function ticketDestory(data) { + return request({ + url: `/wf/ticket/destory/`, + method: 'post', + data + }) +} +//工单详情 +export function getTicketDetail(id) { + return request({ + url: `/wf/ticket/${id}/`, + method: 'get' + }) +} + +//工单流转 +export function getTicketTransitions(id) { + return request({ + url: `/wf/ticket/${id}/transitions/`, + method: 'get' + }) +} + +//工单流转记录 +export function getTicketFlowlog(id) { + return request({ + url: `/wf/ticket/${id}/flowlogs/`, + method: 'get' + }) +} +//工单代办数量 +export function getCount(data) { + return request({ + url: `/wf/ticket/duty_agg/`, + method: 'get', + params:data + }) +} +//工单代办数量 +export function getCodes() { + return request({ + url: `/wf/participant_from_code`, + method: 'get' + }) +} +//工单详情 +export function getWorkflowInit(id) { + return request({ + url: `/wf/workflow/${id}/init/`, + method: 'get' + }) +} diff --git a/admin/client/src/assets/404_images/404.png b/admin/client/src/assets/404_images/404.png new file mode 100644 index 0000000000000000000000000000000000000000..3d8e2305cc973ad2121403aee4bf08728f76c461 GIT binary patch literal 98071 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 literal 0 HcmV?d00001 diff --git a/admin/client/src/assets/404_images/404_cloud.png b/admin/client/src/assets/404_images/404_cloud.png new file mode 100644 index 0000000000000000000000000000000000000000..c6281d09013e0a2c5f8e699a0a6038d9480291e5 GIT binary patch literal 4766 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 literal 0 HcmV?d00001 diff --git a/admin/client/src/components/Breadcrumb/index.vue b/admin/client/src/components/Breadcrumb/index.vue new file mode 100644 index 0000000..e65a60d --- /dev/null +++ b/admin/client/src/components/Breadcrumb/index.vue @@ -0,0 +1,78 @@ + + + + + diff --git a/admin/client/src/components/Hamburger/index.vue b/admin/client/src/components/Hamburger/index.vue new file mode 100644 index 0000000..368b002 --- /dev/null +++ b/admin/client/src/components/Hamburger/index.vue @@ -0,0 +1,44 @@ + + + + + diff --git a/admin/client/src/components/Pagination/index.vue b/admin/client/src/components/Pagination/index.vue new file mode 100644 index 0000000..e316e20 --- /dev/null +++ b/admin/client/src/components/Pagination/index.vue @@ -0,0 +1,101 @@ + + + + + diff --git a/admin/client/src/components/SvgIcon/index.vue b/admin/client/src/components/SvgIcon/index.vue new file mode 100644 index 0000000..9a3318e --- /dev/null +++ b/admin/client/src/components/SvgIcon/index.vue @@ -0,0 +1,62 @@ + + + + + diff --git a/admin/client/src/directive/el-table/adaptive.js b/admin/client/src/directive/el-table/adaptive.js new file mode 100644 index 0000000..298daea --- /dev/null +++ b/admin/client/src/directive/el-table/adaptive.js @@ -0,0 +1,42 @@ +import { addResizeListener, removeResizeListener } from 'element-ui/src/utils/resize-event' + +/** + * How to use + * ... + * el-table height is must be set + * bottomOffset: 30(default) // The height of the table from the bottom of the page. + */ + +const doResize = (el, binding, vnode) => { + const { componentInstance: $table } = vnode + + const { value } = binding + + if (!$table.height) { + throw new Error(`el-$table must set the height. Such as height='100px'`) + } + const bottomOffset = (value && value.bottomOffset) || 30 + + if (!$table) return + + const height = window.innerHeight - el.getBoundingClientRect().top - bottomOffset + $table.$nextTick(() => { + $table.layout.setHeight(height) + }) +} + +export default { + bind(el, binding, vnode) { + el.resizeListener = () => { + doResize(el, binding, vnode) + } + // parameter 1 is must be "Element" type + addResizeListener(window.document.body, el.resizeListener) + }, + inserted(el, binding, vnode) { + doResize(el, binding, vnode) + }, + unbind(el) { + removeResizeListener(window.document.body, el.resizeListener) + } +} diff --git a/admin/client/src/directive/el-table/index.js b/admin/client/src/directive/el-table/index.js new file mode 100644 index 0000000..d3d4515 --- /dev/null +++ b/admin/client/src/directive/el-table/index.js @@ -0,0 +1,13 @@ +import adaptive from './adaptive' + +const install = function(Vue) { + Vue.directive('el-height-adaptive-table', adaptive) +} + +if (window.Vue) { + window['el-height-adaptive-table'] = adaptive + Vue.use(install); // eslint-disable-line +} + +adaptive.install = install +export default adaptive diff --git a/admin/client/src/icons/index.js b/admin/client/src/icons/index.js new file mode 100644 index 0000000..2c6b309 --- /dev/null +++ b/admin/client/src/icons/index.js @@ -0,0 +1,9 @@ +import Vue from 'vue' +import SvgIcon from '@/components/SvgIcon'// svg component + +// register globally +Vue.component('svg-icon', SvgIcon) + +const req = require.context('./svg', false, /\.svg$/) +const requireAll = requireContext => requireContext.keys().map(requireContext) +requireAll(req) diff --git a/admin/client/src/icons/svg/404.svg b/admin/client/src/icons/svg/404.svg new file mode 100644 index 0000000..6df5019 --- /dev/null +++ b/admin/client/src/icons/svg/404.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/client/src/icons/svg/bug.svg b/admin/client/src/icons/svg/bug.svg new file mode 100644 index 0000000..05a150d --- /dev/null +++ b/admin/client/src/icons/svg/bug.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/client/src/icons/svg/chart.svg b/admin/client/src/icons/svg/chart.svg new file mode 100644 index 0000000..27728fb --- /dev/null +++ b/admin/client/src/icons/svg/chart.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/client/src/icons/svg/clipboard.svg b/admin/client/src/icons/svg/clipboard.svg new file mode 100644 index 0000000..90923ff --- /dev/null +++ b/admin/client/src/icons/svg/clipboard.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/client/src/icons/svg/component.svg b/admin/client/src/icons/svg/component.svg new file mode 100644 index 0000000..207ada3 --- /dev/null +++ b/admin/client/src/icons/svg/component.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/client/src/icons/svg/dashboard.svg b/admin/client/src/icons/svg/dashboard.svg new file mode 100644 index 0000000..5317d37 --- /dev/null +++ b/admin/client/src/icons/svg/dashboard.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/client/src/icons/svg/documentation.svg b/admin/client/src/icons/svg/documentation.svg new file mode 100644 index 0000000..7043122 --- /dev/null +++ b/admin/client/src/icons/svg/documentation.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/client/src/icons/svg/drag.svg b/admin/client/src/icons/svg/drag.svg new file mode 100644 index 0000000..4185d3c --- /dev/null +++ b/admin/client/src/icons/svg/drag.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/client/src/icons/svg/edit.svg b/admin/client/src/icons/svg/edit.svg new file mode 100644 index 0000000..d26101f --- /dev/null +++ b/admin/client/src/icons/svg/edit.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/client/src/icons/svg/education.svg b/admin/client/src/icons/svg/education.svg new file mode 100644 index 0000000..7bfb01d --- /dev/null +++ b/admin/client/src/icons/svg/education.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/client/src/icons/svg/email.svg b/admin/client/src/icons/svg/email.svg new file mode 100644 index 0000000..74d25e2 --- /dev/null +++ b/admin/client/src/icons/svg/email.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/client/src/icons/svg/example.svg b/admin/client/src/icons/svg/example.svg new file mode 100644 index 0000000..46f42b5 --- /dev/null +++ b/admin/client/src/icons/svg/example.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/client/src/icons/svg/excel.svg b/admin/client/src/icons/svg/excel.svg new file mode 100644 index 0000000..74d97b8 --- /dev/null +++ b/admin/client/src/icons/svg/excel.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/client/src/icons/svg/exit-fullscreen.svg b/admin/client/src/icons/svg/exit-fullscreen.svg new file mode 100644 index 0000000..485c128 --- /dev/null +++ b/admin/client/src/icons/svg/exit-fullscreen.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/client/src/icons/svg/eye-open.svg b/admin/client/src/icons/svg/eye-open.svg new file mode 100644 index 0000000..88dcc98 --- /dev/null +++ b/admin/client/src/icons/svg/eye-open.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/client/src/icons/svg/eye.svg b/admin/client/src/icons/svg/eye.svg new file mode 100644 index 0000000..16ed2d8 --- /dev/null +++ b/admin/client/src/icons/svg/eye.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/client/src/icons/svg/form.svg b/admin/client/src/icons/svg/form.svg new file mode 100644 index 0000000..dcbaa18 --- /dev/null +++ b/admin/client/src/icons/svg/form.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/client/src/icons/svg/fullscreen.svg b/admin/client/src/icons/svg/fullscreen.svg new file mode 100644 index 0000000..0e86b6f --- /dev/null +++ b/admin/client/src/icons/svg/fullscreen.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/client/src/icons/svg/guide.svg b/admin/client/src/icons/svg/guide.svg new file mode 100644 index 0000000..b271001 --- /dev/null +++ b/admin/client/src/icons/svg/guide.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/client/src/icons/svg/icon.svg b/admin/client/src/icons/svg/icon.svg new file mode 100644 index 0000000..82be8ee --- /dev/null +++ b/admin/client/src/icons/svg/icon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/client/src/icons/svg/international.svg b/admin/client/src/icons/svg/international.svg new file mode 100644 index 0000000..e9b56ee --- /dev/null +++ b/admin/client/src/icons/svg/international.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/client/src/icons/svg/language.svg b/admin/client/src/icons/svg/language.svg new file mode 100644 index 0000000..0082b57 --- /dev/null +++ b/admin/client/src/icons/svg/language.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/client/src/icons/svg/link.svg b/admin/client/src/icons/svg/link.svg new file mode 100644 index 0000000..48197ba --- /dev/null +++ b/admin/client/src/icons/svg/link.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/client/src/icons/svg/list.svg b/admin/client/src/icons/svg/list.svg new file mode 100644 index 0000000..20259ed --- /dev/null +++ b/admin/client/src/icons/svg/list.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/client/src/icons/svg/lock.svg b/admin/client/src/icons/svg/lock.svg new file mode 100644 index 0000000..74fee54 --- /dev/null +++ b/admin/client/src/icons/svg/lock.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/client/src/icons/svg/message.svg b/admin/client/src/icons/svg/message.svg new file mode 100644 index 0000000..14ca817 --- /dev/null +++ b/admin/client/src/icons/svg/message.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/client/src/icons/svg/money.svg b/admin/client/src/icons/svg/money.svg new file mode 100644 index 0000000..c1580de --- /dev/null +++ b/admin/client/src/icons/svg/money.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/client/src/icons/svg/nested.svg b/admin/client/src/icons/svg/nested.svg new file mode 100644 index 0000000..06713a8 --- /dev/null +++ b/admin/client/src/icons/svg/nested.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/client/src/icons/svg/password.svg b/admin/client/src/icons/svg/password.svg new file mode 100644 index 0000000..e291d85 --- /dev/null +++ b/admin/client/src/icons/svg/password.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/client/src/icons/svg/pdf.svg b/admin/client/src/icons/svg/pdf.svg new file mode 100644 index 0000000..957aa0c --- /dev/null +++ b/admin/client/src/icons/svg/pdf.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/client/src/icons/svg/people.svg b/admin/client/src/icons/svg/people.svg new file mode 100644 index 0000000..2bd54ae --- /dev/null +++ b/admin/client/src/icons/svg/people.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/client/src/icons/svg/peoples.svg b/admin/client/src/icons/svg/peoples.svg new file mode 100644 index 0000000..aab852e --- /dev/null +++ b/admin/client/src/icons/svg/peoples.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/client/src/icons/svg/position.svg b/admin/client/src/icons/svg/position.svg new file mode 100644 index 0000000..f89f0e0 --- /dev/null +++ b/admin/client/src/icons/svg/position.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/client/src/icons/svg/qq.svg b/admin/client/src/icons/svg/qq.svg new file mode 100644 index 0000000..ee13d4e --- /dev/null +++ b/admin/client/src/icons/svg/qq.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/client/src/icons/svg/search.svg b/admin/client/src/icons/svg/search.svg new file mode 100644 index 0000000..84233dd --- /dev/null +++ b/admin/client/src/icons/svg/search.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/client/src/icons/svg/shopping.svg b/admin/client/src/icons/svg/shopping.svg new file mode 100644 index 0000000..87513e7 --- /dev/null +++ b/admin/client/src/icons/svg/shopping.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/client/src/icons/svg/size.svg b/admin/client/src/icons/svg/size.svg new file mode 100644 index 0000000..ddb25b8 --- /dev/null +++ b/admin/client/src/icons/svg/size.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/client/src/icons/svg/skill.svg b/admin/client/src/icons/svg/skill.svg new file mode 100644 index 0000000..a3b7312 --- /dev/null +++ b/admin/client/src/icons/svg/skill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/client/src/icons/svg/star.svg b/admin/client/src/icons/svg/star.svg new file mode 100644 index 0000000..6cf86e6 --- /dev/null +++ b/admin/client/src/icons/svg/star.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/client/src/icons/svg/tab.svg b/admin/client/src/icons/svg/tab.svg new file mode 100644 index 0000000..b4b48e4 --- /dev/null +++ b/admin/client/src/icons/svg/tab.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/client/src/icons/svg/table.svg b/admin/client/src/icons/svg/table.svg new file mode 100644 index 0000000..0e3dc9d --- /dev/null +++ b/admin/client/src/icons/svg/table.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/client/src/icons/svg/theme.svg b/admin/client/src/icons/svg/theme.svg new file mode 100644 index 0000000..5982a2f --- /dev/null +++ b/admin/client/src/icons/svg/theme.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/client/src/icons/svg/tree-table.svg b/admin/client/src/icons/svg/tree-table.svg new file mode 100644 index 0000000..8aafdb8 --- /dev/null +++ b/admin/client/src/icons/svg/tree-table.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/client/src/icons/svg/tree.svg b/admin/client/src/icons/svg/tree.svg new file mode 100644 index 0000000..dd4b7dd --- /dev/null +++ b/admin/client/src/icons/svg/tree.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/client/src/icons/svg/user.svg b/admin/client/src/icons/svg/user.svg new file mode 100644 index 0000000..0ba0716 --- /dev/null +++ b/admin/client/src/icons/svg/user.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/client/src/icons/svg/wechat.svg b/admin/client/src/icons/svg/wechat.svg new file mode 100644 index 0000000..c586e55 --- /dev/null +++ b/admin/client/src/icons/svg/wechat.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/client/src/icons/svg/zip.svg b/admin/client/src/icons/svg/zip.svg new file mode 100644 index 0000000..f806fc4 --- /dev/null +++ b/admin/client/src/icons/svg/zip.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/admin/client/src/icons/svgo.yml b/admin/client/src/icons/svgo.yml new file mode 100644 index 0000000..d11906a --- /dev/null +++ b/admin/client/src/icons/svgo.yml @@ -0,0 +1,22 @@ +# replace default config + +# multipass: true +# full: true + +plugins: + + # - name + # + # or: + # - name: false + # - name: true + # + # or: + # - name: + # param1: 1 + # param2: 2 + +- removeAttrs: + attrs: + - 'fill' + - 'fill-rule' diff --git a/admin/client/src/layout/components/AppMain.vue b/admin/client/src/layout/components/AppMain.vue new file mode 100644 index 0000000..f6a3286 --- /dev/null +++ b/admin/client/src/layout/components/AppMain.vue @@ -0,0 +1,40 @@ + + + + + + + diff --git a/admin/client/src/layout/components/Navbar.vue b/admin/client/src/layout/components/Navbar.vue new file mode 100644 index 0000000..d9379ab --- /dev/null +++ b/admin/client/src/layout/components/Navbar.vue @@ -0,0 +1,148 @@ + + + + + diff --git a/admin/client/src/layout/components/Sidebar/FixiOSBug.js b/admin/client/src/layout/components/Sidebar/FixiOSBug.js new file mode 100644 index 0000000..bc14856 --- /dev/null +++ b/admin/client/src/layout/components/Sidebar/FixiOSBug.js @@ -0,0 +1,26 @@ +export default { + computed: { + device() { + return this.$store.state.app.device + } + }, + mounted() { + // In order to fix the click on menu on the ios device will trigger the mouseleave bug + // https://github.com/PanJiaChen/vue-element-admin/issues/1135 + this.fixBugIniOS() + }, + methods: { + fixBugIniOS() { + const $subMenu = this.$refs.subMenu + if ($subMenu) { + const handleMouseleave = $subMenu.handleMouseleave + $subMenu.handleMouseleave = (e) => { + if (this.device === 'mobile') { + return + } + handleMouseleave(e) + } + } + } + } +} diff --git a/admin/client/src/layout/components/Sidebar/Item.vue b/admin/client/src/layout/components/Sidebar/Item.vue new file mode 100644 index 0000000..b515f61 --- /dev/null +++ b/admin/client/src/layout/components/Sidebar/Item.vue @@ -0,0 +1,29 @@ + diff --git a/admin/client/src/layout/components/Sidebar/Link.vue b/admin/client/src/layout/components/Sidebar/Link.vue new file mode 100644 index 0000000..eb4dd10 --- /dev/null +++ b/admin/client/src/layout/components/Sidebar/Link.vue @@ -0,0 +1,36 @@ + + + + diff --git a/admin/client/src/layout/components/Sidebar/Logo.vue b/admin/client/src/layout/components/Sidebar/Logo.vue new file mode 100644 index 0000000..7121590 --- /dev/null +++ b/admin/client/src/layout/components/Sidebar/Logo.vue @@ -0,0 +1,82 @@ + + + + + diff --git a/admin/client/src/layout/components/Sidebar/SidebarItem.vue b/admin/client/src/layout/components/Sidebar/SidebarItem.vue new file mode 100644 index 0000000..a418c3d --- /dev/null +++ b/admin/client/src/layout/components/Sidebar/SidebarItem.vue @@ -0,0 +1,95 @@ + + + diff --git a/admin/client/src/layout/components/Sidebar/index.vue b/admin/client/src/layout/components/Sidebar/index.vue new file mode 100644 index 0000000..fb014a2 --- /dev/null +++ b/admin/client/src/layout/components/Sidebar/index.vue @@ -0,0 +1,54 @@ + + + diff --git a/admin/client/src/layout/components/index.js b/admin/client/src/layout/components/index.js new file mode 100644 index 0000000..97ee3cd --- /dev/null +++ b/admin/client/src/layout/components/index.js @@ -0,0 +1,3 @@ +export { default as Navbar } from './Navbar' +export { default as Sidebar } from './Sidebar' +export { default as AppMain } from './AppMain' diff --git a/admin/client/src/layout/index.vue b/admin/client/src/layout/index.vue new file mode 100644 index 0000000..db22a7b --- /dev/null +++ b/admin/client/src/layout/index.vue @@ -0,0 +1,93 @@ + + + + + diff --git a/admin/client/src/layout/mixin/ResizeHandler.js b/admin/client/src/layout/mixin/ResizeHandler.js new file mode 100644 index 0000000..e8d0df8 --- /dev/null +++ b/admin/client/src/layout/mixin/ResizeHandler.js @@ -0,0 +1,45 @@ +import store from '@/store' + +const { body } = document +const WIDTH = 992 // refer to Bootstrap's responsive design + +export default { + watch: { + $route(route) { + if (this.device === 'mobile' && this.sidebar.opened) { + store.dispatch('app/closeSideBar', { withoutAnimation: false }) + } + } + }, + beforeMount() { + window.addEventListener('resize', this.$_resizeHandler) + }, + beforeDestroy() { + window.removeEventListener('resize', this.$_resizeHandler) + }, + mounted() { + const isMobile = this.$_isMobile() + if (isMobile) { + store.dispatch('app/toggleDevice', 'mobile') + store.dispatch('app/closeSideBar', { withoutAnimation: true }) + } + }, + methods: { + // use $_ for mixins properties + // https://vuejs.org/v2/style-guide/index.html#Private-property-names-essential + $_isMobile() { + const rect = body.getBoundingClientRect() + return rect.width - 1 < WIDTH + }, + $_resizeHandler() { + if (!document.hidden) { + const isMobile = this.$_isMobile() + store.dispatch('app/toggleDevice', isMobile ? 'mobile' : 'desktop') + + if (isMobile) { + store.dispatch('app/closeSideBar', { withoutAnimation: true }) + } + } + } + } +} diff --git a/admin/client/src/main.js b/admin/client/src/main.js new file mode 100644 index 0000000..701c67a --- /dev/null +++ b/admin/client/src/main.js @@ -0,0 +1,44 @@ +import Vue from 'vue' + +import 'normalize.css/normalize.css' // A modern alternative to CSS resets + +import ElementUI from 'element-ui' +import 'element-ui/lib/theme-chalk/index.css' +// import locale from 'element-ui/lib/locale/lang/en' // lang i18n + +import '@/styles/index.scss' // global css + +import App from './App' +import store from './store' +import router from './router' + +import '@/icons' // icon +import '@/permission' // permission control +import tableHeight from '@/directive/el-table/index' +Vue.use(tableHeight) +/** + * If you don't want to use mock-server + * you want to use MockJs for mock api + * you can execute: mockXHR() + * + * Currently MockJs will be used in the production environment, + * please remove it before going online ! ! ! + */ +if (process.env.NODE_ENV === 'production') { + const { mockXHR } = require('../mock') + mockXHR() +} + +// set ElementUI lang to EN +// Vue.use(ElementUI, { locale }) +// 如果想要中文版 element-ui,按如下方式声明 +Vue.use(ElementUI, { size: 'medium' }) +Vue.config.productionTip = false + + +new Vue({ + el: '#app', + router, + store, + render: h => h(App) +}) diff --git a/admin/client/src/permission.js b/admin/client/src/permission.js new file mode 100644 index 0000000..d4a08b6 --- /dev/null +++ b/admin/client/src/permission.js @@ -0,0 +1,73 @@ +import router from './router' +import store from './store' +import { Message } from 'element-ui' +import NProgress from 'nprogress' // progress bar +import 'nprogress/nprogress.css' // progress bar style +import { getToken } from '@/utils/auth' // get token from cookie +import getPageTitle from '@/utils/get-page-title' + +NProgress.configure({ showSpinner: false }) // NProgress Configuration + +const whiteList = ['/login'] // no redirect whitelist + +router.beforeEach(async(to, from, next) => { + // start progress bar + NProgress.start() + + // set page title + document.title = getPageTitle(to.meta.title) + + // determine whether the user has logged in + const hasToken = getToken() + + if (hasToken) { + if (to.path === '/login') { + // if is logged in, redirect to the home page + next({ path: '/' }) + NProgress.done() + } else { + // determine whether the user has obtained his permission perms through getInfo + const hasPerms = store.getters.perms && store.getters.perms.length > 0 + if (hasPerms) { + next() + } else { + try { + // get user info + // note: perms must be a object array! such as: ['admin'] or ,['developer','editor'] + const { perms } = await store.dispatch('user/getInfo') + // generate accessible routes map based on perms + const accessRoutes = await store.dispatch('permission/generateRoutes', perms) + + // dynamically add accessible routes + router.addRoutes(accessRoutes) + + // hack method to ensure that addRoutes is complete + // set the replace: true, so the navigation will not leave a history record + next({ ...to, replace: true }) + } catch (error) { + // remove token and go to login page to re-login + await store.dispatch('user/resetToken') + Message.error(error || 'Has Error') + next(`/login?redirect=${to.path}`) + NProgress.done() + } + } + } + } else { + /* has no token*/ + + if (whiteList.indexOf(to.path) !== -1) { + // in the free login whitelist, go directly + next() + } else { + // other pages that do not have permission to access are redirected to the login page. + next(`/login?redirect=${to.path}`) + NProgress.done() + } + } +}) + +router.afterEach(() => { + // finish progress bar + NProgress.done() +}) diff --git a/admin/client/src/router/index.js b/admin/client/src/router/index.js new file mode 100644 index 0000000..1af5570 --- /dev/null +++ b/admin/client/src/router/index.js @@ -0,0 +1,267 @@ +import Vue from 'vue' +import Router from 'vue-router' + +Vue.use(Router) + +/* Layout */ +import Layout from '@/layout' + +/** + * Note: sub-menu only appear when route children.length >= 1 + * Detail see: https://panjiachen.github.io/vue-element-admin-site/guide/essentials/router-and-nav.html + * + * hidden: true if set true, item will not show in the sidebar(default is false) + * alwaysShow: true if set true, will always show the root menu + * if not set alwaysShow, when item has more than one children route, + * it will becomes nested mode, otherwise not show the root menu + * redirect: noRedirect if set noRedirect will no redirect in the breadcrumb + * name:'router-name' the name is used by (must set!!!) + * meta : { + perms: ['admin','editor'] control the page perms (you can set multiple perms) + title: 'title' the name show in sidebar and breadcrumb (recommend set) + icon: 'svg-name' the icon show in the sidebar + breadcrumb: false if set false, the item will hidden in breadcrumb(default is true) + activeMenu: '/example/list' if set path, the sidebar will highlight the path you set + } + */ + +/** + * constantRoutes + * a base page that does not have permission requirements + * all perms can be accessed + */ +export const constantRoutes = [ + { + path: '/login', + component: () => import('@/views/login/index'), + hidden: true + }, + + { + path: '/404', + component: () => import('@/views/404'), + hidden: true + }, + { + path: '/', + component: Layout, + redirect: '/dashboard', + children: [{ + path: 'dashboard', + name: 'Dashboard', + component: () => import('@/views/dashboard/index'), + meta: { title: '首页', icon: 'dashboard' } + }] + }, + { + path: '/changepassword', + component: Layout, + redirect: '/changepassword', + name: 'ChangePW', + meta: { title: '修改密码', icon: 'tree' }, + hidden:true, + children: [ + { + path: '', + name: 'ChangePassword', + component: () => import('@/views/system/changepassword'), + meta: { title: '修改密码', noCache: true, icon: ''}, + hidden: true + }, + ] + }, + +] + +/** + * asyncRoutes + * the routes that need to be dynamically loaded based on user perms + */ +export const asyncRoutes = [ + { + path: '/crm', + component: Layout, + redirect: '/crm/projects', + name: 'CRM', + meta: { title: '小程序管理', icon: 'wechat' }, + children: [ + { + path: 'projects', + name: 'Projects', + component: () => import('@/views/crm/project'), + meta: { title: '项目课程', icon: 'list' } + }, + { + path: 'activities', + name: 'Activities', + component: () => import('@/views/crm/activity'), + meta: { title: '演出活动', icon: 'component' } + }, + { + path: 'showcases', + name: 'Showcases', + component: () => import('@/views/crm/showcase'), + meta: { title: '精彩节目', icon: 'eye-open' } + }, + { + path: 'exams', + name: 'Exams', + component: () => import('@/views/crm/exam'), + meta: { title: '考级管理', icon: 'edit' } + }, + { + path: 'honors', + name: 'Honors', + component: () => import('@/views/crm/honor'), + meta: { title: '学员荣誉', icon: 'star' } + }, + { + path: 'coupons', + name: 'Coupons', + component: () => import('@/views/crm/coupon'), + meta: { title: '优惠券管理', icon: 'money' } + }, + { + path: 'banners', + name: 'Banners', + component: () => import('@/views/crm/banner'), + meta: { title: '轮播图管理', icon: 'drag' } + }, + { + path: 'students', + name: 'Students', + component: () => import('@/views/crm/student'), + meta: { title: '学员信息', icon: 'peoples' } + } + ] + }, + { + path: '/system', + component: Layout, + redirect: '/system/user', + name: 'System', + meta: { title: '系统管理', icon: 'example', perms: ['system_manage'] }, + children: [ + { + path: 'user', + name: 'User', + component: () => import('@/views/system/user.vue'), + meta: { title: '用户管理', icon: 'user', perms: ['user_manage'] } + }, + { + path: 'organization', + name: 'Organization', + component: () => import('@/views/system/organization'), + meta: { title: '部门管理', icon: 'tree', perms: ['org_manage'] } + }, + { + path: 'role', + name: 'Role', + component: () => import('@/views/system/role'), + meta: { title: '角色管理', icon: 'lock', perms: ['role_manage'] } + }, + { + path: 'position', + name: 'Postion', + component: () => import('@/views/system/position'), + meta: { title: '岗位管理', icon: 'position', perms: ['position_manage'] } + }, + { + path: 'dict', + name: 'Dict', + component: () => import('@/views/system/dict'), + meta: { title: '数据字典', icon: 'example', perms: ['dict_manage'] } + }, + { + path: 'file', + name: 'File', + component: () => import('@/views/system/file'), + meta: { title: '文件库', icon: 'documentation', perms: ['file_room'] } + }, + { + path: 'task', + name: 'Task', + component: () => import('@/views/system/task'), + meta: { title: '定时任务', icon: 'list', perms: ['ptask_manage'] } + } + ] + }, + { + path: '/monitor', + component: Layout, + redirect: '/monitor/service', + name: 'Monitor', + meta: { title: '系统监控', icon: 'example', perms: ['monitor_set'] }, + children: [ + { + path: 'service', + name: 'service', + component: () => import('@/views/monitor/service'), + meta: { title: '服务监控', icon: 'example', perms: ['service_manage'] } + } + ] + }, + { + path: '/develop', + component: Layout, + redirect: '/develop/perm', + name: 'Develop', + meta: { title: '开发配置', icon: 'example', perms: ['dev_set'] }, + children: [ + { + path: 'perm', + name: 'Perm', + component: () => import('@/views/system/perm'), + meta: { title: '权限菜单', icon: 'example', perms: ['perm_manage'] } + }, + { + path: 'form-gen-link', + component: Layout, + children: [ + { + path: 'https://jakhuang.github.io/form-generator/', + meta: { title: '表单设计器', icon: 'link', perms: ['dev_form_gen'] } + } + ] + }, + { + path: 'docs', + component: Layout, + children: [ + { + path: process.env.VUE_APP_BASE_API + '/redoc/', + meta: { title: '接口文档', icon: 'link', perms: ['dev_docs'] } + } + ] + }, + { + path: 'swagger', + component: Layout, + children: [ + { + path: process.env.VUE_APP_BASE_API + '/swagger/', + meta: { title: 'Swagger文档', icon: 'link', perms: ['dev_docs'] } + } + ] + } + ] + }, + // 404 page must be placed at the end !!! + { path: '*', redirect: '/404', hidden: true } +] + +const createRouter = () => new Router({ + // mode: 'history', // require service support + scrollBehavior: () => ({ y: 0 }), + routes: constantRoutes +}) + +const router = createRouter() + +// Detail see: https://github.com/vuejs/vue-router/issues/1234#issuecomment-357941465 +export function resetRouter() { + const newRouter = createRouter() + router.matcher = newRouter.matcher // reset router +} + +export default router diff --git a/admin/client/src/settings.js b/admin/client/src/settings.js new file mode 100644 index 0000000..585109b --- /dev/null +++ b/admin/client/src/settings.js @@ -0,0 +1,16 @@ +module.exports = { + + title: '管理系统', + + /** + * @type {boolean} true | false + * @description Whether fix the header + */ + fixedHeader: false, + + /** + * @type {boolean} true | false + * @description Whether show the logo in sidebar + */ + sidebarLogo: true +} diff --git a/admin/client/src/store/getters.js b/admin/client/src/store/getters.js new file mode 100644 index 0000000..1854b88 --- /dev/null +++ b/admin/client/src/store/getters.js @@ -0,0 +1,10 @@ +const getters = { + sidebar: state => state.app.sidebar, + device: state => state.app.device, + token: state => state.user.token, + avatar: state => state.user.avatar, + name: state => state.user.name, + perms: state => state.user.perms, + permission_routes: state => state.permission.routes +} +export default getters diff --git a/admin/client/src/store/index.js b/admin/client/src/store/index.js new file mode 100644 index 0000000..6ae5dad --- /dev/null +++ b/admin/client/src/store/index.js @@ -0,0 +1,21 @@ +import Vue from 'vue' +import Vuex from 'vuex' +import getters from './getters' +import app from './modules/app' +import permission from './modules/permission' +import settings from './modules/settings' +import user from './modules/user' + +Vue.use(Vuex) + +const store = new Vuex.Store({ + modules: { + app, + permission, + settings, + user + }, + getters +}) + +export default store diff --git a/admin/client/src/store/modules/app.js b/admin/client/src/store/modules/app.js new file mode 100644 index 0000000..7ea7e33 --- /dev/null +++ b/admin/client/src/store/modules/app.js @@ -0,0 +1,48 @@ +import Cookies from 'js-cookie' + +const state = { + sidebar: { + opened: Cookies.get('sidebarStatus') ? !!+Cookies.get('sidebarStatus') : true, + withoutAnimation: false + }, + device: 'desktop' +} + +const mutations = { + TOGGLE_SIDEBAR: state => { + state.sidebar.opened = !state.sidebar.opened + state.sidebar.withoutAnimation = false + if (state.sidebar.opened) { + Cookies.set('sidebarStatus', 1) + } else { + Cookies.set('sidebarStatus', 0) + } + }, + CLOSE_SIDEBAR: (state, withoutAnimation) => { + Cookies.set('sidebarStatus', 0) + state.sidebar.opened = false + state.sidebar.withoutAnimation = withoutAnimation + }, + TOGGLE_DEVICE: (state, device) => { + state.device = device + } +} + +const actions = { + toggleSideBar({ commit }) { + commit('TOGGLE_SIDEBAR') + }, + closeSideBar({ commit }, { withoutAnimation }) { + commit('CLOSE_SIDEBAR', withoutAnimation) + }, + toggleDevice({ commit }, device) { + commit('TOGGLE_DEVICE', device) + } +} + +export default { + namespaced: true, + state, + mutations, + actions +} diff --git a/admin/client/src/store/modules/permission.js b/admin/client/src/store/modules/permission.js new file mode 100644 index 0000000..1ae691e --- /dev/null +++ b/admin/client/src/store/modules/permission.js @@ -0,0 +1,68 @@ +import { asyncRoutes, constantRoutes } from '@/router' + +/** + * Use meta.perm to determine if the current user has permission + * @param perms + * @param route + */ +function hasPermission(perms, route) { + if (route.meta && route.meta.perms) { + return perms.some(perm => route.meta.perms.includes(perm)) + } else { + return true + } +} + +/** + * Filter asynchronous routing tables by recursion + * @param routes asyncRoutes + * @param perms + */ +export function filterAsyncRoutes(routes, perms) { + const res = [] + + routes.forEach(route => { + const tmp = { ...route } + if (hasPermission(perms, tmp)) { + if (tmp.children) { + tmp.children = filterAsyncRoutes(tmp.children, perms) + } + res.push(tmp) + } + }) + return res +} + +const state = { + routes: [], + addRoutes: [] +} + +const mutations = { + SET_ROUTES: (state, routes) => { + state.addRoutes = routes + state.routes = constantRoutes.concat(routes) + } +} + +const actions = { + generateRoutes({ commit }, perms) { + return new Promise(resolve => { + let accessedRoutes + if (perms.includes('admin')) { + accessedRoutes = asyncRoutes || [] + } else { + accessedRoutes = filterAsyncRoutes(asyncRoutes, perms) + } + commit('SET_ROUTES', accessedRoutes) + resolve(accessedRoutes) + }) + } +} + +export default { + namespaced: true, + state, + mutations, + actions +} diff --git a/admin/client/src/store/modules/settings.js b/admin/client/src/store/modules/settings.js new file mode 100644 index 0000000..aab31a2 --- /dev/null +++ b/admin/client/src/store/modules/settings.js @@ -0,0 +1,31 @@ +import defaultSettings from '@/settings' + +const { showSettings, fixedHeader, sidebarLogo } = defaultSettings + +const state = { + showSettings: showSettings, + fixedHeader: fixedHeader, + sidebarLogo: sidebarLogo +} + +const mutations = { + CHANGE_SETTING: (state, { key, value }) => { + if (state.hasOwnProperty(key)) { + state[key] = value + } + } +} + +const actions = { + changeSetting({ commit }, data) { + commit('CHANGE_SETTING', data) + } +} + +export default { + namespaced: true, + state, + mutations, + actions +} + diff --git a/admin/client/src/store/modules/user.js b/admin/client/src/store/modules/user.js new file mode 100644 index 0000000..3dba2c2 --- /dev/null +++ b/admin/client/src/store/modules/user.js @@ -0,0 +1,108 @@ +import { login, logout, getInfo } from '@/api/user' +import { getToken, setToken, removeToken } from '@/utils/auth' +import { resetRouter } from '@/router' + +const getDefaultState = () => { + return { + token: getToken(), + name: '', + avatar: '', + perms: [] + } +} + +const state = getDefaultState() + +const mutations = { + RESET_STATE: (state) => { + Object.assign(state, getDefaultState()) + }, + SET_TOKEN: (state, token) => { + state.token = token + }, + SET_NAME: (state, name) => { + state.name = name + }, + SET_AVATAR: (state, avatar) => { + state.avatar = avatar + }, + SET_PERMS: (state, perms) => { + state.perms = perms + } +} + +const actions = { + // user login + login({ commit }, userInfo) { + const { username, password } = userInfo + return new Promise((resolve, reject) => { + login({ username: username.trim(), password: password }).then(response => { + const { data } = response + commit('SET_TOKEN', data.access) + setToken(data.access) + resolve() + + }).catch(error => { + reject(error) + }) + }) + }, + + // get user info + getInfo({ commit, state }) { + return new Promise((resolve, reject) => { + getInfo(state.token).then(response => { + const { data } = response + + if (!data) { + reject('验证失败,重新登陆.') + } + + const { perms, name, avatar } = data + + // perms must be a non-empty array + if (!perms || perms.length <= 0) { + reject('没有任何权限!') + } + + commit('SET_PERMS', perms) + commit('SET_NAME', name) + commit('SET_AVATAR', avatar) + resolve(data) + }).catch(error => { + reject(error) + }) + }) + }, + + // user logout + logout({ commit, state }) { + return new Promise((resolve, reject) => { + logout(state.token).then(() => { + removeToken() // must remove token first + resetRouter() + commit('RESET_STATE') + resolve() + }).catch(error => { + reject(error) + }) + }) + }, + + // remove token + resetToken({ commit }) { + return new Promise(resolve => { + removeToken() // must remove token first + commit('RESET_STATE') + resolve() + }) + } +} + +export default { + namespaced: true, + state, + mutations, + actions +} + diff --git a/admin/client/src/styles/element-ui.scss b/admin/client/src/styles/element-ui.scss new file mode 100644 index 0000000..0062411 --- /dev/null +++ b/admin/client/src/styles/element-ui.scss @@ -0,0 +1,49 @@ +// cover some element-ui styles + +.el-breadcrumb__inner, +.el-breadcrumb__inner a { + font-weight: 400 !important; +} + +.el-upload { + input[type="file"] { + display: none !important; + } +} + +.el-upload__input { + display: none; +} + + +// to fixed https://github.com/ElemeFE/element/issues/2461 +.el-dialog { + transform: none; + left: 0; + position: relative; + margin: 0 auto; +} + +// refine element ui upload +.upload-container { + .el-upload { + width: 100%; + + .el-upload-dragger { + width: 100%; + height: 200px; + } + } +} + +// dropdown +.el-dropdown-menu { + a { + display: block + } +} + +// to fix el-date-picker css style +.el-range-separator { + box-sizing: content-box; +} diff --git a/admin/client/src/styles/index.scss b/admin/client/src/styles/index.scss new file mode 100644 index 0000000..bafe602 --- /dev/null +++ b/admin/client/src/styles/index.scss @@ -0,0 +1,125 @@ +@import './variables.scss'; +@import './mixin.scss'; +@import './transition.scss'; +@import './element-ui.scss'; +@import './sidebar.scss'; + +body { + height: 100%; + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; + text-rendering: optimizeLegibility; + font-family: Helvetica Neue, Helvetica, PingFang SC, Hiragino Sans GB, Microsoft YaHei, Arial, sans-serif; + // background-color: #e9e9e9; +} + +label { + font-weight: 700; +} + +html { + height: 100%; + box-sizing: border-box; +} + +#app { + height: 100%; +} + +*, +*:before, +*:after { + box-sizing: inherit; +} + +a:focus, +a:active { + outline: none; +} + +a, +a:focus, +a:hover { + cursor: pointer; + color: inherit; + text-decoration: none; +} + +div:focus { + outline: none; +} + +.clearfix { + &:after { + visibility: hidden; + display: block; + font-size: 0; + content: " "; + clear: both; + height: 0; + } +} + +// main-container global css +.app-container { + padding: 2px; +} + +.el-table--medium td,   .el-table--medium th { + padding: 2px 0; +} +.el-form-item { + margin-bottom: 16px; +} +.el-card, .el-message { + border-radius: 0px; + overflow: hidden; +} +.el-card__body { + padding: 6px; +} +.el-card__header { + padding: 6px; +} +.el-tabs--border-card>.el-tabs__content { + padding: 6px; +} +.el-dialog__header { + padding: 10px 10px 6px; +} + .el-dialog{ + display: flex; + flex-direction: column; + margin:0 !important; + position:absolute; + top:50%; + left:50%; + transform:translate(-50%,-50%); + /*height:600px;*/ + max-height:calc(100% - 30px); + max-width:calc(100% - 30px); + } +.el-dialog .el-dialog__body{ + flex:1; + overflow: auto; + padding: 8px 12px; +} + +.el-form--label-top .el-form-item__label { + line-height: 16px; +} +.el-button+.el-button { + margin-left: 1px; +} +.el-tabs__header { + margin: 0 0 6px; +} +.pagination-container { + padding: 0px 0px; +} +body .el-table th.gutter{ + display: table-cell!important; +} +.el-dialog__footer{ + padding: 6px 6px 6px; +} diff --git a/admin/client/src/styles/mixin.scss b/admin/client/src/styles/mixin.scss new file mode 100644 index 0000000..36b74bb --- /dev/null +++ b/admin/client/src/styles/mixin.scss @@ -0,0 +1,28 @@ +@mixin clearfix { + &:after { + content: ""; + display: table; + clear: both; + } +} + +@mixin scrollBar { + &::-webkit-scrollbar-track-piece { + background: #d3dce6; + } + + &::-webkit-scrollbar { + width: 6px; + } + + &::-webkit-scrollbar-thumb { + background: #99a9bf; + border-radius: 20px; + } +} + +@mixin relative { + position: relative; + width: 100%; + height: 100%; +} diff --git a/admin/client/src/styles/sidebar.scss b/admin/client/src/styles/sidebar.scss new file mode 100644 index 0000000..3dad4c3 --- /dev/null +++ b/admin/client/src/styles/sidebar.scss @@ -0,0 +1,209 @@ +#app { + + .main-container { + min-height: 100%; + transition: margin-left .28s; + margin-left: $sideBarWidth; + position: relative; + } + + .sidebar-container { + transition: width 0.28s; + width: $sideBarWidth !important; + background-color: $menuBg; + height: 100%; + position: fixed; + font-size: 0px; + top: 0; + bottom: 0; + left: 0; + z-index: 1001; + overflow: hidden; + + // reset element-ui css + .horizontal-collapse-transition { + transition: 0s width ease-in-out, 0s padding-left ease-in-out, 0s padding-right ease-in-out; + } + + .scrollbar-wrapper { + overflow-x: hidden !important; + } + + .el-scrollbar__bar.is-vertical { + right: 0px; + } + + .el-scrollbar { + height: 100%; + } + + &.has-logo { + .el-scrollbar { + height: calc(100% - 50px); + } + } + + .is-horizontal { + display: none; + } + + a { + display: inline-block; + width: 100%; + overflow: hidden; + } + + .svg-icon { + margin-right: 16px; + } + + .el-menu { + border: none; + height: 100%; + width: 100% !important; + } + + // menu hover + .submenu-title-noDropdown, + .el-submenu__title { + &:hover { + background-color: $menuHover !important; + } + } + + .is-active>.el-submenu__title { + color: $subMenuActiveText !important; + } + + & .nest-menu .el-submenu>.el-submenu__title, + & .el-submenu .el-menu-item { + min-width: $sideBarWidth !important; + background-color: $subMenuBg !important; + + &:hover { + background-color: $subMenuHover !important; + } + } + } + + .hideSidebar { + .sidebar-container { + width: 54px !important; + } + + .main-container { + margin-left: 54px; + } + + .submenu-title-noDropdown { + padding: 0 !important; + position: relative; + + .el-tooltip { + padding: 0 !important; + + .svg-icon { + margin-left: 20px; + } + } + } + + .el-submenu { + overflow: hidden; + + &>.el-submenu__title { + padding: 0 !important; + + .svg-icon { + margin-left: 20px; + } + + .el-submenu__icon-arrow { + display: none; + } + } + } + + .el-menu--collapse { + .el-submenu { + &>.el-submenu__title { + &>span { + height: 0; + width: 0; + overflow: hidden; + visibility: hidden; + display: inline-block; + } + } + } + } + } + + .el-menu--collapse .el-menu .el-submenu { + min-width: $sideBarWidth !important; + } + + // mobile responsive + .mobile { + .main-container { + margin-left: 0px; + } + + .sidebar-container { + transition: transform .28s; + width: $sideBarWidth !important; + } + + &.hideSidebar { + .sidebar-container { + pointer-events: none; + transition-duration: 0.3s; + transform: translate3d(-$sideBarWidth, 0, 0); + } + } + } + + .withoutAnimation { + + .main-container, + .sidebar-container { + transition: none; + } + } +} + +// when menu collapsed +.el-menu--vertical { + &>.el-menu { + .svg-icon { + margin-right: 16px; + } + } + + .nest-menu .el-submenu>.el-submenu__title, + .el-menu-item { + &:hover { + // you can use $subMenuHover + background-color: $menuHover !important; + } + } + + // the scroll bar appears when the subMenu is too long + >.el-menu--popup { + max-height: 100vh; + overflow-y: auto; + + &::-webkit-scrollbar-track-piece { + background: #d3dce6; + } + + &::-webkit-scrollbar { + width: 6px; + } + + &::-webkit-scrollbar-thumb { + background: #99a9bf; + border-radius: 20px; + } + } +} diff --git a/admin/client/src/styles/transition.scss b/admin/client/src/styles/transition.scss new file mode 100644 index 0000000..4cb27cc --- /dev/null +++ b/admin/client/src/styles/transition.scss @@ -0,0 +1,48 @@ +// global transition css + +/* fade */ +.fade-enter-active, +.fade-leave-active { + transition: opacity 0.28s; +} + +.fade-enter, +.fade-leave-active { + opacity: 0; +} + +/* fade-transform */ +.fade-transform-leave-active, +.fade-transform-enter-active { + transition: all .5s; +} + +.fade-transform-enter { + opacity: 0; + transform: translateX(-30px); +} + +.fade-transform-leave-to { + opacity: 0; + transform: translateX(30px); +} + +/* breadcrumb transition */ +.breadcrumb-enter-active, +.breadcrumb-leave-active { + transition: all .5s; +} + +.breadcrumb-enter, +.breadcrumb-leave-active { + opacity: 0; + transform: translateX(20px); +} + +.breadcrumb-move { + transition: all .5s; +} + +.breadcrumb-leave-active { + position: absolute; +} diff --git a/admin/client/src/styles/variables.scss b/admin/client/src/styles/variables.scss new file mode 100644 index 0000000..be55772 --- /dev/null +++ b/admin/client/src/styles/variables.scss @@ -0,0 +1,25 @@ +// sidebar +$menuText:#bfcbd9; +$menuActiveText:#409EFF; +$subMenuActiveText:#f4f4f5; //https://github.com/ElemeFE/element/issues/12951 + +$menuBg:#304156; +$menuHover:#263445; + +$subMenuBg:#1f2d3d; +$subMenuHover:#001528; + +$sideBarWidth: 210px; + +// the :export directive is the magic sauce for webpack +// https://www.bluematador.com/blog/how-to-share-variables-between-js-and-sass +:export { + menuText: $menuText; + menuActiveText: $menuActiveText; + subMenuActiveText: $subMenuActiveText; + menuBg: $menuBg; + menuHover: $menuHover; + subMenuBg: $subMenuBg; + subMenuHover: $subMenuHover; + sideBarWidth: $sideBarWidth; +} diff --git a/admin/client/src/utils/auth.js b/admin/client/src/utils/auth.js new file mode 100644 index 0000000..392db62 --- /dev/null +++ b/admin/client/src/utils/auth.js @@ -0,0 +1,25 @@ +import Cookies from 'js-cookie' + +const TokenKey = 'token' + +export function getToken() { + return Cookies.get(TokenKey) +} + +export function setToken(token) { + return Cookies.set(TokenKey, token) +} + +export function removeToken() { + return Cookies.remove(TokenKey) +} + +// export function refreshToken() { +// let token = getToken() +// let data = {"token": token} +// return request({ +// url: '/token/refresh/', +// method: 'post', +// data +// }) +// } diff --git a/admin/client/src/utils/get-page-title.js b/admin/client/src/utils/get-page-title.js new file mode 100644 index 0000000..cfe5800 --- /dev/null +++ b/admin/client/src/utils/get-page-title.js @@ -0,0 +1,10 @@ +import defaultSettings from '@/settings' + +const title = defaultSettings.title || '认证系统' + +export default function getPageTitle(pageTitle) { + if (pageTitle) { + return `${pageTitle} - ${title}` + } + return `${title}` +} diff --git a/admin/client/src/utils/index.js b/admin/client/src/utils/index.js new file mode 100644 index 0000000..722c202 --- /dev/null +++ b/admin/client/src/utils/index.js @@ -0,0 +1,384 @@ +/** + * Created by PanJiaChen on 16/11/18. + */ + +/** + * Parse the time to string + * @param {(Object|string|number)} time + * @param {string} cFormat + * @returns {string | null} + */ +export function parseTime(time, cFormat) { + if (arguments.length === 0) { + return null + } + const format = cFormat || '{y}-{m}-{d} {h}:{i}:{s}' + let date + if (typeof time === 'object') { + date = time + } else { + if ((typeof time === 'string') && (/^[0-9]+$/.test(time))) { + time = parseInt(time) + } + if ((typeof time === 'number') && (time.toString().length === 10)) { + time = time * 1000 + } + date = new Date(time) + } + const formatObj = { + y: date.getFullYear(), + m: date.getMonth() + 1, + d: date.getDate(), + h: date.getHours(), + i: date.getMinutes(), + s: date.getSeconds(), + a: date.getDay() + } + const time_str = format.replace(/{([ymdhisa])+}/g, (result, key) => { + const value = formatObj[key] + // Note: getDay() returns 0 on Sunday + if (key === 'a') { return ['日', '一', '二', '三', '四', '五', '六'][value] } + return value.toString().padStart(2, '0') + }) + return time_str +} + +/** + * @param {number} time + * @param {string} option + * @returns {string} + */ +export function formatTime(time, option) { + if (('' + time).length === 10) { + time = parseInt(time) * 1000 + } else { + time = +time + } + const d = new Date(time) + const now = Date.now() + + const diff = (now - d) / 1000 + + if (diff < 30) { + return '刚刚' + } else if (diff < 3600) { + // less 1 hour + return Math.ceil(diff / 60) + '分钟前' + } else if (diff < 3600 * 24) { + return Math.ceil(diff / 3600) + '小时前' + } else if (diff < 3600 * 24 * 2) { + return '1天前' + } + if (option) { + return parseTime(time, option) + } else { + return ( + d.getMonth() + + 1 + + '月' + + d.getDate() + + '日' + + d.getHours() + + '时' + + d.getMinutes() + + '分' + ) + } +} + +/** + * @param {string} url + * @returns {Object} + */ +export function getQueryObject(url) { + url = url == null ? window.location.href : url + const search = url.substring(url.lastIndexOf('?') + 1) + const obj = {} + const reg = /([^?&=]+)=([^?&=]*)/g + search.replace(reg, (rs, $1, $2) => { + const name = decodeURIComponent($1) + let val = decodeURIComponent($2) + val = String(val) + obj[name] = val + return rs + }) + return obj +} + +/** + * @param {string} input value + * @returns {number} output value + */ +export function byteLength(str) { + // returns the byte length of an utf8 string + let s = str.length + for (var i = str.length - 1; i >= 0; i--) { + const code = str.charCodeAt(i) + if (code > 0x7f && code <= 0x7ff) s++ + else if (code > 0x7ff && code <= 0xffff) s += 2 + if (code >= 0xDC00 && code <= 0xDFFF) i-- + } + return s +} + +/** + * @param {Array} actual + * @returns {Array} + */ +export function cleanArray(actual) { + const newArray = [] + for (let i = 0; i < actual.length; i++) { + if (actual[i]) { + newArray.push(actual[i]) + } + } + return newArray +} + +/** + * @param {Object} json + * @returns {Array} + */ +export function param(json) { + if (!json) return '' + return cleanArray( + Object.keys(json).map(key => { + if (json[key] === undefined) return '' + return encodeURIComponent(key) + '=' + encodeURIComponent(json[key]) + }) + ).join('&') +} + +/** + * @param {string} url + * @returns {Object} + */ +export function param2Obj(url) { + const search = url.split('?')[1] + if (!search) { + return {} + } + return JSON.parse( + '{"' + + decodeURIComponent(search) + .replace(/"/g, '\\"') + .replace(/&/g, '","') + .replace(/=/g, '":"') + .replace(/\+/g, ' ') + + '"}' + ) +} + +/** + * @param {string} val + * @returns {string} + */ +export function html2Text(val) { + const div = document.createElement('div') + div.innerHTML = val + return div.textContent || div.innerText +} + +/** + * Merges two objects, giving the last one precedence + * @param {Object} target + * @param {(Object|Array)} source + * @returns {Object} + */ +export function objectMerge(target, source) { + if (typeof target !== 'object') { + target = {} + } + if (Array.isArray(source)) { + return source.slice() + } + Object.keys(source).forEach(property => { + const sourceProperty = source[property] + if (typeof sourceProperty === 'object') { + target[property] = objectMerge(target[property], sourceProperty) + } else { + target[property] = sourceProperty + } + }) + return target +} + +/** + * @param {HTMLElement} element + * @param {string} className + */ +export function toggleClass(element, className) { + if (!element || !className) { + return + } + let classString = element.className + const nameIndex = classString.indexOf(className) + if (nameIndex === -1) { + classString += '' + className + } else { + classString = + classString.substr(0, nameIndex) + + classString.substr(nameIndex + className.length) + } + element.className = classString +} + +/** + * @param {string} type + * @returns {Date} + */ +export function getTime(type) { + if (type === 'start') { + return new Date().getTime() - 3600 * 1000 * 24 * 90 + } else { + return new Date(new Date().toDateString()) + } +} + +/** + * @param {Function} func + * @param {number} wait + * @param {boolean} immediate + * @return {*} + */ +export function debounce(func, wait, immediate) { + let timeout, args, context, timestamp, result + + const later = function() { + // 据上一次触发时间间隔 + const last = +new Date() - timestamp + + // 上次被包装函数被调用时间间隔 last 小于设定时间间隔 wait + if (last < wait && last > 0) { + timeout = setTimeout(later, wait - last) + } else { + timeout = null + // 如果设定为immediate===true,因为开始边界已经调用过了此处无需调用 + if (!immediate) { + result = func.apply(context, args) + if (!timeout) context = args = null + } + } + } + + return function(...args) { + context = this + timestamp = +new Date() + const callNow = immediate && !timeout + // 如果延时不存在,重新设定延时 + if (!timeout) timeout = setTimeout(later, wait) + if (callNow) { + result = func.apply(context, args) + context = args = null + } + + return result + } +} + +/** + * This is just a simple version of deep copy + * Has a lot of edge cases bug + * If you want to use a perfect deep copy, use lodash's _.cloneDeep + * @param {Object} source + * @returns {Object} + */ +export function deepClone(source) { + if (!source && typeof source !== 'object') { + throw new Error('error arguments', 'deepClone') + } + const targetObj = source.constructor === Array ? [] : {} + Object.keys(source).forEach(keys => { + if (source[keys] && typeof source[keys] === 'object') { + targetObj[keys] = deepClone(source[keys]) + } else { + targetObj[keys] = source[keys] + } + }) + return targetObj +} + +/** + * @param {Array} arr + * @returns {Array} + */ +export function uniqueArr(arr) { + return Array.from(new Set(arr)) +} + +/** + * @returns {string} + */ +export function createUniqueString() { + const timestamp = +new Date() + '' + const randomNum = parseInt((1 + Math.random()) * 65536) + '' + return (+(randomNum + timestamp)).toString(32) +} + +/** + * Check if an element has a class + * @param {HTMLElement} elm + * @param {string} cls + * @returns {boolean} + */ +export function hasClass(ele, cls) { + return !!ele.className.match(new RegExp('(\\s|^)' + cls + '(\\s|$)')) +} + +/** + * Add class to element + * @param {HTMLElement} elm + * @param {string} cls + */ +export function addClass(ele, cls) { + if (!hasClass(ele, cls)) ele.className += ' ' + cls +} + +/** + * Remove class from element + * @param {HTMLElement} elm + * @param {string} cls + */ +export function removeClass(ele, cls) { + if (hasClass(ele, cls)) { + const reg = new RegExp('(\\s|^)' + cls + '(\\s|$)') + ele.className = ele.className.replace(reg, ' ') + } +} + +export function genTree(data) { + const result = [] + if (!Array.isArray(data)) { + return result + } + data.forEach(item => { + delete item.children + }) + const map = {} + data.forEach(item => { + item.label = item.name + if(item.fullname){ + item.label = item.fullname + } + item.value = item.id + map[item.id] = item + }) + data.forEach(item => { + const parent = map[item.parent] + if (parent) { + (parent.children || (parent.children = [])).push(item) + } else { + result.push(item) + } + }) + return result +} + +const arrChange = arr => arr.map(item => { + const res = {} + for (const key in item) { + const _key = key === 'name' ? 'label' : key + res[_key] = Array.isArray(item[key]) ? arrChange(item[key]) : item[key] + } + return res +}) diff --git a/admin/client/src/utils/permission.js b/admin/client/src/utils/permission.js new file mode 100644 index 0000000..217bdeb --- /dev/null +++ b/admin/client/src/utils/permission.js @@ -0,0 +1,27 @@ +import store from '@/store' + +/** + * @param {Array} value + * @returns {Boolean} + * @example see @/views/permission/directive.vue + */ +export default function checkPermission(value) { + if (value && value instanceof Array && value.length > 0) { + const perms = store.getters && store.getters.perms + const permissionperms = value + if (perms.includes('admin')) { + return true + } // 如果是超管,都可以操作 + const hasPermission = perms.some(perm => { + return permissionperms.includes(perm) + }) + + if (!hasPermission) { + return false + } + return true + } else { + console.error(`need perms! Like v-permission="['admin','editor']"`) + return false + } +} diff --git a/admin/client/src/utils/request.js b/admin/client/src/utils/request.js new file mode 100644 index 0000000..da72b1a --- /dev/null +++ b/admin/client/src/utils/request.js @@ -0,0 +1,88 @@ +import axios from 'axios' +import { MessageBox, Message } from 'element-ui' +import store from '@/store' +import { getToken } from '@/utils/auth' + +// create an axios instance +const service = axios.create({ + baseURL: process.env.VUE_APP_BASE_API, // url = base url + request url + // withCredentials: true, // send cookies when cross-domain requests + timeout: 10000 // request timeout +}) + +// request interceptor +service.interceptors.request.use( + config => { + // do something before request is sent + if (store.getters.token) { + // let each request carry token + // ['X-Token'] is a custom headers key + // please modify it according to the actual situation + config.headers['Authorization'] = 'Bearer ' + getToken() + } + return config + }, + error => { + // do something with request error + // console.log(error) // for debug + return Promise.reject(error) + } +) + +// response interceptor +service.interceptors.response.use( + /** + * If you want to get http information such as headers or status + * Please return response => response + */ + + /** + * Determine the request status by custom code + * Here is just an example + * You can also judge the status by HTTP Status Code + */ + response => { + const res = response.data + if(res.code>=200 && res.code<400){ + return res + } + if (res.code === 401) { + if(res.msg.indexOf('No active account')!=-1){ + Message({ + message: '用户名或密码错误', + type: 'error', + duration: 3 * 1000 + }) + }else{ + MessageBox.confirm('认证失败,请重新登陆.', '确认退出', { + confirmButtonText: '重新登陆', + cancelButtonText: '取消', + type: 'warning' + }).then(() => { + store.dispatch('user/resetToken').then(() => { + location.reload() + }) + }) + } + + } else if (res.code >= 400) { + Message({ + message: res.msg || '请求出错', + type: 'error', + duration: 3 * 1000 + }) + return Promise.reject(new Error(res.msg || '请求出错')) + } + }, + error => { + // console.log(error,response) // for debug + Message({ + message: "服务器错误", + type: 'error', + duration: 5 * 1000 + }) + return Promise.reject(error) + } +) + +export default service diff --git a/admin/client/src/utils/scroll-to.js b/admin/client/src/utils/scroll-to.js new file mode 100644 index 0000000..c5d8e04 --- /dev/null +++ b/admin/client/src/utils/scroll-to.js @@ -0,0 +1,58 @@ +Math.easeInOutQuad = function(t, b, c, d) { + t /= d / 2 + if (t < 1) { + return c / 2 * t * t + b + } + t-- + return -c / 2 * (t * (t - 2) - 1) + b +} + +// requestAnimationFrame for Smart Animating http://goo.gl/sx5sts +var requestAnimFrame = (function() { + return window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || function(callback) { window.setTimeout(callback, 1000 / 60) } +})() + +/** + * Because it's so fucking difficult to detect the scrolling element, just move them all + * @param {number} amount + */ +function move(amount) { + document.documentElement.scrollTop = amount + document.body.parentNode.scrollTop = amount + document.body.scrollTop = amount +} + +function position() { + return document.documentElement.scrollTop || document.body.parentNode.scrollTop || document.body.scrollTop +} + +/** + * @param {number} to + * @param {number} duration + * @param {Function} callback + */ +export function scrollTo(to, duration, callback) { + const start = position() + const change = to - start + const increment = 20 + let currentTime = 0 + duration = (typeof (duration) === 'undefined') ? 500 : duration + var animateScroll = function() { + // increment the time + currentTime += increment + // find the value with the quadratic in-out easing function + var val = Math.easeInOutQuad(currentTime, start, change, duration) + // move the document.body + move(val) + // do the animation unless its over + if (currentTime < duration) { + requestAnimFrame(animateScroll) + } else { + if (callback && typeof (callback) === 'function') { + // the animation is done so lets callback + callback() + } + } + } + animateScroll() +} diff --git a/admin/client/src/utils/validate.js b/admin/client/src/utils/validate.js new file mode 100644 index 0000000..8d962ad --- /dev/null +++ b/admin/client/src/utils/validate.js @@ -0,0 +1,20 @@ +/** + * Created by PanJiaChen on 16/11/18. + */ + +/** + * @param {string} path + * @returns {Boolean} + */ +export function isExternal(path) { + return /^(https?:|mailto:|tel:)/.test(path) +} + +/** + * @param {string} str + * @returns {Boolean} + */ +export function validUsername(str) { + const valid_map = ['admin', 'editor'] + return valid_map.indexOf(str.trim()) >= 0 +} diff --git a/admin/client/src/vendor/Export2Excel.js b/admin/client/src/vendor/Export2Excel.js new file mode 100644 index 0000000..d8a2af3 --- /dev/null +++ b/admin/client/src/vendor/Export2Excel.js @@ -0,0 +1,220 @@ +/* eslint-disable */ +import { saveAs } from 'file-saver' +import XLSX from 'xlsx' + +function generateArray(table) { + var out = []; + var rows = table.querySelectorAll('tr'); + var ranges = []; + for (var R = 0; R < rows.length; ++R) { + var outRow = []; + var row = rows[R]; + var columns = row.querySelectorAll('td'); + for (var C = 0; C < columns.length; ++C) { + var cell = columns[C]; + var colspan = cell.getAttribute('colspan'); + var rowspan = cell.getAttribute('rowspan'); + var cellValue = cell.innerText; + if (cellValue !== "" && cellValue == +cellValue) cellValue = +cellValue; + + //Skip ranges + ranges.forEach(function (range) { + if (R >= range.s.r && R <= range.e.r && outRow.length >= range.s.c && outRow.length <= range.e.c) { + for (var i = 0; i <= range.e.c - range.s.c; ++i) outRow.push(null); + } + }); + + //Handle Row Span + if (rowspan || colspan) { + rowspan = rowspan || 1; + colspan = colspan || 1; + ranges.push({ + s: { + r: R, + c: outRow.length + }, + e: { + r: R + rowspan - 1, + c: outRow.length + colspan - 1 + } + }); + }; + + //Handle Value + outRow.push(cellValue !== "" ? cellValue : null); + + //Handle Colspan + if (colspan) + for (var k = 0; k < colspan - 1; ++k) outRow.push(null); + } + out.push(outRow); + } + return [out, ranges]; +}; + +function datenum(v, date1904) { + if (date1904) v += 1462; + var epoch = Date.parse(v); + return (epoch - new Date(Date.UTC(1899, 11, 30))) / (24 * 60 * 60 * 1000); +} + +function sheet_from_array_of_arrays(data, opts) { + var ws = {}; + var range = { + s: { + c: 10000000, + r: 10000000 + }, + e: { + c: 0, + r: 0 + } + }; + for (var R = 0; R != data.length; ++R) { + for (var C = 0; C != data[R].length; ++C) { + if (range.s.r > R) range.s.r = R; + if (range.s.c > C) range.s.c = C; + if (range.e.r < R) range.e.r = R; + if (range.e.c < C) range.e.c = C; + var cell = { + v: data[R][C] + }; + if (cell.v == null) continue; + var cell_ref = XLSX.utils.encode_cell({ + c: C, + r: R + }); + + if (typeof cell.v === 'number') cell.t = 'n'; + else if (typeof cell.v === 'boolean') cell.t = 'b'; + else if (cell.v instanceof Date) { + cell.t = 'n'; + cell.z = XLSX.SSF._table[14]; + cell.v = datenum(cell.v); + } else cell.t = 's'; + + ws[cell_ref] = cell; + } + } + if (range.s.c < 10000000) ws['!ref'] = XLSX.utils.encode_range(range); + return ws; +} + +function Workbook() { + if (!(this instanceof Workbook)) return new Workbook(); + this.SheetNames = []; + this.Sheets = {}; +} + +function s2ab(s) { + var buf = new ArrayBuffer(s.length); + var view = new Uint8Array(buf); + for (var i = 0; i != s.length; ++i) view[i] = s.charCodeAt(i) & 0xFF; + return buf; +} + +export function export_table_to_excel(id) { + var theTable = document.getElementById(id); + var oo = generateArray(theTable); + var ranges = oo[1]; + + /* original data */ + var data = oo[0]; + var ws_name = "SheetJS"; + + var wb = new Workbook(), + ws = sheet_from_array_of_arrays(data); + + /* add ranges to worksheet */ + // ws['!cols'] = ['apple', 'banan']; + ws['!merges'] = ranges; + + /* add worksheet to workbook */ + wb.SheetNames.push(ws_name); + wb.Sheets[ws_name] = ws; + + var wbout = XLSX.write(wb, { + bookType: 'xlsx', + bookSST: false, + type: 'binary' + }); + + saveAs(new Blob([s2ab(wbout)], { + type: "application/octet-stream" + }), "test.xlsx") +} + +export function export_json_to_excel({ + multiHeader = [], + header, + data, + filename, + merges = [], + autoWidth = true, + bookType = 'xlsx' +} = {}) { + /* original data */ + filename = filename || 'excel-list' + data = [...data] + data.unshift(header); + + for (let i = multiHeader.length - 1; i > -1; i--) { + data.unshift(multiHeader[i]) + } + + var ws_name = "SheetJS"; + var wb = new Workbook(), + ws = sheet_from_array_of_arrays(data); + + if (merges.length > 0) { + if (!ws['!merges']) ws['!merges'] = []; + merges.forEach(item => { + ws['!merges'].push(XLSX.utils.decode_range(item)) + }) + } + + if (autoWidth) { + /*设置worksheet每列的最大宽度*/ + const colWidth = data.map(row => row.map(val => { + /*先判断是否为null/undefined*/ + if (val == null) { + return { + 'wch': 10 + }; + } + /*再判断是否为中文*/ + else if (val.toString().charCodeAt(0) > 255) { + return { + 'wch': val.toString().length * 2 + }; + } else { + return { + 'wch': val.toString().length + }; + } + })) + /*以第一行为初始值*/ + let result = colWidth[0]; + for (let i = 1; i < colWidth.length; i++) { + for (let j = 0; j < colWidth[i].length; j++) { + if (result[j]['wch'] < colWidth[i][j]['wch']) { + result[j]['wch'] = colWidth[i][j]['wch']; + } + } + } + ws['!cols'] = result; + } + + /* add worksheet to workbook */ + wb.SheetNames.push(ws_name); + wb.Sheets[ws_name] = ws; + + var wbout = XLSX.write(wb, { + bookType: bookType, + bookSST: false, + type: 'binary' + }); + saveAs(new Blob([s2ab(wbout)], { + type: "application/octet-stream" + }), `${filename}.${bookType}`); +} diff --git a/admin/client/src/vendor/Export2Zip.js b/admin/client/src/vendor/Export2Zip.js new file mode 100644 index 0000000..db70707 --- /dev/null +++ b/admin/client/src/vendor/Export2Zip.js @@ -0,0 +1,24 @@ +/* eslint-disable */ +import { saveAs } from 'file-saver' +import JSZip from 'jszip' + +export function export_txt_to_zip(th, jsonData, txtName, zipName) { + const zip = new JSZip() + const txt_name = txtName || 'file' + const zip_name = zipName || 'file' + const data = jsonData + let txtData = `${th}\r\n` + data.forEach((row) => { + let tempStr = '' + tempStr = row.toString() + txtData += `${tempStr}\r\n` + }) + zip.file(`${txt_name}.txt`, txtData) + zip.generateAsync({ + type: "blob" + }).then((blob) => { + saveAs(blob, `${zip_name}.zip`) + }, (err) => { + alert('导出失败') + }) +} diff --git a/admin/client/src/views/404.vue b/admin/client/src/views/404.vue new file mode 100644 index 0000000..18eda34 --- /dev/null +++ b/admin/client/src/views/404.vue @@ -0,0 +1,228 @@ + + + + + diff --git a/admin/client/src/views/crm/activity.vue b/admin/client/src/views/crm/activity.vue new file mode 100644 index 0000000..fc55d5e --- /dev/null +++ b/admin/client/src/views/crm/activity.vue @@ -0,0 +1,260 @@ + + + \ No newline at end of file diff --git a/admin/client/src/views/crm/banner.vue b/admin/client/src/views/crm/banner.vue new file mode 100644 index 0000000..70fe9b3 --- /dev/null +++ b/admin/client/src/views/crm/banner.vue @@ -0,0 +1,238 @@ + + + diff --git a/admin/client/src/views/crm/category.vue b/admin/client/src/views/crm/category.vue new file mode 100644 index 0000000..b846e51 --- /dev/null +++ b/admin/client/src/views/crm/category.vue @@ -0,0 +1,174 @@ + + + diff --git a/admin/client/src/views/crm/coupon.vue b/admin/client/src/views/crm/coupon.vue new file mode 100644 index 0000000..9abca0f --- /dev/null +++ b/admin/client/src/views/crm/coupon.vue @@ -0,0 +1,297 @@ + + + diff --git a/admin/client/src/views/crm/exam.vue b/admin/client/src/views/crm/exam.vue new file mode 100644 index 0000000..23817f0 --- /dev/null +++ b/admin/client/src/views/crm/exam.vue @@ -0,0 +1,223 @@ + + + \ No newline at end of file diff --git a/admin/client/src/views/crm/honor.vue b/admin/client/src/views/crm/honor.vue new file mode 100644 index 0000000..b2f29ed --- /dev/null +++ b/admin/client/src/views/crm/honor.vue @@ -0,0 +1,213 @@ + + + \ No newline at end of file diff --git a/admin/client/src/views/crm/project.vue b/admin/client/src/views/crm/project.vue new file mode 100644 index 0000000..2c10bb7 --- /dev/null +++ b/admin/client/src/views/crm/project.vue @@ -0,0 +1,357 @@ + + + + + diff --git a/admin/client/src/views/crm/showcase.vue b/admin/client/src/views/crm/showcase.vue new file mode 100644 index 0000000..74c8857 --- /dev/null +++ b/admin/client/src/views/crm/showcase.vue @@ -0,0 +1,221 @@ + + + \ No newline at end of file diff --git a/admin/client/src/views/crm/student.vue b/admin/client/src/views/crm/student.vue new file mode 100644 index 0000000..0d20c49 --- /dev/null +++ b/admin/client/src/views/crm/student.vue @@ -0,0 +1,277 @@ + + + diff --git a/admin/client/src/views/dashboard/index.vue b/admin/client/src/views/dashboard/index.vue new file mode 100644 index 0000000..bfd075e --- /dev/null +++ b/admin/client/src/views/dashboard/index.vue @@ -0,0 +1,32 @@ + + + + + diff --git a/admin/client/src/views/form/index.vue b/admin/client/src/views/form/index.vue new file mode 100644 index 0000000..f4d66d3 --- /dev/null +++ b/admin/client/src/views/form/index.vue @@ -0,0 +1,85 @@ + + + + + + diff --git a/admin/client/src/views/login/index.vue b/admin/client/src/views/login/index.vue new file mode 100644 index 0000000..2568652 --- /dev/null +++ b/admin/client/src/views/login/index.vue @@ -0,0 +1,237 @@ + + + + + + + diff --git a/admin/client/src/views/monitor/service.vue b/admin/client/src/views/monitor/service.vue new file mode 100644 index 0000000..b9473ff --- /dev/null +++ b/admin/client/src/views/monitor/service.vue @@ -0,0 +1,177 @@ + + + + \ No newline at end of file diff --git a/admin/client/src/views/nested/menu1/index.vue b/admin/client/src/views/nested/menu1/index.vue new file mode 100644 index 0000000..30cb670 --- /dev/null +++ b/admin/client/src/views/nested/menu1/index.vue @@ -0,0 +1,7 @@ + diff --git a/admin/client/src/views/nested/menu1/menu1-1/index.vue b/admin/client/src/views/nested/menu1/menu1-1/index.vue new file mode 100644 index 0000000..27e173a --- /dev/null +++ b/admin/client/src/views/nested/menu1/menu1-1/index.vue @@ -0,0 +1,7 @@ + diff --git a/admin/client/src/views/nested/menu1/menu1-2/index.vue b/admin/client/src/views/nested/menu1/menu1-2/index.vue new file mode 100644 index 0000000..0c86276 --- /dev/null +++ b/admin/client/src/views/nested/menu1/menu1-2/index.vue @@ -0,0 +1,7 @@ + diff --git a/admin/client/src/views/nested/menu1/menu1-2/menu1-2-1/index.vue b/admin/client/src/views/nested/menu1/menu1-2/menu1-2-1/index.vue new file mode 100644 index 0000000..f87d88f --- /dev/null +++ b/admin/client/src/views/nested/menu1/menu1-2/menu1-2-1/index.vue @@ -0,0 +1,5 @@ + diff --git a/admin/client/src/views/nested/menu1/menu1-2/menu1-2-2/index.vue b/admin/client/src/views/nested/menu1/menu1-2/menu1-2-2/index.vue new file mode 100644 index 0000000..d88789f --- /dev/null +++ b/admin/client/src/views/nested/menu1/menu1-2/menu1-2-2/index.vue @@ -0,0 +1,5 @@ + diff --git a/admin/client/src/views/nested/menu1/menu1-3/index.vue b/admin/client/src/views/nested/menu1/menu1-3/index.vue new file mode 100644 index 0000000..f7cd073 --- /dev/null +++ b/admin/client/src/views/nested/menu1/menu1-3/index.vue @@ -0,0 +1,5 @@ + diff --git a/admin/client/src/views/nested/menu2/index.vue b/admin/client/src/views/nested/menu2/index.vue new file mode 100644 index 0000000..19dd48f --- /dev/null +++ b/admin/client/src/views/nested/menu2/index.vue @@ -0,0 +1,5 @@ + diff --git a/admin/client/src/views/system/changepassword.vue b/admin/client/src/views/system/changepassword.vue new file mode 100644 index 0000000..165c218 --- /dev/null +++ b/admin/client/src/views/system/changepassword.vue @@ -0,0 +1,78 @@ + + \ No newline at end of file diff --git a/admin/client/src/views/system/dict.vue b/admin/client/src/views/system/dict.vue new file mode 100644 index 0000000..988feab --- /dev/null +++ b/admin/client/src/views/system/dict.vue @@ -0,0 +1,370 @@ + + + diff --git a/admin/client/src/views/system/file.vue b/admin/client/src/views/system/file.vue new file mode 100644 index 0000000..b9c70a8 --- /dev/null +++ b/admin/client/src/views/system/file.vue @@ -0,0 +1,134 @@ + + diff --git a/admin/client/src/views/system/organization.vue b/admin/client/src/views/system/organization.vue new file mode 100644 index 0000000..a71f2b6 --- /dev/null +++ b/admin/client/src/views/system/organization.vue @@ -0,0 +1,225 @@ + + + diff --git a/admin/client/src/views/system/perm.vue b/admin/client/src/views/system/perm.vue new file mode 100644 index 0000000..ae8a7cf --- /dev/null +++ b/admin/client/src/views/system/perm.vue @@ -0,0 +1,239 @@ + + + diff --git a/admin/client/src/views/system/position.vue b/admin/client/src/views/system/position.vue new file mode 100644 index 0000000..cffc146 --- /dev/null +++ b/admin/client/src/views/system/position.vue @@ -0,0 +1,211 @@ + + + diff --git a/admin/client/src/views/system/role.vue b/admin/client/src/views/system/role.vue new file mode 100644 index 0000000..a19ebd0 --- /dev/null +++ b/admin/client/src/views/system/role.vue @@ -0,0 +1,301 @@ + + + + + diff --git a/admin/client/src/views/system/task.vue b/admin/client/src/views/system/task.vue new file mode 100644 index 0000000..62797e9 --- /dev/null +++ b/admin/client/src/views/system/task.vue @@ -0,0 +1,410 @@ + + diff --git a/admin/client/src/views/system/user.vue b/admin/client/src/views/system/user.vue new file mode 100644 index 0000000..6e33e4d --- /dev/null +++ b/admin/client/src/views/system/user.vue @@ -0,0 +1,378 @@ + + + diff --git a/admin/client/src/views/table/index.vue b/admin/client/src/views/table/index.vue new file mode 100644 index 0000000..a1ed847 --- /dev/null +++ b/admin/client/src/views/table/index.vue @@ -0,0 +1,79 @@ + + + diff --git a/admin/client/src/views/tree/index.vue b/admin/client/src/views/tree/index.vue new file mode 100644 index 0000000..89c6b01 --- /dev/null +++ b/admin/client/src/views/tree/index.vue @@ -0,0 +1,78 @@ + + + + diff --git a/admin/client/src/views/workflow/configuration.vue b/admin/client/src/views/workflow/configuration.vue new file mode 100644 index 0000000..aaee8bc --- /dev/null +++ b/admin/client/src/views/workflow/configuration.vue @@ -0,0 +1,52 @@ + + diff --git a/admin/client/src/views/workflow/customfield.vue b/admin/client/src/views/workflow/customfield.vue new file mode 100644 index 0000000..8013b84 --- /dev/null +++ b/admin/client/src/views/workflow/customfield.vue @@ -0,0 +1,447 @@ + + diff --git a/admin/client/src/views/workflow/index.vue b/admin/client/src/views/workflow/index.vue new file mode 100644 index 0000000..1694c63 --- /dev/null +++ b/admin/client/src/views/workflow/index.vue @@ -0,0 +1,515 @@ + + + + diff --git a/admin/client/src/views/workflow/state.vue b/admin/client/src/views/workflow/state.vue new file mode 100644 index 0000000..237267a --- /dev/null +++ b/admin/client/src/views/workflow/state.vue @@ -0,0 +1,487 @@ + + diff --git a/admin/client/src/views/workflow/test.vue b/admin/client/src/views/workflow/test.vue new file mode 100644 index 0000000..fa06867 --- /dev/null +++ b/admin/client/src/views/workflow/test.vue @@ -0,0 +1,133 @@ + + + + + diff --git a/admin/client/src/views/workflow/ticket.vue b/admin/client/src/views/workflow/ticket.vue new file mode 100644 index 0000000..14971fd --- /dev/null +++ b/admin/client/src/views/workflow/ticket.vue @@ -0,0 +1,1020 @@ + + + + + diff --git a/admin/client/src/views/workflow/ticketDetail.vue b/admin/client/src/views/workflow/ticketDetail.vue new file mode 100644 index 0000000..0b5851d --- /dev/null +++ b/admin/client/src/views/workflow/ticketDetail.vue @@ -0,0 +1,563 @@ + + + + diff --git a/admin/client/src/views/workflow/ticketHandle.vue b/admin/client/src/views/workflow/ticketHandle.vue new file mode 100644 index 0000000..79c92aa --- /dev/null +++ b/admin/client/src/views/workflow/ticketHandle.vue @@ -0,0 +1,816 @@ + + + + diff --git a/admin/client/src/views/workflow/transitions.vue b/admin/client/src/views/workflow/transitions.vue new file mode 100644 index 0000000..d0827f6 --- /dev/null +++ b/admin/client/src/views/workflow/transitions.vue @@ -0,0 +1,267 @@ + + diff --git a/admin/client/src/views/workflow/workFlowTickets.vue b/admin/client/src/views/workflow/workFlowTickets.vue new file mode 100644 index 0000000..84a0ea4 --- /dev/null +++ b/admin/client/src/views/workflow/workFlowTickets.vue @@ -0,0 +1,197 @@ + + + + diff --git a/admin/client/tests/unit/.eslintrc.js b/admin/client/tests/unit/.eslintrc.js new file mode 100644 index 0000000..958d51b --- /dev/null +++ b/admin/client/tests/unit/.eslintrc.js @@ -0,0 +1,5 @@ +module.exports = { + env: { + jest: true + } +} diff --git a/admin/client/tests/unit/components/Breadcrumb.spec.js b/admin/client/tests/unit/components/Breadcrumb.spec.js new file mode 100644 index 0000000..1d94c8f --- /dev/null +++ b/admin/client/tests/unit/components/Breadcrumb.spec.js @@ -0,0 +1,98 @@ +import { mount, createLocalVue } from '@vue/test-utils' +import VueRouter from 'vue-router' +import ElementUI from 'element-ui' +import Breadcrumb from '@/components/Breadcrumb/index.vue' + +const localVue = createLocalVue() +localVue.use(VueRouter) +localVue.use(ElementUI) + +const routes = [ + { + path: '/', + name: 'home', + children: [{ + path: 'dashboard', + name: 'dashboard' + }] + }, + { + path: '/menu', + name: 'menu', + children: [{ + path: 'menu1', + name: 'menu1', + meta: { title: 'menu1' }, + children: [{ + path: 'menu1-1', + name: 'menu1-1', + meta: { title: 'menu1-1' } + }, + { + path: 'menu1-2', + name: 'menu1-2', + redirect: 'noredirect', + meta: { title: 'menu1-2' }, + children: [{ + path: 'menu1-2-1', + name: 'menu1-2-1', + meta: { title: 'menu1-2-1' } + }, + { + path: 'menu1-2-2', + name: 'menu1-2-2' + }] + }] + }] + }] + +const router = new VueRouter({ + routes +}) + +describe('Breadcrumb.vue', () => { + const wrapper = mount(Breadcrumb, { + localVue, + router + }) + it('dashboard', () => { + router.push('/dashboard') + const len = wrapper.findAll('.el-breadcrumb__inner').length + expect(len).toBe(1) + }) + it('normal route', () => { + router.push('/menu/menu1') + const len = wrapper.findAll('.el-breadcrumb__inner').length + expect(len).toBe(2) + }) + it('nested route', () => { + router.push('/menu/menu1/menu1-2/menu1-2-1') + const len = wrapper.findAll('.el-breadcrumb__inner').length + expect(len).toBe(4) + }) + it('no meta.title', () => { + router.push('/menu/menu1/menu1-2/menu1-2-2') + const len = wrapper.findAll('.el-breadcrumb__inner').length + expect(len).toBe(3) + }) + // it('click link', () => { + // router.push('/menu/menu1/menu1-2/menu1-2-2') + // const breadcrumbArray = wrapper.findAll('.el-breadcrumb__inner') + // const second = breadcrumbArray.at(1) + // console.log(breadcrumbArray) + // const href = second.find('a').attributes().href + // expect(href).toBe('#/menu/menu1') + // }) + // it('noRedirect', () => { + // router.push('/menu/menu1/menu1-2/menu1-2-1') + // const breadcrumbArray = wrapper.findAll('.el-breadcrumb__inner') + // const redirectBreadcrumb = breadcrumbArray.at(2) + // expect(redirectBreadcrumb.contains('a')).toBe(false) + // }) + it('last breadcrumb', () => { + router.push('/menu/menu1/menu1-2/menu1-2-1') + const breadcrumbArray = wrapper.findAll('.el-breadcrumb__inner') + const redirectBreadcrumb = breadcrumbArray.at(3) + expect(redirectBreadcrumb.contains('a')).toBe(false) + }) +}) diff --git a/admin/client/tests/unit/components/Hamburger.spec.js b/admin/client/tests/unit/components/Hamburger.spec.js new file mode 100644 index 0000000..01ea303 --- /dev/null +++ b/admin/client/tests/unit/components/Hamburger.spec.js @@ -0,0 +1,18 @@ +import { shallowMount } from '@vue/test-utils' +import Hamburger from '@/components/Hamburger/index.vue' +describe('Hamburger.vue', () => { + it('toggle click', () => { + const wrapper = shallowMount(Hamburger) + const mockFn = jest.fn() + wrapper.vm.$on('toggleClick', mockFn) + wrapper.find('.hamburger').trigger('click') + expect(mockFn).toBeCalled() + }) + it('prop isActive', () => { + const wrapper = shallowMount(Hamburger) + wrapper.setProps({ isActive: true }) + expect(wrapper.contains('.is-active')).toBe(true) + wrapper.setProps({ isActive: false }) + expect(wrapper.contains('.is-active')).toBe(false) + }) +}) diff --git a/admin/client/tests/unit/components/SvgIcon.spec.js b/admin/client/tests/unit/components/SvgIcon.spec.js new file mode 100644 index 0000000..31467a9 --- /dev/null +++ b/admin/client/tests/unit/components/SvgIcon.spec.js @@ -0,0 +1,22 @@ +import { shallowMount } from '@vue/test-utils' +import SvgIcon from '@/components/SvgIcon/index.vue' +describe('SvgIcon.vue', () => { + it('iconClass', () => { + const wrapper = shallowMount(SvgIcon, { + propsData: { + iconClass: 'test' + } + }) + expect(wrapper.find('use').attributes().href).toBe('#icon-test') + }) + it('className', () => { + const wrapper = shallowMount(SvgIcon, { + propsData: { + iconClass: 'test' + } + }) + expect(wrapper.classes().length).toBe(1) + wrapper.setProps({ className: 'test' }) + expect(wrapper.classes().includes('test')).toBe(true) + }) +}) diff --git a/admin/client/tests/unit/utils/formatTime.spec.js b/admin/client/tests/unit/utils/formatTime.spec.js new file mode 100644 index 0000000..24e165b --- /dev/null +++ b/admin/client/tests/unit/utils/formatTime.spec.js @@ -0,0 +1,30 @@ +import { formatTime } from '@/utils/index.js' + +describe('Utils:formatTime', () => { + const d = new Date('2018-07-13 17:54:01') // "2018-07-13 17:54:01" + const retrofit = 5 * 1000 + + it('ten digits timestamp', () => { + expect(formatTime((d / 1000).toFixed(0))).toBe('7月13日17时54分') + }) + it('test now', () => { + expect(formatTime(+new Date() - 1)).toBe('刚刚') + }) + it('less two minute', () => { + expect(formatTime(+new Date() - 60 * 2 * 1000 + retrofit)).toBe('2分钟前') + }) + it('less two hour', () => { + expect(formatTime(+new Date() - 60 * 60 * 2 * 1000 + retrofit)).toBe('2小时前') + }) + it('less one day', () => { + expect(formatTime(+new Date() - 60 * 60 * 24 * 1 * 1000)).toBe('1天前') + }) + it('more than one day', () => { + expect(formatTime(d)).toBe('7月13日17时54分') + }) + it('format', () => { + expect(formatTime(d, '{y}-{m}-{d} {h}:{i}')).toBe('2018-07-13 17:54') + expect(formatTime(d, '{y}-{m}-{d}')).toBe('2018-07-13') + expect(formatTime(d, '{y}/{m}/{d} {h}-{i}')).toBe('2018/07/13 17-54') + }) +}) diff --git a/admin/client/tests/unit/utils/parseTime.spec.js b/admin/client/tests/unit/utils/parseTime.spec.js new file mode 100644 index 0000000..41d1b02 --- /dev/null +++ b/admin/client/tests/unit/utils/parseTime.spec.js @@ -0,0 +1,28 @@ +import { parseTime } from '@/utils/index.js' + +describe('Utils:parseTime', () => { + const d = new Date('2018-07-13 17:54:01') // "2018-07-13 17:54:01" + it('timestamp', () => { + expect(parseTime(d)).toBe('2018-07-13 17:54:01') + }) + it('ten digits timestamp', () => { + expect(parseTime((d / 1000).toFixed(0))).toBe('2018-07-13 17:54:01') + }) + it('new Date', () => { + expect(parseTime(new Date(d))).toBe('2018-07-13 17:54:01') + }) + it('format', () => { + expect(parseTime(d, '{y}-{m}-{d} {h}:{i}')).toBe('2018-07-13 17:54') + expect(parseTime(d, '{y}-{m}-{d}')).toBe('2018-07-13') + expect(parseTime(d, '{y}/{m}/{d} {h}-{i}')).toBe('2018/07/13 17-54') + }) + it('get the day of the week', () => { + expect(parseTime(d, '{a}')).toBe('五') // 星期五 + }) + it('get the day of the week', () => { + expect(parseTime(+d + 1000 * 60 * 60 * 24 * 2, '{a}')).toBe('日') // 星期日 + }) + it('empty argument', () => { + expect(parseTime()).toBeNull() + }) +}) diff --git a/admin/client/tests/unit/utils/validate.spec.js b/admin/client/tests/unit/utils/validate.spec.js new file mode 100644 index 0000000..f774905 --- /dev/null +++ b/admin/client/tests/unit/utils/validate.spec.js @@ -0,0 +1,17 @@ +import { validUsername, isExternal } from '@/utils/validate.js' + +describe('Utils:validate', () => { + it('validUsername', () => { + expect(validUsername('admin')).toBe(true) + expect(validUsername('editor')).toBe(true) + expect(validUsername('xxxx')).toBe(false) + }) + it('isExternal', () => { + expect(isExternal('https://github.com/PanJiaChen/vue-element-admin')).toBe(true) + expect(isExternal('http://github.com/PanJiaChen/vue-element-admin')).toBe(true) + expect(isExternal('github.com/PanJiaChen/vue-element-admin')).toBe(false) + expect(isExternal('/dashboard')).toBe(false) + expect(isExternal('./dashboard')).toBe(false) + expect(isExternal('dashboard')).toBe(false) + }) +}) diff --git a/admin/client/vue.config.js b/admin/client/vue.config.js new file mode 100644 index 0000000..9737d26 --- /dev/null +++ b/admin/client/vue.config.js @@ -0,0 +1,128 @@ +'use strict' +const path = require('path') +const defaultSettings = require('./src/settings.js') + +function resolve(dir) { + return path.join(__dirname, dir) +} + +const name = defaultSettings.title || 'vue Admin Template' // page title + +// If your port is set to 80, +// use administrator privileges to execute the command line. +// For example, Mac: sudo npm run +// You can change the port by the following methods: +// port = 9528 npm run dev OR npm run dev --port = 9528 +const port = process.env.port || process.env.npm_config_port || 9528 // dev port + +// All configuration item explanations can be find in https://cli.vuejs.org/config/ +module.exports = { + /** + * You will need to set publicPath if you plan to deploy your site under a sub path, + * for example GitHub Pages. If you plan to deploy your site to https://foo.github.io/bar/, + * then publicPath should be set to "/bar/". + * In most cases please use '/' !!! + * Detail: https://cli.vuejs.org/config/#publicpath + */ + publicPath: '/', + outputDir: '../server/dist', + assetsDir: 'static', + lintOnSave: false, //process.env.NODE_ENV === 'development', + productionSourceMap: false, + devServer: { + port: port, + open: true, + overlay: { + warnings: false, + errors: true + }, + before: require('./mock/mock-server.js') + }, + configureWebpack: { + // provide the app's title in webpack's name field, so that + // it can be accessed in index.html to inject the correct title. + name: name, + resolve: { + alias: { + '@': resolve('src') + } + } + }, + chainWebpack(config) { + config.plugins.delete('preload') // TODO: need test + config.plugins.delete('prefetch') // TODO: need test + + // set svg-sprite-loader + config.module + .rule('svg') + .exclude.add(resolve('src/icons')) + .end() + config.module + .rule('icons') + .test(/\.svg$/) + .include.add(resolve('src/icons')) + .end() + .use('svg-sprite-loader') + .loader('svg-sprite-loader') + .options({ + symbolId: 'icon-[name]' + }) + .end() + + // set preserveWhitespace + config.module + .rule('vue') + .use('vue-loader') + .loader('vue-loader') + .tap(options => { + options.compilerOptions.preserveWhitespace = true + return options + }) + .end() + + config + // https://webpack.js.org/configuration/devtool/#development + .when(process.env.NODE_ENV === 'development', + config => config.devtool('cheap-source-map') + ) + + config + .when(process.env.NODE_ENV !== 'development', + config => { + config + .plugin('ScriptExtHtmlWebpackPlugin') + .after('html') + .use('script-ext-html-webpack-plugin', [{ + // `runtime` must same as runtimeChunk name. default is `runtime` + inline: /runtime\..*\.js$/ + }]) + .end() + config + .optimization.splitChunks({ + chunks: 'all', + cacheGroups: { + libs: { + name: 'chunk-libs', + test: /[\\/]node_modules[\\/]/, + priority: 10, + chunks: 'initial' // only package third parties that are initially dependent + }, + elementUI: { + name: 'chunk-elementUI', // split elementUI into a single package + priority: 20, // the weight needs to be larger than libs and app or it will be packaged into libs or app + test: /[\\/]node_modules[\\/]_?element-ui(.*)/ // in order to adapt to cnpm + }, + commons: { + name: 'chunk-commons', + test: resolve('src/components'), // can customize your rules + minChunks: 3, // minimum common number + priority: 5, + reuseExistingChunk: true + } + } + }) + config.optimization.runtimeChunk('single') + } + ) + } +} diff --git a/admin/docker-compose.yml b/admin/docker-compose.yml new file mode 100644 index 0000000..6fb9ee2 --- /dev/null +++ b/admin/docker-compose.yml @@ -0,0 +1,25 @@ +version: "3" +services: + backend: + build: ./server + ports: + - "8000:80" + environment: + # 生产的话把DJANGO_ENV这个环境变量删了 执行docker-compose build backend 重新构建下镜像 + - DJANGO_ENV=dev + volumes: + - ./server:/code + links: + - redis + frontend: + build: + context: ./client + # 生产用这个 + # dockerfile: Dockerfile + # 开发的话用这个 + dockerfile: Dockerfile_dev + ports: + - "8012:80" + redis: + image: redis + command: redis-server --appendonly yes \ No newline at end of file diff --git a/admin/img/dict.png b/admin/img/dict.png new file mode 100644 index 0000000000000000000000000000000000000000..39423315b369313440622924265ac8f2c4efb2f9 GIT binary patch literal 40884 zcmeFZcU05&|34bAsFf7?bH};o-gE9B_kE7XlZ5x{^?L5dbG+Zl zSM00~9yodc0011kbn(0c0I)9s0N7Kpf3NTxj@>y;;eTQg4pzSbY6cY-g&)2O_|^7T z004!M!@wFXdS14>zP=0mKHbJ~;j~iIQSv zdE~s)ku5Dc8QR(w`=YI~yj;z6WHgV1sUcWKM_!8zxTsx0fW8p;-%T%1OsaAdo=12+ z{^m&6G1L8@KV<$c?)q$>*ryK(r>_7~H-Gs2!hp)*U&OSA@Ba0}A;A{K zhgwQ2Mg+hasXG%Tky%(?2`vD;FNM5N%Dayv}{yd5OhKqzV!%c z_qyyBu$;RwR_$BzHSX%XPTlRGq%D3VAwPkzC z6#CP)$nBO@teyeC4g;XK`tJsA(HAZkoK|Zpz<8|u9DyE>7^E0pUsDE;w|h~#y|!N* z>7uR0yB5|HZh$GTJ1Fb&OiB`Pz6VuL!-4DNx@k67#O)zs?L%p+zLkEg)D{&p)u>h~ zWqb?M=R4#=mSdVn!}@tM6{nahs(yWYw$m!=X+8Hn`cn>;$<|suyZl*OuTywzT|ttZ zca>}x-kj-avc*&B-lxO99)eoTI2AwnbUdIIjT7S(d#fkV@Wwwk6`?#r+D7e81?<*j z(Ye!*>BX##=xKuxcl87VZ@BYi;+-4)1uga~t?RktK^z_>p-3vd4<85jWDllNI;@Jm zrL9Fn+Wqhre($)Z8WQV6^-*buqo+*m+?oyTayvbs%WHABku~NgssN<0CH+&8q>NLv z7mmI|UUY;Py+bR?D<)bj+xz|8s+vNg{=7kOW!{+hw0PwUw`ePlhi^elJ`(< z4!ArW8XD5f?x(Q6UG)2`o4Ky`g53$ok_$XTj=#~#Xd`!gPlj(M8&V!0_AA*65Go*0 zg|iw9QG|7Ujbg3gx(nUfaGTomxQ2oGo|Q#ooKRD{51omsKJv;VM9)|svfSV*(DvxL zusoP#tDk@POgUYi8EtYbDj)8&f?8&v!boD^T?Vbkg1j3FWi3nfjFw|mGx9rrK9sMo zmXT{@ZZ{PJF6?65x|kNfMyOVe@OJ zBJTqIQY#|-hBEeHi&GD!cSM~FTVRNt@|%1;ezUh~{Q7jYUxDqsb1!+qV#GnL{oU>v z-}-~Muww<P<7=`-kwGfh(=zxL;K_-N%upI_2}qN78vsWjP8-b@WQ496L>5` zay!WaoqrfNFnxB=XeQTC@ct2X+6t*mXs4yPqPS}!(x~2mat{N0pYSUyb(CRBI68Hu zZeyc&wFKR^**zY@^78E+tM|KGK|F$~eS2OM`~ZN2x&KN;- zs(QWVC9O^M)~`0V2|I`y$woq(V^1Im>A}G zV8KGNCw_A3zt`6Q{gyb1u{&jhpk4nlKt=|&|MDM`++sSxeR z+WJL8?_j)eFM^dEQy*0cCDUI6SxFtVRhfN*WKBEc^`z#7?h$Iz^frR+flsYA$a8Et zySWR>mvtmH+0Mxh*C&qEPp4r|MN(T((^VaQj5VA~%8W$Bp^WKy&U@o^pT_; zY5khqZ;l<7{zM7j#MsicN-C=prensc@SuD=PEYoeGS!r&N8JfA560)70$%MeLY+KB zWWF`LUcSedu)3Y*6+l;N>n9yQGzG3Tj6&a~?55Tv;V|JYQ@jcVO5t5ZvQpEex;}Kd zVLYs;+IK{q*wZu;m0UEh_`M`eNj7ffC48l0=DlnCLhg6~;*l?IVjr%?_}MWCxp}37 z&_gBjEt^JpD66ZNP0CDXyENEZo!D z_D+YHrgrawfSg({Sz|H-vjnw3NYWIn-ErG4g-0Bl3a{h-h7Hlgufbujt{s%h~KG!fr@QC_2-Y(73Sa{d~x&nvZY+neU$^(zhf)IzdjgD=5 zytH3A7k72#<>(*deneBsV>YMT$g1$WK6C!W&aPYz?plENw~|d0M*1G`f+ziH@&)uG z%v)NF1#PO)S4nwo>Q8kK`y+DV* zOC3hTF}#g2iZ@j!#=dWO1A> zLa7F3)o-}loE!6+=!ZiT5l-8iwN*9iHJyv?9KU{>L6erpZ@z9L^Va@mL?x1cq8PHG z2Br+rlZ1TNK13EgGh7lHDnrMr2V-Hx>+h$LVhk1NkJ> z_2ql0>y;AV_pkR*cj7Y;Xq7OBLRj|%cs$gq$Ben1yo%0M88MjnasDz{H7YOS7cHap zOvA;;j?^wML`n>CRRO2Ss4-l4e8z9E-_&od-_#d>FR=$_ww?@Glj}?qut$&-IG>IG zgnRVwBoj{?%dcdzs7(!%5AaruHnlOjRDuPVhkp#D)nmp zUYpjNWZy)VFXHp~Y1Qy;93{opF3qF3!W8(xTi3m28o$xf?0;#Mx7?x;D$fXr8GYZD zR-&eyyzFdpEoNs0?Sef>hQStwn2hwfN{T|KQtS>c`e@%BkngrV`F ziRE#_+jKw5Lo`wr?FI9%YF;a0w4~~!A_`+*p79iU@aVe$tWjcz>2?A9mlcy>#CZH5 z4BR^#fE}gz$f&e!s)DEEYLZgz<3TGg2cG7d0&~WJoOo)IP(Ke#8LMS0#@<>vO@BOo zD{vQOg;a^7NB$PlwpD`~nc72n$+J(v!?~%9*C3dJfZLb)$$ypuiqDzOd&b}Pe+IhY zW}G=eD>^z7W%^T-C*;b?`jhCUDUH}yG@YdCZ4<4gsl}OGA$ziZGZe($xIcDkH7P#T z+%a*A%bc`-Hh~9$a_Mz+Zs}<@p4?J)BQ~gxE0=|rgToAUf@8HgD+BPd;`zEnDt0pXBM@CT6|HzL22FR0i7<-rKvFE3#_&*H+yE zvc5x?{xabIZsUo)>$CVF4>nUy$Hi%WtnOp??9-MTu}#GdE9;!I+%y-TtODKmnl;Ip zP@sV=H zFwepU!PksIRl8Jwx%eNHTbP&~yj7=)xnMh*y6n@cirKBu?T%3^R57+At8P!hkcQCm zJ=BG1L=siX%s9hrb86h5bmLS2v4i?}&tRGoO1aNPRzmGA!Kc!zVh#Ch3ON`V zPD!^BYoEP!#&>91Rjx_Wj6)i~&9d<8lh}8ycji8Q$1BFNzhg-$E8I|~tKQBWweCDT zFyS9qY@}k?xPB(mnka7Qb~ikn;;89F)n%;qZH&|=gIw|_<`+9`J8stOSWbEVZ0|SL z4$!fP{c*adWuYy;pgw%Ack;VycoSy-pVQ*8TBdS_k9Db0>d7brLyP4@grppz8K?g3Zl@}Amir~zq z%s*&#dvQE$c3HFdb{_0aiq!=Jal>>&9cYKw{k{e3OP+@I5#bX0B1r-E%+1EBq)B;g zqsHT3iJ|CriQO<`m7};7^iLTRv>ikC%wej~z>Y@4*7J8rwmvB;l##~vBz0%pe^y!uS#?eYj8P14k{zj30_l4= zZ`tRIq$X;NaW$;Q7G8vQ>RK%PviZVuYq9n%QXO7E|hsjh}+JY@lQ>mwD1jJY)4#Qu_SrauRtO~`(CU}go+W+nzB z)hgo4rtm)q0)qK)7dXFYD)8exG5|3m>8GAR$8grhuirgLX=e^r+AbyzWtdb?i?{ft zSP?Q7qRo@9RXXEXFqb$pccF#p-A2DW5^AuEeiJy)U43SiHyfEw-9K}RKUEjrc%uQt ztj>!-r`8;OvwtQ#GVLdAf)gO1uSrR)ur2=VXR!v15|q;<2is21<0mwu@;d^w3LC9f z&Vo7(!)9UNe&v0*mPGAjU9a#Mlbt+!+@olcv^^;@0LqE*NyYLXG1 z)M@a$uW8-GOkG4G^|JqB}+Gt2zA|w$3A5EntmL%RVrocYFK6&V~3tfsL1WvnkiWZ#HJdn`2WKxT}w?G!hj0h_{ri zn6jDg4qO+BF`faQD-~WLHzcx$6WvLa( zM|(zIGudpx_aN3V5htUuetn>15X?6Sy0OBfn3lI|W)NA=o2jbEWVN++ zNd!7~AHtvEPSkBRwG~A$PggUewGx7nC9BI4L0tJ;^gLwe7VWBl*>t3w&maFP-JF2}7OzC-g3?1oik>_@*NxXT(v`LEpQ>zkS>SPBi ztb+K$y?;!S!UaB7;D2MGp$dyIFL4)x_C3c$Lz)4hykbfvC0m&!-r9!rXygu9PshG0 zm@bQ9OHmRnMndC!A*3bhWexAjd#gaQUCF%&iO{PTPHmvwzmbz`ROy^f*_w|!CWr1xTikQCN!LJzQ-3R3`y2|a0 z2u3}}xmzl%z*_8+2_F z9kx}x(?3VR0{cRf@SafrLTGm$cm|_}wu(B8r(?k(9eC+c;x8(Yn=9Nb7PdwR!Xrr0w<2$@*Cciq zvZSgjuTQ-Grh|4!#i(8s8Y7Zj@h2r`Vi#S9JOMQ8_xF7ppZ^5Za4#U4$91kmG(bsZ z1Y&y6suO^a0~)Hi6UwV^;9iy#Xf@8|OU~>DthSTv@E#;T#bL?daLI);gN7yg{>MI~ z3}@s$7vGU$bnL_Nd7W>L2m8gi=aD>DPT;i=9(6-4MHi$Evfibu-Yd{cn;%f9mG1Hr zw3N~}fr`@}kEZKdW~1IuJfF=(r2|4oT`$O;`U|+MvKoob*p>jVqi34jzbyb6YL3DC zHpdr$9@wY?e5z%AR63PqqGjg^buEmX0fVO}=oz&>f{C3io+i~r)1~LILA?5!;Qc=8 zEZ$Rv>;tpm?iN&1q{tphaOlc|Csi5dyagPiyF;p*8ckO5;e1R7_eBzLMu|!)XAJTV zr_L*WyHDHuJI-q3Pf-($q;c5p8j9a~#*excfNL6wPBl8SoyIDP2Ch2VwS(0YSu7{$hXfL#6%i;lRo1@Z1du`$YV*xVW8%$>`Uc$uVtc@LgvP`8 zD2er?9tVJ$5VBnMpGZEF{}lE7t+q~rg5=PtBVAc^RJ@^b4G*qTZT-OAX;StX%y_0yRM`isW#`l>g<+_+DkK6MTzZoK zD`)Fk@1!&d^y~x4MeG}q)x6wp<7^9(Bz4>Mo2FySbDM?=U1_!+Jw)%$pv&>Z21DPR zJrs-b4ppdq( za|#vPw9jcY5o1}ob%SZvw}35yCyj9u^yY?bbv07+k*?IW)@RL+frCQav2CR061r6w z$~K{w(6DxWx)q26#VsFKvwmw1o0zX^Zx83t(r<vXA~M_Mi8g=qYu z!zH4Vr)-&{n5P&1s9cvh{3(Yn0G7YJqJ%jf(Ws|$vU4Q7@oI}|`i2ttt1u6?c=N7X z3Y;|hQIaN|zDOH0aX`Bd&x5u+JGR1|U(O$ts|_kv!0?><>SVM_?s}ZfY?Bz?KleHu z@@JY}{wKVj5Wd^1?Srt<F%v`V_U+3pn+!P~ox#6*k|-h8v@ zNf0^JC!RJ0Ss1IuO3~S|P+m^~^$#KTRKVQ0-OfI%fORhDPq#Ey{$4WL@aLw9kQ-H; z``W&fJrRCAvc|a0fvB_yd~@?(;wfSC$y$<~kQ>50O#_NH+FZzuSachuOOO_4#@E^% ztFbp~w6M+qL5Y%Vn&Le@CO<*kW-~|9;k+$9K$arJ@ zfLLZ&J+<57^(0@W%PnZiUD;*xG2m0d@p|~q2P;rUa4q{zh(ScoIAmHL#V;tsF8kDj z+n2Hwx{2QCtL@aTH=-;{5!pOb*SwmdNgdLKnHBR9pl&3bdy_kxXr5+n#-D~nZM|V| z=ul1m`l=v_roz3&4PEHOLzfFIMwHWi;sYX~tideC8;ZE96eG~G^vj8qyV8Fa#K zhqS)x&uv>RMy-yuVY3xhuf))S`UNT;Att)|LIue+X3dDgOT2D^T>KUfHShrE3}UzM ztmj7devO)Y{RG#ha+GP#TYK&A9!{P^@nqDn_eYwvxh5r-oR2mIYPcyJn3-ax=z*%c zsxW3kpK?Q~!f^1yh<;Xu?LDB)6OY^#UaHjrnxG%fA6%876FtSzvhC_ycps;W0Z3yP zj6R0`CVg(@C!K^5U?JhB!{zSzO|m%y>KX}&ef`-FURLy1X%Q+s2PGt09YW=BaYCFUm>yX(aczSjI(dw9e(6JGj03fdxO{?$GzL8>|f zx8^Qy?%JZE+&-rX{-C@MTj1SsHRMXmG;<8Kc)#8+^&lFNK1S5nca6Svx#+Z-KC<

*&J!BaF(atg+eiXh#T7v9)kcGK&gb#Nm*eA7|-f3Qpp<{NouE3aE*DPvH zzazIXiy@nptZw+!9UHCj+c*d_*dR5Me9n}#y*oewf~Jn?E5^1D#n$`w#u9tx9i!9o zMp!ApfE5KIDDL`~_zz=u-17&vtu(K2dx4M3R~@wBBl~A2=!Qm7EwsAVY)!WqOD%VB zP(P>J*mtR2=~K%EmQ5-J>xI-Fn7J?A9b;J%RNC-Y3)I&OzNO|j(TGegiXJy0?amJ@ zORQ^pqhMT4XNR`;b{!g9HGoF6<>;i-RQS&AFL#X@Qx@b5^D5X$7;6UJ{U~}`UNc80 z732-~<8EsDB>U91>%zb+0tFXMQtEU?ordvL$jLZ*yBcN-OQaM(iP5)Ph7a^GdI+}Z z2JNvW5NdE)&n~D)+0kHJrwoLO2r-WkjDy#1pu%t^el#}jgQymqBMwPK2s?FAV1)&} z;piR|4%;v-Rh`+T9$_A4H`}hhC_9q627}Kv;e`eNf`pCelWaO?l~MgC6Meqsdz^<% z-_DnI=vJvc`KXOK)Iux26W+dfu%M@a+z`{wZ!GAk^f`Onn_m}674XpLZXqMQ72B6# zj1igWZl+Xi3b}SSmb+5vlP*K>RzUkixlP57USsfd<4?ij$tgSdEKTaGWpfplH|N35 zP&FE>+sW91PzK{D#r_7}# zW9_JM2--)BB+SA5(86wd(O8{0WUMWtVrsJGdAqiCe)KlGyeEoorrk72eK{UWf8$r~ zp`%l15KpE*t@Zxy4BkjXKffh@mXmt<&Lnks zYtxPK&}dKiN*-gdXggK6kVV>ARPsqilA=K-V1g;QZ(mKSAIs#lx8Q|3qt&Ha1q55o z6as{Tp0Z_pinc+nOoV=(0%u^{l+<`#018{$UslBlsJLZDjrX5yJwE_sbbssz@PwSx?z+1xGXk@c6 zICmSv@x>aGWRRx(%^hwWNd;-fYv0-Y6^CPma(%f=m^f<1KIJ5p=?EX_%5+Y*^YTF2 z0AWIF-mXY_WQ?ex?-A|1VgkIOcqW+De2c)NX7i*{baf{+&D!2P-C2o}q}bF)RmJxX zdhcvUg1NI+xF_01Mm6khuD{fQ`ls)jP{v? zNG{&#qqULb>UE)UA?>S$x7o(h=y+Lq|9|tqe76LGH`YxzjWW|CZIlHumRx{}x^Z)R zvo=^Vx<0zz+w|og0UM3Rc49)NpU{?j&Vfi;I!25AkezyDDsn0+&ZK$e5o1jv4(HEN zk&Z5cI!`r{Z!iYxb(2(}i+zj&VK(UKBZxJL;&_4ir^>t6Mrb`ZBILT2&&+pk9z-WU zY9bq(wcxKZCgKkzSIVv)rWc|E3Qxtc4CA+Jz?3R4N@iZ1(6$%2^G%ZO2WFU{xYq64 z(LJRAySbJAdc;cTkuZ%^$Hju|cPZ2-w4k5Xr-JPf1FXrj`uS$Y`cog?`l$Q-o8Vg5 zF%qj-s{3iozV23`GpUUk?O|-VfP}%RAXKc#dPcyZFMm_I%N1~m9#kM`Ld(u*A@@@a zQwp|pznL?vNmVFEDv^zRFHM2hQH;h^vWopwxJ@a5zevEy`m{s^6*dsXz{7)aSd?T` zvXXwDlH4lzJT#DA;zyQm!yfWjRrIi*Fe_`1T!t{04blmi+t%&dS&qKT+84~lo0n=C z>xuR?Ih{E8&d?KezcXeM>sQJKC!U12&4*$nn~U8UZEuF_{VM&o5$OT=^n>VJ8HLN* zFx>~ReV@n_w#!BByPD=5Ra96a&zBcjh70ztXIv@k>BK;JJA|BSIbFErR;Pe9w~Xx+ z2!oe^OE$pu`E+~I+{e%Q+D2Y z2}`+9$|LXuO0DNz+lo@aYNLx{TiDf=4)&Dc?QL(=;$GslF+rWsc536cE->yBE+-Q@ zqO3~+us6ZwJy)#?Jvo_PJIHcsQ?!awB8H>MC=gWGD%=HYCKycJEEtE9r~PJgg!%D= zhtsCMsNFm?O;2SbO?8`$7XOudF2MWp#A%t%P?px*q0iDiylfy~-|>vY;{4D`QfcX9 zNFg%foe-Ke@H?SO-)9IoEOd{i!>`7fdIxp{3bA|<+1Nhs4p>ObVxcR%sG4%E)>T(H z3S|Y|9j>Hud^*nXBS!Zyn6=X~hJYD59xZO@ z|7PG;_k0{(R?-X(^FI&TEhhIS%{c8RIOH`^hDA+WYz7i)6%zRYCYtlfqD$*jT=pLS zO!4J*1v4hrwVfl4Vt-hr+JZ=@NmtZ=FLw^z!>iTxG4N&!gNM%u3n1VSDIzQG?!@>` z=VIo#qWLt&h6pl3=5|rkm1(~T8I@!;Wmg%g_(dBq9+!=sMs}!Uz^pxB>OS+MbmOH} zFm?!sLm96gHU^rgc^fzI@3hfu4T=>CY%lq5Y>tO@xS@u2>opN_{lwbs#a%y7$rsads?KYKHm4*E?;mg7hqMY+_daq|qLl@Ac^tO}M6V|sEI0`T2ZaCYL(P;D_n zDwQJLQJ{Z`ix^%`;tr=~jWs<%l>GMw3Xr}y+mR1mvdmI1vM(m^qocnt?H5+i}v2M&q?~8k_^=n#pw8^UPq}%~Zxn0RO1@?v^BD91mBK^V&}C zO(F~EK4is$ntIES^&V|XdM(+cDfgUi8L0JV{esg5`lO%JxkWN^USa;LBbzz@oU>eO zj<@U|zjdRkbI=(TI4g#FcmIsvt5AM$rZ;Avyh zPOGi(n`yl=+v!unll`Di46|D?45)3M>+`9IPvJZMJ)fHSMrgOP^mvv(`0ei?A@mwR zSW0du_vyCiuXWNC80*5ZR62jAVrRk;kJW`UE_2rwY1DfGf+KkTHlFe5NsxK`Jcvasqi!o8859s-URC(?cIASu3jRGXx=%0*3pk3u@CE3jxh-3Y`6r|-If0q z8sMLUvA@Wl{Cno|lm z1s6mg7i{^YUsA|R`p0##c4W%NKR!z&TsB$2Bkv#uY?XiPDE$C)JknW2-cOelGXHUB z(#6h)|JR87KOQYUJO>xB;FjmlxAsC##{RwaVqx+p7WG&R+5LL{{7u`D>Zg(a-v1)# zw6bX3i@GvE?y+OXI_%Ue`~Lmw+nr}QpMO09Tw!zZ0xlvc=^{b>T-nEws=#7s3d!Q% zth$i%G&q#K`G<%DZjP1;5bL3gACUq+T_7th9dvPsam;22b>g_=rn~h}>xTNSqHwp* zSKTeba?dCBrd=DlP&C}W=j7y#o9tS_uCBE7gV%oNv*)SSL*VilcYRaj)5rkz-OFEY zJ@)9VCE!9t3LXK=&WyDj{y7G=^ZfvR~ncX*)(&3`mtjUkhF_IX2l;7X9sY~ zIMpw5c|dx$aMazJxz)sNY+l**%tkqgtYG>!DZz0=0n#)?i{5W(jDT~gD#9JNjwoqv z;2zFD>YYE_KX0g<{Dn_xrj~@^4Z>u8EumD8W##uoq*Se=?Tn_j_r>HNKSqBK7jVcz z(M+Cz_rF!K$+y?4*HcNX`^OShF&l&rpO^3_Eat~O3l$9+|0`4v)G#17U7*`!;By_m zSeoO$f$rqloCmLhtgusKU*B{EmVn>OSp%3E?>fBuNXcuZwax3{VyykTZr{) z)iH4Rdg`Fa?oPY251u{l1EA?Pmmf3(a&>vU&Q{WMvBz%bvY+``pKE&NcbSj=hKU75 zY4v(Xn~3Z*ffS7K&e^h9-1Te|Z!TDl5Y9w`>X}baoEzmhaDb2VyW<)jVgt+P9By zHEbvZMX(Dx7m8uas=yt;+$EmUmvs|A5^UMGc`UUSuH{T>t@7WMN1Mr`z2G)sr%%0BCv4@%XSzBUP!SO;pV1f8_4Ut|Xb6?0E_^wsU$bcfeG2f7@PqrGmX@YSe~ zTx2^=4CfEM1r-j=fiM6&xv3EzS?szAmoKH;L*{RzV}}ath2Jv`l|==Jt{rQ_jDta@ zOc(pRW+#dDxLS;v4rcp)FLjgbv^{SHp!wJ^=W~>Tdrm(@1Al~0u7ZgcES$V$ZSoNj zNdZENvN{+4XcPZFfgxOF5%TDv492Z)@pC)%d$^leVa>o1RmVJFU@qr%=2CKM0odmD2 zeb?Jd#dm7qyx<#O7n<7Fmc}R|M7+8VEe#HvXlxZOtob`rX(Vv79f0AM_?$dxS7|iI zm2x^TGrt&=_cSsRiIQyzYO$MJ3!H!OPROL3PB$@6y(Bf$p>ZvINgI#zpt z3i(v2plW*EwINXJem~mry~Gq#e5W35`aZ0UrsdKY!-n#~ z+00s3+4?Bcx*P68r-QSdh7Z+t#vkb#Cf<2SK1r16n$R}*#DHhiD;f!cjhs%W3Yf7;0{- z;WA9g&t4-)f#6kWClMBDdf>V|@Z394rlmv}p92@JmX>ozvG>4CW))!2dIrj_{8T4T zVB`qZW71PthyDGokoK%Dc1^{jV!5tFWbD;nXWf+~puk^^3Lj>xySuP19ba|50H8(O z@B|Cq(^@0l3c(ANmL>rU}H5zsa_asUpEVj_{b5HDWiI>|JO{n((X(Wh!ue)fNshhw&9){uCUImCo?YegQ z=E}u1z_)EpJDLD&xe^4 zx_|W`5#xonwky2pbG!SB2;2PM`Exgn_ztSs_t9Z$cED}>Hq`Em+}4{hCN41>o>O%< zg|mvmTW-b(uW1we$QDg!Lh+bM^m4KiVf2za?n9+YrRkm@loESA0QM`4K-)%TeE3l_ zDUo$Hlz%y9sb&H)Mn~Dka?w?%H9GzkuLZI;_QYR*qRPKTIFqq!5?`$8Oe18a{I1s# zKYVUO?xRqb(ucv%8zk2MR6-0dSJST=-8z!lw3>08O|^~nyyJO$@Gb75XqOYJ!kBSs zwM zE}ogPsllD9iMOsd+r zx-y6~mNuU&dTy)hX2}=6JZc2gWTNiLbsLxN!b;p>3-wb^0edej>RPlVGRLmVfw$_O zn7G9`++1j!uw_2;SFSd-3uXIu6FaZPo&LD^1Q(RYHR;IAusAStHPF@PQ3Ga*aY8BB z9hMyQY)<6lf3W)Zxm^GOFXVb8B|msB$qg!O?)(ww&R?3#n!8{s-n{s0K4-wVp_?g)CNm?)j6wTm?}E?dAEg=GmKAjk%C5U#^Uc&o#HQ zo!{VPi%qd3GVI`4V4>Oet;v8obWbb#v(LX>vgR%nTJRT5!53M;AP zQO`NbixUILwj}Rs3hCDrY_HuxnL6^)(npR6=}vD1*bP?~)Ki+whNJ%!Hyrs{91^Hx zFJ*dpZe6<(|1gEDr|ki+Eu~(WkevD2NO^Q#UgTb1^z5T~=-!b7+N3_5W?cm7KhkA5-!V%l!K(p@FZ@4Xt!zi zl$#YhVA6PwvLutT(K2SZ9Lzx z`exNffk_3OS3H|JzX+GlM;G;KBZF1%6fgr25{Xli|~^Baq3EmdpiK$ zBh;%v?F*kg-<1Pj=r9^rO^B-vzY2YqeCh?!7=7cbpMRDO-cahgG`oLBM{?#h(S(Lk zX(kMV16RKnYcIPmIdezxw$c5x3V@DI(eh_UdPVqT<7cz%a|O8AjO*w&6Lg|zR`%Dd z{L?XSZRPOGOv0E!_A%jPLmJjqa>j{LHm4yGX6-yyMu}R8!S0s`J33pSO+LM0(D##e zg4!A+GxW!zta=Hi{3lo2_0_+XdH6`zA|*wy^$jA8rb_^-l%AL-f__+{1Df&(*ED+8TK>8`UpL*;83ma0d( zO?479k)tS)S4a^5!Wp+7p@bdUej$%uBu<`osT%b9Q)PAkEcEKiQ=^{`#l}i5%nvsW z?4L1FO~3`FXIM4TOy5@kLiyNIZ;XLR|AVEzctpi<@$at#nb2-T;&8Q-Vu0nUHr~0s zF>PMSUo7OSpGALsIrPiE|L?|_|9|!Whl2J02_svz6NG8t=j$f)Q4Q|kO|f>Sn3|Kr zX8zm9<$q&|x1S^1NyP7(325)IE1r-!9Hn?4Mk%of;(dG(oUb1|bmLxM(l@^U1!(NK z22g=a88LXm=XP~5I|S=Gal<%%pAYZEAQYcsWIE14r3muls-(b4Vn0=(>HA6Y4G&9<=p z{FCxUrvBwVni_+BKk}lyDD*1=#k7tc8(x04@z)H~+=H4|rOV(_;lM$4(Z~V`nw(c0 zAhAAz=hnRB63YqSP>O_w=P=EtTVl1&xqny#VGo}wK-%6=Nl-)IX+Or5{KI1xKs z_l8cmBC9L76pGnwIns6aUm}Dk{TVn5p@h(c9-Hia3a}&73v^A*n>XvVna_gQF~g?^ zm{s7qA&f*xM8PB7>zarNWc5irG{UVqq$aDrqM`c8+c%}_)IR2j0=f1jAT$;+dolr+ zy~mGXMCiU3fc)M=4nz8s1pI~4|FIc{_B+VR*}H5AW66B>(dz4R|CD)o$2tl+@I&Yg z^{LQJP-B1fk(Pra!SBd+v6=GTInrI!0w=z=Qn^ah^^o{+ETcHWPMP&x^WXaL1zTR- z6^GFF*gYpN8QBa$)dz$bPU`%!XzUg{7kswb5_I%k!G+CRi29AQ<{d3BtACQ|vOFGf zBfsya#Co$o$HJHF&MvUEIlg|6CVZH%36zgc6oo_~5?&A{2ST7E@J#J>5Z^BMJDpEH==l1-t9CxgUHGiM(*qD-nUgLI-CYhZ@T zZ!gfIj#^GRoiNBa5^DV>kOWNwDCewz!xh`%!R!M6Wgb2a8+W9$sqDX;_?z=$(Ag}N zO4-szXxL(a$NZ&{4Iw1Ur^(xBSl$lpP%Zsy1}~?j<(R(DMj4Jxmr&LzAl^J85oR%& z-QzI-kCf{l!YpoFczJ)QLwzwOs*y?aaR+If|w;8!P! z4W2-!wTr^6Ls4u>|I;YhhWVrUkCFlE0sqa~t^&#n*~OZgSbsA&u_+T?7j;nG6F2V2 zBavf+CiNbo*Ja;leMlMaZGR&Hj;((3aX{wHM6mElmoYuLe)ceW@vLgXzSBY=XD!T4 zcn^gr^SV%W0HMcFPjGZV67A4A`HV00iPP9qfd6P6z_S;#_kY(lvkl3`| zF?7Yp0pa8WeHj>A{d3kgVM&w0~fw7|4rXO+#stqYmpt3SRU}Mvlx!tR&U1M(Jt8~`Q8g#6uAT^z@GQQ z)a%*j6m;YJW^qGgk(A++hffLT_nQ7Us&o=8$Nrm)zM#qfp=K6eu*d(f&;N^mp7jI( z+n7jtL{H1*yi1zsyJ`Cfma$07gVl(b{Eh6F82%R>AL!zSS(zzh#--gBjo(FXXK(5k zxcQfDEkz4u@j^B$XSm=QQdhLf-T!&Utu}!EZZz}}3?usan?wJ(N%QlDOp<82E#cLF zW|_gC@b&kK{{b1=w?%Ez|IghLcv_}Q&P0Z>c_qbL!S=pvdO6IK>wes#_PEGF`@9=q zE|?$VZ)~nJrKC*lHkg~|{wrJb@(#>6HO==Cu9iA4$+COzS}a$Z)@%l=?9_1HXaXl=}MvS|we#YYbnARsvf0>kY=aIKH?njCBx0kRX#`dLKqsj))vs!~< z&aFUh3J25OdQf#d%<)47eCB8C#mxr;Sw>TB~(kp`)K+Y2M(Xq8%Vx-q-%gI zIrW3V?PkK~^M6T2O2u7;?S@ObrPP0U{DLsMr<%~Fl^_XX7II)S*@Vxp$oQM-8bavv ztl%$(t7SC@wO9+wK3R&$!fnm_aiXQfhk=oQ+T3IQpV}re-8AOpO^F0|@1~-4~wm!BrX~$g*aW)k$JcnGh`X>xq1K*=Us8=vL2Q^};fA8rK%- z7dX)y&38^&mR(pLH<}R?J8JLUcL3q<6`;NwF8tt2F`@DF$fI?e@92--E9L`XHkB68yv0KPmwz?}9YK;=BNIX(Zsqxv@bS!o=Ph zcz!+b=@HonvA4;43NO%QvqIV8hVbP;)dYpJf~jY$|JBsz+`RxU2PSWW-Q|JAW$|W* zsV4Pk&Dzn>uf5ocmSp)UvkO9%Ab!N)46@qYVm$POHUGqsi#JpgQe}8r&(Qz5nt@z{ z>B)qGPSs|%{$N&&X6;$IH$i&gjMJ7P<+`dd2h@m7R4%6rIv573a$OVQ1L%ao3jl-6 zR~F0i17@iIE~el}vBFY^uMA|-_ktYvqm{%w@gt1V=(P5X*^l!|?g0@`OkSkbHOoF| zG;DloU>b^vkI=a9xR~8J5aA3kK=23V^ZL;V#hiCN$mC7^MVh3LnO!r&cQ<{mnOzc| z?SE_UyW^V5w*3z%>VU{qL7KoQqjV5NK&p-c0@9J*97I5*BOQV|f>KAMD50n{l_oWz zCWwlZfCK@l2_U_M9zqGf9RfP-{_g#~-+iC==DnN0jO3iN&faUUy~_8y_Wcj{pES|U z)@x=Uzy0FzBHb*fbidT~>0(&YS~XK0#v67zZ*6g2X4)d5E_R%Oew6je3#yB`V}DmI zASF_cE_x_#(L)og2JqQamo6HNd)=Dzc?mr<*s;bP7RRK}^^10&r}s@+N8JJU;Sb|( z^$qQA_2SC;_1#<1&Q~L>gJQt{5Etu^{^~eVT1}~LalwF0slM$`QL}(hw~D51x>&2b z^~l$KN8fcCs_bJGksCScp)V}vlRubq|Ag}72lv*n=7q~;C*w13^#y1)IxZySi9SvV z8}4XvQ%gi#HC0Sjyc==iH+$AI32J)#Tsx4QbsBcFcMZ=(Pmj5Qoqie~Zocq= zuB0TwQif?0RCdcVp3aoXODI>ibrumaV$IJdpXE?xla77Im@3WEM30}lv=uUdc(E^i zYl^qFuVL|*40uV}mG?a}jw0tB&k{FyxPi5>5e=4O%_Tkes>h7C=$d6pn98t}gSZVF zKHtXKsc#HPZv=z@{g3|b!0#mF!I};lQYjilp6=%)29Ab`WQ z_+n8@i>x5N%G9Gb>agAIilVx%;rA~|Q#TQ6xO8~}l+G~lrl?)f3a8`yeN+R6Z>tVz zc;|&>#|KsGk*lw!ncQp4(bW@>JI@=;fXjAz#e0_pJ*-Aaf?5Ih{abWogJnfK0CeB& z&b|QW93>~q9K`T}g60tq!8R-?X6ER2ynsZxOL}55X;)$za-XVR8m~&;Cozvk zG#i<7vq7+5{PHPR`#yZBveRgB)RyhB_1~J-zds@?d;M1J6f{a|4EEbFECD!|Du-ShSwVkx3S??E0I1>Mu z_k@Ukah~&|hR^YZ#WpnZ>l>Afjgb;us*n*jfO9lpyk{}-Ao_63x3bbPFdN_#TbC{z z+~&PrdgLiDALSl-*Z{Lp;beOJ8DVp|D6kd4g@TVA?-`Q8XB;svu=g$6yo>a z@Ds^BZ4nIz72K(0ruz$G8<&LF291UoyygGqof9Bay^JBeQ^2jBSMcuLyc94XWR>5v zkf)I!?&RH#a<%A7pLR-`ymzB5H{Ox%=D>>qQHj!n=vuYZ3ZEzD%x@I5zlGO2?DY7O z+csxDx-4Hfr_{BVX5$*q?!`8rsk>O&wk4$66)1fFkG~R>8C^AC%(w{O_}fSA<@3}l zB)Qj~7B_n;Xo1-2*A+;CVE@_zjxp)AV^343?gj@HGSRL&$S(5z!M#6YCYX0%m;gEv~y&5oTl+_iCCY4_rzz-_rA>lFEO z^?^WdC^KC|DJ6r5?s62Nm(quGTB=8{=F1{%Pua8=lyXm%w|w zN_k-iUQ9Ht7N;wv=#EQ%3!UP|x`EoNNqvtwWQV$+4$U=32AcUBKn0B-`t z7y`w-LR#dDbxpMv7IgAIkTskhUwljmyr0Xs%qPJ3{Ab<|RFoa=YH@mXqrV9{-GBpC z<1v}PKQa+2rMgjo_m11O-pjKo`-+hbDt{QI)S`&nDr!bYF&sFD>SCg*#Ma0T6)>q! z8h~BxRN6z_sUlir+3se5pnQ{R6_!9ITa}!kc`8j_#wra(!(R0}9hZAXDctHaqj^1Q zX#PwOC_{A}zz(i=>l7VA+B45uk@dLflGO37H$On9VmyV_>S85Vi7l|8f{Yc6Dvi9X zs0{S?COSeTsP-oC<5Xy}4#`Af)sk&e_g?B8C_KJ-GxW-Stv*8_YJrVJEaJC z8?JU(DW@|2<@(0WM8mm?D+R)ERG~A>?y3a)q~h2}Z`5%V(~Vx9$RFgir1BUZo3Hyv z?1{5!niWs?yDXqZHb*}93TSBdR)xv`B*7USsAHN17VppOx$EzrV9jZ>BFlglSpCu> z+F(~NIvalfe)^Z_gI#XCLV-os_Fc zUKFLjb}}oEc%clG{9r~xtTpa1ZMX*BoMwIHHt%*u9mh%QUk|G=RrIjzZpCX#6Hmjs+%GA|X~H;H-9O3JBir zVW}Z8ERw#6Edzh?3qZadlXJdS_i*ZQ43||mmkl#IZRpOf+QcA@O80}ur0={8(tV~W z-k}2_NRbP@moz?jR`E1MLNoVP@122(UDe~5ROE*VH*FqLC%aizjHADd;A|xAIlww9 zv(kB$)N)``;+j{=BrB(b-IiV6GF@h*NXZO~@5~K$kBWT))5&}SpwFUsNjB=Ob0O+7Y|F8^yuAoC#tDQNb7bF;K%f#a?QZ117`g<;D0%Z)KF<&8yr3M_+*Sz3nZf10% z(TH)Q%BUHA?Q}=r$IlG-Za24dnd@)T2Y@^uSka_~PtTYm_i5EV4{5D#gc*?zyTKJ2Ys5}CkzK7et?NTYg4`( zAI`88<9r2_Dovi$O{Y41S_~eEMLV1e$Q)wK_(zWkg^JiS4*i=|_>(ihVInPR;?-jH*yK*ZFG;wkg1**bSD zgX9wf7KlhTG?T(`p!f!8S#q}Qr`)T|*U7X#e)96PD|4pLrlddCb8ZB^m?K;teq*@o zoj(aSG*jp3I*-X0o7fAsf#_==`^rAf2Ju^AM;iOqhbrHXmu;8?ZJt@|6+d*6b(1^o zJOJw0T&UWgmuU%&W?qS6kIoN^yTGo<#~qI$eEw1Ho1~7%Q8m}=S!nVFek7;=Dig~({j zWpE3qB5Rol%muEm1C6Sz8;XXU*{Es~jU8^}vYu|oDDqG96zZZ#;o~HC=}nn@*{ZqE ziKsS}1=-v6HK@854V&;+OKdTlmbf3C$jNcZowC&*scW1C00Ej38(fM>*I1`i)xE^6 zE?!I@lW7%oAOp}%92yWp-D++dmOXq}A`qEKkMDjLvQ9TQb;qmrQlmP1lE`GK&HhP0 zB?AMX3i( zBY!sZNorg^U9zEXIV7gZsN`M1eR3~lLWkMfeD>EzG1LmIc$=VpKx+t`!mRJ1^cTR@%iBL0l;0W zE|D+l(o|jt8ghmFEYmeD*?IXwE${a?U`jpaQ|hl43^!8@x$PD_ zg(DpWjQL(Kk6-7Jl#h8e$JX@{%Huw~&?vcCcx7Q7eGM3jYaCJHBBRJMTI5(6?PGC{ zug3EUKPl1-;87*(8?}v~e0J8O!GF)OgRKAdMf(s7+VTD0-=^6hw%w#h7wKjb-TuDU zvIp98p8Ny#J)u=h(6$RnadW>3MiYGg7bP`=|A8Wfy7$>Rhl3=8iFT{}@x$!@aLDk_ z_=7WU{^J4RZn(&b)^O(bOO2C$w+@IChLQmxvBMhL`Bg!h!d!mUi_d%KH5WSCUiVM9 z3%OKhE(geLr5l3$%nJ)00-18}YhWuG+vZIUYH)NMtJ(+czq79PoYn_}#6y1)wrBy$ z*vaQm9&=t9(Y`6nIEEhYcg#%Wr=mBA#P^4gryRJJfal(nYdbt)Y$>CFnwmgV6dY~;?!n-9C@}nDiBfbAKi%07QmPK0m`)X+T1`Eb6#4-{^&}P z<_Y9AhZ3k+rAI2hz(zQDQrRg>5(SJ7j{5pjc9c>*^&|0Oyrj5U&5QyIs95rdpE~l< z1PgFKo4ofX$9xM9qQ~8A7o82!c_uUgYQu&fdDA5}XZ;OaxRP7KkZ(nv^2t+Wq=Jji zc{8IGE*nClS+;bp3&lmEP1WJvNsoY!B_TiI6+!1JQj17x#w27|lW$P+4Ld8G5{`f5 zqH~RoVX5lk$K5my@(b#&CzL-|bi(L~xQDB>8aDK0()z3%X?C=PSgY(5()fcpv89sn zmOE>ED}~gj3laHA^QQyrToU8S@YH_i?!=52A26DZg28;(cDwd`0cn)AQP>d-d%NAE zJX+}P_pq23)cWKMf3SaSfExvgnQ7jY*k|gCVZg7arpaIsZp{hRn)&QB^2c`cXDcT} zd0F-9l_^!4BrCi40a_Vv&>~@2#R8JfO#|)AJhR6$3(Mxq=#?6En9+w1Z7;j6+=Hho zO>f$l@J=FZr6|q;q#QV%ExKL1pS|6D>GhJ5EN8vvrM}PnH zKAKxW;A-m2cIy+(W_53M} z(Yj^Hr;%OIV_{Ho`PD21e-{(h`F!4!zma=o!1cVGY1y69s+^VF4dUFuytHosX&<4> z0E*7!-}5Jz8t??dIUky}0uM;%6|aw3q;Z2`#Hky|dG;_X6lrc`T>3qxF%oF=2f*|C z^{k)NDnH@jcsnr+Z%}?6;hYy=GaZJzY})yO&h?~F0;lSlq4Q*tkaMUDtA!1~q@6SS zt%{se`l1RcnU%3DxIXAMhrAayP$oBQ-MxCohqFUe*^K(_?2|7LP&oq%aOb@WAdzC( z*r(0`Sr>vt`ftSeun$LLE_PE$MVuB{n71xLC%CXbp~<8M9{FQl5W%&Y-`Uhk(AP25 z$(BQ;ch=Xe&Ec&Cgzmmb^BeViY|VS5rk4FBXz&y0LGEasPWMezA$D9t1Ue(RJjq+Q zL7hv#zviViSAqOAC|OvIMd?7%I+C5876R@rIZd7OL1my9P1xYx?tB+dobrCqeF@Y8 zek1s24p7XBuU%>_zendfvlakXoiOZ|Q-Uq5x=+x#It4~ci*r)9~|=`1jLUxOJcDr3ODkMuoh%x0>(V-vd~hwFH31|9S}i zOALq4(fJWgMEFokwM=~ATpluTm^UuH&cW0#*Pi|1gB@>S#}>`F^;gz=&Ao&hzHJCi ziO>$1n~?!EgqJ@kXo0-CL&|eo<@Y-~>W;lc)}38@<0z<1=vPhZm^V#~x71jWM0Gr( zluTgux6Iuy*EsTyBpP?OyE~BiY=$wQFD6ODi1o6Pf~d(^NtkJ73d?rcMCd2ATG@2g z-_m6c4=q3x@`*Oi1QFrjq8Q`}P?7n={dJG< z1gTf`YHo4~bjfcKcoGKYZyCHyC~qGQQ`uvr-hXEv5!2w53Ge7SR!h*;0Yzr{XMcEm zb=|qMiJ(*fH&C5D!ko!??}oE!u4`^=<+O8GZ%nU!zX2qjk8n!VxK8Ja+VzM1cyO@T zgTn497Yh~=;P=oM=<#VBdykbe8=)3PY^!SNT$egpNjdj5dTIUM{K*{-6>Z%CG^ea2 z$LBcEm}>}n_5>kZbxGzA4x%>>{BB2^(WP(f&`k%>L_5%fiZvj!gP9fmZlQzH$L*Mt zhRwL`?{-DkXg%XQQOA`hCuGw^-9xcgce^^iKShglnx9mUW>B;et;KN(SN(qDoY4)V zZ)&AHCUd~B!9+!l)+Zv(8B`te(m|<|g!N|TjnDYQhOeORNIF{%hO@#zqdmU05On8K zC0SHpPI%NEL^Dn{v!F1_w~heD#_r!a0Yv`Pb!?|;L!Xu!rErs7ETlEr)<)dLgtD{I z?IlSy)jCu%E`C;ln6mWv|0UkWauEbLq0|rir$tk09+IjbQ`->H{a~MpmHdqhqeKCP z{ALy@q~-t4KLQ~;NIzTojh~>Fl`j7R@)~&#Rsd@ToHVqIMkgLyf_zRZ!-=LaO)pTD4m3?|^N!@-a^$Sn zfsb8&5~TPr2$&(Dv>u}lq%xiBD(1)S$0dz`0Gz@LJ03_~;XhRX5J$*W*{;ioq#Y_0 zU?GBMd1{JQY!rcH@oq3l;)&pAnO9}U17@OOT(w&)kaQg;5DG93D^>ZCu3gUbSkLoz%*SXfjb0_PTC)~ zUjNf_&s_`{4Ehx@*vlwdExzYz3T0c&Kb82rk_<=ZEfS`5cPlEbN(I1dz*#}oI$yMp zz(I~!7d^gvF&egNHhfJokmoB$7jVL{C8eGi5et7u?u~3v98#lRqYo-Nef)S&+QjO+ zU%)6Il|8nhaRNqONFCCKt?Da?RnFeosps97JON`AvCwbK%g=Ch8c#GcBp-<+0|@2F zq;J|5>ld>A<%>335$-rBWj|EMKd00NzRTUY{=>D)3ulUAM+Uvq=cR>$izdBDj=pJI z9Q3UVIrI}X@ScTT=CrIVH713JjdxbbL3S-NhpES0k2!^1S1~VbOJUJaMk{gsflW0e zDtJ3Q3@_aEAbaOg_lr-$L~_ek0O=PLmHM_P#D1PHT0r@PYsGOHt39KSl%9NL#Xrdr zDEErDFcK0Bl8ZwL>|Ag^QTupL99mh~wR->8HT!V6-b&w5G)UjignSbCgWxEuJy#a$ zuX)9Ez1-K#2cs3*2_cWSGh1jhS~*gF4A{|;_ka%V1v=Cbp!Y;+ph@e;qA%JyaDC4o zzg{81uJ5@ad;*p$0^<_RAjw)Z7z5xAz>=|fDpTmrPf3s3o--$Z{90qZ{GQoDsSz8{ zmpj&N-T=<>q5RmGlR5cXrex|bM>57P8h%CGOJt47nkp)H4i@Ho2aE~mA>bJP{1GM~ zOv~UKEZC)^> z0E2Hue9|M><_u|AVkgjeDqO>lks*u^V5;#`!qJ04pN^$&e~G)T!Q`~a}`qtlrH zF5b}|-egrSOWCVuOWr4OC*+uOB^-SO_iEBCSbvu3z(|2;9K=XlwauIQ;X2006%ti1 z)9<5TBEbQtN zv&M#JMB${ATvWkL;AU_tstP`4K@V-85yF2L02D+rM)@gqb$tOnh7OC^ksrP5F%I4P zGMq(U>S!%=s*ZxL>=JrDKBR`#Nr0cv{)(UH-4Y1`=br(bN1d4hYr2#Ka;ya_TANX{ zwcmadc`>=#s(ccDkIr5fJDu7RxT#9t+3xfz&0Y1$Dska@npe?}rK?rdxrl(gTqQG6 z0CPt~h+bY&U`7vrM}5lHn_q}e;^fq_V%vMv-!Lh#wZv^;uObW2%3Do0koR)DBpB$e zV6T=_F;6@>d_Cw~8%5wftW~*y%=9aVWb4wW`}Y7o zb6Svon571w@gf|AgY{o2J2yJT${hh)#BJw5g~n}ggoO_~)n-#IL#7Ts1X?Np#YAo2AaBmTR90@2wuhkP7FYOz@^ zeDMR=YDZ7!`+~-u>-}%GLcOg!>g?GCSQtB;r=@W@ZX;w=-f7~)&#RyvGG=^^to?3k zf$-w86>xWlhx()RB}Obpv{Oq)q+s|Urp znr7Okh@TKL;#66a>PtKes~A(K1S+;%073Wx4%A6K|R11{$ihQ5E*DKRw+Bs81?2TPWGi|X19H2MubI|mN(iqDHY4V6fI zh${IB`5HZK%)taeB#M-zB>=lhxH60#cp1>?QajdfI)S+9T*>8m>yv8(n<~Vb{wzW? z>>xVu*Cs+>ua$+EmwqO9RSq~JNJL57G}AZ5`Ly{LsSL|v(1F`iXsqL4W!YefA+xpv zqT1A?XL&nc3nB!l!vV%s zELfkSr}2kQ3k92H5`4@DWXqd-<$mfbYd?gnCWj14#vzp3^a15IXN4=D*0|xTj@;(o zX8v@9_X9w7B)yihTWg_Bi)(!aXiZY=lKVC{VjV-@XR6k#gYBTlZ}2?GmFpk$1@Iz% z)u|2~uQV+1=hwQZAr7iATMKEM@}osjnBP!-8oxG{%@6va<0USJ^zyO9q73I!59njj zJ2v<%Vx_98M54Sez$L}ZzvaL}eIf;#3_cCkPeC7rexN<-VU~xVj8Xp=?4LIQ&MR~0 z8`S~Z`u2b6`1EhXx-~-otYQ7n8ZMnx+7;l#hMUd!o}zT%(NJ`+osQe&4#HN@C$Kzu zu`{W_-*pxZTqv74jd&*~MsgjVGhsE?M^=8gNNqt2bOR5NzAeWz`b~U;hOuIARZe?5 zo2U}pDMiCnP(Kv&$vxZdn_y`m8K^Am@L1|cQPYD$E{4ttU;Pe8Wtt=j7$I#i93XI8 z`pD;+`i5SI+**{H4(rQIAM^qaFKT{$5qZtF^l}17(RQ`QHDmL4B+NNO=h_hOL5yGu z7|d*NB#rlFnU+hTtm-~7;GPtG88LV82VQt3IE9YZhm381H|fO6dspKy^>VOcM1xg9 zgRA$k2K}X61@N#z3RYXQt!)e!8j_U-yxr5+>s1aL0Vu4Vw354V!*=gKiW#hn(0L;j zF@=eVcGi(%+Sd0Av}gg5mmz@2*zIajwYTvA)ev<2iT5A6N^ zJ3S&<&r8eL^5T)w?W%jSMk8^!9?*F^CEwb!AXb8UCD`%wp;XTq+q4GICj~UB(HH2I zSe1@@^Rm~;!*NVq#R!rP2%Wt@`DpuuR4^ab^mr|`g<;_EpHU|pHpdZGxW>+?5#-zqy#Ip?r5*FmcAwTqSirQ?SdV1c-yjQD z?^(46fqsPze{fGgmg^Z6=-cE2^Vv3?>{2#b<5$olK!p*jq#7U%JB>i|>-V2D2K{b> z;~mTcQ5memS;L?ui2u%@f~^{0WOu&(XRVa~THmt<1rCZO{O#cx3b6rv{?~cD)^9-n z$MERv^szG!&+j+|HOM3AHZS>8S~A3jm03pbx0b3YCTf7*>QprQ%NyH^d&H@urL$+q z5F&VuIn0&G8B#I;Ia{tJqMzt`)NSJ47PFrE%cuJ(-Fn|S8!ldV0NBQKK*8m*7%lD@ zD$TqVodnJgY@2WF=dt_LQ34w64wgg?=UWN#~HLGSwNNKkIS z7?!-W`rO6|M2M(gRmnbQ z;oxuy_uImKC*n{>b>pF2Y-T)OZk3}+kLs#+Z=L4={Jb#-8hP(Iwyh>IsNo=MQnj=)C)w{xnb%TgG+hR=2l2vUEvO3`>7gM%u`b>ESuF*3kgq1A@23 zTI$=LW6!AqQs~b_$iou@Z(+b6ZmueP z_Evs!aMJWEncXB!GNB~SQ#7~*c?;R(BJkDLaQAMCa1EnY!ee&j^O$3wK<2YtXGXU_?|g zkIFgUS>cC4zB~uB^F(Uibn9;*Yqgc?-1_n#X-@iA*iqISC$pONA2cbV4#$7BTluft zEJ1WpIozx8$DG0*(BGC<+t)k5x=XWQXpna+r?3e6{rxthKvbAmL=LCywHdykZ3q%u zT?>Fam1S@8aBjOBcWli$X0(TwQnBT>(f1AS5bvNSay8%0pD8FFui_}2&wQL3e|99( zxPP`g%or=-B%>jABe11Y`z$CMcP*OQa$T6b@mMUixQT*LyVEIZD!xv-X1=qAfTQh` zj2V5;h{(Iiujyh%x>N;eMK6FFFR-nX92y`jd^Y;>XAwcY1v~GR2?_e5~Qha$qzAy8|FBX2f9CW>= zUovBShB2K6siO`3el=!7*WsN;7Is7Bug2X$qQRGv1Rf+l`ewdB%9%;H;-#f!CV?c9 z$aexzUP0>Fw_LmAelD<59`Iq%R?ANpPBsG_H4;LGWiwu0bT$S_ToW1#joJ^xrsaN0 z0?0IQr0c0=;brC$ju!?!1luI9Ikr);TvB)tYcR|RTQ8ksDXd4AKw4tXyg?^{IEst@{ez zbF6*Q-|YnYk(KwG-xzkgwR>Jugf~S9B9qu#QmJO7Al#O^ZEXjjB=h8qreV4vL$?&D66i^> z0CbJ(vIUyt5GNVL-b* zx(xHuD8FJ8Q6A0o;6v*#YW}lPl-aVkhT>_dN_uYBuGh@_s8h(n7MyX8`p=JONSKal zkb?K@u@>0st^ryLo`N)PQ-AUFHjOd;whzL%AFcO2^}qjH-Ws&cL$?I2`g)K$5hjkE zYT7JRVI^Pi1mmhUE4xpv&g78>>gW29VLj#X67Z0&sc&Lj3>V@ z65U3OQ9!MflRW2cELHjDOSy=mock+{eF;kmnBn12%)-0L+N#lfCgS7No7`(FUi1Dg z(yT(@;EsL|uMJHxCGP&U!KHTpTB2EH&=hw!)$fHEn}32VqpBLch6uAQeM3(>^D2xS zdB+~SpY!yKX62DejnC&{hk0XE@wEqiojxiYjbbJANkF)WuATy4B}jY5yGNmT+qdLM z+JNM_V4>wE%EacFby{UQcWc+?pcSy219!Yf~Y*X#t*jdrDf zTN~~caR(<1xs;dOUbJsJjI0eVXS>`PGGvoBT{>B(l;1n5XfySaW~KBn+C|Y>n+Hcc zy?L1G9tZESlY^9&R{V2HjuD^kO@gY~;fS=!m4)sxzYXK@x$Z`o3;7I*v!=FcM$(kW z*L?Bg6v|~ihZk07yzPoSt?5dIQpob=34ZGf$swO?D{7W&_=0iHqTG^5EiHm*znq^R zk(+l(F)KLw>%fs+AZ>pldEs-n|AUa4<+gXBn0F$4_I2E@v_3u8pp=wF3kR}46I*bC z1#I+cdVdsd0i}@Bvm^B$yqpx5o?Y66^Hg$F&dbB-+Q4|5g%#gMw`KCK*_!W0?>dGM z+$T7uzpe)SBd5CdKHNxORW*+eK_)DZ5gj_c2S0Ec!An>I zyH9lA3kA%Izav%Uz`_bJTdTRnX3P}Y>1LkHSXfc8k}|DL($ebF+S55bx<8-CUwFY2 zsxGhl@@W=~_4U}4UK_Xhl~R9u&TX}ofzzyrp4f};s_$_-$`#TNzwLE4NmRARw)Vc? z{O;KmZBkCnhxZ>|bQ%|26H^e^}~u z-aU9brH#t6^~s)`lF9TedaA}y=8Vt}vvgt$^zK}r9V(g|#gSLqpd7-XZnA6V{F;uq}%tQ%iG zJ4f{>0`qP%j%XS1IiP&~wQqHRMJx5zPisu}qZLUf=mQLTo?cAn|3Eej5z2Zxh85_RE z^QI$oJp9NZd{sa3oDb>#;)wO~<>FizQ0~ zOK#D@LFmVFQSXh2<*Syp1g?nAaCur;p6&6InLLc%Bu>J+T54~V)hRLcMO0;}v=>ae zExYZSy^@d0A(IEjhx#V1q*L=|N;bG1`F?icn7IlyZ^x>P&A+l^OpbEc1GuYFl?QfB zx7JDS-GeXDN7vfrDK?O%M+S#N;giu3brt*3+S@s4ur2dAu&HP9-Eax2&X^onngh=q zvPsU@Ug(#QanYu0*=rLWOkVqD^UOFy+Q)h05|pe;+$E$XASR1VC)`k0Wd6*Y+sYIP z*eESXNt60+6qDt+P~+`Y=*8v}oz#Tcj|P)oJ8B+C_S$W^zolqD8Yf5nslBVzu2~De z)x+q{Y3&hbvjeZPxNGF6R|ujZ!}WID2au0weCGN(B%sk9QS8JaTozC}o}UoACdnQh z+@ye|RcGU>&F}E=HJoiy9}KZUe7qkW?wD|vW?gb;n_8tYmJQujjK7d0@*iH4 zF6=F|K9!X!od64jmv|*F8ho3xmAY{oRgOd?NEfE0PXhX=+HykxPnvo7tLJvEZT z5gZysS|ZMM_wADp)V@IRu(Gn!Q8z8~ETtE{Jmxwn2Fa1&AhM%!N5I0KvMA+*g~DdI z_f~oJZI~X&l(wi$v6PO;XzZ*u>LC;^Cx?#U=GsR{-RQN!+L5;T?oKPI1Rh*-ew*;l zeU^c}Smz4rS2*D3+qcnk0KK<%ru&>}+mP0bB5K8NX>wX{HaD}1!vk3#vw#F0_N>L9{=?FgnW8>SW7Ili{nhHzmoei~Mb zA@-JX{p_83EBT<$nH?cYcg?m%p)Mfyql=#1l7+0IQI8&a$~|w+=L+c?9a;;YOvnoN zwjs=H%#GHgE7pCzH|3-wTIyhSXZI15+V%zPIO;NMhtX}Rp_3BPFz#|ED5YAOE7*ub zwXdYWr$^>*R!nb(P%ZD<$In%65Qq8K+`WGEL2i2fEhsF6F!w3dje0UGbnb4^CMUYB zziLyybh&@SzZY2TBBOkliXKRQy?O4o_lCzv+FUJo8@1taZ%dbr&2MXR#U86)Py5)sFGWMw*q`stQHgRXo7i$+P>^rSk1s z7#tlBz6p{2zuKA85H2H&Ex3-xt7GtIg8Qew$kH`O1i_`Q{qU~Yd1AgLtSCTuv1TLR ziic3ec9+W*Z5C5>^y%DUbPr@bNA z-FB${-#rBUUtoFvnws=)se$SEZ<#gu_mTm?v%h}w>)+G(?`foZC;zjOy8qVe{|~)J d6A@kON~CguOU0Kyv{TeWOqfr965>K*wVFq9cEwwRC4E-HJF9`}cQiWn__QnN5HHYIi0% zHj1bJ|8LR#``IjrOf+^5lv;A?Pr=TEQlSceD&eGpL6p)z0Ch6PP|Q2rJ8&Ct0cLfE zJDK5f>xO(RpO*OUl{)Xh;&){zdQK{D0VZjAV{v&R_h>Mcr0s`YuXQ>)RR{trJd=?edQNacTM-3F^F)un=0@+A#8?XaU}{qvHp@9%cmrx zd!=b68o>Uj|6arEs6brw-xsDfysfCX2st~lQ; zv^@rC5EU!q+@T%v|Tco&GQrM z3zA()9(zDZTa{j|tG2{cd0bx)yag-jO-3-DIkbo?`+|p&R8}*OWqge#V;Tn*mHT2u zEeu9EPF0g6zKn8-SiMJ-!4FVace0yd(l|`~L%~|Bqa!upXz+r8D+o5C%!1j{_XRiK zMY_#3FlrI9oxx_jn80&hBL=Dt-BWs(G8C)33J~I8s>e>_#s!sezJnVanH@z|B={!5 zu!6&M{VzdDfV}eIzDJ3xp7|T2+&?`^8X){WF8&@&3KcrrsK9Nswl8#_f#K(EwMpoI zZnwO~$wLKW3idC}Xin_uNg+!wE=k5zuZd+XuepT*qz9@te%f8r4fbQ2c5$-J%`10U zWn(4zfy(1;HrZCG>>o+WD&se&1$yvnw&W;-FeGl_rNPRMcW@gG_8G{_)$2boVuBrM zPe2hcbbge{Ggn-@CS8lvKn- z%{=1jxAQzg2htQ#!NfdpD>SiusQ^Ew%O-cxlk4Y^AoyB;{+)aAfK4JtUet#vpzUmy z#+G{~IulrCAkf^uuMqQ{4NR9ahT#fdi(<>0O_7I!UDFuNj@0X7dTuT$F$xJH&!m&~ z+{#U567JPMs#4-EJ5Q=GIT$4pUMR#CGJd%xJ8ODH5ZSe!-ul3VotJ!^ZdZ2N+pD37_Lz(Zk{$HDx-*ssJWZV z2~RDW3j}ti!-^o#eZW`BM`g#MBxEAyFnSzfqm~9vzk0+53~^q*quC78NCztm=&|2v zzm#GmLRK?O*8ilRZYE02V3fOb>C&+tt7}cMa!ssNi0YHGJ17NTLJqm#)o9W;$fEh7 zzT1t>nRoc!C5=%;_QQ~tlY?a!SI@oUDRE;N@2dLIFzk1d<`_}2HS?IJu4v)R4&gv! zdwwqQ-l7zJSi5n_lfXd?<`<}h@MzLM*!)YI!w>N5ebM0IhT{s7winX^U0C!td8lWA zS%G#cU)&)dUV&;&^>(Q$ABKG!@Yh|)Uv+l!qQSAy>3jx5*xshOen?AmW~vkkYj@u| zvVJ>gro`Rc3?s$-6N=h*YPdqfKg5Qfnc6SOP|~8xx(^1^pnq7NAWO~)ohu4d7&CPJ zbeDP%rjKLmGj`Z!eBbl(H@A!2E*j-``M%bqrm)iJJNW8-f@_;7;>3Lm(O|kqsrVy; z=iriDQ?rKQ`TrhFyr6_Q5c__0MP!X)@f-sqZ5O8? z9cN^C)$2tW9I%u&%WedtL-`|pIE;%4JaHR_JI{CpUm|#c=zG#MGXSkX^2c@?GQECQ zu<_`PO&o!@4YG@GG4%$uw@|X!=|~3!v{W?WaPpuigBCP5JOnle_jFZd92uzJu^qi! zAwj!24|aq9uMS1e-RwlA0n!+LCQbSC3;P#-{dHv%)-CIy z3wA!dibWS+7Sd2BOk24I*%hENGG2HmxaHCO@{yF5>{M$cOj#A4;K2r8D@s))go4L3 z+0sTq4E7((V}fhxYwusr#2hv&C`Is7bM|r>-LJ6Tgi#GP+yyJ?nk)&bP9=r1x21Oj za&->OAU<6W$gyjU{28g%M6*Kf6^%{Zc_li&BKbZT+;G*LbZ3q6HnsoS0(wz8K*3Ne zE!Ix5EI6G#RWdv{L_4+ASoca6f#XzUd?@MQAZ0o?xDUMy_zmB`$ycp1u9}jPQ4i~E zP$Tiq^N5@a;X}!sqd2T|4yS^|4<>pkkI%j2%r<^iKssn)dnysn73hA6pDrwV!3tk! z$(44O4s#5oLsfwad9og+Pm6H?=RRq*GS2T<*8RK0`b14jYcKP|TLdHV26?5BOXwbV z%eA`$zAY{R#ZyXUzbjhWXtEtiO#W&*#KRWyMjndWg=IN;ojuVNCDWD`Y%l)o4gX=Y z-7QiCWs%h^YO~a!D`=BF;(4VRffoF0Gzd+w3IdH^iFDIwqFe2WcmZ=H^DbM`9!R55 zJ``Vn1(X%ei+27+3YX?8Jx+JOYe7L_Ye(9pg zT3JR;h}=(koK$P_xbRU45qoeUt??_nQ9nW8;Uw&lh8c*)mk0uPGNr0-PCLG~Bu2(J z?nsaHyI+qpU>TksW#YDhi`j8ToaKekrbt3_W!!bOrk%m*;4KL+rvwcvY21?(o!stp z{(`LW^)vlvpn~~!+loo(6sEf4Bj7AWFSI_j?rR@qWEl8@TpE_3midhuwTF|Qq_Ub{ zP$8PDBU;-*P5sZ13h1SaZq==oq3!3*454#f>gCp*OZJxzRNS7^rZ}IbRf6)21!_$T z%MiFq8sno{Q>@1Am9N#Be#3kr55h)2$OXKoh@xA!jN+sL4)5c?L$C5wuL~ABo#r~G z43lItV=h@>z{HZdGiB*+0lOt%#IAma~=S*n|7L`BhUi;$jd-(yPL0odpHyez7B(eOIOi##j5iNdD9=8e&{uzied6@CDmdkg; zqu|rTZ;=iAh_qOLEFm#hq?$N+_jfWx*l{?iWx$`&699`yAS|Yzg9n2NA?CGqbQx_X zjAvcoFBhfc=9J2~=av2CAsGgV7XG!Mv^m>dx;OT_*O1!s^A_q;<{s-KJr=*M3ZyZ+ z)u{RgNvU6#RWv?`7hUmn=&XnMe?%7BMItMqxcVnPlt&d~vk`q(D_3vP>gF!jj7*{i zXlZ>+%!p}@yLNrMWx;cPXx$h;(xvUACp^@0qNmjl} z2I~jYWv24JmZ^4NL4;roqcV4P; zyX`w*om4NVu&tf5w7Gb6eiRsuhBI|;s?9CcO8te@oF9m%88aJJTfjnA2G%r=}%UQZY`YP1UsH0S9 zRr_Ro)`;A3{?(#4!ImCqm{iXDGK$RnZ>^kGI>SgsA8l-jz$cNwuJO z!-MO_uH;rxc$C2RLp-k-yC}-q5}4*NYalPJjKbwv%%T_# zR!$j9@Lv?nAVHdacG|kqRUkjMqL)VOw3GGD6RnKh1hb8cjl$3J3V>cQ#%+T$26*#B2nu}<&{!i7L z0tb4U6;Vr$!^2ma32WuGHw=pg3PJ4peACoh zWJ^Os|GtVZ4<|9vGvm=w-6^ zgaX?BnJ?(zuyqc94K+liV)K?D^+rIjFz_Pta$r}Sip|^=Y}#Yy{|P0W%^d2)AUU>F z4dhppdMuMUKU%*+h(8A!^s*)@3MVGBD}vLKe=2AN^;Y zsfVY6&3hqxEHpwjy}{ebb70^Ff_1c=@I~VNm={-rqddI#bN9cunO43C0$o{SgVLs4 zy>_+r9ySzbb^NY~vMQ}XJKUrh=rN;an0orgNi4^Arm2F8U7;*Xji;6cI{pUAyh+df z=|%qYzMyRTxft24so->)xWLYcUtuS0^)zMq{|uZMk`m%*fg6|?0@#X$q1~WOTzAN* z_*?)ZR$l5xiJpK+k9*xf2kA(0^G^(&()u8J%%ExO{0${U7rbcyLNa$s%+#Ugh^9?< z3sf=|+{6vH(&79a@48F!0d=|(7A)Y(gU(>^7K-1CX!@T*FoAb{a`C9R<&mSeqJEMB z=xx1$62eW*876Bxqf%_Imqq-uId^RBEQ&;U!ADQ`j34n||C$aEvLcw*RT$Rk;O+Pb!H#zs4I!K`vRYFy z)oR!Zc_44~!vbTq%{VNCpR&)`-3o{9QkXZWg)p?JL3O0))6hZfZ^&c^Gl=$v< zLK+r!hU6j~bh)-u@a-I#6|*HcJ$ciNc{%a$h+xXmZ9`pi9-!29h`}ID5vYqj6l^+I z$ZHpcbDA&ff7wYtCheJ*RDDq5zDZVLG;3L(T$$M(G&#c__Bq!l8U1e1Pm zDP0MW$ZHWW_B-@A-9WEA_#CL*?nxa%y{8eSr!9WFz$l#Kcb#qs<6mp!5Nz{2r^Nv@ zWCdn2hHxZvJktw=PaUzv7kFM8^_x4(6Ot zXjr{H-3k=R)zzJa28kT3kcg+g*mgpBW_s(1f#-^G{`psU&3!96p`4TI zm!`N2lw|W6>f?)>YhDp|^zxlJ>u^ft!mqI$<7AlV-N6=^o#?#q2j6CAC~77^IFvxw z+@4tLMQGc*BJ?HSS1U8gX7Brhz6?L$Z;3Irk*x(F-fI~r7eUs3K_r^O&3MSIgGOj< z<$Un=>xrd-(;Waf7gLEYEb+TP;dwY|?snm#FWGl^Th%S&E9zz0`uS6{nLePD)ZpAX z^7QwX11nd1;Ahf)TJ>#M^nbD$%jb!>Zxe#;r7K`Vaw?%15KOn+aW0Y3L#|T`{tg##>x?CTjMnmqSyTk(KrfH%9x+OyUU#sII;1`Ob^)HB8Lc%qqQ-vP)z_0xu0)Ch zbuDd)m!itJil|F*9^pB*cwLp?BAn${WC4;Mwk^63`Dr4WL7GgPuq7v4S=H%DRTAyt>TO!uN#Ou-HGw{MACJ3x*SPUF~n^#-NK!u~B(WLT}u32Aka6~#BNcx2z zX1Tf!XP_({6>_6?fMN;n3UtV=j;zU6U6kQXG>0uxA@|% zJ3BR+SZUys1Cb$*fm8ZN;eV;tVDE30adGECc+RfIl{e=DFZ2Ab3zEeocPGz}{Xhus zN~Ca35cqYC-Al+Qi8;=z+rb!@I9@mtUk*64C-*%-n?SG9J}Z9h1I`XOa})_HCT}{& zlH(W8@Yr;LUGJg^H5IyFZVIZxhXDz9=2dcCmLc)^ezrRzQs)|{`P{d~{n6@Rg)ae& z7(mtK-tes+&@;IEgO{}&ls(v6kFsbUOK?dp-B0?B-&GWZ%+UawNiH3IlwJH>j`O0; z=A8ui4pIx%ExM$`-EyUV@cJgzZqEBkCGNAoLbbJi5^TF_122o)gpcZrdjQw@5`V_8 zcr0ppO0ujoeY2h!I{q8uW>nT zxsy2<+ts7nXs^)l#K5v_-D>W3>H=PBTgS)Y*GLc!yI6ssmo9Lg-WlG>AFJE#jK0cW ze8a+B&LV5UAz$~*69^4UD&stuwFVm%S{Oi`>b6J`>yoP-zF&vtXI(*>Q@#d={9o{U zo&XCf(1$3GuXIi@_2hMXHqZdtvHN~a)o+TZ*?v~@&4lgO8gs1O1W@ERBUc6C-AjUp zn;1jGSB7;$)SCufYVWSGhaB%t3*MJCfG|@R2(m`8*|XJ2PZIO2<;uhif^NOk%3X(M zv6A`o;MUP>x!aAcW-1a~&UvY~xxD$cD&Fbg*xlhZ6H-N(?XH5Mc8700kQj~5>W*2@ zYGBVk1&sDD^L1X#@DIG8JWPwu8m_eeCHG7&d2Sh~$7e9L_~DP~!*NW@h^?x5^HwJo z3Dm66lB$}<7$OSIw#qTe)gDx0`HSyU4DsDD@nS+8%tJ0~)ZsrZ?qT0;`Dy+Fn7MLT;oAAk@RlKZc;_1ac#=QGc znerhZ9rAPl3h?S(dBzr+PmN@=QB|lB>8^3;O^&gV_3IMj>AU#_<-wEK|9AuO+HdA+@ z!rVhReYzET&H`3jn9MvsqnDKNW5pW5z_k7}TS*Bqmqx4JW>`hIJ?{fDeh6_6O@oZ` ze~tVQn5bWMl_|9->Zj%CqnV4B(~W&V+02~MDqko*bvaH$XRwt5m9O3%ykXg1_6m~O z9PSW<*5ahX0Xau?k0Hhj{24JGuZLf_fm{ZvWZ`0CpFQB%#tcQ&O=dN#6nV|R9eKz& zioGaqS)e7txVeI4njPv}8~y}QC-e3CF?;W zJcs6dJi8la_tp}fb_3@|LA^P=Jwdg?TcE|KR`yN9yj9DZnX{t`5O*gy$Q6A z%(ZTcNA0HjD5-7dG={sE2+qWj81IU;GDU*FR-*h1RbJJQ)WVx`@B8e=dKb+m1J*?r zLM_F!A_S=i?~>e&Kd3}Mnod5YhgiwbWt(_e9+NT$YGT(p#$WC4H zr(dRht53~x%JY57e$G~FDlgbtbZJJMrbKzsQ3EHNX?xXyV1EcbXZA6A!f#CU>3f{M4`a6w2Qm%+gLmV|j?VXPATN^4=^Nk^S zi=|BgS|JKHxdVFPntACnHu)j>88cC-X>$|)MshchZM5$47Q>P$c9yc#fPI|AZ_hx` zLP<2^4dW+94~z!p8%HB&a^cE&FvcKnnBA9(@44=p0#_AV-x~M)hR%OCd}X?J^ehOT z+$WgN?ap=*=`^M{5=I5JFpw_?a(yQv{FS}~no!SWI!yqq8bA8_ z*r{`e3ZHQ*Z??kHdp%Bck2riUkBx8LcCR0g2L)o`%J8Mqu9cs8Im?)L?u;C#wH-ay zA|Uk;?G-+xwd^Z*=XDM5M}lBBxsbTdtjXd^bqFRtTFQI`AKF&r0rcz^BUls{-^Y1d za^bn*FnNktid4|~?;0uPg4N|*v(dqMX zIB>&l_Z{f**JbrsWKI>O`Ik$$+4@B4igCNg<+=G8#C!p*nPfp%OKb47C0+|x8Fzf? z^`{Y&H=#D41HsgRa0jbIYpfFnr#!;vGOLOYw>!k}jkhQN1b(rknO&a;k+-DQewNWXMi#x~ z+I`mfSAOBPQ!baB?-)!|L$w>hQ$+$uulLnU}Wn?Q{4L0U+jY$K+}Ccz}V=9 zh~9(i4{Y#2E)s-aI7!NvnYl+7#dYhFA7A}eYP17ew5v*TCn`CD{{NRCLIQT;wl=U6 zz_{^$@_PNlN$>_H0>zDXNiMgOb#t3}Fy(aV41-I;=Hon$Km3fW()~(N=mAl8CN;Qy zSro3{usm7RoPe>b8aYq2$g_c!&PrSvsm9Jy^rG2RHAFl;`P!o8x9H9r^Q4UhtutJL zC_n?0yg1DLadZtxzv&5!j*Ryyc3Qft#m32+emR-Vntq}mEeXGUEga7%S8wIKo?ZM+ z`6BVh&sa3M`RYv&EZkCb<=72RF2<4T!)q!q z(FN1+$PJ;_X*@vsC&U--A97Tc!TO`|$t_fguV}J$u-PO1L+j8TMg~kDXD1V;ykuoL zinoum6$yISA|B>I!&iPP2Q50Mj=Sf~Nk`{<_+DGl{-V26H6CQO?XoKv5%ljbvD7Ge z-^qx^U!bnF52gkOk#_5ru(y%ek7gqnW$DrEx4lZ-poUI@m$2>XsFFdp-on?y1Y=Hv z{M$i(eAIcED@-{pt(EjP?46!fNnoIy_4L#3eBzxdr z{?pAUBAI85`KPw@j+R;HjgtUnNIupTyUie}PjU&x5@YlmSRVDHou0>|KHn*2m5V!u zPi;K#pZH?`ZFlf@w%C80uEukbrpRWn+hwEaQcvMsnH0NCwv1bQegitavB-57(53^B zf9@^5@cH*w>;DV|EYjUkma6jF`+`MJx3cq*el~;GdxR5yeCkZZ2 z?=RBaZMc3ODVSa@%%A$+GSV3c!1940P6C@DcY=BE6U8S9FZ7}W4a~Esd7vJV6th}H za2ILb8F!%mmJg`zUzEMz7;2ci66eGa`f+^3VR^C(j3l>zQShGRYBX7-_y-rWvgBZZ ze0V%{d+ub<||DbnsSWL##{9m~F;X zLZS!=@W5zNKm0H4M&xopW9JkaV)aJ6=%R$~fJP!lFhS%FaoEKJiLRDQmsV^x9&-Dy zEnx%oBLJB^&l=vzmJ}<2xso>jzQ-u4ZFkL|3J;gZq!OU0UrcLZyr$Z!lU5}bEh<#( zVVl*Wloqix7UQ=gBq#;||EVbsW7a;?7go;oUiD#AsJip~qMz4b)?b=b>nuCU46nUE!@oB@#HH{d((b0+s!^KBGHGCTV0$7EgV1>9v^AMX{v|#jq{(;`nhD zY_uhG@FB+Q2`Ec_DjzF(#%)aXVI)K94b9dxTT*b6`mbvJw&TS4T4sH`-J?L0Tnorh zuc&X#@9{`(aMpTB*cnE4=Z-w=6~<`e;99+B!wIaWZsR_POYp5;^Tmna161sRhVMjk zD%gR7awBBtjB6ws5(l>&_B>Z9!6jD3A6N}Sy{hTa^h1|EG~a>8^}ucyJ%p9rlQ^Sd zK1SC%j(bXb%Ci3qV<(V@RmSUG+^8FRdzHVwibF}*Q14$Gm$@=GTcnSrq>G;E;)ezt z-bvrvqr2?95}(eAD3A-b_%j{7aqi2`y5wD*BcaW&JuCN5&HZNV?CxiqhK0x`8{4a2 ze&`+rI;zAf)}Fc24%STFtZALes7|Ygf0-CrWlam-&%HCX;+nAH$l#VwXHx^$ts{9S z-o3M7;iRRjt;&WWURqcGS{v<|@lJJD zxHEvkmdgA_XL4!Ig|D1anZq`|$&tqjy#6_gG4OExxSuQV8@npfGONqfZ2D&&fZbim znQKXel@)YZfpxEP3J?ol%9&^3*D2n}xj&8DNp9TR4kZPHb0oE^`yLem!JG4Px*TFo z1ez145(mTg8~PL>SKDGW!91u-F~$AL*z4TGNvuOjfy6(<>Vx;bzbaZbtezySJ-kBH z0w_2&2L^j|Az$$?%nkACi+&XU4$#+t0bPIFe?{KIC$TF$#XUwl zpRnN~&hdQ5b9<@EthzsJv6vsW=4KIeln~PG%u{MjmB;t&=Wg$$18=>hh}vt2v?v<} zM?lbfZ3GLvb%!}@4ADrF@TCE(zaaKjg|ELlsrZ!q^Z{I}D$YtH*CM4Qwx2h+)>hQ~ z1SSd+&Sv1Yf`x-C4gC~TmoAbqDhGX_;rB5U02wZt3%B)1bU`c<&P@a<(*}?rN(?sm zm7?bok&U#|Dp>2#jDt$sfa9g!^nRE+wu3*2R76f)w{E@(_t@BG5VTdUW!o0jZSti4ni7H`0g#eS$m_JRT4ShBH#xF(sD>q$h(D*$xK2RPR9 z@&AC7{@+eAWRqASPRioa*FL2ugGC$}h3g_4PQUdw@bf%r&PGkQ z@$UfB&r3hK$p063_y27X|F4u)``-eN(p)qVT-kSg;Imr*q~S;f^e7x{-f$L41_~R2 zpX5Ah`4RPcigeZyNGgM#ag#krUu|dq@ej7oC%vRV{6@yIvH1X)kCl!gminWKAGpGuInCv;MB1BuY=rWuL-aIS$5Ft@2?k574#!L8tDa1;3XuTq~9+4OF9 z7%sEP!d$lLxBo@CMIfmNrnp3(mn`Wd(2g*ZON0CZCO8|5M^Mv)3-psxoAFnX5mqj1 z0+Ax#O`Gz@`gZZv>Dr7lxpoKdJ@r+@a;EaL$tItva`#yfmHj-?XYKAgSDSKIwy*_nPxdV2N!yI2Jq2L*#oy#~MNTOa!ON=k@8@$V2slMy4ZH8kqQuJcnP zn$6;uB0BH#%KLXPAF1^@|0N}^IY5wU4L5k+C+bincqvmKgR=4q&na?V{k<66t~@?0 zSoIU;wlL~uMRORYE8~4R+6=wYPQ9ionTsDA9>rI2RQ!y5!BaMdp_=H;hFz&hTLZGfm!Nzt^U3n6rf4U ztDvT6`i;K4et`%u0?5K-gwP_Q%V6K$kd5!I*Is6?K+e2WMm|Se$}NB`tU6!Z(JsH$ z1dMgB3y|sT0}g)Xxc{4%fBxG}=+9yfiXroc>02Qp25uXKBx0I=w`keMJXUKlhT4Z_ zYEe^)a2P8a(PV}kz1_RF@oQ}M4YKPSx?$UAH!Ok()Q}S{dQ65(?J9u2!fi?K4)Jnv$j*SY(Yu{%ejO>G|Y!*(+}WVoz{( z`M3Y82D3s+z8@MI+M*@MD=WC^oYE~EX`7yeZ<4orkkp%qvUuP|l7F$vI36=yS~+ps z3q;|}bu>oq+n6vze%t5XUpKqjVos@yM+3xsLIG08Ro(?QpH&oMWwJF+<;0(8>g4I0 z>n(&cB1M$F-?2iV+`PB|&{$+~60C}hhTFf0;`##+tb9NZuOqLwPsv-6{e?zJa2t&O zIq%izSnN6}73gREHCrP@aW&JGA*DAQn@@<&vui(^&?1G=fc8p=dqWZDMWIFIuN<{6 zKuN#ISG3kAJ34}zKY=ady8PR_UbrYUtaJqpd1Mmh)hnMIeow2cv}4qkQMkG1LbUS$ z0%f{Tn$S{UX_)mUatuFOE|(xCR-u9OI?+Ca$Z;u#*y>7v+ga-x@;D9j!A%eOdy_zR zT4@coc6j43yGT-eS&Z~%-7b=09;znZbZN&sfV=vr4n$%=#?Ic)DwgoBLx^?_Qzr$> zI2jYW8#5s&Q-#n?8bvI!GFRP;!b^tG-G8=-f4d}J9SVbA>& zYN;cA6N0|G73y*}#; zl#H7oV2t$Bw~JJ(9128`BHJr@lMgvJjVy*(>tZK;%9FXOK$Rzx&{|e-c`!N{gEY0( zXzFL;(aQ&$$-)-gR!C+Er^s$c(Hc~klK}a;fb>-}p0tZ4B1Y*rFnR6fs%vM2#4ElK zSvzj4?9!4jSo+69{$_X%4qGXmsk^n(7+AaTAl*4@=3|@*b|skd??(253cwc$!dgW5 zB05KC+k{W#p0r$?s`@#UT{gZ|-XsWpZj>bJFOsl5xjLK zg?+8GsKr6L=F_nPSqVceH1{!bWcY`1(yCU83tmd=9we=BT3oQE5s)&@BW~%es96A3 zPJl=kr)yz3Vf8g&-~Z__0G;Jel0oNd-7wnVpRTkQoKx@P$_2OS*VA*e}hM5rb z)CwSg5ou2WnlH=q@i=#YqDY9>RvG`wPZfqP{5XKUNn3Rn@*p?UA-V;3z%3GVjRcIX zCg@veRIaSrC16a&#GQA| z*iHw-*#wXpG2Agk_IFY!3!@1 zs9l5$72*ymKj1RbxFh1&YE<0EUeUmNL}%M;?(v9^TaG0xXT6FPxDJQR{hp~EE$1c? zAFnroclV{KjAvD;UYI-8>Gzk`=}YbSYq+&Zs*!-T22mg5i;S-sW0~X4A~t4`$elEk z;d*8SZc5z5er6>|${R+Xx+%_b8BjtH(G_6>bByJ_3{g>MPp!ZVeAQLBs477Ty9C8v zDpRY${yAV4)fqpE!7SqHUxMtezS5KU{l#iAnDyC{7Hw9lJs$e6uvTyk=GU4`;KzwaZXq;i?+U0O&fY>&>^x-gO3pX(51=m%1`~LMNgVnt$0$y;izhk1;Ozk`iGE`68Z9!4((e zJy#iTk9U5?+XQO50l58OyG1j`DujrkLFkK?E6@K72wz%p6X4i-_pY8VWB0R^9gqcqM}><4W4Gqti*TT zTe>X2Y*QU{Y}CfCDrAu`5?lRoI>2Wo^5r1SF2a#R`F50IGp1f}CRB4?heh;#Q<#pY zrSnC3cb-X9)p~iB`2%*E3p4V4H$Akm?<=A$pQ5pm4nrQY^H=2nLAbcH{?}p_zkx~O zj%f9Fy>D%gztszbzB)_JBgB9&ULg=ikNdV(YURH4cH}US5?12*kh>0!yR;eIh87sx!#DT zq$gok%dzowq(Q$1WF3hr84Xxcl|~2AR;)CGEdV4Yy5F0<{bSmjsY)fEb8XMS z`+YUyML$*=tn}V9Gu&>CzuVbtos_X+J{=l?l|~{9DTZdH23Q`r$XByrrSeYV?auvT zoSjjcleSL{Br>Om*~f%x%ysMXDkV;X^auDo4(wfF9v~#gLG1swk1`c|#1`4Q)E(VF zRwj30B?tc0+S>MUp0S+H4PWe{T%C%*RHT$Z1%Z`@%UUKezfIsBGI^+lukleZGNMAgzzKxZB0J~InGjj`U z0A#$`*O7`nYB#2?gs7F=_A0at%SylVW~KHtA?U?}v7-;OP`qS6mU+}LK*y;5t|Z;R zasgORnf5|mF{-YoXX41QxP?S^*JFR(qMCub+D!Yvxi~Qa0f}P0I+;+y^M@TdAa}^a zSJyKz0RNwI)odDEdmqcFYsq*6nM2upT4WP9q1=~Rmr4wzQM~S8ceUEWz|Oa`k)ht_ zhMd3_kSIdlK*b&Cy&oePycy;MXY|?JQb^`A`@?y=JHK7HXPO9QM`MV|ts$Wai=wGp z5_?L++KzXnlvc}!N@4kzY-8{G=rErtk55<@(#}*RD&%Q=sG5@NC*bnutCB6L$^thM zTR%f3?tB^J!PDEtoLi;$G)nGFvF#qBDRbY(dU>8nxH9x$_TJIMd#ciX{C&&5H|Ts9 zLyWr#&3>^k)5-&Y&og4efEZ$Us;V_4+6J#}`_bU3W+21FSY9ZP)Ob)TVl$3ar%;I;DVdnY3$vb zx=w`yYCR)d9cV0pKK8g;qAAE+L<#>bs{)F{Y!@K^R4wFBVH?{Ao|)BnT6u?muDIyU;8H%UY%6K_*~0|P$* zA=mMr#Q{*H63~}^5M_X+?cAMU(M|47GUO)2gCA_O!I%Vs_Sfq{dtD&Uvtx_zbQoBo z0DJg!r))|fA>M-=1PVZpzgD;PFFr^%6)T3z3>y~PwCufhb3E^WeGFQ@PWQJdSR}MD zt-tv50pK?R0G1?Bp^q=!LcVCLT#LR8WcpbjkR>poOg{lDvw6k}u#au#3A2U4RbAsfy#? zp6qt#sAuX;si!~mMCvD*g=iLZ*K=r07YgaJx7ZU|kg=dV)(Hh6(_H22)mvZhbrB_1 zvjrkqOMVqAUD3CTgfOLm**F0-yoBuUO6ybl9+w}w8`RgkWEjCK%c%HAagjx5;iWSx z)hDh#FxqM6W0Z9gubrs3+r_)%8FSuipoahC?Xu-jirFY-#B^p^>2T+(C+(_iDWK3~=-9?V*jrcjmP#eY@Bk{G}GhwqoF>|84*9 z)WFMShZ=jI`~#?E3jvN{_3?)RIlo3_x!=qzJal_H^<`b2p2`!i-50W=r)p_a7ivp7 z&gh>e2WYi2!`g?7!mgy%dj-{|7K`@kL$0@ma2(>pIt)Ihl!Z)Ty4nhI%O4i`H_TKN zINBKbiia(O+M}bDm|-@pEARad%)^ zqrTjKnDXJ{;DqM|@da>pMt^i_;nB8p1)WQf%FF47(OupYi1qautJ&D>bj^Zd`$7Bs zz-hox?$&Iu3JogGc4wB(<;879*Nlj0&LeOT=wcyE0a|FJTi@}L_;mj{>zwlkHSA-5 zc_3}fd3m9%&7?cVH)p25n%HZc1}}Tip?)c~*Pwn+YhZ<}wBjkx`JVn>ykkO+D0W>$ z9+eXP>cdr|%FDUkrm;qg4{CaT8Y!9HHdFsZc@}Vl&DK=Ly-Y6L|G_cSG>~!M zFe+8?@ZkjSbXp+vp=D{PxV1WDw_E1verDXwOnO^ovRh`dk{fZYZ0*p!!w_H#Ak!Vh z6JA5kgVh6=A|;rA!Lo3mJ^Om>L}X9;Gr*y|Vf8NHbuFmT_Xc7wXyWVR{)$a^g*moI!>My^+Y$c0wEcM49VX0o^9qyi>65Oh zTkJm3FcWzh0uUANt^hPC;D=ufh*6)5)2Z1M_{)*{me_lK$$`Eafmx-u%B>bAg559G zm_Z6>D(yuVAXvZ|e=2#W*Vz<6JaM>xPw-vQ#CO?`$7j9EObQ;vz4$ni%}y+M<~uRf z(KTHW9&Tn`+9)F?mQS~b7tcLB#3wgW-Mm@kla&S2qATe|iC=crzPAJ;!TDVlK5^_l zho%n;iW0kzg7LM3L-hS=qhGW9%RYta;HGOTKGk`losOov#2a-^)hQ1SM@7me><)_G z?+K088D(8zP$wUU$}z!#_0V#^VzQ%u^!E#8yGHGdua`Hh88Vii08kNkpW7I=(qyem z%;a&l!$c?Qy5<=5I24j)+Q|FV$WVa;_rWYIN`Vgi#lk=7rRwCl?67lIM{@4HJk;Ud znD1EN`DyAjeW5ZjWXR~7K&PFKBS%+vBNu=)c%HQG-~s&4!%V}S)P-A}9(erL_be$+y(#wA)MoW2-_{tQ$I^6$1Ke%MR~{Fs zA?*s45MDRfq=_p<89miZcSrM+I>L`ce!B0<1iEuh(Ougzh$ z7Sa|sxIx_B+pLsPTe8hpAT7Bhl&r0drMn>02^%9#FrT{f?O?(p_ zH*7kp#BE2!*P)T^Blsks778kBTQ5(6tGe=^eE<-@_RQji<-@VapA>9hmFAtpUZ&uc z5ii~BcFm@ROT>|}5uLZR5^JE7`R_kb1XyZKzCTv0S)@sNm_OhwI`{r6&z`eO31I-M zC$%77>omp6-AAA|crGs&eh>`)5(Mh{6JGt3tO{^B%WBPl%gXe%+~-B*Vx6W`#{tI+ zAV@rXnmuu956@7qupYpo|I=etgb#*}BS58^t;88|Fvb_c?kN&tH*=v`IR|(C$K}Qv zsphM&TCiUh>2{otc{CwkIn3SI! z{s((+9@X^Ou8l^0eQm{RYXwxMSF0j26_9yqt!R}=Kx7J_MnJ|8LI`tcty-B>sb-uN~y-(KiA4z_{XS|>L zx$o<`?xvq07NYgwt`Wc!aG1nfwne%BBa_x+TOj$K&ztvu)nxm)`8ZfDe+J-gt_;6K z({DWDBejB#iSAn=GMR1F*G6gXkUhuUv{88Nzw4#&R#8~ToBqA;@6R9X9`HbS+iBOjd`Pkdf}^gV4|47SMDbY&VNx*ubfB{D-{ z^XKh1kGOXvsxj?TXx>!|c2;j%S>z1}fN`C_+4&4&hN5WgC z-*ES{#^IV7Ke^EIS`n7%Wbnm*Q!Y1Q)4%~vxbmCpE>#4Q(y?e0Pl(l@>{bLyAYMhe zXi?VNR~KXBk#id^k6Y--SA$L2TtG|uV(^#lTAc$hn_NO}X|&LjdJOquY-P`PFrYWq zWL7)m9ukAdp()veQ7nDu1@*4;40TAlu*lXb~)a2X9d% zq@`XF<<~@7TuQI*aYX9{*(JSEl55pu_#{SU!?Jk!?9mK?#U%|)P%#xu)%D-;-M{k3 z4tQ#OWlHOGedwF`d@O`HB$~R1&!c$O_UF~)q5FJ~7KcGeCvxmLY5OWVkP~^olxrq% z3wjxE>7+M+Z z1eyMtgBm!xV30NWRn!vF9YQ7d_5$qS#DvA!afGYzf&LNn=U_*d|Mcg_DeI!Qp!cQE z!ZPjUMf~XpEdX@a))ZU{8=X*U?Fla4j%J65m%3-mG*BS%2w<<5&i|IW_)Re_xJYFj z8rwbha4-52#5=zYNrKQveOSjUU7R3>`>5A-gP+b$D0=iLwE`)Tus?5?z~bXZFn^Xq zf?Wz?N2nW!E~BqZG{4;%sXOfpEpdc5mA`H=yJ-Z0{NMpb5RpVAcQ$333JSym$Thk4xTFzfK{s>7ezQPk< z*&fP_hk``&Ff|1*1z(G=S{`Jc)s1^rUz?rm4XI-ND*PeMfnB>mk)u7IlYe%}Kj(g) zzu3Joc6%tjttm(lrmyCnv~@YZXO5f0tpj9;Fwa_@4D_d^#gWFhaNq!gKb0LF{^ zNTvr$G=;nGwYO$$**>#V1G!^nB4%v)-dZx+zxX5+xIfDLXz=yS(_mfUfSj}-6fxo~1 zeu93~>S^B=k)%)ADXugiJ)k8e*tRxKZAi;3=^|I1;xQuYUgYp5LQxcuUt?sRos1%W z8$KItzd5qP| zR4;OIbLFw5D8JW7PzMN4KJV6OdJ(2W+zQWm;WK@0WDh&;$zUcFF|2i})a@cfRfN_m zum!C$QDG^Hto*0G(r{Kd`ZhwqT5PU!>@KLNJ>Sw(_afLL-%<;?J=BEMkQYE6tK%8> zcs3Eaq&E+!;cL63M_Gm6=28KRZC7nL*g7Ld-j6gT)$LX_M@Q{wRm-tWUt8Dw__@aU z=Az`F`_U}96ls%wM%fKu7T-MW3`-kV#n{U{GeM4D&8t6=5F?C9Zy+O?cKQRwl$NO| z|D*H*V_&J1C;0qIrII2SZcU(fgld#@?F}JKx*s0e3vZeWBvn`!OgGC!eR;)I!%%Z} zY_X5(Gc?cwH&x>vV@2|xhB8MG6$tV2QpAT1KYlPZn7O!`NAqLUt0eVO+hC(vVx+r; zVN(WPY3W;0mOT`+6cyy{R7>p&W$UW>yeJFWAt)r@gM%B=N zkM4Zl4K%2d=0ac*e829x(`?defL4K>I;}Chg>ee$aAnYo^ZZ8TR^8M?Zt$j=AofQs zHfnB_Rl{f8PS7*Tttn^RZ(et3#+TI7ep%!Or;T8z=+tjvqv?}M-L(%ai+zr%OC`dvlmLRAP}oWYHTK@3evX~gxVhDC8V@j7`@xl1BMeoF z?vxVJ!elp{fz2fZ5E0|Q`Upc7zeRc=w?KC^q`XP6+7|!awLkk&|KAgt=sRC#wr`tm zK58~o$*xmBqPpi+N=iy7v$MPIlR03|(`FTS*u6FGdAVn8YSG6p>IA!fZ0mAgveSUN3{HV~ z_#wp00X$<9vH)DAwt=D0w=+|(cmM}53IQ}~(gOZT)M~g9x;ooW-Z;))e2gB8`$#fs zFjRFLsa)#+k>TQ!GdnTu223XlswO2c12RDYfX-xmWz7rPO3!+wd>irLZ(C}vf+ zz`yz92`=}6y*_+cI&BZCgUvBV*o(ZBCjhJ&`truvwmVdy!Bb!>l>$ZQV|U>liG*DY2i| zD3SX}d{}#AgSZx`!iu(GDT(q*OnCN3Bt*6emt>oImRju@3nU`a3zS*H0_;dy!^VhZ z)rkLk&Ghioc7%0g}}m(Y7|MXzZjGMh#( z>EOeSqr>rRXN*PP_!xOlnh06L#hm4>YuaSmQu|iXey?2RSK0S1X`RG?DHzi7YKFv3 z{_eu2YwUBe%3^N_*>~>h>svjcZ(|prZ&^~B;>u5<(efj@9&)Wa+Nxd3R2_d+p|v6N z=%H_SHh<*0iAZ^5za^J+h+U;oe!grV=c!eq;g1Z%C|dA~jxWTwW+rXNmK#PR#J+Pu zic?hoK7Z7g4)DTAGef*l>LIuVbv%dbbiw`9 zbTa|$q1o*2prXG12j zcDz8$>Y@QPOjuaOfYr5&E=+P1{MxGbj4Cd6n06%bxg>LW`g9w1#}3HLE-CxniF`*v zFYZQ!!?2Haw#}D6kkoQxU__e*N`!u@e~F;WrmCc;MJG@5q)B3-RaQ(|qgT8HH9o2V zKZ0x0p)4xQrxj6&aozHHH*D|gd{ytZpb+L84?^{uyILlpBqkKYOz;aooah{qc zlq}@^o>fu@x8F0qo2Qv72v-@4emkzq#Mn%)wLsOV7D|3$!QFYKlf8j1ja51G`wdf< z+CQ_IKNQuUZ23Sjj zERc(3eU!$>kJrf#xBRcD_FK)l}y{I(PI3!V$!s}MxoXdtE^BcWx zN66B=FPFJnq-K3L_DR(#lVgl1Jck=xi67<4mBBAx5mvF=3z$wGcTSKd;kvpR6CxjV%#dpke$ z-eOoS)umnh3ly8ebyvQ@Hr|}&V3FQH9L~3MO)?yhn{613r$z;=nYxrnvOm7N@N2C8 zr1R70H7UsAO+>)l!|RLHZO(@pg15xtmmiG-5%CIC>6=Zd?=}hxYs34#Y}`Qj0k*}# z%)uC_gsr?5`_Dpw>h{_d?uw)hDI>I)(n!#@^Lh}sPJg0J`Xw8;L=4?vE#8VtLzFJH z-;x47A`OM%m`2JFTHM)iZ!}y`CCml(W)HgHe1`UP*l5GTX?=%(^@BDO#-+W;?nNP*swL$H?B8P9n(WSE>}7{@9G>V*#tv$=J+ zDS1W-{9n|qR~8%Aj)li7Bw61k)=@lz3hPx;4C`1~84g+gI$0A_Chh*SN}f4RubK{(H!CPyxu{X+$0Q%FA}whbUL4K-BVRJYM)#mHlW7t@K>f< zQT-8P4R06j!@9BLW-WJW^+JQ7SxywO8pH4kc^=KH6~Rba{KB}PY^;1mDZ*k*zd-r+ z-0VY9^@t9z+Ct2Zd;C5sBJZozabOWK_bBEC6-E~l;|n9R zDLF4H5pok+Lw)<;%}g3QE?gHMPF!?l-TVr<5?|byB!`oe|qlWm)k*L)zLodTo=zrTCkqitQK;ysH`Jqf>D~UT~SJ^6mv4 z7S<>AOSGKqiKG%uEsqsHVPh9GQ-)!5rU&VWYg!YvEXVFL#Vynj17XkWf>Xu2YibLq z=Z2Y30cJ-dleHdYYGO>UjZ2}Sus_9hH)VP>=SM`ucQbjhby!<&?0rTf#fatGOyQym z6mM_e$Ok4KX<4N+v2o^zB{_wPWaVfQY~=E>H#d$sTTWLBTuYs1ymg*5Tt)}!X<~%#Bey;akT!!lxb=DN0dur&! zhcH!`D+k(Dz`Qzw+{mArkDbKLtDhftQyl@W|C%N=XY!?u}brnd27F?&O(RZf*Rk@MWxs1b|9}o2Gj>^1@`5cJ}D> z)XqK4(>VOEVVrsP*{Xu( zkBMrEQPt58LoITbD|6cNs0Hf68FutlP+&mpGgh*rgaf?Do6~Vc&WbKK!#pA6$Rm>l z8iWlezbX#yIvuQlvk*pST2bHggsnC)`M$~U6&;;w~| zLY*MA@m}B?Ct@ra7#e#`y#@&I1C^Qs{R&uF&U7OJxKrtML_Rq}gN%{Ar} zP)Q_4Kdb>d<;PeK5HKUke@UdUqSwD}(2Osd29WM=_9%a-stiOL;?{wHe2XOMY8VU# zZxB^wFRkQ*QWG6ZETN=ck|efQB$-cQMBjw|OYZy5vtPl@YY!}TpqjvM2w^?BZuXc?H~!M?)<4hG37P%_$&ExTN?&Ocl`p zs(_{aIw2<#GR-r_iFZ0CrwV{bOEk$0euLh=DfksOWU6AMGeqtb$G=P+v)m=sJLffn zpu7}Vvl(LfHD^~JDlJ;EycjC_h#@T}^20{a>;tLhWao^G%ISZOMz5b9T&<6LHGHjQ$vl7H7Vw7BP-gLd4o1Bex1y`P zfH35Mh}xDnJ?IhincOQ0FbOk*NqpM0A_?4K${HlZnA{r~-ZhX^yk*9xa5H%!x&ENF zXh?6+Epzjo zo&e+W76f7ckfmsgz=IyKKQ)M7JAFO=V|@tZi*tVpFyGYjYyV8ec%MPibXki8W#zgEb*TN&$ z7RbG%-#80>sKB0F`D3}A z|68y3(B6W7|bIiRR7<)0fC3)YO@SGUDkL}8g#s7 zd|+lHq@=xZ-&vpMs1Es7b=^rn)L`{!%TZQqU<;SilQ*GkEn1G~amjBVB3Er&3U(PJ zL8O$ygpq&OD5|)56G(>)#xf_hY9qe!=ytL#pH|FwAvsv)!1eAgxCz8{7d>1dXib-l zfB7H!+-0Bx)e#q5QG3EVwO4o{Kc)H}yG0S(U%mb4WrWQ!Mqg7!&QU8#WL;8DPp4}c z*F7&Y+|%k_Fgmyj5poa~987l5>d7xiA&O&TSUXZxa_qD-)KaH{)~$*$OAAhUv>3VE zw1I|$tgI&AGMH;h%V0=Yk0G}Ib#}q(keQ#}cyw1(mrpip!h&=Fp!&$Fe2dy3=4`-Z zuYp84m_YVqsTEV#T3;(3Wzo-JA`*-E)so==b;`-CQ4-y6WfeN2VDUpY6NSrx!Ih?` zGT>{9-73_Jir(?jTsH19seoGq1u(*p&^!MYtf>EiG*s}26Inpo z;?>+~slK((kSWtKA92p`Qx3GC<&{^@WK&O%An^d`vJ&IrbH0b zo2g(eF)D&xFT=9J6;sAp+$ugigujHzuk;8;}^HEDDFF8Q)vepmTJu1$6;&{ON%-} zvH6G|%UgC{2h?Cw1 z#XPJBaoSS^H_V9Y0X$8ntM~nVM~9Gk`7~Zs9%t#!)wOZs2OOpk#k(_)_E@}7#OhMw zQdW4WPp_qP8b8qVR?gw+H$|%OdVOkAgRyXH6Z%aUJq1~UFpI8I9pS9Ha_1OpfqAu) zMAyqhaRIbozjf%5gVaN4JNewq)M|Zvra5y&PNh^>eKJ#!UBxC3MaoZkSo3n_ByMoz z9l_(ZTE}FfiJeH|nOg64EDvqx8>Ckm>_^E8iJ3Lhl{i$u<2llW_0sV_?7>fkzql^n zidx`BHh)!?hdZU3@y~@iG3x9&|GT8Dg4H{32IzF^T~ztAb;Fs zp#B9^SqhiN$IVJ;T9)yYY=tF2JB9~B~=+nQNUN|E0 z(8x)R$!O?JnR=0-c8Vpa?Dce*aqbPSO})xm2uo*2CdTE3lw0g3uBG;(z({dN_P6Uw zJS+Vqag)l{NEHu(bzk!_FjNdYKm3kB%`kt(2$feD-8?(($y~TLv3=uAUA&zh*M?wj znHn}ZK1bxH+er(xCD2rV7d@%CsU+V@ligK6Z@UpR@dN3@0-U8-f~VP*yeMw1bNyZ- zPy4>JfN`%#XI*T#!k8-J;yU=lJ{K!p@%oi5q=(NQEy1#?e-@V(hamHbFvkk`msk?f4rQdcNM;3 zW`2k48?OT}QVrue)Kpss%5nIT!~1DVQ&*OZ7{<}*d_5N}78EjA;o z^kQml^O+1I)hSeoWT5fb!y)6ZGwlg(Ih=?Sp7v^PRJ_#C@Y{6w6k~>watkv}I6W5E zJH>e@@~{b1EN9PJYZ%27r@9CFn?qz$xIeI}x^=QX^Ing<&=C@+*qM-Wp zcx2zVsw1OpJV6Qb(9>+eSQW_~<{?nK1#2M{<@%`)*#W_(&UOV#g;zZp;{;QZ=7fde zBKgJf4LQZCo79r}Y1R}RiFr5=t)u(32r2rXGZbA~gwYxz<{22q9AzZlWnr*meU zn+K`@okrx|n;=q^B<5&bB6WnSmTf8gw0|~O=;GTwg=`)n>4U+d!3fLI=L!8#Z^^+& z!Arwjnt^CP@2kIFI1-YCm01A}Jeb6bQ@)mtcpb>gO$6!H< zz$NI|-!}{JkBWhfxPXoFwJe1|9gO>t`owzy3bi^XtxH#O?Ut(Q*TOwS%wJB!HjZVP zTI!83d-w8->Q#{ZLKNMOI&PZkHXGTPAGs7MP(0ElXvi&vmbjVJQ}tcm7WWCBAZ#;+ znZYLX2hqt$s_#?MSul!AQFr>*05^7+74l%iO_SiMl(wCD$%BYhUnOQgXc}Pg2Heb5 zI{alQETdZp(pAr?z~W+1CS`FIVQDhppqV3tBRz=={e9v+-}S_}^G_-)1tcq6f3FvL1)XU1rHen% zWcz10UVQpiOl*wRqE@GFd}1p} zot(XoF4G28Xrw=YZc62V4BltAM}Az;!L!)1B}TtJybtDynOtfdSz~dzo0TeGI{sS) zOZwa26d(Q%aLnH=!>N}c?-ltaKzjgkNikTkmmmD@HR#E~=}#1hAzL5=nalvt#rEIt z9=X+#$Xg@7pkyFVNX?f3z+=DG@25p_M~>d)8Jq_sVPU);h_Lc6LTJnq)Nk7C#?Z&%Y@fgI#=TvR1+u|J3YKFJ4?4E+XEpadXfN(%&+z=T)7 zPb%HD*|nu3tG8DxNOrdJaT<#?*wguFScESjXjt|59C|g~92$ zyK@v2u6&lZjoRxhnmi1y!6`9zE_()3Zg~;F?WZ=mM41Kn^fXfdrkm3v)S|%h43N^I z|2P1*jdW>xi(}n!T^CXi+aN9~Qu62@2Y)TGZXoX#(&ugLD}yFR z7(TTprfi}k3?!VSC`gf69nD703tJK9|d7F=Bs2Os_A>lQM;;T=K3>TTr&fb*v0mGIeaL z*H+i{tH#4s(yA3LGm;6$dmybB-tEdI7f7!>(dVs?`}UzD)ruh*&ZxJi$^!Ftw0*NE zLcJO|ff4Mp3O~CgSE;@3B@LT{_^2^N^)1pXpC(2s>aFeBVS;rZa!% zt1$7z{F%<-gRDA8{zwYT3l8hPi9;Qcus|AA$vWf!5E9sQEdH>Sc4;Oci?55ceva6Z ztDRlaaWUN&Kz|c^M)KTb-96D?*b!JjB5M0!Y*(;`vLV;iXA7IO=sQ9BH11Lx9Y@4% zd~sQrtr>owkaCZhUFtkaA7DVw#+&x&#>D4e8u|$GWb3>A2J1#|ss_JiL{5!}8i-|k zoh@l~Z-n3mo)<#2_-?)&A{#8j3DhNTCm_Hz5*_F4&San8`ErHMKBeD#Z~M$@UiV#q z`D<8xw=WeHkbLzgZ++xsTc`MMbp!a@L(N;tlXKJ)1Ue@Z2`~0a=st#T8uK#N`$a=z z;dgl`H*aKZ;Bm_q;`+c~2`rmDAP7Xon|lhr2AQW(Q|oJB89#}Bw*x@NuGc4PYovv# zW`ZfzL7s#AU4 zl&)r;fu~=0P|MUhxDHvZ!~Z`(AOE^JheWX}NzBtnfWh3vg+%)l@JV`d84`NusiHK>jt`dOj< z-XHy!wSfQojQY=pew#-dkY1LaIR7DF(%ItnYrszTh;+Eq{(W}r<>U?x5APjvMvO>n ziB*8J3w+@Z`}KI=HA4z&6Y~WkVc_ul!(2W5I&EY>vl9I7mz6UB>+z?P?67SF3`&q9 z*aQmiTIa-*Ln;4dUZ~+wqB&Z*=16&I&xkWLs60R7bHzOMy)+%0Oz#WI=`iErL9fP2qN%0A z(GWKM^>pdI*?ruv2?hH|{WUu*PY(H-x0vJKYP~g?K-_^DFJEq{jJRutVb{X!Dd?Gt zBBM-+r>%P8YP7rKn^KTBYcW}0X!bmM8Ak3}NZ&s8H1r8~kh)J~lNmUT%*G+_b~8-y zQyUi!wJ5{06#4U!B~;z@mVB>XGJ7G%bQG~ZADvZ%vOSsl^mTI)H$WAWQb%E!XidbU z^9A9f0kPxaoCuqbmH^U?QTR;M73+FGA(@l;rH3;UPwvb@s2Xb z^7<+IIG-{+%)H7P*$#DkfszdxpC>x%sP&AIG8hcl#ndYi&BL^M%7fI$qXiSQYME0e z10C!2l-f6g@<11ZpKAZvLUnl3{JZIUXfL9CZ#mwQBtJ zy`ie`wG^LP*5fo5mRGm9UPL__lYIJg(f3kTz#m-i3{Wl<{-JlIGvjiP7@i@Pf%5ETF6$a6V&`t!;l4l7Rgz+I?n?dTA)c$Kk<% zKep0{f)u1araFZbilOPjbU1fa6QIWKFa%TA=;9#gxxT3)s>kWmCGQ>vH6oxOx11k^ z38MD(ci3?ty54|DZo0Rw=)!zsz$a7- z2Z&QPVai<#uNSMcuA1gizdrr?t+Z^}pC+##aBcQ40tRn~uUIyOp{?+t|j zWQ(2lPC`urjWgoz8={f*^BQsdX<-`T=+V(@lCzfgLkyLcfXY-BLc`8?{aS1X-kqDB zqVH5DN2BLkF9n9EC{Pcj7Dm}f7iPBQKmEg)KaX*B4e=8T{kc`9oht-ma!R#dyq0_k z6;)u0K782m-Se0RJlZk(=yo7FYw2}y?h>d7D{dkC|GM8m1(}@{MBTFU)i&-|dt|Ts zKXtYU!CafF`@Af%acI9gL)GmhMeN@*l?ls}z20GgO0CZwJzm>)wL)1i|DcZIe*dcf zs{svaW2)b09VR^N*(D1+tydfupjbE$4R-pNUhKSg(R`6u-J?q`m~b6tonVe+TcGp( zSm&Ag1Z)eAvpOqm_A0gVH?B0tMerz>f~#hsHS|S?EBnoe0Dw|Zml}; ztPG`OCR>V5kMpVSH&XW3xs+Uf5MB>#v~zN4zQH*^{{aA{*Cj)dY(}u0sC#oG`uMFZ z1&jhk8m6cBrz{moKwO8ePoIC!MOyrEV#Gl~NIunw5=Q3J`X9_`y&WPIOTbu6ai8=o zu*^mm<`!1dPEtmik98qXDz{f>tFSS7Ll(VCnFHdWN!m52eMj|00X(0~Bj#y&mr^Y# zC*yCG&?t!B%uY}$8u=G%+zbiHAXy)kYff<_XnbcMH`c+6W&JuJFHlW4P9_z;QX4RI ziSF!A7tckyj;)w<*#H)u{+)OC2F(p3ud-w0cmmDzPUgxW|D@D+Nv{W0f=%}_O!vEZ zu67E$e-K<=$MrdHoZSf=z)S$x{_|Zv<3yj=hUC(RP3@)$dMaB+Btni+27CW_S(m$9 zYnsMJb!*tdwU?L=p7fmE2Yj%K&AP>ZbW4E?CUx3GK9e7)QSKcmgnEKv?wh&hUD$UU z?2}aYFfy;{(`8-Xn&9!O7k}rm{r7iu|Mq_HKPw_t1E;TYJCa_htgoLMG}%}=eutF` zOZX)x@qKZ(j40$WxhkS#MDp=(?leFC;5|V=pDaT^O0$TNXCyaMa`-)QxD21s+)mkQ z*gxO@d#f$oA+K$%-WNpNc{$=U_=)!g5rL^&y}AsFUhcKC%+87M-!^*jAMXhcK7{xh z&b_};dHY&9Yd<%&%g4XgtZX)o9areDBUtVyndXr-5~T*>$wJDG_Q#!ddYy9}qJ?He zbPXLBcHsSe@KN0!nuRk>u)oD{J^(e-IzJNAo;AVY>?O^tr->NAxRUwGy<6Yk$eNX{ z4b3tQq*_qWxOOJxj^I((*xBj4QL(AD;}O*@?;il-K2S>JjqT1+3TRv9)&`PZWKM#i z?EB)klc0{Cd2SR&U>fVeup^V5-{L_9^pydQJk&<8KFT@y^8KR^ir6*Q^~6Jw3wP-$ zrwBS28-Zy&OJ$p9W_#t|ylU5p1o`6QNDnD1{EKOgzj<(G2}Fym5-H^VB->i?{relO zA>wsQlqhjOq2tTA&P{y8UnF0Ib7JF7yG@Gh?o;f3u$Br0Y3O_zy4C z7(Si+;{A{MZy47;N;3XUkF^VgI6k-echKEB7U>%pXnoD4qhX>mGj5lV09*{QOIG^}qX8abn#_q%;bm z5+*s;B*pZ-_hH~`(4QI=(pZK=(mG=Ajk}g6;zzWK(x|9elRR?nz``d3Q>FrMC7{ojXil46KDTrm{Bgw?kRRol(U)& zk4A54o(XvkZkW|UCb!&Ho+;z8GpUT%e8VUryGJZYo<(Zl)vzq4JZ1)#lr1m zIG4(rVrx}I?0o$7Q8uX)*Bu6gS+4RDp9Pb94Ky8+`t+Q#@w%Gvg0TjNGA~fhix{N0 zx&DcDf4Mt@8a>&O)L@M;2KJh;aU0>dUs}^Q3OxZA=4R{> zuM)Zz`Q;Xn5tXjV@*0Z5AeIcn(zPZFU(lxC4-GEm4N|Cgx1ghhvv!M7JITV&5=5*?Hun9Jow(^ zu}_!ugxUhy-#BaF@{#cq@!|Y=?B2+@D5p=}gBhUd!s$>=^g902rJRMoxkk{MjnmZ6 zR%JZNf4{p2N@E*Ul=|RUjHRIOq`7(Q2`Qt{z@Y6LF279mgfwHH((^H&u4RZa39`%J z#Fj)4`VWbH=}MNLA85bELJ-N{bIkzw+0hpIqbtzBITeU4k(;uw4&sx97A&QtdM7BB zmdDSvCXl5`_+ln}LlEV866?Um=BdCT8Kv)T#urOHo8|UhI#wX|^$F1DTr+3* z_bX9E?t<@q`q_g`_%t>1@}^uta7Y9Qv4$;V>Qba7;~2N1ovom?(0x7Ho00-!!H6N5Z2tfBd_9mkkwMP`}ItLAaS zW;} z4JwIMB5ckuHz2iG2S=nPEj?DF=j@B^x6sGN7`G_GV>Ueax(A$Up~4t?m)MVc-9n3c zFFEF61AbUgK-a_U>N{L(L712i$KY8@9jp-b(q4LR1hpiW#1>aj`WkR@(=n1}ePwM= z$XP_LCpBjF!In3F@$7((_`~KnAWIh9EtNIPi{P!z+OgAK&4))j&fzmWP6kI9PA9!m zhhxyoU4@ZcoRLjie#WAE;1|AaWP*VKnNK{ERrK>f@Nct(98e zUNs&#{)4a2#lrBUgWH`P!}Yt`@ezjxv>pz3&H0;PYI-OZFYf7-3VMQJA(*{As9r2l z*@d*vqZv!Aev!?ptfPN*Lim;Wt%e{3Kd4360OcDnbSU7g$*)B%nfeX+cj{M1YNXE( zpRekCe64$;IXzsVWvRvaW5aqJwR@0{9}&eG@HoC4{*vZhW37pm99jwW%U3d?YHIHs zI71FV{JGxW%{`+9b;U!jytYQ)LTl&PVps<^n$(b5_oJ2@@Ds;695uf6^|9CZ_TED+wL)Ik<1p+qlj{WGPLba`@Io5Ugklxg`Yx{4p0@Q@GVAo+Fgl8{}Kl`sb(p6Z`Z%wKRcG zGSkDk%kq3i?{k2tvaD73J72ONxY^UlkN3+IxSs0oxUw*RTI0^upJX>|Watsb{TdH^ ztp;OXWw=8h^sq`GA@V7Ah=+0daGe&Im{ON|>PcLzZ^j5UjMMe7QsW;4R;h8v;27X$ zX)qn~$wLqLgo5O1*oN;4z;|2NP_x_&n${Y6=7?6T6W22AGl$|iG=#0DnX>8egqYmk z#Z^GXda+u6pM?!y1M4Og{Z(~pKua9X8e;P9)Vh^#ZK$WaT>@3TS$18#)Zp6umFCB; z`)*SCGEZE0DLpXbXnn`)syOrX{=O?6BR47?g98v(462$SKo8owl+W|LNS77am-c|g z$$YZ4!5|0I6qhYe)iGA4s#49=786C86@Kw86F`3_^DV*hKUSrCq`B?2MEd3oA&0_Z zD)}Yg+B5{KZe{BeM@YTrC~3x8Eiy0NrxB26R`1@rQg^VG409U; zv2Q9o6J9wbck@ypW^YGLXWbaWF`-_?Fdde!=^bKfiMw-#h>t7?ON8ZUIZd&~P$#j} z)%7BV2Q}pC?1N#+v)Eh@ycmjFE#VX6%vAee29F^5W{K1)BrCX5fMCHG7IMVd?(VhZ ze(uEJ5)q}@nDMqi5a21|1}RU6cZ;}Nr3!8!dhiE;1W;T`^^d!TbT5ejr8w%svRnr! zeR!?!RQ)l#=J#@*o2uVq+_ws?GEIO1k+ItR=$6N>vZwr`oV)JZeTqDK!EcLVI+lhl z$}4jI9wqM^T-jFXx!7Mkz>d%r*z)ttFhLHF_4Ck|66FNtneh9?2T~BWyp#@hxJLhM zo*g_rMP^a0{PQCo5>BGsrlpEPW;??kV;Z|A@ZN*9TyHpX?%omG6YGT2tMJ5S zj@;4le>OVlK{9rNZ2^UTTgL z)!X20eP_q@v8UPme94!Q6U8dGUA&C7!E?{0C2nYbvXOImonX~@C^Y0pQ~hn1ABTe5 zafgVBS!4DeDBoC4+AwMs$xQFsc)78>;C#!ge5} zE%iS?OV%92!0zAskEI?uyE_v%KsrPc9nmp166t?GB9ER=t#K04{fz1E(O%(;Ju#Qbg{SC(_r&bwXVG zDvXNw_6oq6``pbGvK~{g7V~Nvvp6k5-o_k+Sc5?t&fJx7v?uW^UGR*T9}jPtVcC<- zS6g;$cmZq;yb2k$=(FvzbTlRRwmd0vQ~I#C;GR;@+)bh630P$>SziG&aJG>)L zB$-MvvchENv{KaY7+oh3;1l;52X9T7}U8(#?)+m`mGUW)|#3lLHqNanWbd zaa2zI;AmzJYbzww&3{KL(>&Buziyr{Tt5lP08>+^eE?#e?d)K=64p?Ea6oyFss+Pb zZ;=g~y0AzI^Te5P@ABJZDklaEmwD7OsQ5X*16Q6Iw|uw$%aag@ z1a1sjUt&6cMe{LjSjA&vY$HWv4^N>sMo_w87uin5eFRr>9c@`12%VyiempuKGc|r~ zXgj$%auSngwm3Yu`llt4KHu$!Q&GBQu`nwrtM!9R&YN3#?oOyO`oK?*d`A4(exQ9g zP-v9q>21bX%8uMn5Xwv~H<)ZQ&hL@*s_Y!{{&;ON?$t_U!FpAs@<9kjAY9SG8Gqmx z<|od#RM?HXBk=eL55(hQ>$bflZNY-PkBug|xT*v|CkcT%=u!cp_>YV-B zO!3EF<_Z@2p&LS=vQ=AkYi4bFmnQj#%rt6#DCUn#Ib8%bTC*Sf*L)ADx-=bk6sAuIJz9x_*CkT@~4j__enmA>;G-&=?YIPsZgvwH97c{~@VnFW+zkwkUk-mo8GWsPBMAW$ z$&{(5l8@31V#2AVr|l9qec_d5CN)W~&VduAPUR#zP-H{Ex9AYYxptfaA&}OL*LqQ) z#y(IWAilkfOQ7A?&Ps|bz})kyZ{782@mw>u$!ur$7vv*OhFUD>0(PM)O)VkC z2p_9%nDLmqt|9vs4kOrtK4;Li^37K_#`}bjj7!{Q7AeAbb4;)R0-Yx{m<}74#d=P# zsuS8gAc+4b(eRzSZv6OiB3*lPwsT@0y7I*jR!q&MLxjCu7~|x0jGU=Ez4VwFQ4^Rv zwe0VJHcrg4nX1~^OWMk$ZUQWA22)ebGydlGDu;xJc`p}qy^Kdxpp7aKX(D9~%iM@x z){Ks^R5+hB5|uG;MYIgS&EI{%3WH_W0{RTl0`j9~EqAV*>COeWu$>brmChg^&FSRH zafgv6w<@t>$-2gzRmqHY2I03A;r%s+$D08q8IlBOhhPQvs7t+IQCeO?cutl6m8Ac| z+i;WclFUc|**LLGV%9lbhiebwmQNYK^y$~UvLZNz87?gyTyc3TMk|a{c>zcX*>o^j z=hRN{m0ZuR$WR22g4}E5@CJ6_wt1?PLo|Y9Y@fYpA1AAfMj+5o8Uukf9{)FmTv23e zna;s^2!^VnWeBAWy?G#)!UevyU*P~{>=G;tZy$Mkm-B;FcQJ8k*CWn#C*wJ~BU1$Q zgcJdaae~wA(JXO}er|}erl%>b+pOUY=g8!=clKk>s5F_) zGn}WcIOMUmDRM@v^H^+5fbW137V1Qs2o|p&xkt(-=$(v7OZ?*j1~w;KNv0?Tlpw^y zQnXe+p*D`l*!EoSatr_S;Q4qCR>RHw{%HTK`ZTC`JHWw2BsL2F4F~Qx>CO^(rZW6 zY+a3=@;Fq-ACVd)oa-F@ckz8k=msviDq31tkSAo~S2#x_Kr55-t`;SD#DEdoD2!nf zt`8hL9>w&A?=E50Vu*j^s7P+0lJ`%&K|a&Evw#)<9&nL+tB#z59EGnOav7HYY%D?R zqa~vG>q|6=t3|q%Ot&KIn5z1L-L_m)_zdy7O@LF3sbF-v2# zHkUc=F7*1mWZga?< z%~$pNz5%w%VkqpUwkd@n$RS53*! zM>}FPP*S%<=ne{-tWy45Ijy3PRisWfO)hyU{)X&3po}jsEREe=V%yxP_adziI9rgH zEmJn`5}egXOo^BdD?@`ZJpz)}g{y4dRdmfwC8-;!!R+H)sLibu{k;GItvQG0sYYt- z>!e=*qn4zAxH^d!*dxa^j4zv~N&u^#?Z}k<#CnAoH$1;%5vKJANQ8ia@L#9>N?o}Q zNZfVqSaHhBEj>OdpNAQ~UFsM$UeYV>2K=x~(cIJ&qPKK5vZb#+fi``%;tyRRzWPLb z)nF@5HjXn?T1I1FuYlR4m-;p*u6)viFfs`#RE8Ci9#3U(^vf6L2>MK5dZ}|dQ+Kl+ zN03c()eZ(5KBAy^a|?IBBSbv9!2x3?-#>>RGzoUOag=Z`0oKE|+#xFs^Bg}0&d$uc z9l2;ee2HGnPlOWm^D%6Fe$ZJOI| zwHu8i8;Nc*bfXI8ujQG?O@~LM?~E?vQxYw%K22Vs!yqaRV@Ck*)@{{yx|6`79Xle@kN6{F*4c)!~+PUH|-|XZ;@wT;;v1WAY6W-{rYza8*{F5d!iR z9C7Kw!oZXowY1Q?1>|N*E;X6nUs)O&9Ypw%`YfIw;XbsYIdR5wSOz%`hHmHes5Rj0 zQ<4VMVG6Q2=~kh&doD^dF>;kO;o-o05Jk|sv*khkwz(75eCdM=$uIL*S=EIlW5Wy2 zYK{_pLt&Q`(K0PL4|Nxi5D0NK)B(~OR{mZf{Fsulw|TBFXOxKAUJ#wOa%}0Ya;36W z;>euq-2_5r6Khds*}{?V@B@xGGkym4`Y|g5&0Ls-l z<+dP%o{0#xaL`j}aHnGD^Z;LmyLTm+K;>6cwtTG4znp!$OCow1ah}pF(BErQz06>} zzGwciAIaY-fB>~?LL;IB&skh|=D&Ofe{#%;$MGOA-?d&-&W)=07V|81iZNin#xa2Z z&bEboMs^KM?eY;tfI{S~#l3y5mg#*as%boMq=$tcyp6$&sP!6|_74r!4^GTCvkTau z})})-F3l|z@eoEoLhXma{5U!4k4yIUd?QiQ@#Ot@k zc^#8Gk!qluKrF4U0cT)uyOtC)BrGZPFP?@xVQmpgRr|@I(M`o?=(qx=_@dXS{Gl!v zp4X1+lV4LZL!?Y<^|vB0J01J z`u6}K?#$9t8ljWuweoLX@@kHt&IUvn{YvisVaV_YOBk-_8NXR-&ohpGT_8oceh|}r z0*J@lZg7in!m57kLq`-?e-h#iMCcYweb#K2IB1+xtiSd_xVm=apG@B%mZ}l!NX7wK zWvN6)pe^@F1`EdUF2DZ-(9(JI;o499W+DN@jjgi_7(<#%{mL>yzc3<&ldsN|vz;BC z)JOpdu(<#ytG5BiuLEXRIhHUDGA6`{xf176bpu(|fe5ZjY1ePk0RJ`Cn1BBFqZIu4 z1F`LOr^jB*`@yyUSju58t^Xr|Q>?ePMT1r{V~n(Dh=$-qiSkcfRL9H=)Xv`ab7tor z;uJS|*wDs)nt3_ju6aFcz|Q1`k4&6`KXW1|PdBF2lEw@^YQ?D$stDzDs7n^ieC++p z-1umo$4l{;rx^j_s0Aet)3+bKlY4sAMFD8k;(f}jg}diV$nAsKSkGfRSCF0cuMjlF zB&N*JQioOJ2)aHLG`L^P%OrJ{nJB-r16iWWcO3Toe(mL~SpEpC!^${|l(irY8`6y~ z+~5Gql^m_I?Lhu^uNJ%QPJnUT4c8iW+cMf&E3Y5Nt^+!(AcYmEh=Rnd>?z#EN?rT5 z-mdbJLu7l~H&6KhnF!-0NPHa@r$F&3>7>Jn&M|vKJ;x zkT;-9*u&UIL4HX=nDoJGS3v?VQ!>FdLbF_DM;U^5>f?0#+)mz*(U#vo=gPSJvQk#% zG%8Yee@xem6)P4ZMR{`9vy^K}D@}ZpQz7r^kf`>u$}=FZk0IqD>a@tG6mh?(u2X*y zpC8_)bJSC1PDi7i=aApu+40F*s_97T@LNq=BG@uJoT={FiAb}XTOR-I!d3LiCgo;e z&}9tu{@0)|$n8&2&W}R4))$|iF@3B$aK@{s0(`LY!bw7?Q{bOdNDBCpr^b3ndYl`7T;zLL<*F)) zY;bxgeXl6+E0lHQCz2oI9c0Ga-x2s<>#8WmI{u3gKbk^2KN;zwW?bb@xB`y+p|yDW z>2DXVp>L%=FR=a#!Vzgu=Wu|LV~${eQ4{6Eu~!2d&U)^cF4#Q%+kt<0?LTG|Rd4>v zjb9r@t$90tWpJp+2`wHv|CQSY>q@VgX>-R)shFR?NY07Ne0^M{tYhS^UNcIsUD^@_ zP~s-+3g&*(SpkyH+vZcQkP&ObXKFt^LpspJ;YAnnm3oa}I_^pf9~;f$cd*_tk#14Z ziQ(rMF?By2y$ffC&hSU*BqRV$7FtGRyRU%+iQW_1u$XcJ7zK zR4(Yt&FV!*O?K?H*ukE$0Cs-cvn$WuhbSy-=ksdiEfv=i_Md?pdKR9&F^9Wx33icf z)b1BA#62%X3n##7#r!8aiUWLKRF2Mr>2REi+dw)BWn!p0PkWWfkIU$6E|KY?^!i(2 z3b<%^jMXpN7*1mSI!#sOYfAipMWg%#N`o%mmAqTy+>>G#8yv@}tTPsB4q&OwYC8L| zt|Fir)dbZR>^$824lr9lwAg8JLi3a%IKLS8(JFWGEz@Ntz0>Br@9vuA%U^sEFTOI% z?T4;ZWd-W{Dc4fO5lipG2=R@^_YsfISeo9|C1!n3msg#G+DufKh4^Y@QT|o%({i7J z5ovP;{5Q6RGfhX<+#kHGmlCmxE>v8e%VNp15`xjgO%-OWxC9gODw#07re%7sCy8ZS z{wXC`h>^oi3d`_5dQFHXPC4hv!Q|j5?Xp_eNnjeO0vkSqb2gMrD~O8?RZ6#gF`+^y zALdfgUFkc1zrr&MQTdM8S*ytfH0PaF&3WcaYU>o^eS!52^vsA?TR?R3)|EXNy{rb6 ziddTHtGo8eB7)&5@xs< zFJoA>O*Qb1*OJSEhCDUJ@G0SycT&VU=|f31(hlJO*AokO)fv7jT26aelc9~vd^eYs zRRyeyqMAha4TBo1xBQi31G2Oz1Fs!u91xa-Eg(`r@$!8jyO1&Y)UDBTX3Z0+ST%5! z-^XS4HH?Cm?peJ$pwwn6SGX4~IyW?K{ul#h5dOQn`DNqRbb`x@+#W1 zki~<3IhjL(TZsw~25dTv^r_bmGWP;uzs)hY=~A!qpXTXSiTI~zBX1z=Yv6T(pdoB6 z1V4g~Y3d&axt7TJkT{t$p|37Efa^P))EI1$n{D=n%KCC2DA%{&S>r=vRB2TlstFo* zB}T#f2D8Nm#6#NfG>FAgKPfKMZx=%NO0@_5S&M{yP2<`P2mj7fu;1~oWs|*c2NGPy8-f~qcfA_eO9{iz$ifS6T zAXfvn#n)J)B>vz`sz++d2ufj%=h4Pxx9fc}r)f}f&NkV9Eq~IZ8p|ya(yr}+ttqTO z{Kl_WUAM1xy19o&@=c-=&7uj7!Io)WnrJi+`e^|3Z(6wVnzX4R#{(pqI3_4HiAlsM z1KjO1ho^aNBnN+9pLxbz2~vSeq8gAs@9Ew|BD}p$V%H7vcTxd1NY|N%=z{oZ=u6Ee|AWewMa%f4^wj58!~pTC59YO1s2N>YWzvk_ zt6`y6R&$Fx+b>KpiaxR-`k|NjKezR;CC7%Bye)u9zKum6KFxovx`H3x4)FZ<sStls|Bl(aC%x5Rr=7+tq?pDzd27Y@Jp@Xb6^v&?9);tN+{QPs-$3~H)176};6|i>?o5FLxsuol3~QRn`tY!q6F9lT zrtuk`yLl*NPk|}-D#dho$$iSzrl<yK=j+gHEAuIfx)7H~Ea>?e`D`t~E)p~M%bj`sxR5)e%JPhgHCG5)kNTdofB zi!*ZuDmm649>~_>L0vl7?A{#Dkywo;!o$@U&C~rjH!s)-t7C2n zF8(MA1b{!h0F$y>hFlA#xVLW`zLHM!cIR2d2AB@#IM0SaK}gO^xp_6l8Kiioes^*3 zwPCY>obL=E4bMx>)ANqN*J+s8IdQtu=aUk)BSQJV66H%J>!2PS?A5K7aMf10auHvgVrl9dQ}H;mgl3nf(4I=XBYHIGf>INHGQm3KOWe zipt;lsC#Z{M$LZ%rdYopH<^7*acg_w{z4FUa*2LwWWr!XF;$Q1>~7c%wd}Q>x!Z()bc|)9Z;0UW!y^@%)&$oYC z+;UAn|w+q+N#EGz2KXmiBr*$Q@!$gg9r^X(cL2e_foPEQE zBbQuuM-@EvZCeV=Vdq`$rx`-D{P!i#hu&9F76RF>mOFK(oQf;D3OTC#Z`IT031D?f zd|_%#>Q{sPaWzTMkI|=7;X=ux(hgpf{2pJ+M~P1Ver* z@a@}dI&3>IVLn`EKc?QvaV{BbPOf2(#3q_4BL-+T>6-2yz>UVA7YYcqHSbCnPnsfE z_bm1ugPA6KygdfK&vylq!7Jh=c~d{yIZYi7yAf=m@+_!S?eJyZHo1s_bv>$a{_%LE z*^`ZCF_kJ_CL_W+)wf5TG|0M1>6(#Et8=6Sio&I#C%W+FQt4hpYJ!HVm5hwyQM|h| z+284AxV!D4XO>pO+ym~pKiHk4kr@(0Pu## zC4VHM_HY1)!nt|NrX#uewxcTWMLpZMjil9f8&B@*hX946tOq)DA~O)3PAN?qpap95 z7(p1UKrmbnUl;1?3Oa#?CmW-DIpH&^ffpRsG%VZwwA}n3Zq?Cavfj!j+{^AV_1?Zx zv}Rt553&Z8^R1xeDPgfe8ka6QCSHe&BC@jZWpfLj$(?&%I=|<;Uwvya>k1%y1C8O5Y5BW=WBu|+-Uc*5{lauOA{i5vIDw4v_*US(GA)9Kp0$+qsvN-& z!%f=^+7m*N_5Kdjp?*FzIjK8Kbmfb|DpJag)Mt%N2(L>s@2!74o5>TsH0*gvNC_X5 z)=sH54N844bIylZob#h#7wL7S4Z0fj@+_zk!)#A#mq!*<)6df73P+`qHI6Tq6snhh zHDFysKL-x>+aHNR;Jtu^oul$|%R!(_?AW#{Ex_u*^b`QeCI=1=AYuUg%v$z$)!^6T z)~rF{zpl0S13&eT&#jf4*Ss|#(RSYMLn{f;=RWHL>$FC&|La$jv{|GRHYf<1t`UP$ zk}p4;C$h`6_4?EY(CB(Wz#aT$+3=&XbbSN#$v$F$^ATh8Pu)H? zOH9~9PUEy%e|hNF41H7PzaFQ|BE8RaDberp{-y=Tc~ElS2Fb6`W4Ro{?D^rP)>m@y zH+~dcGQ_IJ{*|9&3rP7|Z$5L>?+QqebYJ7If8eZH7yt!Y?IH$bqh=N^v^|PjG@{?d zn6>x<;mLJC*PJi;(sXz_{fc)F6#O^HOL_fc*O;O@m~M}^Fk2ck@|82F|6P<;w(7$@ znkKx6d)-PknZ3lk}jkDk0jl}Cwvdop?_F>bB8r!xy6$|g!WfbDGtg) zM~=ESSk&3~+`tgR{)O5hnV3w0NzEHWLU5V$)*YW2Ts& zh)#ulYHLU_|AZ1>TjHQbkr(kf`K0(}d~L}h><$CmQR1h;H8dfN+9n6h^2uz&=4Tqd zzH1?nZh1#ORgG1EY7fnM>@LxScgh;L_|SceLp&9}CRLeH+wWt4M<>xeNdW92%&wnP5E_D(0;r6BbG^|=wLyvgXK$PB;=p21(nj< zUV8?A5obMlo6!|f+=;75tfySFOeV9lAvYlP*RUP=$bxp3KS_qLiyEibU0u@uU0J}u z>)FCleQ)NgOpdaL6J9kTjab$mOIEhCpiQWT-6>(fG{;S+O8nxtCaXl7hZxs%&Ehgm z2vS%1P)~03PZUQK_M&nK{+37V3kq?4C>@IaOhw4AWKS&&oz^?oyDo0RcKKDP6X!h> z!YI|E0IG&lrs-~p5BwNPn8ZFZZl-F}uEM=i6GaHWa;=^|<+ZEt7iGq{v>D$FxQOs@ zZfZwZr8e;#pTv)f%$Nr9H`FJ}ym$RR8-cm!vWiAhFLCU)eu$AvkAquEB1O(@07IDq zz1Ak>Ph#OT&Rve)AW7DVe1sHb#vD;1lK09UvU1>-Do*EUZ7*wvK(;UF!0&V2)6#XsJC1is)vQM&k_^p42hK+{fUSs-FISPn6UCSK{dl|Z z2XdePR>4Uf_#|hz?lD&uhPBNn@zlii)WoMGei9t|K*Q-+BMU$JxL)&3yzU*bV6NVXFUJGzcFg(wICG&2sUkESZLr^UKa73ia-R@PI6th_Jy8r~)8phm+!hLDHcFxkPP{+U8+^m+tdLG6ymD-70F>^M@F^9TcDx1QxkUQLO+ zWp4&KSx%tbTc}Yp>0uM;k*OzL^;pVWCW6~qb&21b84S=nk`u1qI+3h08Cf~d(Y*3HOl96oWYbq7Ct-)-4?=q9FVx;m@gYRlC zpqKwo6n0yDSVpW~^(@cyc9_i8X|Btxpb5OR`R5ZqZ|F9@6LLvejCrEn4}A!ajooRI z1ox%#*jp)~?#Xd3litP#e#N%Qd&Wh@Y!9#dhitqiKSo$<-FDM$w~u#08(R);;lt4J z%vEMcoxQCM2olGJyE6uIt(AnDrgmzy6Iqfgv(nIZ3N{jiDhlTePihWHCoG^p>oq?Fi(}JJ;v!vdHP^LT-BmrJ#T2cx7d`Nn0&AT% z=J1P>XRmAHDpQXGFiT@>JTOhw{WqX;-1FS?e0|q}$%(Dkl1`qnJ$VFjQRPUoeRRA6 z^0kFGz9A}Q&n~;AbD;|8%vg}NrVJKw+vONHbg1!@}0uj9b&J( zU^-LA2E6C$H5NjRMFcfK3)z*dVES31Y{HwOP3&a)cjTi6q}k7CP>Rl@^Ak!WieRoU z>fminaR}%Vl2rO~!sj=Y3sco1XRgG6jX7nF78`>mf8k5H+AGb-4t%~Jp_`>%-Zrf) zDAfdz05vX)@To*^HEV~%nH3w-9?@4fs=RzK5w0g zR397Kl>(z0NMMC%$xsjl{L$UdZ3iMCSrP@`=G(}lmhW#uC&R>L5?o;>;Lf>a>--(; z9(y#Nfi@md@H{s3^SdhyFFr%yK=i5HQ#q)kN}jmikWr_Ym&7aNg%uKptlC*vuFt%# zXIsCq-5L@`L?4a1%KV&tu~-in_C&cG;E>@62_n7IUg9%J0f|;w$Ry(|%UW$*X#nCkl1o@J-oImr)g?qm z4QAo+KSK0DK5A+&qCcoaxA{fqfH-?>oCnk7WU)KF3NSW2}EQ* zQq#6S9L^4B1JU0$&v9&cA7_3Te>^N(Vl3ujQRL-iAZ!8HWct8WO{SxKiEIA~M);*@ zn@%tl(>JOu^ifMoNHAhdfcBwD3k%IOaO-4my(1zQFg{#1Ndg$4tbyw9w_2Jc4k6>Lhp>$Wf`b(g)pS z6q&M6jh{+q*x4Z#=D3>&f$YqM?ls6^0J#2d_v}{gyrFpRDMZw;n=&$fbR?!BL+|Hj zR=@q))>VwOdUA9T+p-ohRDer)*_lrDrd+>QQ+M62@5&4PTc!{hS{ZC;sf{t<|(>f{oZ6+{0N&#PHs*>tW1{1ut)K1glVY71JWwKoUslBdjGj) z`q+UlOwV7-_Bda2+dSP#w|Z>g&u#A35b1pa~xq<81G$#*z!J08URHEavq%zw_0u? z7oAd8=V*0Olf|kCy1WG&bHK=6w9}Ovuce2b{VmGCz#}jidv)X5s}@$h64D`pOJH93SS)?ALa!up~8JQ+y`}5 zmq5*P0sF-tpJ0W0j0EiWlNx8q?Koijs{WZl#mQdH%)O90vVKo;uP<1ux$N@>g(WXX zxhL~$V`hHdI8rK^m%hTe?XICsY%NNmQY+$oil}1`V^*g5ueNh{P^d!eS)}kRBN5Z6 z2=p9}%6c|e)jysjg?c^9dS1y#X&R-(=3OBKRpN*Oj{elGn;^-|ky6J@X5-5%5hiq- zFy>jytGtqhNB~ziN@mJSPUfMl0Jx4^s93oRrsMjq8bZf{{q25`*WqnZu7whp#7Xz^>3OuTLOKLoL1%$DC^PGVogw9<~Z?gRE^%H26wtoUEBnVu=$s zoFGV!C6Bje#*BT!YMWbpE4m(!XlgJd_9>b6-ir;+Bc)=xONcRR8LcW6VOpCb*Z8B!&u;f13OZQ{9rpb_YA0Zh+_|cT7b|CR4w07?ZIq0yqK1R0PVi3@Dbe&$)}7WE06E%SA1FP}#QVG79gLPT?xDv3WVJ?YYqyM_ z;C(~bC3JJk0{q+^g1dUnEh~;Ll5&PZo5PPGK%mzjrfR0=dshmX54PEFFY#W-@&l`Y z;zi0@#^_G{TG?`X{vya*xIFthJ1;xjxKgSWZ!rUb`ai5IC8q2Ji9~=(m=jyq7>dUt zJ&jp_vFrJ_l7XZhl#B&fN)+pDLmRD#k?A>qT|LdFwaniig#`cx23q*=tN-sME8r7v zH(GX&LsEe}@!{SJ|H_Dcc+0h%R+0-aYAS&7+2K2XE70ZUKglWnASDL0f}K)$ox9_h z^sjX1YK~0qPgPz$+%&LS&R;uRloyC0Ey2FzQ6!LWj^25a6TJGVByO;1K7U4~|5t7a zs2H(xsDH~QBRQO+wje+M=o{ec)L*CO$=BD~KJR(9Th2jJ@o$)!|| zWGu@4s`@~8w}!n?-uBaNme()qYrDTy89Y+R)c4NXfmpHKda%E%mD8_+7bk`i{RSsF z@`LgCBsT#jfEeI!XLDOwHK)AA_)`3(l>)nbJw^-bjI3W!-qONO>cyL^DR3O~ZHm}} zx-(}{RMWeOWcX4;&tLq$5q zESD$TT+%5-f5SYzD9zmKf&xz%(DA&P>MQ>WUK=G=nR47D$AKG22xh z&rUj}Y7))vU%H?Qe1Pjs_{Db6WVR;cSJUCgBY&|>x2L;K>7EKO9ccxlI*=pkKlzAz zdygl`XB}91t$QdaVYF3IUBTbS9&*lJ7|rO(jA^3l=jWy~Y3#(stc_C--q_oD^F8*{ zUEcAF;nNY&(%# zmH5D`>h{*oaa9oZCXM5QyP?{K!SPFR@Wr%#7g>;?jIJ+}5AAy~t;ihVOS2MH!+QX% zgDFEGFH=V?O;}J5D6$Sn+HF8A*3eSgm|6{Pw!#m1(!b;Oot!!zkDQT~YBuu-$^fFNe7+rdRw+&Dhv$Y`xe+O;8{D`yi!(M`6?Q*_R@KIXDEJkwb|~{# zxxA7c3HIg7gW;QsL=2`}$d0AOfjcAR_@Ek^$2zZiqP75t;C;?whv`8gaW=PUL6@-T zQ4h{4(3OjLmHNGSDpQe^f)?lb5M5NM{b4+bo|e~F-1&1Ptq z4MH;DH#uDi_7+D>E|>bzcmc@c(Cc;hKF3~AMtVv3bLAJD^HprkX_M77XmZknqu6`5$8utcprOCSbKI8AtH^ux$D)8Wb$ETOjufoa*Gf<{VqTYP5_$U>CqzvoTY0OM_nf2|O3)yU zaZL)v*bN~`3t;2!3&=xR5hI@j_#VZGI(t%wg=k`Y!K(pG`PDSg` z!NhcDyW}pLV`xY-S@sMvRHpH_%)LVFizws~gTFEg&QWzWX?46btIK-^Y(T{A6|4<|C__()=OgSW?z@UQ9&2ho9Ur)|{5R87Y8F^>BV z+~*KuK2uGB?|*CYF)#avDF6q|g?umL^LVQMPrx;uuD|sn-~xnlelJ*QMWJAc6^2KY zp|VTC4-o}IrZ^(FSNh@$TSwM~g^T(~rX6jtBl;}Q$xb#hvA0(T=_dgA(CVy)&X-Bn zEJWsQoJVPmcHxl`e@ra3hO@FnI_hOT@o6jP`Eht8l~X%HtUk_vIVHuTX!fXp&vaDy zrSauU1yA$njAj~hY+g;3THx$ROtg?SWFS94Jqs%@l~2N0(>^7mit&8HQ0r&1-B-6UvL735d7BG}3@YXX8!vOJk* zTVGAaq3E@XEm6j%vmyOV^iIqMOam#7Uo1e%)6ws7%}dQgxJ^b8g7@Zi{A=$MP0W6E z=xHHxcz=R2#X-qzUzmF15L`_=r=0hAYGMA#7Cq04!ij5ZDxEgDX!C`uZ-*u9VUbB{ zqsijxFmLjF;~uO+#M<|<30Kk%{rSoi4L9OTqTtf+YQpdi8_xrPQiL$ zsb)t3(RckAJhGD5c~6wSr}kQK6CrwM-feH`6#pIoC+@~4xd3fcs6rQD<5Zz{`9#AZ zC5_=k%WF`fDp}JwbS_NVe$JB=JwcwrMyw>hIfN)YtfLrfer9s|SZtD-)mU>U3MqP@;M7_y-${+D-S(5uQQ` zXM%zL{8f^zP6pUHN;vh4jp5**-Tk&70jO^h^heu%*zlHW+XQ(a6K5Qjc4U%$!B@Se z6U)FCWGp*8n%e}nTqh-aQT>ycD!b_A)Zb)aNEzl*iSI;gul}A;)7d)lj^`5=p=5R~ zOuYt3gk6Ev)(mww@X$D;AN7LpB=th{AmHz`%#=Lf!}*CR2W4dkrYAwkS9MmGdDavf zCbY>=$~pqbR11Kq2_-nYqk|#$dHps(Fqlb`@vg-bOj4V@lW~|t;#J@@iAnSmgS`L2(ncGM9m=23f-gos!!&5gjc=Qay z?o;&#_}cWV%3;kjLwqp&wcrg(6A=vXy(4Fa(rq&KEM*03#knwkey-_~Fj97masim< zri)r>@aHvjEgZfn#;?HM6?knb2_kHFtFoR30I31&JN$A=C=Ed>EsfeO!bAZ)FqWjL zIm&}C26i^RG#xGl`cdbU;Ycu29b1(u$XL}aE7AkgJ;ZS8WovxCE8c83%CI6Ic;Qfp zS5S=R125oXNm2Ucz4K`=*}beVgh;4pY{n_NUW$;*J(0DB6@X{;C>sCd^RRM2Nzgfc z-Le3_L4WsM3aVd&&@IVym`P=|2>Y2&cV}OYYzUR7@d!*KmK;*>LOC78R?$Kg(1a!6 zi8PhC#%siC2U7n%Lx?KuaY-i$fDMCUF8!HF_+6#I8wIzPn?w=r#vjBs8{)e* z;~>@$5s$N1sG+l|s1s!SP@XFX`4nH&z_&yPOr$t+HK9T>Ze|6~wvc5F0dcy;CK)1B z0Q~}Dk?z-BRsF`?UYGgWaNZ?|yyEg^ZobT9;`MxENh|8Dh=dOVf^8wKSq2~+3zOj7 zyoNLjPxeqFh@Vs6Qz?+3)~#p__O2HIPwlzP5#cjKDvNUSuad%msIkajqU&thyxE5 zF;T|aG66ZYE1zA66QwwnO-tC)eal`uD6pSIk*9=7mHNUIL#8J98QIH+qi#~C*i)ve z<5!R`G~RrbC5+RcE7QH8)Lc&>0-n}s*%68t?q(CGG&H|vbvJoq!oSf3;kAjH)Djze z-1+0HM+*|G#gv!cf&BOUTm-T{x&Qy;*^##Fxexr~$X+ z^zw#h+G62VS@`Z93KhxVN{< zW&0nh*L`^OC)1{*>SO0^2S>4Q);6U;khD=OfGA z7zWVfwd1fCFgGSW<htN7CM zj6bh&BsRt@9XCd^c(j|?2HbbyPw5T#Inx<5V=YF3E-%{v1ikO{r^Wi-rpV;HcnNL# z1zQSadRo%{q|?38VRMkK17p2E$R`_s7f-PNc)Oa9!AQ`68-oveGw%WL*B->5ql=!p zyPLK!=7eS^^EnrQt1SP&a+R0D)(3SX!vnQ3yZe3uBd((3KT4V3YU2eYGC(bi2RdQW z?4|g-7l%+@fh#DilXvoG%V9nOPf$`T=-=P>0rr-6(qW5?u~|2u>26PpsA-15|8#U# z^SuCl9=eZB{3JndmZAKRquPcW} z*+o*l>4<1r3EcL?K8n1GBotk))D@#B&oTPhB-5DF@^P92UgIqep)|`|H2aM@39Q^o z{QdJ0ofDX1Z~0JJv(!jOMKXDx%3#H5hz4=A+%x}79+7|-Drt)zpY!L3r!HY>6qA80 zlYgi3OPa~7b}OZZ?hiO9zq;Ef?0!T?TDn?RFMR9%j>&-C7g-y~XEG-@;yA}Wr@Vbympruug$a}(f|IBZcgWQe9G;LULus?s^ z>+k2i%v%19CEwI%jxW!fz8jwrM%<^JV-0{Bust{z5Zbcd$uf)re#|dL$5Ua+^wb*@ zu{w$pdfy*{#_(!|z=I^bwFObcrd*8w0=?E|$&p!@+BPWB9O1=1YjWLC12o-=HosJp zQ68YM;+uR#G_r7)uk28XvIR347aXTC8TjXaJj2%*P?7b|Nt`{?mgx)N+Xdj_!Y0#U zm8mEa8Ri16%zn!Ow8VfsyDtB+6zjJYuCu5o9hD+4Vq1c;CN8n^%2plo>4 zGD~*8ghuySi)#A&Lj4S}O>HwO{$iF86udgc>O+F@F^HQ9Tkl3(`qj0aAZbFY2pqJMSsG^<}+YiS9bU+M&<*_pGgBX z_qzfw2Jr&f338K$`F1lk6}&=tWO5YE#QjYfjv@($K2b+7F`nXG4JTRM|Dd1+z z`I@IcHe}2v48|4La#MBS_5kFDXpO+c-E#tx&LiY}Yb0+MU#3d*I(zZayTC9GUGWJ9 zXFiyO4q|*75<0Bj&7yyxF((#et!6}^MBH9N5KwxFoVD2d6Zep>QDWDFVQlGs&|t?jtfsfda!%2rD^v@WeyRF8J=rfno&eNU<6r zAVPouiH(X11Z4~1BqRX=A%p}WB#`ZXv3KTHi1TZH%-rE`NWOEv;d0&{N>=LqLZZ!X+==-i#TvyNhX?*8W`eZSuV+oOPT)i7&U?!)I* zW4}8Q?q6*1>t`l2{k|4hnM9g@?>`@`_S5E@d#Ri9?a%zN39Bzr##*Gh`hu7r-_cg| zQwvi*^y@dF&x;=5I4$Ezk7To3clQ&k^wnd(;sATMXg+GUeKFZ47QL-LPH@q&Cvajk=F=Q5YAFBVbwx-fySo1p9j#!khLa$EY;2_T*&0{_P7_!Ge??r9GH? zs~XhpQkLx&1!AJ;x5uM2E2;IWM{ahIlcK=tc#GvtX2}VH1CrHrTqKQ*Vi};iaGEqK zc>|b;hqwg>Xa$5(w^1ul*c4Hbw6N{wq2bx8RVQ$GACSvYVA;5H@=#@51Qb}ZsnK?l zTtP%usv0~Hl4F%N)O#>0?Yz9t#H(BZhV+FXC~C|q&Efy(0etEZA7MG7Lx{$2Q{w|l3TalsT^1yw1ok?k{C|YO3@X?ZN`zo9~j57#n+q3z2)@4Jmo-N}+#cfYT`(Mdqk`_BpsJf03B@Y8wxHm*^=r3-_`a|Xa<}WNAi(*> z7DBrEAbtC^rtnuDlpnKh;i)=Nn7|4Pn{r#K3I}lES3h zCSSOdAAafpjavS#Dm>@n4QK1xUZ%A*gei~S=ivYmx5o3Hujxfk(8^VdfQOZ_A%H3T z>k!*PXx&|_wqC(GhfbpsncmRu%vKXaYgfL&Qd|Iq_A-m7k0h}qC=j(1X~-IIkJx3| z+%pfh?z|OTqdf-(JLx+T47^&qYc}cv{M)$#MH@+chCY0h2h}wRg=_5WFBS@|#XL6w9 z)}GL!)Lk$lIqOWh`nGyGG`zz6=U)=;Uz>tHz_D&~Uz5%xo%=4dWqh}%=HqzKVba># zG7y~@d8XIY_6y`Qb%P9318zTjLqv#dJul<`Jorp=FwfAi&2GKD%V}6(NRd9sXv3fX z%-%+FbYbKR%DcXVE;t{Dl9f*eiJ0PpXiy*%VcT{fquX7R#pMH6Y=8d%V(5J9QOhKHbMGJsZ1kx2<2 zI((08PscI>19rdfwH^^7`F`VqfHDk~=5!30Oxw=8E1;5Kp({F0Mwwi8s)t@8S_k<_2A1d+9saS~yFr4kYgO_`bps*^|P9EYB@PguD=P3|Ar~4fA5L91}W} z7L)Q3>vA}UW<~PAK`rU{ZKvc|0t58G3|TjiDYwRLjk8qV*I$q7^b#+RF zL?~!#e@2FEi3L`X9mRpDI9Q6uJ@VLSRk3RYq;+}3c|By|hI(W{`o{L+EF~zqEc~Ew zV8g)L;siL5V9<-(v%Bngy}0+YJ;|f|FBvPFvHD~lYb)3Jk zOc4bM0m#rLjZlb}?6$0oY--uY+yzvf5_7RCVE}RTOX>L3(9OG{MV@v%(A7+DnJCG# zBK@!^$g+X>8IO33FM`qE@(Z#6k5Qhgin4t&YuO?f+`+dx$H7M;`@@$t9>xVx4#I~9 zw9J%h^~ub~a{17*KGUQM!j+F~x{KWt9(f_+0FKZvsM9->hK6~C990N2dY0Jju)am> z=+x4Z4YW1jjjm7R=yMhi7ak6@8`N6{tP)L8TfO%6^c`P8kd3e3C)@WAZLIN5as%z< zZz`?6)?5?C&-uWkXwC%Y9!_)oEb!_N^7Kz0owDe&u z5;wRvdM$2=A~Mpr!m#85&dk97kMLQLYySXJ@X{avPjNi|0Rg{(;a&2f1m~7EJ@~gx zng7+nlVJAUIXa{94IX=Dh-47%Jbu`dT!ShE!i(#GH16U&KO#D(ab@F3=FLBD{zLvM zyh-a}5f%^;o74Ejq*PV=r1q=a(lut|$e!)bgzwfKtH)nhbq(m1E&df#HRY_Mx$hnY zS${thWDtu150LAh5Q9p}#i$0z0{|3aZXl3E>ArQ>Hh6H|K)ek6aYgyIXhn7Fu+Ntj zdkVa!FQ4QJk{p)e22~D;w;F5b_$DZ1KkmJO@)QSb+TU!OOJFl^O9nto-Ejr~%e zvjz0qa*(Fiz<0-wL8O^`d7086nd>dVY`X~QA zZ9#Go207A=UJ^%;Vllq6*Tqq~UjCATIVe7ID>}A-eQ(YebBZ`nc^61)Up1cm38sYB zVF@;?{ld+z2Gs^yzJZyQyUN9E@&H!7v)NRIyJ#~0p564laTospe`S>)@FnJPB1ZGG z9jPkVXjGR z5L_@3YGuEeCya7qg_696))R`(Swllx%@W+hmDZOoxI-dje0X4~MDtK^u}r zeCe_d?@I%U$0XOLJrkM8Uor4-Q!H7*dKJ27E=$`Az!P)=)$&$sM<#J#BbipG<0;#o zMcJaWgM$BPel~1@AU-!q>|b(?c4-dACque6>hlaJO2mz;;Jq5$%i8tkqNy_7Y?K!T z^m}iTNi+~-U6+C=+P(zL$fPRLD}(!l0ByWyF17&@Vc$&hT`)i}hdoWRnQ=856dFce z#mgqd4XU8B#uz7qQ3QTLd49|GNXntj?vuuqPiv}A%b<|6FD{aaUav3#SFM)jUl))& zmBbf!MNN@a8pD81bxSr(8CNt<%Z+P2lf|ENVQ1zK7Z|4G*|ammkX5TsFWyo$0)&Ka zWUl?SJ}l!f!`s+H(gsX3oqD$mdCR$1kcG!tlhxv&iSHDd$f#B{K!+dSJ?E{~6crwC zxbWfg;4wvBGqJJulgNNYFXI{w>86xf1+?<9IVX%UY-F~JrJq_(SEYIA_XUpy)!s5GCOsk4gC z>XKG5?(4{>b4NA2YNy?SSgC~)eb@myi8WgSfFFP~Zs5XzozLYx&eoU9CqBfAJ+~F>RW~c^;rXZ>%HK*Tq`VmWa7$$M39`!R`v1# zY&;MY?f`05?>tiVH1u{r_Wc9+Vp(%c7bEa>Uh2$g<(T-OZf>ffqq#bX*5S%m7o@lk z;2vLHt|k^x=Cfc?T!Gn20oQ5J9`%NSi@8`n=I&s4B5wAI)}FWvFk$5lYRTB4T2ON> zbx!Nj#t`>m_WAq5bp~=@Kl*TiOlB4DrhoNmn1&W1LuB*e1nrPGsOSe_1QwUnc^Qzf zLYvM0+AB@^%+ZED-ykG0?ktUSuz^(ViH>8N)Vn9L&al@q%K^{VDu2YZTO;lkx}hmr zHJ;CEHCrJ;+XSU1X+CGqrz;1HDrc#U)0Tk!TOAA&(rjv6%W=1M>m@DeqvQUrYUJO5 zpT5dovd!+#>P&jov6PeCzVINR3&ppO`(@HK0%$3E8D}CtE0Lx4IP{Y(Yud$K)roL* zs+Phy%^e~KHEoYtk3R2o=Mcwiv4lyzxYvVwrS&qnt+d0SOjiaV9Z>9f8wV7VG9N9q z@o^Wg_i$*Q76d$#_3g*~#QMdpyKxyp;$k9udEN3_L)|`0PEmSnjh!W@9-!HGfb#hf zNN8dV&TV+H{-gi0C5JtwEODb%e#dXNv9H_8F0Q(6LA)oiuJizW3hE0dkn*=H=se3ru4xaBC`_*mE`?FU24os%qvM!t55XZ|A zZG5Y|m%nviT$N5B40Rj_!f@H3?F9z1tWAKoRntqRpGD#9=&G0kM)4k(Wd!D9C_bT= zsH&+~|KVWPn zAnAE`W3w5VTzYKx^%n8b4-R9}{rlzi4v^EhPjCM$pDX&AyyBA3$(tHolunx04K^eq zB%c<^gJ5rjWY#q@ho*g-2O#LGndYjPCf4u z9&M7hqWqk~aUGfL;E7hYp`)bDN!+j}vjhmWeoBdTZOjb{=9_yLkYs%K;qhKb^A9y! z=6Vl^khJBJ=&FU1XG&3m%!d9WR%w)Yg|-2wCx|{>2{Caa#oDg%j>O7-t3x)TYO?WN z-K~0WT~A47$r^6o^ypw7WhKv_DMN(=c#+w9QA;iObq{X?VOr#qwS1*K@t#9;O^|55 z1Do4zHodk5mqnmbVXU?h0FJvTjxz!(OI>cW0&>Hlvc+*<5w%gio!7%Q($M=oGK66t zXuA|)`Kn0|AkmCYrRK-=!a~>Truu(6fDlwelk^Hb0Z90n+Q_UMFLlGs!kk;zo#V6k zE;zVYo534SOrRVh?DZJ7lJqQ7=NWaKgQt5ws%y68yBK~{#mZj3o?ABqF-yfOYjMV2 zlwmO00}aUMI5)881JMmn=wC z&!3V<49Q9Q!?+K{?`t>nn1|;DFiSz#7v#%isU^qA2>6v@sHXggEpyZces7%96?Kf{ zpP&!Kf2tX8VJs~P))fYMcTy=sr%B|mV&{s^u$_9Rr2}~KSL*`oR)OM+x$O~u9ju+H zb#hxJ8a20hYJkLUGYAEJHMjkL^?A4+u0Dh;UrNr3IT+2^+*HicLQsb}` zbE;$xhdD(xa*L$nycAb|R8EK2>jWU1FcHVCZ&6GLC-2wv-TTGkmOfCk+gKlwXQ7<1 zN<-q4OgI&YM&qaY>ZQa9A(vfjePI$eRX;MDzUqWYjq>+JAvak78n=q2{zjroP#H;L>6dAE%BO?7X_-wuIdysHgLG$7SM_%?RZT|s zc-tVZ<}n&YgiZ5J3#!wLit!>vglz;8#{1I*!79$UiP$>oCiwvw8K-YIL5h*?qlwAv*Kd! zKU9EwC+;(nD>7@uD9n}uI?T+jZ-?sGli?{3V$Z~S9u_s*8#YiIdK&z*;S=&m=PZ1j zu__S<@wwv36gL#jsbH{jmd@^M3PhcxfoN(bD`OBu!iFS38X;L@iNK=(3C{&ZNd502 zIb5!|Pm%iJDSsn{4cAX9eI=i4-VaQwvEymJ1#ul5ZoL ztVy2)cTHr0WOBy;BPVJ@fK?i-U2ke0AIoi9JQP+>!@fcxd!O=W>+6-1hG%a#H_bIBz-;sUGELXelt7RF9kiYhc z08j1Gimp#qY#M8u$tjz|6t{0~w|BR5znOc@8on&l&Efi;i z-Te)>Kbvv5xQBHFSVt-cFK1+%U)yRBcaoO|qTVM4>%746tFyc4n5bBuTG`iqf{PuC z0@0|s(tg>w0dGOX0%ur zPcAG?Hk+f!V?gJ7qPdTljl+%^!vvxU0WcFG+rVUv4cJq!nyW^~!(lJ~a2LGgdAs^| zW)ou5rOyA_n)rp({^_?IJO~IV;;0!G$b=w(;wGDi`S+KtNZYjl*kDhI^%!HQhL}2n zf_={6K3W0!w*9UiYLiA~me03u>lzGn-xmvP4Tpo}YHn-nVHS=sTP z7Ol~i57GBJzd!nPLr%TQzlq@GzjNY8@rvU7EB||Pir%&K=j&V=H@uXd$I#YHgG})= zJt-7|y9?Hd`Wtu2BL4H3;b1V>IP?223W_>ss>3RnOH_MClmaeN#ac)-erTbSF79Wn zIv_q8zxc~LuhvOjj+9~gyxz30min!xu8i@gtP~ZsFxbxMqm9LdMd$6Rlu3>oUmj0Q zrW4n&sN+2Gd}!B)!v7WlJn1F;S}5Ye+yP{^$EI0XEk^dd5sFu`;fT_hI$uJm$}jnj znnTkkL!~!mM?@7yXW}?#fdgbe^kEs*NA7$x;$aU(U9P2l~F; zAg(A+?rff8o+{l|i+;-ZXTiFlNRQC%?Y!HRk^4rnVAMY^PIB2aCn`kGn9r?KQ~7s+FYPx8KpoHyx?mvofH$$SSW=U&s?& zonm8X^hEA^n1Us%p#uKH{SK%X<@@UdyX9hJm0e5ig5q%&O0}*_82`cUhq&_!%KP}Z zWIjw165mP)E_~ZnWqAXs|B#Zj=*4xV-ig`l!wYH!nM*jYRQ$J3wYP95CJ|6w`fx=ijDE zfGF6(uP}vD1$JD|B9*BNqYI~-{J-C^jT?uoP%32_`|c;{n>fFWmbb8N=gP}vb)$qji~Z{g?|w*yGyp$|aQ zY#kg3QBozKY3(#bm5q7IYe{c0*WmU|#MAWtXQZ09+(yb@4cc%J0=RFw zPN(Mx`vWm*n)KEo*;F)3Xs0bMteWW3%Z-@~3saE?7hIFNVW6!fS z+{=1oaoRE#> zgWDSSZ0)Z%o2x7LW<>sc&5b)crZ;A&4lvSGU~z;LW@rBt(ni^EE;z84Y8RL1AY;pO z;=|FENX>7aT~k#lc6aOyS>-XIy1Mi&LF8yz2|MB}^_I31a_LvX&K=a`Dw6g>CLW*t z&!98zru?roPrVm9J~)^EG-kXSyx^5UdQOGNdhsMBg(Q*a(FqAP7A5kH@*o8IvnLzH zqqg>|J-5EM(XhH@@X6JB0 zx=xcBY4QBokic^*Dou6;ah>G=*Y3(Q={tE7GU}-o^Kr_SC^u82`|3pUD_5EOsWDMK zZy<2<2+O!T!Z&D;rT3Fv0hw9=y=A)*oiWCcFbU!ODkd~f zShb9FEDDy>V=qT{IsJQHQ693`y5~3_H1w`=kBjkfw={O79Ob(Wzwx?n|lK~u{=W!2d>Y=AHIeroTX|O@u^cprn%MyFr)4~AN(ZRdHFyhAx zaXH2;nqpq}(z`DP55eN)6^(E9J2+2zdpbBw#(jP{Rh_oGD2b^}ub0v^In>vx#J8A@ z_O`h7zT;6e!X5mMMV8Q*UhW9R#}VCGdXKoSUFvvd>=y42xqCZYZs>aWqZ^;NZcuSW zv}2E7NLV$F#cJtz^}4QfBQwR5^YT74BukOXMAP~8jjMd*@~q=nnC!&g3?_&$hhls) zGV-!L2Cd}gFQ;2abd)E& zQ$|x4iksJ8kx!U@&|-Ia`r2vejn90NAN*lYG6fKQi&qzTRZ4`7ra6hbw&9T+CTqWR8h^xLY zNr(4kLw>aKRQIGF6dD0CjwkfbL`-Asf=#LV!A5I|ZE zwfg)qaGnndlzD9T(`WPb(dG;x9EVv@@6OV!yjW?7nYw^*;3=%{317|zlD;#x)?0X! za^uCe50Bbho(G4&nm#S{D8Uz=b32Z8@m1ejnDSPi&hnd#7Z>uG`hdjYqmT1RV==oq zllxh_TN-WPye%IQpF?fm`7b6g@f~lDRms7Da$WF#1O4B%StLtye8_Zpm20E zmixLb_h%ZBGlAaofIAS5o7CfLA)?uD7sK7CsUndU-Dzc3D*AK-adm)e+YW^-JRx9^ zNK)JL(U69*jH5k#CulW}mMYwrbjUy%B;3{iOqp#-82P+HeZuz5rgU^UM)Md%eLL|gU2}9<>Xc!i#Gz>z-ju=rBnXCGvD|Q=MkUN zjVQ5pIobo9(|v~fz$|O=IPH^!QIFcg;zR30& zu|KKukV&LYZpL5dU$2F9lVYPA0?pOypBK=#1<6#1iE78`0_+;bvczsYgL&yCr_?6G zBj$lBP4}oM-!o5CwCgmf^mcWymCQWWYU5VBf^lyt9!EjURu8a?+G-qdLO9FF!LSX1 zcDIzF0L{=MHu+3E9RD5b8u)q^jERWZy=b!-p8KKDOY`dLcsA%P>;68NjI` zW$lXFH_S?h^RU&MSF}LC#4umd+J&gX1qd@+YLUGn6E6qK0xFtervWj zDlNx5oXpF#>1BKJfK6hLi+EL!^2eF_M~wFsT060~G0C}r&}ziD`7c~P8-v!hdZY?B z9NI1&pIU)UXpQ9Hgq}XzwcY$k+I_pGGpyYfv5}BttS{Qzu5P?^bG!9ER6;xh0ao)R z5~2!sdilZ-7SM7 zaX9u`!d&TMerJE}X|!+W1gYr;LnBiAR^@lR&Q-mbQ>pOF_IytYrLajI!*N4+P7bC9 z?3OwU!hVt&?D(}ssn1)7nxUBEhwtf&@<6ADY5<(m*OBIbgWOS|c&BvHxdWPTmU7f8 zG$BT}EwU(xb>Z~bXsRTtIP9|NeKP`KFRM7UaT_C|2|ti+@d0#PgrY7cZ zYwSZYBvhuE$kCw3OSfPfhN@FuUl|9ilh53`#-mu4T2pQ)Egy6}RMtvhopf^Gy0h0M ze?bwe8n(RAlE$}BKsd~($Kv(OWM)>}`+P4lK7=kX$YP$6(sVswThtZziyY(cVQKNj z!BZo^QJm*+@R*bqp$piOD1}JO(}pf;_t{(GdtpSE)6UwHP~R#TECOG~!5oZmD4|F2 zGNGaujUl5GMkr;K z-izQ>4QplE{XwG&#!~U!Ubk52a}`}ME&ZaYpN-Bp#4)mp^%2q8FY&3wqxU7gAxyou z;QehcMrs{4TqFxE^k{V@H>NA)`J;+BPvE2pt#PTURDvVZzy46*w6N{vmB7unk*)Tq zt^MNA_0TqL_1NcX#V$5-4Pj^NlkOG%m~+y+jOT)@kb$=bzpk1yZ#o&uW)}<0Ipexd9HYi@gEVe3Y{UX`Ho{QW?)q~Uaek?#3wI}x0`mJfJ zt3zh-k$6GnfDXylz??EsK|0gbIs)Le|onq(rSXvx4}LfMRDb6 z_2|UEexFpHX4GyF`yOzk|7UIQ^zB@u`Hy1J$A`IE+d3wxC)19yrLiW-=7nV^FOi4| z=hEe)5gBdlqQ`c$(+ovuODRDfOAhaHxeoOgz#&|tF{!#fyE$hd4#>?v2tWBdJzC<79D z>nv9{P354(t0-<0?#|9umM>52?^bPk$GAScp&f%qZ-r=zE!V0P)r+w4f^O3t)%c~j zUp1ub1F-x?TBa8KJRi>y`81nXyuBEx7(gfv4E-h`2 zQm#rAoPiyhf?|RI`&q@@d3q8VUmu@bInVIvWn}we)JOR!mCWJ(>zYp<7$^MH>`|&^ z7EFI}rkr?_is;mZ|53*A>qDeUx}fCv6bi8xSh&^Zte?ZMdL_z$0sC}B`x%awpB`nF zze0ifp?eVn2qB>NL;haMI*I~DJT73=M%V`zA z9kDVNCvR%x7uKW1tykrxwy)D%xiSW57MA)fX)@?sS{N_pd_O1!MY?N?Sem!ZEOu&^ znXx&$$hX`$+^Id8B9eD5+*je^;?!_u`#CXFgehOGL4p9XDy_E?Tqi9G+%u|8S?d8L>pRPF+_&CXdPrZeH3ZP*Qi5x0M z{jW9(g2eIr9gosgCX0o0b~vq8zqgn~lDh*6=!Gu-n@X&tTX- zpNmr|wZ?5y`xE|RbL!Z2Pb-e>tu1883pyf?EofAymC+e+6ObEDuF(N-b*^C(t8ty1 zEP{oO)HXS}pT9&dMwdw2dFAO1W|S>~s!Vf+I?61GQtQLx?m-n*%AYjWg=6gcrb;!^ zV+R8hftj^ZCSElm`9SuUXxvyi(tE5c1|ysV)YNXa)r>Or6jeSuqc{V`oBx z!yeyal{y;W(f?L4wO%%VRgy5I>AhAmYQM>yuVR_=Y!%jL9HV8B(dqSQXv(J$%{6)< zo8imZMGeZ8lat&iuQvpN2<^BD_VKkvtp0ke!VR(LVt^A zH*}wHPrw9$FYL|&9a0-S14p}=*@yA%F9tVD+^R9P;`#GTEyFO=*OL`Lg7)JShXWn1 z4hPqF%g$)bK+|iI+*d!Fup^FWxb9+GZb2XK+Ar+AsATOg)xt!{_kBVgcWr7Fi zuk-KGSv>Sl6azIzn;Zq_HkdSWiW`*#kV&;)=0*77Kc1JoT?~q{MjB1}y!`aSC~#bq z<-|(BhGo^AzJmU>YX|I%;dK_lot8LIhGik{u=L1FA!dYZm5*`VF{&2lW|L?PHQ zH^rIs5VvK#hbTox-5^4i99!$iY`t6|Ak(_f4+G~Xu>+C<^Aq}C1qdt#8`yfxo{twes^VV3qy@K zRWyfewC!SLJZ)G^aRc7UNZIOi-)XXxe+6@mg{OpQY;Ql#@X6+&j*Uh)A#T(2UJmrC zojPH+jHAm}6~*xv0YZNG!=tigXrdcO6q)*E)X^bA5#4b#O7Bh5PjGRsvonhaL7)Pc zh6@24y-%WVC|5cZu80r^WNa|nJ7ecd!Yo46Sq*)`0Xm%Uy+pB{S)`5j?XVB8<9(D&L5%S;$<;i{gp zPdRD)BU<);87E^OLikp4j}!aYRiyGAd^8shHE6XUgK?sxU|7vqoKwvsp-WGZSb9Db zP2Tyk1vRa7QIpAf!K>5y*R$*6l0q(Xy!yAmLKSG78%n}D$0l6@bPM}b!oE8s zAG=!iQgbna>%R8I*iP*qfFA;TEk6d@3v((i1lj%pE_K~}5$$bGirTs5=GixfQPhC7 zP)@7wn29Jg5$3_gDf@@_q~+$wX{z8XhaQjOJM+gcc<3bz$881l1|el{zmI9mW?zPO zThPtKZH@}v1^0c!S9Da0!qwwWyB9MoowBu^)pa>CuwpUjhB0@Mcr%uYxThms4BTF5 z#S!$QFmZH_r)b8$i~W=A)vRmd zOX@kx+}#T0sQ_z=uxS8TJBKlyIJr%+nJBPV;v?c|x=Na#a|YRAtn3SVV?)#ZZ3A$pa+h(x&#P`vhH*N2J6 zn%N~CW_Iz7;V}V&?H-AP)2!9RdEb;9NHSbEECYFSho;uDpRiuwyq~UH%r6a zEB%@qq8LFaupx<~chCRoEa5`$)Tr>FY?qkFQcr~jTUC~SeY(}`L5qYT+_6^q9+`P# zYmC+Ir=GI$p$1HUju$qEnxhOO5^)H+0k*a6KvTPS3Tv+4q6v1Lj&Bqz@W`C|^r6AZ zPhS9NH*|t^dVXl6W8b4Kwb9X3%rO=fe=IcPfE%M4a|M8r#)Hd|CeWSH3Vu-w7qtkd zxD*Y}Ybfk^tIDfnwPm4zGxDmZiLjyVauh?$p3jMj=vIM2tnf&iae^jM!=U-Ib*Fo` z{cQb*l*V|f4{?DNatzy)<)e#{lECznCZqDi9Rn{^hN5dp!=`Iw{5{m*~+ zpXd0gqlIS+5~`UhiTzE#(zYoA zC7SR$!;X9I>R`iI9$%K$(#oToSGnQcI`0h{V=WT_y$C(@)!4;59+;Ufh3E<5{? zBr?a|ShyCVEVl+bIRheLh5SlEYdgumqPj@$coyI<1POst7Fx|=WkyOE z3dg^-vs`OBy6VP*+A*@fIu7`OuHH}@;St;^y3us@-$c3hqdW<+}Yl0UxJ%Hc|LJ^&pDnEUYS zpjY_^{1W95-8MV)G3h{hAwE6RJa<&*CSE0jft5F!qZASdw9Vu+f3GJHn>)yWJ_C`Y zYw~sxwd7NJEG(95?zdci?mwz{A}*!>qmjTgxL^oUYPtyJ;Vj}vze0bGUnnO}x9`(_ zPy1ytjBu6ltXkXD&lfUuI6hn6c+ER(0=E#}DQ1Mdy^hPlCpc+_bClu^tHbRIa~E5)3Se$s$FXzaD`F=}(fkBl`%2B@gPm72i-q@#7IuYI_>U~Z@} zHl^(TT-&GSC;>AhiP>;29&?+zbBo>j#4U`k8b_3u{Nr=uZX!{ z)s5hZ)@b*K@JWF94X(bamQinaHE>9j`imM8FLj8R-xvh;@o`3Jh~T*JBHQN48Z|b1 zTibE*3S0s)8oEzXs&HIUP9?>ex`n1{so9_TDSIze>yMV;C1FpvE({G%4wJbThL$*i z4&ykTEI!^$aUCk1811;5rLNM7Q3X~~dYYDC3>&mqAKOwEY5Y6qQBah{2R52fo(s$U zETjaVO(Mbaa*cVS7d^Be8b86T4V3?!s(qT#IZubFba^FfD9k-Inrg(AT2L#Sb3a+_ zK}r=|mtPbK*5ynK;B39z#(jW)AC@7YA5Weofh&wBjb6UM@RaAfa*zH~hRT7F+*3&W zYp7XHZ+!bBsFQ)Z0K1($DxFGy5IEk$0`KXBt8l}39(stSnvXEtee%cR{vofPq?kT3 zZR|6Bnq+$CE%rS8DQbqHlQQ+4Gk(VT0e+g2Ret$rrUmEp=mJ=?!o@TA0-5a$eW|r8 zVJUDceT|2+clz#ace^Zj@3B1BFQIRWU;zBv{D(C>hJNUL!#j;Tw>Mi|aPd$KxvXi_ zbKw~8e~k4L;qS{ey|)SkIJuhoG3rBmI35B{BPIi=Vx5InOGL5X%jg^aOIXiy$uZk} zL!GiQ>~qc*zWCkfGY*giv|==M=0rJwH#V1u?mc^6A~2%cjZ?SB-S?Y~&@P)bB>^#6Y>d zMgJ(2qBNYf5$m>idR;WRAY?ozH-JVoj0V(wk}D?w%eicG3SkvbwCkS+q`i1zhVvFG zT$n*i)2xmqn+kGqj%5E(tVeuMpXsJ(kd6Y+(*enLxVi{g)*vkm;~Njx}tlu0zchT1Hylt5@^Ejc@RM`c0)V=Az={ zIMb1dt}aBZ(o0s>c+3PAX`PzNAI%ujaa{U3LLly^0@p12 zsDNDhU+vQSQO9R=1N3(AeaX-g7>N~}AmDkXF^3|LxPX5#upx0)^t@r)^ia z%kq?s2D_9r+TUnYS5GptP31X0Nl_EYdn=fsmXxKIWuy!a7&b5Tc_2`l^UEtCH$@14 zFN4SF>4W^Q5p;rQ?1ItuYok5J*b-7*{HWw!-AH|W^Mdd>dsUF%UMzv_zc8@Z==xL7 zl9dhi{~wcC6eAR7|3x)L&YAx?NTqi!*|Z8;-AZAnmw?OGdvYYa(^U)FIP)i&&SYHw zYj}-C|IW3iq>X9#oss|bw)9QvC-p&v9PfDI?nGDoW^yPfP+?CQ^<=WijdSTIZvR>2 zEvwm+f-5Zb7yd`W?n{{Qru{EWDD36_=OkOfg-aHH#Gx>yxz_UEzU!Fp{8xWb_zPY8 zOV(1VUhYTn?T-^Zw0B`=N|F8~?%P)%vxT-fF~e}d`_%qlvZ8wV{#h@H^+RDD*VFm| zCI0jm_Yh$(l-|{OhhNeIHm5{(;?|%kmE47o`eshgnx-18@BC}$w@ll_UXD)r zw&_hvspr9Alv~Br1x+o!uTz}x*Alknz4;-!FVprpALcvWmoF`ho$z)@-0h!T#5ztg zf)^_O-jY9@1+;%r=bcRn^JTgxXNJ3=4OPM`TYhH>`h|{9_?418-9w%iCX}-+R{X#Z zUK-6UT*zbjTk^8Q>n&%IbzNQxNbRI(FIB-f+UUR5%^SzXm~n~kOwq9QDK{7~x%e{A zRtS|2x&3qa2m}ANev+J)J8$kdVYY(j3;yqS>T*N>&wb|q+&q_ZU0Yv?BTwGivYgQNHShu$L7YY3Eq_T>A?^ww-Jb9tP4@|V$%t~54T`TcRI7G4#u zH7(ZKZ)g*Nob_2A%uvgLKYA=tUNt_{ucrgpYjS9lM#NR1q*#^*H={kVeBf!M!D97q z4=G#Aee}5+N|IV*p0Z&Fu~nLHY*gd?tAWDKCL2E`N)#KBC5M}>yYI%b{B~EMLY*6) zzap4>P7HvO0G-OU=sguaaTDkjQ_1u5uRq8}%!|Quy%WaLW@nq><4J9yHl2IQD{uE? z7WLXMfD$&X+}z)w?ahp{R)$!yx49RFc)5e$)EQI&BGm5=WG@|9#w(Bd$<_I6neJ}$F&Q`{FoG8BDr)!4LiM4Xbt7;H|FPGOmFom3MQe>zP9 zGJUJrpK932gr+|xnH?4F&U3%s@Y{$VI7MJc0JEOsbH<$x9?Ry-%;-wVzun|{HM((3 z)$c@I?%uaUTx(cj!G0ofh;yy_vP~(?)g?~S-ZmGFQ+-pRy0WjWUZTj)pR~%#OBJg3 zkJODniaD)XAN8l)zp_LOpGF>}CoT<7=N)bOYpd(syIpjzKLfeg!UwLp@k&mn!-Q?v z)BclbmXsFc?aS2r;}1(IMp{4fmnY4gPOiLi)jho((=gHkqI?SME$$GN#%2OBz^r#K z2uIFp$RFNul!Y1h+{>ipa!$|6^Z+@epZG6GIzPv-e4QeYE*)=h_^y55BfPGKCA!+a z@PuXejYR5i}!6CB5@&g!s#Zuyi z6zTo+V?LE0#a6yo8+<$R(V$w~^h&hkGN@Rym5DF^$2RG>>Zt}5c?wK19Oxa6vUHzy z!nq~IISRZZgkVqA^@)$Zi2S0DSkuiqS)mA!}?O{{$?R@-BD+|!O%l_0b6 z_T{={9an2p2c6=y7v8mhlN&A`K}$nI9tg=?3#G})?HDUMRIGmW_(4%}4kv{9_5cTq z)R&cK&TsK;7A9$NODJK!J#rk-q4r6QJEF*CSD>yzJ-U?t88F zn@h}|O`5kYD(Zu62EoLI?nt7ID+GCr-xk3h`UoXRX(57y?yhiK z#lv2MqD;y(SZ>s8F3vrhh>R*Ef~dWrr@#=US3p09~o$=?_C1TIFRQI`mbRyVoAJ_6N4c=(zI#?U^&~ea<(r*FR#A-%k`$X#C-i7$`38=PIOK*cKKKJyP>jxH#{XQ z0By9aTU61@#~+36t~(xfUMXfe-Cu4-kp$QWP}!(2g4xlO{@z4~dFW|)ipNwQl{xZ3 zYuf%Pu!?OP2CD7*72Xe&%8LUu1Ab2ON=oY4Yfczz-{R)EB{QPiqJwxY{Df2t)cxvx z+B+{xl;2U!k7BHa_K@tR9{RdkXCIZ^B~{f36qVg@Z^!Aba9NcejaEKRwJvzsLwV`a>(wXqihtH zem?9tjORU#0qy8Tb=yMaXZEya5KM)BGxwOx2ChhF)lpt z`DMNpeaMF>Fz1GYh-#6|yky$I#@PkFCq}s@4rej-+f2+{T~Gyd{MNxM0+FIGfbH@3 zh%mmwcCgK|3uLc47sUjq&mld_-l)`m9p&d9G0fF9TflRdA)Z-L#sYY{Y zWIOWozAIn7`nro1%Zs6(jtjUBnZo2YEZj1#U>rg#t6S!M!5i?VD8H8sp^O1G(R_1G z_e>0uDHenCQ^!?Z{GN(-a}3PA!=8t2(Q*tw0G8}k_s>vMyD`@4?!?`Cw$r9F`}!(H z^o_4^O16{eSEDlUxv4ek;R1|_?k(|qzN+a3gmcE}3)Qrd?{#5MV$28f<(YdkEBYmt zNKT}oxAO?|MruF;OR4+)&6sMxa>Tdk<^~?IRqb7{MMt+%CtqMV^-F*(3pyGp*{h8Z>E!vGICQ~5 z)d=tw!xOIPAgI4VuQv8i~$=~Dc1t4*jUcJ>iym> zV9idLqpOB(*rF-@{clNv=0&L0z+b!dJ<1wdo5p zx4&ToskQH0!0x8|@-Y)j&c?T^2kZ)&(QoH8B&~DQFI(fZ0~+nLo2`sHCw*y$&=1xp zji@ZS*TRGm)I`xW?89m&`>hIA;`Y?f-A2o>tp<2WFP__i#m3vX<2Rz|Ci{0!ch4}2 z6CftelmdTYKFeOjjr|fns#N6>uanBZr?Q5fOWZ#A&TF>w| z&t3qzzDkcG+;#)Br%*2|#2X`+oEA>cQgpvbXD8_#)m>fQUk7FB5Vi-h$#Wsy#BK3( z_L@;2`yp?RuR<mGe^Ti9`{ldwC`F(6yqYkeomHD(W z$4!VJAMd~RGvz6{-C|N9krDP{9u}JrtAH^~_0{QBIrjs?sz;BmZXJmldirh!zF-*zXd+tA zmvKWrMWbOn`iQeacqIbPr+L*;w5|GhwfjhLPVmfr8>WJOKYs$^1_$DPthx ztAAdSpZ_<`eEvTm|Nkr6Hf1<}0&1S~4nI4l_rCz%ZQ^cKn$>799xa&n4+1XbC1PlE z0vtusjHGI(8YuwuI|)xWzIa!GDC}IjrD{J{`x0?KT;5-Fjd(iRY?S!2%)Xn)ZSrqP z>$=0qn45A-??twj&bU!R2ykMr3tIOVF#QcH)p_<0Eqz?|Fq5wzT1dJ`cDX$p&Agsx zXwhjb{P%A-?oeM@FOPvyU5xYmOWR(Cf50@o1NTIY5?EDJ-74TpW_xYL4jHFjFWEl) zmjOYMOIINZhydv=cKo{Gh8cx0<ehn( z(o@F05uTj=M*t2N<1WIV4nx@_xxs++4;f2$^8NjDb!#90{{YA2-i7@$kJU)F>Efx> z-)m8jyEO&sZiu~&}Q#|4}$sM{MLiNAv0NZ(h_CzD;@~O^JxXJeReTqwAVnTb=tQJ z$E3NThWY!)X**E`Zff2}>44@8p+XzrNoafe{-3q$2xLMJ@KJbW(UlB+u9Mc67Do1j zU7DsM^gR7~i5lAYSE1UugyUYYhTNa7pMN?zSCoDnEFP%&;JTbPRGN>n+l~~h)abZIsbQ<;@~r@g4V#AP3BXnzUsQOf3kK(qnR8joKaIXR#9i`6 z5c<~2b@4|vC7&7=N<5-r?wU!ax*0?&i zY}~L)qQh;>AETOD{_g~7>~Rx2Ic($bdspPJrsTHOynQtg<*-rUeuZXfZ94KOMQXdx zx8kW-#-KIdBY0=-%AG%yE`mJ$1+R`B$@6;CQRuS4YKs z_fA&A=>J>6{vIT-&|`Hf`#!tZ+ja#XRNlDRMQ8!O#(8$Cc0iMVyqduHa0r00^quRZ1_ z+{+TSgWb=Ee&r+01O`$KC^Fc+M+|#k1d68BEUTYtirzf!OW_*kIqJhD3)Fk zDNSgVMI&{T{k`RtQfs$q9TWB0Mkbb-cB}rq6L8tJ5@EuZ&7BK6+vS4tYQ0KB&*{1{ zm$QwRy!}VSq)%jc$|`$qhdhF3=XTA|EPAchW#8v5cu)V!(-Fjnf-eYDmJ2A_r9A0w z-R6XYcG`~PNCT?Y-r6MC(exJ+>*vrDi#5_u8wVr)-M;$6VP6l4Z0p6C<8b!x9IC>i z(bATyT>R3jU%jpPmLkzhJ*;P{J?@s@Jv(mtoQr-GO3xBgF7-#6Qh0R3*m|By^(kC) z5B(E%e25R-i&yB$vvXxY%akB@MKlb%4a^O$*Q#lzlSe#OHCh+w&|D*EQSuenJE(oy zs|XV2vZO=fAO_vA<2?V*!1Ml5&sCnwNLXu9g|$3^7>NVc=Ije*`2xPitJ}xRmrjzl zs(z7vR0g`SwOyd6QpAdp<@zI&u!*T-Z*}L$PVDoN`)o*k_vMb^AgnzW1KRQ7jV~uY zb-%8uU-8;kS$0t4l^FeFAdhY)MyGkJAG6njMgTGd$lSrgq3^)(E+Y+(u<9D{vyF9m z$DShWv$7e#$An~(c;%p2^~-mw#j2+Y zomjTY2gXVocMZF>n&OhkcX0@8mw$^{_hnS$Cio=yKKn?IGtzu8W31~swhiX9J-7o2 z=?xEC289vLqk;_b981WTe7@SmAnR`z9Rm@)yEQ2>N@UZ!LGHWN=ZP*R>|T~6MeH*= z7!Ep@89>q@$_LmaJWv5}?@aNE{eLhQNd}!REhaZv z;j|VO{RM0yo~Hd(g;x3xKj!+pZPxug3$R+uY?r04X@=1j$OO0ZO74^!Q}2}OEPfk~ z@Ls(7*yHd+!toSTDEX~}_Ka=AXrRD5WQR2?-e@j zI=bCHr91V{{w(BgsM2X>2Z$L2xBBJ&l>q(p-Tn$CaMgCFMMvd2*OkH)LDd}Q^FM|m zA)upRMNfmvj-AO_9WGVts{_9dNhJrH920A`I)f{o?HzhZ^)Z%_K3Ub3*x;@Trd=b# z77H5i=eVJ8bv_scz6^$=?E{^Y6(JH=;r5kP<&B@&sjyKp%Dby z1iOI@k^Fv8brMb`T6TO_RC09Y=0$Py&}bg=WL-FDJQG3XjsX&ZRpXxQ6m>lLdQV0s z{ze0i+?UUv722nuFtvGCFS(CC&2OGndv&~b72MkAKSk_*T)A2U-5VD*R~EO>l&dtb z8wUIM)T9haZ9L93ydABBuvUFk?Gp2yq(;8Bq@C^I%5&AFvy&S!s#~k#qKvtN?3XB| z`PGsgIXRQyyP`TmzO8A0gTn{n`uFNHI%a3bUXn}Sz6tV$E!#=s_&q-k(Mqm!X8||J z-j>TnPqpWMuxaLdG?=JE9{%*E{W}i)wS|R+Gucm<QCxbxJO6TArGh&iCOaOW9S_qAnKKjx5;f@a6y)j@cIavxbLa0Cvty?KY+nd= zk>evJg{jwH{EAU#hwwXPxcT4Kx4*c!QKv-)Bn4G{WU8!;A&vi#%>Vhjy&;}m@yg@( z`KM29Pq#STNJZ7*B-6!0O;LB_lEpji?;iunH&jQvPwpP+h|tcw6d+%WzCi!T8!!1! z;<5keDfmE>9!%uUfCck#tH=n}9Gm+LPwcI6bS%^q9YGMAm=~-Cq9r?ajYkfx9ieuc$8zz9D*{LH+P5VB4Wgvjzw}3jBi}E} z0e5u0%dKWX%lm96$nE)Fe5Her^aiPU1J4I~%;U9-1dhNR?CfV}=)99{f%AuaQaL!J z@Zky*0lJgF1H<4j~bitKk4u=R1+p4xOXIA`WWto~QM{lLj(` zj9mQPiuF~AwIsQ4zkN=?O(B;CDZ(UqzaTFecuYJk`d6Q>$tc{RDvxwH9InWI%6F7V zoENU$e(Sa7E_p~`2XDB5`l+KFJ(^JRl`-QL@HPy|HNF5xOLIlp%6h0Sm}UP|O&=}a$^oyk$N0^#B3r7}oN zO_-!zUeDzoldl~{T1SLjoyfiD{&2*-EX(5Tz$oF(@Qp$HgU7yx4u0tsCT=o(C&=Ax zT^NYgr=;FY>7iY>PcaDy-DkUPS-o*cjQC)5$tK{LOa)u@APvz$<f>7VXJvjlHy0J@gnIghT-6RTAR$K6p|R)3U1T#8Q|kL-1LDkqLp7t| zvX6wcV|?(j$6-0xJ&$OeHKk3&>ZMx8E9&$18~?0A*P6;jpQxY?Ak8)pBgqAktFCwz z?t1Ir@8nFpocgywJ__TdCE)}_cwoXu+hwhsb8Py2Yd$APYhcHzI%F^I!})gMIi-n} zmzC(8Zl487?NU+Q`=7A~lLtJwC27pwVlDOHVPquT zrh9*r42XIhsMlpUmq)62mj2#*eZ5o7K&al{S?Jh^L!A{6>I(#haFlk*P5I@QMe+MZ zY$B#%W05a9HyTyMQs7 z3B)Lu?kd$_TAq=S-#hj;eF}Fk%ONHaduu(SeKq^xv%!+kHPg9U8}ONtUqHM=i_A<` zP)ULPz3dk-J63yuqtr46I;crlB%Q2ofWBg@-`bNmvM#%UN@B4Myp5tKCO=W2A))-Krh zYskj2fG-}nx=T?T?AK&`-KxQ-OraG7HIBLF6N0ig0kR0wqxUK{v5UfcZV~-%2v)ON z1=Ze#OyT(ghGvqfd~h>mYJP+JdMsZP!$e*&hs4u)U{Y{qy{0;dTDPml$jROkz|2Mjbm#>9_Ye)901B-{GAZr-r-LaD4zK(eO>EWy6fo-@wS7Io z?k0?gH93E3Dq&6kz!JVcqFBgiP}{+!W3`uE4jvy=Y*pxN0SD{M5D-K^5;GQ$nzzR4bLn=#^9bv^Lib?SbB zuHZG&$j9!_Ft=-SE!eagDRDB zpvTt|n^+J#){pcSBSL1yt83g+cbVy_JDL_%hI+i_eO2y8IDrCPnW&PL$hXx>uHjHL zp>D6ldZQY?un4i?v>XeZ<57jzj%{0Sj>L3OYAK6;*n?QY`&XtAN4N5a+0$tK536wmy<7v#{hHJ&h!ABELLOsUNTt_uS7h>gY5 zjE&Ah2I_zgE#xp;FxY?^BL4FpT#TO1D{t2_R1aL@*!tvuB$ z+=Zoa?dv8o7s|>MsaK!IntdS!JKub1FV`^1M?B(~sKT4I^XS@CM647Ons;m8hV7f- z;e=_=WHpO4h&OqmoHa(O0mG8uUviV=^(tv&L7>-+GgtD)m7TBId5{p0K7r}<4<&;I zk-kVz=60jpKlWj}d;?^qcV+e!z2P}J4b;@t@rnLVp)0>}VAD?UQ#8-dqhFt)>&<;H zp;scBd=h9hV$dOJDE@E({9@p*w3YQ=##Z!Dza_fS9k! zU$*FNVjPPs#mn2(_{)_Tb0OXJ>nSv*Gn9sg=S@vba&mI{WSdA8a{X`5Bng4?KnBJZE@4)^4|C7WM6{btl z()yF|W0X?6=x5)=M}#U71mT^v&Pg>_M@Knw{eL1~AeKI7dD?CszeDd|7o>u$tUShS zs>+O$NM#rZdA1|194{;PapLa+L&OUgthP-J3Ja+c`XA_&DXQ`Ew4H}~1Oe-Xh-XGe zKu9IM$=5R&TYNTveAbhFJ$yuAM3qC!8yie^-#&GzFRI zD|nh{9ynn#cW*lDPIkGhHMGHf+I3qjQR#VuK7Nd3SOLuY%*6j>gsmwZ->Ov?))Cmr0Dd z3Bi0PLt&@s1}yg?53)&G(LouBt!%U8872ia$Dc#7hDuCtM*Vp)hhJ0mZ*w_7cbB4> zy~a#LPCdY@a=#w*ZF9czE-PtP!XV4tbb38HR3`>roxp0Km;$2>2haXpUSklQl0Z8a z+%D@Hc%Ek_nfAKC<@3Z`7B%L70n}72;Lc*AqH7DdvAOY=!dMN{I&BD8zfw_I-J@5@ z=H2Wy{j!osy}~NLEqp|o16XI$qx0?d%yw*Nw|k`DRyj$ycyYxid{;B}nBjjhNF`Z; z`|5UWzf`m8ZJBvRA1i(Qln9r1A0ZGUAEh8B$HppU_SBsn6g*?6X;#;6`!*(b?Y;Tm z9zT(swkxp{x2Z<@1DZRMM(34hr7|*8KNcr}B{^aRCtt7Di}IKngdSwOF#ee<_8Iw# zl?d5ThwQwpSy+f2ittZUZTKJC25y`DJo5z_K)1|?#68XGtR+m7i}G(_+5BCD9t6@) z&dy;V{AVjw>K0;Ms0Fv8#Z3<~(fEM-!dAZDiMgWz;ob$xJ}lMZdxr)1m4lK z%`1`MJ@rAp8S$@|{QdBymw!pVkyoGJPIo7gNbW=!2%yQu+`|Vg=OO+5yY)pZt@F60 z2i6?>3I^v3bKSTiCpvcAwaaSqVb(htbBQJBHy!(xeJR_O{*;mTPSF~ltAxJSm`Rb3 zNM4pb*xDRSeeq&z=l9&HR31i;9!ojRH<)u}a(a3?4uNZZP-IgdPM<|_I|P@vr?yUF+8UH_Sewx9PxLvF8{a|1b(pyf2_ zccHi09Twp=(w{|04p{k}4z076=rV(7Mdy%A_YoVr1;v-Eg@`v81`SR!!k;cLF_5Qc zqHQojIj}dnCavsDW@VJI5Nl|F;w+{pjI&%`>R@1*<=^fz`3I$7{VwKQp`_(1t)?O;cjcTO(oLIkeuM1=rly@l7)Lh|9K)l&Uu3}r^*O2ppyuag_0zm5=R@DYkH+xjb#&@$KGhl5HBvQ~C% zM8{YFU?)>~jyV#cw3bN@R4qCtEkDN-y7gEvtP2;e5s&ct83$>?X#$fpwjp5vLpauvA$;faZBbPmEl}9Q+ zDs{xO(TR^pshqV$K>4J0_Sn902W`BFk-uZ@GMh^N_Wtc@3Eh^1b>q8&oK)1y%~B$( zF}%dH(7IX1Zo`lJp0${t?s?id42yvO*9d+Dc^b`0W31d`7W;R~_qCg!-Dym*ncLq{ zgw=$_$Fi}5%#4e8Pe|yndiZ6a(K7LG-vSGVu_APIK)7x%plcd&67-;UdIF}u_mgsD z!v>2BFDpy##4?=RTOjo%=!bu$L3E80VpHEc+q~G;*_ayUuoDlyW1#j}@M?=J_*#pU%HPEABvN z%f})KKc;JarozMDc{K7B4*WE!9eu@qFaD8OLLsYnp(1&&v(mC)>?BiZLq(ncfR{|k zB`spa=80N>{oQ3{>_2I!fNmt)UJ9Cb4~B8i`A#| z+pOKo>@Op-%B?0a4Iq49nQCnW5pD%XZg-R4?a9yWoKKwZ(}mv z&^CjeW)y^~?qJe-xRsWdb^Hm6)RJb8NP}LOnXi@8pwPKLL-yd3%OU3Geebd|KyoyK zs*+2x>$_>o4xLJ_FZBd{K;fb_nd$Y!V*sWvYxr`EbS>o1BqAD=EQ26o-SWiUVlZuGxfZAY3@w3Rt zR=17JqBc%nny&2zNpEa|42L2*CoBh@H7X@aesl%T#GD_7lShYWHnu99>Vm$7+Zc^m z+eGV??`?w8Gn33bw%dVjeMbVri*g@d;3=gC3Mc*uP!aOL2=iSL@X|1n%V(@F$XqX~ z^>lfxxl30*2QAs&(+yY}F0Z%Q8ZJ4u1J6S_9MHx9I>~Ba7wfBqCHeElEm;!SJ)I=$ zbyF)b*2HP}Kl-Ee!<169Vlu%WTS~&9o`f!tq%4^=C#r+c2d7Rg!Hyrc7dF^UP0~2Vz8;WcI33 z=tAl0=I!ga5%TEmer76PM>Xmo;GpK)ln%I{Z991Om7Bh&b&7OD_OmU!KLOkgt>1kR z_gM|!h8ZQMgPcmFB{`Ii6qMUI_n9*5$yz6%;^#BERn+#Xep0%c9txRIcG6#77|KLT z87=Rmmq66eBOx6H!s{M`2?u&(4gvHxl<0V+AMAG$JDVXa6(jvIPmKWS&g0?akkJMA z@srulPS~-0>wgJgPG!512&xsw>iQV=o0x_?E$Pj0Jh<$e&8(;sX`tI#4q=HO^&bR$TaxlH z)2(2N>v}w^ec~N11?53q!9fbB)aCmeI-3Vt3%*{>q$A-m_Q3E3e2Q@+!!5`t4$i$^ z(OB!1*x{Bb(z=>+_WbYJ5Y_l|4K&N8_HcryN~m@BYD-GQlY|P1&gRDx)7_A~LalT& zQNFAk)ULsU6IASE$mLal4a5|sc_p!Ja8{gyhk9E1rB@$BI!)lU=W`>IrWYuf7W#ma z@yN-eg0dj26yj0LP5b5D`s`LvtrGY&hWicVWSy<*mVcL6otweWagq z;wUqhT(<|olyds_7?e7uimWFnrs$u7q(WrKj+faT7euhQz^&ux7yj4R<;{~Hi97M!igJBQ5?ZCt715)|M5v%${lu6}IfBQm@*!bq% zaPd1iY-Q2wXfE?^M#jFkvYpUK!;ihr>GZ<4brUCQhnIE-R%e;%FW+W@LW5BEzAc1o zc_)TvN7J{DaR{zjy-t4~Y)$+Xn*E^`S@_)jXG;Fq=zCSa4e`WIhln3owUPG-yX$3IZB6_pE7um% zaQSNcUr#ge*Rrzn(PsK>5X-mfB`)W{mj4%G(cj4N_FL}bq~z1i!E!@5tHbRA z4@vFh{{>l?`{`s1X79N@lmC6g536kwC|AQ1Y#$NE5fKr{m&Zh6s%K@#4*K5H{&pnW zTz2DD*d7gKS9^EDxH52YP2l>G!|Y{L2`mzwmR$O01!tl^JamAz+5$r7hzW`;azQR; ziHUN%hrf-|`87FN?B|50n;RAU%o_%E#=m(pv`A}e7L$`n%S!&Z6}%;WwFQSNFM5^G zaD<6HE(gf8*tXt;4p!Hz&5XtpEi9|iAnKDG zS>w=sM_p;$y$Rp2ZmYq;EJC}VWl^7()?ac+&&=$Jea0&;Wu5z-_e5`%3$QttQ&K>V zkITfzCv;MSb!Q;^)t*^n$IC@Oo?sH80thx5T>TXqixXa@Uiw32v|**f%3& zIP@tZ^rw)pOD+FKu}r1y=f<0MqhB*(0Z$HC!u)X)!~j<~?#z6c-YI2wme25qk3N|E zN;kk(wzx@nU~5%w$)Ox>TqwPbR2N}qYEk%ZCQ^72zuBwJApd>uy3#ibq94EuqI|yZ zt2XdyFQH1`@E0U}vv`NdX$OaQy_vMZf6EEV^?)^yAI3CU9p>aH0HfXuBgjSU+h& z;hT_4#GuSh*wZq@YW@HvfPp>k;b`k^-E7}v+fcyHfnd z%H$|4+yjnR#TR8G=oe8dtLWK{ot_XcX;pdMsIwkD`;*+?wL*xztgtTpk9X^Ck$y2o z@|j`6JkBE1qZ4@oG(AMsfru2c-g-Z#04K_o!}5%4Y}6rR}7c=^u&LWfR?6U-utgK9itpu^gu~IW)%1BG-Fm zlKk;DJYr^GCQV|!^Vvvf(#Aw6e}AI*8YyF8Y{zVZFi}LNOzl3iX~=8VKPSSH=LywN zkGVK*#l^y^V=yYEg4F^zPu-@|IssfBk0*>kY%`GX!4UQLmowHXvQsI;5Gw6O;(Nz- zwIuhWd;@L|AB>2P46e7T+oaB7bw@1F~}cM z&M^DVFa$70+7>+e&0gkrx_w*topqc&j+Zfc2;}#@;>k>BBB|XbrMu5c4~xE5jC^N- zRKhKm6T-t5*xl-VauKYqe2P4<{i2#$`tUdo<+j!wYFug9HnzpiI|I?(R8*wtYfD5t z7Du7(?RQ;oqaCOx%Im{^)bRCuuh%~-A_gN4R%l*Omb>%@9Cj3jkT7c3@??{f@Awo` zikd_Urh4`ElU6e;TUmP160xeK zF~OrmJ5e?sr&p=`c@D(0zHMmIkKMX9#M^kCuZGd?stW#XO!OzCchHTEOE zfQIY^gy3NE24olKB8Ohk=B4i!H|d9G)Bctc-+g}MiHJdUkMDE)re_=>AvEpqO*b=r zR9BFgyuyO-_fDiS^<(j!)M zA^PVSPisPg5#^G`)3sek*+47C$>pPV%9 z))EUtWFLctwiypKc{<*kPau%`_0vub@!kIucV2KdYX!F-o2@;k@KZ^%YJoTNmyZ; zn0k;>?47h_QTPlkBO47qPgA#$$#4CdD1L*iY*MgW8#;NwsS;dmcA{?Z+TSgd!&QWr zhch4<-s^eo@2VuXzi7)xHF??s;7y1*xz*eP$;{3ZHc|XfsF$g}Sm!cmse1g>DctbR z(@j!GG3BO2>m5wjx^wo3nO;yv>Axr#QwNXHtOZt=-&@0I_1g4(+J5q7&8z1+`v=H5WQkrZ)*`v0)X|2GnK?pxiD5jzP z;IRX^YrA&?`AvW!~RH#zcT_Nh=3Dw4Gj$?5>}mrA=@Tq zCN4FR6S^yvV9G7Y>U95}?G;Zzg-XM)J!)-QQ}3@GSz33>*sUY*q3+>>m(a{$$LI}F zlNPD!+Ya3aMXfd^2__`HA^3OxX_6y3^mw_{p&5#oAhV;~u}ar$f7w?n@fsKH-?Eb?=I z3UkHwH!Vj0&Q0p%ip#Y$`6qA?m%tCOKO2LsJ`>h^9?UZl1S4*Us;a3M#DF!svpp`kkMVkYNplDBAn%9pblFXnhg*m- za>I23BLlQ48cdthtbjGVb`Gzvhhf1ctJE^`RM(C=gbtY`1zJ$6YvXj4CxQWy zO3VX=i3exslx~fxxv6pE2VQH@WI4*Ji}+r9j&Av+aglq4aIiH?qQ_)RiHcade^H~S zhM-3ujV-y-&z>aDz7-Jn1ia@FPSPK;npzwJ%AmUxiWRS(ca-Gs6X$PeRq~SWmfNmR&Mip5&d(bQm7C7B41{e z3Gbjg3$Basw{nTc$#f>b?$-5u#utn@=AbIYTnpZ$5g9uI=nL5E=+GYKb%t0dxDg7- z_OBO*$Ep~6yVnkp2xv`heZKm@PE{4*ECZL0O&HM$I{n69{GR~vXUgGq=4aeJQZ1Do zF9+@^;(a&CeR%On`8D?$R3xItl&d%h{K2#PHnC*ifCv>28bKcO!a!VY%11}|fXqUM zza-x2<=d(wo@F-_3yEdDv4h+ByyyT1oHV3fg2vJxBQS(?1JXgl?4lCX_3K)xHuqGB zy40cl4#&sFnz%0MWj8f7%iX!DG{H15@35W)4JJi8dobBPGhV$mA36JO9hyQPE~9@e z7~NO&8l1sgTMtS?uP+a~Q?64>CgZ$E2X`@(h6m(ygR~V;-W?kK7uhub>-K>12%(_Y zDCZG1yFz2=^@gfK&WqMr8QZDc+B_iO165K-4neGUZ;XQ7=Y6AFQZWHRZgAa`+8PPL zl4$K;3P5 zXXI8}@h3sE=jtWzO>Y8qwGdDxnSUvDD<&mE7r7V1wg|qk_oG5c>IP1}K)XL=$VT3G z-yuHzF6DWdyi=EgmuA;y@y5rjrj#vn7OgL2V>tqVy&(nXzy9o>Wj1fODW z|3x4Va~$P7N}dj*UM_Zxe^G%o5ez|saz9~o>)8WN3Gl2CHnF3fZSs2Eoc5QTU{ppF zcot?*sF&qM?lh<+aizT@v6==pK8Newr7F&i)Y&iiHWHj*HndJ`K_AJYqA^=z{ROiL zqMxqI9_(~zOr@KtY{u1~<(8t0$D%Dj7B@X(N`@4a)l1y;Yo5W(m|i0v9{d>H)wP0; zB)@Iw-1F_s?wYDBv)vtN?jlS0w137S|CxU7A6D|XarvHkeuF+g6R<&6GinupR^kpG zeu3tX459(3WallEJ}5^lWr*5x)D>!=urM)vRzG(0hcDIttHc*N7JIu-e6mOrP4>Fw zZj==OH!2LFFfeKC0j6c{B(}YZUUM%B-^Sb1t~yRINSMgFS#j5IJTg!Q#qA&D*uiPO zaN9A?bP!ZlU_nYvO)Z7nb>d4ZM7!E?(Pl9FBa+WI@A3r-A3}pSRG_0~b)`nj{GY#( zzgK=Crl}2jY?v4<0t7!EStpNrJtCZ#_6VzVmFF8aXV##bU`tVG9-6G+7FxP~j+Oxn zVtkC511*9oBM#!d-kyH&l!F3(0xr}&hd?SNVMi5AbxI|O^D8*j!!1Tsbq1@t>FLw1 zOI@W+VmjTevO^DzgxeqfIN9oERba zrg~!$8aWj)80b?=UT8$cD2I*iJO0+7xIXliAdY?_o7->27KiX8&%YLJ0eJ5M|I-9Fk!yT<7B*J(68n z2v>~g%;P;LWdh2AstzsI^^(I48w(s)n@FzVnopTaJPDRx|4;;(m|9dKCIKYHvE(qF zW_feayO}-2+%D_Z)F>A-X0Z{6ksiW+s|{Jms$ErVF&8i<&j$E^8Okde-okJ7D(yhz ztZEmJEa0UX5fGY?E_dJWXJukCqXUaQ)7_^3Yr3v40aB$$~=kKGT>auC$!yu^xnUc;8>G?b5zvu37$5buxzlb>PGsk>w ztEw_oS5?A6+Y`EOes{>1(rjW*^zA|N!2;am_#8FV>rrbr507z{WL*i9t97u4|DwtE zk3mhUXj)EDS=r5yx-X0%POabjgTscRzIu&!H$AE$Ior(BP)#i5so9U&2uv*#ww8<1TY-wyaAH&XvIIyXhj<5BZ zXsV!gH^s{?(gK%>MYO=V6y=9&EJo(rEnX_WyezAHGu-J`ChdGv*#aHb%E$!EIvt<2 zf4Jx}yhtx14D4?SL;6mC(dt;a$6>9C8o5(s_Hdrw?2^Jl(WpQ4Sq?&--JbIidL(^ycgR`@WmhB#S6w;R8Z zzz!;RfSvGZbUt`O!xrPiFLxf%b@HJ3V65nY;;x+wr1rUt{;U7nQU@;6q{$0`069(8 zYLitSZ|U39560VsiT(Yu&9Y6MjTY9ZJ>9O(*a8>EyZc0K&Z_s1Uur~ zO_Ye`*8_Hbx(xK>sPFu68?Ku+S9zT6d`!7?A$Byphq8YGx+B;PbJnWE>j>K)W)w~( zrKA+Teyt7gR3<~N9yV8cIc>vus+Je<3~w_5LBzT%K9jW@qF@CXRrHUEK8&n8yUJ%V z1+@|^MA0Su4HxqE_?!W>TJ=_cR%LwJqk!6~@#l?i|A&b4{YP6?cTrQtH3dZCLimf} zSn5lLqtT?KG&eA1-~bGK5w}=$=dR7~#8fKBYBm770xo3eefbR%J6IP~Qsw#G6q<$` zt@8*AyMy=e`f0(tvvxQOCXz>HX8U`9HGV*{-Yn;Xc>kFy)vdPoxo#UcxPKyY%TO5C zjlM z+8+EF@>Eg-@H{nzHy07kb8i_!mHCxl_a(2Xsj0DFI)1}uvxBb%q1jsyw0zB|UbY+m z&83duzGo?K3!%@|309h#M<7xNCSl&a#KHrD@0?nI|L)`B~w{Pd+mRJhZiQAr*u57p*J_8~MltgmwmH`hoM*vbrT0bh%K2M6WXKeGojLvX7mfvgCUCx@7HVN@-*M2j~`hOH&jxv|!MIT33 zO~#Z?Ri#E&ZGy8px~qEBJ&;}hA$OYLffcYLy}0f2t4@{G^F5+K*!TO2Y6J?h|NR;G zR`!2MI{tq@ncaOKC&n0WeDJ-je7q!6mrqS8H(9^@iTD59LdQW9$--po9HOd{+eHjr z^YgS#U(kc~|029sz*LALx#a0a4mXq?I<6=$5ey2N3YcS@YgWnIOMpI>PTiMFr67GZ zjOJ_(tK|J^p%2*8k8A=T6#A;1{kMUyWdQ%((emEcK*Q^NKNXd7&up0B-whl`yM*R{ zom(rcz{MRu{g*LZMoO}xzK!lqy#8H;RIRFY*IyqvB*{16naSe&lcLPXafQI}e_Sl} zFK3G!CK#?%FO_1#GaOac^%Xs}%jkJ+6HU+7n&`u%1l$X`$L9^4g5R^PJWc;?7~*;m$Q zmikw1kB;6HJ54fyj2Ok;0G-6?##?$VZ9mR9YW>5V1yS(RKOuaK(@SkT1a^~XG4>?j z?$f(>>lOa+qr(1hu`*4}F;DkdNpim~2V0Qu zBr{NKo94fhuY@65;KZDi$Frpl(3iSYWw@T)$|bJmMM(O(hRtBTM)4EJ(UV7#c&{g4 zCdo^Mhm3CTRCErQ{3mL82L?1UKb$hYn)vJLP-bC)Jk%(ylU{#akAypwpN@m!QCgaT|s?5VK17$Rl?9#h8aDkeXx|}TP}*b^q@qySO zR;?euo||dXDf4#)3MT(#Iqwi(dc^Y}Be?}EUp&2%#T65ixV_)Rm0nU~3g3G=-{Q#_ zJ!|~f$!%RvRamrH{?@Jh@z$e=lc@&5?@#>62mx>K7a-U14%GVWd!l>Qsk*HG`-2Le zSEl`jx116s6I4*Fk^%)5{L=iRyOpGgB{R|4!s6#6g$-|pl)AJ4C|O+du4i0Pp>m$V zh?US{uwjJ-Xk*xT^M1|>T--PrdOhRp07C!=3hEArJus1}PW{DOR8jFy{pVDT=7M{pp)>J&=6tVEmr&w%RT2?MAb0_9Nv5Isl|pB?N?Y?Pm@jwfNb0 zk0-Eu4*y6v_zK-FaEULUERl_*?Nc_B8PLKq(QM-kbi!C%S)GjQ+tHJAjq z@km7)^zNk7IqoEJA%5?ACkhgr`+YQzrHj#_qvE=>4uZaW;4`C zSm@tR4KEM}YJ_`K_%cmeX5rDDnPrAsq;odCCBING1I+e-Cm8a$(EA&*3`fs&>irtluIkY28fhPh-`+$tA%7`&M z%Cy(5dl|1anMJ~r67grXLqEPr6Yovd|8igPRs1l&H#rqHw52u{=KZXfa#_9PZ-XMG zPc1QVz3c5=>qH-Qm>YZ6VBS#ho$o%6bX)ihMo62+6l2*%pXTxN(q$Nvo6V)!^;`&+ z>ju?ga8Q%zJ8)e@7U?=#gj8-nDLzt;H;&=?j90k@^T9V=jMIVq{0d8|68fEwlQf@F zNeYGnD^nRzza`S1xn8A5`{C++HgTc~@n%7Mh-XgU5~BpBI=H;00MIf8aD=KGFTHM_ zb3fT2RIh52aWu|tbTAuO8=9m5jceT{x1&8xmL!LvkniSyyO$z+H|`FBnhUrC5-j~a z#9c;og{g&w(%BVnN6x5Ze;=6x7^G5~1#=h`1<&{#g~DQgp+Mz9&n$kv53*0^!$~=f zbBfcxDn~o`WVIv_uMg+8EudB;zB&qU793dsQ+0a1;A>P0cf@rpd!PYTLSO21#>DK@ zW6=a7nCC@4{keL&J1vC&^o`tkEiYb=q6_Jv88-qW5j-Y2U{6?dJ)1GPY3e6E6SIzt zCshd95=B@KCYAPkYxioW)A8)caaTVXTcH zY{7`4Nz;Y@(Za8U0HuPJI~|XB|0r1k|9&@Qt4iqbKL1{lzo}jS`SkxNwr~b;UH!zw z#44dCaQ7XSsjC0{EmK^3tQ8m2*FKPyaS<@5#lhw}XHzeUzLM{L8Z0%H6RgLl=vF<>QB@1oytF}tNAw?k%dz^i8b}YEyJiHYOb0Cs z3IFNOqkj7>vvXg$9q*a(93QRm&tMxmFLR-i)xOhLW{iz(MP5}kH-_DDb>7z*cHuIH zA!#K799it!5Lq2|eH|^oUipy%md}`F%gL1v|UL-<26k;Q)oTL0XU=^cub;s^6 zW~aP+}){fB!c)1bC6p3 zvAXh|*r%Ya^0whe5a`Gi~2kVr(<*1y^0c@k zOkp*7e-8BhMfLnKh=Y{xkOY~iXi<{BlUW^*G!JVl7Ez#lAG8sq8OL&N!JMTdNl2tC z$g|iz&kor?x@lsY2z!Cj@ia1{!#6t|1p*~gw&jz(-)=(Y28y%44LS_AzW^=&_`E$E zKKjCF8iTqt837DX04?C@;@Pf=8$X0PZ8YaW7}9azPz6Q0N2z;OfSQGSPB~Q0C+Au? z!E>7!j0dC{2=c7c#(u%+5dD=?LlfmqyebD)LR4c~;(4)k|BFeQ@c4=BxEZv4j%;XT zBlurH;mq~lEXJ7s7hIhGbUqWnim~FVFvT$navl42fJ#}dXZD|eQ057nXTqoq!!)`v zO(i}sYuzPxdW`=(aoWFQ*ds_CbsfK3q@NQBeOBH#vqyXHV)2izMY2h zn{y7X4N#jK#vCgzAG`X4eXeO6Ipf?yZDJi&Qls@**c2s4WJqCb=1jHaYG{4aS>c9Z z@7(TbDu0Cs9=$``pEk|MWE>Tzof|+1kW@FScEZLAEkB>I0Gq#eu2WhV{g|(d7O+lV zo)2j5kJyf-pp11qWhp3Y&ptZXdeBYCR4l4u16|()C;1wTv%lh?ML1~oDKw_2#kqDO zLlidyoBZ+Re&PnYAsnx}Q&{cW!xAQkg{Z}}g?SqnFcj?P0Vb{Dh9dTdqkvPHsgu?T zd#M$0@Kg=21z#nM@F0g!jvOmF@Nym8KB!#0P3!;him^F@o7unkCr%SN@n_s~ihso` z4pSq)^eOgv&6iS7H%mPc*E2d^QjoX)$_Nqi!@Hatf4rKASzd^z?!8>>uVCYIOkyrYBNig=(Q-ZNKL zEVEl7)vC$y#$BgTobkPLN60(6iywii%+-q=oHjW^rJ?dE(pBvvdnCgCGQN3nu?(vG z5HxurowN+YQ;G71NXDqD*WEkzZC3r6?a%sDH5d#o zq!IThNex8qcK;ity9307G?$hKI7gxOf;dfn*9nlgG-`8;iU$( zDZ_V1pMP`vld%Ab2gTILhuf4iNF?n|L`0?b1>eHlR^(;G*y6C_!c!Zszi5N+i$yB- z5YAbDRj=YKsKTjslWu!@keqty2IKIMdqmJW**ox-9eA(nK++?ls@TEg&pU)HoY4?|iX^JqipZ&+lo=Xwi1PEiPmPgKAfaB`c_$DSn+O z%d7E2#BUL+OM_kPMzaze9BI>Hc}I9^DBVM)f-N?5;ept@nrDRnFc+9Q6b~m>^1E$5 zp6JJgZ1P3T0?+g&XO;Iob#CosKXcxSEC1_3;JogLQc$zr&K(sOrQs#T5+0P0KZSoW zNL^a7VbS|ORCS|3{i7 z4{n~bnT$K<dK zN)B|~>rtz#IObEOJm5 z6tY=DSfTK;Sa1`U zbAXF2xZj6@^{tBBhY56eo*!2GFO7arhj{o%AfaU`sA3Z3_C9RRuW+Qz#8fG~*_*=J zT%o3b@YdQP1}aMpW_Z=5LOv>(ra)r+Gg09VHz!gbeR1vZ58^(mQ}}Q|z?bYf20MxT z#!0PZGn0Oog=$vF(xn+czEy-QAJd7cAqCed@DA>aj8zl}2^ygMdq-C%j#nu9J$mi= z_TRo&%D4bEE{{Oe$AW&-76`RcGGC?A1-DSkm*6k_6!WCs@eq9I0xCDX1B>g1SX{juG{GW89PEf>GXh&^JNl&H2%bj$D@vd6Y~Qy6~NluoY`FQ zy%u={)MV{I*>kTT{CuIbK&ml4T;oXuE?4s1!bSYZ^8X?4J)@f1)_-BPjje7#w*{qI zwjd}?B}i9MQEAdk=m-cQASIy_0R;sS73obn1VRWTgqDC*=`{%?G(~FYkWfOo3*2X) zbKY_9mv_AP!+*T$}NrInpW^-#%Cv zn#u1SZrt@~a zAMkvlZ^Qn~ZvLr-kv)~%`1(WQse8>jzUDovJuW31-JA8LwKvknGl(BLUIk1axQ9o% zT~%^YueO+#HGNztKg4`H7U|D-YVECWk}jXkOu!7}(QWu(Kc!;{qX8$pZO!&|)`3Q? z13c$mvvl|dE^!`vCeCgd)GxgIQwwXS0b~kUQr-4i$tG;2NJBh271yRF+5`Nzly`*# zue<#)ln`iRoM5~D+k|~z|DGK+WOb8{2HdBf(XEI-AS>JDDNb-Xf4KBd)E(<9vu&mE zg4uJ<_L*&kN3vS>*AYd`v zYnB&(-g+l?^=jAlnv0&+?W7a+Ja)z~*tg;AmDJ*bF&KmYZUfg2VzSkL8p&7 zz%HC1RO3oPbIj=IXi-sd11+sizRp?5Z>D?P660;6-bRcn__#bP{sKrT7Z4Z8zZH8E zp%#m#3(J$I)ApFB$^yHlKG|y^<^1jLam_5~4AOMOEB8Mr%Coqn*O-V%>H97&LkU1V zP?z2wA3x1Wm?&5x-^D%4XIt#GO|8aAaZBE|<1OUHQz_1x3eHaX-@E%o4J+r07Rp4* z0~fBNIsQ5Onjar~K@H_ErhmGc-H6V7e30b81Xt@;``wrNii~f<-JN9I#SUTQJ0VG| zHHCcPmfoZqPN&LrPeE)c;u~$aFmBE;c3MUK@62g?{aQXQqu2I}j7y<{3AVc5v-1&~ zK4ffRayL6A=>;qoKg3Pl?AI@!cnEk-*T{)o{T%S>7f2_KMX<_$_Yz*$AK)(?3~JDR zK>za~xS>-~9w~lBH1CO&DoX0ct+_XVD9}ReF~tucMRSJu*4$$+-;8#QGZZy)EY5WnKd&?_=Odc&CWF%(09V_G0a$Qn;KCf zqS~(+wiRrBZ3~+~dIhOK7ivpCV2p0%ztS!BFyB(+`PR<$rekb1Hw;bno+F+wj}*Gn=$l=~EZA;n##g6I~+s=M5TmGp-h*ma$@=e`7NWXbU}} z4_RntNbU^~&@SBFGrEXe{7q*aNX+4`c!*7{=6{=u;{x5>d;CoF=g-dph6}h?oqH&% z5%%9HIDpQK|0{pp{~wQD?xqqdkH4R3TT$3OxEf-9BIdBpvEQ@s<>edthSB-C&y53B|K^;o3+&-C3K8O|Jv&j!I<0q;{Sjbm z?^zrF7nvGVU%e(zuBm$8oYNX5;S(x3Ft19&#|}YRq&wyflV2V=bkZe4(~||2^PBjR z;4Y9VEuU|rN1{qfiQSAUIg(WCu6cwCv4qubfI-!*U2 z7uIVBN^u(9L+r5iw&~BXbU}fxx11xONiDi*n^IW^zw8(H3A<;B38d*G{BpJ1g{e-Kc1C4Tb$USQl52fqNmmfSC~U1vP!NF z@m{D*;~IQ2P$!n-k?wM5J2q>=>3i?EE^~*MDL^6)XUKJbH~318#uvv5x=ecx39JLx5l-Ty!U2U@8!lSd+n8HjFPjN>++Gx_gsg0@34Z!(n-%q06_GKT!1WXVs zNS%2S%;1*T*q-8Zzb@rl(4KQO=PT!_SDOKv&bm(9vkn2fSU^`ud+wWas%-v!?ylec znW?^oxf5$&I2X2!PU7vCBrZYaDBaHZ>zX5lWxYqOBa9L?Q%15?+>p+^%=!3-iDQRu zsunnCB&nT)#KGD@3%hDV4rM&Y&(_n|zm|@Wt!nb4a2KG{+3XABH+AUo@~Q@W5KAPdYH3VJrA7lGB#o zqfE;;$i1G&WmiwG>&Kwd&_(}c=ntim!U4N%tAdli>ke%^>)mLRBj;ZWZr%B6vMczB zd@~yJ`j(WGL+8oFYrTc*GP=4m7CJX-g9r;>CTyFty*}r1viV?B(8ob;Xg+x$JwALRSu}pWmP!6Ye}kcj$-K z7X8d}j?4Ok6daq(=t%acHR(<7&*P7{N>1>&j(@^j|Kq?w+S@)`p*Lp6F=caHHoefB z{8mvIZ5E=M<#Kl!$g&KxvT{nW?}H9N{_8J z@!bP-qm#)Hu0pcklx3A%rT2n>G~dR(?l_o#=dAnR8o-wkdy}}~s&_{}KRe7w=%+_; zdsj=}U(JEeJkvoYc^ZOMlo)JVvM!mJtYBZDD+|fQCP|a<1fr}xchR(7BM;s1k$nYf zL3?^Zr}g6)a~{hixORk;e_37QFp90Ci^w|2Va(|X=BJJx+5QM4cgomFg=K=81HazK z4)41EWvv7{Au#{<+4Sx`=4*6o3n%E$brF!n^ia3{3!yFjhj#fAt)emW#YWlwPQBl4 z=pG%|N1BfQP9rkG7fMS_E2ITX?MzOw0NXZH_o~nfvt4#NU0DuRJM4!+_^WIZU)1Ti zYJU_^S8Q|WFsdtnlp6E>dC@7D#_Zo=yW>md_!ZN>GzMQsJOCiAf%|X=3$?@!>G`Lb z5}}zQO)dR?i-wJMTtU4o;Mp`t`RZ+>0sirmT%VGj)d4Dz0@T(BPx8hN#P^cUBy)K8 zIn*U)0XtuPaodnS$s9QC*AWOjvmzo!T7j(2^aQ9IsVLh#Z0JMtjJrb`bVAg?SAClr zV>CilQn7ONiKQjSG@Yk;3hRGuv?hOg6L41_03!C9ox|N%7%+l)ldxF3*~KEV=6%gJ z>I5ge?*p8KX8S@a+~kl&$HjNhqb|q!IEg=^smxzy+1iDKVINDh2?bNn!h|uT`!g%jv_8)VMS8nNo0i3){w=M-Hqc8)}kvF z;|)E#I~67E>hVajI#DpHR@r=ldSSbD#ApQl7{OrA5hW+3kP+9N06|~6EfQs%_7$v* zbY{3a95g;vp8#`&Am^ZN+}!}o%-HrNP7W0sNNdCFzioC5)(QL3S^0S-4$r;KI8YPP zKV~Oiv<9yGH85Sd9t$RI-Rtfbm%g90G)Hq)5nQJjA6nu5H4K*DuNj@=eS2SzVEw?- z7z*`@Z*G+!JVOYU`x;`58k?u=3gAuhj@^Qc$G#RZ(v;lsWJ)GlJa;U+^7$Mmfk1eu z66@c3z?_umo1k~I2SwHj9+#gebGcsq5j)72VH|N~M_RQ{{%K+3rUyy%@@B$)zA}4D57JNWNo-^ z2j(k+==66BY_y?N8$o)~M4<*|X+cJAWOv6RD@!d%ES%$4=y8Dz_7sngsarBF*V#l* zDBFj)(Mq>dQFB948}x*7L7GQFuA5NrTsVjEZiIoAVROuB`Q5zd6K|wZZ&l|t`_oYP z`Bg7Ui&Jc3i}B4hNC+%S`Guv@(+}9ldWJ(OEQm5x`AeR%L^kE$fHyR@6A~6? z&_;GjyXw5{hW>j$I~aeNj1@}JcraV?^Lw2t&-vsoKz@;3K&M_67cHKABR%&n$MEDH zw=n9!NF3REXlrXrUikfiNri_)TIfNxnjrlmAUnnp%*`R8@C>93(pr3 z5jYYL(c4U-YNc@a_oGIw3B#mep-JY?J9-Fn=O6%VAsx!q7@r|*sXCMxn>&T#Q@?>z z3X91(70o<0QES1&{VRpOzV{ExDmViVdIKRR|J}(BZo7_Gs7_@=Tg0z*ku5Iyu$29* zAFpHem-8CBcz9@lj$&5Yyb{dM)_)wUkr7Z#&_vIA8=}j?dGNvqMtDvQH^x>&{Nvef zmsgORATYlF%x@>?dMNQi5<6g8ByD$?y z!)N%ubEV>;SR!37TV##XUcl(}p&aJUc%mR^7=D{KCu>RF?q8{RfH5p8It^rzTbc3q zS-MH0kQ^Q`jsdY{Zr`R!>Gj)O14G@~Lp)Vkf&uGy^9|4`C1dtTC6rm^LlqfT(u^*C z6bo;HIQD%O8iSaTCe-L_`F#AouA5+t=nk4jG~a zG@&9Wl=Zx$@oD84KSA4q?{~XoTOD)|^bI5i+)AuSTb`r;Xbss6l`bb3@S}t-i$-I!;UCo3qBOAi3R~ z1L|zBZATA~@f$J%qnf|d)5P8as%o64misrw81|^|t-6i86G$aUYsJ3AXn!PLdh0Dp zf(C%K>sF`gt-BNazJ+8Nr0Sn{oisOBhZZ43gNEz}OP@n3RFD>84uB@=N1HIs=!eCG zi*8am;~#+s+sh5yVr_ryr0hGhN);CuwC=zoe1J?<2d4}@=cMBilQW5D8!pSN4zw@A zZW=UFYimcXr7PSU1BRH|={G=K*?;fYfpe<4S29}LzwvCs)j!MU2_aUwc=DMv359~+ zrenpN+pmm!OuoWhGo%{bGP&f?zt> z@!VkJaTga&vePI8edGz4*p7f{2X%HcqCAjd;;m5GQqW5y<7aQZ^XOF)&y|j-l-vOew znQ{Px6%*k!v%g3%PmwNHP~N}r(P@>vtTboEPF-g-1au*((I&=bSxtvIW33OWIQm@F z>5}>)Sy3G>qGJK>lDckId|#JKkcxgQ{c%$Ffbs%k*{}T=3Mh}Q7Ar2&^(a*%Qc$^j zYMp@X+yge)*u3Pr_vYSplkD2gLzvbWv1?u@j-O8O=7^&Nd27T`9^NQvJA@(Wj~~Ju zw(KaEU7L{o-8W$Wqcy!iMTq^6k{n%6Mkuio+VPc=vn2|K_cB9crT1 zffrU1eoy2gU(dKyy4dDk<44%YF$KfDz-DLk@ks7io)`=|-@scQllDm3IxH zS6839xo&)Brh+G{gyU$!S#|cDNLdeCcYi+88mrcPGFfiPymIH#T=of5OKEa8*D$2D3|SP#-d zgEuTg7lht$7~GYqM(DBL^O1HgH>2&>4)T+I1J|rLMZfRgq?(dFaDgq;bK|qp^N0Z% z7C6!o0hu7_9*7~vwUId@7@v~152={-rmTKWcUN?7OAHxOg^>r}G#pbr-4;9*%I=YF zlgODW%hRKCJAJ50Gykhe)2qUzwcu8$9Dd?Uhro({TLPDT75CPQhpU8xOWS|36JFm~ zWSn6Y_@=VR>tOfII zJ6*f`D;D})b?=wk^W>GN&}TE@oTt#lfbO1bcYdgxcK~>T+#nCnEg$>bfrC4)vG(HO zLT?^#9#5MJvP^bfl7V?QN1M#vEK$rd4R$D_z;;0DT~S`(IUNT<1=X|3k8V&h=E^Ylc! zxrWBLK{XJmPsErV1tumlb@p8+V+QvZvvYgqRVmS1z(%lX?W6dCV|ZMa66gQl3gv zZ3hHrBnA76h|*v*>nE4jp^10NE8QJB+9(h-npicM(V_hL`Eo#BK!tzs40pYY?*92( zUId#={npo~kb@ug(M3ZC(km(|*4^A`*IB8%Ll$`$4CdwKLu{i1Rhe&PnW5BLdpXq|>Wf zzY9HsI&=(178MkomQFb3g;sd?BHIo74Kxt?^2v;O3)L ze+F`RP&YrYG`u3Fc!>vBwUV$(It&}UMVHPKnhVVC^BpMQhNlj|lZASQQ=NHTOm|#= zRsf6eO&jFMyIgShM5XHFd%neX*3{M(!9iyBwa8q~>fKPBf2+XuYq>Kdj%0a?!wAV` zp;SW{j6YiQ<4=8)C<4YBo$i6-IGfVB$U2?E0C&gO3lc56(U_D|?C7=VDmO z5A4Op_1ore=awwU%VY>9>{{gbH*q?q4$YJe8;>}RbjLTT0tT^qkDYJY$-M&n$}yXF z!vGxCY$<_QMsga-4zZc{{k3xN8g%{_Zj{?1v^)vIUAV^^8G+WCjU zp3{lSo3qXm&U1Zl*EB_VESjshXLVGTOEH@M&V)XeRtkC3M)fFQ%LZD_%?#i+4b702 zXxYcef&fZf%x!KY$OUZ&m2lXEQYCUpgNs2OADt^TFm>1iF+LKApV(an{#I!~RZ35` zQ90nKJ=eD|=>N>F6k<@0(DtLPLc``-hR>&-WMj*gfZ&`SNpknw;g7lxCRVOU-m%m+ zDa1+0ob@>|4OPx9vH!#^=T5MTmMV~8eKGqL9C*o{`Rg4jH@6EvVvesao}PMhBmhKv z59kDD)`hD4_O|8+FFO{v^b9M~XE)5MA-Vb+2OVm`m{WQH z5ut0v4jlrL$sbSViB>#ErZ_*MzbYe^TT%>=TVFE`j94`Kf)XG49gNC(?M0O&QOe6L z#Rk}T{M~Bq=@&^dfu$e1HLW#fMQ@d;&fJ?jKy^I^1>qcuO{vVt*xX_9mMG2Rv@%RS z>V0)QKusN_!|FPfV1s_zzKJa)Us;t4GabUdhOh*_H#1T2T~oB?nSA%E$XXg#BC{SM z+#6Du?dIv?kCA<<2@TWVE@YD7P1pWbpzWQ>X@jq|{dsvJ{xAjvcgrPGV#V<5X0Xv% zOY}9L)v4}Tt}1xee88D#5NiT1z0%lN*JsGEi_&eO_OBx4oI^qrmo}cob_P7M3IQg& zv~uM?#sfAusHA?_T7i~{4*k)j^S&CQSHvHSu%uFjl3E6Bq58dCeqP}PTe zxA$*YbAgCd!3%}sr>Ie&{Eow$XtB- zL!R}Fp#ZN8Ms%Kr>j&fEOr8adr-i!m)858@R2TpJ&LdQ+(9p=PYEA;BV6s#SME6F; z{>J8Y_PTNLeKi!iNh{^F&()eBEAvwmxQ}hueYe)%#)xYWxK^4J*scBvYQ&6<@d0<*?LBZ)zw`pY(>8-1Z){`2`XVLWw)64YO&Q9DIy2)0oWayRe6jU z*kCHH|L@pp%IXW-erzSkw5r;$&t{$ztj^gabsmmMq_i%NXCVtkCAz*@zI&$$z$Yw` zy|1saUI75I#uRvAZtf!>=mL5Nv;swE2dh5`y}GiOG^O0j**43WYY0=9lcksN{k*;T z!3mt@-`B&kS}){3k}#v*CgI-EUM|ylw}0gq;+mp)*hLpm4oT`}U1=~miDO;XWESE!FB5QMlpMP2AvdyUe`U#pHn^4|8iCf)8H z2i5;T`FF-IVned}tm%Jjg&x}L zE4+5BN$ZvzQ0zI`QRAog0b@3{2=2ibz`Iay^F?F0efANbqUZ4=d2I^@0NAMf>%Q1dyve$>zrNXZY-!pC?D^O? z_R9SH)4cynY4ZQk(Nn!C;8Fb2q0H|IOA8({!u=~U{SY!@t5S=l_=JS?mQ1hIzqp|5Z6iR-H4q{Yt0wca zpWUxJ=Dna{Gc2gOjQhO0aKC@-k>YOM=5n|IN9@m?+xxqe@Z)J~!HI#SsA=h7GYR8PWFFJ)whpgcTSPHH; ztOeJSV1w>t)Vi0oRQ&D(usp1vHa-qY4mTd5wFgko;C8C5no19!s1JFeLcU?KZng7L zV9w!>EvKC?=I4KZl%$Nb*s{KT>yhtmKNXANLgO!iTxTJYJFD*IhBrAW1(X#${L4H- zBSx79q}L2p3wr`7D7ledxpM2({j0`>(N@XWN>BEP3^~7=G8D-mofybaS#Z%^t<&u&28j8Q z87T27;4GLYo>VNzJ-($qxN)$emDBT6u+iluRfbDt2ny==Rr^7?D3H^4&_4NtzMit! zp}rZ>1wMmG>d4=_b;dF6>Si-?`0$E46!MMy?jagPxw;2gI~^_bGK=bZwvE zM@Ik(LNd;S!ULXD4~Gs#nVhE;t>wP2w8d~#M$XJS?^cu_E@NWk-c!#M0R_v1lNW?L z)lRyng01MU2t7oVXEp3tXLenVHyj*huv$n-(QK+nLadI@q*5Ulp1 zmO4}B#}Bz71=S-_{o>D@zK(@pgEg2$ih0zL`p9AyU2(;|MNUY{*p8uPZl8BRxIuPAzjsuTv;c;%VFg3!AgN4 zOytH|^5$SpHK;gAV%J?}Fe5zHr&dtw8|?cODS64(1S5pE>^Ps}*BMH?XFv*cA0?a( z?xd@CXw6f+m&cy0rAS7Rsc*UX|4PouTnp)16QD;_QWQWVaR(_mxGIdJI)O;h?lr(C zVC|o#ft-54%!o#Z!%^<6+k=w0Tprfx=x2?rhRP^@8R7 zzYhScy;1a-wAI{#CeBlHP->$C=e~8(Ap_TetOtFa95}in;Akwa`o}rCAP!st@@*oX zB{lpQWl$iBsv0|!SL<*eH~a{>$@%xFrxPI+yF|x=rstvAZ#+XUwGw2)d!1XV7?cF0!s=?i$x=lBNb2q3<}1U~fo)|wVIb_;L! z2>`p&4{IqO<>)5Er$-#K(TuJ5=CQ@si#v3(5B=$bkg>s(A{E+seJeDwJ1pg-qU2He zz10@b%jpCAU*cAen$P#w4AE=X)XH6+PqCB8N@(S+rO27-4d)$pb^sb0H)sGgPEo;a9dtw$kOuFY#K71SrK0{A*2i?{}aZd@gOVN+}B!cD6%>6F=a5h8{?Sx2$ z$ro!LzZxEG09?M?fyhENZGS-ge0!;8GX{g~EknPhJ=x6gi70hCSGtzS*O(bay)l5Q z;-AL3$j9Uf4O4sC9z#qJLbansrL7u?=AV@nejmi+G(E*RX0rL6<6G|OnoS=+CgY?t z_U35+V5*A+rKT*8P5l)lUxqX@k#!N@axK(9^VGS-wf;fS7p7|zlh@^p+;fz!4eDmz zWBOJ>uKHlLZIqo*?AYrFUzKD>=e4Q%pGDi}+8CtSO7W_&vOfA14*KARvO>3>S>f~KgHbjeVsc=voOAqcmbL7)&mu>a%;$MN9KaK>QaQgvke4_u1OO)oxtD9lrIqXHJZ zc}sPgXpMZ{?z^N;>!RdV{nZNFUwn-|AL9n@wN8j{>QpCUrzC($g&?n@y9^D{9keoF zSN1J^E*U;PZ58hg)_Co7pF=1dI`CaDIeS3d=nVaEmK`VM%_eH@)LmqrouU~3lSBDC zGe)d_n*SNJP?4g0-^Rwb-~8uGWkBw=4^gbP+gcunf=x=QqvptK{V%r}{%y0Kv|2}P zr?@-tXhRNLY6hof{#?%1UG1I#gxoWxLv6}KXmc5t%z82pHd65EESGx^U+cu{%T~XA zeI*bFDiv|>kIBz8(!6SEcs3?qD(^=}Tl-ZBQ%o>Ml?Qa@B_)WipCF3H@G(C=Y*7f0 zZXhFSD!yj<54xe$3y-X#$Bsxa`!}<@&2On|HmTj5e-;??wQ*HcFA97mak5RqYwH%} zrQ-Z_C??O{Rb2P6?G$nV9bwvOSj?f1oE5|#BnAE~?Nh=FwT~UY)~pWA;+rHqL^Ez* zgpO`#I+{WL(tn~!-zvLdJ{d@X7cLxizmg|b@(B^B?z7N5zMXy{d+m0T!D=*8ZBsJh zsG4q_k;_Q0iwuw$0$_n-j1KJHpk zE$r!=nFNU(7-{>X5=+$E8+C*#K4Vg$u??!uBH&aUw?BV5&-Ow76q1?-af;-`d(7Mq zbztyz6A83uL4C98A7+kV;4kDX*-Iu(L+H^W= zT_5qE#lmT%67n`d=oQW*spsfg+}mTyl{jxYic_x!36Fo%h-rCk>SMz7AxhqJ|RiVh1Y%l zykS1p!K%rGZC8z(D|aYVuDF;Ne*X;r=3F_oB>e1?>ns!JXzT&K~pFWoTfw88&*O=U4L z8QmhC1-JrONnys7wP?57nfF|bf-{In^~x}p`=07kJRp19=g}5DNV@=OT<%N(Lbf zf@i+{Sx=t#Qg!JI#i^F`$v_rTCPs@tI*Z!<#ujg;G>+wbKii$=_36B;sNNh+s&Z3W zTxl{tFCB%yX2qW@=URLdlcK0KTbdbsh05crzV5?R4>=@F&g-<9FI80{14Kp{smyn< zT>P@5(dC>tie8sFvr|QWw@UULVfT>a*N$XIM07HDQ3dKg0hGP1O?N#^DWT~nD0kQ& zclt3Gb~E(!a8lF=oCAWZ)H-!__&O~?=kU3XL`1P_cM6YZqLsh5tq}}t@ke>5LI7Q= zo>o!;4VV)(7iOy>!Rj1(XSOFJa8*PJtIMbBXRZiO@0a0w~OsQ;sx$2 zFA|_(!ed{N?pr@W4R_}ivg%}3$LDx*B9Q#I6Ce_6pN!1lPFB^Y{Amne#f03=T6{=?H#_ zq|~SjWJ$rG=HZ_Gyj(@=*S|@YmX;d$u2m(5Dz5D*C~Tbzhtlx)*y+wR=xdGVtY7@d zs@U*WjCo#)jtgG5xdM}?X?vxImxv)7;VoQUxLDxx><7rkdVL4jUH~*!BAaxvYSYj$ zvR;R2L0Cc5TlEYSbjA}XDn@cNIpQl8%28Pi(?|qgr0bXXv~}jFy#HwGKu_caStFla z)_lVY>3wTpugn@8z3qrsE+s3kRtzC;JMzo$+@9E4Uk=aZ{WI=t)LZ3T87Q=LcM7qj zV{O)Z0G1=Mg{5)R#6&X!&te`B&t?zQ)6Qtw8a3;AyuV_C@oDOpO?H&lRlHil4c0<1ua+!OW{aBLw1om=iVYtMn!T}AHBU_w@Goi9tFvo`@w?}NeXuUIiUC`!hs_JC9Pm$y1U5IE-c+ihD=yE5Z`l*iJ za{ia9P*ha3rzcBo0@ntiCXMw|{T1XyoCl^{oh{2V3gV`E1`Zj@OLHY zy9HJgCaBzFAuw~b7nKzZkz*)7N>W z@l{5K$@KAnN_3fiZ;671Ca*(|BBA$Vf6`4nLGhPLKq30raQ6Cmthwmm*XoMGVb27{ z#6PAqi0r}KQJt2f4@bFc!~A#I6$%=-`5X^O#NE}M4KqSt%u zw0TbPo=`TAe9d>bJ4`mY6Mzw~r}jKudqODBF-}YM<~K*Ei+R%5(*3UXU(S})zQ!Onqqe21H~U<_Znn72r7@2?attUX z#dCqSyapQomZ$^o9-S`1cI_R;%a4UnM`AMgH@KS<650w04o~ zo^s1BADd|exztH-lDA-Hffd5_Qr7kYe-Tkr z#ANCpvFDFpIz36Xk1)rlIh)d7cH;W@nu(8hH!?QANN4ZaBaL#fyU%if2#2&ZWDFwC z7SQ=TBbg|N-tzbRe#z17JptZ7ghUgFU#UcO8=x{+{$we9B1=oeac*oKV@6&-jxy|4 z3)WF7NsuWEcebEpK`#4Dp>(u!@TH(5GHT{cI(j8{{b#0o8UpfM zCxxWjzh7>_gUt;4qyZxmx;mHSJcPvX*R0;)6r+>RTDf4@{ANt zm9+~R1!4swQ^8|ZL-l!2z|3dNiU{x$WyBrNegZma2ULA9aG@sr9tPZ7 zyvW@G?F=!1*3d5nVjVDTeP`4{yRc>HD94(y@Ut_~4mC+r=lhC~xVK?Slp-O4N72N! zIFfDFjGIb-de8EK2*`J&s9E-JYj9)Z_oU|h7Cm@7hgEpEest`|cJqoRyO>tNHkVx8 z_BjC#qg`idMUCYBn`IdYD6zrhGX2&Vbl*BY75V%DLDa%qIA?C&F96he`5@q|n82QP zo`2MvU6!RQ$mdWJtgBTwpCMOCV>Lr1uJ^*%za;eXH5@8~FGBc*XPiCfGgr2MdP7c6 zD9J3sYRw%+(q5meZ&Zxy6QhHTvW8Jq)+<47>D4%W3<8B(9cc3 zI0teJZ@Bacmrfp?^Kt*dIf(oR=YTfp*G}niz8UMEIjM)^&^jy#woDx^>%|Uvn83-# zon2qH70qSivj3!7pw9a_HH+mC!YbuZ=lDO1d=5{wU~R-dN;*aNZV~b-7#(9Yl8mIY z%}d@J{uaNyMK+eGzfYg*n(4g*?(1tBoo%8Ld#V?v&A>}zg$X*by9(>?r}-fF&0^DM zj`=I(Q9kAPKD+lopVuuv7q$j)7?Vkm20`6XpJRNUc9X(eOZMnN4nm=Sq?L)7t;{b% zA#>%lpT*Hq>opU+Jf%Ah(H01ynhZb9tK2rH&wYql5IK|A%wi@-VKOOd*=rwaSfBBo z9HQkzrw{=@(7L;fTl=)f4~oN&U=Z=d4Z3&faGj?dKA~!|TS;OqDg|tB8f7*1G=a?6 zX-eobkeh`i?IdM-JEb}5?SZW#yUu%SGTX$xueC;}>d)#+%7&@>I4>;XX4-6E7c>cJc51ZI&qnbvabR-m$&#K!E| z7th-8#9dj<^OY<<(;1x$kGyXy`~}6P8u;3wmhL<~v{CHHSIo2zM$)+S)K4qzc~< zHBtQPZQENa0&mE-2E?-0?1J69e4>jr8=&d#Zs|d#`x^NViy(MiieYJW=O5n5XP=&> zx1|XSkKQ2pj0ox9O#ppqF(G+doU+?#xx)beO`80E{)QSfe%4_4NKm6Ka$wQA>VRV_ z@~+ve)|R$n!JJ!fHuqf9^7!1*%1h!eM#yqQ<+pMZ70FEAsuR83e9->P#*?Rr70M&T z!a!HufeG|CB&l6Zg$LX5b!HD=I(Q1XN@cA(vF*z*fFP)53AN~M{YL}XcrHe}a4cM_S)p(mfPEjnH9 zUfL?@ngg4YW--4X`pf1qMW=km-|CZL9zle7-8ESwaY5>KXIkD&ez9NaaA?yD_UZgz?R{rdli9aEmVpr!M4Eztjx#be0ck=gItr*X z6{!J&M0yh8zFaJ?CVfbN1Q$JkQ=QJjiUjbTPT{kWO|Bl`~0sxsUfk&%`#1A3^_0XN{cr zy4t4gzoo})i>F&iGCQor-8W12I5PqNR5)-eVfViGWpdn;7M^JLXGcuTPGkj53{mU2 zY(iXSkbpnaswvaD-91^yKt}s5e!Rh_H@or$im6@^}u&-3`N z_skz!W?YK%ZMYRb{p7HdtIb`H2YBtdUy6fWJp*}WKB!;)WGleB;lB2?5%FqZczyW& z5twu_GsSb7TGw+#ctO7Q`ZrMzcUtV(U}uk|aI%tIU3o~add9+Dv2N4qGAP1)~ zw{NAaH};)MiLL#$uY+=7)Jn+V{3gjQz%1^Dp8x%}#`DD0l+|ox*yIz2)2GwH*cAI~ z-ZL#P@bmU4pbe0&b~BB#H^0$4duGaIK<$pWBtfM5)sw@yAtyzPv0n)lfjM1wURQ)W zbsJ#`y9|?o+1HQonD&bIX4Sn%Ia$_&z!n!^i@S1G69VA)`msX&Rc_9|$F@A7*4GVm zzx8xxnwRZG>Wewd^!4h9<5o-D&7MJnp)OlX;G$Y`MQ-g9UE^F?;nXYh%P}ifQ#x%6 z46&ktjn&i(o3-h+iccCz%V%3NAj%|r4f0sHd7+EzD3AO^1YLG$yWc>wcMwi5nOTFoV?ZnWK1D|2`DK=vSMF(C)H6mjC*n#MQlm0pMCYsWs9 zqnovZW*xg|I>PSKgt@{G`Cm4&f1kM&*{z4{J5zX+l!))vU4i|2{ie)cH$Anv-1XdE zhFiG#X9 z<8SUS1eX4-X7zhq9uV-sg5@zTPkcXInbAPJaTjV=l&`JoUIxKFUWDX)X)N1Ct38wk zKlGc>{(&^NU`d3k_iEO(Z&%?mKy?f(%=|7gURCh>;JrYy3x#IVHcxV>p!HlsQKd0wzK2)+PgD{J=RlnU!qZ(9$# zA|C`X84u+lXFU&g<`)Y^lGA?WrV$nGZ5SQwIS2HsOEL3ND^o@~)U}rnvU;XuYG!R} zuN@*>LT|pb?36TMCpmjts#$o%maX=?*3CY$ot-=ylEo!1eST^-`YHmeHCTMXGcS00 zL=@zk7ddw1xFGA}&}O8oJR$PJr&BWCOf80CDT{-EpC~{&2y2MV0y&nCG6w>si3cv;4UFUYcJ6TcD z#9H0r+ii(ceX~nvYPq55fhN;0Us!i>57sNDyO9lLvsOhqX=U!f2l(UUx6cS}n=5hv zk9GSavMW}y?~eogB9?5k{4vjpQ<5&@5^AZ}ORMuDm&|i+IePD2Lz2tm3uMdJn_h%U zM{XGoZh`B^=T(J z_oVTf+0uTWQGPTkhRp5Kzoa?~9jv)i+ZEW zUs;~-v&s~?@rHJFhJ#t(ki$T{OC~}Lt12ihi(macIa?5dn;g3TgPA4rWer%@@aAV!n?TTtROiSJj#Fs8iK6- ztRU?l=s`2td8h^tOP{0`)T2LD>5#7Bss;xlq&0j(!nka8F-Mlxq-AaTz}GUHotYbN z^IXffoFGNn?2QxilHTDgj)Q!LW^=xMM<$`#G-5mcAgMq3`>^{3^Mk$ea#p2AXASd* zW**&^pKoqi8sQ=cf=0RIu|So6~e=8vT6dYSqq#S=W`8f;HCMl52q50@O_phKvw` zZI*d~e7X8@zQnV)F{vO)`Z@$?%(x`k?iubO(Af;+!)-jtp)w|OQ8Dz6X?VdY^DNG8 z=c%2V;Q-8ecBo={8vL|Zp5d{I(Jb`nCQ;WuPOHafrx$;Le(spc(5Fu~jtL6lhDvR~ z6l~-wGuBdf7Z-x_4=HkuRj9U;z17Xn*@10XU=kUJcMEqN@M6r&#Y_>0QnO_AZUDLk zQ-6%HS@mfOXG($vf3)p>xv9B<)?);~#yGM`PE&7UOPge;N;)fN{c=QMx4(ryGOL5r z^Iy5;!lcXf$R+977k2?zw5FwPR>8o@ZmHEqqUZM26o~KYCRBgXV0&aGwk1yie2aCc zNG9UXI5JA_!RrC$Q69gc#R&8$Cd9wY7WJFGy?uT|!~LTw2U{N#>oZVRMo%k5lvn2^ zF)mgX9YjJW(GDPSjb8CQjT~a!U1a(CxHNmp`=wi>b-J8+_i@lp{d{!R^=~2|fVD*< zWL+4Apgn)iG!yneU^^*o(tQlS^mW~WU?tePRaeio)TBkx~m)YV0uu`$FgU! zNs$|^cu&MV7SU{N(ygkz)%qfx-yB+Oo!*uN1YU&p-!KU##+MVuVMSj;_2s)`;Y#PE zUivqHs%~^wSZwCbwQ!j{(F+n{U~(h$ywOwe+zwyA{U*+dlCK* zEsrOl6tKG<-}B5mPi1W+_-@VgKu;cnakqXWa8S~hLVb=l!A;&;>(Ht*kc@$a$~|>k z9W1d0jnVX_&(Opx!~(_|(a}ok%Wy?^I^`39LiI%XI#UCbtEY5%OX;H{L^JBG^Qc3SZ6xtpkz_=mZ3hAjmpod$ky#3aG*0>qSe^cF$ zW8jjf4smO?HJO>2E)O2m^tW@Lu&o(zFIgMm=lOJvi`$8nZ>0GKY|+|`_CP4-{#$v) z1MUhuX9f4)Te2qziDNhAFFH!AT;n$RP3%4XHnsZRwrQF^7b^^_QQwR5s4FcG3X8yC z)UZvVg`48P78E?@!dI<6?+c$35=mC;}B}wm}_1s~lfZhH93a{|G{GX{QCG9PAE>wsAB%9Y!OLR(j3D=LW z4=Ctw_e^x{&JSCi@fdFgWNP`m*{B4I|Hj4vgp3W6PDy9r7)ocAdWD*q*LQ}5h4gZg zq>u9`MnQ5xA67EL;2j1dGB6>39hV z@q1=A0JWGso0IU!oF}@Wq5KpkVrzv||9xW9f-)kZFghCl`jOuF>z{I#Q0{%!TyTEj zK`i8suB^uU)2NWZCpn7$d3oA3o){9;8KcKE1_FVMjn8lkahM~kyl>KV6_LbfLkS0L zj5Ta0b8|QI@YMg&S@=A|xe=0*e!=ax*~2_DOX)5PnM0*h{l?ObR8_eF1elkXZ)&p8 z1R~*ZhdE4QJan(=-9FOZ&tU@t-nXob4PV~v`hNLN{Yb-N9K$2x1Rn)pu+bP(B+&5= zJcT#M>0*O334x1$tqBGhF-ztF$~eXfjnWe7?qg@gDz0^+EoT{jyv0>v+`JB8>xFxS zY~gB`qCj(QP_dg7__Y#HOweGhNO%bowY&XkW&t^Z`23Q0Q+_posCCU{mC{UL7IO*b^i*-fNT3xwS|! z=>{w%V~nuREcj-^9QH=d)se#0$tY$8JvlkqKXIJB-0^vHxgZr>$H5zLD51`)h|q6r zvraOVw3cm|mt8#d(7&^>J|w6^9M=aQU-FPlZtE6?>jcbQu_EPQ(6!AdTJZ#m3^(91 z-P@7?U}D$Gy7x>+-)QR5n146_rr=2 z8Zh$xuCr9ux=xb){g96XpT-b0##Y8ERra6@WOZb7&PDFiMG!$0sKYziP5^b*@^bUc z@0SZ%R*Am;{_s?pyo*k5fjx!Gwf=a`s7K_}I^T&Y&^@0n< z&y=jXML7D>iaYk+AW}EOuBVddW16i5U=I>doUd_~^rELC5Aa=c&EqKT?Wt5-NuUlk zdCL7FZapLK*w0>9{f5=Rk_9zHuMk=Xv`)8H4Q;CbXy9aPnw~SxsR(LSQ)@142)?{c zfhi=f!6}4(?4_p_!^!w5wFfw6q7>OX_@o+`Mm2J{OprNGagq_#bW9X{!etNa6|qXY zPLg`{I$nD0q<6Q8D5xc>x!%}Ei88YNP!Yt{#=F&c<&G9C^npM-K*o4N(Lr7dQ`eQu zb?+<$$}Kj!zOWAk%#qZU3FD$6f{xGF@1Ci}mE=iwp036;B0DqK^8gz|=BS7V9v5rH zG$eOTgzDaXlC$&CbHjIiag-4{-$UvS*hy*+8ZX`G3pkJ6VOmUf@1G=l!*f%iWuWq4 zQTG+Q5Txza88gd`Br~SfUp~{?LA50sqkiC!uPm*KWM%VaQDbX8X#l#sG_!E~iVvk; z{$j3w~bSx{bH9?JTgrPcWq zN`x;8Vb)*9bxE6WDWmcD;-bEdv{-TWB|kaFhORVl(r3X!4a5?}(d%|qf_*`vEJ4TQ za*GLZ1wu-@%*KN9Do|SX;ePZYA=p+{HaGdi{QY57O(nA(uJU8dofk|Rw~+#sB4zhBWFvJ# z0$!0c2jjE@L+@s8NpNM(n0?>uC|Gosb z$o}1$8;}1|4+h!>qD1a$bbspJdbabod}r^?Vw2s88|sMMlKgk!JFAG9m?HA(1;9U z-2EurKrOP8Yf)gi6Z2!C0ivpM`P80T?C)nJW#SwfR)U&1{v3mgPL20o9}p{ybnNav zB16sFT22wsqbuxCXRc_MSTD|oFaC8VYRX}Z^x*(*@a-MmC$#+GR!?vC zC{C{VrMzV>!8HvhxFLE`?uTCjT1pvrn*!-~2#wgv%~9PkoVE%!BEvO1K9%A-zqW0` z1lQ9a&nu_~qcGV|80;bNPUFar4tXw6B@S{X{-&E^?=*EV^Q(5mn zZEpZLC--!we;V_JnLcahuK+kn&7C#Xl_a??d0({yF;dQV;TJ*{1_li~GWn-2r`ReM z`m}(vd#G?azWZWRn0~TIfv7wutBFpj7)X@z~l(|H{YvYiD6_^4XL@LCRvCqLG#ri z=k`=rbj;ac z3c@0%-&A zKWM0FPL6(t^kb>AvEItYx){04qfC&Q;2GT$ME=(=MeJHQsVhArfOf2}kksp2EG)ak zOLGA{ol*I@tAtjhFO_$kRm$~76m)<`kt4bOJv>)-d$fPXVuxhftAUU9MTr)WwG0F9 z&LS#KX>T!wb2Y}84#&iih0XxEIdjb*)uzr_J|R7V?iwbmCozYrp(SR%Q=Aq%1)k?> zk=BpD{cLSLpiD8; zlSZS08(Vb=Ox!!Y)W5t(uLY|Z;gcy&^J?IP?&F-dH8u-xCZ6@ZsaI$GaE+HG-3~3o zsHbY`G2=?lPlRhsrhV*{;S4U=^4QLG?4LN!!NCj9)9`E8Ex&s~Kpo4udI7cdri{<0 zLfO+F4v!+*+B`)(Q3#Za;CTz9+W5&<%BZ1iS7y4qlpN=cMi z`NDoi7jvS2Q=38x@+d0)wEb1IXjt(@8t+tBDK!4O#_1*K#iy2UBWGeg5}5g(jvb%g zy)J?!1@@HJQ&9<@{eKI-SHU?uiTbF_Q4h-_9-rb`2um?5k;dn9_3axo5BjNg43lIu zm13JLUi=dMOKGvUCEcTd@4(R^7%PD@z$FGJwEox2lBB&4z_z~mTMsIs_vDx2W~Bd@ zNPv@1>lLxTzpQ*oT^z?~S(n)gDJd!SkB#ZJ#BkG!c5wdKXEgBeT;e)adz^_e9Uc1iEy(XF(`mfnOL;z%)nLVpl#18EJY`#zUjQ*n} zi0M}iE*0%FWMmI6+gQ9gVz2a%iO<08$IaX3b3Kx0qEM#MYPwQL@GGSz<|Bdl+5Cs* zUQ}x0CXRCkRZHtjuA(*d5l6j{S5hx!gDX&a*5cY<%v%BEOtIyB#i}$Is&| z*AN5i`X?s;tjvG$bN2^4IEiNt&Z3vvcRS>sFaI!1JW7F_$JgvRYQ9LTfX@YNi zdwUr)5XXLxC+Yn8R$dsvow9b?mOE(~wR=u&rO121Jg(3gOBi~WKa54L512AaOiWY{ z-`fedwd7ha0?~^0KwyISIWZo$3tb0W&sasBtY7(CJ@T^Ix!^~SYWlBnUC!vn;xhiU zs8iaJyqao1AG{)UPydB=z7IcYe+io0`~zzZ;)%`@1|N7UATRTm!U5|&7NE0S$zj{Q zwv7{iiPl+px97;9p7pD}()I@b8ZLcQ5QO ignu>b|Ef;h6r6TDE3|&zh_ol|n}+7sEB{1;G7Cjxsd+%w!bU+->c!`>hr$1$czOH!y$>zM;_y7u%Bp4_@6tYEnp+?8s=u=L{3EP`4{YP~_Veh} zrkt&FdfxojQx%7~lA87lh1f1M{SS@*hrR&7PnUnba_N@~wJ%OP&|RFpbm`~I*KhxF z`P$W=e_{aqbkTrcuF%mla2h1t=MptEO6(ulyvish{?gjUBl%+<2FvaF$GZ<8uc>QH z51uHeAgY)pq>Y;ghirYq@RCw0Ch&aRXCBpp>MfwRFQ3}`me%tzz^%&{YS3M#11JH8 zn$~Lem78Lizo$5JY`ZGKIzd8pb+d{sL)#Y+@8trQ?XPbz9d3sv3oB8;Z zz}{)H_3j*y6w7_48~%^$p@DZ6I=1hhCi&;5JEjB=`s*eHQ{(Lf4nK!Q-`Y;O+dU2G%ETiV2l7znlYj9%_8gd^mZz zcI$hnl3h;8yxAN_^+d8A2Y!Zf_>zOK>}W%v}?E zm+G+^8uCEo=;?sc?C3vrYbX4*9vH%@PvI+*MZVQolP;iK{YUHmsoRBhd|xOf6t5-^ zKk8A)-_IOyegBWv{X;bjdQ<*CO&MpOV{oFoB=z#2jr*r+(R09BjgK<))$b<;~W5M!7_Y*?R)`Jceh=X z{vkns|98lVKcj}*@g4p(c;Vz6vqQoEkVXLi?pGYAggc%3TYnT^K!{RT$v>ph3c$a6 ztOnnB#R zNs#otNdXyB3RO9b)Ngm~*!kTbS*;Y2^4)c7;{dGAvE#Q!XM>0fFP`x#(+@GnLGrG{I70Dj!;hZ%ni zkRN{b`ws;9cPRdWjWR#5@dq~kz{Vfg_+O@}Kd|u!HvU*x{8*pu{J_TlFR-zn{XgRk ze>?R#pwwOUF#3#PUMY)vh>#bkb`H3{!_mj^7;r`D7`dw-(KPkK_NZA=+n=x1YBN{# z`;-{q$7MfE@?(_zaGW2Y@P7&?L!>ur^PKJXif(s-A#i8QDhH(|El~A2VCwfy?n9%K zhq>QFCwE*f#jzJDvQ29oYNwt9;yX&?HT)9K=;zJ>Guy|aO_9RfJ z^YokpI%bAC^6M`Wk=H%X0b55yo76Vms_F0t$+>@tq`W={aClOX+R?L5C1CP5>RMBP znW2JqTPGR@o{w7UYztUxi6e{-bCUf|OTT3DB>^~C-dw6-llhO#>#fso0q+YBBRiRU zyo__ihWzS!?j_c;jySA5PbE@AJmirf3^P4v&)5c70y zE!=3RfxcQgGAjzc@xxekPsBuBW;C)?)sjT4 zt=E=>+V5NS68&Ro=zWW>t{@!xi_l-;ObO_+wfXc6GXdAN6+4}IPK5>BIY2AsPb@!k zs?|AQc1^h~WRI`d-0NY-)-}`bUQA)J9p7vc@|_kVkP(>I{SQF|&=BOKJrV-hAkHy1 zR+mMg;L8_ZEBNqw?+aRKS0=A>`$w0_ex@DvuJ|N-M8Az=3z5m!Pr7eyXKTIi49NQG zXnjn*chTE9VTWg*c3jzdrZ z8U|Prp)aOid8Q`z>dzI&t_d*OFE5i&kgYYhf>N z2-s|$cm7xdC?Gsr7SST~i~lZq*dW-a8ZJ`mTt&LmKGIAnf4F9bN||XCHABb$iBE_sRR}LCK=5NI!x| z=5G!!j=#D4Ek;|A6v7Eo%@AHxsQ4o_zPsR0t_U~uvc4M4{>jwS4C6eMtQq695q@2p zhq19usOrw`q?jmAXtWbfNb?-v%on`0?6ir}=tk3tZhzj*iL6|#(|nhK3@x2nt^s+g z9r_A=imwYC@l;=VT5CHs=x^c@Qk?+!rNixik_rBojxMiQk4~HeRGNOTJV@On9Nqb> zpY-;>B$R+<-z}^fCkwjU4q+!vXENfy0=&cC{4d?$N1^{0EpW|l-$Y&dDOpk?OCC#I zF6*H|%%m0dvw#KFDgGPa)M5J=8c>vmn?w*hgT$)6px^2E1%S4d8= z{dGm0AYMP;UH!0N6+QtTTDr%|hmQxF%4Af7i6^OIZgEmT{<}Dx;(?}cuRL#{FX*8A zV~5fMx>RbAOD1Ss(@p)LkP50#Y2ZD2CuIgx>f3KX^Y@&2Ru{eqRnqI~uyg2O1WhQ& zw7o%yV2|@H`3SIT136H313yeWVqQpOcJk8K;`$pfy#nXWjt(ah* z(!g#Azph2?g7CX5!Gw;b!B~W0N})Tt+X5yeih9y9(lP6nAJs2W4#w&2qKUJ$0ztSs zTp+*gTY0b=zS8jwe16pnHyK3e?%4 zF|aOt{_d+9SVWfCu=k38stL{)Xji&l`^0}4;uV&zbdMEm;D3<@?+LiNE$gye4eojC zOfoO*tstfp4&!lau^H2fiH(o3ui}D&pB+Z(0tIK+geNj(Q6Gla-n!`>LlC@$QIsA% zuwg^x2B>eWn+l)smduwau1L(Ice3D9Gs=6uoq|<#1R6G}ll9#VK&fSg0+#)ZF0m^X zzC46tI210n&LWd0>sP#C^GIt(H|I~J=4G0mja|M`;~7|Ty?VXzaK#)FL~iM}QX4C3 z=ptCgfi1I(*gsaGvg2hXlnZ+}PU9}R+ARWZxmU#Pt9O_dOFd}yZD>c755D&t^aMJ{ z>)&ci85)FW+|?pgD(jsNPQD?v2C_^FRbLmDK5Q;8>{i|iXx&>w!QD0G5B7&FKb;rW@?sQqnPmEh)9jzaWXU<2ml4YhtFvWfDgZU7Q3QUPkJT zj*U0nLpo#&Cv?oS60mLe5*&Bk)c5G;t#Gw`u}r{UU^N4A1D<7X@2V@hdpQcRnfJHA z(dZ~HtQJtx5Y$sEjGx`WR}-nFTKhxj;85A8PHVcOal_O`K~wt(=diFiwv(wM1p!fF zAOrhdJEU_g0km7PW;fd2+cJ(dPXFLA>~nWk zDkiYOdz@@twsVUc1{I9l=g<8%XmG?NsrV4rRne{%dfI@WbQf`1df)19_Msda=Mht2 zTkKJpV3CabYP2}`IhQ{15#-Gj+Bd}u)bA;)pxY~cD=06jBu+X@St!ubOq=wHU-gpj`0m7nlKwO;>u!#qo((eP;kCcRS-haWP9Lok^=2`5rpBv_D zHPW5i>xyh@Fm)@>{6HCFzSwRtd5O)cxodz=gMa<~2;ykY9UZ!u4GNzFGL24@LX|M3 z=YUR&bAZ&J_jJBI?|`52C(Kh^ljt5yh|q64*t~2TDvS`fLv&B7uFe(q5G|L%v}9Fh zukcF7m-%)>Z?KxQ+4qrskHv(a;D`2G)7Qg1OeRh1<=KJ$yZ*-T`d=6GhGTPnXgnyJjkDg+7(a=t*DnB_p`ha)usdNaSbbKi?|)?SQ< zD;ReBtk2HgfBA&LgYW73TyAGA?*3w3$4!10XDS>IDb{N}E7nrs9A(W>Ylt$7m(sY} z?gqShAK#^E*Pq;J`6qgxJio!B#`mC|+K(1#DA*aQBu17(j3+qrV8T!c;z874PkTga zMEdxMT#L?^E`{sQFjF+KQ?IL^o92Y@KFd@i^)6eB7yGL;AQb_Y*t9Bl7$C^ktIq|` zv|uxyO}0r;-CQ;zeM~Pus41gR_6z=+!G33He-g@&sU-(g$Yyq9^3^Ee9~b(V=vL+J z?$yUdT(2v%Tf>w|3&4i(ZF(JHr@LW0?N7#K;4t*)We(7m*{D{_p?(G}hND5pVG9uM}0-gCbV{!E0 z5=yi0xleWbMAsYhJB}dH5AG=q&GxitS+rY#8G_Ni#zwkKp+{e*)olsryeWuuZR}V+fjIn`VQgFG z?1xHE_W>e-xvz+QKovF?!~}LZ26>UAzMocq*DmMHiB3T2wf}5P@HT>RlWO z^k@xKqn*K^EJX3wQnVX?9owkzh&xZ3i^JCFl}_}tB~$X!=$BjF#u$MUJBtpyR^+eU z#KuSv#cy`arK}osBy%7j*Z8urD{-MVr7k}M73cgSxMX0N8(0VSsvj0XyXRRn!FmUd z$;*%~DhM~Hq{7T9zl909 z?^BX6F8SIv^Ty~lnWMBdh4OOWv_mGr?!E;y3IiNz&(V(6w;tRc#T(q;zWexHV6}I( z(Qa8ZUZ0gVR+5A_K_UvByZp6^;focqOBGR3T!pE${!Geh?&fm07rlGy9f`Ilp0|u@ zICqHB`qf0Mhd#^g28Ju9*@%VQ&z(fKE)(X#Y(uuWYBRTmaF=W%uOgpbpRNj{7!xNX zu&}f#W8k_M;X%%#yij=M47uh=>`Qo=wScxdQ*j)wPwm;@ zz|bfXm>kn9HW(jd9#9@`3b-{B0O(?8@>82;jnz$A`Rz?_Ws_Y)L=RI+ulWqk_4DQg zlqEEXft81EfO4iC^?7pqiz8S6y2R{80)$xGzQ(9|^#=E+bHM3_iNoc?ypW!aTO4yG z??(}D+A0t|l@C>_`RF~wJVfqy&~N37+;@-Tv7c<@eT)%l`}`>I_Fvx>4=!(_Ht}oU zh5lOnE>83_gZRuxW{bQRJ1klC-^%^0_-S1x`zuRaWn`{p%+xkK%l63O{;~Qj*>d#5 zP8L1%Y0GL>L!IND^7mj5*?_UfRdr@Sq6x}Cs5$vm4YTsFQvNa}B%;>l6R%A1V zNzMd5@*U06)Y{p|%MswQ&4dFtW-v_lHi}}=o{~oHw?>!*N2F9p%~~p|+FLq0B6rUC zBO@k7d6|EDiJTrBl>#PP%WB_=?%G^^=g8DKBVU@i9+%Tmkk#7rX?=9z&J69~$$O34 zC#CNRI^$k}D<(HT21U_01d5hDol)HE%UIFvXBEpLMXmVEQXE%zMcLR~Qg^w!NkyxJ zhI*J;T3W*5Ufqa|qz{M`7l*Bgt9sVC+<&Va&2X!VPV{19006+M|GC(^dDqCLe8q3I zp8GfGQ)KeVO9wzTv{|Nmp;%oJe2LApK`An&M>cdT)21@h-K)VpZT@!Nc(tC3 zq%l=TfW2-AX#l!T)Xne7+_DwY)&}<&&VqMsamm*Rli+-ct{63sY9NT7s7As~)SV*i z)8}h4%kgD4FnoqB*YZkaz_Yx!b(J{g027^UVVZ60lWo}eWL3~8=%%*jl0|N-Tq>OHkSOZN>M zk1ZdWzq#8M{*$Mljx?iOZ6g{n8slKMd3fT(j_$MQ?wDDBAc^oRlbe(xiA1?Yr%OdV zF7M@DOE9c(jYpMXg2uP7-OCwVBU%f*RQ~p87DG?rveL$}lCZRSs)eYunMI%uLUpwN zI%^-peyoehiAG0R-G=c-Mg|O1R<;84?S-4UD8ffKOZEl0NLZ3O`|sC(zvwA5xq#nX zV^6C#v&Bn99nO$Fi9fLzCQfxYecMuVTMp#90jGHMHh6 zJ6?1a7(|3&hV(9Dw$q2c2Jp^Rv09QvY7#x?hJ(mnmT~mNT%)N=a!xj=0Mhiw$ zq%NozPGh887yoQG3U@Wc@dAQ`)F zW*`5&BmyIN(VHj+aZx%klV5xKgbwda*ZrYcF3vt(3=D3oV!a{^a=hm_lI@%P_HG4?U&0V2FYDsVo>ZGf;^R=X}oH9B6_PmpDQL~ejK{gStdwK$41kSO^-v% zJ37lO@%HluiNI>}%)>Hb-7`NEb<^4vY|%FiJAO)I3U23ilg<@QkWk&EKm_vL#yh)v z#Htt`U-I}5khw~3!8DwOhg`DS5Sen{W_y?WWaqyG^Yl=_Lt;}c{})GEFZeDn=xaY_}K*5w}&k9e))R$fz=7kt@rLZKqsi}BH};E*mOFSe+~#h zQ$C&pmf~xgz6VSbF5~BO(o-O}&*YVGmI~|pG>heFV-`!)r`(4F@GtI-J<~e&4yeYzb@63b`>B^3C{XQc3 z`;sH2(I{i?=AIFA=hX8sMZRRs9gmtp2{YeEo-pn)2fzOg$^5X|*3>)WN|Qh598P9H zG$&IaoWbG_<70kOgeER5Z}}R6cw@ZV=OK2#9rQBviEw;=lo)E>+sk-)j(sxHKGHNj z0-3`YnHK3l6Kcl1V3`8J`Wt;!zr1@g&zKp!m`uTUqtjZ^R@(ZCFw=pppkO+@7Lxp7A;c#t5 zKqe_K-uZ5ft>3z2a!)rgNR&4pBrT^KRXz7DH z

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

SQc=dj)!~HoZOwq+^by^Mvw?(r4<=v< zF9{~dHeTxMYXd_|eNWruo6troYzcQdtnM|$DPjjrH)Ix5`)dU>298&3r=fKLp|01Y z?$En!k+f5LA2iyEFa{u}vs;R?3GpT)zUh?`z&qX?V{kAdOK+ zA5|dhSL?hjt~voJ&|xv}F;DLvC$J$ASMw25mqVWJ%8FIWtrLaC-5w^R?;Uj?Dn{AZ z;&G*`=YU%+(@VrYw-+D16x~Ub<%g@p?J`qWJD5tUw2>q?Nt9R!SokJy#g~ zM?YPP(LmU9XV2)_NN~*_ zTATBbB9pU;Qe%O;cm1q}+BVX3k3Q=if6KS_l^6^%k`#r$;wv@WwOU$R?Xy`jMU{hB zR(;;F_{*ZLAgYTQ*X%qNOWnEfKD73#Xt$45{;@L4@wo-G=!&I;)h>o$ptJQvlQ6%klD|4D^+&2nsDpz$c2@bzS}84Cw)3FxOcY0Y9bI6%0~6O4 zw>qdS7Knq?#hY6Vp*L%CK2OKPJhT;=HSX0beOsFLgA#;L{+g?>Qrpo3ku(`%b|JgU zYmap9t3GDkc~17d?v+qASG1cVwHYS=;xuJKlFOzhqA0alM*73&>a*LAb1Iq~xsyag zvwLjBQ02}iPrhAOAE>*He|=h?1nu0-vMm`}e~EiY@y`Sf9b+nA6F%*QikoG^p7eHg2E4I@DUIW?P6ngv-`T*r};QOG4Quf_PA^Z=FW zn$Zn@(grFKKToZ=wGl_ate zaPj&-jytz6+t<+r_gvigZ zAf2u5u~2M7TNh3Q72o@fliQbHjySvXEfp=v17GUAV?R|92`>&xeS*W4r3XBaXF$6a z3K^~lFBr@&B=-)?dr9PaMXzCwsA{Nr8yCVr#J-(v(I5E^!0saMl(=-+x6CG;T1D-C z|Bb!(`f6$m+rHU*Teb}a1Ox;X1f)yvxGjKm0TW0<5kdl_(0dUZB~&R19hEACfC-S$ z+0r2tDG7uSklsOh6ZXsVoP6W^2i~K1jWyO9>uip7Fz3AQdHt@dc&_B7Zui*N_Ce(^ zAHz*#nY@Z$J#%MFXnyWT+EM$L_>cQccLDn7XxB?dviCE|-lSi@f&7~Ers4is`HWz8 zMm@r_tEgHwyHBuH9`l`4>c}O5zl3_Lv>w@7=rx|;j);<6h`(uBgKd{@Br%Y62v!z; z*EN)kOeO`7hD@Hs)=0YrOLe~TqkrskDhqG%XO|G#;ua`McFYg=EbZV4S~fsggbwNT zPqyaL-Gw7@vGBTxWPfe6h`^l{u8Qz7O|CjQ^b$}ziCwlj@yFp!_PR9x(udhrvHesB zuZJXt@Zv1rlLX-d=kZ>*E>>fV1Gm`N@AR060ndjB;I$HW=}_@^ti*{iTtL)TDfBiRxK4-lTj^I=Fx0SO_w=~=gy^kkFx%n(o~bYuO}-8scQ-A}{mh@`}K}0=>$i zFpBvzu3jjBAfYQ=n*&HFOmM7tTblR8PgK4^{Ev@AFWiOhD&rvEyt3bw$qfw#sQf#A zu)7Bx+}Om=5!=K>ed&^92`+1F;q;ot(>vx;Irk8$#kRQB7!Rd5XY&qIIM{(v^b;UQ zg?RgFcu8igg`IX-F3}KDedFW!1tAz8+#g8*1lC4i3z>)^-9z8Gc^g_)vMKu~U!I2U zm}@=Qo{B%D3x(}^g5~Bq_*>-M3H~_+t3N!FJLs{_)_u`YjJo8=s1b|}Z5h$7yX^(G zM=6kx)J%)DKDxCCWBhyR6Nw#JHsQg3yKApqwyoJ6{`y2kj2!&NdLP()KmBu`$A#ux z!QCTLi0!bMSxZ+Y0$5!>gQ^|EG!jC3Y6Ov_VjsH4w9i{`wEs4cyeGZKGup-2bjn$2 zAV|yRRD}Z3C%2j*4`S>jzq#(CD=;;sF+m;R_XJ5# zd^3;wm#`AGDLIXg82Hf3O@rE9+)QNdqFAhUokR*Xpq?zFvF&5xDlWjO!}ZV;#%kEt z>P;WQr2whu#mcM@$-O*h4_9g?v5NIbf1rY3=w|$tt~53!)K<0xLsnhpvZl$9q#MsP zN>}cr+ZMy*#}MfwBNf4B*>J_yMNnyp7vao)TBzsFH}FfqJ+@IxY4YM=g`d7TT`^_aT=8H}`JO5|_34Z{dq>yaDgIrB zG(cAdek8`1LRHF_235YSWZ}TIId7`&T&nqWF7&p`}9D_vEXQq9+aMzXefR@u2$Vwp6T!uC3$^b4+M zc>|UXpK5yT3_7I*Tg3TZ+!`u|rP}s-bPD)o*{St%-v*ZWpe*%hQBj6tv~iEAF5~%Ryyio;a1)-M0P*BA_X*1R zb&K;=fXrK%5zH54X;$p%8Ta+Jyh0+Biy<(mnF)8`t$&-<>{)s~FIGp~p`$W){g+LG zBQ!HoHo5&iCwPUUb}2LDm?4*d50{FMGbz!ei}D;vuic_Qwp%c!}qM zz$-Sa9aJ)3FL^3+-c6ct^YM_?rNTPjA;L{vh_nTj&^QK61D!mtEun1)eg){NXDCmx zz#>dmuQ>!aPPQrFnp=BNK!>0y_J)2mG80V*lrXexnwy=2ttl(RRAj(9{VqoZTHHg( zhQk_w;}~9rJ^*eW-K%7<9`5N%fuRLfdREV|y8L>HC8L-`R^4O#lDknawnO~Fswl{{ z7zYmV%wf~>z`o^T>m{M#ssirxT z`)8PH*Vcb*%UPuKC5C@l{)DGlyN=piP_1`&DUV!~n+@W!gyC0G>O`{!|DS>}K>tZ^ zryB`~Bnh!(AC#Hau^15Kylbc(A50)I-K;pL=)1DyF$h4eaBO^O@OZ`0g2H+>WTIi~ zFXMV<;6fc^q9qaw+f8ae)tmz8!0KZ_S7+}~F@z^ejUuPPQ)=Ak?nfQ023YZ3_c2LC zZ`>Sl8c^~b`#lnwk8V>kX8DB|!X}HBd7c%j43fi4T=98*FthLO`Cg>;J|V44J7=x4wD*{0+U@>o+WP&9L+-ZB2q`rg zF%>v0W=n)>$KgXh7mMlEc9`B2--8r34Bgq&CmAbYS zOM~|jl!WWczI&>dek)KnL4|5*EeBueqgjf^6giT}pJjguNBq4vzf*{gs&V*6c4CKK z_!eCtK+-%+76fXDNFSE1h&6Oo7{%73= zQI={9`X!_e9Dk=28^=*%VpH5F+QNfyZu>A#Dw$ilmFNb{_y^ftxe|e^!^=6`pJu?Q#PBk0UNyz!?3BGAMHB>UP_)o z+wN;lobmrtd(PpwQ8%bhy&eTxWYJ|mA1(j5@pg9fRNDQQYq6OPApgGQ*v$K~c}CLS zL0zozc&{rJe=vSbSrL`rG{tn?Pg~28bpCwY1omLWQFF7FPgsbqwz*&xlXDZVJ2H-9 z3PN`hUo%|CJB)@Qb>8U!KPMA){5UB^Fj zwNnq0sqGWDv8k|iZA|%)U=r&jHt0y><^4X#9q%$ICIW9!0vyRO6%)E=6duqA@ZbNa z&S@Lr()=qnr(@&FZF96<+RC-?I^|>(Qv!mi%j>3vNJ7lGN5l5zj(drxnI_MSiP&34_hvROA|U1&HYt z70rO!l;+^mP`i@Vq#afw*gC1};lR}j`2qQ}d+0_WoTj-Su{QT+=Gg4T*_K3a!~t1f zERKh!M<{>wxw2@Gl9!+JOvgN?7KwDJigTKoAOS1MDOG;mjGbUR%iC&ChxzQ1GNvu> zO@s{}%`*ok<|p|~+eSWaX_Q-OwpY?C69ItD1}H|?X*9MX!0+QoLr`+YKY4t&=FUO6 zOrn7bhOHZYZF>1L{r7(gL>>|zGcY4ripU~jI(BsaW5$$aq)epv`}^_j)E^-Xxsyi*w%y^s0hY?>mL;%1^>r3#I~I9yHid7_pHj*Zjmc5`U zP9qJ47{#Jvg>z10_sWv(^z&}`#ZY8kfVkxhS6mUet*xOSvMuf38ab-*k7iq+*wCg0vhEgMaw(EZ(g?%OwJs@>?3iRtemdVK4t zHrel8mJUOFU(S8}FkF#nAQxQie??r+tK4$kmxIs^Cb*k+TfJkyc`Q?Vul@9g&4bOk z(V1+je0GKSH?^p@4LD?m^FvKl2ZooCdT+M&V6@Jwd2=n>W)z>)m~gg8_Vy*Fzcz#- zKC1j5+mnR%_OAlX<{oLt^L`the)P(-fssFv)=dlhFn{~y^nt9lQZ!jc@Zo};1gR9~ zEkwZV;qUoY5c@g7v@)WemvlL~+mF_Gx~(ZxYFjX}^V@fBX3BMJhmd(thIpuw3IFxA zg_v2eSld(UB^$+(ON@+j>R;{4ymD_##o1t3Hpk7*&aJO`Xy|62o?jwQI5eswbfiqhT)I^ND&|E_c-|Bot&Kahtg<)J&oS*%JyKwW%TctRhW)s;xrq9= z<@F+C)wqtcaS{DxtX`$cf;;n$DYd!1l~AYwmn`FlhJ~*Zf6Fqr6_OLnVKcz~PTMPR z1v=Re2HD=Mkn8rvV!4 zU{(2%uBAN3|M16W5VB^jum&9NoGUESBHDQ8k4P?`6$;M_^Ib}g!<#3$Yi>ihV=gaN zE~ywF>S{-4t|sH+pKMGJX0e$V{e!gnnng97Dwl#s1O$hwQbf) zZ)_y>_=?Y$wE_u$QL>k1a#H1NkEP^63Z5N<0haSgSDlecO_I)HT`WaS3ISWTm>v}# zKB>t0GP&b5Aae@mHcKDSz6O+(xpF2GZ%V^$nl7H{{w_CnvfXO?y#2lTj2evvG0p(V zpuL2%g?9W=PGrBw(R8V`{geGu^kaw4&kZ)vC*|2ov@f@|FN-+>YwQczU zke&Zy%i2Tj=pemGP3;vz=MJP9$FP`T)EJ+DW>sMVX11hXlw9aYW2)(!fSA5Fec~m% z)TO&0O9GidXSO^|_x04cWGg3l)j{V^#lNTZgBI7t$g*bg66c$98ppk=+rN0DZ#!}x zD+GRc8mswA-Eh|>TLoh5u1`C*`o-9TRmGkh`Wl{1H#l*HJ}5?4%hrr)7L6(tQ)jsvlM%>U8nyHe# z3@0%TK$bOqX>0_E)2#$>`Bt?a&P-WF8-I!r`nNBmrBX~&UcIeDFtgliiDmg*#f@e3 zeD!vn19jSx@jInpxaMXd@wak{O$g_@4Vd7paeg{Viknwuu2e3;u66Q)4f{{Q=;vB> z+;0kvay<2ml{;<;z=L&qa_@SV!k;8=?7d4e>YR)H{IFEFfoeEV*(w!+{%xu?a8b6v z(krtlbv^Ycd$hVsw(UAQ@_EO@*QKWJwW7kXLW+RkePSHF(yCwv#qjK!x{zHh4vRaF$=ET zoU=0J!P=c`&7ZN?GodQFK}KJ{{v5XK8Y2EZ;WVVe{^Um+p{6>jJ@|U<@jvxb`n~giA(HdQ-iCROC@}^TW*Fd)}i# zs}3UDBdhi&rWZdP-~5lQd;j{QoWkIB)?rKJwd{oPg}_(8YG+)2_2YelcA9_v=Je*r z()sATf!&cHnIYK72@c&1$!du1dE*TIsnhep&FQXjY(D zV_eupW5nrl1lr0vsaKZBBMVV6%gf!cJ(uFDXRxW3@LkR4$8E@-v=6=MXUy9JE%z9$ za#tm$zeF=G|4C@lf$X*LSr6*8d-_a|RKoLnG7qx3is0t1}%W1UoFD zuPC~1WPHJ|4-a@wyLHB^Wv22}&txmIJMf@0g9+snULn^uV=GeF=;;ZuQc1e;`oB5f zr~dMsNvrfr9uHd4d(vvWg8n=g^vyfQZH|=IEgGy94c^UA>2h?K`RoYMY!y^r_uK86 zXbUQdjg1SBces8{s9j80BGYBDy1G4XR9~-yq}RSW`puE1l&J_GsCE6!!22XWK4(e1 zUrM5)$vJ_(ZskK-Zl2i;?VpOFi@j&_a>U6WA3YeVgv}lg z1?4Xbpmv~Y)%BknDf|C0b8`6Fz^7xY*>I($RsWx7y8pD0t5S^bBX32K{p?C`O7U@s zWEB&Fc`yxR^a2%a00}xP42DUm5~2Ha3b2HqJW!eW$h9Li#`H@Zs#0mrHGQ|wPQdxT zObFrWrS+!kL1c?rhcacHP5LFDS;ILW+OCE_K(Hg^C+uZOciQ1W<%~@4hgG^sbs)_| z9VjI$?hV)N0;rgyL;FYHyq3K!JW#uyW&i94D!PomyQD`=%E)ls{)Y|9`0!ZEjiYUt`FO*$Q+l4EeKZ z#pY5b**WR< z_wpJ^!mbpj#l{+>v#w-*=v5rJfyWvt8XpLAJHp{X!ou*NyVPGBQA_E-sQ8++w5Ws} z=YL=2To-Q%O#|L>>bOu>eh)|C=~zqo6hC~zx}z?FGBVUoeYH=B@`p-@D*;xlY?`%y zyxWuN6=&|@Xk%Ya6U}s3l-YXuHR(QXRH4SIk-&$MP$}^@`j&<2i?IkNEp^0<|$iv0x&`g;uAYGwq0% z#iF8tA|m6_4@T;wAvGHfvV+S%f<&8c?yu?GCp6!2872iQ24tX&wjhd#W`ZL1QlD9BS9(O1)kP7XRvIp+b6u_|S=zi-%Nxn(9L*zC z?22*eh{{-pD;E^w;#BzSxa)F1xMcC~Z|qm-zyb=@2-z!&|8CxXQQ_^sQ)HnUdJQLvAw6v=f-!e6<;XBTKL1#Y+V39ZOlpDw<@O1MsPP8HndKJz|BS4Izmk zR$_YsQP((Bqo+I$_x$Arlk{gkGV;g6)AB<;DD>Q^!XX8HVs6bRxro)_7ncA-NPq=u zNw5345`2jr4@FK$Z#BeyzP~4JSK0Y_Qzny3sUjPgW1{Q8FD`z$G-mZ(je?1Ep3pp! zsfw5N1=~gco~tZ!WjgaP=xF=ljda0pD-e8}FG z;j6BWOMLw$PD)u8E}LoyaT5l{zyc3>E4T8zY+L^RHlWzlWQ|_A(pKL7BMb15>8`3| zmrF}jH!i*WQL%J-&q(hD-+9XTCslD}{&)y_0|v>DmblwsGa4=#Et`VE&zk!>>z6%j zlvZBd$uTV>(heK{nVan<@?G%!)Yj)@{X67j&tBqkcc5`um$)Ytpcz=_l8BU?5x?3R;kt!9(@vB0>~p zp|R}YfgoG-{$BSa!pi2?VV9lhx$3BbK&dV}r1%l{e{5!_4Eu4-s~BT=6TfR&XKvj? z@%QWvy$OJFMS!JSBTmM+A0=4{900@_mC)%xM}XW%tkXuoLW4RpQ?$BfNcTAoL>G&LtFbq5QCgFXK>Tt%E$fZs%JxdE>6g+dN-CG1G=`>GuJ9 ztnpz({&|XIw}Dhmw|I~ZPRh3g(w7G*wOA=7bZEw|nU~qSvQmk*(>GS&n*pL2GoeK+*V#qW{)P5B=MKqN7(^F2Cy?hzund2!t6q%fy(L^k`B!T+3m) z;3mkH!N(zE*@}no_U(kn4gTsmiQxA80& z`x{Dl%eqya*95o~U^_xr;x_MhM2zbhsgDLcqfx5SmB&QKuE=enQgNd)6FI=B`8*X8LdDx;(zp?vW7@tVmp+l{=H(S@6hZKdoLY(P9B0 zM{D%SG0QVkUlM<7V3AUA`kJRkODsh(#^JC~6DxI{xPL(;v!j-LZ;bsoUNl4Qb6Iqf zXOIsPd0ZCy?1%ZYy7(hjH)?gs7s5f@l#2h`sk7HF`d8*9RqHg5iWbRYsM%kh8a?E7 zp$Ab@lh`5=e_e{t7SnVH0YYIL1D5M7h;&{|#)l7$#V^x7q{Ff4ZcY!_e4PKEJ^C42 z@_+df@~%^@^E|ziuS&iVlgWw3HFiMCI|;>h$w-eZ-$9Cf=u5*C!--ko3V}e&rPyTv z3N(X}_CgxR575u~DIh9%v`kJYQ&J{u{Q;|?CoxxxB}>{VNx~6)B@F$l2y_-?<%Pai%<=C1(wEm`#C!);1{f`YC$g7vX>B+b!U_Z{Vfl80n6_Qh zCfaW$`vA#c9Xx!8SgYdKR87W6y&NB8;{6X-En3B;8dfCN}DFO{_j9{cS~dxCaJO)DY9uynMW&O;uNE5~gljyqNsqR8d<%{{6$y zM^Ff#!J`s`(vnykmZNKR6~Ut1ZRz}giO$MA(ihbr6kJJ=X*>=U_3&)tiu;;r?7Ob~ z$k|66aYaK!iEP- zV^X3P<5rrY)$+nj4-P4hmowP)@uV#`kGPYW8|>KuB>5eA`#|pu4ze_SNyf` zZ!ls#i>j5{<+a+u)x+_Dc-2UnSh4pDfbomXu3!D6u}P{jHIaHr>ddG#K)OD&m7J5b z=-$MXX}sJmw0I@@yk5fA-IsBd%ArXi5sVsz#Up*5g`7{18+r{-eA=eY>&U>3)IA*^ zvC_3p$rD?|I^jqRjO+8C*;^G2Gr3}?jF3M(nruR|mCN|zWTLy2{4YtM<4}QCi09yP z{VuzuwwH}_EOXto2ZU56Q!ZFQhFl`!ERM?_X}R5h^*CDZTEOunRC{b{@4*s6PH%|< zfDjtxdw13(&}+qZdid>BzbT~%o9v_!NRUI6GxfOsxPj5c% z4EpKVe0?<2Da)d2)`DIJVuez?Cej%$8LZenlhtk8WUA{-4*UT76Xv=Ukv*<3BrkOR zT)$~kv8!)4ZG5F+5fd~G4eH)e6wwb)4e{-#p6L!*3ztSb7jAifMG*PO@zKb`S~kxk6t>7~98@m;VA^!2G=S&WN%gYCm`Jh7T$gm5TJkgiCsG8$51O4e~@+YWfu8;{7@(2#`(AP7!X zn$#ao(L3eyV<{@QfUD5zHsqpYgh_}8*`%s<9TX2y*|TQJYu&cIBHwa_qsjNvcV5mz z`kOJeM%yTp(teS)*+H+CvugWB*4d~yv6$e{)V*kiIJXzQtQTw(jT0+CLU^6}lb2ju za=I|%L17oiJY>u5#8o@;;5Sg^s{Q(E=2C<(p#~Ho&o_P$2Exdoq)>x{+Gypf$e?92=~!oGo~bnXTV7VF({lDXQZeTjlR^fd5=12%S^t zx;pY9PE=Ja7q6u+@UcS{0Fwm(1f~L|CvJBi4>wY5L)~G2POL-lkQymNV11=ls!(yA zKoiI>{W$kEVEgm+M z;N4{c)sbkSr;a9WyOd^qr<^#JltRV8mQTl<-|zZcDQ11W|2BZ!o2i|xHDFN?y1izJ z2y!j}3yO(}7mDXTF3Rcj<3Q=PwRz)umoxZcFDGu$D4A>AsqHDc{Ka8NLkV3uOc+mG z6|gE7r%2$etu#DFjmyVs*{&%2*`=pH(Y|>zr!7aJd#cko$yV3Z7yI#LaVqwrd3zLO$ zyo)7#Z$_`DwzK@YY{y_ldgfc+J1?RNq>1%c0DPgn$xc1SPtN2XnuSV?O25pL$m@6q z9Mnalhu4IdeAXlW zRDG?MJko`2_XXa!jglI6!skie3VVbL4M@Gj@;i6)MSRK$on@K05sPlI=_t$4_BQgN z(wVDX;mos7BGnQzMF`9pz=vB!&b^9N>fPE3~$LU(#7W%Hh!w>t1b7h0ILL zs6+H$D-OXm@yk|_@d`I>+R$t5-&AE)a%M@%FmhU`(k1QUJgH0705Aejy75?(4uX|e zDJ2?cB7>q!3UDXy%$eQd89r`NC35KI5cAW6Q{5D%%@;Sb`P^=5r?etJ zLs^e1Q+p(i?zS~b^(sd~1eDwnW!W;2vo;{!9+v8IC)Vzf*uHKOcmXhZFAmWr>4Z`si9ZQM0{;9W#U6j)q}F;$hzPnUxP1W67nxgfs42!w@-z$2$kkxQk8Uv%HCO! z*c|KUOz7l!VgLS!0IOjAjN_c+3^Z@8Sbp^w>{?u*rDJ;mVG`ocb1js!lQ7W^MBd*h zx?DJ~)!jhQy|G_(opipf&UPwUg+6*^j8OV5T{KHhEN)~B2TKukj9pJL%%&jn?>{kA zcfAzminjf_^czb9oS!+2bAJ=0Co5y^W0hd+_AKG*PDSO}{kwE%NayePDC_X3s1p%} zZQ3AN^U1%A6aM1z>lbR`Rnw4L<$#uB;N1D$MQvvS_5Wy1RG9F9)&hw7TA57f2*aM<;f7Ix`mj{(T2_h@W#9BSSg! zdW!CjTPT*L#5i?js;!KKh4y4rqF7ZH2IopET5m}-MsEpaN>4|2l(-fT6!2M~NlWn$ zmL}zp?rCY0H;7xD1sPGD;CTnH9O(w<5JFPbfQ^*gI|~t^;;FQ>89O=lr38@e$Ao1p zbZaYwFW5%p!dHtyf)>tky1Deb;=jyFc8|4x?)5rK3Z3_umC zj&rPN-+XxWei=-yLoBTLZkyNhRb>2a!tdLe(r$kC|2%zaqTy0<_5R%5yuF^37BQn@ zG`SkA9$~_^*2^_lr36d2X98nhY^nv_!k!jKl5Q4eo0&|dC0xxY(~iH{a_&u!hoEl` zBLjM4Gx5O_dC$LI+mpRk4eFC!_Ld4+E%my~GQ$NtZZuJp;mS?PrCPs%GNDJl%lv!n zI-g+aydH`Gy`s1hdVdJs&CspICTJ1-#UDO9*Hg9P1oQSCnVT$_8Qq00RRbHJdad9x zCe)=a0i>j)_j`0HP7q|b6~<1~SJ#gQ7mWE=6>gzQ{M6PVkOrjw>vb*jv)=~C@gs?k zW#`VwnUNdaxfNPv+7iFLbUb&Sv75Hsi>=ks0Lz>{{i_#rNAN+j=}M-0d~)}RKci>$ ziAPNh3th%hClvgYqg!R(ddha2ByRoc7b8~hj`W;_R(K=6eU-_#s+>ygR(v&w5)&65 zK5*>&VF*~Wt#x^)8n6!l*hrSFl;l!N3zkbsl=0k>k^)+TF2Lf56%;KIN^3mcI5SB2 z-&u@a^+@qA;~`$Np&euWip<2k#SFg>hgj(uo!2~{;$q^IV7l(oql`cN`C-R@p6NO12IA-X<742(+?6mBz>s6_yBJmW*qe!YkN0TVAo1b-;8jBg~iy zt+@Do9>Ty*ZIBEwQ#ShdN*~I&-@~ldt9W0cOYi-Knf->wMm+6wye6`L6{jg9G)1=m zYfve(%X2{*6%&$&yf2vtpTDr@T75LcN-UG!jN8ojY)Fl9yiu!pgC3vfm#-stDM>;z zVP4?M-GH?^Eq#SP5xFQp4(N6=Y&gweZap#Bv6RC=iO2ivH<(qpu8(W=5*PQ93PQ!9 z{Qv``DOL$Sl}fJ_77`Z+P*Wy3Buiry1~cd205T-m+hcQX`scK5t?Dyc(TGXFZ~4Xm zNW_O!mjlbTfiug5!O2_M>87^=KCC`N==|}phbyGrP5PqUuK`StQ;m*%c{);GK?5Pe z?~o$HC(m6eM#82)0`t*+NNTiz%9ccL)IP4X9g%Q^2>*n}$lmv{hsyp1_S4rCJjP>$ zF3&1!S)RC8RaR(Q)vQQ-5og>}On8QtzNC%i-xrE$O)F(Qx2aiKlrZ)ZtcR!vJTEr( zTIy)L8%O>^B(G|NPyy|XuqTI%T-s0{bR6V9zC@A^#EHl~fUOtXC z8fU_{maaZSU42_aCVQWVw7SYJ@3XIo-S zD1^{%knrl{L)rZU@c6Ibn7@BQ-mUhBuX9&T2gIhpy>sM&=@(cGKEpHLyS7U9jBJfaHhrYlTwyA#nkD2} zJ|}w9Id=6oM`(fC8bLZGfuuKDtXBpukc)!FrFWj$OLT+re1E4KLlAbLmZaSHqxDjFMw9qR!I>LYfXya594vfh)%buBfXr&}nw)LK-hr2XCmTfKQI?M)M0j@7(l8HY3*?>~sjfpL zYG7ahZaf&@SupJgEs!m~6XB2d_*F|Xl0LFt9p7`SQguSUK!l34bCBfUK3=G;Qm%IY_CUJipA-HlcGCpvfjNgR5Iwb0PiR>M^jgmsD6rS zNr6=(EmFC2@!cuHl^70=+Y#-(Xu}w;5G50=a|NulUZJfnFEaH;;;Oys>fD}CZuMKs*leTG z6K1jvg!(7~DPFO6TlP}Cax^rQGa{=e@80Kq9rT~aI?&jXO&<4*nY8>p^Orw9;QBw0 z%7wf~onP(udsTH^C{yHp@2BQiu{C<2)l~)1sXmH6*zxVT_?lN>dar|a1Qp8T82pz5 zIWR=?HwQI!7)RFD6D8s2?kZsTUS zVnAjB0FI6;d~=2OxKX6}T7_v^S>MJN`E9Y*NK^`eMt6fx%4t2o8Y^{sS#WZyR#M81 ziz@0ysWV}w$Z;eo^53%V(O|hhEn-x0!#w{qe#ps`sYATjtC!?pv)AOZ@m^W2;t<)pyHYUxD!TJxu0F33EYYt!915*{gQ} zoe{3w`U~$=JJYIMSBnBqa`7+Y;A%3(kU~)$qTTO|XzDI>aPMwjzaof*MDhpcN`t3z z1Ng_b%1YXo()Hqncy$9ReIiD?lyqiknfMzPvs-A(Z}Kv4uNX?_@~DMIn<}ImB!_bn z6o@0%)#feowGUh5M&)I;aJ54Q^`@z`>>can77%Y{o zXklx0c?^uK&1$Q-+~xZ^`^R?C4Bn&l(K!u#`RyLhXYJaDR`ino%(rgoDP(;G{I@l{ zEUtJtbhmGLo0KaaS%}^^sOE|sy}IB`J)6-YuaAl~u72?_A?^9KwD6)%^n0 zK8nyM_oU_Q>;fM#skhLe-o3`QZ|S{0Wg;J>uuV-)P%~jc3lMW*h&VcN?;)L2cCXi3 zt84OZ-AIn&V@z_9Bh2cPkyUrcaBf$3dq<9*rV|+Z@(`mNqFiWf2{DH}*;>wBktnGw zlLV8#d6O!CXR9h?if;L2E>YNjN5#fi)XJhhv^kUcGWos4>Q=4O$ScKVRJ0$maMJAd z-93aF_=jLrNdFrx>K~I^!7;-05QC{$l8rOZh?#P(MP}Td-@+~1;hwVLh;G!YHm&S% zajgC|+ZM<`;PX8at}w3ef!lX~7$h>MU9(Zt#=TV48%B218!Nc&m=Pn?EMDf|ceU)_ zMsUS&4_WLlJ#uxSmEiN`4weLa5(UbL!87cM6JHnvf(n+H)J@R*C=c96t zOvoOTj>6A_+Nl`RM+)`cPMxkJbqknlxj5y7r!(w(w$-Oot`#5KLB-ca(^{v8)1a?i zc|r8Oc`Fhc8F;y)(|{&Mucewk43?=^+x&~+HKmylt9qG5%m{w=9g$XFC(yOo!-4Bg z^nAAvd_^4BbUQMdp=e##YV(jPk{DlWCLh`09Mxdbjpi`9$R4us?q%f7Pc zYE#i$WQ8zoA<*qujJ3t2w3dcdTu^}-WSbIokLMe_`OgwuK~uOwI^3lMT1cMQuE`7e zzSu7J zj!{U_3`JkmNPiC;%^V|l5({e=ax2G)igkeu%dfLD3r@?*-Fl{WSbpUp3C`qj{@1|t z%f&w-nyCtl^UpSBu%S%)-JQA?Ik;7Xp!_Iev?1YY-nmJ+eV}bgHTHX+SHM-MT`jHC z$W8s~)WpN7o#FU_Xewv?s~qEI#$4uiR2`qN&KPyd@{Aoh#=%rw4EY!~xuTY-hD3;9iyCbryJ?f8d{=YM*C zN27kKO+Pk%N}bI8J}U>mS{-IBj zPrF71r~D6DP`mjt9aXaH^k8YoN4>4ImhED!+{v*%TT`3<@L)&N8;eD}MYjbLBs_*8~5`ZJM7Y!F26(9Gc%b-i!YuEINVr)U5DPH)eH*%^?yx z5?6YWB=`L^cShW5Ixyn;yLH(nA0fFM<`p=I_gHB4_XyBnr>c4eD2)~!@QX_)}|&rk&KGJTX);f z$BQjJxT<)uV|o*1$06RI)m3jQd6^skpq)n}F=%r;223`L(e#;WPN@O7*Difw&fBH) z1*+yg5glP7gmVFx%YGXY0l_O}!W#EDVOF_3aGv|in=Tm-N{Vt+bjN$8=|-j}+X@?6 zXdNNk(zee*B9-r#-AMdt8#VyE>hJmJ`!m{a2dENNLHjs&D_fsCt8E|v(eVV@PrA*N zG=x8qU;$rm=E2u)A{ah&bL5%@Q(_q!o1?6De+tU!AHNw{{m@vF*8ytDvHZ%rw_vL@ zMzQVwpxtFxmC+00ydPoSH%wPOre(Itze@BW0G`MG5_=_nH8SalP&G8qHN>jo$JZ~GyhSpCIP=T10+?PiKtXr_>LeuMXE zr7!Pa^`SiZ_Mz%LX;kpNY$nD1gj>Jk8^*CuRw72NvvaSr!a-1o!DDP)>6Trris;Ql za=HB<_TB@k>8#xwWyTpD3o4?3(i8=xO9xRHl_H@@Nq|5=dI<^AJItu`CcVQ5gcbr4 zNFt%BbV899AR!KszMc7K~t4+9)c(0k*a#G*Io(W90H{U6eA6tsbpoz z&*+p(R@V!Z3ToIs!ngG%k;5o*1_t4GOvJcf(@Qbd9^!3r>FoaA>N;U`8m=( zUBa?G7j%0tL#D_moiQEzM5-4~xxS=+y|hAV2}{q-%|xMx`?cB)r6u@CuojeygF9Y$ zxwyTt{0J;T>A!hU$S8hoZx*YnU@Set@z~|&MGq}IkvS>^q!OKADJ^O4+9Cr-oTMQrPV(g!YjR!=k zLsQZl@Hy!t#)(x)>$Z5XZVVQhxXNKm=>0@x3Niy@*iWU$9B_<)jHstBzVA%>?g zV992Sw^~z^VdNcUWjK)THII#F;d!|K(AF-$1W&}gg&gF9eeL{LY*VsxP=#Iw?q|;J z4o#-H?RB`D0e=yY{U=)e&CAK7r=l(xmX@G6^C{ zy&b(PrMToGN_!^5`$2N(ue-7jC3P;~t_dmE1?;?uwls`TppMu1zQkiy(o)LPt|bc# zSBlPB+i1v^Yp#!h+KgAs41;S%5}utf;B>G-tMc0*r47gSfFFn~nUe?M5ZDOa(vR6w zY!Yl+W!JtNVS@Q+o)GC%lYqtd0{`5@D)hqhcCdQnUK# z1rg<=nAaqexFj=}3x0piZFR7~)-bNvN?R1%(Y>4IYm;O$VJO*D$;jR@CZ7n2I+8XU zj&@Rpr)3HsYH4u0Igi!KdmB7j-UXne>x^^Vl@8nw=#?^Oa%`;VM9`%vU$tWA>kg!w z8ZOF<4z)>vW+plSpo>;2#YnF)zLg8ZYvEt25?)3nMx7bxd-c}8E4+6Tuw$%YTB+9z zLphk~KhXKy59%?IvtIiFBIWtI3nKk0D^k{V~8JABY>0jc#{an5ZEEJ*oD>J{<=GMb++UA+zakXU$edjc6b?5{ltYXcOOf~+WItD zx?LswHtFhbD6kZ{5aq?&GCM^gJej`AEOs{!F=1<&bFW6=e)01i(VNd7ct> zgwUSrPcSL+p7?GS)IxE<)}dtAvl7pYPEj?RMJM)`O2j>lOS9&WJ1dMdPP1$pwRHR)|K_4H)m<|J%VA*{%HD63>*w#&Stl_=w za33YlQTh_(Z%jN^Z?5BUGE>~XxA@B5|B>(^-1b1?!*(QBjlS>t60vBYB)5HjGOX2U z8Y*WO;RE~J|Gn>opuCiF2Go1Cz7ioHoVc zwO7uE#kRiuw$&n^pwg*H3v$4!MdEYbM5Ve!PYV}&-0b;TglDkh-G-Jxz$Q$9)6J_*@1Q7t+jEfm zdBPC)y;zJVmtuL|g1mQhUz+=Tdhkt@GSbDcez3TB+{ROQ&<3L^Y%H1e%yDUaNVy>)Rq5~EO>lO!5gC--Ve=aq%y$V_H0 zS>gL`xhAqVSz&aMF{s@ANGvjv7`G>a9p{!5u47kl=oYV^L!c8~!k$+P@RDtcr$%f> z1hHfVe#)BzVQlhZf2c7o-y+ninAmD;tX2^oeW4H1T{5~d! z>_0ZH4vmbdt~}@(oBTK+qqrhYFdt5LMn@q!HTWW}Z(eNbQ%F?U( z3Lly?Hc6b1^174V>{4C(<|<^WRNK|;vIM}2)r}|q`E$8e>oIBLC7zXcPp+GZ+^VtR z$d6Dj_t@sQ5%82I0^{D>n0Cb_ys6T_Jgi&pZ!LDjSy@imswlFxwg4WyT65uP!_RAa zwRd1gqcZN?N2gOg1RabDSt!|EBhh?eW4&(*OrlHlqjn@UF?%9$CDyjK0N0YNEz7>J z)OlF8DVxiie7WzJ3b$Yy2jgor%;suqG;SZW^SMr02*fU^4OCpR7*OWO0CGcw z_ujgJ<$yvrg4Du!T`>^}%UWNyxm+13DciCiA)Vf#gpEs!4z_G>iMsrWc4emZ1YYs^ z+8*A3*J2_(`?xlMdElio1wRM%9}WF@y0=$2L{W>N{n-$U5)aQtubX#r7M;$?1)T>I zZ!Xhs1=W%t(+5pJC@YRGwa3Q6j+kU2Fs4py5lbrETXX>H2&3s*mZD(^!dNLIpbm%hv{2MOHQ**%dU1v%lW~5IV_CA zkh{Y-nLP;o8F8_2Td^;{L+^r|;h7L0!Axmm)4qZJ`070VMAe-tw}7tVAXzeL#F0$) z#L%37b}`{GinUb1ly=tXb;el(B$_nJW+7dIboyCa5R2bP>b+ix7~~^S!qr$j`)luH zn~!$yaitQ=*Caz*=#$F!<2ZU$XW59 zUXFb4Yz4Ql5;CYJEj$DM=nw#=klduG)AdO;@l`0sk7ug#bemhCW+)j9w4$sLZ6|aG z*Xsu&mMT{*r==&jsm?_AHj@IM;c$OY49w$2KMxdaMUV53-z0?c*66sXorlu&(i1Ba8a_Fi2$UjLSU-D~uOSw26)ULZCteTY@s(}*=0)>!)ZyMS zpNit1`867>^EUI`qmj&~ljv%*4$DUHjP9#<-S5}$x5P_`WD$KM#2!uf2at5KMta*e z9C7dtf=~0FUJVXcH7d>>*0dHCsOky6!W|lx*iI=pVYvG)Cf2cQdTPLD*P zn|V2fGq+4s@4yj{K{#|n2ua%2*-2DXnydmO3iEE6_2 z7^-gZ?katwrpb*}nPTlqv0ckcTr#dHDATKEWz6J3h*lUFsvh*wZ4y*Up$Cxy=)=5! z6IWzQ1xk%4*kB0HR%K|Tj-@3OCg%D(B&GB~eKB@+R(2lbA_7RyVO(s84B@rOmF-?m zHHvkRibZU|e!NjyVRYCSUVrbyqd5Gv>j_P({&~U{5sl;iO%X->*ZLHgBopBiCwqA5Mj|=G4c5EIpaT2zf%xyBZ zu2mLtz)3VYQ!Wt6;>_YQk9PWrx&mFH8W2>P=Y{EHaQ=4Y;5H3%=laKe|-Hhu4Zkgtw&^yAH;n0mVCz z(h}5;0B92wPERialL>lHEyjxmb|$S2qp!#fqcjUlnm-I_19wnM!}H-R(hio0S8d3v zHCe(FAPM^>bbg0=LugJMq-b|uy6buBFh<%QS8sTZGf|=DnP$~+XQer_F!X#U-{X9y zmbGJXFJRjA57``ve6mQAh5qvD$0irA2Xkr~x0jjlEDCXvPQg*veC~eVq4hNt_O%?spZeOGs#jLf}TZhO-_1*1E1HQ zTUyFZMkd%wS_xBua9foZyA@G1t)3+C;CTt+lp#a_!YDL0{B_$H394bOKu5D9zh0I3 zs2VOn?*E}1Y68;1)L;vbqEHx=SfSVoC<&!h^UOvrTmO89)vIc_%<}A4`7=M5VR!#|48A6DHhNFoc zk{yE*YqrbRClXTAJQN|?;7_+d!s@%37vj`9ZptsojRHP$< z;^maW(@qZ9CT10X6MEpKTr}7W_4RmCJz)=w9^98giK6E9md*1VL47&1 z@&YRdl`3qQ5n0aSkG2cb)^c8h`b#MY`*fDP8wM6x@)&IrsXwE-Zw>;ht;38~p=y)Y zhi1u1kFe^pL^{4j3H1nT;xT|Hxe9q~gHrUW3ZXX1h3#P9{r;WBcF4Fk{E?$oh@FSQ zP>uWY1l5q84jr+w>h7&c2Zu0>UR^jOEmV5$W_3vsMFA+trG>pfpQz!jVx#ez*L+0n~> zE2m4WectccU7gi?wkUp+WfXs4Q&xK}XxS ziwD~$&#A*X5}v`L)NHM4`_|c-zKAJ=H&^LqR(U{S@vnONP(qf`_l!Z)H?aGGGdM7& zmR>{K+Bf@4bZ_2n^2EXA(fz_aC#c+KDO<}Im|Krq(JaNoiKQG#Si?;9PQMK2r^(~( zD%Yx|S#XL#m}E>ox5O1ofi)z=k{Z z!43!G4V&`ta*>}xe4572qt-sQ8PAp)*C9jCOIA##+)mmlKscDl@As!8M70+@=ZRJI zi=s3dVgOrJp!ib3PjpnQG~FfkQ`57GS6gQnpOnn^hlW8koB(A*AhNKohA6f~Z(1Lb znN-OCl`74(uK&K;?WdYae~A+YVPz>V@;>pQ-6yBr-My$~VxB9JIFSPDZKUT~?LKW< zUR@raSiR}gXK`=bcoXUYtJy)J;3z*cuwLTy5uGJuXwEh8gyAbf$-kv`^1GYW(OGBb zg`BMfZrDDju%q^69s#gb^!gc;0KHsB?1}m45SIEhCE%7`(gm244Hl}YIMTKyVWMC0 zCGLDZ9J!g{mPxq*$%+`8_yI{TIVuSsadsxaFx2Vy12m4L`;Tf^eSm^l)n^3kfh&j; zhL81ScdvT}C!ypWG>Snf;~Ig%J`RAPi+1NL=;LxX+atM#ICr}JD|YHUKG zzqi+Ns-w{|3WBUo2l4QMENyuV1Lw1PAJppiEAbs24v%5Qk@p1ZK)XEdtV zQA%7)sIH-ke+(5%DhXc)HTyJ+f)0u|eFmXk%k{CsmuvKP_Ni=!E5f>zPWurJF;L3= zH%%O)kq7-KED>AjG71tfIB+C3-(R46d$W2R6ARhMPpcbP4#pK!+(+LFpe4eF3k~SS z))p_hMSi@M%c_S#=+?b;70mNca&z_Kr-K=8UeIUvxW7&qH75h>25DF8G#0x+F$QK- zAJ_>)4Gji9ChqrDA$G>w!N-dUL+;J#;zdSTeOqGUmbZ9#Crmu|R=fAIjsm#(-?VzL z#~&W1g(m~?7JPU8tMaRqTWA#a315F^Mm&$Db>&*2C&IKW5U}87LS2Yp?8BCrm1r%O z6!B1`7QGZ)BMRuIw%|~9okm%qn3%}eQc$sOciya&`L&NKck|hMCiX5DW~BMADf^_r zHe_n}+K6E|ZCugowM8q5l$vTA0h75sy!#VT%SGav4$7m__=db5@Jq^YFc5h`$j+Ut zQVpzjFZXbR&Si4aBv zZ%X{KZS{Cq*n=eKv}u~MA^yzGObuQJYGx-4Cb!S@06zVG=x~3@86KcBYl+fn#Ptu9 zf|V+YPZ-)DbO+&YY)t>CQP44<#EX^IxCM06LwLIaRBHy`f+hHo4asgfe9y2uR*1g@ z-m*f36a>!YB>B&snOrJk+={rU#>QCAP z3=_W6pdQ3ty9(C``BcnB2e;rf^+#ZWU$%%}DS2&5iMx$&&A6yDmOat$yuzh5)-}Ce z!q~_nYZ!!l?{{QUQS?HSY#|5ZFn4qy zbG~Nlt=gR~rn>itLif_0hMNaf2O*1T_+>b83C>+_uz=MDA@lpT3Tzeq;Iq_8L#ul> z`l$yic>D+&+U{ozMW@7Q&#J8)@BJ#c4e)-U73(pQJRMn1@}#gO--y%QfwdF5HXYu)ETZnN9)^x2y_I!<8?Hs{@0Nax9)F}h;p4sTZIudCX! zXds2VG*UEmF!*$xZkT;{F}O z?G6(d29b!MAK4gMV5mrt_b0_W3Ov3+FUWVkds~v+-~F{Ry(052L8NJlla5yf?zC># zbvHE~BaI@K?l8YI+j7d|*S1{IoBhcF>9LkozmpY{hc-p;3hVZH{Z_ypW>m`Y{hayc zb$~{Ov4cGF1~xG_T=V&37@)7V(VAXZC=?OW99*f(%;L!6#-HnRL-N%T$mDDPpkU_X zR~ww?dfBfWYbNS#IkE>7wfL1^Yzak>9jDwib(;&o=3_gaJP$I`I*%Naf1 zF07c3ud_<)8{3lIn`@F%f}5ufJdIkE9II#w&)aGY>N`-%4$6sfzIoMZEc$Vcg97ca z`=1y~@JIv;J`Reqa?KSMY#n66KlGPWyqTRguZZlgq9{H8(%N5DD-2UQbAzYWUlX7g zA^3bg6|fi#p-BqU#D!PrUtN;7zmt^ueP#SNUgwC76?MmBMA)rA$DRPy(6Lk2>_7{fvOW*z*&78jV|63Z^U>q4T zzU11uw;pYBf84@>WBjadO@u2E?STGNu%;|Ljm6YKkyjE-M}&%lq>t^*617u^`-hY0 zB(a#}xTh;io^@sm+f_C3WENusDBb0mncS;7nxmF72hj$&x~>O22r9Wmj7Q^nLu`A| z5zY5%+_U9%a19?3Y_joB>*}h?p|GCGoW7Q=X_SMt-@$RP0^B?U)Ert@ug({b9oOI} z!c^hn>6l}9>__Y}z%_8DL&#>coS!!^lwWM6-?Nv(&cw&Zn|sG@ZdF-L)7^b}@Ax@o zLcSwwlSmL3;ShSPFvEAplE=zlQ>|TcU3Dd$FZ3Pa2ErMTbkuc(fjY176WRg#DJgSD zmxtz#cf@-4r4dlA_uFCz_o{Kc(-1_dt{4%h-N3mTJ%W6oIYqK^o*T6qWougB1W+}g5yVAJ&UYr2uxKi4lQ#>y>w ztJ5hdQV1<)?B%|kx~rjpzsZj<@zC|!!b=g`VEGIg>(mJV%e1RLFI2X^>Po%mhhQnYc0`IcGeW>r ztbyp(`vTyR04!xwsOSf|@L_i2Zu@nw%RRs4isQ=kLWVlzgNiZIRTv5lgy1Y-M|>9$(-md6lq)mh(QY&kCX$M&`(<5r-`1ur4b8y9okZGY zS}YffZEHxF7jO=gZK>SUnXeW)mleJ9Y-Fdc1O<=kgwLUb+e|MO=PtdarzK@-E<%%= z3ue7DW|CXm--dz9Z9p0ll@;v>am|2j7j!lzHlfF@kho*r?+N0`_{ny$H18+-1<$&= zxG0AJeVFf%*;-ezE}1&2U<`yWD+rN2S_*qh%`BX0IBSqG$UFTyC|NE)Kk<4eJ!u*N zry@#0{uvDvJ!~J=)i56C+AlQT{b}L)@@EVS(_NY4%_ViD{mezv*=!WlCdqdpoG(&p zsr+l5;l;a_?g$4M3?=Xkz~Ql&HG0Be|EyzKN>@F-&2*N<;@0-aPa#`+Wch_{;yP$2 zx*QxXU%zReZm37%r{hQA>)@BhS+pTr!}EHjb+IPO#?}(Ji`_Kxm{kD}&y9yXJaU$P zj6ss;fZYx){sD>-RPq&_a$Xp|)Yt&UCr8eJ@~XGOP>eQ20{DPZpd-y}`gkO!kN3^& zH6M6eM}AF=1eYjbATLz57*JC!C4!yRc2EJ9c)Ef};~txMOd-rev$k0d(DEwTDTQL3 z{W!A0*;1%Hv{)uyuas84jC!h7>gQmrDhTQ@R=EazeX$S>A{m=NEmPERF#&gTH)>B9 z?uYo7dKxo+#~5lAqgzw;E=vFQlg@lXQK12C@Z~%~dTMGVu)FxN);U>S{5BXd`jMgX zQn`qhW}Z;{45)%?Q1?8NqpTMbAw;iAMH+z6NJ_hhpACoS0@90@4kr9{ljD}Oh}s1% zx22}Yp){Mpen=W~>(%wt^^F_)z*k>u^&#Ecjh%p}J7a#f@UEqLOAMaT_t;;J)5wd8 zRZM#WFt+5yC%KnW9p%%m7>rA6ZCMS)N-HBeX&qz}%KOG_jHbukZt8>Z6J zk%g>e0t~2a$e;aW5<{h;w(@M}DJDW)2)h-oBBkQ!ZWsUgoLfC>#s)USXphDkUdZis zKJ{UoY%MVNajuRTS)(Xx8`-6IAdduMYm;V$!2VmN-&_`CP&+b5eYiqsAnBm20f!=P zCl!iNaJ`5@1k|f{dYYbzm)rm_U$B;w@%nPYU^RIZ_pZsDDcJ>>iNxx|(eCOU;7L(V zI+wkO@k2dKiQb$mlyMxh1@9ilod%cMr9tb|m=y;~|4N=r{Rbgy#n z!XSPkeks+sC)s(oM9QD-HSM<@qe0I%cI#NjuFMfe1)a7iBMqrKNuJD3IJKjdpw^5Z zB|~!ww_;TKAs4Si!v;H*N9qD@GF<++UTI8;(-z0={3thYx#x>}j2PBK2%{H9ursx0 zc420_caXG@2O{eFC**F1(4uHCK(oX0DcjHD`3+{{k{w6l;=CbLr-BnoD`#pEQ?phtYjFxPO zI#*A!E*TJ=GGx`E)TIixw;5(s4%F7&*?XnY>Ip^swcnb&^!rl}D!{^Rnnh;(#VjDF zru0dWaCJe@fQc{fyDpH%6pA@1NFK)7fwST}%ukH{7&BIq8!_Y8@jh*rg^sNT!9!;5`qfiId~AcC zry7+cx}#VKe2Y8^2fP+{(rsqDCqm5xpYnZZ6sOq6Gua{?Wf#}!6=<(7T&7)o=!M(5N z+NT-d=d}Naw$zpXh$pY8KKmcd;4Bbw%_Hz2FhPiQ0!PQq-Tl_Z@Lk`{PyfTFPe1;D zOatF(t^Jtyq5huKwhv-s8d$^G{aaR3$sVGJ2w++drx?x81+!Kt_a%h+C}+!{wnrmI zDKt(ar0iuTeJX0iVhO%>ZupoioadSRVC$GkVvF$T%B#i)E~Zyr;_QHeNo;L>5eVjZ zgt{}Ej_Y6rPu~74rzUGuz2gKrzmE~&+l^jP>tb_O`fXf<1p2k+nkwGz4F?U zqNHW>MZK$)T3oGoL{d3CsRM`KG(eOfJR(eB14~s$fX=ht!I1(u_lNX4K5_B!yYQ?o zysW0qGd1PqxztIzjqC2-seMGA^tCxy`w zQ|$zaWuo{h?YKS=UL&)9!Q2h{&dnnc129e#XUuJM?sg2US<{k_j zoVQMGRqzPtkk{jlX$~7MoisrOEEwily@Oqg#sFG6nJN-4g3UP;w>dvLPONZfoR96n zW%qqb>lJL8U{ALL*}k~yH9|JU^s-6}ykKV3cSqUdyF`qtiRg z#t_ykexGnr{M)JoLF{*y6edCe$Py%1;I*ddOzFj2Dw<`-WF74DPp7__srkZ%9M6d5 z?(p{d5yCJNBiz{KxqX3BY z2MVkKQ7E_J!-)wNP}As!iyh-g*HZXU-%kWmpJPSxS9lR0`J-drqlXtdZGJ4aVZ|~f{s1$~^&%eF*U|1=t2Wa>ngNPU=oI(s zpiE4$r2y(S(8ldzX2*ss9hI!8M%!~tXPFGHKqZ#%D0PD}bDkxmY?x%qZio7^{5X$Rf*smdPKVQ^M3IdI!3DJ(2JdgEg6w{QwO{*h$ERTGO|>;q(t z(R*Mb0uEY?uf*ZUw9UXn7#b3=?m0j$KYpm6lDOt~q;EUYE?vJq;e-8{;}fl8#TKIx z{}3eaNQU`>Es!#8bq+yJlquQs;%0;C3M#7I%m|`@4Ut&&c%NM2a==a^#m*{dz-R&< zrXNsSxSeVtvuGNWa5O&JpV&Xk88mRX>NfHd>5^yn0_o8UtLh&DML5GSF~qcjl8|4u zC8Yaj9fU^Hw39n?yc`Ki;IbR}Nlf+RYl!H68XUD3hjgeFPPo)D*wG=aFC_V(qMx~5 z*4tlPd;>n}A?Lj}V1rnJ-n+Mk9CB)ov^+E|rIRce)2Twox!C4c54*frn%iZjLuxzL z7bGpjatKZB0NH4aa%$0AgL@p3Dp#M_u+;sKIre4CKFOdyTqt1M*ux1;O7JnbrYe6H zGmQ}v3J^w<^pX%F`%(ybf%Z*-O~qh&ANjy&5!8LZk+kFdoQltKv$tN&x~`SJ_Ab%V zjkN8zwx3S#l}RynbvMUN(35RZgW6+b)28piN4Ll(q9{kFyP+|kxvkVf)l-*pC6&n- z^lnnG2YcL#daEB_)F`e#B6prch2$hX$dy}H{PD@rtBwXoyt?3E2dgn4v%hqH_v1WJ z-O7~+WD=SHhGlPgRjSSbM{A~nl$|M(6DuoiPEnC%)oG+=g!jH&R(yIN0sN4Mk8o$) zbDq-tSYh9;E!3j$LnuaWwC6+CO8uI8UC`$ixwT{s=zIaPvCDbuW_50~iz#DXq`sf& z9a52LjD8L{UHH01Pvay!N2`Q(EWc^ z>V0Hpbp;VR9tfK3^n2b_6+O#}ySRMTj*{c_I3r1qPYC7Jk*`fVlI-hJ$O|v@JnChl zzt}eDF0}D=pI;b0%l+%v3AzwurGLWkuI3n~v-CF$<(HRg){%>%qvLK39rYJ{j33j> z3hU9dt{sI#5hs~=mU}ZX1w4N|XPbCY$=~dN}i_J8O%}k&$A0cf3F{H3+cXNQ` zON;~8QZ-gvzkG`dZhXXsca5qHyRtv$n6VmL1oP8@Dt_ zB;gKeakBIjfEA;?x!yYGo%3U>53_SR=N0B}A6Ix_8_xnDIy2@Oy*oWd6O}Eo z4KteoCk$r$Q{~J7G}c{yuIz_vvSYnLuU+P;v0v8|FUG9%jY~cJL!OX*d`@SBY~D(C zMWbCbcM!c7$8}q+W_$-Eu~qHIk31%w>vB&RewgYfaKE4QXXTvMs<;1B1ja27rL;i0 z+>fn7dT!BsP4C8$-(pOy)=riAw@hE}#insTmE-fRg~>{PDDLZ@BCszk1W6o@#n$__ zGG!(yslf0O7ztb@itRvV#N1HhXp4{#!AB)Bc~r{w2TB(VwdNQ-Z(7 zjzh+~cZc4IhQ)Eyzl8lu0TugysOrz5|2l4{zn4PS^9E7QX)SMs-ie^0`j3Cg`lt9l zR-31T{qOmDI@qTx`*dZWZsY$x@=mw$(=+=Ii|O>tJ~hz(ZOfh-Xs6crsWpCj_4?P{ z^YrTV$L;a-o_%`H{?n^)>Qwn-S)6*%PCaO+?$SS;!>8`jQ{VW%-TSA$@zX%aA5ovv zK**oI#?z?R9}&ybsMlW+zQ3Y=ry|?9=3h(@d4qOqJ8L zr2jiF>ohItGzaZ82kkWB@L$=Lr}ymBd-lKcV^6b7Pg9Bi%$xqp(Qq2i{v&XA8qYqB zXaD6@INqW!mPtA!-4C-T3|0Gx=>O_LG6b1vz`r&8W;%4j;Pv8oK10)Rr#GVTkUds= z`d~{~^uJg%@asq#fO72HmJ#H)vt*WYfUV8hr`L{#k5;sC)#1rvm}sZ^WBB4b449Z$ z6Q5Kl<}LserO^Rnpag(xfAZVdKeN_CR0`6a^Ow*BrwVyoGQUl7A03*$8HS)k(^nyc zu_XQY-@i??0s8TYzon|HCQXK$abFVC-lMDsn9w0kx57e0jMB!L8$LHohi&?~cTVd3 zXQhzwxu5=Xcs}YR!{gu9SO14q{sFIY%n1TFo%i)i8#cwfa!we`_tn}q_bCeH!kqz1 zeVNd;lJ%p7^uR%X+l(W-`BoWN)~@_`f1p?Ls~^;)Q+${iZ7MK``1rm{@9!Gm6H!Gq z@9Gytz*Q)m9!6d0Mt!#lRNFP#a{!--9a0A-+Z$2p?Ywl9)p{h?mA&m|WYSW@(sJG{ zk99p$9ao;V$zu}$>s4tjZlj!0LI;D0$dar?LJFdhU8pyU{=nX|Z@Fu3H^ zv862K1!B5r=O;)KD|s_veL&W$xY z?wwl-y`g`5R3PDm!C_Y|Xftq)*lF0}6hui~QRj4O_P1?48j0DA8+>HgoEbD~zoN>i z-|TPPdejoLX>lNSR5-zT!q9ur`u7I@6i)4L4g9UyrH1XCw_YaD)7#L_-ClaBS>Ha4wd$9+Viw!W2R^Pn!o zXt)<99%!aTEE$OP03sX$mTBz~r5j=%LGGhhTxpqFcKqkJ9*vG-KJ{%*qXJ%(n~EUM$rQ)8e+-hL|{`k1BpO@xbZTCSe!h zIS3d&Y5xYo0npd*v~Xh~djh%JXg^Mces}oo(W^I0I-9pg%v0c=Z;m+&ef#{&m8ic~ zW$eo+C{xy*dwS9+TdS=-{dmQ)2CK2+24g=&y;RCP7jsqV>l>RO9Q%_KhRgkR7RRaV>PN9(PZ-8Gj?BwR4+CO- z3qLv@KOo8OfjcocT-P(gbu zbpIuce_M%8QWw;-71&@uzy0_hD&qRP_Rh5a#69-}-9V21?SvuJVeG>RgC=ACaqC>r z%HDDL5RFr@weIg?p81CcyeG~a{Ul>};8MlCN>d*}g5bkIZJDc9u2UFpFcvh=Z`3>C^|l%av%^#+50TUOJK zw>&*oJijL`B&66Xs%TbU*Kdef=<7g5Ok`JA5CtoTQqQuljn~_H`%TOQ2{#YsnKtqy z#eA-izc8Gh7@m^pe0$9Yst1(T)9rM+r&)t#5we-vjL;H=NWZ`+m+yMndiv>-y59F< zq3X&3YNi7&?xWgt)QU05 zureYyGuJ2Ln}uQGeC^OBJgINd8QVej5c-|rhv^@)hU*b8uMPh_vret&4Jpa-ukxzT ztE<7e+Zx<4gVlCoTzFkWQBxrgsB5G!V!_<27r!v@jXTgX=-u%z9|u|j$Dk~>u0wck zX7w+Hw_ud*;jg{7VD>JNHe_W7*oxY#Y8P z(K{bKY=I9Zt1z|NvL9Ro+NGDvS9DpJT$i(iz$Xl@$-EvqY-)4yCBKzGd2+)_Ba#K< zi_Kjf^Gm$+HV5dC#u`g{gn2sr27S4~5u#W+7ls~^P9G3tJCkvj9lnKMNwi0-^nDOT zI8nwhNrnMeER_#=O^^<;XPT1xkBuH~nwU;I*~ZyCSnL9L2$N9O;~ct>Sgp2L@rK}Z zBoDvmRu)BZ>N^xyix`u<>e7G@i$G?(LRQDtqeNwh>$yeKNmUcJ9H%`~&v`XLy^`8^ z%TlQ(*Ye~#waX-F%SsH3pP{JXh|6l=s8dMc2NUBmr;rM1#lY~iQ6faSsy9KaYA`7@ zMTg@V$~e_O#=VZt=M1;rqks7ydQ(n6{vS0Ulq|arP$wT}E{-1wk!R@OUB_uw zHzEP+nr-?=@~!5#3i-#2Ee|0%?fdyrhrGwmZOw}9tVBq4{cKQ@|Mhh=-3b;KU_;JW z_S!T2tRuv0{p)`Y5tb6hu>FSc=|A@4zxV%lTR1oK1DTebd2P%IL*L>F!A-D=YD9NYLYP5AqU z9y)d^;Do{bk~7_Bl?+^qJPgu|3woo}xbgbaqgQK>w>s7skC#oL#|_r!DyCYmFpry- zUmahjVjC8>e-5ZVR^~o(B*z|&_ct8!w6<|mf29vrR}8(|V?iejMFOh7T91Dl;kbah?` znzrUHt*13?>*AD-nsCPf=Q3Y>ckpwd*54ockH4MoexN_0`R)$a3Bzo@^X=XS3p%n} zgxd1s6NaAWV^4PJnm5SVrs2#F#ZMU8$&UgNK?x~GQA>1vTs>jf0DWXQ*E5Uz$1_j= z`Cp&`!I{AmhDzsR`XVnsy4-NooC}Pu&#o^#Vc?w~TN$w~gB4^c-5(Z_hycR|KmE3hY>fOIvUt{3<>f=rCxCo;_F&egr zS$(V$S_m6C>+??Ptvxz|^HOTN`X-`C)tu2wV_o=4xb{jED~(w(F*C^wI*zP?1> zQ+qI?2$W8GP|?X@nVKM_-*NAb>y29u|6S4hGt%si&sc=4=}V-;%Q_%qt9}%^19>m6Vi}sJu!pxW*!@T(x4K3TK-i?`_yv z&%w*Nj&VHFEIe23fmM6+(9JjegU@XW|0@X`uPb)^xqq^N-R@=`Y{t3%z$$-q+!9iP zBg0ZgJO;uil&?Qhobuj_i>*?@B6B zwIW_rSpB+TYO8tf%$@z>f*g;6H}YT{)H)v4kIksgNSXjry>nT-np%$fdnb&;S4&s2 zC5>!qxzW9sfaw=f?3^33gg28OfBaBUXcc?@w?(Hwf+k!YNDXFx6DUBJZAfcyod%t+*Q>D~zcFN~^g|=ibby&8jBgBQJlXlwXFA(lqzDIM1}*^C1u}Qj}(ZkefR*s_uJRFw;iURyKSz% zTlor{`iP%O)39DhSYCnG8Jg#mU9+vm{ouQY1a8zftB!q&PpoeAF7%068)qY3;rJ~J zhqMx!6>R4(!D5sLjjzM?7KQO0#Tu~sq%vWuOP8U(iMEhMUvIN?naUohE>@ywJGa-= zV4yE-X&Yj#QES<$<($xwKC@8n5%spCf=9?CJAG|I*=)b5cyC*}0v5IPbP!^CAtA0I zgN^axmmcQod&;&?Vpgg3{NHR-u?Zm=!2=3sK|EmT1sOTJyEpH(azPTdMZfAblNB7% zs3FyZ>*^Xy_!Ps+Ep8XsA!s-9SQ%?R)1GX~r8u<_ZWxbm{dtWuX_Cpe=X$I+k;Ti7 z>b-eg^+9C5MegJTEz&})-HKf>Lg2jtdwzy>wSA$8fQ{$cm)J{>!k_s!-&M-2iksIZO<*gd8%6|B;;dRPXYt-|uEj(a6%k2c>9w??u=VxD`5~@+sqKi1 zpF zu1knfri!X8n-dI@TxsMaJ@^P7AdIF5W{30x6x4$238EHgw^8KvNl*4`&FD)FcamFN zylF!js_0gip}v@ux4};mI5eu+`(z}xQDT@nxHeUBf8<3_G08Fu}X zW+6J=JU|-aD~ymKG>Vj)j@)>prgIIR>K!&dhFwljs-AG=lykzTXUz~CD0M}}c`*wU z3GT{6bwd$es#}v;YlrhW;$TldksD6-hljS`-zQb?`!>?Z&e31{w~}ab&0|byzYgYk+zH^}5dfCh<*5&m>XX)tq2K!Pp$AxXZ zfhRyFy{vft&D?MSSFgULVIzbPz}yB#k6tSVI{=Pu1zd=FJ{83lussx~-^J?u7L6N_ z$*^`WZtg*P9!ON#5#5H|yF@qZA9D~&$}-8Q3OTfJv8{jyKCxQPCus!4*FzKiEzMh} znd7=+WWMFbLnpHUFUn^vqIpz}Zm&Pg#WrShQUS20Q�~+7dF+d%TG$%XUi{Q4fBR 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

H+ef?{#F&bQX?Z?$I!hMCk5 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Ű%q?jv>m${aUi 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�+fWaN^LUm*BWWE4aKHa- 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 K6Aph{-Twn{$#TK~ literal 0 HcmV?d00001 diff --git a/admin/img/user.png b/admin/img/user.png new file mode 100644 index 0000000000000000000000000000000000000000..aa6526a0ced80592a63ba738de83b1a8cdbbc3f8 GIT binary patch literal 49852 zcmb@u3slni_BX6`%>T(LYc#FA&D4~Yx5~VQ$}~;)%*yhT3MHv|0m8eYVAE+#O`S3| z^FlXu$_s-gsGwM>WD1m~h$tAOq=<+Jh}<5mbN=VN?|Pqi{nvV)-&!sOT|dA3yZ86A z_x|k9kLGr|GcWF_xjw4Uk_bK0nMtjiQ5w^ zfU|VqJhGCntk{y+1MMlw;5>f(xUA|%1jjAtZ>B*828X)Woi%eay?a;6KM@*T&Za89kHeGwZ=yUnWgyo5ztk=xX?z&NQ7;)A(kKEW#S(ky=P6K*ns*i$aW zXD1Gicn*h#HwDIY`-D|objw{gTyAcGZN6wp;-L^TKOXDKS`Xag9rt;k_yd9Dat8R> zN8I2g%QZ=6+MZ!TweGw>2wkb7gI*2bgo`}Tv8+{r&;IdkQGdmHDG7XTDMh;ho%-c& z%9lAMw>k!vgUy(Gved=I;0=O0S2ut3`0u!xnBjtp z(LwQ5X&XHwE9xO~17sIV=5@gP`p7wi>>NDLnUj8j1Sj9*Jqwjn6v7;i6-Vx%H$e=eEZ5SJ>3n z5u@rzN7FpEJvIFn2N4_$2IW|}e5zd!weSJhwHl}nN}s(`KxvDCT3OVS_sYhE4mc6W z_OrpfYp~F~4BF@yi+`205B}6jLRJu$*IGkI{Xu%zj)7{N<`S#NKVEjnis0pm zXN8GIl9j7@v&k8|ywl%Bi8~G#|^=4w*pYRl1Q?;5rmkD<4O4+wV~-}X3r8~pN1lb zVcN^~OH)V)?L=1BC4l3dp{dx7wRP<$;##*o-S96{;nvHiKziCw1?apil=^JQ!X&)M zKX}%%w%*fCHaa=)ewhP-eEMxQB-bZ7+rz@~4%L;t&y{msIr5~K>Neu&8WIoEG}D=- zow`ta69~_%51ZRb>@JR%=iOpingO86DfS~_BKMg;2$bdk%@44)nctT_5`7Cyl376Z z0l3or`Wpw{dk-V-h){l;AZkOCpp4brmxl{rb>ofu00#40ExI2D!!`wnF6EDWnyFjz zssX9a+_h=|0Gw_T+CQuJX;lPDno_tmCe|D19~60J+56YxE8pyU5NfQQ6Q@kP0#f{Z zwa(VaSts!zOO$_D20Z8=9CfCydDILi&o`vJQd)09&ZejIvl93t*T$h?>SjJ=EDv9h zS~j~O7}f{@{S8YT9ScQMSC=fAAZsUQQa9 z7J_@=X!!+|m`?ApvDOBse?E-Kc9@#AjHx39)e(DCfh|%EPVjm)gdmjFs!8zJMjZ%D zy(sH>XBWHK0_y>ELi2|k`qoak1dRSP3`!jwxh{l42J==NF4`)nZ~tM6Iu0<4O*}q} zQ+~i**LWjdpR4JjqewqBXlEF_+Xlq08y5Y!ZgkGRGi>?1yR;L+^UA8&!0(Wkw=56T zZjJF!{tnWM1do$G+*MN62VhDala+7R=hA6p?=*>XL4I>G`$zxr>##afPfxFMQz`YE z|Mn7LYK<=smsOclqg`aQh|G<9ZYVokregm(T!(u%78tI}0!jnJF1+p>N?gYs@DH2( z`dQbm#J-$T1;*=8h8x4^(`rO*wKQs>TFto_&8Tl0jlfO+4(KkHa5j{|8iVV|b28lc zuwggNi1R&hPBk?G>ucv#P%6K7OXodtj}qPF{pEl!kXxgE3Arx2C4O#<{?S`4cIqDD zs1f$>&^ zf*V4=N2f17U+S~LWYaTdf)Vo?+b*;Cq`Y;EaaaFP#NY!06NZzL+M^l5@5}1R&{$$O z3^%lsMcEkxwHDO3ov2$LO@!PEz?#(7x16i%80f(b#4vI%f|?H15l5%?Mc%x%FL}@_ z?55PLr`kfe6)8+hm?el#;09m2b-z|1Dd&*w9{C)>dv{ogn%5MGa_xv0b6b|4Snw>& z!8U|(@z1KMS3sBHIN3Ua9tgsFAiv8CqjX2w=8kRQw>3ffjLzh^OhHRK(07AY>KWbD zB)|)rRxK4E7z0S|eG_`Nn^nSj`v+v-Sp0`GxZxL)1?)|BlBNzrUGFBQPW$=uW zV(tsDooi9OYnd?uXBQf~d*a6~6Tjx;Jy^~U!BrH$K?Plo;FUJByp> z9Lf0f3CDM&bPdNF-?k$3=S;M7>*N{R=9YUi#Df6T76K>zm}*&bjN1$J91QGZy1iVL zQsm;APi1STRQBWf+$6CFZk}k9bE^cs%jr4*20z{OMo!BSk|nQ}6PhuFgG2WmAi44R z*%ukC1FeqR-kjMoMXLZj{pLt}-#PU(mir0}+*;GFgdi3-*7O`wT3RSYsR{ODapaMt zIS`IMjO=+1Mf0 zq!e3-Ht2TM%UgPv-fdzGG^2Yi9QTxD*>ag=P5laRUNe}FE~DiN$?<6m0!(tt-0aA# zkkYjio)#Y~sgifC=Kz}GAI8x09e~UEBcK0rqm(~oe;OY9B>FqPqJU?L52eHyZRu=TK$Q2jI!0H{V5`9z{(~Rkgt;2Y%Q5th+>2gu`itJ=7 zL!+RMl{Za&K=eM%%e87``AHIyj@k_+mdqAycKT0_r3F&Z2CAdw82ws6VwVt9&U8Ux1yrROZKf zdW`Jg9XFeeSU3dFZYMC^@SKE_kyJJtG4{%~=a{ehc=}YoZ?{6^WqSrKP=@v8nfHuI zlW$kxN9@)!rMKOe9~JW6uI5++Vw=&iAw-Q&R>fB2Y|@2T{HJ`}xGID9C?h{xtC)4; zJ#kHm)vdKAk-5;L8utDvINS8*EBL zmIdi*F8vg@4$pchU~3+nqz0Yh(xu30G0HI)96q>nn7}vyCW1pBc4W9VroS+M*!=__ zyt~}r$(u_oMLW>N0|lnleZ#fdRV^I8gHt9J^$79U(J7AA&{tz;R-0i;DXfA$>4$!{ zD;b`1MyNlhy{x}L01Q|DJl7A45#@B(=HTp5mk#*kudWPE#d640KV(1}Bg zRKoKia=;#%hwNF)R3YXLi!5$#na&00z$?X{TING-Zp%sH2ktPA8)cu;a#M|ETzW{# zD20o+YslrWHG?f$3NYJ(EUj3YGw;|aIym!jB<*Qv7{ft!=O%&Ww4SB-!=0O1$o*?I zXA2-U@oYaUwqOL!Ay9@T#JuiFu&{BcT9$RjRp@#nmK{S z9z31R)+rn1_){*;$ae(Fmxrpza53 z2{n)Mun3=e!!u|tf5%dnl={Ts7@127piASfzwQyBS)|14>KQs1spr;c}B%kGX z&D*Hwm#UXE+q(sn?uBKDqdVKK>r<!D(yf*18{c%Y7>urj(ML?J{GQTd|(f^DVS3-%cEFu39v1 zDMB-{AZ4kZ$^{_kMFCv} zWKCY6O5sG2JE?vNQRCuyO`;Uva>U18#H;6#l#6`uW_f5l)H6XsMJP8hx~L@~8!_JM zLPY-!+b(^g^_HyJ)DX+m&c7qxS5msH0alv;P-NgNUQz}j)^j#k)DfWl<1g{n!6F-5 z8??V_j$mR~7dd`bm&Xd&=uzjSCTv!vq-Sv}TGBO4+YVX5x>Fc4zwM21IqdDWV-;Dza<~Xat z0||ClZ99HXjoTuunqM@yo;IG_9dj&)evu^^K8>4&eE{hZl<~sUC{>_a>dtt=s+Kn| z4P+BRX0(HXx}_4dqQuh{lOD$#W$wLpmsRiSFcbdpOu=~jfd=yQ+)_9%&Ue8X<|i0G z%}+Dcb|6sx@TchxAP#6`s&SS3#r?L;CB1L#G7Zz%jpvj6X?hJO#sZRqKGo{2P=b1a zm8vffgLz#%woMtlaj&josvWs3bqH%3B_m<2F|*{$a`$NZP2L*{$*V(hx1g&Ytc_N2 zU)V*r?w@N}ytnj8$BfW1iw!9vgec!llz1(j?+4B&Vq5lDw=1&5pREWKwVQfxF{stO zLB%C-N%D-JycZhcxg$5(8?$V#hgp(1Csu0F9vHydiUmvjIhHV_!41zy!k+3{3th`n z@P;#=-?9u~xUKXGReF`k<=_P@J zpg!AG0(ED>@B%Q`ihIRO0xMxT(*qyTBWHD1GXI2{%XLZN*4m zZbI;@N_rrKF-u={LX>K{0l>}1XzYtak`h&)iHxoix;M})bg5`*VcI4iVw{ScB`|O} zx;3STO|-ON(O6D+cC08cv5Fcd9MYAWWpidk82Wg~JkH7Wn-|#&gSN6oHzYwRo5p>r z%=$=PlSX#yk(HqL>iD$T2l7`02K_s>c-=nH;pXriQ$E#6m|)b5us89cqi_fJ*EIV~ z+mnHDC7OqV54a8}AsJwi+_owuOtXIcB%ekZ5SQD~&h0na6r0Olb7wfoKKj#bN0I5L>`kokVs$r@_xrcU3k3O8eo9Bq4QczEFexuboA z>X{Z5GT;eFZfm;DdiQzQ`4;PCIW_n|opYvPI(vCn9ANE)HEjy&vD!VrDZzYvyk%r( zkT<_v|GSkVws)?B@TEG1pB>q=)589CqCfM1e;V~DZdBlUo62DBF@v>1EOCNEh{ZX> z?rded2Msvwh2WW!w~~n{gl9_%Vl3kWfxGOB@+?kQCir+*34dSb6&Ujr$_0skrOx4xD!Gn9es=x;iA|cr5M%4L7hh zK1^CP)e~VMG?lnAUA&hXd=Gr{4e0s@q@)Q^xC8nla|^l5QZto}O=HV~ZEoKRsMr$E zUMOBpY&H*nRT9&8vcIf9F_Lohm=Lp4eFSZF9q>PnH>;rzybQ|0gU^_f)MlNb@A{_K zPV_oQ4x$SPO?t4@zc={Z@0VjR;LC&1){tIJ`U49F%&r?GcpD zjSrjarA&dP z#g}yNO`R9-6}^OZhwmTU)G3|pZ_(?}&S|vyP`BP+5*O@B1yzVAD%w;`c@bbJsKc*P zf9xVouK{~%S%b&T8wYx_mRv` zqfKE?3Ew5j;KdP94=(IlUubYW3uH9W+gDhb59AvO%WK~JdSZ0PEycl{F<4)D3#Ydc zf8@ol4&_i!94+qvhB2j1_G${$5BV|Z1mNwK&Ler-Bu|r1S8f7Kl-B98f5IBwIzYep z-miv6F6<<)I>-prrjPdi=013S!7S%fe;1@;zmN{aEkcRVHIaJ8GE#VWY-G^E4E-^c zlBBrhExo?xdT~A$;doz%mL99W7U7pY(?1QGQ*3GK^ReEMS%De1e8Q>%>TR&;%o#C8 zi;E-8ZK~}C$N=taNe_eIUrFOa@r1)Eo^61AJ_elZr<&*XaVy|y!K9fgJ4!9M^=Mu5 zLiqzSvq5)80lGW}E#=62V&Eo%hK`GM9q*?0p*8v|$D@y=2ht5*x_jX1erh{RGSJ=C zYwk~7$2&>~*lcE{PkZ&I9*i4j;<`O3U3&!Z;t&jIz9G!IETOu}@=R|DCtY=mO941w#-?ACZ$RNdsP#Tor{Y1Y6I=r%w|a#C#C z>ko=8WPwxv!tcw>PD3ke7Mg#vH#Mi1rW)7P20b&uv0GLcGtB-$dw^|UcWL;O?<$_m z-~ZsdrI9RBI%yZ2R_`cFmMx;!%zrM$`c-Tid%r6PsoBHR|12onmDZGC_LAE4kEUPn z^DP#)5-DkCOqo(sxD(q~o`8lSmxshi!oWPwpg-}bp}6);AB@Ww@ep0F@_v1C zTxFQ)>lKL7D~f;Rfyt$#X9PI)u(IoAJT9Np z@sqViBNcbm19O0ERJ=;6QF2R_=qB(0Evrk1WT*m4*F=Q1f`Lvg2wH%OMz?60LE0FA$w|LN_^Q@;i7VBcC2N-5cZw zrJu1UE%%Si#EWjb;71So>-hK2ZTCxto38Zj$qc6b;CQma$8NjDSNruM80NrbMa#Si zIA2H@vjZt-5_hhhC?Q>~T9TuYp``A=C+2miQiJ8M$;gs1a zn=Y>a(8gS+mc6K@Zfv)c6WJ3*SZZ66UgYE=b&UclL(0{iVpuk@p=Bp(k$ME-1AREu zG)az?E{Ou_Hfp5TOX2}-hzm&dWD{4b zCNR2Aff~as|KhR5eYIp0U&q$nDD+^SxK@O6YtVGravPgyIknykcbBFK9b3r6xtS#) zw;Lfb*V;CyyK1=R9FQqlp~*wYbxo~{Ici78^`2wgW+$*SNQ1GX^l2cIDcz?6ayNl> zvzHETc_4DqA*@iEbjQJs14!abj*NuYKp+%hPn{lnaXgC;7MAaU`}I~=AZLOh61k;~ z#cbT!*cQqw-1v?f+Zw8dEqX1g+!%kx`+$F0(~$+ukqE#yllvRG12lWR6*xL2pCz=> zs^2wp$=aCuG<}s#t!^5vRmd6LWDQHe1%gTENm>U=Hx}Ev2bC;zL1>e)ca&Jtewbo3 z05V6yLS5RRCAC=~b->vMY z7-QF63+{-nTYAwPR$t_rC-r9^n5y>x%Gg)=De~VkxQAJ@W;SCHWcTnax38n4Dm@S! zTOoPk8Z?pAn^aP19iQ*L-!<*c6`bNZJkP2lIf9?i91fE-CsW#V1NqvzrV|StM~aVp zv-d%0^4N0j(t9O6Z#>C!mqxiMhGGZmh#<{Y)$$|tw8wPE$F4`KVCbwSU%Ry=DrxxM z2E_vK8gjL6I^a77Yw@;jooj1Zwi4xItr5Sd=t!U`_~55dah1B@Hh?Unrp&j+@NQVZ zZi7SOL(`|cBD>bu(XtaksGGqnX(3arz z#J*eNA*y*7!F9Y1S3HQEq3|gi4Q>;?I&*8B6UaK~J&Tq{Ovgo$FT)1}8rskc(pwTyh{{8Xg9 zLN}r9I8xG0HAi`~n=Ti)$6yX~-$8uu*vY+jp;88vyhzS6C*_(rQQVp5)?-x?x~0Y% z6*5cupmM*a`E4Y;FctS3P@`}HEYE5jr z4ibf%YoQ0+{Db;R$@|m(d#v5OIJY!`1ezHUM&0~Vgh$1V+7K_0YT)96GpY%jNjo{A zRf@3KDwIO2V#V+hu|a@*mUg~H+yuT|MxHNfndvvC$bH>+!#qB}U83p3b3_%I$1Tcx zrxsQ%m2i}x5KXob_d$g$4}#}7uwP!z8i}K}B1Rpvx@_g{_Oj8dIvL7MA>_?P!tIM- z;uX?zQA~HAHhw5Yfv($X(ZEt}=}e?|-IL^3>_Qi~i)5oNH@BS859!kl68p&wtr)U_ z=iQ@X;-rCX_nIt`NiF@qwI<6QzZNI{E5hX(-5`TDjmd!$#sL0lYMr4a^`O43I!A(b zYotf)dUC<%wQ_AoO1BQq(HSbBRz4)=mNaa(>xdX1xi0nLmJ=}FyJZM#5fmMMxuvU2 z5aX%*?g}mPoac4n5Q3xQ?u@6Do7#n~bF+adLxzwtY=@nz_tZLE52-$ENZQC{FueM%8Gbc9lPP@< zx5@V{moP`71nRKnBG>EyQXDm<+iqAF%#=N1ty0eDIo0?ZzIfJtLW@mOXcc5^j(K}R zRUo`R6*nMoyRA*{&C!XOh+QQ#)iu>3F`x?$Z~Jjh%PvAtwCUTw_8}HE8N1l%`7&Op z(sF}{De6q=!xJemT}L4ecxd8OKTe4OwS(%G+VY~Ad;R;->>ohdhtilnw!34;m&Tq; zvguw<&+40%%PgI>?tOb=;NJ^oaenqo7(a<~S`%4PhS^xY>2=;`MrcNay=u-7BA}DE zySgWcRzx}y^7h#~;O8g*>Ff+$S>gtfR~WCz*tUVBGg2;j;ro<4Rm>x;wA-!=t)jdW zW0@R%jSk1P5;!&+ozc4%_aTkdb+DG2XHHJ(PU%J0nFiCxJsdsxehB$Gx9)n*vVVxA z)QI;23o_-9b@G}~3ed{NbI}1oyK=0n49{}L2WNmtB)n=?P|3KIfvRhd_TLFNt*vW` zs>2VAsrUxL!tp?2IOI=*>y<99H2UZ9r3b6SG`4Ir7D&}WnjJ@dh{8!rI9r0t<4?z` zhF1&FyyQZMu%c%Evy$!mU;p#a%Epzo;BI{-X@@KO@)Z@MR#)nFr01oK$1n;?$g#~U zYqxYt6R#CNDIs}lM5p|3qtW6V1xKG9J6I7$(CrI@ls29+-50Q;wTo6I^wPO}Ao7P| zHVSU9?!|^p(@`eCR*9Q1w^A*TMI zlM|W|5+wiTTiZJpRTobv8Kpb#Z+L+q&H&e5Im1qtlDOc z{9-K51$%7;YN;mTTtmzq%#cRS#M%@Tpk@T(fzkZ|sG%9$P?`ji7l5^K%9x%>6%$`w zG7767nwqQ<&D6%4)ixZk^-frB&1=4t^dBP0aQ<%+vSn=pDV4OaDM;TF=o*+@8~7AZTdzx7RbozQwVv!F-9=bkTl)=}rB6n?h@*sUxr-;YS(tb}) zUo2hf7FFf|=Cm2*NyB^{rfSLPjKn(Waw23>3v$yaiv(S5F|nI0>YJf;?K7&tjH20o zjt}pp9NmI*?JNFI*<=R4u@+L8N60Gzkq_CAC2<1di#%|eQ3-eHDSL|uE%HE2=pUn4 z6Roxyc6@rU)L%p1$RU4{r7R|s3u;i>3!bv~g$NE@^G69;uGPR1^zGK(oD?|tjsbyhF;{y&9yn+^W0tkiot0UjPnFW7Lmbdt%h z%q44taB)eb<{^KY?74m0e_Z<)4=A74)xJAuw_L9=0dc`ffgOf7t03*_m7)-V~DCIH2LGQbrtm3Pz`?0M3q1orJA`e&&wp&*w zKls?E4Ddg_+dQjqHnrk}nBTkw)4!Ok1J?(khn+Ir*qY7}#Um3g)wZH2l5vw$3@&-- z|LleC{>6ur9vSJqyAKU+gr3I67W`hz5`0R{I^)-l4v)00UTe48mMH=3!ctShcan|t z^g3s^M(eBC1?fMUangJ%3)1J%k^@eWgsQ3C+lgp#exOQd1ZY6B2%_vGVAaokiHetb zi8C(3z74v6_WMm|l-{mjJhT_Tuf5T0YXc0M#kV@>Bh^fPH~48M5@k5qyan6;`JW57 z%QScBsINKz1%XM9W!3J!sjYjxF%IOjACv5E4Jv*vk5_w%6~;9%lj+mUMso5Ry*Kaa zu067AOXul0zSTfmUfzXsJ0>H}J`X?9tRp2aywME=L=sFROWjx27>LK_C_5KSH-<->2RH>-}DZf!+~*n6IjY&;id9Ei9hjJNb_K z=zQP3XkA6}=kEhX6K>Y%OP~h4d1nw!`!1Q=HApXT_7*o6vl>%#`gS?#B(CkIty1UT z%LGiXBn3h-7`#c+b%n&+f%J|M{`;*{IHYFCH(h zTAKAmZ$DQ)96$Elrq5_XCTL1M-!}uiY1Yb2A1orapWfaV^KPosN$<_T|J(Qz|7rZ; zX@mIy^YQl!iF9hZycz&uW#s3>!Gx>awy6ZB=kstW21Hx(Ss8F8YN(eD{z~v=S}qw} z4qRsTj99M&&v?j4hc6LuclSJhHul|~X8Y$!I?_FQSGyi9XPir?mZ#Bf;imK9v8|3S z^nM+|T-YblMe+TzMvr-;&c7C$@^D^TJ3hwGre?i_LAGB!f1-8Eh3KI3LS48Ioz?ZB z^|h#vh&9(`&2%a&S4W|hJC@b7+<8@4^m4L7pY$cy=0V)nyAl6WQ*FsFuRWP?Fl(o> z=$b`00E|Ah+YvHKx_QcEQJ$9mSt@uCY= z{3o}Q9kN@dN;Z~oHX^uBx(-0f4^c4nYsz3yeea;?BEj@3lvJhT%MmWsSXwFD1J| zWaWOLUt@ERGp2ss4Zh}_@*lDbU8{YEB?(E254Yvu`<1puhS7r2^HVN4ovavR!Stn^ z!81jYA3rv<5y{YuD~TJy9W|i$U_Yh2e{}NWV((Z8(%V8%c0Qfzh*htD z36wJv&z%yt$*yA6_Xn>E=0k+dKI6luG2LQebNJ2@XWauVUjwFmhaFORB6`csD%2DV z`D(26g8tYpR1ASosR-`N!ovIALR;;1XT$&94GziF$F!6xAda)2G?xo^0)OC~`_0vl zSWtYk|M}~tEM;%;-93g2l)G)5-j|lDxxh0v2G>DXedXoN4?F6Pd)c@sGIpGt_{&A!| zUn44fa-nXvzFnAL+TPs9`LmuDkIr+)Qoe5q)Z^c}%!_Nf5DO}a!ZZXp7{q68s!Un@6yl!CpN*d(Q9Y^_+++#A;ViM|*m^L|oGSWb`FQ zd!6eV)Zm9NwO;bE`ip8Tit7^$ zJU|T&5NmduT7VNhyAN@zXT1fH5zQ4xSe|dk&h0b?>G_&9K6g$M^a+LbI9cLxdu+-d zq{UT9ZTv?lPEG`I?(KfZn2IU3*GXR7CHQmO+`t^&RF@m$ zRTcKC{G?MiqIU)94y`<@_0CnYdM@w#rl1frqyGD+C(x^87Q{y#)}2GBfHu9sFt}Y+)iDHJ|bR zW=HqUeh08c5E$h<8IHe`zwq)0V!KWh=Jb8z>XDnKorUxxmk5eWShz#7a|Qhsq?x}9 z__h+ro|TPC64A?bt?3<J`An zF<0N`ijW#SVlQ!}!aCu?`)O?}toP(Ar06uq|1@Zp9qhEB2~#rw(zC6B7vIdYha1d4 z4mf7%HqHUlK$M!8!75lxwfGX4Jz4K&2W1&e6f2Cdev&qB%-yumMnT$uY-{qf0?uHg zPCb3$=1S9WA6jjQvR(hcEj~WUHCpmRYSSOF8rH7OeunQQ=bKYI-O5m%tA$X*Qro`I zw1uWxo#1AdarKGFPw&%J)6>ECu>8+2ogFd(Ht_`h4`ois4i*R_<3C=+K3mfhs*AAw zId4x(fIl{q7?UC}GvHt{EcoFdfy_@*`X2Bj150K_1(b1uV_xu_5~A|bY%Jg;2aF{M z)Z({#lklCo7!#AUabZLb-YV*0wcgy4{oNd)aZ}wl;QxGszrCZprNaxTiRlsoPjZG& zqwuhu=e|fKZW)o1I!@S{qD%fky_LBvxDUtm?x>K-L7ZU^pMI=I184p6xNMWCca?jY zE&3l7DTPpAK|zMT7NoaUTa)_t{P^_%Bm`-5Ib z>@@Bq*kZ`)A0)p2ffo*;CwCEsB!mZfIyR49-k>ax-J;0&dr_G?3 zAyd`OuqB41tC|AS^dOJF0h(0aGMn*2t#&7thXNIt-}ZdgZA=AW%$lJ3+|VK}R<3bG zJ3r^AOwo}U!FPe2TiRV8+tjhATzy=jpW1d4oNi6Nj-CD|bajj>*u+7C&rf!9nyrY4 z8T`@4fxUL0cXo`X<}Bw~1>Wr`b| z-|G%gjkytMBra&1t5NS1nfXdVTjdTsK8CoQyzn!s_Cj`0OGCY$qx`#x3)2Umw_m@8 zu?3eDPbPsQq71I*E=qvn6v<6-y~MZOTF*~c6F3hF&ozC9YCOfLu?2QQH9tTarkSxJ9)zYqh>pI zq1J>D-nxq`BOe(<25|Ae>LzoqCnHWgs5$o?Atc}wJ^V`W--9AnLMN)VQD!*|!oVW+ zMHv}gZf$RS2ycK+}xOoJ(+-e?J{QLdBUavRe|2%IXzux zw89{q$M0X?;znmjS&u|eu(FZ+|G=lSqBDp z*Xq%V2Orq#V!BfC*o&gw`6nw_9$0Z za!#7wP1L1Dsa(TVPInW2|@(4QVDQL+nfGE5%YVn?ZE48hvT@MB-DN3YdF4Wqn{oW z-Aes?&?)6&c;rgxl(xg`p{Q!ZV-U~((sM-#*8Lc>xc!-bl{kfZH)&WywNne@?(|G}^hmT-E8 z+8-`oPI;n76V=GZ*yAE~c;7ov;W95c4lRjOOG^W@Vij&2b8>%9;qLX^)utuz{c+=ORIXztE74M8A97DgafUPM%pi}rJIT2ww{5o&6K=yL`+RG6^ z-|DH;Njs+tFgYo6w?-?}Pm4#%Oiod|r;r{E%^1%Sr5NP*_LmdMwH>0kzulAmAlinGQ-&1DyaI=b@7C9aqDDEhw8%J;Fbo# zp{XdHLM$^e-pX%q$4Q1O_4Q*-Jn!d}YA7?*FHl5V)gre1shVmkA_hGq*aM1Uw=mm= zKv{JoP^WU1@!MplXZi!Ww)H;V>qRfeq-2=GY13(Ggl8$TCoS!Js^=>~S9BoNLq|dY z0}G3%iB{1W-T*=>v|PV`|NF1u7DRn=`_$a=5YBPrp|VZ?@DU#Q^p8<`GVr375VY0| zF52~DOm7bPO2s-)U9Wz0kNgbyOT>weh@dD|3oL94lLW;c!s%5mg?--JU{s&ybxBBgWz!ZGTxc>v{W6f8GmaQi1 zeRm4T+RS?T>690xGWob*1>lSBm+AWD9YgDNTCjCr0mju3rN6mYhXMFwZ%Wegy+nU} zt-AK?cDs4f;nWM=^Ev-2j{Y}I`FWTw`id{;M%q8StbA6$aVARIxqXFdJm9GRvqvNJ z6h3ddNciD;B2q`Sy^ne!$0{(s<`>VOY2+uL1(k{4okp4KNDF4w3dtId{EV~ZJqH2@ zTmGgu`4;cMbgd51Ep13BohKcxdCn&1w{HveKjG0^$vKn??Xh!Kgz9ogM9J5JM97T9 z(COFTu21k-{a=}-@9;aAt~*%xtE>kgru8~X!V0ssQ@XIi_0bMk`8V=izR_F%&C9K9 z$^P${`VF)8S+kb|WOCZCzy7+$2k+2}-#z}W@cD>!5e5V@rW22QwRfPyyDuaqJ!!<1 zU!_B2>BZ-kQlT#@_M^XA^Ys6WGXB58f9iF%wDHBaA=ujww2IrU=I>4ydKEAwrCwOw zj_K|F?i)qT+hwv8EMZAT}Pp}`D*~_XCm%bJb$>ysY+*@)5_o9_xbv%5SJ}I zl*uiq`mImMQNh#b;5|GI#mJ8}1lu!3e4wQ`T6T84kll z4t&bJo^rkZkQaa5kNYZU4EI|(yED&A8ce#UQweSj^aE>|5}MQfmp(UX0e|eu4mSFv zKiPLtZ}t7%|IY;-mtGBrw%b$t7}?ths2*W&UQ$wT>hpWae<&W#>_Eh~ov4=>|EmAp z*|vW#+cm~O_wb5!k!@nx@gYC2=iA&uY53ySo3xUs^osb#&9sjteyTlR(zi4Vs(q4V zf34d5DB=0*^Y7NJ?96@WpSovNjARAI=}XQC>N;Tl&3sfq9@x)}8YQc;8x76H^e!MZsL!fy)O1L~qHVGF!k_@3LWigc&gNY8= zHIMYx>;+?vpzMaJq5{m{&G{RmwCfYYKiLPmxf!ygvhnYkH6j8(x0vUSy)dh{s?V<<{IO9 z9lnhBY-a86j%rMGbUGccjNj-B^h{NddP;&#Yj%HCxSYl7)Dl5BmVH`Tl&)**&EbCB z|NFfH$LwQea&@i1nqhrx)f+B^*ni&nmEOAn%2x)FHGc ztxmAF)zH?42TCsbQt^*ZAB6M1c9btoJAovncnQfHeqNO`*25%ZpGLJy9!Z)7Jh+CP zgo@K?(AI(t_WnG5{?_DQ_loMf7n*AhoE*R32XAn|isR>=(-gLACw3PP9tdysyt(41 zpP46}GMlhTG}@d)@dM^$guZJ2X+iT?am9}EjEf1;LF%1O2&2Baw~$lZo7sx$J!z6{ zZXVzlx(DNM6x-aXVnJD7?^FeeT->-cpj{r8ghpVdhaCViWWo0ya79(k+W6J;=0 zpAV~4NVn!gWc)Z01y6Q^Dp4MVE@tMZ9u^_fXDWjY%|AIU^&~WY{Wa~LU!8jkj zBvPcpnVt3vHx4hSNsEQ)X!=74x#6Bv^3z@D)>#X=8)JM^-=&ic}*0*HEn0@TFL z)6bt%UfykQVhKVk-QFJqWHFV9n4GdO6aq%^4e^{r0^`3(d6@WSvaU$PWY}klW-;;W zRc6{(QbwkuiA%M|wXZx;Rll&!t8CaAR81x2G|9dik#P4C`Rdu5hZ5Kez99Eq-LEqv?%P#SRgA9Q;Dg|yZyii? z%7S4qZ0uXs>^^cOwr4DpWfNdbL=olNsM2kaGE13U-${hj36lk%KqbB#RWdLD!@n~0 zywdl%|M(MlAwdQYnUBz0I3d!qeO==z)NEo=F7>y=%>FniBqBI|Jr@zQ>zS>;pk166(-@LUGSNyDGNE?%oFuUB3T-ag z{*V8GK@I2EChJcBTz96J zdwMz{pvVBLS6CD7H1FuovWedsMgX-+>?Ub=4pVxYzkDwQ7)zPlS3RIGkczj)>443Z zi8mx-V4f=ObFg|!p>OCSf4!2WtwFGjv&3A1Hk7spfdHC7Tba(u!R|C+U^vEh1xO%| zT#3&n8N2o1F?HYLLIU^4Z|ex7BbiH`GxI$X zE8o^(Ak05c2|sjui-D!noS*-Sp5$ zp*JWieCMdI7s-7MOkDctDOMryCOYg5D%MLHHylP6vk#WT%LH?OLtRB={sv3|9)dBc;wy6PLtyc3!RB{>SZ|T8@1OJF7R`^Y8K$EsWa^ zDy91h-!8aa(3tCoVq}C}>U`HQXD}pkeet};apBv+?SjS}Nw0k(jAIUFcKUX`lRTI% z?k)d#^LEge@(bx6g5d(;!VxXw%$Sr5COffbtT%2K^yMq>xdR*ifB0bdbJ6V+FaGZh z#n-iyEw9Gg9JI1-e3uuADpnR(a&Jceo+C(YU1S=dVpzk(*}NqdvAp;vPK3x^nZG}> z8a0BDrRiC3BvhkYVvG)GS$JU@M!t0mRe_pUa_W4gCB`ag2+bWUU$uSz_Xp6WWa?T_ z?WN?^B?Cis7y`acEQ}IWdAK1Bxn*a{pw8bN+t*849QHKZ+1THIS+9p=g@9<~zBB|* zuS~i?w#Fn9=E@ruhHbknw0ZFpsSmom7v%y`#fdJ%9~#R0@Dt-fd{?b`vu|Yj2`z8rKw?a+R@1QBj8S75xM|^j$@Cx!(FZD-aBF`gFuZ!-Z)$(bvvns!n z14HvJWv)2Ztz2dA`f=zy{QkBHEtX-mVP@jas~N%Z1bjqyaI#Uy%1t&;pXBx(O`fF( zU7}C;v^bwJWx~|=!jub>;6Eqh0?HY58*94hvqeuLJyCs6;Kn-1wPk#(&-#Fkx5+q} zHVe?bz(Q4_lf2o*%ez)X2fK?K=E;51ZIxGJi)TJw@tb7m<`N~#tvo~2LG^0+eyFNM z->Q_@Tg(g4joP7v?-6lf^cDT2s>nGrC*sy4Jr&Dw*4lEPkG%dEoQb`8gim+mvDppk znG?*qiSg!gc9sGtU(j(vaPN+rU(yBDL-0!&%tbH?i0?7G&Ns5Gl49+!GhT9IC9(;enZmx3u?g+g)dhOb*^vOQ|sY+93W+om>1HHAx7}RtK?#6SYJp=PlQCc0V-lyb&*bBy;J}-67;X=rcsHhQE$pS0s~9+V!d% zAyr7mrE%I@tLe^`Hh zf9}2vxJ;X45s!5F(%PGxR$E;X!ajf}6=UeTWJrAL)jNn4s`V~yQm z=AoHY1GP>t?V60K<{{km{jzP0z@|%Dww0oNGq7ei1vgD1E~w>0musz6@y@P{Lm#=@ zow+9Zz6C3XO1Csx ztGdpAb56GqIn{Kr+)Z45FScghOSCwzIan+VDjViGeIP~T@p+-nceeJvp=bQHe)x}T zfeaX3ad_bH_m%NKKGW1(3oPiFS^IIBP;MsLa46u$G|d)!bS}nJL;N)Zr5IxT$ncO7 zBKR2fVyQvXvt;i6l>1SwStBnSs6Qn?jn+)5_^vr)k+%K(=PVvcBLAaB0N)*kzl;vm zCA})>9+h(Ams(MIkLkR#BJO8_A-c0a#hJ9&@NxDf`P*xLriEx)?qrhAX(tG585tM7 z*!1*uFh)x|bz8?}^Nz(6m4yc)6_YH?O0EMXj$LF%XTrID7zfkq5mVqUltaNAa!-6d6V)D}4@yto)9~ zL7X5C;Xuv!j3+;3diD*61|&JYocgGTn`r#Yv2G+s9QUrxH+Fs=zNcHP5kw zNbSMafC5}B9m~+UiqBG^_E}i~*XqssB2EpM`@-M2ws&o0m~DQyV*hA@=}rUR#xAwl zKn*fR{F>_ks)7KB`$dtq#&l~xM+(_%Ni&VI!yzB@$KEqaQW-J;udT4mg zyF&DJk*%6=mOVj67e#PL=lIFLcY){=`sCZvm4W=ePg2H?#tt!$3U;ZYS)5NE`qq4l z24wQk^s)y@Up`=cZr2j)t-Y`6Lyt^*tY&4}NAf|E>IXTcJ4K@mM;5botLHF;8sOyBYrvoWNh;J-!;+8nQ4TCWUfVN zwJg`QbFx+>9(VCWWu!@2_B5TUwI9lkFY25*N;kC?aTj=2K%fyV3B8TAI5S#WV+Ek! zGUGW0E!K*ABVx62SkjtnaNnc}knkSdd-=9*&TIiYACODD>t1@22S^CiQV=W&l@QyL zhahDNLf7g;|8P8Yc&4~1E>N~ZVr&su(hym6Jm?*2Dila?2*=|RU(zsa%hczl5Io`0+NzDe{6 z#MASu!?}gxNB2odqWJuNm{%&s(qRoM!lMYgAba|rUwG7FS?~KtRok5)#{<|S^8;Pv zWn%xdL3P%P=_3q$NY%A4qaE;V;-JWpRuh*W{>v2b*bktH5@&b)W;yXAhz+zMF zzI1+durowOV$8V;4Qg6D%xV|yyizl4*&#t}w3}tdx3DL+IFz|SY?Ew?KH^ZYspZMU?dXDzM+`&(9~n!+kR@hNN*dR%vTC75Z@+~bf=GW zPHWeZ$^gEndlF$X-@F*53v=3jG@t!lbERm(HBq>zOxw-u*H`TBdXnJxo0B}BWT9R% z^)0>A$=*$dAv?Tv^QSq-BiZ};6BdZ=`CRwA$!3>`I6`htjW@C-Xt1N}P)FSb$HBF# z>(d+uH0|9Yt0LN~d?I3&Zf_l#Z$=ix9P_UMbta8hayRx9sn7S)?!o86Jl4WFtD#Ip zc%oWL4xMp#KR~q#E{eDVu&Fj;o679o99JhychASnx~QQoaZ5B%xJB?T2bn^) z9D;$IB?(CcaFhBUBl+)zDw#<@^C#=erQ($w3RUX?4=2AK*K6er!9NQtW^Nxl0dh8{ znKh3?06zK;pVZPh5c->87fgK`x=?XwZ4V}sMK+h;X10J!{eVp8$VT z0sL2E9erkT-tA6a>30)9UE1e{3R3i+ZLCRB;U^4-FTS~Dk?B(xjUBjU0~E^N16`=M zWu9z97ioD~>>o73J^TWA3KLnjvNff*gB0(y75@V`g&1%f&keRkR$u*YN(V;FsZy`{ zM|bQ$`#dvZ>zxCx7KYFN0p1f*;n;1|Bk%awM{(-y<$nM#72B&&)Ib7GcJ%GzPyPXf z6Lb2`(^8OSe|o@9@}FpMov^_!|K}TAmN{}mJ1a-ZOjj15Im1ts$cdNURfdo4&+9tQ zDg)^1RjIVdP^|Xzcmvtuh;zHnHMgRQlr6uDJa+cuya03iTZ6KC1J6GCZds&n&|f@G zUVi!eCV*2?nZ=Wq%+0kw_~J`S=$s$z6XT+)vceAUy82%~ z@2a_qBRG;`qHgc==*dE>rBpuRcZGyMeV$d!#8$xxv%dZpiiTtOxAQ7UF*eDtj+JzN ze;%>1rmq3Lz(4$foI0Zv%Aq>IP6c3S$gZK)r^9^LTDZ9j0fj(KMVYEr^`FE`$3Lg?Iv!I+oORt>RY zi*t!P=qvKB0EBd^gP5&h(=IMntyt~V&3GLo*cQPkn-z+GDQQCEB1JW@xr$>;{Zgya z?_<7y9LMRdCtU>@p2lCF<*<-12gO-e9q(WSXM=Q8Z zolPHL=%n%U9=YR3pWeLcw*wnue(qye0y!1+;XUKLB5yWPLtiq^rbU)oa~4ajU#WWe z;=?rU%wnujqHSRu9BUsJoF?vvfZKXT#baqNCOH>)E2Rux?PB7alVshdD{qrYFV~3P-L2Jprh) z2%Y9iAfpxmOO;cC?#+jpDJhpqcAXeV7VNGg`H8oD=E-P@1)cf z$WA*Q-uB|Gj?Rw<_$K$=7VoM<%Mb8}k1+h72GDAl^zI62l5#mo(zd>)j~yTOb!C@9 zC1whxr4G{?A{Q?;;(hR;%%bP!_`y0N9PlSuWbjBfKncH{OLlJGfypwMxA-R3RB>^c zbU80DRIf5X98|Qa1d>JRRKf z2Mno4FmRo7v`GXBuW54`nz)v z*+D9LhEK_Y^vWE99NFVL|6QJ5A(k$~5z2!``%`Xw13dDpu+=#ewK|PK5iP>xl}8Cn z1Vi&@{m{2huGIa-SGp}j)V*UW#-@ku=(=WwR+cjIYR1)- zJ~=gW%jSZ6Yzyp1-8WHQ_Zl=cLcCR@q`9A07e&q z&pN2U$sy>T9#G09u;O-j7rqnN3t!{Q@E@y>5 zCj2t!zlL%EKFD5wzTWsv*Md9@m-CzWd~k6&s5k?Py7-s~m)i=_MciSFW^PT(|KnT8zC#2h6eF=j9e5K_8?T@)K#%)uNl#6;Kmybw&DdS0=JX$&aqG|a` zU9RX!P}V~%k+C%ZV}j<3L0 zhysx`9`mf+ySbp-vU{NRmTex_YLFfOv{4b)->2c*?{1ZW`;RyiRCg#U8do-7F@dmn z!bKAa`py{I&86nMlgqk&!*U3`(3A~@q8CrJ_hnhMU>2kC1a76?#gO@;>UB9)6k9l~ zlV0m~6Qm0zAixPAD$UAC?h*1l-z9LSOm3&VTt7&y9z<68&ZU4o7dvB*A=+_~mZux>~m&dx;9-`o^9p?#k1+ zuzJ4nXb~pv`}&D{mx)*2abqw$G%Ud2>XU9Lba&auc=-SPo((nm43eNcNQQic0-8d% zbU97WJiXy)XGp~MsUdUAfr`)&3p#b)apGZcvl);4#Ee$Mi+pw4HSa6|>M?-`TcrQ^ zA}R~TTeLP!=6DA;(~$Td7+tOnCS^=t6bzTo4zCOPxJJDVw5PQb#C+jA6~zzzX2nct zF^al0dUK}dwa|p^mu|yDSFXqL9qK7&(ZO6^vogNM0V0J5pr5bA7)TO_G9q<)Yf?h? z6;2l`vmGPk%PK(j3^NkS3_+w6yND#6;-7u%uon(pGMn{M^Z*9ydQD0RW8Gl+&)$1o z=Pll_m-V7_?p};3$VZEBQ#Jp-za`mj@w@|>cB1PFbMCw&{YPi)mB+aFH1UqqmBH*z zDpmZgQ7$0@V&05rQyI~e$X12fUOl`6j;f+)0+Gub-o#D4JvKVHN6`Cp7gPIG?wD6seFTV?lDHLqO(`189rF! z9P);d&oOWmW-YdFkuUP$E&gL~*BQ>;ZU^p2sA5jl1j@knasiX`+1Dz%8PhZ{C1a*+ z^#nbPqs9;?)S$AL-VrB)la&vcjpFQMhBzUt79w(<6+BXc?@!iciWFceQ^~)(_zD#; zRlkb|G{YM4x4_Gf}vOmv9JRYW1j@d!BJ4I1a>dHV#mb`U}>?h z!G>AARY|n*d6D7Qlg>7B<$?PSC7a?Po&$dcoarbxyVSmOvGJMuDe->aV-(B2E+Hk+i^Y})h6T}vJ zjs9laSbwt3!y8)~R6H!b_v`!(cx*)AY2DTl#6&&!Kdj@F9ZNbK1eqv84gJ)1BQEI*@-F5J=KbH>$hKVri=wcGyrm&nzOO{2DEUK_ z+h9?RbA-obI|%;tCUF1P861Se39T49{N2wV#u%^h@`+b-DAS%=(9Y3eCcbgFo=~b3P^)HPRe)I;(%u z^`1*z|B#b0@<#@ka34zJu+pL2laJ-SogWq)irM(k-5D~to=~=teI+ZOwG;cNCJEc- z6 zzb9)~w+|(^%KP$2-pW5Q8dNK%r&_D_O>v54J`{tTZw=I);D%tuE*jZaR+WC+pz}|R zg0W7IKOd>;M(FqctWugZ9hz7dZEbpe%J84LH%EZhR(8F$v_DBvQ)TSTCI3^c7T~rI zm5yuwEI?cPz0Z~W6Hq5NEKbGSW+(V$jZDtQGXA5lM&;NYK zfW{Se45n^S*SwSOyo#Tz5^ zS!JX1*hnD$$R6po8qY}j>dTYPUE^*va0(y&aUA)E*&S7mVKdkTFWjeF^ZJ>BcTnxLb@zjGLY{C%9~KA#MDOS)nW^w+G(-`?TpHGcjZTw9fDj$C7a+Ao$qWb&5a{lHzJ^KJ6L@ut857A82;}dh|kU<4O zL;cjN)34KLH!Zad?o-(bF2s1APaVq$`{`77p}{LakMLk8?lh76=92)(7-(ly(f4f| z^ZR-D8?l9hU^o0xjbaz`>XBZ`sj>4Zisx@F{zUR_jEBVR4)%Zcd>AB5wS+AkF~94= zX^gvW8FTMB^erOXX=(pCn|N3~cF;e?Y{g-pnP^fSGygsXY3fFZC73z%mlsE{7~kq~g0c&c6Xs=8 zaF>Ft3M%W8b`WBjI~)tnStDuIbVO11m43Y;M3bErdrCN#?fTU<9%!}kQF0)`W5jUe z9#Ax%*&s~pA=hNUOt^&K{MW$YcHEy1uO;b?!=*?&@G!GOF!-iEB7!^u5OWWoXe{Iz zpDh4YOdv(VYafIbAi1UQU&CF3CGEE$AcV}>?v$5Y%hIreD z=Aek^)1xrUkeikYl#&8HO!dOBRbxv({oHC%b`gpa35R;7!6VtO`Y!uwM}+F;NFqsQ zv7NRjlVjKJVQXQ+Lk&&cc;6>kATT_Y+4VH{BwH^1opO2TlPOvjUzZ;q&PGCkY_97( zu-EU<;jaytt>FFmF>C2^&1;uGHJ$oYkk>MTu4~+L4H1vn(vaNf(dP*e%e-i?$a;gi zYB^VK4Q2}D>GdJ&jL|ea z30Iz|qjK}1ARX~(Hg?`S$?HLRNm!lSmutze~OWiDq(lv2&T=DChir~Qzo80`489#dn3KX5qB90mXT+}n$kB*Wa)lo~KNAGuc zhS@YdssNTI|h=-mzRtW_ibso_4F;3jk@MA6{+M8(WZc4tiW#Yecy|m!J9%& z0P}8K^mMeOkA*El0%yMuT^#cZAL7P{J$v2uM=w5B`*njO&om_|z85)qI%gXOP_I~e zW+dDIiq)%QpV*4IxX)bN3VL0QPp<6_*g?tBY+ksVvqDlS?z5rCfi%Ruj0Op~DLYZ? z{fZ82upA$q{vTeS6kx0?G3f#kO zW6RGoHY=}u1)Faq@T`LS5FS%yFji zb(L>{PKvQkn|zyxgS!(m@*+!ILYl}G41@*88_sV0{1b)gdDK;9r@x6@s&K* zUXTOGKunw?Et+fG@`bH0mxm;fZGA5YE$1tKfG&FXnrK0W&Yc33m#abCQ20S75skxP zLUpmUA~xIM4QkJh)kUM30YkLXyyWzd6=z$@5_`}_3M|<7ONQmXyrFF)-IRUh+EB@E zosP&`2QYL>L0_zy{s_VP)DOsJfpf>3Zt$`&;R57JDKliSArs-7sF{+;b!(=o&_SP28qH_8NVyNaYAOCIe>?M;-_pPOebeY?B#CfYp~*GCuxJTW-0p;Q z%z#rFN#Z3f_<;v;?3xQDRusaIQbJtin4zKV4-%i=|HnO0@E#5OYk$Bo|2Akd&JkcC z|3#kpX0iU?2weaBh8+K!ItD`5sCP!G-2=LeoeAAuS*Cg}&oeLn2jay@HbcAp7wxib z1iRD7%)zE|5CpP_d1z_;E?81sm||uBz#%~-`cFlK`o&MrDNgBJK|~k+%p!tNICCk# zZLn!StnYu|hW|gHGyi@Pps?<+^uL7iL-?q_Lq+{x`I1MDB1yA@@S7c|(HyH7x64Ym z2EP=(ACmqHfSbv%c)OCSSeUnE0ik00oBWLR|Fx;@WNnGd6V1BmJsR&+;`ff&GE8L$ zmGsy3yauTW86a5tA>J*}<~JR%nXV(L?H;>&GJK{AP=-woH+*kg${LR}4#Cc&=pD8T;HGM*NZq)><)rV>j#wFy{F$)<_Hsmf4KbC;-GI9xRI|{nXFQkjS^|)Jf-p>Ym7bs6HkSDw(FJ0V z(52nFwR4WZlI_vPRTnikDFX)u0l$3X-|0yrMLcU#s0Ztnk4V93CIe67zOBf{&gwG| z5s7cwN#x*?dZLC81x7&8)!_=*P+Xo&TV+kUO*vEJQBXP$NL%snK~k6rq%cq>Hu7U)+TRuw^icSuo5OX*DV))Gh#@-?YPv&By0ioX`oP=VXt@g^8l#&5**BTvmZMY z;{VA8+=C_U(2~Y@Ncf5^%&nhY0BVXs$V*%MOm<5h@m$Yluas*8$kIs9hqJc71=nSx z0)c=OdUoYXOANihK}xLXbCdf^1u5Yh9X*AHc;*IxU81I7z`=T|$wn2sarTZt_)ebQ z?A8`x(XQ~O6gy#U_U04*T;sgKZttVC_R1lAEmSGPi_gB`vbDQ}GpD=rIvKu}XhMJE zHK7fQ_jAe~agKqvHjR(|R*aTCwDNNB=NPZSWaj05I3|2?4uS95lVvIonE7u_?v%eK z1ay(r;GNrV2uqY9J{=RZKvtKz=Oy=7L0I7nPW{ECaLQLl@DM#L$*+zx_u-K_Y~p)$ zM??ezFhuRpZaLUQJ3iRtOSxP1kqWxO3o= z|DM*$kC2-ac@cm^@h}zJ{RS zTC2kEJ4$suZ~(*s_~zE|#-!BrKfiT{kf6ePeXndebYaWtI(1T;pN)WKVEBD+HeI4m z)&A6sN$SZ{%p|3_1y=3D@J4MZFC|sgk|)(OpQ7(-N{sO%SPl$d_mYO-rj7o%>t))^ z>{77A8S4&>^7jF{0t(EjyK7v!Pk%ezRE+`kxV~(JYVEQu6d_H3QR%$9K8~id2*)`M zKZ^g7jqEpl@WH}7Ohr+F#)YL{j)e2R@6qydwWQ#dDm>@)LT#nLce!~aJaM-N9Ff4v z*6KhI%e5cm*4wG4z*k3jwUg6jixbVt8RlliCFO2l68#gqMKf4Bd(J}47k?U#rvxuv zg%2xB@eYM2X32}O&S|BilICI*V5~%+izfaA+eNcHaEOnIODE1#q{tptqm0u(0h*ew zyfM^yMx`3f)g)1_!<`0~#lzvs8B2y<&!iE%<|N5O+sUw68Aey}P49oeO9A!>qL_y{ICys{3z9E@$ zO^0ZG_z!D}RXQnayTIAkw%pG*Ed3m}Xz$2a$pb}e?{qU3KOWYrFyDscwbm_@I7!KM zE59(;;v7m!2!?KX4m~Wq5ok76bfek&3gCFlmf@#)s=j&huhbM(W$-Q5w-0rUt0kuI zz*{VCpXtQ+nK)~f#YdJLo4MU{F!g@^&O2LHv!u+wMvWv9+onQuJm42%(!XAUWckk3hMi) zpT+pcCBWGOb?fTm$F&}ihvwg{l6JG@#EhrxWJfrb>QE#@ym}w7Mf{@A(tX1q|G*oT z!RJm|8h!=Ps;fK>eaE~U&H{NaYT^LR`a$%KjOy!PBqErl{g%LeqNUhOqo zHDHM417~r}f_IuJ2(Fn544rEqNZ<{Lvlf6XrL9*-Uu|#>h^dC zdAD|lTM0fWzG~%zXV3OhNT#{@PRrck9a6}=HW>5>v~Cid1dfVmxR5Ug{yq$iCfkm) zl}EpcJ_S4JQS=`kYimQ+^D8aU0Ft<2p!A2-&$e8i*fO;ihBy7RpwsM#a# zzq#^UsRtLXonky1m=I?JTAb^=v6gqAwXw-@{3bh4;|YaoeGTDNVU>r8C*JsUTRVfH zZHC(qI@BRqKV`*nFU!5K-1adqD{zD?nY6{zuP&l)BH6ELOT(d21=Q5q52fDn8Ab06ON87VN7lop zgN5Hs(e8=!L!W@NQ8TtwMtTr2<%SO0nFYQ-I~7GqpSt<{c58g?u;;H85@Q3{R|isb zV6eHo#aC|gX%;1kCi5**nGKZM87%1y;QMen#SVqY+2>VCb^(GIW@h%uef(;pIZzGMOQwjo)x5K(g5NCzbORq~kq;P;V{`GZG=wceuU=rD?J>>8I++?-)?MGgCR6@SR6MBtl{p`_Oa?8KBsCpHRZvn*TMrY7>@85)o+$mJUVT9 zl#VYRiq#G+?6Z<>n+Y&Z8?ovA_A|3HQm^RPqwPSC_;*{5ffER_XwW14)u@DmkeRcO zi>SJLT>h-{%)dPh!= z=NA_fU0toD#Vesv^`Xde_3X99}lbLh#XI^SupE2gKV z+Yosh7W**Zs09ttS>Mu!{2h~d@AXbaiLpV;8vCqZy*d*iC+gdW>-PPhzm4@lG^>4^ zcFWs_Bka29-T}ZVp0c#QblP~B_#^zqtl8Vz69*E%sv|rIs*DKN6B-AFjlQc24yiF= zkY`P%gFFz?fF$u=()t)KtSXnJk_ZpJ@QkS=o2}oDH=z@JUKqUbSs8p%jLy}%bR&Px zEKzqBPcn#O4wC6Qmk}4EZ{xqf4QL9|R{quVe(z50nw#sJQ~%AEnPa;0N)4t1@*-AT zG!G#-J@W`>=V9Y!m9T$t-EPS|9(1X9X)O3|PwDSLBX!Y^d=L_C&ssP2V2B}q6>Q$o zOd%9v0!zS2EeIhO81RS0?i@(*!r-`Z6XCR*SsrnAL9HAGx{tX(p{nJDUU&QnzdeE{ zfmxL}-~hoBS#7I5C^^A4Za3i6EzHwyoSyzjdAlQ7$M6IJq`@EIE<8>4sT7R{P1eym_}h3wMhh6E+7I-8XPCOhG22u;?M_-KyhfF z22^3qCKprhBNkpNJ#UpLGHhu#tTLD!TWl^Pwotd}Z42Tt1cv6O5tkKDc2Vr}A;?s8 zPY1xuNrH{yTwmFoJ8j)WIWOrOC@94shyjynWyH+kTBh5y()YvyL1_%Lotghs0`lKlY*5%e3vF z#{kmbsqKFIbvFn4R1-MLlV82Vi!p3MGID1hHjJWAhAOvrDtrY@Cr z)HsDCom`%5aR9X4Q^ASlriJ=;`@n8e{Q8pwaYgf9ZCGJh2x6>wwO|^=;X~1Ro?$QB zpZCHkm3b{L7ZPX0i&H_E{KpGHn9S{*7}c?x^An_sM_c81I2Y|JtVk|^>bOiI zeIHz^l4~4vJ{nu{!cEOn;pC$HNG?Gwuz8f^7%*A`_9iwXNgy5T|>{qz{q&57-%cncy2b*4g!y{b2p+oo2;CHti*NBwNgi9S@wdA8| zU0N-d0J$|3SB(X7tc$-_nO9ltMRV77Y<9=2J}^icSI@7>)VXY~4{~B@+s9rGcGO$3 zViOg7qfj#d9tel`S*ZfvE8!)CdODu!!w3TIwat@lg&}uZy8XY%$bT~S6g=RsG|akU z6h8UCA7=J9&xrf41m^x1Um}3c1bGZvK<%DOqL?bO`kl3~Yo@DrV^zsA`Bm$aD#Y;` zT9-Aax!T&P4mbntHCFoyys*g2M{jdk-&+C%YP|}XCMp>2r)}tOp7ai)z2&E-h8yn1 zm;)VgY#hn#uV@{6-p>H48BjRf>Z{J|kW)ul{DEk60!gjwRl3osU(>K34ITXI5G?Pi zYpz{LlT34PcPg<%u0xMCwPQTJqc@(dk)l9nIvHW>Kwu)c(toK1Zk|9mS3i=qdP3Db zNwC?nKn~Bk@aD@{n_cnY_n(_`A2dXbBj?2y1cg!BD7PYclf#=R;+dH(agQJ7>Yk}v zLQ>?LUF=$p;0#)*?72CTn`#ZdXRO~yug|2=Ks&|l^vHPrtHV8;ciw}P=sDbers>ZF zKS*q_gOJ4{YWJ1^LdG6`WS?tv{?3SlL}I^rt0<0hwboU;&Yc6&#}W(xs6& z_2fQ%*$GfKe)Va8o@yz89RwFJ$NN(%EcHANRr>a-b<{-Q);ej9UN1~sJ~Ef1aT&Yg zmx4Y$-D_h-_|{9r^z>$j4$69o6c@9Ip1+ru7lto=+mN>u{Y)pt4bRr>ly56l+I%<; zGH;lHh>+6`zTM^^QwL5)>5We?njHxBy-ZBR=Q|M{}Z)xB%YEv&=D)5M#I zD-Qlt$up2xR^dwq0RH+nu|)y)I!7rMcmX#r#x`xRWhB(aMs0J9F_?bfN=y?YPhz!UTbUiTTN?aU=An&7gn5fDC?|1ljF>~&+9NY$ujQ{q7Z&Ii zYg|~fIqL=Z?VU``&EM`34O57@aX!nP^atN;Urt|nlV#w|;1)4>Erz7HmiR*I$W&dYBJs zWz^E31I5r~{(xzDD~ZPof|P83Q^>*bJ7Ypc7wk4LY~j;+=!q*Uy(ki~sk~JWU7qX* z?X5Su1PQ6hvJnmCB^`C%mD07wOVojQ)rLmJLb;C;DKKvQ%AJmtz|E1J5?#DrbKkK?@0xa>%63I48s`BsA=RjEzX@o~h zD&_RVj?VL^yI}DXdxZSG5XfFNMG%9~M|w+3Zsb-6_SOW#J(}iEE3SU|`DYq5rtycE zRYk;(wpZpTTUIr{gvnoKSoUuvvuK0}FP_s1gRyGdGH_}P1?66yH-|>Y1YcMm&fmvm z|{G2g^tPR?Z7N_40Me{}nbgA`=x>Ox{ zVD*Qjr_|;+2>+c0*?T^!#Ut5vVG{9b&pmy@Q&%$)6WX`l%PKZssjL3!IrB7FU_=w@ z15`E82MdEbXu9YQH2j(3Loh#Q$MyhDNt>>dWV0p9!I?L1vPW&!XUo{2gwkt)o zBD)v@{jj<8rbNRiw$O!vfxCv=+vtR~F`~J9OV=IBjlp-ZjF2IHh&CKawHQNy{er!; z`>KC^yZ&JaYUml!W<~NiEeR4*@eA=x%krQ)imx;}bs?JY*$CD`{~Q%!{!!8#-}zD0 z7Gi6wqLAWMzuuScUu1mMRt4mq$wOmS7y5c3!~E9P0U+|r`Rar$3}_1G-NiH$NvLgj}f3e6yHI0CShYZwunA+-0&^-9)wtm{df8L zmr}(P43|w{=Z@xhMr};i*rTmuByKTrM1izMnJ3fC=R-!~O9d*usui^?KXY<(CNupY zd^UWP#-DLs8!CqKPm&Hoq|8w(L%NpmJ0SwN9$Y_#NsBJfc%M-E$7%mxdsiCO)R~5F z8WlaFX=SD&NYJBgW;#`{0#QPU+E%dCMB8zxLaarLf-G7ffrJF570)mbTUxP&fEH;~ z1gZ!@vLe;!AVxq45VFuv0t9kzOvt{>wJbXS=bRaP%+KV0`QH03&-=Vjz9f(606I~& zR-w77h|E&r@kd*qRO%0zd2g~K^(kEGK+XW3&9_|RaVPt;FsMeRw$9Vz(hrV~3*6`g z%MY>G+MMAm3#7kILzS~VIn7^BZLwmr6L9*AT-lbvC{A&Qsknnr5*c_EjIym|~faIvCzzQ8g>A4>K_y1}Nu8%0$feEndr)v;x!Rt?BB2Sa5T zu`MOo~M&Cl}bSDA6b6(RBMz$C$RGm$!^6YaMqos%b>9VNC2J zP9BPDvV7DgBFU!5&n3U0!~~|t@HzjO%E(LKp5%0iC)UTvmMas_D9Qk(;rwrgZOZl? za`&zDx2TVYzE~RS|23u}2?+&nsw*vvB~u=OU7KgBZvGm0Q{Rt(t zxXXr-X7pb9nec$!37k{1c(65qb4p6U1|HfIZw!V~8o+fAiGav7?X;5!Dv3)f&%ls& zV~%25!Esy$hQ&-NysK;%<8T5V?QC-V6YH199k%i24woFS<>bIvW}7jgGJB2*!|^my zw^s|Wv3rd3N1_z>M>Tro=g|Tcp5A#{Wr*ha9l=zNS#N^D4^qfUG7{;P)WRD$;zANS zD#zkBh5YOz4w@cwqF*HdB7;j*?tPwVC>AN6_05ZmFh@#=on{V$6i7jp5H)ZxGxt$V z{llvb&^_&>)*YWc(8f1_+&*`u}p2Ig(R}e?n8Y~v72uqJ05fj7LO{6yFZ0f zp`3XDyuD4q7{_~P_LhtjS1GQ&+WJNimxxE#5mykD;T!2Y+nC&xx28Py)I_e(&9Pwf z#vTO&(gUf#r}CObSBkru9Yi3A-&1irrxV@BkAD<^)<%RcnknlqEJlt)Y;kL73=$dx2L_Vx zrp2s7DXnQ9)rrB%GAZfR)Iw?HxzkCCr%E^cIIBJ~Pu-L1H0xXzhui6rlp>m@3-)_m znD>?HlbMn$ii6)K=Z$v)5%i^ywLv&)0fI8RSIPkAXEU55DimNjp6Cwf_Ggo_J7z;2 zkXvgyBy^cT<`(wpc>0UGrZVEJ z`Y-d;wq9JSFH=s)muwD-qwI)TH8OWnGipUs0x2YI9q7x<|7jIuKEn?gNkK{KEoN`A zHr||gOzADIbWHH_ch4qZV6H@y>d2xlH#wWH_WNcJE>I)yYHB*Dv4j-_oxYGP553#C zjxtJKx=38WWci4_W=Kd;Hc-wIb+1`;3FluSPDYL$3y$+Eq7*h(_pq4cCh5xf@%NFC z&_|4_xJC>NwBtO?X+pXL{>gcImjRthV@3`vj*7X8#l`-U-^iuw<00yC2&iZ zH0~f!&UKf{qXm8O#3_E+*Fu-;#|&xZ85TK z*gsFl`b=Q1%AwZW=^w$x8mnX}lLU_`K@dGPY|F6R)zCUWf&q>x zKy-N|h*l~Xpt3lqxeLQ;B&Wh;RJiQNps~^Wt~<1A*^k+=FsX5|52RyIuPb?uCR(<= ziHB##Rn6j&Z>}~TCZ>La#Nd8mbTO#nS<@%h8FqWZJ9s zU}GfLPQzlp#Udf<>fISrtIw)0d#P>K{e3<0WirkY`Oo12JLSO<_&4Y^K4Kd2b&}Vp zO@~If-kELfI6yUIr71hr;f&-gszABwLS68%xzf-lc<8P*->NZWpNrZgo5fB09Eiy@ z4i0HE;}n{T{qX(1Uzw=NE)ysLdQVeWHw^;d^C}djBjCms> zBz1rWe|wELy|OZkL4Dk&OCfWqUZMICffbdb4+xW>s z%oi~*6SDJiC>3FmJV~*c$AR&^3=n?*+~r*@loK}^7x8h#;T~@>tGU=rd&ux4&M99c zE%p`%O@G1~ofd+G4maC;#JVud7kk>hx(m=P5h<30gw`h`loV7`C4y?^t~m_UPM>&O zviuG}kKToZ($B;#x>l;HH{H|L%kmFSLOx=xMf6|;&n6FJN{#^KaX9G$b?HkGf@5;_ z{~of`|5Xqo)i@NbU53Ao!eDVnw+~J}X$1uZt`%^qrZcoYPUWfZAk7FC`1GvgV9X&rR7^36;VjgsU38e z)D}v4g!O@6Vnto^`7?08!R{m0RLC5w#RanVcYvT-g#QePywr@a-q@Zm8#^al zO1&QD%|ZuG%z+A?(<}_zg&IqCGJD=yJ~t(7)*ZsFrII&UL?yY-7SAaZNtR5#@}}1`kx>NqX@Wz2|T0MN%SP+Wmr8(92}|J%F2DCi2Tf242`c__B&$R`DMU!o+Q| a3=gX9OxC}$_D!AK+x9;3z1l6Gp87YCgZg9u literal 0 HcmV?d00001 diff --git a/admin/server/.gitignore b/admin/server/.gitignore new file mode 100644 index 0000000..81088be --- /dev/null +++ b/admin/server/.gitignore @@ -0,0 +1,15 @@ +.vscode/ +.vs/ +venv/ +__pycache__/ +*.pyc +media/* +vuedist/* +dist/* +!media/default/ +celerybeat.pid +celerybeat-schedule.bak +celerybeat-schedule.dat +celerybeat-schedule.dir +db.sqlite3 +server/conf.py \ No newline at end of file diff --git a/admin/server/Dockerfile b/admin/server/Dockerfile new file mode 100644 index 0000000..d35db3b --- /dev/null +++ b/admin/server/Dockerfile @@ -0,0 +1,10 @@ +FROM python:3.8-slim +WORKDIR /code +ADD . . +RUN sed -i -re 's/(deb|security)\.debian\.org/mirrors.aliyun.com/g' /etc/apt/sources.list &&\ + apt-get update && apt-get install -y gcc libpq-dev default-libmysqlclient-dev &&\ + apt-get clean && rm -rf /var/lib/apt/lists/* &&\ + pip install --no-cache-dir --trusted-host mirrors.aliyun.com -i https://mirrors.aliyun.com/pypi/simple/ supervisor &&\ + pip install --no-cache-dir --trusted-host mirrors.aliyun.com -i https://mirrors.aliyun.com/pypi/simple/ -r ./requirements.txt +EXPOSE 80 +ENTRYPOINT ["/bin/bash","-C","/code/start.sh"] diff --git a/admin/server/apps/crm/__init__.py b/admin/server/apps/crm/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/admin/server/apps/crm/admin.py b/admin/server/apps/crm/admin.py new file mode 100644 index 0000000..ef6eac8 --- /dev/null +++ b/admin/server/apps/crm/admin.py @@ -0,0 +1,94 @@ +from django.contrib import admin +from .models import ( + Category, Project, Coupon, Banner, Student, StudentCoupon, + Activity, Showcase, Exam, StudentHonor, StudentLevel, + CourseRegistration, ActivityRegistration, ExamRegistration +) + +@admin.register(Category) +class CategoryAdmin(admin.ModelAdmin): + list_display = ('name', 'color') + search_fields = ('name',) + +@admin.register(Project) +class ProjectAdmin(admin.ModelAdmin): + list_display = ('title', 'category', 'students', 'rating', 'created_at') + list_filter = ('category', 'created_at') + search_fields = ('title',) + +@admin.register(Coupon) +class CouponAdmin(admin.ModelAdmin): + list_display = ('title', 'amount', 'unit', 'expiry', 'status', 'issue_type') + list_filter = ('status', 'expiry', 'issue_type') + search_fields = ('title',) + filter_horizontal = ('applicable_projects',) + +@admin.register(Banner) +class BannerAdmin(admin.ModelAdmin): + list_display = ('id', 'image', 'link', 'sort_order', 'is_active') + list_editable = ('sort_order', 'is_active') + +@admin.register(Student) +class StudentAdmin(admin.ModelAdmin): + list_display = ('name', 'phone', 'age', 'learning_count', 'created_at') + search_fields = ('name', 'phone') + inlines = [] + +class StudentCouponInline(admin.TabularInline): + model = StudentCoupon + extra = 1 + +StudentAdmin.inlines = [StudentCouponInline] + +@admin.register(StudentCoupon) +class StudentCouponAdmin(admin.ModelAdmin): + list_display = ('student', 'coupon', 'status', 'assigned_at') + list_filter = ('status',) + search_fields = ('student__name', 'coupon__title') + +@admin.register(Activity) +class ActivityAdmin(admin.ModelAdmin): + list_display = ('title', 'start_time', 'status', 'current_participants', 'max_participants') + list_filter = ('status', 'start_time') + search_fields = ('title', 'location') + +@admin.register(Showcase) +class ShowcaseAdmin(admin.ModelAdmin): + list_display = ('title', 'media_type', 'created_at') + list_filter = ('media_type', 'created_at') + search_fields = ('title',) + +@admin.register(Exam) +class ExamAdmin(admin.ModelAdmin): + list_display = ('title', 'exam_date', 'level', 'fee', 'deadline') + list_filter = ('level', 'exam_date') + search_fields = ('title',) + +@admin.register(StudentHonor) +class StudentHonorAdmin(admin.ModelAdmin): + list_display = ('student', 'title', 'date_awarded') + search_fields = ('student__name', 'title') + +@admin.register(StudentLevel) +class StudentLevelAdmin(admin.ModelAdmin): + list_display = ('student', 'level', 'date_passed', 'exam') + list_filter = ('level',) + search_fields = ('student__name', 'level') + +@admin.register(CourseRegistration) +class CourseRegistrationAdmin(admin.ModelAdmin): + list_display = ('student', 'project', 'status', 'created_at') + list_filter = ('status', 'created_at') + search_fields = ('student__name', 'project__title') + +@admin.register(ActivityRegistration) +class ActivityRegistrationAdmin(admin.ModelAdmin): + list_display = ('student', 'activity', 'status', 'created_at') + list_filter = ('status', 'created_at') + search_fields = ('student__name', 'activity__title') + +@admin.register(ExamRegistration) +class ExamRegistrationAdmin(admin.ModelAdmin): + list_display = ('student', 'exam', 'status', 'created_at') + list_filter = ('status', 'created_at') + search_fields = ('student__name', 'exam__title') diff --git a/admin/server/apps/crm/apps.py b/admin/server/apps/crm/apps.py new file mode 100644 index 0000000..d721574 --- /dev/null +++ b/admin/server/apps/crm/apps.py @@ -0,0 +1,6 @@ +from django.apps import AppConfig + + +class CrmConfig(AppConfig): + name = 'apps.crm' + verbose_name = 'CRM客户管理' diff --git a/admin/server/apps/crm/management/__init__.py b/admin/server/apps/crm/management/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/admin/server/apps/crm/management/commands/__init__.py b/admin/server/apps/crm/management/commands/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/admin/server/apps/crm/management/commands/init_crm_data.py b/admin/server/apps/crm/management/commands/init_crm_data.py new file mode 100644 index 0000000..1fe6e9b --- /dev/null +++ b/admin/server/apps/crm/management/commands/init_crm_data.py @@ -0,0 +1,104 @@ +from django.core.management.base import BaseCommand +from apps.crm.models import Category, Project, Coupon, Banner, Student +from django.utils import timezone +import random + +class Command(BaseCommand): + help = 'Initialize CRM mock data' + + def handle(self, *args, **options): + self.stdout.write('Cleaning up old data...') + Category.objects.all().delete() + Project.objects.all().delete() + Coupon.objects.all().delete() + Banner.objects.all().delete() + Student.objects.all().delete() + + self.stdout.write('Creating Categories...') + categories_data = [ + {'name': '前端开发', 'color': 'bg-blue-100 text-blue-600'}, + {'name': '后端开发', 'color': 'bg-green-100 text-green-600'}, + {'name': '人工智能', 'color': 'bg-purple-100 text-purple-600'}, + {'name': '移动开发', 'color': 'bg-yellow-100 text-yellow-600'}, + {'name': '运维测试', 'color': 'bg-red-100 text-red-600'}, + ] + categories = [] + for data in categories_data: + cat = Category.objects.create(**data) + categories.append(cat) + self.stdout.write(f'Created category: {cat.name}') + + self.stdout.write('Creating Projects...') + projects_data = [ + {'title': 'Vue3实战教程', 'detail': '深入学习Vue3核心原理与实战应用...'}, + {'title': 'Django REST Framework入门', 'detail': '从零构建RESTful API...'}, + {'title': 'Python数据分析', 'detail': '使用Pandas和NumPy进行数据分析...'}, + {'title': 'Flutter跨平台开发', 'detail': '构建高性能移动应用...'}, + {'title': 'Docker容器化部署', 'detail': '掌握Docker容器技术...'}, + {'title': 'React Hooks进阶', 'detail': '精通React Hooks...'}, + {'title': 'Go语言高并发编程', 'detail': 'Go语言核心特性与并发模式...'}, + {'title': '机器学习基础', 'detail': '常用机器学习算法原理与实现...'}, + {'title': 'iOS Swift开发', 'detail': 'Swift语言基础与iOS应用开发...'}, + {'title': 'Kubernetes集群管理', 'detail': 'K8s集群部署与维护...'}, + ] + + projects = [] + for i, data in enumerate(projects_data): + cat = categories[i % len(categories)] + proj = Project.objects.create( + title=data['title'], + category=cat, + image=f'https://picsum.photos/seed/{i}/800/600', + detail=data['detail'], + students=random.randint(100, 1000), + rating=round(random.uniform(4.0, 5.0), 1), + duration=f'{random.randint(2, 8)} 周' + ) + projects.append(proj) + self.stdout.write(f'Created project: {proj.title}') + + self.stdout.write('Creating Coupons...') + coupons_data = [ + {'amount': '50', 'title': '新人专享券', 'desc': '全场通用,无门槛'}, + {'amount': '100', 'title': '进阶课程券', 'desc': '满500可用'}, + {'amount': '200', 'title': '高级课程券', 'desc': '满1000可用'}, + {'amount': '8.8', 'title': '限时折扣', 'desc': '全场8.8折', 'unit': '折'}, + {'amount': '500', 'title': 'VIP专属', 'desc': 'VIP会员专用'}, + ] + + for data in coupons_data: + Coupon.objects.create( + amount=data['amount'], + unit=data.get('unit', '元'), + title=data['title'], + desc=data['desc'], + expiry=timezone.now().date() + timezone.timedelta(days=random.randint(7, 30)) + ) + self.stdout.write(f'Created coupon: {data["title"]}') + + self.stdout.write('Creating Students...') + for i in range(10): + Student.objects.create( + name=f'学员{i+1}', + phone=f'1380013800{i}', + age=random.randint(18, 35), + education=random.choice(['本科', '硕士', '大专']), + address=f'北京市海淀区某街道{i+1}号', + learning_count=random.randint(1, 5), + coupon_count=random.randint(0, 3), + study_hours=random.randint(10, 100) + ) + self.stdout.write(f'Created student: {i+1}') + + self.stdout.write('Creating Banners...') + for i in range(3): + proj = random.choice(projects) + Banner.objects.create( + image=f'https://picsum.photos/seed/banner{i}/1920/600', + project=proj, + sort_order=i, + is_active=True + ) + self.stdout.write(f'Created banner {i+1} linking to {proj.title}') + + self.stdout.write(self.style.SUCCESS('Successfully initialized mock data')) diff --git a/admin/server/apps/crm/migrations/0001_initial.py b/admin/server/apps/crm/migrations/0001_initial.py new file mode 100644 index 0000000..93f9d61 --- /dev/null +++ b/admin/server/apps/crm/migrations/0001_initial.py @@ -0,0 +1,99 @@ +# Generated by Django 3.2.23 on 2025-11-28 06:13 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='Banner', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('image', models.URLField(verbose_name='图片URL')), + ('link', models.CharField(blank=True, max_length=200, null=True, verbose_name='跳转链接')), + ('sort_order', models.IntegerField(default=0, verbose_name='排序')), + ('is_active', models.BooleanField(default=True, verbose_name='是否启用')), + ], + options={ + 'verbose_name': '轮播图', + 'verbose_name_plural': '轮播图', + 'ordering': ['sort_order'], + }, + ), + migrations.CreateModel( + name='Category', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=50, verbose_name='分类名称')), + ('color', models.CharField(help_text='例如: bg-blue-100 text-blue-600', max_length=50, verbose_name='颜色类名')), + ], + options={ + 'verbose_name': '课程分类', + 'verbose_name_plural': '课程分类', + }, + ), + migrations.CreateModel( + name='Coupon', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('amount', models.CharField(max_length=10, verbose_name='面额')), + ('unit', models.CharField(default='元', max_length=10, verbose_name='单位')), + ('title', models.CharField(max_length=50, verbose_name='优惠券标题')), + ('desc', models.CharField(max_length=100, verbose_name='描述')), + ('expiry', models.DateField(verbose_name='过期时间')), + ('status', models.CharField(choices=[('available', '可领取'), ('claimed', '已领取'), ('used', '已使用'), ('expired', '已过期')], default='available', max_length=20, verbose_name='状态')), + ('color', models.CharField(default='from-blue-500 to-cyan-400', max_length=100, verbose_name='渐变色类名')), + ('bgStart', models.CharField(default='from-blue-50', max_length=50, verbose_name='背景起始色')), + ('bgEnd', models.CharField(default='to-cyan-50', max_length=50, verbose_name='背景结束色')), + ('shadow', models.CharField(default='shadow-blue-100', max_length=50, verbose_name='阴影类名')), + ], + options={ + 'verbose_name': '优惠券', + 'verbose_name_plural': '优惠券', + }, + ), + migrations.CreateModel( + name='Student', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=50, verbose_name='学员姓名')), + ('phone', models.CharField(max_length=20, verbose_name='联系电话')), + ('age', models.IntegerField(blank=True, null=True, verbose_name='年龄')), + ('education', models.CharField(blank=True, max_length=50, null=True, verbose_name='学历')), + ('address', models.CharField(blank=True, max_length=200, null=True, verbose_name='地址')), + ('avatar', models.URLField(default='https://images.unsplash.com/photo-1535713875002-d1d0cf377fde', verbose_name='头像URL')), + ('learning_count', models.IntegerField(default=0, verbose_name='在学课程数')), + ('coupon_count', models.IntegerField(default=0, verbose_name='优惠券数')), + ('study_hours', models.IntegerField(default=0, verbose_name='学习时长(小时)')), + ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='录入时间')), + ], + options={ + 'verbose_name': '学员信息', + 'verbose_name_plural': '学员信息', + }, + ), + migrations.CreateModel( + name='Project', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('title', models.CharField(max_length=100, verbose_name='项目名称')), + ('image', models.URLField(default='https://images.unsplash.com/photo-1526379095098-d400fd0bf935', verbose_name='封面图片URL')), + ('students', models.IntegerField(default=0, verbose_name='学习人数')), + ('rating', models.DecimalField(decimal_places=1, default=5.0, max_digits=3, verbose_name='评分')), + ('duration', models.CharField(default='4 周', max_length=20, verbose_name='时长')), + ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')), + ('category', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='projects', to='crm.category', verbose_name='所属分类')), + ], + options={ + 'verbose_name': '项目课程', + 'verbose_name_plural': '项目课程', + }, + ), + ] diff --git a/admin/server/apps/crm/migrations/0002_project_detail.py b/admin/server/apps/crm/migrations/0002_project_detail.py new file mode 100644 index 0000000..b5adbc4 --- /dev/null +++ b/admin/server/apps/crm/migrations/0002_project_detail.py @@ -0,0 +1,18 @@ +# Generated by Django 3.2.23 on 2025-11-28 07:06 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('crm', '0001_initial'), + ] + + operations = [ + migrations.AddField( + model_name='project', + name='detail', + field=models.TextField(blank=True, default='', verbose_name='项目详情'), + ), + ] diff --git a/admin/server/apps/crm/migrations/0003_banner_project.py b/admin/server/apps/crm/migrations/0003_banner_project.py new file mode 100644 index 0000000..fb7a655 --- /dev/null +++ b/admin/server/apps/crm/migrations/0003_banner_project.py @@ -0,0 +1,19 @@ +# Generated by Django 3.2.23 on 2025-11-28 07:15 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('crm', '0002_project_detail'), + ] + + operations = [ + migrations.AddField( + model_name='banner', + name='project', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='crm.project', verbose_name='关联项目'), + ), + ] diff --git a/admin/server/apps/crm/migrations/0004_auto_20251128_1719.py b/admin/server/apps/crm/migrations/0004_auto_20251128_1719.py new file mode 100644 index 0000000..a9c2bc1 --- /dev/null +++ b/admin/server/apps/crm/migrations/0004_auto_20251128_1719.py @@ -0,0 +1,40 @@ +# Generated by Django 3.2.23 on 2025-11-28 09:19 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('crm', '0003_banner_project'), + ] + + operations = [ + migrations.AddField( + model_name='coupon', + name='applicable_projects', + field=models.ManyToManyField(blank=True, related_name='coupons', to='crm.Project', verbose_name='适用项目'), + ), + migrations.AddField( + model_name='coupon', + name='issue_type', + field=models.CharField(choices=[('manual', '手动发放'), ('registration', '注册赠送'), ('project', '指定项目')], default='manual', max_length=20, verbose_name='发放类型'), + ), + migrations.CreateModel( + name='StudentCoupon', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('status', models.CharField(choices=[('assigned', '已分配'), ('used', '已使用'), ('expired', '已过期')], default='assigned', max_length=20, verbose_name='状态')), + ('assigned_at', models.DateTimeField(auto_now_add=True, verbose_name='分配时间')), + ('used_at', models.DateTimeField(blank=True, null=True, verbose_name='使用时间')), + ('coupon', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='assignments', to='crm.coupon', verbose_name='优惠券')), + ('student', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='student_coupons', to='crm.student', verbose_name='学员')), + ], + options={ + 'verbose_name': '学员优惠券', + 'verbose_name_plural': '学员优惠券', + 'ordering': ['-assigned_at'], + }, + ), + ] diff --git a/admin/server/apps/crm/migrations/0005_activity_exam_activityregistration_and_more.py b/admin/server/apps/crm/migrations/0005_activity_exam_activityregistration_and_more.py new file mode 100644 index 0000000..f3ea465 --- /dev/null +++ b/admin/server/apps/crm/migrations/0005_activity_exam_activityregistration_and_more.py @@ -0,0 +1,140 @@ +# Generated by Django 5.2.8 on 2025-11-29 09:02 + +import django.db.models.deletion +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('crm', '0004_auto_20251128_1719'), + ] + + operations = [ + migrations.CreateModel( + name='Activity', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('title', models.CharField(max_length=100, verbose_name='活动名称')), + ('cover_image', models.URLField(default='https://images.unsplash.com/photo-1511632765486-a01980e01a18', verbose_name='封面图片')), + ('description', models.TextField(verbose_name='活动详情')), + ('start_time', models.DateTimeField(verbose_name='开始时间')), + ('end_time', models.DateTimeField(verbose_name='结束时间')), + ('location', models.CharField(max_length=200, verbose_name='活动地点')), + ('max_participants', models.IntegerField(default=50, verbose_name='最大报名人数')), + ('current_participants', models.IntegerField(default=0, verbose_name='当前报名人数')), + ('status', models.CharField(choices=[('upcoming', '即将开始'), ('ongoing', '进行中'), ('ended', '已结束')], default='upcoming', max_length=20, verbose_name='状态')), + ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')), + ], + options={ + 'verbose_name': '演出活动', + 'verbose_name_plural': '演出活动', + }, + ), + migrations.CreateModel( + name='Exam', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('title', models.CharField(max_length=100, verbose_name='考试名称')), + ('description', models.TextField(verbose_name='考试说明')), + ('exam_date', models.DateTimeField(verbose_name='考试时间')), + ('level', models.CharField(max_length=50, verbose_name='考级等级')), + ('fee', models.DecimalField(decimal_places=2, default=0.0, max_digits=8, verbose_name='报名费')), + ('deadline', models.DateTimeField(verbose_name='报名截止时间')), + ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='发布时间')), + ], + options={ + 'verbose_name': '考级报名', + 'verbose_name_plural': '考级报名', + }, + ), + migrations.CreateModel( + name='ActivityRegistration', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('status', models.CharField(choices=[('pending', '待确认'), ('confirmed', '已报名'), ('cancelled', '已取消')], default='pending', max_length=20, verbose_name='状态')), + ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='报名时间')), + ('activity', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='registrations', to='crm.activity', verbose_name='活动')), + ('student', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='activity_registrations', to='crm.student', verbose_name='学员')), + ], + options={ + 'verbose_name': '活动报名', + 'verbose_name_plural': '活动报名', + }, + ), + migrations.CreateModel( + name='CourseRegistration', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('status', models.CharField(choices=[('pending', '待确认'), ('confirmed', '已报名'), ('cancelled', '已取消')], default='pending', max_length=20, verbose_name='状态')), + ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='报名时间')), + ('project', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='registrations', to='crm.project', verbose_name='课程')), + ('student', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='course_registrations', to='crm.student', verbose_name='学员')), + ], + options={ + 'verbose_name': '课程报名', + 'verbose_name_plural': '课程报名', + }, + ), + migrations.CreateModel( + name='ExamRegistration', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('status', models.CharField(choices=[('pending', '待缴费'), ('paid', '已缴费'), ('cancelled', '已取消')], default='pending', max_length=20, verbose_name='状态')), + ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='报名时间')), + ('exam', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='registrations', to='crm.exam', verbose_name='考试')), + ('student', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='exam_registrations', to='crm.student', verbose_name='学员')), + ], + options={ + 'verbose_name': '考级报名记录', + 'verbose_name_plural': '考级报名记录', + }, + ), + migrations.CreateModel( + name='Showcase', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('title', models.CharField(max_length=100, verbose_name='节目名称')), + ('description', models.TextField(blank=True, verbose_name='节目介绍')), + ('media_type', models.CharField(choices=[('image', '图片'), ('video', '视频')], default='image', max_length=10, verbose_name='媒体类型')), + ('media_url', models.URLField(verbose_name='媒体链接')), + ('cover_image', models.URLField(blank=True, null=True, verbose_name='封面图片')), + ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='发布时间')), + ('related_activity', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='crm.activity', verbose_name='关联活动')), + ], + options={ + 'verbose_name': '精彩节目', + 'verbose_name_plural': '精彩节目', + }, + ), + migrations.CreateModel( + name='StudentHonor', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('title', models.CharField(max_length=100, verbose_name='荣誉标题')), + ('image', models.URLField(blank=True, null=True, verbose_name='证书/奖状图片')), + ('date_awarded', models.DateField(verbose_name='获奖日期')), + ('description', models.TextField(blank=True, verbose_name='荣誉描述')), + ('student', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='honors', to='crm.student', verbose_name='学员')), + ], + options={ + 'verbose_name': '个人荣誉', + 'verbose_name_plural': '个人荣誉', + }, + ), + migrations.CreateModel( + name='StudentLevel', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('level', models.CharField(max_length=50, verbose_name='获得等级')), + ('date_passed', models.DateField(verbose_name='通过日期')), + ('certificate_image', models.URLField(blank=True, null=True, verbose_name='证书图片')), + ('exam', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='crm.exam', verbose_name='关联考试')), + ('student', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='levels', to='crm.student', verbose_name='学员')), + ], + options={ + 'verbose_name': '考级证书', + 'verbose_name_plural': '考级证书', + }, + ), + ] diff --git a/admin/server/apps/crm/migrations/__init__.py b/admin/server/apps/crm/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/admin/server/apps/crm/models.py b/admin/server/apps/crm/models.py new file mode 100644 index 0000000..cab7593 --- /dev/null +++ b/admin/server/apps/crm/models.py @@ -0,0 +1,246 @@ +from django.db import models +from apps.system.models import User +from django.db.models.signals import post_save, post_delete +from django.dispatch import receiver + +class Category(models.Model): + name = models.CharField(max_length=50, verbose_name="分类名称") + color = models.CharField(max_length=50, verbose_name="颜色类名", help_text="例如: bg-blue-100 text-blue-600") + + class Meta: + verbose_name = "课程分类" + verbose_name_plural = verbose_name + + def __str__(self): + return self.name + +class Project(models.Model): + title = models.CharField(max_length=100, verbose_name="项目名称") + category = models.ForeignKey(Category, on_delete=models.CASCADE, verbose_name="所属分类", related_name="projects") + image = models.URLField(verbose_name="封面图片URL", default="https://images.unsplash.com/photo-1526379095098-d400fd0bf935") + detail = models.TextField(verbose_name="项目详情", blank=True, default="") + students = models.IntegerField(default=0, verbose_name="学习人数") + rating = models.DecimalField(max_digits=3, decimal_places=1, default=5.0, verbose_name="评分") + duration = models.CharField(max_length=20, verbose_name="时长", default="4 周") + created_at = models.DateTimeField(auto_now_add=True, verbose_name="创建时间") + + class Meta: + verbose_name = "项目课程" + verbose_name_plural = verbose_name + + def __str__(self): + return self.title + +class Coupon(models.Model): + STATUS_CHOICES = ( + ('available', '可领取'), + ('claimed', '已领取'), + ('used', '已使用'), + ('expired', '已过期'), + ) + ISSUE_CHOICES = ( + ('manual', '手动发放'), + ('registration', '注册赠送'), + ('project', '指定项目'), + ) + + amount = models.CharField(max_length=10, verbose_name="面额") + unit = models.CharField(max_length=10, verbose_name="单位", default="元") + title = models.CharField(max_length=50, verbose_name="优惠券标题") + desc = models.CharField(max_length=100, verbose_name="描述") + expiry = models.DateField(verbose_name="过期时间") + status = models.CharField(max_length=20, choices=STATUS_CHOICES, default='available', verbose_name="状态") + issue_type = models.CharField(max_length=20, choices=ISSUE_CHOICES, default='manual', verbose_name="发放类型") + applicable_projects = models.ManyToManyField(Project, blank=True, related_name="coupons", verbose_name="适用项目") + + # UI样式字段 + color = models.CharField(max_length=100, verbose_name="渐变色类名", default="from-blue-500 to-cyan-400") + bgStart = models.CharField(max_length=50, verbose_name="背景起始色", default="from-blue-50") + bgEnd = models.CharField(max_length=50, verbose_name="背景结束色", default="to-cyan-50") + shadow = models.CharField(max_length=50, verbose_name="阴影类名", default="shadow-blue-100") + + class Meta: + verbose_name = "优惠券" + verbose_name_plural = verbose_name + + def __str__(self): + return self.title + +class Banner(models.Model): + image = models.URLField(verbose_name="图片URL") + project = models.ForeignKey(Project, on_delete=models.SET_NULL, null=True, blank=True, verbose_name="关联项目") + link = models.CharField(max_length=200, blank=True, null=True, verbose_name="跳转链接") + sort_order = models.IntegerField(default=0, verbose_name="排序") + is_active = models.BooleanField(default=True, verbose_name="是否启用") + + class Meta: + verbose_name = "轮播图" + verbose_name_plural = verbose_name + ordering = ['sort_order'] + + def __str__(self): + return f"Banner {self.id}" + +class Student(models.Model): + name = models.CharField(max_length=50, verbose_name="学员姓名") + phone = models.CharField(max_length=20, verbose_name="联系电话") + age = models.IntegerField(verbose_name="年龄", null=True, blank=True) + education = models.CharField(max_length=50, verbose_name="学历", null=True, blank=True) + address = models.CharField(max_length=200, verbose_name="地址", null=True, blank=True) + avatar = models.URLField(verbose_name="头像URL", default="https://images.unsplash.com/photo-1535713875002-d1d0cf377fde") + + # 统计数据 + learning_count = models.IntegerField(default=0, verbose_name="在学课程数") + coupon_count = models.IntegerField(default=0, verbose_name="优惠券数") + study_hours = models.IntegerField(default=0, verbose_name="学习时长(小时)") + + created_at = models.DateTimeField(auto_now_add=True, verbose_name="录入时间") + + class Meta: + verbose_name = "学员信息" + verbose_name_plural = verbose_name + + def __str__(self): + return self.name + +class StudentCoupon(models.Model): + STATUS_CHOICES = ( + ('assigned', '已分配'), + ('used', '已使用'), + ('expired', '已过期'), + ) + student = models.ForeignKey(Student, on_delete=models.CASCADE, related_name="student_coupons", verbose_name="学员") + coupon = models.ForeignKey(Coupon, on_delete=models.CASCADE, related_name="assignments", verbose_name="优惠券") + status = models.CharField(max_length=20, choices=STATUS_CHOICES, default='assigned', verbose_name="状态") + assigned_at = models.DateTimeField(auto_now_add=True, verbose_name="分配时间") + used_at = models.DateTimeField(null=True, blank=True, verbose_name="使用时间") + + class Meta: + verbose_name = "学员优惠券" + verbose_name_plural = verbose_name + ordering = ['-assigned_at'] + + def __str__(self): + return f"{self.student.name} - {self.coupon.title}" + +@receiver(post_save, sender=StudentCoupon) +def update_student_coupon_count_on_save(sender, instance, created, **kwargs): + student = instance.student + student.coupon_count = StudentCoupon.objects.filter(student=student).count() + student.save(update_fields=['coupon_count']) + +@receiver(post_delete, sender=StudentCoupon) +def update_student_coupon_count_on_delete(sender, instance, **kwargs): + student = instance.student + student.coupon_count = StudentCoupon.objects.filter(student=student).count() + student.save(update_fields=['coupon_count']) + +class Activity(models.Model): + title = models.CharField(max_length=100, verbose_name="活动名称") + cover_image = models.URLField(verbose_name="封面图片", default="https://images.unsplash.com/photo-1511632765486-a01980e01a18") + description = models.TextField(verbose_name="活动详情") + start_time = models.DateTimeField(verbose_name="开始时间") + end_time = models.DateTimeField(verbose_name="结束时间") + location = models.CharField(max_length=200, verbose_name="活动地点") + max_participants = models.IntegerField(default=50, verbose_name="最大报名人数") + current_participants = models.IntegerField(default=0, verbose_name="当前报名人数") + status = models.CharField(max_length=20, choices=(('upcoming', '即将开始'), ('ongoing', '进行中'), ('ended', '已结束')), default='upcoming', verbose_name="状态") + created_at = models.DateTimeField(auto_now_add=True, verbose_name="创建时间") + + class Meta: + verbose_name = "演出活动" + verbose_name_plural = verbose_name + + def __str__(self): + return self.title + +class Showcase(models.Model): + title = models.CharField(max_length=100, verbose_name="节目名称") + description = models.TextField(verbose_name="节目介绍", blank=True) + media_type = models.CharField(max_length=10, choices=(('image', '图片'), ('video', '视频')), default='image', verbose_name="媒体类型") + media_url = models.URLField(verbose_name="媒体链接") + cover_image = models.URLField(verbose_name="封面图片", blank=True, null=True) + related_activity = models.ForeignKey(Activity, on_delete=models.SET_NULL, null=True, blank=True, verbose_name="关联活动") + created_at = models.DateTimeField(auto_now_add=True, verbose_name="发布时间") + + class Meta: + verbose_name = "精彩节目" + verbose_name_plural = verbose_name + + def __str__(self): + return self.title + +class Exam(models.Model): + title = models.CharField(max_length=100, verbose_name="考试名称") + description = models.TextField(verbose_name="考试说明") + exam_date = models.DateTimeField(verbose_name="考试时间") + level = models.CharField(max_length=50, verbose_name="考级等级") + fee = models.DecimalField(max_digits=8, decimal_places=2, default=0.00, verbose_name="报名费") + deadline = models.DateTimeField(verbose_name="报名截止时间") + created_at = models.DateTimeField(auto_now_add=True, verbose_name="发布时间") + + class Meta: + verbose_name = "考级报名" + verbose_name_plural = verbose_name + + def __str__(self): + return self.title + +class StudentHonor(models.Model): + student = models.ForeignKey(Student, on_delete=models.CASCADE, related_name="honors", verbose_name="学员") + title = models.CharField(max_length=100, verbose_name="荣誉标题") + image = models.URLField(verbose_name="证书/奖状图片", blank=True, null=True) + date_awarded = models.DateField(verbose_name="获奖日期") + description = models.TextField(verbose_name="荣誉描述", blank=True) + + class Meta: + verbose_name = "个人荣誉" + verbose_name_plural = verbose_name + + def __str__(self): + return f"{self.student.name} - {self.title}" + +class StudentLevel(models.Model): + student = models.ForeignKey(Student, on_delete=models.CASCADE, related_name="levels", verbose_name="学员") + level = models.CharField(max_length=50, verbose_name="获得等级") + exam = models.ForeignKey(Exam, on_delete=models.SET_NULL, null=True, blank=True, verbose_name="关联考试") + date_passed = models.DateField(verbose_name="通过日期") + certificate_image = models.URLField(verbose_name="证书图片", blank=True, null=True) + + class Meta: + verbose_name = "考级证书" + verbose_name_plural = verbose_name + + def __str__(self): + return f"{self.student.name} - {self.level}" + +class CourseRegistration(models.Model): + student = models.ForeignKey(Student, on_delete=models.CASCADE, related_name="course_registrations", verbose_name="学员") + project = models.ForeignKey(Project, on_delete=models.CASCADE, related_name="registrations", verbose_name="课程") + status = models.CharField(max_length=20, choices=(('pending', '待确认'), ('confirmed', '已报名'), ('cancelled', '已取消')), default='pending', verbose_name="状态") + created_at = models.DateTimeField(auto_now_add=True, verbose_name="报名时间") + + class Meta: + verbose_name = "课程报名" + verbose_name_plural = verbose_name + +class ActivityRegistration(models.Model): + student = models.ForeignKey(Student, on_delete=models.CASCADE, related_name="activity_registrations", verbose_name="学员") + activity = models.ForeignKey(Activity, on_delete=models.CASCADE, related_name="registrations", verbose_name="活动") + status = models.CharField(max_length=20, choices=(('pending', '待确认'), ('confirmed', '已报名'), ('cancelled', '已取消')), default='pending', verbose_name="状态") + created_at = models.DateTimeField(auto_now_add=True, verbose_name="报名时间") + + class Meta: + verbose_name = "活动报名" + verbose_name_plural = verbose_name + +class ExamRegistration(models.Model): + student = models.ForeignKey(Student, on_delete=models.CASCADE, related_name="exam_registrations", verbose_name="学员") + exam = models.ForeignKey(Exam, on_delete=models.CASCADE, related_name="registrations", verbose_name="考试") + status = models.CharField(max_length=20, choices=(('pending', '待缴费'), ('paid', '已缴费'), ('cancelled', '已取消')), default='pending', verbose_name="状态") + created_at = models.DateTimeField(auto_now_add=True, verbose_name="报名时间") + + class Meta: + verbose_name = "考级报名记录" + verbose_name_plural = verbose_name + diff --git a/admin/server/apps/crm/serializers.py b/admin/server/apps/crm/serializers.py new file mode 100644 index 0000000..a02452c --- /dev/null +++ b/admin/server/apps/crm/serializers.py @@ -0,0 +1,110 @@ +from rest_framework import serializers +from .models import ( + Category, Project, Coupon, Banner, Student, StudentCoupon, + Activity, Showcase, Exam, StudentHonor, StudentLevel, + CourseRegistration, ActivityRegistration, ExamRegistration +) + +class CategorySerializer(serializers.ModelSerializer): + class Meta: + model = Category + fields = '__all__' + +class ProjectSerializer(serializers.ModelSerializer): + category_name = serializers.CharField(source='category.name', read_only=True) + category_color = serializers.CharField(source='category.color', read_only=True) + + class Meta: + model = Project + fields = '__all__' + +class CouponSerializer(serializers.ModelSerializer): + scope_text = serializers.SerializerMethodField() + applicable_project_titles = serializers.SerializerMethodField() + + class Meta: + model = Coupon + fields = '__all__' + + def get_scope_text(self, obj): + ids = list(obj.applicable_projects.values_list('id', flat=True)) + if not ids: + return '通用' + names = list(obj.applicable_projects.values_list('title', flat=True)) + return ','.join(names) + + def get_applicable_project_titles(self, obj): + return list(obj.applicable_projects.values_list('title', flat=True)) + +class StudentCouponSerializer(serializers.ModelSerializer): + coupon_detail = CouponSerializer(source='coupon', read_only=True) + + class Meta: + model = StudentCoupon + fields = '__all__' + +class BannerSerializer(serializers.ModelSerializer): + class Meta: + model = Banner + fields = '__all__' + +class StudentSerializer(serializers.ModelSerializer): + stats = serializers.SerializerMethodField() + coupons = serializers.PrimaryKeyRelatedField(many=True, read_only=True, source='student_coupons') + + class Meta: + model = Student + fields = ['id', 'name', 'phone', 'age', 'education', 'address', 'avatar', 'stats', 'coupons', 'created_at'] + read_only_fields = ['stats', 'coupons'] + + def get_stats(self, obj): + return { + "learning": obj.learning_count, + "coupons": obj.coupon_count, + "hours": obj.study_hours + } + +class ActivitySerializer(serializers.ModelSerializer): + class Meta: + model = Activity + fields = '__all__' + +class ShowcaseSerializer(serializers.ModelSerializer): + class Meta: + model = Showcase + fields = '__all__' + +class ExamSerializer(serializers.ModelSerializer): + class Meta: + model = Exam + fields = '__all__' + +class StudentHonorSerializer(serializers.ModelSerializer): + class Meta: + model = StudentHonor + fields = '__all__' + +class StudentLevelSerializer(serializers.ModelSerializer): + exam_title = serializers.CharField(source='exam.title', read_only=True) + + class Meta: + model = StudentLevel + fields = '__all__' + +class CourseRegistrationSerializer(serializers.ModelSerializer): + project_detail = ProjectSerializer(source='project', read_only=True) + class Meta: + model = CourseRegistration + fields = '__all__' + +class ActivityRegistrationSerializer(serializers.ModelSerializer): + activity_detail = ActivitySerializer(source='activity', read_only=True) + class Meta: + model = ActivityRegistration + fields = '__all__' + +class ExamRegistrationSerializer(serializers.ModelSerializer): + exam_detail = ExamSerializer(source='exam', read_only=True) + class Meta: + model = ExamRegistration + fields = '__all__' diff --git a/admin/server/apps/crm/tests.py b/admin/server/apps/crm/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/admin/server/apps/crm/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/admin/server/apps/crm/urls.py b/admin/server/apps/crm/urls.py new file mode 100644 index 0000000..35ce51e --- /dev/null +++ b/admin/server/apps/crm/urls.py @@ -0,0 +1,29 @@ +from django.urls import path, include +from rest_framework.routers import DefaultRouter +from .views import ( + CategoryViewSet, ProjectViewSet, CouponViewSet, BannerViewSet, StudentViewSet, StudentCouponViewSet, UserProfileView, UserCouponsView, + ActivityViewSet, ShowcaseViewSet, ExamViewSet, StudentHonorViewSet, StudentLevelViewSet, + CourseRegistrationViewSet, ActivityRegistrationViewSet, ExamRegistrationViewSet +) + +router = DefaultRouter() +router.register(r'categories', CategoryViewSet) +router.register(r'projects', ProjectViewSet) +router.register(r'coupons', CouponViewSet) +router.register(r'banners', BannerViewSet) +router.register(r'students', StudentViewSet) +router.register(r'student-coupons', StudentCouponViewSet) +router.register(r'activities', ActivityViewSet) +router.register(r'showcases', ShowcaseViewSet) +router.register(r'exams', ExamViewSet) +router.register(r'student-honors', StudentHonorViewSet) +router.register(r'student-levels', StudentLevelViewSet) +router.register(r'course-registrations', CourseRegistrationViewSet) +router.register(r'activity-registrations', ActivityRegistrationViewSet) +router.register(r'exam-registrations', ExamRegistrationViewSet) + +urlpatterns = [ + path('', include(router.urls)), + path('user', UserProfileView.as_view()), + path('user-coupons', UserCouponsView.as_view()), +] diff --git a/admin/server/apps/crm/views.py b/admin/server/apps/crm/views.py new file mode 100644 index 0000000..8667132 --- /dev/null +++ b/admin/server/apps/crm/views.py @@ -0,0 +1,172 @@ +from rest_framework import viewsets +from rest_framework import status +from rest_framework.decorators import action +from rest_framework.views import APIView +from rest_framework.response import Response +from rest_framework.permissions import AllowAny, IsAuthenticatedOrReadOnly +from .models import ( + Category, Project, Coupon, Banner, Student, StudentCoupon, + Activity, Showcase, Exam, StudentHonor, StudentLevel, + CourseRegistration, ActivityRegistration, ExamRegistration +) +from .serializers import ( + CategorySerializer, ProjectSerializer, CouponSerializer, BannerSerializer, StudentSerializer, StudentCouponSerializer, + ActivitySerializer, ShowcaseSerializer, ExamSerializer, StudentHonorSerializer, StudentLevelSerializer, + CourseRegistrationSerializer, ActivityRegistrationSerializer, ExamRegistrationSerializer +) + +class CategoryViewSet(viewsets.ModelViewSet): + queryset = Category.objects.all() + serializer_class = CategorySerializer + permission_classes = [AllowAny] + pagination_class = None # Return all categories without pagination for the app + search_fields = ['name'] + +class ProjectViewSet(viewsets.ModelViewSet): + queryset = Project.objects.select_related('category').all() + serializer_class = ProjectSerializer + permission_classes = [IsAuthenticatedOrReadOnly] + search_fields = ['title', 'category__name'] + filterset_fields = ['category'] + +class CouponViewSet(viewsets.ModelViewSet): + queryset = Coupon.objects.all() + serializer_class = CouponSerializer + permission_classes = [IsAuthenticatedOrReadOnly] + search_fields = ['title'] + filterset_fields = ['status'] + +class BannerViewSet(viewsets.ModelViewSet): + queryset = Banner.objects.select_related('project').all().order_by('sort_order') + serializer_class = BannerSerializer + permission_classes = [IsAuthenticatedOrReadOnly] + filterset_fields = ['is_active'] + +class StudentCouponViewSet(viewsets.ModelViewSet): + queryset = StudentCoupon.objects.select_related('student', 'coupon').all() + serializer_class = StudentCouponSerializer + permission_classes = [IsAuthenticatedOrReadOnly] + +class StudentViewSet(viewsets.ModelViewSet): + queryset = Student.objects.all() + serializer_class = StudentSerializer + permission_classes = [IsAuthenticatedOrReadOnly] + search_fields = ['name', 'phone'] + + def perform_create(self, serializer): + student = serializer.save() + auto_coupons = Coupon.objects.filter(issue_type='registration') + created = [] + for c in auto_coupons: + sc = StudentCoupon.objects.create(student=student, coupon=c) + created.append(sc) + student.coupon_count = StudentCoupon.objects.filter(student=student).count() + student.save(update_fields=['coupon_count']) + + @action(detail=True, methods=['post']) + def assign_coupon(self, request, pk=None): + student = self.get_object() + coupon_id = request.data.get('coupon_id') + try: + coupon = Coupon.objects.get(pk=coupon_id) + except Coupon.DoesNotExist: + return Response({"detail": "优惠券不存在"}, status=status.HTTP_404_NOT_FOUND) + sc = StudentCoupon.objects.create(student=student, coupon=coupon) + student.coupon_count = StudentCoupon.objects.filter(student=student).count() + student.save(update_fields=['coupon_count']) + return Response(StudentCouponSerializer(sc).data, status=status.HTTP_201_CREATED) + +class UserProfileView(APIView): + """ + Mock View for Mini Program to get 'current' user. + In a real app, this would get request.user. + Here we return the first student or a mock. + """ + permission_classes = [AllowAny] + + def get(self, request): + student = Student.objects.first() + if student: + serializer = StudentSerializer(student) + return Response(serializer.data) + else: + # Fallback if no student exists + return Response({ + "id": "8839201", + "name": "学员用户", + "avatar": "https://images.unsplash.com/photo-1535713875002-d1d0cf377fde?w=200&auto=format&fit=crop&q=60", + "stats": { + "learning": 0, + "coupons": 0, + "hours": 0 + } + }) + + def post(self, request): + # Handle profile update from Mini Program + student = Student.objects.first() + if student: + serializer = StudentSerializer(student, data=request.data, partial=True) + if serializer.is_valid(): + serializer.save() + return Response(serializer.data) + return Response(serializer.errors, status=400) + return Response({"message": "No user found"}, status=404) + +class UserCouponsView(APIView): + permission_classes = [AllowAny] + + def get(self, request): + student = Student.objects.first() + if not student: + return Response([]) + scs = StudentCoupon.objects.select_related('coupon').filter(student=student) + serializer = StudentCouponSerializer(scs, many=True) + return Response(serializer.data) + +class ActivityViewSet(viewsets.ModelViewSet): + queryset = Activity.objects.all().order_by('start_time') + serializer_class = ActivitySerializer + permission_classes = [AllowAny] # Allow public to view + filterset_fields = ['status'] + search_fields = ['title'] + +class ShowcaseViewSet(viewsets.ModelViewSet): + queryset = Showcase.objects.all().order_by('-created_at') + serializer_class = ShowcaseSerializer + permission_classes = [AllowAny] + +class ExamViewSet(viewsets.ModelViewSet): + queryset = Exam.objects.all().order_by('exam_date') + serializer_class = ExamSerializer + permission_classes = [AllowAny] + +class StudentHonorViewSet(viewsets.ModelViewSet): + queryset = StudentHonor.objects.select_related('student').all() + serializer_class = StudentHonorSerializer + permission_classes = [IsAuthenticatedOrReadOnly] + filterset_fields = ['student'] + +class StudentLevelViewSet(viewsets.ModelViewSet): + queryset = StudentLevel.objects.select_related('student', 'exam').all() + serializer_class = StudentLevelSerializer + permission_classes = [IsAuthenticatedOrReadOnly] + filterset_fields = ['student'] + +class CourseRegistrationViewSet(viewsets.ModelViewSet): + queryset = CourseRegistration.objects.select_related('student', 'project').all() + serializer_class = CourseRegistrationSerializer + permission_classes = [IsAuthenticatedOrReadOnly] + filterset_fields = ['student', 'status'] + +class ActivityRegistrationViewSet(viewsets.ModelViewSet): + queryset = ActivityRegistration.objects.select_related('student', 'activity').all() + serializer_class = ActivityRegistrationSerializer + permission_classes = [IsAuthenticatedOrReadOnly] + filterset_fields = ['student', 'status'] + +class ExamRegistrationViewSet(viewsets.ModelViewSet): + queryset = ExamRegistration.objects.select_related('student', 'exam').all() + serializer_class = ExamRegistrationSerializer + permission_classes = [IsAuthenticatedOrReadOnly] + filterset_fields = ['student', 'status'] diff --git a/admin/server/apps/monitor/__init__.py b/admin/server/apps/monitor/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/admin/server/apps/monitor/admin.py b/admin/server/apps/monitor/admin.py new file mode 100644 index 0000000..8c38f3f --- /dev/null +++ b/admin/server/apps/monitor/admin.py @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. diff --git a/admin/server/apps/monitor/apps.py b/admin/server/apps/monitor/apps.py new file mode 100644 index 0000000..e49ebca --- /dev/null +++ b/admin/server/apps/monitor/apps.py @@ -0,0 +1,6 @@ +from django.apps import AppConfig + + +class MonitorConfig(AppConfig): + name = 'apps.monitor' + verbose_name = '系统监控' diff --git a/admin/server/apps/monitor/middleware.py b/admin/server/apps/monitor/middleware.py new file mode 100644 index 0000000..038a432 --- /dev/null +++ b/admin/server/apps/monitor/middleware.py @@ -0,0 +1 @@ +from django.utils.deprecation import MiddlewareMixin diff --git a/admin/server/apps/monitor/migrations/__init__.py b/admin/server/apps/monitor/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/admin/server/apps/monitor/models.py b/admin/server/apps/monitor/models.py new file mode 100644 index 0000000..71a8362 --- /dev/null +++ b/admin/server/apps/monitor/models.py @@ -0,0 +1,3 @@ +from django.db import models + +# Create your models here. diff --git a/admin/server/apps/monitor/tests.py b/admin/server/apps/monitor/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/admin/server/apps/monitor/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/admin/server/apps/monitor/urls.py b/admin/server/apps/monitor/urls.py new file mode 100644 index 0000000..73ae248 --- /dev/null +++ b/admin/server/apps/monitor/urls.py @@ -0,0 +1,10 @@ +from django.urls import path, include +from rest_framework import routers +from .views import ServerInfoView, LogView, LogDetailView + + +urlpatterns = [ + path('log/', LogView.as_view()), + path('log//', LogDetailView.as_view()), + path('server/', ServerInfoView.as_view()), +] diff --git a/admin/server/apps/monitor/views.py b/admin/server/apps/monitor/views.py new file mode 100644 index 0000000..3a0cbca --- /dev/null +++ b/admin/server/apps/monitor/views.py @@ -0,0 +1,93 @@ +from django.shortcuts import render +import psutil +from rest_framework.response import Response +from rest_framework.views import APIView +from rest_framework.permissions import IsAuthenticated +from rest_framework.viewsets import ViewSet +from django.conf import settings +import os +from rest_framework import serializers, status +from drf_yasg import openapi +from drf_yasg.utils import swagger_auto_schema +# Create your views here. + +class ServerInfoView(APIView): + """ + 获取服务器状态信息 + """ + permission_classes = [IsAuthenticated] + def get(self, request, *args, **kwargs): + ret={'cpu':{}, 'memory':{}, 'disk':{}} + ret['cpu']['count'] = psutil.cpu_count() + ret['cpu']['lcount'] = psutil.cpu_count(logical=False) + ret['cpu']['percent'] = psutil.cpu_percent(interval=1) + memory = psutil.virtual_memory() + ret['memory']['total'] = round(memory.total/1024/1024/1024,2) + ret['memory']['used'] = round(memory.used/1024/1024/1024,2) + ret['memory']['percent'] = memory.percent + disk = psutil.disk_usage('/') + ret['disk']['total'] = round(disk.total/1024/1024/1024,2) + ret['disk']['used'] = round(disk.used/1024/1024/1024,2) + ret['disk']['percent'] = disk.percent + return Response(ret) + +def get_file_list(file_path): + dir_list = os.listdir(file_path) + if not dir_list: + return + else: + # 注意,这里使用lambda表达式,将文件按照最后修改时间顺序升序排列 + # os.path.getmtime() 函数是获取文件最后修改时间 + # os.path.getctime() 函数是获取文件最后创建时间 + dir_list = sorted(dir_list,key=lambda x: os.path.getmtime(os.path.join(file_path, x)), reverse=True) + # print(dir_list) + return dir_list + +class LogView(APIView): + + @swagger_auto_schema(manual_parameters=[ + openapi.Parameter('name', openapi.IN_QUERY, description='日志文件名', type=openapi.TYPE_STRING) + ]) + def get(self, request, *args, **kwargs): + """ + 查看最近的日志列表 + :query name + """ + logs =[] + name = request.GET.get('name', None) + # for root, dirs, files in os.walk(settings.LOG_PATH): + # files.reverse() + for file in get_file_list(settings.LOG_PATH): + if len(logs)>50:break + filepath = os.path.join(settings.LOG_PATH, file) + if name: + if name in filepath: + fsize = os.path.getsize(filepath) + if fsize: + logs.append({ + "name":file, + "filepath":filepath, + "size":round(fsize/1000,1) + }) + else: + fsize = os.path.getsize(filepath) + if fsize: + logs.append({ + "name":file, + "filepath":filepath, + "size":round(fsize/1000,1) + }) + return Response(logs) + +class LogDetailView(APIView): + + def get(self, request, name): + """ + 查看日志详情 + """ + try: + with open(os.path.join(settings.LOG_PATH, name)) as f: + data = f.read() + return Response(data) + except: + return Response('未找到', status=status.HTTP_404_NOT_FOUND) \ No newline at end of file diff --git a/admin/server/apps/system/__init__.py b/admin/server/apps/system/__init__.py new file mode 100644 index 0000000..f5317b9 --- /dev/null +++ b/admin/server/apps/system/__init__.py @@ -0,0 +1 @@ +default_app_config = 'apps.system.apps.SystemConfig' \ No newline at end of file diff --git a/admin/server/apps/system/admin.py b/admin/server/apps/system/admin.py new file mode 100644 index 0000000..e47b0d7 --- /dev/null +++ b/admin/server/apps/system/admin.py @@ -0,0 +1,11 @@ +from django.contrib import admin +from simple_history.admin import SimpleHistoryAdmin +from .models import User, Organization, Role, Permission, DictType, Dict, File +# Register your models here. +admin.site.register(User) +admin.site.register(Organization) +admin.site.register(Role) +admin.site.register(Permission) +admin.site.register(DictType) +admin.site.register(Dict, SimpleHistoryAdmin) +admin.site.register(File) \ No newline at end of file diff --git a/admin/server/apps/system/apps.py b/admin/server/apps/system/apps.py new file mode 100644 index 0000000..dfd43d1 --- /dev/null +++ b/admin/server/apps/system/apps.py @@ -0,0 +1,9 @@ +from django.apps import AppConfig + + +class SystemConfig(AppConfig): + name = 'apps.system' + verbose_name = '系统管理' + + def ready(self): + import apps.system.signals \ No newline at end of file diff --git a/admin/server/apps/system/authentication.py b/admin/server/apps/system/authentication.py new file mode 100644 index 0000000..3c85943 --- /dev/null +++ b/admin/server/apps/system/authentication.py @@ -0,0 +1,23 @@ +from django.contrib.auth.backends import ModelBackend +from django.db.models import Q +from django.contrib.auth import get_user_model + +UserModel = get_user_model() + + +class CustomBackend(ModelBackend): + def authenticate(self, request, username=None, password=None, **kwargs): + if username is None: + username = kwargs.get(UserModel.USERNAME_FIELD) + if username is None or password is None: + return + try: + user = UserModel._default_manager.get( + Q(username=username) | Q(phone=username) | Q(email=username)) + except UserModel.DoesNotExist: + # Run the default password hasher once to reduce the timing + # difference between an existing and a nonexistent user (#20760). + UserModel().set_password(password) + else: + if user.check_password(password) and self.user_can_authenticate(user): + return user diff --git a/admin/server/apps/system/filters.py b/admin/server/apps/system/filters.py new file mode 100644 index 0000000..4199790 --- /dev/null +++ b/admin/server/apps/system/filters.py @@ -0,0 +1,11 @@ +from django_filters import rest_framework as filters +from .models import User + + +class UserFilter(filters.FilterSet): + class Meta: + model = User + fields = { + 'name': ['exact', 'contains'], + 'is_active': ['exact'], + } diff --git a/admin/server/apps/system/migrations/0001_initial.py b/admin/server/apps/system/migrations/0001_initial.py new file mode 100644 index 0000000..a53a840 --- /dev/null +++ b/admin/server/apps/system/migrations/0001_initial.py @@ -0,0 +1,239 @@ +# Generated by Django 3.0.7 on 2021-02-27 14:29 + +from django.conf import settings +import django.contrib.auth.models +import django.contrib.auth.validators +from django.db import migrations, models +import django.db.models.deletion +import django.utils.timezone +import simple_history.models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ('auth', '0011_update_proxy_permissions'), + ] + + operations = [ + migrations.CreateModel( + name='User', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('password', models.CharField(max_length=128, verbose_name='password')), + ('last_login', models.DateTimeField(blank=True, null=True, verbose_name='last login')), + ('is_superuser', models.BooleanField(default=False, help_text='Designates that this user has all permissions without explicitly assigning them.', verbose_name='superuser status')), + ('username', models.CharField(error_messages={'unique': 'A user with that username already exists.'}, help_text='Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.', max_length=150, unique=True, validators=[django.contrib.auth.validators.UnicodeUsernameValidator()], verbose_name='username')), + ('first_name', models.CharField(blank=True, max_length=30, verbose_name='first name')), + ('last_name', models.CharField(blank=True, max_length=150, verbose_name='last name')), + ('email', models.EmailField(blank=True, max_length=254, verbose_name='email address')), + ('is_staff', models.BooleanField(default=False, help_text='Designates whether the user can log into this admin site.', verbose_name='staff status')), + ('is_active', models.BooleanField(default=True, help_text='Designates whether this user should be treated as active. Unselect this instead of deleting accounts.', verbose_name='active')), + ('date_joined', models.DateTimeField(default=django.utils.timezone.now, verbose_name='date joined')), + ('name', models.CharField(blank=True, max_length=20, null=True, verbose_name='姓名')), + ('phone', models.CharField(blank=True, max_length=11, null=True, unique=True, verbose_name='手机号')), + ('avatar', models.CharField(blank=True, default='/media/default/avatar.png', max_length=100, null=True, verbose_name='头像')), + ], + options={ + 'verbose_name': '用户信息', + 'verbose_name_plural': '用户信息', + 'ordering': ['id'], + }, + managers=[ + ('objects', django.contrib.auth.models.UserManager()), + ], + ), + migrations.CreateModel( + name='Dict', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('create_time', models.DateTimeField(default=django.utils.timezone.now, help_text='创建时间', verbose_name='创建时间')), + ('update_time', models.DateTimeField(auto_now=True, help_text='修改时间', verbose_name='修改时间')), + ('is_deleted', models.BooleanField(default=False, help_text='删除标记', verbose_name='删除标记')), + ('name', models.CharField(max_length=60, verbose_name='名称')), + ('code', models.CharField(blank=True, max_length=30, null=True, verbose_name='编号')), + ('description', models.TextField(blank=True, null=True, verbose_name='描述')), + ('sort', models.IntegerField(default=1, verbose_name='排序')), + ('is_used', models.BooleanField(default=True, verbose_name='是否有效')), + ('parent', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='system.Dict', verbose_name='父')), + ], + options={ + 'verbose_name': '字典', + 'verbose_name_plural': '字典', + }, + ), + migrations.CreateModel( + name='DictType', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('create_time', models.DateTimeField(default=django.utils.timezone.now, help_text='创建时间', verbose_name='创建时间')), + ('update_time', models.DateTimeField(auto_now=True, help_text='修改时间', verbose_name='修改时间')), + ('is_deleted', models.BooleanField(default=False, help_text='删除标记', verbose_name='删除标记')), + ('name', models.CharField(max_length=30, verbose_name='名称')), + ('code', models.CharField(max_length=30, unique=True, verbose_name='代号')), + ('parent', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='system.DictType', verbose_name='父')), + ], + options={ + 'verbose_name': '字典类型', + 'verbose_name_plural': '字典类型', + }, + ), + migrations.CreateModel( + name='Organization', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('create_time', models.DateTimeField(default=django.utils.timezone.now, help_text='创建时间', verbose_name='创建时间')), + ('update_time', models.DateTimeField(auto_now=True, help_text='修改时间', verbose_name='修改时间')), + ('is_deleted', models.BooleanField(default=False, help_text='删除标记', verbose_name='删除标记')), + ('name', models.CharField(max_length=60, verbose_name='名称')), + ('type', models.CharField(choices=[('公司', '公司'), ('部门', '部门')], default='部门', max_length=20, verbose_name='类型')), + ('parent', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='system.Organization', verbose_name='父')), + ], + options={ + 'verbose_name': '组织架构', + 'verbose_name_plural': '组织架构', + }, + ), + migrations.CreateModel( + name='Permission', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('create_time', models.DateTimeField(default=django.utils.timezone.now, help_text='创建时间', verbose_name='创建时间')), + ('update_time', models.DateTimeField(auto_now=True, help_text='修改时间', verbose_name='修改时间')), + ('is_deleted', models.BooleanField(default=False, help_text='删除标记', verbose_name='删除标记')), + ('name', models.CharField(max_length=30, verbose_name='名称')), + ('type', models.CharField(choices=[('目录', '目录'), ('菜单', '菜单'), ('接口', '接口')], default='接口', max_length=20, verbose_name='类型')), + ('is_frame', models.BooleanField(default=False, verbose_name='外部链接')), + ('sort', models.IntegerField(default=1, verbose_name='排序标记')), + ('method', models.CharField(blank=True, max_length=50, null=True, unique=True, verbose_name='方法/代号')), + ('parent', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='system.Permission', verbose_name='父')), + ], + options={ + 'verbose_name': '功能权限表', + 'verbose_name_plural': '功能权限表', + 'ordering': ['sort'], + }, + ), + migrations.CreateModel( + name='Position', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('create_time', models.DateTimeField(default=django.utils.timezone.now, help_text='创建时间', verbose_name='创建时间')), + ('update_time', models.DateTimeField(auto_now=True, help_text='修改时间', verbose_name='修改时间')), + ('is_deleted', models.BooleanField(default=False, help_text='删除标记', verbose_name='删除标记')), + ('name', models.CharField(max_length=32, unique=True, verbose_name='名称')), + ('description', models.CharField(blank=True, max_length=50, null=True, verbose_name='描述')), + ], + options={ + 'verbose_name': '职位/岗位', + 'verbose_name_plural': '职位/岗位', + }, + ), + migrations.CreateModel( + name='Role', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('create_time', models.DateTimeField(default=django.utils.timezone.now, help_text='创建时间', verbose_name='创建时间')), + ('update_time', models.DateTimeField(auto_now=True, help_text='修改时间', verbose_name='修改时间')), + ('is_deleted', models.BooleanField(default=False, help_text='删除标记', verbose_name='删除标记')), + ('name', models.CharField(max_length=32, unique=True, verbose_name='角色')), + ('datas', models.CharField(choices=[('全部', '全部'), ('自定义', '自定义'), ('同级及以下', '同级及以下'), ('本级及以下', '本级及以下'), ('本级', '本级'), ('仅本人', '仅本人')], default='本级及以下', max_length=50, verbose_name='数据权限')), + ('description', models.CharField(blank=True, max_length=50, null=True, verbose_name='描述')), + ('depts', models.ManyToManyField(blank=True, to='system.Organization', verbose_name='权限范围')), + ('perms', models.ManyToManyField(blank=True, to='system.Permission', verbose_name='功能权限')), + ], + options={ + 'verbose_name': '角色', + 'verbose_name_plural': '角色', + }, + ), + migrations.CreateModel( + name='HistoricalDict', + fields=[ + ('id', models.IntegerField(auto_created=True, blank=True, db_index=True, verbose_name='ID')), + ('create_time', models.DateTimeField(default=django.utils.timezone.now, help_text='创建时间', verbose_name='创建时间')), + ('update_time', models.DateTimeField(blank=True, editable=False, help_text='修改时间', verbose_name='修改时间')), + ('is_deleted', models.BooleanField(default=False, help_text='删除标记', verbose_name='删除标记')), + ('name', models.CharField(max_length=60, verbose_name='名称')), + ('code', models.CharField(blank=True, max_length=30, null=True, verbose_name='编号')), + ('description', models.TextField(blank=True, null=True, verbose_name='描述')), + ('sort', models.IntegerField(default=1, verbose_name='排序')), + ('is_used', models.BooleanField(default=True, verbose_name='是否有效')), + ('history_id', models.AutoField(primary_key=True, serialize=False)), + ('history_date', models.DateTimeField()), + ('history_change_reason', models.CharField(max_length=100, null=True)), + ('history_type', models.CharField(choices=[('+', 'Created'), ('~', 'Changed'), ('-', 'Deleted')], max_length=1)), + ('history_user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL)), + ('parent', models.ForeignKey(blank=True, db_constraint=False, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='+', to='system.Dict', verbose_name='父')), + ('type', models.ForeignKey(blank=True, db_constraint=False, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='+', to='system.DictType', verbose_name='类型')), + ], + options={ + 'verbose_name': 'historical 字典', + 'ordering': ('-history_date', '-history_id'), + 'get_latest_by': 'history_date', + }, + bases=(simple_history.models.HistoricalChanges, models.Model), + ), + migrations.CreateModel( + name='File', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('create_time', models.DateTimeField(default=django.utils.timezone.now, help_text='创建时间', verbose_name='创建时间')), + ('update_time', models.DateTimeField(auto_now=True, help_text='修改时间', verbose_name='修改时间')), + ('is_deleted', models.BooleanField(default=False, help_text='删除标记', verbose_name='删除标记')), + ('name', models.CharField(blank=True, max_length=100, null=True, verbose_name='名称')), + ('size', models.IntegerField(blank=True, default=1, null=True, verbose_name='文件大小')), + ('file', models.FileField(upload_to='%Y/%m/%d/', verbose_name='文件')), + ('mime', models.CharField(blank=True, max_length=120, null=True, verbose_name='文件格式')), + ('type', models.CharField(choices=[('文档', '文档'), ('视频', '视频'), ('音频', '音频'), ('图片', '图片'), ('其它', '其它')], default='文档', max_length=50, verbose_name='文件类型')), + ('path', models.CharField(blank=True, max_length=200, null=True, verbose_name='地址')), + ('create_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='file_create_by', to=settings.AUTH_USER_MODEL, verbose_name='创建人')), + ('update_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='file_update_by', to=settings.AUTH_USER_MODEL, verbose_name='最后编辑人')), + ], + options={ + 'verbose_name': '文件库', + 'verbose_name_plural': '文件库', + }, + ), + migrations.AddField( + model_name='dict', + name='type', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='system.DictType', verbose_name='类型'), + ), + migrations.AddField( + model_name='user', + name='dept', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='system.Organization', verbose_name='组织'), + ), + migrations.AddField( + model_name='user', + name='groups', + field=models.ManyToManyField(blank=True, help_text='The groups this user belongs to. A user will get all permissions granted to each of their groups.', related_name='user_set', related_query_name='user', to='auth.Group', verbose_name='groups'), + ), + migrations.AddField( + model_name='user', + name='position', + field=models.ManyToManyField(blank=True, to='system.Position', verbose_name='岗位'), + ), + migrations.AddField( + model_name='user', + name='roles', + field=models.ManyToManyField(blank=True, to='system.Role', verbose_name='角色'), + ), + migrations.AddField( + model_name='user', + name='superior', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL, verbose_name='上级主管'), + ), + migrations.AddField( + model_name='user', + name='user_permissions', + field=models.ManyToManyField(blank=True, help_text='Specific permissions for this user.', related_name='user_set', related_query_name='user', to='auth.Permission', verbose_name='user permissions'), + ), + migrations.AlterUniqueTogether( + name='dict', + unique_together={('name', 'is_used', 'type')}, + ), + ] diff --git a/admin/server/apps/system/migrations/0002_auto_20210718_0918.py b/admin/server/apps/system/migrations/0002_auto_20210718_0918.py new file mode 100644 index 0000000..eaaaa6c --- /dev/null +++ b/admin/server/apps/system/migrations/0002_auto_20210718_0918.py @@ -0,0 +1,23 @@ +# Generated by Django 3.1.7 on 2021-07-18 01:18 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('system', '0001_initial'), + ] + + operations = [ + migrations.AlterField( + model_name='permission', + name='method', + field=models.CharField(blank=True, max_length=50, null=True, verbose_name='方法/代号'), + ), + migrations.AlterField( + model_name='user', + name='first_name', + field=models.CharField(blank=True, max_length=150, verbose_name='first name'), + ), + ] diff --git a/admin/server/apps/system/migrations/0003_auto_20220227_1732.py b/admin/server/apps/system/migrations/0003_auto_20220227_1732.py new file mode 100644 index 0000000..89a4c54 --- /dev/null +++ b/admin/server/apps/system/migrations/0003_auto_20220227_1732.py @@ -0,0 +1,18 @@ +# Generated by Django 3.1.8 on 2022-02-27 09:32 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('system', '0002_auto_20210718_0918'), + ] + + operations = [ + migrations.AlterField( + model_name='role', + name='depts', + field=models.ManyToManyField(blank=True, related_name='roles', to='system.Organization', verbose_name='权限范围'), + ), + ] diff --git a/admin/server/apps/system/migrations/0004_auto_20251128_1413.py b/admin/server/apps/system/migrations/0004_auto_20251128_1413.py new file mode 100644 index 0000000..d85cccf --- /dev/null +++ b/admin/server/apps/system/migrations/0004_auto_20251128_1413.py @@ -0,0 +1,58 @@ +# Generated by Django 3.2.23 on 2025-11-28 06:13 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('system', '0003_auto_20220227_1732'), + ] + + operations = [ + migrations.AlterField( + model_name='dict', + name='id', + field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'), + ), + migrations.AlterField( + model_name='dicttype', + name='id', + field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'), + ), + migrations.AlterField( + model_name='file', + name='id', + field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'), + ), + migrations.AlterField( + model_name='historicaldict', + name='id', + field=models.BigIntegerField(auto_created=True, blank=True, db_index=True, verbose_name='ID'), + ), + migrations.AlterField( + model_name='organization', + name='id', + field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'), + ), + migrations.AlterField( + model_name='permission', + name='id', + field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'), + ), + migrations.AlterField( + model_name='position', + name='id', + field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'), + ), + migrations.AlterField( + model_name='role', + name='id', + field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'), + ), + migrations.AlterField( + model_name='user', + name='id', + field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'), + ), + ] diff --git a/admin/server/apps/system/migrations/0005_alter_historicaldict_options_alter_file_create_by_and_more.py b/admin/server/apps/system/migrations/0005_alter_historicaldict_options_alter_file_create_by_and_more.py new file mode 100644 index 0000000..29fdf84 --- /dev/null +++ b/admin/server/apps/system/migrations/0005_alter_historicaldict_options_alter_file_create_by_and_more.py @@ -0,0 +1,34 @@ +# Generated by Django 5.2.8 on 2025-11-29 09:02 + +import django.db.models.deletion +from django.conf import settings +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('system', '0004_auto_20251128_1413'), + ] + + operations = [ + migrations.AlterModelOptions( + name='historicaldict', + options={'get_latest_by': ('history_date', 'history_id'), 'ordering': ('-history_date', '-history_id'), 'verbose_name': 'historical 字典', 'verbose_name_plural': 'historical 字典'}, + ), + migrations.AlterField( + model_name='file', + name='create_by', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='%(class)s_create_by', to=settings.AUTH_USER_MODEL, verbose_name='创建人'), + ), + migrations.AlterField( + model_name='file', + name='update_by', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='%(class)s_update_by', to=settings.AUTH_USER_MODEL, verbose_name='最后编辑人'), + ), + migrations.AlterField( + model_name='historicaldict', + name='history_date', + field=models.DateTimeField(db_index=True), + ), + ] diff --git a/admin/server/apps/system/migrations/__init__.py b/admin/server/apps/system/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/admin/server/apps/system/mixins.py b/admin/server/apps/system/mixins.py new file mode 100644 index 0000000..b1a70c0 --- /dev/null +++ b/admin/server/apps/system/mixins.py @@ -0,0 +1,48 @@ +from django.db.models.query import QuerySet + +class CreateUpdateModelAMixin: + """ + 业务用基本表A用 + """ + def perform_create(self, serializer): + serializer.save(create_by = self.request.user) + + def perform_update(self, serializer): + serializer.save(update_by = self.request.user) + +class CreateUpdateModelBMixin: + """ + 业务用基本表B用 + """ + def perform_create(self, serializer): + serializer.save(create_by = self.request.user, belong_dept=self.request.user.dept) + + def perform_update(self, serializer): + serializer.save(update_by = self.request.user) + +class CreateUpdateCustomMixin: + """ + 整合 + """ + def perform_create(self, serializer): + if hasattr(self.queryset.model, 'belong_dept'): + serializer.save(create_by = self.request.user, belong_dept=self.request.user.dept) + else: + serializer.save(create_by = self.request.user) + def perform_update(self, serializer): + serializer.save(update_by = self.request.user) + +class OptimizationMixin: + """ + 性能优化,需要在序列化器里定义setup_eager_loading,可在必要的View下继承 + """ + def get_queryset(self): + queryset = self.queryset + if isinstance(queryset, QuerySet): + # Ensure queryset is re-evaluated on each request. + queryset = queryset.all() + if hasattr(self.get_serializer_class(), 'setup_eager_loading'): + queryset = self.get_serializer_class().setup_eager_loading(queryset) # 性能优化 + return queryset + + \ No newline at end of file diff --git a/admin/server/apps/system/models.py b/admin/server/apps/system/models.py new file mode 100644 index 0000000..d41ae4b --- /dev/null +++ b/admin/server/apps/system/models.py @@ -0,0 +1,218 @@ +from django.db import models +from django.contrib.auth.models import AbstractUser +from django.db.models.base import Model +import django.utils.timezone as timezone +from django.db.models.query import QuerySet + +from utils.model import SoftModel, BaseModel +from simple_history.models import HistoricalRecords + + + +class Position(BaseModel): + """ + 职位/岗位 + """ + name = models.CharField('名称', max_length=32, unique=True) + description = models.CharField('描述', max_length=50, blank=True, null=True) + + class Meta: + verbose_name = '职位/岗位' + verbose_name_plural = verbose_name + + def __str__(self): + return self.name + + +class Permission(SoftModel): + """ + 功能权限:目录,菜单,接口 + """ + menu_type_choices = ( + ('目录', '目录'), + ('菜单', '菜单'), + ('接口', '接口') + ) + name = models.CharField('名称', max_length=30) + type = models.CharField('类型', max_length=20, + choices=menu_type_choices, default='接口') + is_frame = models.BooleanField('外部链接', default=False) + sort = models.IntegerField('排序标记', default=1) + parent = models.ForeignKey('self', null=True, blank=True, + on_delete=models.SET_NULL, verbose_name='父') + method = models.CharField('方法/代号', max_length=50, null=True, blank=True) + + def __str__(self): + return self.name + + class Meta: + verbose_name = '功能权限表' + verbose_name_plural = verbose_name + ordering = ['sort'] + + +class Organization(SoftModel): + """ + 组织架构 + """ + organization_type_choices = ( + ('公司', '公司'), + ('部门', '部门') + ) + name = models.CharField('名称', max_length=60) + type = models.CharField('类型', max_length=20, + choices=organization_type_choices, default='部门') + parent = models.ForeignKey('self', null=True, blank=True, + on_delete=models.SET_NULL, verbose_name='父') + + class Meta: + verbose_name = '组织架构' + verbose_name_plural = verbose_name + + def __str__(self): + return self.name + + +class Role(SoftModel): + """ + 角色 + """ + data_type_choices = ( + ('全部', '全部'), + ('自定义', '自定义'), + ('同级及以下', '同级及以下'), + ('本级及以下', '本级及以下'), + ('本级', '本级'), + ('仅本人', '仅本人') + ) + name = models.CharField('角色', max_length=32, unique=True) + perms = models.ManyToManyField(Permission, blank=True, verbose_name='功能权限') + datas = models.CharField('数据权限', max_length=50, + choices=data_type_choices, default='本级及以下') + depts = models.ManyToManyField( + Organization, blank=True, verbose_name='权限范围', related_name='roles') + description = models.CharField('描述', max_length=50, blank=True, null=True) + + class Meta: + verbose_name = '角色' + verbose_name_plural = verbose_name + + def __str__(self): + return self.name + + +class User(AbstractUser): + """ + 用户 + """ + name = models.CharField('姓名', max_length=20, null=True, blank=True) + phone = models.CharField('手机号', max_length=11, + null=True, blank=True, unique=True) + avatar = models.CharField( + '头像', default='/media/default/avatar.png', max_length=100, null=True, blank=True) + dept = models.ForeignKey( + Organization, null=True, blank=True, on_delete=models.SET_NULL, verbose_name='组织') + position = models.ManyToManyField(Position, blank=True, verbose_name='岗位') + superior = models.ForeignKey( + 'self', null=True, blank=True, on_delete=models.SET_NULL, verbose_name='上级主管') + roles = models.ManyToManyField(Role, blank=True, verbose_name='角色') + + class Meta: + verbose_name = '用户信息' + verbose_name_plural = verbose_name + ordering = ['id'] + + def __str__(self): + return self.username + +class DictType(SoftModel): + """ + 数据字典类型 + """ + name = models.CharField('名称', max_length=30) + code = models.CharField('代号', unique=True, max_length=30) + parent = models.ForeignKey('self', null=True, blank=True, + on_delete=models.SET_NULL, verbose_name='父') + + class Meta: + verbose_name = '字典类型' + verbose_name_plural = verbose_name + + def __str__(self): + return self.name + + +class Dict(SoftModel): + """ + 数据字典 + """ + name = models.CharField('名称', max_length=60) + code = models.CharField('编号', max_length=30, null=True, blank=True) + description = models.TextField('描述', blank=True, null=True) + type = models.ForeignKey( + DictType, on_delete=models.CASCADE, verbose_name='类型') + sort = models.IntegerField('排序', default=1) + parent = models.ForeignKey('self', null=True, blank=True, + on_delete=models.SET_NULL, verbose_name='父') + is_used = models.BooleanField('是否有效', default=True) + history = HistoricalRecords() + + class Meta: + verbose_name = '字典' + verbose_name_plural = verbose_name + unique_together = ('name', 'is_used', 'type') + + def __str__(self): + return self.name + +class CommonAModel(SoftModel): + """ + 业务用基本表A,包含create_by, update_by字段 + """ + create_by = models.ForeignKey( + User, null=True, blank=True, on_delete=models.SET_NULL, verbose_name='创建人', related_name= '%(class)s_create_by') + update_by = models.ForeignKey( + User, null=True, blank=True, on_delete=models.SET_NULL, verbose_name='最后编辑人', related_name= '%(class)s_update_by') + + class Meta: + abstract = True + +class CommonBModel(SoftModel): + """ + 业务用基本表B,包含create_by, update_by, belong_dept字段 + """ + create_by = models.ForeignKey( + User, null=True, blank=True, on_delete=models.SET_NULL, verbose_name='创建人', related_name = '%(class)s_create_by') + update_by = models.ForeignKey( + User, null=True, blank=True, on_delete=models.SET_NULL, verbose_name='最后编辑人', related_name = '%(class)s_update_by') + belong_dept = models.ForeignKey( + Organization, null=True, blank=True, on_delete=models.SET_NULL, verbose_name='所属部门', related_name= '%(class)s_belong_dept') + + class Meta: + abstract = True + + +class File(CommonAModel): + """ + 文件存储表,业务表根据具体情况选择是否外键关联 + """ + name = models.CharField('名称', max_length=100, null=True, blank=True) + size = models.IntegerField('文件大小', default=1, null=True, blank=True) + file = models.FileField('文件', upload_to='%Y/%m/%d/') + type_choices = ( + ('文档', '文档'), + ('视频', '视频'), + ('音频', '音频'), + ('图片', '图片'), + ('其它', '其它') + ) + mime = models.CharField('文件格式', max_length=120, null=True, blank=True) + type = models.CharField('文件类型', max_length=50, choices=type_choices, default='文档') + path = models.CharField('地址', max_length=200, null=True, blank=True) + + class Meta: + verbose_name = '文件库' + verbose_name_plural = verbose_name + + def __str__(self): + return self.name \ No newline at end of file diff --git a/admin/server/apps/system/permission.py b/admin/server/apps/system/permission.py new file mode 100644 index 0000000..a7d961a --- /dev/null +++ b/admin/server/apps/system/permission.py @@ -0,0 +1,97 @@ +from django.core.cache import cache +from rest_framework.permissions import BasePermission +from utils.queryset import get_child_queryset2 +from .models import Organization, Permission +from django.db.models import Q + +def get_permission_list(user): + """ + 获取权限列表,可用redis存取 + """ + if user.is_superuser: + perms_list = ['admin'] + else: + perms = Permission.objects.none() + roles = user.roles.all() + if roles: + for i in roles: + perms = perms | i.perms.all() + perms_list = perms.values_list('method', flat=True) + perms_list = list(set(perms_list)) + cache.set(user.username + '__perms', perms_list, 60*60) + return perms_list + + +class RbacPermission(BasePermission): + """ + 基于角色的权限校验类 + """ + + def has_permission(self, request, view): + """ + 权限校验逻辑 + :param request: + :param view: + :return: + """ + if not request.user: + perms = ['visitor'] # 如果没有经过认证,视为游客 + else: + perms = cache.get(request.user.username + '__perms') + if not perms: + perms = get_permission_list(request.user) + if perms: + if 'admin' in perms: + return True + elif not hasattr(view, 'perms_map'): + return True + else: + perms_map = view.perms_map + _method = request._request.method.lower() + if perms_map: + for key in perms_map: + if key == _method or key == '*': + if perms_map[key] in perms or perms_map[key] == '*': + return True + return False + else: + return False + + def has_object_permission(self, request, view, obj): + """ + Return `True` if permission is granted, `False` otherwise. + """ + if not request.user: + return False + if hasattr(obj, 'belong_dept'): + has_obj_perm(request.user, obj) + return True + +def has_obj_perm(user, obj): + """ + 数据权限控权 + 返回对象的是否可以操作 + 需要控数据权限的表需有belong_dept, create_by, update_by字段(部门, 创建人, 编辑人) + 传入user, obj实例 + """ + roles = user.roles + data_range = roles.values_list('datas', flat=True) + if '全部' in data_range: + return True + elif '自定义' in data_range: + depts = Organization.objects.filter(roles__in = roles) + if obj.belong_dept not in depts: + return False + elif '同级及以下' in data_range: + if user.dept.parent: + belong_depts = get_child_queryset2(user.dept.parent) + if obj.belong_dept not in belong_depts: + return False + elif '本级及以下' in data_range: + belong_depts = get_child_queryset2(user.dept) + if obj.belong_dept not in belong_depts: + return False + elif '本级' in data_range: + if obj.belong_dept is not user.dept: + return False + return True \ No newline at end of file diff --git a/admin/server/apps/system/permission_data.py b/admin/server/apps/system/permission_data.py new file mode 100644 index 0000000..180a50b --- /dev/null +++ b/admin/server/apps/system/permission_data.py @@ -0,0 +1,98 @@ +from django.db.models import Q +from django.db.models.query import QuerySet +from rest_framework.generics import GenericAPIView +from apps.system.mixins import CreateUpdateModelBMixin +from apps.system.models import Organization +from utils.queryset import get_child_queryset2 + + +class RbacFilterSet(CreateUpdateModelBMixin, object): + """ + 数据权限控权返回的queryset + 在必须的View下继承 + 需要控数据权限的表需有belong_dept, create_by, update_by字段(部门, 创建人, 编辑人) + 带性能优化 + 包括必要的创建和编辑操作 + + 此处对性能有较大影响,根据业务需求进行修改或取舍 + """ + def get_queryset(self): + assert self.queryset is not None, ( + "'%s' should either include a `queryset` attribute, " + "or override the `get_queryset()` method." + % self.__class__.__name__ + ) + + queryset = self.queryset + if isinstance(queryset, QuerySet): + # Ensure queryset is re-evaluated on each request. + queryset = queryset.all() + + if hasattr(self.get_serializer_class(), 'setup_eager_loading'): + queryset = self.get_serializer_class().setup_eager_loading(queryset) # 性能优化 + + if self.request.user.is_superuser: + return queryset + + if hasattr(queryset.model, 'belong_dept'): + user = self.request.user + roles = user.roles + data_range = roles.values_list('datas', flat=True) + if '全部' in data_range: + return queryset + elif '自定义' in data_range: + queryset = queryset.filter(belong_dept__roles__in=roles) + return queryset + elif '同级及以下' in data_range: + if user.dept.parent: + belong_depts = get_child_queryset2(user.dept.parent) + queryset = queryset.filter(belong_dept__in = belong_depts) + return queryset + elif '本级及以下' in data_range: + belong_depts = get_child_queryset2(user.dept) + queryset = queryset.filter(belong_dept__in = belong_depts) + return queryset + elif '本级' in data_range: + queryset = queryset.filter(belong_dept = user.dept) + return queryset + elif '仅本人' in data_range: + queryset = queryset.filter(Q(create_by=user)|Q(update_by=user)) + return queryset + return queryset + + +def rbac_filter_queryset(user, queryset): + """ + 数据权限控权返回的queryset方法 + 需要控数据权限的表需有belong_dept, create_by, update_by字段(部门, 创建人, 编辑人) + 传入user实例,queryset + """ + if user.is_superuser: + return queryset + + roles = user.roles + data_range = roles.values_list('datas', flat=True) + if hasattr(queryset.model, 'belong_dept'): + if '全部' in data_range: + return queryset + elif '自定义' in data_range: + if roles.depts.exists(): + queryset = queryset.filter(belong_dept__in = roles.depts) + return queryset + elif '同级及以下' in data_range: + if user.dept.parent: + belong_depts = get_child_queryset2(user.dept.parent) + queryset = queryset.filter(belong_dept__in = belong_depts) + return queryset + elif '本级及以下' in data_range: + belong_depts = get_child_queryset2(user.dept) + queryset = queryset.filter(belong_dept__in = belong_depts) + return queryset + elif '本级' in data_range: + queryset = queryset.filter(belong_dept = user.dept) + return queryset + elif '仅本人' in data_range: + queryset = queryset.filter(Q(create_by=user)|Q(update_by=user)) + return queryset + return queryset + diff --git a/admin/server/apps/system/serializers.py b/admin/server/apps/system/serializers.py new file mode 100644 index 0000000..c422d08 --- /dev/null +++ b/admin/server/apps/system/serializers.py @@ -0,0 +1,187 @@ +import re + +from django_celery_beat.models import PeriodicTask, CrontabSchedule, IntervalSchedule +from rest_framework import serializers + +from .models import (Dict, DictType, File, Organization, Permission, Position, + Role, User) + +class IntervalSerializer(serializers.ModelSerializer): + class Meta: + model = IntervalSchedule + fields = '__all__' + +class CrontabSerializer(serializers.ModelSerializer): + class Meta: + model = CrontabSchedule + exclude = ['timezone'] + +class PTaskCreateUpdateSerializer(serializers.ModelSerializer): + class Meta: + model = PeriodicTask + fields = ['name', 'task', 'interval', 'crontab', 'args', 'kwargs'] + +class PTaskSerializer(serializers.ModelSerializer): + interval_ = IntervalSerializer(source='interval', read_only=True) + crontab_ = CrontabSerializer(source='crontab', read_only=True) + schedule = serializers.SerializerMethodField() + timetype = serializers.SerializerMethodField() + class Meta: + model = PeriodicTask + fields = '__all__' + @staticmethod + def setup_eager_loading(queryset): + """ Perform necessary eager loading of data. """ + queryset = queryset.select_related('interval','crontab') + return queryset + + def get_schedule(self, obj): + if obj.interval: + return obj.interval.__str__() + if obj.crontab: + return obj.crontab.__str__() + return '' + + def get_timetype(self, obj): + if obj.interval: + return 'interval' + if obj.crontab: + return 'crontab' + return 'interval' + +class FileSerializer(serializers.ModelSerializer): + class Meta: + model = File + fields = "__all__" + +class DictTypeSerializer(serializers.ModelSerializer): + """ + 数据字典类型序列化 + """ + class Meta: + model = DictType + fields = '__all__' + + +class DictSerializer(serializers.ModelSerializer): + """ + 数据字典序列化 + """ + class Meta: + model = Dict + fields = '__all__' + + +class PositionSerializer(serializers.ModelSerializer): + """ + 岗位序列化 + """ + class Meta: + model = Position + fields = '__all__' + + +class RoleSerializer(serializers.ModelSerializer): + """ + 角色序列化 + """ + class Meta: + model = Role + fields = '__all__' + + +class PermissionSerializer(serializers.ModelSerializer): + """ + 权限序列化 + """ + class Meta: + model = Permission + fields = '__all__' + + +class OrganizationSerializer(serializers.ModelSerializer): + """ + 组织架构序列化 + """ + type = serializers.ChoiceField( + choices=Organization.organization_type_choices, default='部门') + + class Meta: + model = Organization + fields = '__all__' + +class UserSimpleSerializer(serializers.ModelSerializer): + class Meta: + model = User + fields = ['id', 'username', 'name'] + +class UserListSerializer(serializers.ModelSerializer): + """ + 用户列表序列化 + """ + dept_name = serializers.StringRelatedField(source='dept') + roles_name = serializers.StringRelatedField(source='roles', many=True) + avatar = serializers.SerializerMethodField() + + class Meta: + model = User + fields = ['id', 'name', 'phone', 'email', 'position', + 'username', 'is_active', 'date_joined', 'dept_name', 'dept', 'roles', 'avatar', 'roles_name'] + + def get_avatar(self, obj): + if obj.avatar and obj.avatar.startswith('/'): + request = self.context.get('request') + if request: + return request.build_absolute_uri(obj.avatar) + return obj.avatar + + @staticmethod + def setup_eager_loading(queryset): + """ Perform necessary eager loading of data. """ + queryset = queryset.select_related('superior','dept') + queryset = queryset.prefetch_related('roles',) + return queryset + +class UserModifySerializer(serializers.ModelSerializer): + """ + 用户编辑序列化 + """ + phone = serializers.CharField(max_length=11, required=False, allow_null=True) + + class Meta: + model = User + fields = ['id', 'username', 'name', 'phone', 'email', 'dept', + 'position', 'avatar', 'is_active', 'roles', 'is_superuser'] + + def validate_phone(self, phone): + if phone is not None: + re_phone = '^1[358]\d{9}$|^147\d{8}$|^176\d{8}$' + if not re.match(re_phone, phone): + raise serializers.ValidationError('手机号码不合法') + return phone + + +class UserCreateSerializer(serializers.ModelSerializer): + """ + 创建用户序列化 + """ + username = serializers.CharField(required=True) + phone = serializers.CharField(max_length=11, required=False) + + class Meta: + model = User + fields = ['id', 'username', 'name', 'phone', 'email', 'dept', + 'position', 'avatar', 'is_active', 'roles'] + + def validate_username(self, username): + if User.objects.filter(username=username): + raise serializers.ValidationError(username + ' 账号已存在') + return username + + def validate_phone(self, phone): + re_phone = '^1[358]\d{9}$|^147\d{8}$|^176\d{8}$' + if not re.match(re_phone, phone): + raise serializers.ValidationError('手机号码不合法') + if User.objects.filter(phone=phone): + raise serializers.ValidationError('手机号已经被注册') + return phone diff --git a/admin/server/apps/system/signals.py b/admin/server/apps/system/signals.py new file mode 100644 index 0000000..334bc57 --- /dev/null +++ b/admin/server/apps/system/signals.py @@ -0,0 +1,12 @@ +from django.db.models.signals import m2m_changed +from .models import Role, Permission, User +from django.dispatch import receiver +from django.core.cache import cache +from .permission import get_permission_list + +# 变更用户角色时动态更新权限或者前端刷新 +@receiver(m2m_changed, sender=User.roles.through) +def update_perms_cache_user(sender, instance, action, **kwargs): + if action in ['post_remove', 'post_add']: + if cache.get(instance.username+'__perms', None): + get_permission_list(instance) \ No newline at end of file diff --git a/admin/server/apps/system/tasks.py b/admin/server/apps/system/tasks.py new file mode 100644 index 0000000..6d2adae --- /dev/null +++ b/admin/server/apps/system/tasks.py @@ -0,0 +1,9 @@ +# Create your tasks here +from __future__ import absolute_import, unicode_literals + +from celery import shared_task + + +@shared_task +def show(): + print('ok') \ No newline at end of file diff --git a/admin/server/apps/system/tests.py b/admin/server/apps/system/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/admin/server/apps/system/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/admin/server/apps/system/urls.py b/admin/server/apps/system/urls.py new file mode 100644 index 0000000..02a4ecb --- /dev/null +++ b/admin/server/apps/system/urls.py @@ -0,0 +1,19 @@ +from django.urls import path, include +from .views import TaskList, UserViewSet, OrganizationViewSet, PermissionViewSet, RoleViewSet, PositionViewSet, TestView, DictTypeViewSet, DictViewSet, PTaskViewSet +from rest_framework import routers + + +router = routers.DefaultRouter() +router.register('user', UserViewSet, basename="user") +router.register('organization', OrganizationViewSet, basename="organization") +router.register('permission', PermissionViewSet, basename="permission") +router.register('role', RoleViewSet, basename="role") +router.register('position', PositionViewSet, basename="position") +router.register('dicttype', DictTypeViewSet, basename="dicttype") +router.register('dict', DictViewSet, basename="dict") +router.register('ptask', PTaskViewSet, basename="ptask") +urlpatterns = [ + path('', include(router.urls)), + path('task/', TaskList.as_view()), + path('test/', TestView.as_view()) +] diff --git a/admin/server/apps/system/views.py b/admin/server/apps/system/views.py new file mode 100644 index 0000000..69fd18b --- /dev/null +++ b/admin/server/apps/system/views.py @@ -0,0 +1,355 @@ +import logging + +from django.conf import settings +from django.contrib.auth.hashers import check_password, make_password +from django.core.cache import cache +from django_celery_beat.models import PeriodicTask, IntervalSchedule, CrontabSchedule +from django_filters.rest_framework import DjangoFilterBackend +from rest_framework import serializers, status +from rest_framework.decorators import action +from rest_framework.filters import OrderingFilter, SearchFilter +from rest_framework.mixins import (CreateModelMixin, DestroyModelMixin, + ListModelMixin, RetrieveModelMixin, + UpdateModelMixin) +from rest_framework.pagination import PageNumberPagination +from rest_framework.parsers import (FileUploadParser, JSONParser, + MultiPartParser) +from rest_framework.permissions import IsAuthenticated +from rest_framework.response import Response +from rest_framework.views import APIView +from rest_framework.viewsets import GenericViewSet, ModelViewSet +from rest_framework_simplejwt.tokens import RefreshToken +from rest_framework.exceptions import ValidationError, ParseError +from utils.queryset import get_child_queryset2 + +from .filters import UserFilter +from .mixins import CreateUpdateModelAMixin, OptimizationMixin +from .models import (Dict, DictType, File, Organization, Permission, Position, + Role, User) +from .permission import RbacPermission, get_permission_list +from .permission_data import RbacFilterSet +from .serializers import (DictSerializer, DictTypeSerializer, FileSerializer, + OrganizationSerializer, PermissionSerializer, + PositionSerializer, RoleSerializer, PTaskSerializer,PTaskCreateUpdateSerializer, + UserCreateSerializer, UserListSerializer, + UserModifySerializer) + +logger = logging.getLogger('log') +# logger.info('请求成功! response_code:{};response_headers:{};response_body:{}'.format(response_code, response_headers, response_body[:251])) +# logger.error('请求出错-{}'.format(error)) + +from server.celery import app as celery_app +class TaskList(APIView): + permission_classes = () + + def get(self, requests): + tasks = list(sorted(name for name in celery_app.tasks if not name.startswith('celery.'))) + return Response(tasks) + +class LogoutView(APIView): + permission_classes = [] + + def get(self, request, *args, **kwargs): # 可将token加入黑名单 + return Response(status=status.HTTP_200_OK) + +class PTaskViewSet(OptimizationMixin, ModelViewSet): + perms_map = {'get': '*', 'post': 'ptask_create', + 'put': 'ptask_update', 'delete': 'ptask_delete'} + queryset = PeriodicTask.objects.exclude(name__contains='celery.') + serializer_class = PTaskSerializer + search_fields = ['name'] + filterset_fields = ['enabled'] + ordering = ['-pk'] + + @action(methods=['put'], detail=True, perms_map={'put':'task_update'}, + url_name='task_toggle') + def toggle(self, request, pk=None): + """ + 修改启用禁用状态 + """ + obj = self.get_object() + obj.enabled = False if obj.enabled else True + obj.save() + return Response(status=status.HTTP_200_OK) + + def get_serializer_class(self): + if self.action in ['list', 'retrieve']: + return PTaskSerializer + return PTaskCreateUpdateSerializer + + def create(self, request, *args, **kwargs): + data = request.data + timetype = data.get('timetype', None) + interval_ = data.get('interval_', None) + crontab_ = data.get('crontab_', None) + if timetype == 'interval' and interval_: + data['crontab'] = None + try: + interval, _ = IntervalSchedule.objects.get_or_create(**interval_, defaults = interval_) + data['interval'] = interval.id + except: + raise ValidationError('时间策略有误') + if timetype == 'crontab' and crontab_: + data['interval'] = None + try: + crontab_['timezone'] = 'Asia/Shanghai' + crontab, _ = CrontabSchedule.objects.get_or_create(**crontab_, defaults = crontab_) + data['crontab'] = crontab.id + except: + raise ValidationError('时间策略有误') + serializer = self.get_serializer(data=data) + serializer.is_valid(raise_exception=True) + serializer.save() + return Response(status=status.HTTP_200_OK) + + def update(self, request, *args, **kwargs): + data = request.data + timetype = data.get('timetype', None) + interval_ = data.get('interval_', None) + crontab_ = data.get('crontab_', None) + if timetype == 'interval' and interval_: + data['crontab'] = None + try: + if 'id' in interval_: + del interval_['id'] + interval, _ = IntervalSchedule.objects.get_or_create(**interval_, defaults = interval_) + data['interval'] = interval.id + except: + raise ValidationError('时间策略有误') + if timetype == 'crontab' and crontab_: + data['interval'] = None + try: + crontab_['timezone'] = 'Asia/Shanghai' + if 'id'in crontab_: + del crontab_['id'] + crontab, _ = CrontabSchedule.objects.get_or_create(**crontab_, defaults = crontab_) + data['crontab'] = crontab.id + except: + raise ValidationError('时间策略有误') + instance = self.get_object() + serializer = self.get_serializer(instance, data=data) + serializer.is_valid(raise_exception=True) + serializer.save() + return Response(status=status.HTTP_200_OK) + + +class DictTypeViewSet(ModelViewSet): + """ + 数据字典类型-增删改查 + """ + perms_map = {'get': '*', 'post': 'dicttype_create', + 'put': 'dicttype_update', 'delete': 'dicttype_delete'} + queryset = DictType.objects.all() + serializer_class = DictTypeSerializer + pagination_class = None + search_fields = ['name'] + ordering_fields = ['pk'] + ordering = ['pk'] + + +class DictViewSet(ModelViewSet): + """ + 数据字典-增删改查 + """ + perms_map = {'get': '*', 'post': 'dict_create', + 'put': 'dict_update', 'delete': 'dict_delete'} + # queryset = Dict.objects.get_queryset(all=True) # 获取全部的,包括软删除的 + queryset = Dict.objects.all() + filterset_fields = ['type', 'is_used', 'type__code'] + serializer_class = DictSerializer + search_fields = ['name'] + ordering_fields = ['sort'] + ordering = ['sort'] + + def paginate_queryset(self, queryset): + """ + 如果查询参数里没有page但有type或type__code时则不分页,否则请求分页 + 也可用utils.pageornot方法 + """ + if self.paginator is None: + return None + elif (not self.request.query_params.get('page', None)) and ((self.request.query_params.get('type__code', None)) or (self.request.query_params.get('type', None))): + return None + return self.paginator.paginate_queryset(queryset, self.request, view=self) + +class PositionViewSet(ModelViewSet): + """ + 岗位-增删改查 + """ + perms_map = {'get': '*', 'post': 'position_create', + 'put': 'position_update', 'delete': 'position_delete'} + queryset = Position.objects.all() + serializer_class = PositionSerializer + pagination_class = None + search_fields = ['name','description'] + ordering_fields = ['pk'] + ordering = ['pk'] + + +class TestView(APIView): + perms_map = {'get': 'test_view'} # 单个API控权 + authentication_classes = [] + permission_classes = [] + def get(self, request, format=None): + return Response('测试api接口') + + +class PermissionViewSet(ModelViewSet): + """ + 权限-增删改查 + """ + perms_map = {'get': '*', 'post': 'perm_create', + 'put': 'perm_update', 'delete': 'perm_delete'} + queryset = Permission.objects.all() + serializer_class = PermissionSerializer + pagination_class = None + search_fields = ['name'] + ordering_fields = ['sort'] + ordering = ['sort', 'pk'] + + +class OrganizationViewSet(ModelViewSet): + """ + 组织机构-增删改查 + """ + perms_map = {'get': '*', 'post': 'org_create', + 'put': 'org_update', 'delete': 'org_delete'} + queryset = Organization.objects.all() + serializer_class = OrganizationSerializer + pagination_class = None + search_fields = ['name', 'type'] + ordering_fields = ['pk'] + ordering = ['pk'] + + +class RoleViewSet(ModelViewSet): + """ + 角色-增删改查 + """ + perms_map = {'get': '*', 'post': 'role_create', + 'put': 'role_update', 'delete': 'role_delete'} + queryset = Role.objects.all() + serializer_class = RoleSerializer + pagination_class = None + search_fields = ['name'] + ordering_fields = ['pk'] + ordering = ['pk'] + + +class UserViewSet(ModelViewSet): + """ + 用户管理-增删改查 + """ + perms_map = {'get': '*', 'post': 'user_create', + 'put': 'user_update', 'delete': 'user_delete'} + queryset = User.objects.all() + serializer_class = UserListSerializer + filterset_class = UserFilter + search_fields = ['username', 'name', 'phone', 'email'] + ordering_fields = ['-pk'] + + def perform_destroy(self, instance): + if instance.is_superuser: + raise ParseError('不能删除超级用户') + instance.delete() + + def get_queryset(self): + queryset = self.queryset + if hasattr(self.get_serializer_class(), 'setup_eager_loading'): + queryset = self.get_serializer_class().setup_eager_loading(queryset) # 性能优化 + dept = self.request.query_params.get('dept', None) # 该部门及其子部门所有员工 + if dept: + deptqueryset = get_child_queryset2(Organization.objects.get(pk=dept)) + queryset = queryset.filter(dept__in=deptqueryset) + return queryset + + def get_serializer_class(self): + # 根据请求类型动态变更serializer + if self.action == 'create': + return UserCreateSerializer + elif self.action == 'update': + return UserModifySerializer + elif self.action == 'list': + return UserListSerializer + return super().get_serializer_class() + + def create(self, request, *args, **kwargs): + # 创建用户默认添加密码 + password = request.data['password'] if 'password' in request.data else None + if password: + password = make_password(password) + else: + password = make_password('0000') + serializer = self.get_serializer(data=request.data) + serializer.is_valid(raise_exception=True) + serializer.save(password=password) + return Response(serializer.data) + + @action(methods=['put'], detail=False, permission_classes=[IsAuthenticated], # perms_map={'put':'change_password'} + url_name='change_password') + def password(self, request, pk=None): + """ + 修改密码 + """ + user = request.user + old_password = request.data['old_password'] + if check_password(old_password, user.password): + new_password1 = request.data['new_password1'] + new_password2 = request.data['new_password2'] + if new_password1 == new_password2: + user.set_password(new_password2) + user.save() + return Response('密码修改成功!', status=status.HTTP_200_OK) + else: + return Response('新密码两次输入不一致!', status=status.HTTP_400_BAD_REQUEST) + else: + return Response('旧密码错误!', status=status.HTTP_400_BAD_REQUEST) + + # perms_map={'get':'*'}, 自定义action控权 + @action(methods=['get'], detail=False, url_name='my_info', permission_classes=[IsAuthenticated]) + def info(self, request, pk=None): + """ + 初始化用户信息 + """ + user = request.user + perms = get_permission_list(user) + data = { + 'id': user.id, + 'username': user.username, + 'name': user.name, + 'roles': user.roles.values_list('name', flat=True), + 'avatar': request.build_absolute_uri(user.avatar) if user.avatar and user.avatar.startswith('/') else user.avatar, + 'perms': perms, + } + return Response(data) + +class FileViewSet(CreateModelMixin, DestroyModelMixin, RetrieveModelMixin, ListModelMixin, GenericViewSet): + """ + 文件上传用 + """ + perms_map = None + permission_classes=[IsAuthenticated] + parser_classes = [MultiPartParser, JSONParser] + queryset = File.objects.all() + serializer_class = FileSerializer + filterset_fields = ['type'] + search_fields = ['name'] + ordering = ['-create_time'] + + def perform_create(self, serializer): + fileobj = self.request.data.get('file') + name = fileobj._name + size = fileobj.size + mime = fileobj.content_type + type = '其它' + if 'image' in mime: + type = '图片' + elif 'video' in mime: + type = '视频' + elif 'audio' in mime: + type = '音频' + elif 'application' or 'text' in mime: + type = '文档' + instance = serializer.save(create_by = self.request.user, name=name, size=size, type=type, mime=mime) + instance.path = self.request.build_absolute_uri(settings.MEDIA_URL + instance.file.name) + instance.save() diff --git a/admin/server/apps/wf/__init__.py b/admin/server/apps/wf/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/admin/server/apps/wf/admin.py b/admin/server/apps/wf/admin.py new file mode 100644 index 0000000..8c38f3f --- /dev/null +++ b/admin/server/apps/wf/admin.py @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. diff --git a/admin/server/apps/wf/apps.py b/admin/server/apps/wf/apps.py new file mode 100644 index 0000000..f0709ed --- /dev/null +++ b/admin/server/apps/wf/apps.py @@ -0,0 +1,7 @@ +from django.apps import AppConfig + +class WfConfig(AppConfig): + name = 'apps.wf' + verbose_name = '工作流管理' + + diff --git a/admin/server/apps/wf/filters.py b/admin/server/apps/wf/filters.py new file mode 100644 index 0000000..02c9066 --- /dev/null +++ b/admin/server/apps/wf/filters.py @@ -0,0 +1,26 @@ +from django_filters import rest_framework as filters +from .models import Ticket +class TicketFilterSet(filters.FilterSet): + start_create = filters.DateFilter(field_name="create_time", lookup_expr='gte') + end_create = filters.DateFilter(field_name="create_time", lookup_expr='lte') + category = filters.ChoiceFilter(choices = Ticket.category_choices, method='filter_category') + + class Meta: + model = Ticket + fields = ['workflow', 'state', 'act_state', 'start_create', 'end_create', 'category'] + + def filter_category(self, queryset, name, value): + user=self.request.user + if value == 'owner': # 我的 + queryset = queryset.filter(create_by=user) + elif value == 'duty': # 待办 + queryset = queryset.filter(participant__contains=user.id).exclude(act_state__in=[Ticket.TICKET_ACT_STATE_FINISH, Ticket.TICKET_ACT_STATE_CLOSED]) + elif value == 'worked': # 处理过的 + queryset = queryset.filter(ticketflow_ticket__participant=user).exclude(create_by=user).order_by('-update_time').distinct() + elif value == 'cc': # 抄送我的 + queryset = queryset.filter(ticketflow_ticket__participant_cc__contains=user.id).exclude(create_by=user).order_by('-update_time').distinct() + elif value == 'all': + pass + else: + queryset = queryset.none() + return queryset \ No newline at end of file diff --git a/admin/server/apps/wf/migrations/0001_initial.py b/admin/server/apps/wf/migrations/0001_initial.py new file mode 100644 index 0000000..a7e9cba --- /dev/null +++ b/admin/server/apps/wf/migrations/0001_initial.py @@ -0,0 +1,177 @@ +# Generated by Django 3.1.8 on 2022-01-29 02:04 + +from django.conf import settings +from django.db import migrations, models +import jsonfield.fields +import django.db.models.deletion +import django.utils.timezone + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ('system', '0002_auto_20210718_0918'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.CreateModel( + name='State', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('create_time', models.DateTimeField(default=django.utils.timezone.now, help_text='创建时间', verbose_name='创建时间')), + ('update_time', models.DateTimeField(auto_now=True, help_text='修改时间', verbose_name='修改时间')), + ('is_deleted', models.BooleanField(default=False, help_text='删除标记', verbose_name='删除标记')), + ('name', models.CharField(max_length=50, verbose_name='名称')), + ('is_hidden', models.BooleanField(default=False, help_text='设置为True时,获取工单步骤api中不显示此状态(当前处于此状态时除外)', verbose_name='是否隐藏')), + ('sort', models.IntegerField(default=0, help_text='用于工单步骤接口时,step上状态的顺序(因为存在网状情况,所以需要人为设定顺序),值越小越靠前', verbose_name='状态顺序')), + ('type', models.IntegerField(choices=[(0, '普通'), (1, '开始'), (2, '结束')], default=0, help_text='0.普通类型 1.初始状态(用于新建工单时,获取对应的字段必填及transition信息) 2.结束状态(此状态下的工单不得再处理,即没有对应的transition)', verbose_name='状态类型')), + ('enable_retreat', models.BooleanField(default=False, help_text='开启后允许工单创建人在此状态直接撤回工单到初始状态', verbose_name='允许撤回')), + ('participant_type', models.IntegerField(blank=True, choices=[(0, '无处理人'), (1, '个人'), (2, '多人'), (4, '角色'), (6, '脚本'), (7, '工单的字段'), (9, '代码获取')], default=1, help_text='0.无处理人,1.个人,2.多人,3.部门,4.角色,5.变量(支持工单创建人,创建人的leader),6.脚本,7.工单的字段内容(如表单中的"测试负责人",需要为用户名或者逗号隔开的多个用户名),8.父工单的字段内容。 初始状态请选择类型5,参与人填create_by', verbose_name='参与者类型')), + ('participant', jsonfield.fields.JSONField(blank=True, default=list, help_text='可以为空(无处理人的情况,如结束状态)、userid、userid列表\\部门id\\角色id\\变量(create_by,create_by_tl)\\脚本记录的id等,包含子工作流的需要设置处理人为loonrobot', verbose_name='参与者')), + ('state_fields', jsonfield.fields.JSONField(default=dict, help_text='json格式字典存储,包括读写属性1:只读,2:必填,3:可选, 4:隐藏 示例:{"create_time":1,"title":2, "sn":1}, 内置特殊字段participant_info.participant_name:当前处理人信息(部门名称、角色名称),state.state_name:当前状态的状态名,workflow.workflow_name:工作流名称', verbose_name='表单字段')), + ('distribute_type', models.IntegerField(choices=[(1, '主动接单'), (2, '直接处理'), (3, '随机分配'), (4, '全部处理')], default=1, help_text='1.主动接单(如果当前处理人实际为多人的时候,需要先接单才能处理) 2.直接处理(即使当前处理人实际为多人,也可以直接处理) 3.随机分配(如果实际为多人,则系统会随机分配给其中一个人) 4.全部处理(要求所有参与人都要处理一遍,才能进入下一步)', verbose_name='分配方式')), + ('filter_policy', models.IntegerField(choices=[(0, '无'), (1, '和工单同属一及上级部门'), (2, '和创建人同属一及上级部门'), (3, '和上步处理人同属一及上级部门')], default=0, verbose_name='参与人过滤策略')), + ('participant_cc', jsonfield.fields.JSONField(blank=True, default=list, help_text='抄送给(userid列表)', verbose_name='抄送给')), + ('create_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='state_create_by', to=settings.AUTH_USER_MODEL, verbose_name='创建人')), + ('update_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='state_update_by', to=settings.AUTH_USER_MODEL, verbose_name='最后编辑人')), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='Ticket', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('create_time', models.DateTimeField(default=django.utils.timezone.now, help_text='创建时间', verbose_name='创建时间')), + ('update_time', models.DateTimeField(auto_now=True, help_text='修改时间', verbose_name='修改时间')), + ('is_deleted', models.BooleanField(default=False, help_text='删除标记', verbose_name='删除标记')), + ('title', models.CharField(blank=True, help_text='工单标题', max_length=500, null=True, verbose_name='标题')), + ('sn', models.CharField(help_text='工单的流水号', max_length=25, verbose_name='流水号')), + ('ticket_data', jsonfield.fields.JSONField(default=dict, help_text='工单自定义字段内容', verbose_name='工单数据')), + ('in_add_node', models.BooleanField(default=False, help_text='是否处于加签状态下', verbose_name='加签状态中')), + ('script_run_last_result', models.BooleanField(default=True, verbose_name='脚本最后一次执行结果')), + ('participant_type', models.IntegerField(choices=[(0, '无处理人'), (1, '个人'), (2, '多人'), (4, '角色'), (6, '脚本'), (7, '工单的字段'), (9, '代码获取')], default=0, help_text='0.无处理人,1.个人,2.多人', verbose_name='当前处理人类型')), + ('participant', jsonfield.fields.JSONField(blank=True, default=list, help_text='可以为空(无处理人的情况,如结束状态)、userid、userid列表', verbose_name='当前处理人')), + ('act_state', models.IntegerField(choices=[(0, '草稿中'), (1, '进行中'), (2, '被退回'), (3, '被撤回'), (4, '已完成'), (5, '已关闭')], default=1, help_text='当前工单的进行状态', verbose_name='进行状态')), + ('multi_all_person', jsonfield.fields.JSONField(blank=True, default=dict, help_text='需要当前状态处理人全部处理时实际的处理结果,json格式', verbose_name='全部处理的结果')), + ('add_node_man', models.ForeignKey(blank=True, help_text='加签操作的人,工单当前处理人处理完成后会回到该处理人,当处于加签状态下才有效', null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL, verbose_name='加签人')), + ('belong_dept', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='ticket_belong_dept', to='system.organization', verbose_name='所属部门')), + ('create_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='ticket_create_by', to=settings.AUTH_USER_MODEL, verbose_name='创建人')), + ('parent', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='wf.ticket', verbose_name='父工单')), + ('parent_state', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='ticket_parent_state', to='wf.state', verbose_name='父工单状态')), + ('state', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='ticket_state', to='wf.state', verbose_name='当前状态')), + ('update_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='ticket_update_by', to=settings.AUTH_USER_MODEL, verbose_name='最后编辑人')), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='Workflow', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('create_time', models.DateTimeField(default=django.utils.timezone.now, help_text='创建时间', verbose_name='创建时间')), + ('update_time', models.DateTimeField(auto_now=True, help_text='修改时间', verbose_name='修改时间')), + ('is_deleted', models.BooleanField(default=False, help_text='删除标记', verbose_name='删除标记')), + ('name', models.CharField(max_length=50, verbose_name='名称')), + ('key', models.CharField(blank=True, max_length=20, null=True, unique=True, verbose_name='工作流标识')), + ('sn_prefix', models.CharField(default='hb', max_length=50, verbose_name='流水号前缀')), + ('description', models.CharField(blank=True, max_length=200, null=True, verbose_name='描述')), + ('view_permission_check', models.BooleanField(default=True, help_text='开启后,只允许工单的关联人(创建人、曾经的处理人)有权限查看工单', verbose_name='查看权限校验')), + ('limit_expression', jsonfield.fields.JSONField(blank=True, default=dict, help_text='限制周期({"period":24} 24小时), 限制次数({"count":1}在限制周期内只允许提交1次), 限制级别({"level":1} 针对(1单个用户 2全局)限制周期限制次数,默认特定用户);允许特定人员提交({"allow_persons":"zhangsan,lisi"}只允许张三提交工单,{"allow_depts":"1,2"}只允许部门id为1和2的用户提交工单,{"allow_roles":"1,2"}只允许角色id为1和2的用户提交工单)', verbose_name='限制表达式')), + ('display_form_str', jsonfield.fields.JSONField(blank=True, default=list, help_text='默认"[]",用于用户只有对应工单查看权限时显示哪些字段,field_key的list的json,如["days","sn"],内置特殊字段participant_info.participant_name:当前处理人信息(部门名称、角色名称),state.state_name:当前状态的状态名,workflow.workflow_name:工作流名称', verbose_name='展现表单字段')), + ('title_template', models.CharField(blank=True, default='{title}', help_text='工单字段的值可以作为参数写到模板中,格式如:你有一个待办工单:{title}', max_length=50, null=True, verbose_name='标题模板')), + ('content_template', models.CharField(blank=True, default='标题:{title}, 创建时间:{create_time}', help_text='工单字段的值可以作为参数写到模板中,格式如:标题:{title}, 创建时间:{create_time}', max_length=1000, null=True, verbose_name='内容模板')), + ('create_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='workflow_create_by', to=settings.AUTH_USER_MODEL, verbose_name='创建人')), + ('update_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='workflow_update_by', to=settings.AUTH_USER_MODEL, verbose_name='最后编辑人')), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='Transition', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('create_time', models.DateTimeField(default=django.utils.timezone.now, help_text='创建时间', verbose_name='创建时间')), + ('update_time', models.DateTimeField(auto_now=True, help_text='修改时间', verbose_name='修改时间')), + ('is_deleted', models.BooleanField(default=False, help_text='删除标记', verbose_name='删除标记')), + ('name', models.CharField(max_length=50, verbose_name='操作')), + ('timer', models.IntegerField(default=0, help_text='单位秒。处于源状态X秒后如果状态都没有过变化则自动流转到目标状态。设置时间有效', verbose_name='定时器(单位秒)')), + ('condition_expression', jsonfield.fields.JSONField(default=list, help_text='流转条件表达式,根据表达式中的条件来确定流转的下个状态,格式为[{"expression":"{days} > 3 and {days}<10", "target_state":11}] 其中{}用于填充工单的字段key,运算时会换算成实际的值,当符合条件下个状态将变为target_state_id中的值,表达式只支持简单的运算或datetime/time运算.loonflow会以首次匹配成功的条件为准,所以多个条件不要有冲突', max_length=1000, verbose_name='条件表达式')), + ('attribute_type', models.IntegerField(choices=[(1, '同意'), (2, '拒绝'), (3, '其他')], default=1, help_text='属性类型,1.同意,2.拒绝,3.其他', verbose_name='属性类型')), + ('field_require_check', models.BooleanField(default=True, help_text='默认在用户点击操作的时候需要校验工单表单的必填项,如果设置为否则不检查。用于如"退回"属性的操作,不需要填写表单内容', verbose_name='是否校验必填项')), + ('create_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='transition_create_by', to=settings.AUTH_USER_MODEL, verbose_name='创建人')), + ('destination_state', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='dstate_transition', to='wf.state', verbose_name='目的状态')), + ('source_state', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='sstate_transition', to='wf.state', verbose_name='源状态')), + ('update_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='transition_update_by', to=settings.AUTH_USER_MODEL, verbose_name='最后编辑人')), + ('workflow', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='wf.workflow', verbose_name='所属工作流')), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='TicketFlow', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('create_time', models.DateTimeField(default=django.utils.timezone.now, help_text='创建时间', verbose_name='创建时间')), + ('update_time', models.DateTimeField(auto_now=True, help_text='修改时间', verbose_name='修改时间')), + ('is_deleted', models.BooleanField(default=False, help_text='删除标记', verbose_name='删除标记')), + ('suggestion', models.CharField(blank=True, default='', max_length=10000, verbose_name='处理意见')), + ('participant_type', models.IntegerField(choices=[(0, '无处理人'), (1, '个人'), (2, '多人'), (4, '角色'), (6, '脚本'), (7, '工单的字段'), (9, '代码获取')], default=0, help_text='0.无处理人,1.个人,2.多人等', verbose_name='处理人类型')), + ('participant_str', models.CharField(blank=True, help_text='非人工处理的处理人相关信息', max_length=200, null=True, verbose_name='处理人')), + ('ticket_data', jsonfield.fields.JSONField(blank=True, default=dict, help_text='可以用于记录当前表单数据,json格式', verbose_name='工单数据')), + ('intervene_type', models.IntegerField(choices=[(0, '正常处理'), (1, '转交'), (2, '加签'), (3, '加签处理完成'), (4, '接单'), (5, '评论'), (6, '删除'), (7, '强制关闭'), (8, '强制修改状态'), (9, 'hook操作'), (10, '撤回'), (11, '抄送')], default=0, help_text='流转类型', verbose_name='干预类型')), + ('participant_cc', jsonfield.fields.JSONField(blank=True, default=list, help_text='抄送给(userid列表)', verbose_name='抄送给')), + ('participant', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='ticketflow_participant', to=settings.AUTH_USER_MODEL, verbose_name='处理人')), + ('state', models.ForeignKey(blank=True, default=0, on_delete=django.db.models.deletion.CASCADE, to='wf.state', verbose_name='当前状态')), + ('ticket', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='ticketflow_ticket', to='wf.ticket', verbose_name='关联工单')), + ('transition', models.ForeignKey(blank=True, help_text='与worklow.Transition关联, 为空时表示认为干预的操作', null=True, on_delete=django.db.models.deletion.CASCADE, to='wf.transition', verbose_name='流转id')), + ], + options={ + 'abstract': False, + }, + ), + migrations.AddField( + model_name='ticket', + name='workflow', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='wf.workflow', verbose_name='关联工作流'), + ), + migrations.AddField( + model_name='state', + name='workflow', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='wf.workflow', verbose_name='所属工作流'), + ), + migrations.CreateModel( + name='CustomField', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('create_time', models.DateTimeField(default=django.utils.timezone.now, help_text='创建时间', verbose_name='创建时间')), + ('update_time', models.DateTimeField(auto_now=True, help_text='修改时间', verbose_name='修改时间')), + ('is_deleted', models.BooleanField(default=False, help_text='删除标记', verbose_name='删除标记')), + ('field_type', models.CharField(choices=[('string', '字符串'), ('int', '整型'), ('float', '浮点'), ('boolean', '布尔'), ('date', '日期'), ('datetime', '日期时间'), ('radio', '单选'), ('checkbox', '多选'), ('select', '单选下拉'), ('selects', '多选下拉'), ('cascader', '单选级联'), ('cascaders', '多选级联'), ('select_dg', '弹框单选'), ('select_dgs', '弹框多选'), ('textarea', '文本域'), ('file', '附件')], help_text='string, int, float, date, datetime, radio, checkbox, select, selects, cascader, cascaders, select_dg, select_dgs,textarea, file', max_length=50, verbose_name='类型')), + ('field_key', models.CharField(help_text='字段类型请尽量特殊,避免与系统中关键字冲突', max_length=50, verbose_name='字段标识')), + ('field_name', models.CharField(max_length=50, verbose_name='字段名称')), + ('sort', models.IntegerField(default=0, help_text='工单基础字段在表单中排序为:流水号0,标题20,状态id40,状态名41,创建人80,创建时间100,更新时间120.前端展示工单信息的表单可以根据这个id顺序排列', verbose_name='排序')), + ('default_value', models.CharField(blank=True, help_text='前端展示时,可以将此内容作为表单中的该字段的默认值', max_length=100, null=True, verbose_name='默认值')), + ('description', models.CharField(blank=True, help_text='字段的描述信息,可用于显示在字段的下方对该字段的详细描述', max_length=100, null=True, verbose_name='描述')), + ('placeholder', models.CharField(blank=True, help_text='用户工单详情表单中作为字段的占位符显示', max_length=100, null=True, verbose_name='占位符')), + ('field_template', models.TextField(blank=True, help_text='文本域类型字段前端显示时可以将此内容作为字段的placeholder', null=True, verbose_name='文本域模板')), + ('boolean_field_display', jsonfield.fields.JSONField(blank=True, default=dict, help_text='当为布尔类型时候,可以支持自定义显示形式。{"1":"是","0":"否"}或{"1":"需要","0":"不需要"},注意数字也需要引号', verbose_name='布尔类型显示名')), + ('field_choice', jsonfield.fields.JSONField(blank=True, default=list, help_text='选项值,格式为list, 例["id":1, "name":"张三"]', verbose_name='选项值')), + ('label', models.CharField(default='', help_text='处理特殊逻辑使用,比如sys_user用于获取用户作为选项', max_length=1000, verbose_name='标签')), + ('is_hidden', models.BooleanField(default=False, help_text='可用于携带不需要用户查看的字段信息', verbose_name='是否隐藏')), + ('create_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='customfield_create_by', to=settings.AUTH_USER_MODEL, verbose_name='创建人')), + ('update_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='customfield_update_by', to=settings.AUTH_USER_MODEL, verbose_name='最后编辑人')), + ('workflow', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='wf.workflow', verbose_name='所属工作流')), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/admin/server/apps/wf/migrations/__init__.py b/admin/server/apps/wf/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/admin/server/apps/wf/models.py b/admin/server/apps/wf/models.py new file mode 100644 index 0000000..872b3f8 --- /dev/null +++ b/admin/server/apps/wf/models.py @@ -0,0 +1,237 @@ +from random import choice +from django.db import models +import jsonfield +from django.db.models.base import Model +import django.utils.timezone as timezone +from django.db.models.query import QuerySet +from apps.system.models import CommonAModel, CommonBModel, Organization, User, Dict, File +from utils.model import SoftModel, BaseModel +from simple_history.models import HistoricalRecords + + +class Workflow(CommonAModel): + """ + 工作流 + """ + name = models.CharField('名称', max_length=50) + key = models.CharField('工作流标识', unique=True, max_length=20, null=True, blank=True) + sn_prefix = models.CharField('流水号前缀', max_length=50, default='hb') + description = models.CharField('描述', max_length=200, null=True, blank=True) + view_permission_check = models.BooleanField('查看权限校验', default=True, help_text='开启后,只允许工单的关联人(创建人、曾经的处理人)有权限查看工单') + limit_expression = models.JSONField('限制表达式', default=dict, blank=True, help_text='限制周期({"period":24} 24小时), 限制次数({"count":1}在限制周期内只允许提交1次), 限制级别({"level":1} 针对(1单个用户 2全局)限制周期限制次数,默认特定用户);允许特定人员提交({"allow_persons":"zhangsan,lisi"}只允许张三提交工单,{"allow_depts":"1,2"}只允许部门id为1和2的用户提交工单,{"allow_roles":"1,2"}只允许角色id为1和2的用户提交工单)') + display_form_str = models.JSONField('展现表单字段', default=list, blank=True, help_text='默认"[]",用于用户只有对应工单查看权限时显示哪些字段,field_key的list的json,如["days","sn"],内置特殊字段participant_info.participant_name:当前处理人信息(部门名称、角色名称),state.state_name:当前状态的状态名,workflow.workflow_name:工作流名称') + title_template = models.CharField('标题模板', max_length=50, default='{title}', null=True, blank=True, help_text='工单字段的值可以作为参数写到模板中,格式如:你有一个待办工单:{title}') + content_template = models.CharField('内容模板', max_length=1000, default='标题:{title}, 创建时间:{create_time}', null=True, blank=True, help_text='工单字段的值可以作为参数写到模板中,格式如:标题:{title}, 创建时间:{create_time}') + +class State(CommonAModel): + """ + 状态记录 + """ + STATE_TYPE_START = 1 + STATE_TYPE_END = 2 + type_choices = ( + (0, '普通'), + (STATE_TYPE_START, '开始'), + (STATE_TYPE_END, '结束') + ) + PARTICIPANT_TYPE_PERSONAL = 1 + PARTICIPANT_TYPE_MULTI = 2 + PARTICIPANT_TYPE_DEPT = 3 + PARTICIPANT_TYPE_ROLE = 4 + PARTICIPANT_TYPE_VARIABLE = 5 + PARTICIPANT_TYPE_ROBOT = 6 + PARTICIPANT_TYPE_FIELD = 7 + PARTICIPANT_TYPE_PARENT_FIELD = 8 + PARTICIPANT_TYPE_FORMCODE = 9 + state_participanttype_choices = ( + (0, '无处理人'), + (PARTICIPANT_TYPE_PERSONAL, '个人'), + (PARTICIPANT_TYPE_MULTI, '多人'), + # (PARTICIPANT_TYPE_DEPT, '部门'), + (PARTICIPANT_TYPE_ROLE, '角色'), + # (PARTICIPANT_TYPE_VARIABLE, '变量'), + (PARTICIPANT_TYPE_ROBOT, '脚本'), + (PARTICIPANT_TYPE_FIELD, '工单的字段'), + # (PARTICIPANT_TYPE_PARENT_FIELD, '父工单的字段'), + (PARTICIPANT_TYPE_FORMCODE, '代码获取') + ) + STATE_DISTRIBUTE_TYPE_ACTIVE = 1 # 主动接单 + STATE_DISTRIBUTE_TYPE_DIRECT = 2 # 直接处理(当前为多人的情况,都可以处理,而不需要先接单) + STATE_DISTRIBUTE_TYPE_RANDOM = 3 # 随机分配 + STATE_DISTRIBUTE_TYPE_ALL = 4 # 全部处理 + state_distribute_choices=( + (STATE_DISTRIBUTE_TYPE_ACTIVE, '主动接单'), + (STATE_DISTRIBUTE_TYPE_DIRECT, '直接处理'), + (STATE_DISTRIBUTE_TYPE_RANDOM, '随机分配'), + (STATE_DISTRIBUTE_TYPE_ALL, '全部处理'), + ) + + STATE_FIELD_READONLY= 1 # 字段只读 + STATE_FIELD_REQUIRED = 2 # 字段必填 + STATE_FIELD_OPTIONAL = 3 # 字段可选 + STATE_FIELD_HIDDEN = 4 # 字段隐藏 + state_filter_choices=( + (0, '无'), + (1, '和工单同属一及上级部门'), + (2, '和创建人同属一及上级部门'), + (3, '和上步处理人同属一及上级部门'), + ) + name = models.CharField('名称', max_length=50) + workflow = models.ForeignKey(Workflow, on_delete=models.CASCADE, verbose_name='所属工作流') + is_hidden = models.BooleanField('是否隐藏', default=False, help_text='设置为True时,获取工单步骤api中不显示此状态(当前处于此状态时除外)') + sort = models.IntegerField('状态顺序', default=0, help_text='用于工单步骤接口时,step上状态的顺序(因为存在网状情况,所以需要人为设定顺序),值越小越靠前') + type = models.IntegerField('状态类型', default=0, choices=type_choices, help_text='0.普通类型 1.初始状态(用于新建工单时,获取对应的字段必填及transition信息) 2.结束状态(此状态下的工单不得再处理,即没有对应的transition)') + enable_retreat = models.BooleanField('允许撤回', default=False, help_text='开启后允许工单创建人在此状态直接撤回工单到初始状态') + participant_type = models.IntegerField('参与者类型', choices=state_participanttype_choices, default=1, blank=True, help_text='0.无处理人,1.个人,2.多人,3.部门,4.角色,5.变量(支持工单创建人,创建人的leader),6.脚本,7.工单的字段内容(如表单中的"测试负责人",需要为用户名或者逗号隔开的多个用户名),8.父工单的字段内容。 初始状态请选择类型5,参与人填create_by') + participant = models.JSONField('参与者', default=list, blank=True, help_text='可以为空(无处理人的情况,如结束状态)、userid、userid列表\部门id\角色id\变量(create_by,create_by_tl)\脚本记录的id等,包含子工作流的需要设置处理人为loonrobot') + state_fields = models.JSONField('表单字段', default=dict, help_text='json格式字典存储,包括读写属性1:只读,2:必填,3:可选, 4:隐藏 示例:{"create_time":1,"title":2, "sn":1}, 内置特殊字段participant_info.participant_name:当前处理人信息(部门名称、角色名称),state.state_name:当前状态的状态名,workflow.workflow_name:工作流名称') # json格式存储,包括读写属性1:只读,2:必填,3:可选,4:不显示, 字典的字典 + distribute_type = models.IntegerField('分配方式', default=1, choices=state_distribute_choices, help_text='1.主动接单(如果当前处理人实际为多人的时候,需要先接单才能处理) 2.直接处理(即使当前处理人实际为多人,也可以直接处理) 3.随机分配(如果实际为多人,则系统会随机分配给其中一个人) 4.全部处理(要求所有参与人都要处理一遍,才能进入下一步)') + filter_policy = models.IntegerField('参与人过滤策略', default=0, choices=state_filter_choices) + participant_cc = models.JSONField('抄送给', default=list, blank=True, help_text='抄送给(userid列表)') + +class Transition(CommonAModel): + """ + 工作流流转,定时器,条件(允许跳过), 条件流转与定时器不可同时存在 + """ + TRANSITION_ATTRIBUTE_TYPE_ACCEPT = 1 # 同意 + TRANSITION_ATTRIBUTE_TYPE_REFUSE = 2 # 拒绝 + TRANSITION_ATTRIBUTE_TYPE_OTHER = 3 # 其他 + attribute_type_choices = ( + (1, '同意'), + (2, '拒绝'), + (3, '其他') + ) + TRANSITION_INTERVENE_TYPE_DELIVER = 1 # 转交操作 + TRANSITION_INTERVENE_TYPE_ADD_NODE = 2 # 加签操作 + TRANSITION_INTERVENE_TYPE_ADD_NODE_END = 3 # 加签处理完成 + TRANSITION_INTERVENE_TYPE_ACCEPT = 4 # 接单操作 + TRANSITION_INTERVENE_TYPE_COMMENT = 5 # 评论操作 + TRANSITION_INTERVENE_TYPE_DELETE = 6 # 删除操作 + TRANSITION_INTERVENE_TYPE_CLOSE = 7 # 强制关闭操作 + TRANSITION_INTERVENE_TYPE_ALTER_STATE = 8 # 强制修改状态操作 + TRANSITION_INTERVENE_TYPE_HOOK = 9 # hook操作 + TRANSITION_INTERVENE_TYPE_RETREAT = 10 # 撤回 + TRANSITION_INTERVENE_TYPE_CC = 11 # 抄送 + + intervene_type_choices = ( + (0, '正常处理'), + (TRANSITION_INTERVENE_TYPE_DELIVER, '转交'), + (TRANSITION_INTERVENE_TYPE_ADD_NODE, '加签'), + (TRANSITION_INTERVENE_TYPE_ADD_NODE_END, '加签处理完成'), + (TRANSITION_INTERVENE_TYPE_ACCEPT, '接单'), + (TRANSITION_INTERVENE_TYPE_COMMENT, '评论'), + (TRANSITION_INTERVENE_TYPE_DELETE, '删除'), + (TRANSITION_INTERVENE_TYPE_CLOSE, '强制关闭'), + (TRANSITION_INTERVENE_TYPE_ALTER_STATE, '强制修改状态'), + (TRANSITION_INTERVENE_TYPE_HOOK, 'hook操作'), + (TRANSITION_INTERVENE_TYPE_RETREAT, '撤回'), + (TRANSITION_INTERVENE_TYPE_CC, '抄送') + ) + + name = models.CharField('操作', max_length=50) + workflow = models.ForeignKey(Workflow, on_delete=models.CASCADE, verbose_name='所属工作流') + timer = models.IntegerField('定时器(单位秒)', default=0, help_text='单位秒。处于源状态X秒后如果状态都没有过变化则自动流转到目标状态。设置时间有效') + source_state = models.ForeignKey(State, on_delete=models.CASCADE, verbose_name='源状态', related_name='sstate_transition') + destination_state = models.ForeignKey(State, on_delete=models.CASCADE, verbose_name='目的状态', related_name='dstate_transition') + condition_expression = models.JSONField('条件表达式', max_length=1000, default=list, help_text='流转条件表达式,根据表达式中的条件来确定流转的下个状态,格式为[{"expression":"{days} > 3 and {days}<10", "target_state":11}] 其中{}用于填充工单的字段key,运算时会换算成实际的值,当符合条件下个状态将变为target_state_id中的值,表达式只支持简单的运算或datetime/time运算.loonflow会以首次匹配成功的条件为准,所以多个条件不要有冲突' ) + attribute_type = models.IntegerField('属性类型', default=1, choices=attribute_type_choices, help_text='属性类型,1.同意,2.拒绝,3.其他') + field_require_check = models.BooleanField('是否校验必填项', default=True, help_text='默认在用户点击操作的时候需要校验工单表单的必填项,如果设置为否则不检查。用于如"退回"属性的操作,不需要填写表单内容') + + +class CustomField(CommonAModel): + """自定义字段, 设定某个工作流有哪些自定义字段""" + field_type_choices = ( + ('string', '字符串'), + ('int', '整型'), + ('float', '浮点'), + ('boolean', '布尔'), + ('date', '日期'), + ('datetime', '日期时间'), + ('radio', '单选'), + ('checkbox', '多选'), + ('select', '单选下拉'), + ('selects', '多选下拉'), + ('cascader', '单选级联'), + ('cascaders', '多选级联'), + ('select_dg', '弹框单选'), + ('select_dgs', '弹框多选'), + ('textarea', '文本域'), + ('file', '附件') + ) + workflow = models.ForeignKey(Workflow, on_delete=models.CASCADE, verbose_name='所属工作流') + field_type = models.CharField('类型', max_length=50, choices=field_type_choices, + help_text='string, int, float, date, datetime, radio, checkbox, select, selects, cascader, cascaders, select_dg, select_dgs,textarea, file') + field_key = models.CharField('字段标识', max_length=50, help_text='字段类型请尽量特殊,避免与系统中关键字冲突') + field_name = models.CharField('字段名称', max_length=50) + sort = models.IntegerField('排序', default=0, help_text='工单基础字段在表单中排序为:流水号0,标题20,状态id40,状态名41,创建人80,创建时间100,更新时间120.前端展示工单信息的表单可以根据这个id顺序排列') + default_value = models.CharField('默认值', null=True, blank=True, max_length=100, help_text='前端展示时,可以将此内容作为表单中的该字段的默认值') + description = models.CharField('描述', max_length=100, blank=True, null=True, help_text='字段的描述信息,可用于显示在字段的下方对该字段的详细描述') + placeholder = models.CharField('占位符', max_length=100, blank=True, null=True, help_text='用户工单详情表单中作为字段的占位符显示') + field_template = models.TextField('文本域模板', null=True, blank=True, help_text='文本域类型字段前端显示时可以将此内容作为字段的placeholder') + boolean_field_display = models.JSONField('布尔类型显示名', default=dict, blank=True, + help_text='当为布尔类型时候,可以支持自定义显示形式。{"1":"是","0":"否"}或{"1":"需要","0":"不需要"},注意数字也需要引号') + + field_choice = models.JSONField('选项值', default=list, blank=True, + help_text='选项值,格式为list, 例["id":1, "name":"张三"]') + + label = models.CharField('标签', max_length=1000, default='', help_text='处理特殊逻辑使用,比如sys_user用于获取用户作为选项') + # hook = models.CharField('hook', max_length=1000, default='', help_text='获取下拉选项用于动态选项值') + is_hidden = models.BooleanField('是否隐藏', default=False, help_text='可用于携带不需要用户查看的字段信息') + +class Ticket(CommonBModel): + """ + 工单 + """ + TICKET_ACT_STATE_DRAFT = 0 # 草稿中 + TICKET_ACT_STATE_ONGOING = 1 # 进行中 + TICKET_ACT_STATE_BACK = 2 # 被退回 + TICKET_ACT_STATE_RETREAT = 3 # 被撤回 + TICKET_ACT_STATE_FINISH = 4 # 已完成 + TICKET_ACT_STATE_CLOSED = 5 # 已关闭 + + act_state_choices =( + (TICKET_ACT_STATE_DRAFT, '草稿中'), + (TICKET_ACT_STATE_ONGOING, '进行中'), + (TICKET_ACT_STATE_BACK, '被退回'), + (TICKET_ACT_STATE_RETREAT, '被撤回'), + (TICKET_ACT_STATE_FINISH, '已完成'), + (TICKET_ACT_STATE_CLOSED, '已关闭') + ) + category_choices =( + ('all', '全部'), + ('owner', '我创建的'), + ('duty', '待办'), + ('worked', '我处理的'), + ('cc', '抄送我的') + ) + title = models.CharField('标题', max_length=500, null=True, blank=True, help_text="工单标题") + workflow = models.ForeignKey(Workflow, on_delete=models.CASCADE, verbose_name='关联工作流') + sn = models.CharField('流水号', max_length=25, help_text="工单的流水号") + state = models.ForeignKey(State, on_delete=models.CASCADE, verbose_name='当前状态', related_name='ticket_state') + parent = models.ForeignKey('self', null=True, blank=True, on_delete=models.CASCADE, verbose_name='父工单') + parent_state = models.ForeignKey(State, null=True, blank=True, on_delete=models.CASCADE, verbose_name='父工单状态', related_name='ticket_parent_state') + ticket_data = models.JSONField('工单数据', default=dict, help_text='工单自定义字段内容') + in_add_node = models.BooleanField('加签状态中', default=False, help_text='是否处于加签状态下') + add_node_man = models.ForeignKey(User, verbose_name='加签人', on_delete=models.SET_NULL, null=True, blank=True, help_text='加签操作的人,工单当前处理人处理完成后会回到该处理人,当处于加签状态下才有效') + script_run_last_result = models.BooleanField('脚本最后一次执行结果', default=True) + participant_type = models.IntegerField('当前处理人类型', default=0, help_text='0.无处理人,1.个人,2.多人', choices=State.state_participanttype_choices) + participant = models.JSONField('当前处理人', default=list, blank=True, help_text='可以为空(无处理人的情况,如结束状态)、userid、userid列表') + act_state = models.IntegerField('进行状态', default=1, help_text='当前工单的进行状态', choices=act_state_choices) + multi_all_person = models.JSONField('全部处理的结果', default=dict, blank=True, help_text='需要当前状态处理人全部处理时实际的处理结果,json格式') + + +class TicketFlow(BaseModel): + """ + 工单流转日志 + """ + ticket = models.ForeignKey(Ticket, on_delete=models.CASCADE, verbose_name='关联工单', related_name='ticketflow_ticket') + transition = models.ForeignKey(Transition, verbose_name='流转id', help_text='与worklow.Transition关联, 为空时表示认为干预的操作', on_delete=models.CASCADE, null=True, blank=True) + suggestion = models.CharField('处理意见', max_length=10000, default='', blank=True) + participant_type = models.IntegerField('处理人类型', default=0, help_text='0.无处理人,1.个人,2.多人等', choices=State.state_participanttype_choices) + participant = models.ForeignKey(User, verbose_name='处理人', on_delete=models.SET_NULL, null=True, blank=True, related_name='ticketflow_participant') + participant_str = models.CharField('处理人', max_length=200, null=True, blank=True, help_text='非人工处理的处理人相关信息') + state = models.ForeignKey(State, verbose_name='当前状态', default=0, blank=True, on_delete=models.CASCADE) + ticket_data = models.JSONField('工单数据', default=dict, blank=True, help_text='可以用于记录当前表单数据,json格式') + intervene_type = models.IntegerField('干预类型', default=0, help_text='流转类型', choices=Transition.intervene_type_choices) + participant_cc = models.JSONField('抄送给', default=list, blank=True, help_text='抄送给(userid列表)') + diff --git a/admin/server/apps/wf/scripts.py b/admin/server/apps/wf/scripts.py new file mode 100644 index 0000000..eda2694 --- /dev/null +++ b/admin/server/apps/wf/scripts.py @@ -0,0 +1,56 @@ +from apps.system.models import User +from apps.wf.models import State, Ticket, TicketFlow, Transition + + +class GetParticipants: + """ + 获取处理人脚本 + """ + all_funcs = [ + {'func':'get_create_by', 'name':'获取工单创建人'} + ] + + # def all_funcs(self): + # # return list(filter(lambda x: x.startswith('get_') and callable(getattr(self, x)), dir(self))) + # return [(func, getattr(self, func).__doc__) for func in dir(self) if callable(getattr(self, func)) and func.startswith('get_')] + + @classmethod + def get_create_by(cls, state:dict={}, ticket:dict={}, new_ticket_data:dict={}, handler:User={}): + """工单创建人""" + participant = ticket.create_by.id + return participant + +class HandleScripts: + """ + 任务处理脚本 + """ + all_funcs = [ + {'func': 'handle_something', 'name':'处理一些工作'} + ] + + + @classmethod + def to_next(cls, ticket:Ticket, by_timer:bool=False, by_task:bool=False, by_hook:bool=False, script_str:str=''): + # 获取信息 + transition_obj = Transition.objects.filter(source_state=ticket.state, is_deleted=False).first() + + TicketFlow.objects.create(ticket=ticket, state=ticket.state, + participant_type=State.PARTICIPANT_TYPE_ROBOT, + participant_str='func:{}'.format(script_str), + transition=transition_obj) + from .services import WfService + + # 自动执行流转 + WfService.handle_ticket(ticket=ticket, transition=transition_obj, new_ticket_data=ticket.ticket_data, by_task=True) + + return ticket + + @classmethod + def handle_something(cls, ticket:Ticket): + """处理一些工作""" + # 任务处理代码区 + + + # 调用自动流转 + ticket = cls.to_next(ticket=ticket, by_task=True, script_str= 'handle_something') + diff --git a/admin/server/apps/wf/serializers.py b/admin/server/apps/wf/serializers.py new file mode 100644 index 0000000..70b03bc --- /dev/null +++ b/admin/server/apps/wf/serializers.py @@ -0,0 +1,193 @@ +from apps.system.models import Organization, User +from apps.system.serializers import UserSimpleSerializer +import rest_framework +from rest_framework import serializers + +from .models import State, Ticket, TicketFlow, Workflow, Transition, CustomField + + +class WorkflowSerializer(serializers.ModelSerializer): + class Meta: + model = Workflow + fields = '__all__' + +class StateSerializer(serializers.ModelSerializer): + class Meta: + model = State + fields = '__all__' + +class WorkflowSimpleSerializer(serializers.ModelSerializer): + class Meta: + model = Workflow + fields = ['id', 'name'] + +class StateSimpleSerializer(serializers.ModelSerializer): + class Meta: + model = State + fields = ['id', 'name', 'type', 'distribute_type', 'enable_retreat'] + +class TransitionSerializer(serializers.ModelSerializer): + source_state_ = StateSimpleSerializer(source='source_state', read_only=True) + destination_state_ = StateSimpleSerializer(source='destination_state', read_only=True) + class Meta: + model = Transition + fields = '__all__' + @staticmethod + def setup_eager_loading(queryset): + """ Perform necessary eager loading of data. """ + queryset = queryset.select_related('source_state','destination_state') + return queryset + +class AllField(serializers.Field): + def to_representation(self, value): + return value + + def to_internal_value(self, data): + return data + +class FieldChoiceSerializer(serializers.Serializer): + id = AllField(label='ID') + name = serializers.CharField(label='名称') + + +class CustomFieldSerializer(serializers.ModelSerializer): + class Meta: + model = CustomField + fields = '__all__' + +class CustomFieldCreateUpdateSerializer(serializers.ModelSerializer): + + field_choice = FieldChoiceSerializer(label='选项列表', many=True, required=False) + class Meta: + model = CustomField + fields = ['workflow', 'field_type', 'field_key', 'field_name', + 'sort', 'default_value', 'description', 'placeholder', 'field_template', + 'boolean_field_display', 'field_choice', 'label', 'is_hidden'] + + +class TicketSimpleSerializer(serializers.ModelSerializer): + class Meta: + model = Ticket + fields = '__all__' + +class TicketCreateSerializer(serializers.ModelSerializer): + transition = serializers.PrimaryKeyRelatedField(queryset=Transition.objects.all(), write_only=True) + title = serializers.CharField(allow_blank=True, required=False) + class Meta: + model=Ticket + fields=['title','workflow', 'ticket_data', 'transition'] + + def create(self, validated_data): + return super().create(validated_data) + +class TicketSerializer(serializers.ModelSerializer): + workflow_ = WorkflowSimpleSerializer(source='workflow', read_only=True) + state_ = StateSimpleSerializer(source='state', read_only=True) + + class Meta: + model = Ticket + fields = '__all__' + + @staticmethod + def setup_eager_loading(queryset): + queryset = queryset.select_related('workflow','state') + return queryset + +class TicketListSerializer(serializers.ModelSerializer): + workflow_ = WorkflowSimpleSerializer(source='workflow', read_only=True) + state_ = StateSimpleSerializer(source='state', read_only=True) + + class Meta: + model = Ticket + fields = ['id', 'title', 'sn', 'workflow', 'workflow_', 'state', 'state_', 'act_state', 'create_time', 'update_time', 'participant_type', 'create_by'] + + @staticmethod + def setup_eager_loading(queryset): + queryset = queryset.select_related('workflow','state') + return queryset + +class TicketDetailSerializer(serializers.ModelSerializer): + workflow_ = WorkflowSimpleSerializer(source='workflow', read_only=True) + state_ = StateSimpleSerializer(source='state', read_only=True) + ticket_data_ = serializers.SerializerMethodField() + class Meta: + model = Ticket + fields = '__all__' + + @staticmethod + def setup_eager_loading(queryset): + queryset = queryset.select_related('workflow','state') + return queryset + + def get_ticket_data_(self, obj): + ticket_data = obj.ticket_data + state_fields = obj.state.state_fields + all_fields = CustomField.objects.filter(workflow=obj.workflow).order_by('sort') + all_fields_l = CustomFieldSerializer(instance=all_fields, many=True).data + for i in all_fields_l: + key = i['field_key'] + i['field_state'] = state_fields.get(key, 1) + i['field_value'] = ticket_data.get(key, None) + i['field_display'] = i['field_value'] # 该字段是用于查看详情直接展示 + if i['field_value']: + if 'sys_user' in i['label']: + if isinstance(i['field_value'], list): + i['field_display'] = ','.join(list(User.objects.filter(id__in=i['field_value']).values_list('name', flat=True))) + else: + i['field_display'] = User.objects.get(id=i['field_value']).name + elif 'deptSelect' in i['label']: + if isinstance(i['field_value'], list): + i['field_display'] = ','.join(list(Organization.objects.filter(id__in=i['field_value']).values_list('name', flat=True))) + else: + i['field_display'] = Organization.objects.get(id=i['field_value']).name + elif i['field_type'] in ['radio', 'select']: + for m in i['field_choice']: + if m['id'] == i['field_value']: + i['field_display'] = m['name'] + elif i['field_type'] in ['checkbox', 'selects']: + d_list = [] + for m in i['field_choice']: + if m['id'] in i['field_value']: + d_list.append(m['name']) + i['field_display'] = ','.join(d_list) + return all_fields_l + + def filter_display(self, item, field_value): + if item['id'] == field_value: + return + +class TicketFlowSerializer(serializers.ModelSerializer): + participant_ = UserSimpleSerializer(source='participant', read_only=True) + state_ = StateSimpleSerializer(source='state', read_only=True) + class Meta: + model = TicketFlow + fields = '__all__' + +class TicketFlowSimpleSerializer(serializers.ModelSerializer): + participant_ = UserSimpleSerializer(source='participant', read_only=True) + state_ = StateSimpleSerializer(source='state', read_only=True) + class Meta: + model = TicketFlow + exclude = ['ticket_data'] + + +class TicketHandleSerializer(serializers.Serializer): + transition = serializers.PrimaryKeyRelatedField(queryset=Transition.objects.all(), label="流转id") + ticket_data = serializers.JSONField(label="表单数据json") + suggestion = serializers.CharField(label="处理意见", required = False, allow_blank=True) + +class TicketRetreatSerializer(serializers.Serializer): + suggestion = serializers.CharField(label="撤回原因", required = False) + +class TicketCloseSerializer(serializers.Serializer): + suggestion = serializers.CharField(label="关闭原因", required = False) + +class TicketAddNodeSerializer(serializers.Serializer): + suggestion = serializers.CharField(label="加签说明", required = False) + toadd_user = serializers.PrimaryKeyRelatedField(queryset=User.objects.all(), label='发送给谁去加签') + +class TicketAddNodeEndSerializer(serializers.Serializer): + suggestion = serializers.CharField(label="加签意见", required = False) + +class TicketDestorySerializer(serializers.Serializer): + ids = serializers.ListField(child=serializers.PrimaryKeyRelatedField(queryset=Ticket.objects.all()), label='工单ID列表') \ No newline at end of file diff --git a/admin/server/apps/wf/services.py b/admin/server/apps/wf/services.py new file mode 100644 index 0000000..178318c --- /dev/null +++ b/admin/server/apps/wf/services.py @@ -0,0 +1,353 @@ +from apps.wf.serializers import CustomFieldSerializer +from apps.wf.serializers import TicketSerializer, TicketSimpleSerializer +from typing import Tuple +from apps.system.models import User +from apps.wf.models import CustomField, State, Ticket, TicketFlow, Transition, Workflow +from rest_framework.exceptions import APIException, PermissionDenied +from django.utils import timezone +from datetime import timedelta +import random +from .scripts import GetParticipants, HandleScripts +from utils.queryset import get_parent_queryset + +class WfService(object): + @staticmethod + def get_worlflow_states(workflow:Workflow): + """ + 获取工作流状态列表 + """ + return State.objects.filter(workflow=workflow, is_deleted=False).order_by('sort') + + @staticmethod + def get_workflow_transitions(workflow:Workflow): + """ + 获取工作流流转列表 + """ + return Transition.objects.filter(workflow=workflow, is_deleted=False) + + @staticmethod + def get_workflow_start_state(workflow:Workflow): + """ + 获取工作流初始状态 + """ + try: + wf_state_obj = State.objects.get(workflow=workflow, type=State.STATE_TYPE_START, is_deleted=False) + return wf_state_obj + except: + raise Exception('工作流状态配置错误') + + @staticmethod + def get_workflow_end_state(workflow:Workflow): + """ + 获取工作流结束状态 + """ + try: + wf_state_obj = State.objects.get(workflow=workflow, type=State.STATE_TYPE_END, is_deleted=False) + return wf_state_obj + except: + raise Exception('工作流状态配置错误') + + @staticmethod + def get_workflow_custom_fields(workflow:Workflow): + """ + 获取工单字段 + """ + return CustomField.objects.filter(is_deleted=False, workflow=workflow).order_by('sort') + + @staticmethod + def get_workflow_custom_fields_list(workflow:Workflow): + """ + 获取工单字段key List + """ + return list(CustomField.objects.filter(is_deleted=False, workflow=workflow).order_by('sort').values_list('field_key', flat=True)) + + @classmethod + def get_ticket_transitions(cls, ticket:Ticket): + """ + 获取工单当前状态下可用的流转条件 + """ + return cls.get_state_transitions(ticket.state) + + @classmethod + def get_state_transitions(cls, state:State): + """ + 获取状态可执行的操作 + """ + return Transition.objects.filter(is_deleted=False, source_state=state).all() + + @classmethod + def get_ticket_steps(cls, ticket:Ticket): + steps = cls.get_worlflow_states(ticket.workflow) + nsteps_list = [] + for i in steps: + if ticket.state == i or (not i.is_hidden): + nsteps_list.append(i) + return nsteps_list + + @classmethod + def get_ticket_transitions(cls, ticket:Ticket): + """ + 获取工单可执行的操作 + """ + return cls.get_state_transitions(ticket.state) + + @classmethod + def get_transition_by_args(cls, kwargs:dict): + """ + 查询并获取流转 + """ + kwargs['is_deleted'] = False + return Transition.objects.filter(**kwargs).all() + + @classmethod + def get_ticket_sn(cls, workflow:Workflow): + """ + 生成工单流水号 + """ + now = timezone.now() + today = str(now)[:10]+' 00:00:00' + next_day = str(now+timedelta(days=1))[:10]+' 00:00:00' + ticket_day_count_new = Ticket.objects.filter(create_time__gte=today, create_time__lte=next_day, workflow=workflow).count()+1 + return '%s_%04d%02d%02d%04d' % (workflow.sn_prefix, now.year, now.month, now.day, ticket_day_count_new) + + + + @classmethod + def get_next_state_by_transition_and_ticket_info(cls, ticket:Ticket, transition: Transition, new_ticket_data:dict={})->object: + """ + 获取下个节点状态 + """ + source_state = ticket.state + destination_state = transition.destination_state + ticket_all_value = cls.get_ticket_all_field_value(ticket) + ticket_all_value.update(**new_ticket_data) + for key, value in ticket_all_value.items(): + if isinstance(ticket_all_value[key], str): + ticket_all_value[key] = "'" + ticket_all_value[key] + "'" + if transition.condition_expression: + for i in transition.condition_expression: + expression = i['expression'].format(**ticket_all_value) + import datetime, time # 用于支持条件表达式中对时间的操作 + if eval(expression, {'__builtins__':None}, {'datetime':datetime, 'time':time}): + destination_state = State.objects.get(pk=i['target_state']) + return destination_state + return destination_state + + @classmethod + def get_ticket_state_participant_info(cls, state:State, ticket:Ticket, new_ticket_data:dict={}, handler:User=None): + """ + 获取工单目标状态实际的处理人, 处理人类型 + """ + if state.type == State.STATE_TYPE_START: + """ + 回到初始状态 + """ + return dict(destination_participant_type=State.PARTICIPANT_TYPE_PERSONAL, + destination_participant=ticket.create_by.id, + multi_all_person={}) + elif state.type == State.STATE_TYPE_END: + """ + 到达结束状态 + """ + return dict(destination_participant_type=0, + destination_participant=0, + multi_all_person={}) + multi_all_person_dict = {} + destination_participant_type, destination_participant = state.participant_type, state.participant + if destination_participant_type == State.PARTICIPANT_TYPE_FIELD: + destination_participant = new_ticket_data.get(destination_participant, 0) if destination_participant in new_ticket_data \ + else Ticket.ticket_data.get(destination_participant, 0) + + elif destination_participant_type == State.PARTICIPANT_TYPE_FORMCODE:#代码获取 + destination_participant = getattr(GetParticipants, destination_participant)( + state=state, ticket=ticket, new_ticket_data=new_ticket_data, handler=handler) + + elif destination_participant_type == State.PARTICIPANT_TYPE_DEPT:#部门 + destination_participant = list(User.objects.filter(dept__in=destination_participant).values_list('id', flat=True)) + + elif destination_participant_type == State.PARTICIPANT_TYPE_ROLE:#角色 + user_queryset = User.objects.filter(roles__in=destination_participant) + # 如果选择了角色, 需要走过滤策略 + if state.filter_policy == 1: + depts = get_parent_queryset(ticket.belong_dept) + user_queryset = user_queryset.filter(dept__in=depts) + elif state.filter_policy == 2: + depts = get_parent_queryset(ticket.create_by.dept) + user_queryset = user_queryset.filter(dept__in=depts) + elif state.filter_policy == 3: + depts = get_parent_queryset(handler.dept) + user_queryset = user_queryset.filter(dept__in=depts) + destination_participant = list(user_queryset.values_list('id', flat=True)) + if type(destination_participant) == list: + destination_participant_type = State.PARTICIPANT_TYPE_MULTI + destination_participant = list(set(destination_participant)) + if len(destination_participant) == 1: # 如果只有一个人 + destination_participant_type = State.PARTICIPANT_TYPE_PERSONAL + destination_participant = destination_participant[0] + else: + destination_participant_type = State.PARTICIPANT_TYPE_PERSONAL + if destination_participant_type == State.PARTICIPANT_TYPE_MULTI: + if state.distribute_type == State.STATE_DISTRIBUTE_TYPE_RANDOM: + destination_participant = random.choice(destination_participant) + elif state.distribute_type == State.STATE_DISTRIBUTE_TYPE_ALL: + for i in destination_participant: + multi_all_person_dict[i]={} + + return dict(destination_participant_type=destination_participant_type, + destination_participant=destination_participant, + multi_all_person=multi_all_person_dict) + + @classmethod + def ticket_handle_permission_check(cls, ticket:Ticket, user:User)-> dict: + transitions = cls.get_state_transitions(ticket.state) + if not transitions: + return dict(permission=True, msg="工单当前状态无需操作") + current_participant_count = 0 + participant_type = ticket.participant_type + participant = ticket.participant + state = ticket.state + if participant_type == State.PARTICIPANT_TYPE_PERSONAL: + if user.id != participant: + return dict(permission=False, msg="非当前处理人", need_accept=False) + elif participant_type in [State.PARTICIPANT_TYPE_MULTI, State.PARTICIPANT_TYPE_DEPT, State.PARTICIPANT_TYPE_ROLE]: + if user.id not in participant: + return dict(permission=False, msg="非当前处理人", need_accept=False) + current_participant_count = len(participant) + if current_participant_count == 1: + if [user.id] == participant or user.id == participant: + pass + else: + return dict(permission=False, msg="非当前处理人", need_accept=False) + elif current_participant_count >1 and state.distribute_type == State.STATE_DISTRIBUTE_TYPE_ACTIVE: + if user.id not in participant: + return dict(permission=False, msg="非当前处理人", need_accept=False) + return dict(permission=False, msg="需要先接单再处理", need_accept=True) + if ticket.in_add_node: + return dict(permission=False, msg="工单当前处于加签中,请加签完成后操作", need_accept=False) + return dict(permission=True, msg="", need_accept=False) + + @classmethod + def check_dict_has_all_same_value(cls, dict_obj: object)->tuple: + """ + check whether all key are equal in a dict + :param dict_obj: + :return: + """ + value_list = [] + for key, value in dict_obj.items(): + value_list.append(value) + value_0 = value_list[0] + for value in value_list: + if value_0 != value: + return False + return True + + @classmethod + def get_ticket_all_field_value(cls, ticket: Ticket)->dict: + """ + 工单所有字段的值 + get ticket's all field value + :param ticket: + :return: + """ + # 获取工单基础表中的字段中的字段信息 + field_info_dict = TicketSimpleSerializer(instance=ticket).data + # 获取自定义字段的值 + custom_fields_queryset = cls.get_workflow_custom_fields(ticket.workflow) + for i in custom_fields_queryset: + field_info_dict[i.field_key] = ticket.ticket_data.get(i.field_key, None) + return field_info_dict + + @classmethod + def handle_ticket(cls, ticket:Ticket, transition: Transition, new_ticket_data:dict={}, handler:User=None, + suggestion:str='', created:bool=False, by_timer:bool=False, by_task:bool=False, by_hook:bool=False): + + source_state = ticket.state + source_ticket_data = ticket.ticket_data + + # 校验处理权限 + if not handler or not created: # 没有处理人意味着系统触发不校验处理权限 + result = WfService.ticket_handle_permission_check(ticket, handler) + if result.get('permission') is False: + raise PermissionDenied(result.get('msg')) + + # 校验表单必填项目 + if transition.field_require_check or not created: + for key, value in ticket.state.state_fields.items(): + if int(value) == State.STATE_FIELD_REQUIRED: + if key not in new_ticket_data or not new_ticket_data[key]: + raise APIException('字段{}必填'.format(key)) + + destination_state = cls.get_next_state_by_transition_and_ticket_info(ticket, transition, new_ticket_data) + multi_all_person = ticket.multi_all_person + if multi_all_person: + multi_all_person[handler.id] =dict(transition=transition.id) + # 判断所有人处理结果是否一致 + if WfService.check_dict_has_all_same_value(multi_all_person): + participant_info = WfService.get_ticket_state_participant_info(destination_state, ticket, new_ticket_data) + destination_participant_type = participant_info.get('destination_participant_type', 0) + destination_participant = participant_info.get('destination_participant', 0) + multi_all_person = {} + else: + # 处理人没有没有全部处理完成或者处理动作不一致 + destination_participant_type = ticket.participant_type + destination_state = ticket.state # 保持原状态 + destination_participant = [] + for key, value in multi_all_person.items(): + if not value: + destination_participant.append(key) + else: + # 当前处理人类型非全部处理 + participant_info = WfService.get_ticket_state_participant_info(destination_state, ticket, new_ticket_data) + destination_participant_type = participant_info.get('destination_participant_type', 0) + destination_participant = participant_info.get('destination_participant', 0) + multi_all_person = participant_info.get('multi_all_person', {}) + + # 更新工单信息:基础字段及自定义字段, add_relation字段 需要下个处理人是部门、角色等的情况 + ticket.state = destination_state + ticket.participant_type = destination_participant_type + ticket.participant = destination_participant + ticket.multi_all_person = multi_all_person + if destination_state.type == State.STATE_TYPE_END: + ticket.act_state = Ticket.TICKET_ACT_STATE_FINISH + elif destination_state.type == State.STATE_TYPE_START: + ticket.act_state = Ticket.TICKET_ACT_STATE_DRAFT + else: + ticket.act_state = Ticket.TICKET_ACT_STATE_ONGOING + + if transition.attribute_type == Transition.TRANSITION_ATTRIBUTE_TYPE_REFUSE: + ticket.act_state = Ticket.TICKET_ACT_STATE_BACK + + # 只更新必填和可选的字段 + if not created: + for key, value in source_state.state_fields.items(): + if value in (State.STATE_FIELD_REQUIRED, State.STATE_FIELD_OPTIONAL): + if key in new_ticket_data: + source_ticket_data[key] = new_ticket_data[key] + ticket.ticket_data = source_ticket_data + ticket.save() + + # 更新工单流转记录 + if not by_task: + TicketFlow.objects.create(ticket=ticket, state=source_state, ticket_data=WfService.get_ticket_all_field_value(ticket), + suggestion=suggestion, participant_type=State.PARTICIPANT_TYPE_PERSONAL, + participant=handler, transition=transition) + + if created: + if source_state.participant_cc: + TicketFlow.objects.create(ticket=ticket, state=source_state, + participant_type=0, intervene_type=Transition.TRANSITION_INTERVENE_TYPE_CC, + participant=None, participant_cc=source_state.participant_cc) + + # 目标状态需要抄送 + if destination_state.participant_cc: + TicketFlow.objects.create(ticket=ticket, state=destination_state, + participant_type=0, intervene_type=Transition.TRANSITION_INTERVENE_TYPE_CC, + participant=None, participant_cc=destination_state.participant_cc) + + # 如果目标状态是脚本则执行 + if destination_state.participant_type == State.PARTICIPANT_TYPE_ROBOT: + getattr(HandleScripts, destination_state.participant)(ticket) + + return ticket + diff --git a/admin/server/apps/wf/tests.py b/admin/server/apps/wf/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/admin/server/apps/wf/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/admin/server/apps/wf/urls.py b/admin/server/apps/wf/urls.py new file mode 100644 index 0000000..5c9ae0d --- /dev/null +++ b/admin/server/apps/wf/urls.py @@ -0,0 +1,18 @@ +from django.db.models import base +from rest_framework import urlpatterns +from apps.wf.views import CustomFieldViewSet, FromCodeListView, StateViewSet, TicketFlowViewSet, TicketViewSet, TransitionViewSet, WorkflowViewSet +from django.urls import path, include +from rest_framework.routers import DefaultRouter + +router = DefaultRouter() +router.register('workflow', WorkflowViewSet, basename='wf') +router.register('state', StateViewSet, basename='wf_state') +router.register('transition', TransitionViewSet, basename='wf_transitions') +router.register('customfield', CustomFieldViewSet, basename='wf_customfield') +router.register('ticket', TicketViewSet, basename='wf_ticket') +router.register('ticketflow', TicketFlowViewSet, basename='wf_ticketflow') +urlpatterns = [ + path('participant_from_code', FromCodeListView.as_view()), + path('', include(router.urls)), +] + diff --git a/admin/server/apps/wf/views.py b/admin/server/apps/wf/views.py new file mode 100644 index 0000000..2a7e073 --- /dev/null +++ b/admin/server/apps/wf/views.py @@ -0,0 +1,373 @@ +from django.utils import timezone +from django.db import transaction +from django.db.models import query +from rest_framework.utils import serializer_helpers +from rest_framework.views import APIView +from apps.system.models import User +from apps.wf.filters import TicketFilterSet +from django.core.exceptions import AppRegistryNotReady +from rest_framework.response import Response +from rest_framework import serializers +from rest_framework.mixins import CreateModelMixin, DestroyModelMixin, ListModelMixin, RetrieveModelMixin, UpdateModelMixin +from apps.wf.serializers import CustomFieldCreateUpdateSerializer, CustomFieldSerializer, StateSerializer, TicketAddNodeEndSerializer, TicketAddNodeSerializer, TicketCloseSerializer, TicketCreateSerializer, TicketDestorySerializer, TicketFlowSerializer, TicketFlowSimpleSerializer, TicketHandleSerializer, TicketRetreatSerializer, TicketSerializer, TransitionSerializer, WorkflowSerializer, TicketListSerializer, TicketDetailSerializer +from django.shortcuts import get_object_or_404, render +from rest_framework.viewsets import GenericViewSet, ModelViewSet +from rest_framework.decorators import action, api_view +from apps.wf.models import CustomField, Ticket, Workflow, State, Transition, TicketFlow +from apps.system.mixins import CreateUpdateCustomMixin, CreateUpdateModelAMixin, OptimizationMixin +from apps.wf.services import WfService +from rest_framework.exceptions import APIException, PermissionDenied +from rest_framework import status +from django.db.models import Count +from .scripts import GetParticipants, HandleScripts + + +# Create your views here. +class FromCodeListView(APIView): + def get(self, request, format=None): + """ + 获取处理人代码列表 + """ + return Response(GetParticipants.all_funcs) + +class WorkflowViewSet(CreateUpdateModelAMixin, ModelViewSet): + perms_map = {'get': '*', 'post': 'workflow_create', + 'put': 'workflow_update', 'delete': 'workflow_delete'} + queryset = Workflow.objects.all() + serializer_class = WorkflowSerializer + search_fields = ['name', 'description'] + filterset_fields = [] + ordering_fields = ['create_time', 'name', 'key'] + ordering = ['create_time'] + + @action(methods=['get'], detail=True, perms_map={'get':'workflow_update'}, pagination_class=None, serializer_class=StateSerializer) + def states(self, request, pk=None): + """ + 工作流下的状态节点 + """ + wf = self.get_object() + serializer = self.serializer_class(instance=WfService.get_worlflow_states(wf), many=True) + return Response(serializer.data) + + @action(methods=['get'], detail=True, perms_map={'get':'workflow_update'}, pagination_class=None, serializer_class=TransitionSerializer) + def transitions(self, request, pk=None): + """ + 工作流下的流转规则 + """ + wf = self.get_object() + serializer = self.serializer_class(instance=WfService.get_workflow_transitions(wf), many=True) + return Response(serializer.data) + + @action(methods=['get'], detail=True, perms_map={'get':'workflow_update'}, pagination_class=None, serializer_class=CustomFieldSerializer) + def customfields(self, request, pk=None): + """ + 工作流下的自定义字段 + """ + wf = self.get_object() + serializer = self.serializer_class(instance=CustomField.objects.filter(workflow=wf, is_deleted=False).order_by('sort'), many=True) + return Response(serializer.data) + + @action(methods=['get'], detail=True, perms_map={'get':'workflow_init'}) + def init(self, request, pk=None): + """ + 新建工单初始化 + """ + ret={} + wf = self.get_object() + start_state = WfService.get_workflow_start_state(wf) + transitions = WfService.get_state_transitions(start_state) + ret['workflow'] = pk + ret['transitions'] = TransitionSerializer(instance=transitions, many=True).data + field_list = CustomFieldSerializer(instance=WfService.get_workflow_custom_fields(wf), many=True).data + for i in field_list: + if i['field_key'] in start_state.state_fields: + i['field_attribute'] = start_state.state_fields[i['field_key']] + else: + i['field_attribute'] = State.STATE_FIELD_READONLY + ret['field_list'] = field_list + return Response(ret) + +class StateViewSet(CreateModelMixin, UpdateModelMixin, RetrieveModelMixin, DestroyModelMixin, GenericViewSet): + perms_map = {'get':'*', 'post':'workflow_update', + 'put':'workflow_update', 'delete':'workflow_update'} + queryset = State.objects.all() + serializer_class = StateSerializer + search_fields = ['name'] + filterset_fields = ['workflow'] + ordering = ['sort'] + +class TransitionViewSet(CreateModelMixin, UpdateModelMixin, RetrieveModelMixin, DestroyModelMixin, GenericViewSet): + perms_map = {'get':'*', 'post':'workflow_update', + 'put':'workflow_update', 'delete':'workflow_update'} + queryset = Transition.objects.all() + serializer_class = TransitionSerializer + search_fields = ['name'] + filterset_fields = ['workflow'] + ordering = ['id'] + +class CustomFieldViewSet(CreateModelMixin, UpdateModelMixin, RetrieveModelMixin, DestroyModelMixin, GenericViewSet): + perms_map = {'get':'*', 'post':'workflow_update', + 'put':'workflow_update', 'delete':'workflow_update'} + queryset = CustomField.objects.all() + serializer_class = CustomFieldSerializer + search_fields = ['field_name'] + filterset_fields = ['workflow', 'field_type'] + ordering = ['sort'] + + def get_serializer_class(self): + if self.action in ['create', 'update']: + return CustomFieldCreateUpdateSerializer + return super().get_serializer_class() + +class TicketViewSet(OptimizationMixin, CreateUpdateCustomMixin, CreateModelMixin, ListModelMixin, RetrieveModelMixin, GenericViewSet): + perms_map = {'get':'*', 'post':'ticket_create'} + queryset = Ticket.objects.all() + serializer_class = TicketSerializer + search_fields = ['title'] + filterset_class = TicketFilterSet + ordering = ['-create_time'] + + def get_serializer_class(self): + if self.action == 'create': + return TicketCreateSerializer + elif self.action == 'handle': + return TicketHandleSerializer + elif self.action == 'retreat': + return TicketRetreatSerializer + elif self.action == 'list': + return TicketListSerializer + elif self.action == 'retrieve': + return TicketDetailSerializer + return super().get_serializer_class() + + def filter_queryset(self, queryset): + if not self.detail and not self.request.query_params.get('category', None): + raise APIException('请指定查询分类') + return super().filter_queryset(queryset) + + @transaction.atomic + def create(self, request, *args, **kwargs): + """ + 新建工单 + """ + rdata = request.data + serializer = self.get_serializer(data=rdata) + serializer.is_valid(raise_exception=True) + vdata = serializer.validated_data #校验之后的数据 + start_state = WfService.get_workflow_start_state(vdata['workflow']) + transition = vdata.pop('transition') + ticket_data = vdata['ticket_data'] + + save_ticket_data = {} + # 校验必填项 + if transition.field_require_check: + for key, value in start_state.state_fields.items(): + if int(value) == State.STATE_FIELD_REQUIRED: + if key not in ticket_data and not ticket_data[key]: + raise APIException('字段{}必填'.format(key)) + save_ticket_data[key] = ticket_data[key] + elif int(value) == State.STATE_FIELD_OPTIONAL: + save_ticket_data[key] = ticket_data[key] + + ticket = serializer.save(state=start_state, + create_by=request.user, + create_time=timezone.now(), + act_state=Ticket.TICKET_ACT_STATE_DRAFT, + belong_dept=request.user.dept, + ticket_data=save_ticket_data) # 先创建出来 + # 更新title和sn + title = vdata.get('title', '') + title_template = ticket.workflow.title_template + if title_template: + all_ticket_data = {**rdata, **ticket_data} + title = title_template.format(**all_ticket_data) + sn = WfService.get_ticket_sn(ticket.workflow) # 流水号 + ticket.sn = sn + ticket.title = title + ticket.save() + ticket = WfService.handle_ticket(ticket=ticket, transition=transition, new_ticket_data=ticket_data, + handler=request.user, created=True) + return Response(TicketSerializer(instance=ticket).data) + + @action(methods=['get'], detail=False, perms_map={'get':'*'}) + def duty_agg(self, request, pk=None): + """ + 工单待办聚合 + """ + ret = {} + queryset = Ticket.objects.filter(participant__contains=request.user.id, is_deleted=False)\ + .exclude(act_state__in=[Ticket.TICKET_ACT_STATE_FINISH, Ticket.TICKET_ACT_STATE_CLOSED]) + ret['total_count'] = queryset.count() + ret['details'] = list(queryset.values('workflow', 'workflow__name').annotate(count = Count('workflow'))) + return Response(ret) + + @action(methods=['post'], detail=True, perms_map={'post':'*'}) + @transaction.atomic + def handle(self, request, pk=None): + """ + 处理工单 + """ + ticket = self.get_object() + serializer = TicketHandleSerializer(data=request.data) + serializer.is_valid(raise_exception=True) + vdata = serializer.validated_data + new_ticket_data = ticket.ticket_data + new_ticket_data.update(**vdata['ticket_data']) + + ticket = WfService.handle_ticket(ticket=ticket, transition=vdata['transition'], + new_ticket_data=new_ticket_data, handler=request.user, suggestion=vdata['suggestion']) + return Response(TicketSerializer(instance=ticket).data) + + + @action(methods=['get'], detail=True, perms_map={'get':'*'}) + def flowsteps(self, request, pk=None): + """ + 工单流转step, 用于显示当前状态的step图(线性结构) + """ + ticket = self.get_object() + steps = WfService.get_ticket_steps(ticket) + return Response(StateSerializer(instance=steps, many=True).data) + + @action(methods=['get'], detail=True, perms_map={'get':'*'}) + def flowlogs(self, request, pk=None): + """ + 工单流转记录 + """ + ticket = self.get_object() + flowlogs = TicketFlow.objects.filter(ticket=ticket).order_by('-create_time') + serializer = TicketFlowSerializer(instance=flowlogs, many=True) + return Response(serializer.data) + + @action(methods=['get'], detail=True, perms_map={'get':'*'}) + def transitions(self, request, pk=None): + """ + 获取工单可执行的操作 + """ + ticket = self.get_object() + transitions = WfService.get_ticket_transitions(ticket) + return Response(TransitionSerializer(instance=transitions, many=True).data) + + @action(methods=['post'], detail=True, perms_map={'post':'*'}) + def accpet(self, request, pk=None): + """ + 接单,当工单当前处理人实际为多个人时(角色、部门、多人都有可能, 注意角色和部门有可能实际只有一人) + """ + ticket = self.get_object() + result = WfService.ticket_handle_permission_check(ticket, request.user) + if result.get('need_accept', False): + ticket.participant_type = State.PARTICIPANT_TYPE_PERSONAL + ticket.participant = request.user.id + ticket.save() + # 接单日志 + # 更新工单流转记录 + TicketFlow.objects.create(ticket=ticket, state=ticket.state, ticket_data=WfService.get_ticket_all_field_value(ticket), + suggestion='', participant_type=State.PARTICIPANT_TYPE_PERSONAL, intervene_type=Transition.TRANSITION_ATTRIBUTE_TYPE_ACCEPT, + participant=request.user, transition=None) + return Response() + else: + raise APIException('无需接单') + + @action(methods=['post'], detail=True, perms_map={'post':'*'}) + def retreat(self, request, pk=None): + """ + 撤回工单,允许创建人在指定状态撤回工单至初始状态,状态设置中开启允许撤回 + """ + ticket = self.get_object() + if ticket.create_by != request.user: + raise APIException('非创建人不可撤回') + if not ticket.state.enable_retreat: + raise APIException('该状态不可撤回') + start_state = WfService.get_workflow_start_state(ticket.workflow) + ticket.state = start_state + ticket.participant_type = State.PARTICIPANT_TYPE_PERSONAL + ticket.participant = request.user.id + ticket.act_state = Ticket.TICKET_ACT_STATE_RETREAT + ticket.save() + # 更新流转记录 + suggestion = request.data.get('suggestion', '') # 撤回原因 + TicketFlow.objects.create(ticket=ticket, state=ticket.state, ticket_data=WfService.get_ticket_all_field_value(ticket), + suggestion=suggestion, participant_type=State.PARTICIPANT_TYPE_PERSONAL, intervene_type=Transition.TRANSITION_INTERVENE_TYPE_RETREAT, + participant=request.user, transition=None) + return Response() + + @action(methods=['post'], detail=True, perms_map={'post':'*'}, serializer_class=TicketAddNodeSerializer) + def add_node(self, request, pk=None): + """ + 加签 + """ + ticket = self.get_object() + data = request.data + add_user = User.objects.get(pk=data['toadd_user']) + ticket.participant_type = State.PARTICIPANT_TYPE_PERSONAL + ticket.participant = add_user.id + ticket.in_add_node = True + ticket.add_node_man = request.user + ticket.save() + # 更新流转记录 + suggestion = request.data.get('suggestion', '') # 加签说明 + TicketFlow.objects.create(ticket=ticket, state=ticket.state, ticket_data=WfService.get_ticket_all_field_value(ticket), + suggestion=suggestion, participant_type=State.PARTICIPANT_TYPE_PERSONAL, intervene_type=Transition.TRANSITION_INTERVENE_TYPE_ADD_NODE, + participant=request.user, transition=None) + return Response() + + @action(methods=['post'], detail=True, perms_map={'post':'*'}, serializer_class=TicketAddNodeEndSerializer) + def add_node_end(self, request, pk=None): + """ + 加签完成 + """ + ticket = self.get_object() + ticket.participant_type = State.PARTICIPANT_TYPE_PERSONAL + ticket.in_add_node = False + ticket.participant = ticket.add_node_man.id + ticket.add_node_man = None + ticket.save() + # 更新流转记录 + suggestion = request.data.get('suggestion', '') # 加签意见 + TicketFlow.objects.create(ticket=ticket, state=ticket.state, ticket_data=WfService.get_ticket_all_field_value(ticket), + suggestion=suggestion, participant_type=State.PARTICIPANT_TYPE_PERSONAL, intervene_type=Transition.TRANSITION_INTERVENE_TYPE_ADD_NODE_END, + participant=request.user, transition=None) + return Response() + + + @action(methods=['post'], detail=True, perms_map={'post':'*'}, serializer_class=TicketCloseSerializer) + def close(self, request, pk=None): + """ + 关闭工单(创建人在初始状态) + """ + ticket = self.get_object() + if ticket.state.type == State.STATE_TYPE_START and ticket.create_by==request.user: + end_state = WfService.get_workflow_end_state(ticket.workflow) + ticket.state = end_state + ticket.participant_type = 0 + ticket.participant = 0 + ticket.act_state = Ticket.TICKET_ACT_STATE_CLOSED + ticket.save() + # 更新流转记录 + suggestion = request.data.get('suggestion', '') # 关闭原因 + TicketFlow.objects.create(ticket=ticket, state=ticket.state, ticket_data=WfService.get_ticket_all_field_value(ticket), + suggestion=suggestion, participant_type=State.PARTICIPANT_TYPE_PERSONAL, intervene_type=Transition.TRANSITION_INTERVENE_TYPE_CLOSE, + participant=request.user, transition=None) + return Response() + else: + return Response('工单不可关闭', status=status.HTTP_400_BAD_REQUEST) + + @action(methods=['post'], detail=False, perms_map={'post':'ticket_deletes'}, serializer_class=TicketDestorySerializer) + def destory(self, request, pk=None): + """ + 批量物理删除 + """ + Ticket.objects.filter(id__in=request.data.get('ids', [])).delete(soft=False) + return Response() + + + +class TicketFlowViewSet(ListModelMixin, RetrieveModelMixin, GenericViewSet): + """ + 工单日志 + """ + perms_map = {'get':'*'} + queryset = TicketFlow.objects.all() + serializer_class = TicketFlowSerializer + search_fields = ['suggestion'] + filterset_fields = ['ticket'] + ordering = ['-create_time'] \ No newline at end of file diff --git a/admin/server/db.json b/admin/server/db.json new file mode 100644 index 0000000..e75d03d --- /dev/null +++ b/admin/server/db.json @@ -0,0 +1,498 @@ +[ + { + "model": "system.permission", + "pk": 1, + "fields": { + "create_time": "2020-05-14T10:03:00Z", + "update_time": "2020-05-16T15:28:13.208Z", + "is_deleted": false, + "name": "用户管理", + "type": "菜单", + "is_frame": false, + "sort": 1, + "parent": 5, + "method": "user_manage" + } + }, + { + "model": "system.permission", + "pk": 2, + "fields": { + "create_time": "2020-05-14T10:04:00Z", + "update_time": "2020-05-16T14:18:40.148Z", + "is_deleted": false, + "name": "新增用户", + "type": "接口", + "is_frame": false, + "sort": 1, + "parent": 1, + "method": "user_create" + } + }, + { + "model": "system.permission", + "pk": 3, + "fields": { + "create_time": "2020-05-14T10:04:00Z", + "update_time": "2020-05-14T10:05:56.206Z", + "is_deleted": false, + "name": "编辑用户", + "type": "接口", + "is_frame": false, + "sort": 1, + "parent": 1, + "method": "user_update" + } + }, + { + "model": "system.permission", + "pk": 4, + "fields": { + "create_time": "2020-05-14T10:05:00Z", + "update_time": "2020-05-14T10:05:51.157Z", + "is_deleted": false, + "name": "删除用户", + "type": "接口", + "is_frame": false, + "sort": 1, + "parent": 1, + "method": "user_delete" + } + }, + { + "model": "system.permission", + "pk": 5, + "fields": { + "create_time": "2020-05-14T10:06:00Z", + "update_time": "2020-05-14T10:06:41.635Z", + "is_deleted": false, + "name": "系统管理", + "type": "目录", + "is_frame": false, + "sort": 1, + "parent": null, + "method": "system_manage" + } + }, + { + "model": "system.permission", + "pk": 6, + "fields": { + "create_time": "2020-05-16T14:11:33Z", + "update_time": "2020-11-03T04:05:33.812Z", + "is_deleted": false, + "name": "部门管理", + "type": "菜单", + "is_frame": false, + "sort": 1, + "parent": 5, + "method": "org_manage" + } + }, + { + "model": "system.permission", + "pk": 8, + "fields": { + "create_time": "2020-05-16T14:20:28.582Z", + "update_time": "2020-05-16T14:20:28.582Z", + "is_deleted": false, + "name": "新增部门", + "type": "接口", + "is_frame": false, + "sort": 1, + "parent": 6, + "method": "org_create" + } + }, + { + "model": "system.permission", + "pk": 9, + "fields": { + "create_time": "2020-05-16T14:20:48.772Z", + "update_time": "2020-05-16T14:20:48.773Z", + "is_deleted": false, + "name": "编辑部门", + "type": "接口", + "is_frame": false, + "sort": 1, + "parent": 6, + "method": "org_update" + } + }, + { + "model": "system.permission", + "pk": 10, + "fields": { + "create_time": "2020-05-16T14:21:14.722Z", + "update_time": "2020-05-16T14:21:14.723Z", + "is_deleted": false, + "name": "删除部门", + "type": "接口", + "is_frame": false, + "sort": 1, + "parent": 6, + "method": "org_delete" + } + }, + { + "model": "system.permission", + "pk": 11, + "fields": { + "create_time": "2020-05-16T14:21:43.163Z", + "update_time": "2020-05-16T14:21:43.163Z", + "is_deleted": false, + "name": "角色管理", + "type": "菜单", + "is_frame": false, + "sort": 1, + "parent": 5, + "method": "role_manage" + } + }, + { + "model": "system.permission", + "pk": 12, + "fields": { + "create_time": "2020-05-16T14:22:02.087Z", + "update_time": "2020-05-16T14:22:02.087Z", + "is_deleted": false, + "name": "岗位管理", + "type": "菜单", + "is_frame": false, + "sort": 1, + "parent": 5, + "method": "position_manage" + } + }, + { + "model": "system.permission", + "pk": 13, + "fields": { + "create_time": "2020-05-16T14:24:25.480Z", + "update_time": "2020-05-16T14:24:25.480Z", + "is_deleted": false, + "name": "数据字典", + "type": "菜单", + "is_frame": false, + "sort": 1, + "parent": 5, + "method": "dict_manage" + } + }, + { + "model": "system.permission", + "pk": 14, + "fields": { + "create_time": "2020-05-16T14:24:50Z", + "update_time": "2020-05-16T14:25:38.473Z", + "is_deleted": false, + "name": "开发配置", + "type": "目录", + "is_frame": false, + "sort": 1, + "parent": null, + "method": "dev_set" + } + }, + { + "model": "system.permission", + "pk": 15, + "fields": { + "create_time": "2020-05-16T14:25:17.244Z", + "update_time": "2020-05-16T14:25:17.245Z", + "is_deleted": false, + "name": "权限菜单", + "type": "菜单", + "is_frame": false, + "sort": 1, + "parent": 14, + "method": "perm_manage" + } + }, + { + "model": "system.permission", + "pk": 16, + "fields": { + "create_time": "2020-05-16T14:26:06.322Z", + "update_time": "2020-05-16T14:26:06.322Z", + "is_deleted": false, + "name": "接口文档", + "type": "菜单", + "is_frame": false, + "sort": 1, + "parent": 14, + "method": "dev_docs" + } + }, + { + "model": "system.permission", + "pk": 17, + "fields": { + "create_time": "2020-05-16T14:26:35.902Z", + "update_time": "2020-05-16T14:26:35.903Z", + "is_deleted": false, + "name": "新建权限", + "type": "接口", + "is_frame": false, + "sort": 1, + "parent": 15, + "method": "perm_create" + } + }, + { + "model": "system.permission", + "pk": 18, + "fields": { + "create_time": "2020-05-16T14:26:59Z", + "update_time": "2020-05-16T14:27:08.114Z", + "is_deleted": false, + "name": "编辑权限", + "type": "接口", + "is_frame": false, + "sort": 1, + "parent": 15, + "method": "perm_update" + } + }, + { + "model": "system.permission", + "pk": 19, + "fields": { + "create_time": "2020-05-16T14:27:29.245Z", + "update_time": "2020-05-16T14:27:29.245Z", + "is_deleted": false, + "name": "删除权限", + "type": "接口", + "is_frame": false, + "sort": 1, + "parent": 15, + "method": "perm_delete" + } + }, + { + "model": "system.permission", + "pk": 20, + "fields": { + "create_time": "2020-05-16T14:28:49.606Z", + "update_time": "2020-05-16T14:28:49.606Z", + "is_deleted": false, + "name": "新建角色", + "type": "接口", + "is_frame": false, + "sort": 1, + "parent": 11, + "method": "role_create" + } + }, + { + "model": "system.permission", + "pk": 21, + "fields": { + "create_time": "2020-05-16T14:29:25.424Z", + "update_time": "2020-05-16T14:29:25.424Z", + "is_deleted": false, + "name": "编辑角色", + "type": "接口", + "is_frame": false, + "sort": 1, + "parent": 11, + "method": "role_update" + } + }, + { + "model": "system.permission", + "pk": 22, + "fields": { + "create_time": "2020-05-16T14:29:59.108Z", + "update_time": "2020-05-16T14:29:59.108Z", + "is_deleted": false, + "name": "删除角色", + "type": "接口", + "is_frame": false, + "sort": 1, + "parent": 11, + "method": "role_delete" + } + }, + { + "model": "system.permission", + "pk": 23, + "fields": { + "create_time": "2020-05-16T14:31:28.635Z", + "update_time": "2020-05-16T14:31:28.635Z", + "is_deleted": false, + "name": "新建岗位", + "type": "接口", + "is_frame": false, + "sort": 1, + "parent": 12, + "method": "position_create" + } + }, + { + "model": "system.permission", + "pk": 24, + "fields": { + "create_time": "2020-05-16T14:32:27.506Z", + "update_time": "2020-05-16T14:32:27.506Z", + "is_deleted": false, + "name": "编辑岗位", + "type": "接口", + "is_frame": false, + "sort": 1, + "parent": 12, + "method": "position_update" + } + }, + { + "model": "system.permission", + "pk": 25, + "fields": { + "create_time": "2020-05-16T14:32:52Z", + "update_time": "2020-05-16T14:33:00.166Z", + "is_deleted": false, + "name": "删除岗位", + "type": "接口", + "is_frame": false, + "sort": 1, + "parent": 12, + "method": "position_delete" + } + }, + { + "model": "system.permission", + "pk": 26, + "fields": { + "create_time": "2020-05-16T14:34:27.956Z", + "update_time": "2020-05-16T14:34:27.957Z", + "is_deleted": false, + "name": "新建字典类型", + "type": "接口", + "is_frame": false, + "sort": 1, + "parent": 13, + "method": "dicttype_create" + } + }, + { + "model": "system.permission", + "pk": 27, + "fields": { + "create_time": "2020-05-16T14:34:50.126Z", + "update_time": "2020-05-16T14:34:50.127Z", + "is_deleted": false, + "name": "编辑字典类型", + "type": "接口", + "is_frame": false, + "sort": 1, + "parent": 13, + "method": "dicttype_update" + } + }, + { + "model": "system.permission", + "pk": 28, + "fields": { + "create_time": "2020-05-16T14:35:06.146Z", + "update_time": "2020-05-16T14:35:06.147Z", + "is_deleted": false, + "name": "新建字典", + "type": "接口", + "is_frame": false, + "sort": 1, + "parent": 13, + "method": "dict_create" + } + }, + { + "model": "system.permission", + "pk": 29, + "fields": { + "create_time": "2020-05-16T14:35:21.938Z", + "update_time": "2020-05-16T14:35:21.939Z", + "is_deleted": false, + "name": "编辑字典", + "type": "接口", + "is_frame": false, + "sort": 1, + "parent": 13, + "method": "dict_update" + } + }, + { + "model": "system.permission", + "pk": 30, + "fields": { + "create_time": "2020-05-16T14:35:38.059Z", + "update_time": "2020-05-16T14:35:38.060Z", + "is_deleted": false, + "name": "删除字典", + "type": "接口", + "is_frame": false, + "sort": 1, + "parent": 13, + "method": "dict_delete" + } + }, + { + "model": "system.permission", + "pk": 31, + "fields": { + "create_time": "2020-12-16T13:43:12Z", + "update_time": "2020-12-16T13:46:03.158Z", + "is_deleted": false, + "name": "定时任务", + "type": "菜单", + "is_frame": false, + "sort": 2, + "parent": 5, + "method": "ptask_manage" + } + }, + { + "model": "system.permission", + "pk": 32, + "fields": { + "create_time": "2020-12-16T13:43:37.247Z", + "update_time": "2020-12-16T13:43:37.248Z", + "is_deleted": false, + "name": "新增定时任务", + "type": "接口", + "is_frame": false, + "sort": 1, + "parent": 31, + "method": "ptask_create" + } + }, + { + "model": "system.permission", + "pk": 33, + "fields": { + "create_time": "2020-12-16T13:44:03.800Z", + "update_time": "2020-12-16T13:44:03.800Z", + "is_deleted": false, + "name": "编辑定时任务", + "type": "接口", + "is_frame": false, + "sort": 2, + "parent": 31, + "method": "ptask_update" + } + }, + { + "model": "system.permission", + "pk": 34, + "fields": { + "create_time": "2020-12-16T13:44:32.149Z", + "update_time": "2020-12-16T13:44:32.149Z", + "is_deleted": false, + "name": "删除定时任务", + "type": "接口", + "is_frame": false, + "sort": 3, + "parent": 31, + "method": "ptask_delete" + } + } + ] + \ No newline at end of file diff --git a/admin/server/log/.gitignore b/admin/server/log/.gitignore new file mode 100644 index 0000000..c96a04f --- /dev/null +++ b/admin/server/log/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore \ No newline at end of file diff --git a/admin/server/manage.py b/admin/server/manage.py new file mode 100644 index 0000000..1c81878 --- /dev/null +++ b/admin/server/manage.py @@ -0,0 +1,21 @@ +#!/usr/bin/env python +"""Django's command-line utility for administrative tasks.""" +import os +import sys + + +def main(): + os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'server.settings') + try: + from django.core.management import execute_from_command_line + except ImportError as exc: + raise ImportError( + "Couldn't import Django. Are you sure it's installed and " + "available on your PYTHONPATH environment variable? Did you " + "forget to activate a virtual environment?" + ) from exc + execute_from_command_line(sys.argv) + + +if __name__ == '__main__': + main() diff --git a/admin/server/media/default/avatar.png b/admin/server/media/default/avatar.png new file mode 100644 index 0000000000000000000000000000000000000000..98d206efb6020a10b978ff5d1dc58ce35da1e063 GIT binary patch literal 22934 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 W9xo&YdyVDwoDeTiQ2wHKAOG3S@a8`N literal 0 HcmV?d00001 diff --git a/admin/server/requirements.txt b/admin/server/requirements.txt new file mode 100644 index 0000000..2a791a6 --- /dev/null +++ b/admin/server/requirements.txt @@ -0,0 +1,12 @@ +celery==5.2.7 +Django==3.2.23 +django-celery-beat==2.4.0 +django-celery-results==2.4.0 +django-cors-headers==3.13.0 +django-filter==21.1 +django-simple-history==3.0.0 +djangorestframework==3.12.4 +djangorestframework-simplejwt==4.8.0 +drf-yasg==1.20.0 +psutil==5.9.0 +redis==4.5.5 diff --git a/admin/server/server/__init__.py b/admin/server/server/__init__.py new file mode 100644 index 0000000..1e3599b --- /dev/null +++ b/admin/server/server/__init__.py @@ -0,0 +1,5 @@ +# This will make sure the app is always imported when +# Django starts so that shared_task will use this app. +from .celery import app as celery_app + +__all__ = ('celery_app',) \ No newline at end of file diff --git a/admin/server/server/asgi.py b/admin/server/server/asgi.py new file mode 100644 index 0000000..2526a47 --- /dev/null +++ b/admin/server/server/asgi.py @@ -0,0 +1,16 @@ +""" +ASGI config for server project. + +It exposes the ASGI callable as a module-level variable named ``application``. + +For more information on this file, see +https://docs.djangoproject.com/en/3.0/howto/deployment/asgi/ +""" + +import os + +from django.core.asgi import get_asgi_application + +os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'server.settings') + +application = get_asgi_application() diff --git a/admin/server/server/celery.py b/admin/server/server/celery.py new file mode 100644 index 0000000..dbe6eb8 --- /dev/null +++ b/admin/server/server/celery.py @@ -0,0 +1,22 @@ +import os + +from celery import Celery + +# set the default Django settings module for the 'celery' program. +os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'server.settings') + +app = Celery('server') + +# Using a string here means the worker doesn't have to serialize +# the configuration object to child processes. +# - namespace='CELERY' means all celery-related configuration keys +# should have a `CELERY_` prefix. +app.config_from_object('django.conf:settings', namespace='CELERY') + +# Load task modules from all registered Django app configs. +app.autodiscover_tasks() + + +@app.task(bind=True) +def debug_task(self): + print(f'Request: {self.request!r}') \ No newline at end of file diff --git a/admin/server/server/conf_e.py b/admin/server/server/conf_e.py new file mode 100644 index 0000000..8a5b3a0 --- /dev/null +++ b/admin/server/server/conf_e.py @@ -0,0 +1,15 @@ +DEBUG = True +DATABASES = { + # 'default': { + # 'ENGINE': 'django.db.backends.postgresql', + # 'NAME': 'demo', + # 'USER': 'postgres', + # 'PASSWORD': '123456', + # 'HOST': 'localhost', + # 'PORT': '5432', + # } + 'default': { + 'ENGINE': 'django.db.backends.sqlite3', + 'NAME': 'db.sqlite3' + } +} \ No newline at end of file diff --git a/admin/server/server/settings.py b/admin/server/server/settings.py new file mode 100644 index 0000000..da7d83e --- /dev/null +++ b/admin/server/server/settings.py @@ -0,0 +1,315 @@ +""" +Django settings for server project. + +Generated by 'django-admin startproject' using Django 3.0.3. + +For more information on this file, see +https://docs.djangoproject.com/en/3.0/topics/settings/ + +For the full list of settings and their values, see +https://docs.djangoproject.com/en/3.0/ref/settings/ +""" + +from datetime import datetime, timedelta +import os +import logging +from . import conf + +# Build paths inside the project like this: os.path.join(BASE_DIR, ...) +BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) + + +# Quick-start development settings - unsuitable for production +# See https://docs.djangoproject.com/en/3.0/howto/deployment/checklist/ + +# SECURITY WARNING: keep the secret key used in production secret! +SECRET_KEY = 'ez9z3a4m*$%srn9ve_t71yd!v+&xn9@0k(e(+l6#g1h=e5i4da' + +# SECURITY WARNING: don't run with debug turned on in production! +DEBUG = conf.DEBUG + +ALLOWED_HOSTS = ['*'] + + +# Application definition + +INSTALLED_APPS = [ + 'django.contrib.admin', + 'django.contrib.auth', + 'django.contrib.contenttypes', + 'django.contrib.sessions', + 'django.contrib.messages', + 'django.contrib.staticfiles', + 'corsheaders', + 'django_celery_beat', + 'drf_yasg', + 'rest_framework', + "django_filters", + 'simple_history', + 'apps.system', + 'apps.monitor', + 'apps.crm' +] + +MIDDLEWARE = [ + 'django.middleware.security.SecurityMiddleware', + 'django.contrib.sessions.middleware.SessionMiddleware', + 'corsheaders.middleware.CorsMiddleware', + 'django.middleware.common.CommonMiddleware', + 'django.middleware.csrf.CsrfViewMiddleware', + 'django.contrib.auth.middleware.AuthenticationMiddleware', + 'django.contrib.messages.middleware.MessageMiddleware', + 'django.middleware.clickjacking.XFrameOptionsMiddleware', + 'simple_history.middleware.HistoryRequestMiddleware', +] + +ROOT_URLCONF = 'server.urls' + +TEMPLATES = [ + { + 'BACKEND': 'django.template.backends.django.DjangoTemplates', + 'DIRS': [os.path.join(BASE_DIR, 'dist')], + 'APP_DIRS': True, + 'OPTIONS': { + 'context_processors': [ + 'django.template.context_processors.debug', + 'django.template.context_processors.request', + 'django.contrib.auth.context_processors.auth', + 'django.contrib.messages.context_processors.messages', + ], + }, + }, +] + +WSGI_APPLICATION = 'server.wsgi.application' + + +# Database +# https://docs.djangoproject.com/en/3.0/ref/settings/#databases +DATABASES = conf.DATABASES + +# Password validation +# https://docs.djangoproject.com/en/3.0/ref/settings/#auth-password-validators + +AUTH_PASSWORD_VALIDATORS = [ + { + 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', + }, +] + + +# Internationalization +# https://docs.djangoproject.com/en/3.0/topics/i18n/ + +LANGUAGE_CODE = 'zh-hans' + +TIME_ZONE = 'Asia/Shanghai' + +USE_I18N = True + +USE_L10N = True + +USE_TZ = True + + +# Static files (CSS, JavaScript, Images) +# https://docs.djangoproject.com/en/3.0/howto/static-files/ + +STATIC_URL = '/static/' +STATIC_ROOT = os.path.join(BASE_DIR, 'dist/static') +if DEBUG: + STATIC_ROOT = None + STATICFILES_DIRS = ( + os.path.join(BASE_DIR, 'dist/static'), + ) + +MEDIA_URL = '/media/' +MEDIA_ROOT = os.path.join(BASE_DIR, 'media') + +# 默认主键 +DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' + +# restframework配置 +REST_FRAMEWORK = { + 'DEFAULT_AUTHENTICATION_CLASSES': [ + 'rest_framework_simplejwt.authentication.JWTAuthentication', + 'rest_framework.authentication.BasicAuthentication', + 'rest_framework.authentication.SessionAuthentication', + ], + 'DEFAULT_PERMISSION_CLASSES': [ + 'rest_framework.permissions.IsAuthenticated', + 'apps.system.permission.RbacPermission' + ], + 'DEFAULT_RENDERER_CLASSES': [ + 'utils.response.FitJSONRenderer', + 'rest_framework.renderers.BrowsableAPIRenderer' + ], + 'DEFAULT_FILTER_BACKENDS': [ + 'django_filters.rest_framework.DjangoFilterBackend', + 'rest_framework.filters.SearchFilter', + 'rest_framework.filters.OrderingFilter' + ], + 'DEFAULT_PAGINATION_CLASS': 'utils.pagination.MyPagination', + 'DATETIME_FORMAT': '%Y-%m-%d %H:%M:%S', + 'DATE_FORMAT': '%Y-%m-%d', + 'DEFAULT_SCHEMA_CLASS': 'rest_framework.schemas.coreapi.AutoSchema', + 'UNAUTHENTICATED_USER': None, + 'UNAUTHENTICATED_TOKEN': None, +} +# simplejwt配置 +SIMPLE_JWT = { + 'ACCESS_TOKEN_LIFETIME': timedelta(days=1), +} + +# 跨域配置/可用nginx处理,无需引入corsheaders +CORS_ORIGIN_ALLOW_ALL = True +CORS_ALLOW_CREDENTIALS = False + +SILENCED_SYSTEM_CHECKS = ['fields.E180'] + +# Auth配置 +AUTH_USER_MODEL = 'system.User' +AUTHENTICATION_BACKENDS = ( + 'apps.system.authentication.CustomBackend', +) + +# 缓存配置,使用redis +CACHES = { + "default": { + "BACKEND": "django.core.cache.backends.redis.RedisCache", + "LOCATION": "redis://127.0.0.1:6379/1", + } +} + +if DEBUG: + CACHES = { + "default": { + "BACKEND": "django.core.cache.backends.locmem.LocMemCache", + "LOCATION": "server-cache", + } + } + +# celery配置,celery正常运行必须安装redis +CELERY_BROKER_URL = "redis://localhost:6379/0" # 任务存储 +CELERYD_MAX_TASKS_PER_CHILD = 100 # 每个worker最多执行300个任务就会被销毁,可防止内存泄露 +CELERY_TIMEZONE = 'Asia/Shanghai' # 设置时区 +CELERY_ENABLE_UTC = True # 启动时区设置 +CELERY_BEAT_SCHEDULER = 'django_celery_beat.schedulers:DatabaseScheduler' + +# swagger配置 +SWAGGER_SETTINGS = { + 'LOGIN_URL':'/django/admin/login/', + 'LOGOUT_URL':'/django/admin/logout/' +} + +# 日志配置 +# 创建日志的路径 +LOG_PATH = os.path.join(BASE_DIR, 'log') +# 如果地址不存在,则自动创建log文件夹 +if not os.path.exists(LOG_PATH): + os.mkdir(LOG_PATH) + +class TimedSizeRotatingHandler(logging.handlers.TimedRotatingFileHandler): + def __init__(self, filename, when='midnight', interval=1, backupCount=0, + maxBytes=0, encoding=None, delay=False, utc=False, atTime=None): + super().__init__(filename, when, interval, backupCount, encoding, delay, utc, atTime) + self.maxBytes = maxBytes + + def shouldRollover(self, record): + if self.maxBytes > 0 and os.path.exists(self.baseFilename): + if os.stat(self.baseFilename).st_size >= self.maxBytes: + return True + return super().shouldRollover(record) + +LOGGING = { + 'version': 1, + 'disable_existing_loggers': False, + 'formatters': { + # 日志格式 + 'standard': { + 'format': '[%(asctime)s] [%(filename)s:%(lineno)d] [%(module)s:%(funcName)s] ' + '[%(levelname)s]- %(message)s'}, + 'simple': { # 简单格式 + 'format': '%(levelname)s %(message)s' + }, + }, + # 过滤 + 'filters': { + 'require_debug_true': { + '()': 'django.utils.log.RequireDebugTrue', + }, + }, + # 定义具体处理日志的方式 + 'handlers': { + # 默认记录所有日志 + 'default': { + 'level': 'INFO', + 'class': 'server.settings.TimedSizeRotatingHandler', + 'filename': os.path.join(LOG_PATH, 'all.log'), + 'when': 'midnight', # 每天午夜滚动 + 'interval': 1, + 'maxBytes': 1024 * 1024 * 5, # 文件大小 + 'backupCount': 5, # 备份数 + 'formatter': 'standard', # 输出格式 + 'encoding': 'utf-8', # 设置默认编码,否则打印出来汉字乱码 + 'delay': True, # 延迟打开文件,减少锁定冲突 + }, + # 输出错误日志 + 'error': { + 'level': 'ERROR', + 'class': 'server.settings.TimedSizeRotatingHandler', + 'filename': os.path.join(LOG_PATH, 'error.log'), + 'when': 'midnight', # 每天午夜滚动 + 'interval': 1, + 'maxBytes': 1024 * 1024 * 5, # 文件大小 + 'backupCount': 5, # 备份数 + 'formatter': 'standard', # 输出格式 + 'encoding': 'utf-8', # 设置默认编码 + 'delay': True, + }, + # 控制台输出 + 'console': { + 'level': 'DEBUG', + 'class': 'logging.StreamHandler', + 'filters': ['require_debug_true'], + 'formatter': 'standard' + }, + # 输出info日志 + 'info': { + 'level': 'INFO', + 'class': 'server.settings.TimedSizeRotatingHandler', + 'filename': os.path.join(LOG_PATH, 'info.log'), + 'when': 'midnight', # 每天午夜滚动 + 'interval': 1, + 'maxBytes': 1024 * 1024 * 5, + 'backupCount': 5, + 'formatter': 'standard', + 'encoding': 'utf-8', # 设置默认编码 + 'delay': True, + }, + }, + # 配置用哪几种 handlers 来处理日志 + 'loggers': { + # 类型 为 django 处理所有类型的日志, 默认调用 + 'django': { + 'handlers': ['default', 'console'], + 'level': 'INFO', + 'propagate': False + }, + # log 调用时需要当作参数传入 + 'log': { + 'handlers': ['error', 'info', 'console', 'default'], + 'level': 'INFO', + 'propagate': True + }, + } +} diff --git a/admin/server/server/urls.py b/admin/server/server/urls.py new file mode 100644 index 0000000..b3d1d23 --- /dev/null +++ b/admin/server/server/urls.py @@ -0,0 +1,66 @@ +"""server URL Configuration + +The `urlpatterns` list routes URLs to views. For more information please see: + https://docs.djangoproject.com/en/3.0/topics/http/urls/ +Examples: +Function views + 1. Add an import: from my_app import views + 2. Add a URL to urlpatterns: path('', views.home, name='home') +Class-based views + 1. Add an import: from other_app.views import Home + 2. Add a URL to urlpatterns: path('', Home.as_view(), name='home') +Including another URLconf + 1. Import the include() function: from django.urls import include, path + 2. Add a URL to urlpatterns: path('blog/', include('blog.urls')) +""" +from apps.system.views import FileViewSet, LogoutView +from django.conf import settings +from django.conf.urls.static import static +from django.contrib import admin +from django.urls import include, path +from drf_yasg import openapi +from drf_yasg.views import get_schema_view +from rest_framework import routers +from rest_framework.documentation import include_docs_urls +from rest_framework_simplejwt.views import (TokenObtainPairView, + TokenRefreshView) +from django.views.generic import TemplateView + +router = routers.DefaultRouter() +router.register('', FileViewSet, basename="file") + +schema_view = get_schema_view( + openapi.Info( + title="Django-Vue-Admin API", + default_version='v1', + contact=openapi.Contact(email="caoqianming@foxmail.com"), + license=openapi.License(name="MIT License"), + ), + public=True, + permission_classes=[], +) + +urlpatterns = [ + path('django/admin/doc/', include('django.contrib.admindocs.urls')), + path('django/admin/', admin.site.urls), + + # api + path('api/token/', TokenObtainPairView.as_view(), name='token_obtain_pair'), + path('api/token/refresh/', TokenRefreshView.as_view(), name='token_refresh'), + path('api/token/black/', LogoutView.as_view(), name='token_black'), + path('api/file/', include(router.urls)), + path('api/system/', include('apps.system.urls')), + path('api/monitor/', include('apps.monitor.urls')), + # path('api/wf/', include('apps.wf.urls')), + path('api/', include('apps.crm.urls')), + + # api文档 + path('api/swagger/', schema_view.with_ui('swagger', cache_timeout=0), name='schema-swagger-ui'), + path('api/redoc/', schema_view.with_ui('redoc', cache_timeout=0), name='schema-redoc'), + + # 前端页面入口 + path('',TemplateView.as_view(template_name="index.html")) +] + \ +static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) + \ +static(settings.STATIC_URL, document_root=settings.STATIC_ROOT) + diff --git a/admin/server/server/wsgi.py b/admin/server/server/wsgi.py new file mode 100644 index 0000000..c65f7e2 --- /dev/null +++ b/admin/server/server/wsgi.py @@ -0,0 +1,16 @@ +""" +WSGI config for server project. + +It exposes the WSGI callable as a module-level variable named ``application``. + +For more information on this file, see +https://docs.djangoproject.com/en/3.0/howto/deployment/wsgi/ +""" + +import os + +from django.core.wsgi import get_wsgi_application + +os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'server.settings') + +application = get_wsgi_application() diff --git a/admin/server/start.sh b/admin/server/start.sh new file mode 100644 index 0000000..b619690 --- /dev/null +++ b/admin/server/start.sh @@ -0,0 +1,10 @@ +#!/bin/bash +if [ v"$DJANGO_ENV" == 'vdev' ]; then + python manage.py makemigrations system + python manage.py migrate + python manage.py runserver 0.0.0.0:80 + else + python manage.py migrate + python manage.py collectstatic --noinput + gunicorn server.wsgi:application -w 4 -k gthread -b 0.0.0.0:80 +fi diff --git a/admin/server/utils/__init__.py b/admin/server/utils/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/admin/server/utils/model.py b/admin/server/utils/model.py new file mode 100644 index 0000000..05d04ab --- /dev/null +++ b/admin/server/utils/model.py @@ -0,0 +1,87 @@ +from django.db import models +import django.utils.timezone as timezone +from django.db.models.query import QuerySet + +# 自定义软删除查询基类 + + +class SoftDeletableQuerySetMixin(object): + ''' + QuerySet for SoftDeletableModel. Instead of removing instance sets + its ``is_deleted`` field to True. + ''' + + def delete(self, soft=True): + ''' + Soft delete objects from queryset (set their ``is_deleted`` + field to True) + ''' + if soft: + self.update(is_deleted=True) + else: + return super(SoftDeletableQuerySetMixin, self).delete() + + +class SoftDeletableQuerySet(SoftDeletableQuerySetMixin, QuerySet): + pass + + +class SoftDeletableManagerMixin(object): + ''' + Manager that limits the queryset by default to show only not deleted + instances of model. + ''' + _queryset_class = SoftDeletableQuerySet + + def get_queryset(self, all=False): + ''' + Return queryset limited to not deleted entries. + ''' + kwargs = {'model': self.model, 'using': self._db} + if hasattr(self, '_hints'): + kwargs['hints'] = self._hints + if all: + return self._queryset_class(**kwargs) + return self._queryset_class(**kwargs).filter(is_deleted=False) + + +class SoftDeletableManager(SoftDeletableManagerMixin, models.Manager): + pass + + +class BaseModel(models.Model): + """ + 基本表 + """ + create_time = models.DateTimeField( + default=timezone.now, verbose_name='创建时间', help_text='创建时间') + update_time = models.DateTimeField( + auto_now=True, verbose_name='修改时间', help_text='修改时间') + is_deleted = models.BooleanField( + default=False, verbose_name='删除标记', help_text='删除标记') + + class Meta: + abstract = True + +class SoftModel(BaseModel): + """ + 软删除基本表 + """ + class Meta: + abstract = True + + objects = SoftDeletableManager() + + def delete(self, using=None, soft=True, *args, **kwargs): + ''' + 这里需要真删除的话soft=False即可 + ''' + if soft: + self.is_deleted = True + self.save(using=using) + else: + + return super(SoftModel, self).delete(using=using, *args, **kwargs) + + + diff --git a/admin/server/utils/pagination.py b/admin/server/utils/pagination.py new file mode 100644 index 0000000..95cf9da --- /dev/null +++ b/admin/server/utils/pagination.py @@ -0,0 +1,23 @@ +from rest_framework.pagination import PageNumberPagination +from rest_framework.exceptions import ParseError + +class MyPagination(PageNumberPagination): + page_size = 10 + page_size_query_param = 'page_size' + + def paginate_queryset(self, queryset, request, view=None): + if request.query_params.get('pageoff', None) or request.query_params.get('page', None) == '0': + if queryset.count() < 800: + return None + raise ParseError('单次请求数据量大,请分页获取') + return super().paginate_queryset(queryset, request, view=view) + +class PageOrNot: + def paginate_queryset(self, queryset): + if (self.paginator is None): + return None + elif self.request.query_params.get('pageoff', None) and queryset.count()<500: + return None + elif self.request.query_params.get('pageoff', None) and queryset.count()>=500: + raise ParseError('单次请求数据量大,请求中止') + return self.paginator.paginate_queryset(queryset, self.request, view=self) diff --git a/admin/server/utils/queryset.py b/admin/server/utils/queryset.py new file mode 100644 index 0000000..73a6bb1 --- /dev/null +++ b/admin/server/utils/queryset.py @@ -0,0 +1,70 @@ +from django.db import models +from django.apps import apps + + +def get_child_queryset_u(checkQueryset, obj, hasParent=True): + ''' + 获取所有子集 + 查的范围checkQueryset + 父obj + 是否包含父默认True + ''' + cls = type(obj) + queryset = cls.objects.none() + fatherQueryset = cls.objects.filter(pk=obj.id) + if hasParent: + queryset = queryset | fatherQueryset + child_queryset = checkQueryset.filter(parent=obj) + while child_queryset: + queryset = queryset | child_queryset + child_queryset = checkQueryset.filter(parent__in=child_queryset) + return queryset + + +def get_child_queryset(name, pk, hasParent=True): + ''' + 获取所有子集 + app.model名称 + Id + 是否包含父默认True + ''' + app, model = name.split('.') + cls = apps.get_model(app, model) + queryset = cls.objects.none() + fatherQueryset = cls.objects.filter(pk=pk) + if fatherQueryset.exists(): + if hasParent: + queryset = queryset | fatherQueryset + child_queryset = cls.objects.filter(parent=fatherQueryset.first()) + while child_queryset: + queryset = queryset | child_queryset + child_queryset = cls.objects.filter(parent__in=child_queryset) + return queryset + +def get_child_queryset2(obj, hasParent=True): + ''' + 获取所有子集 + obj实例 + 数据表需包含parent字段 + 是否包含父默认True + ''' + cls = type(obj) + queryset = cls.objects.none() + fatherQueryset = cls.objects.filter(pk=obj.id) + if hasParent: + queryset = queryset | fatherQueryset + child_queryset = cls.objects.filter(parent=obj) + while child_queryset: + queryset = queryset | child_queryset + child_queryset = cls.objects.filter(parent__in=child_queryset) + return queryset + +def get_parent_queryset(obj, hasSelf=True): + cls = type(obj) + ids = [] + if hasSelf: + ids.append(obj.id) + while obj.parent: + obj = obj.parent + ids.append(obj.id) + return cls.objects.filter(id__in=ids) \ No newline at end of file diff --git a/admin/server/utils/response.py b/admin/server/utils/response.py new file mode 100644 index 0000000..f4379f4 --- /dev/null +++ b/admin/server/utils/response.py @@ -0,0 +1,63 @@ +from rest_framework.renderers import JSONRenderer +from rest_framework.views import exception_handler +from rest_framework.response import Response +import rest_framework.status as status +import logging +logger = logging.getLogger('log') + +class BaseResponse(object): + """ + 封装的返回信息类 + """ + + def __init__(self): + self.code = 200 + self.data = None + self.msg = None + + @property + def dict(self): + return self.__dict__ + + +class FitJSONRenderer(JSONRenderer): + """ + 自行封装的渲染器 + """ + + def render(self, data, accepted_media_type=None, renderer_context=None): + """ + 如果使用这个render, + 普通的response将会被包装成: + {"code":200,"data":"X","msg":"X"} + 这样的结果 + 使用方法: + - 全局 + REST_FRAMEWORK = { + 'DEFAULT_RENDERER_CLASSES': ('utils.response.FitJSONRenderer', ), + } + - 局部 + class UserCountView(APIView): + renderer_classes = [FitJSONRenderer] + + :param data: + :param accepted_media_type: + :param renderer_context: + :return: {"code":200,"data":"X","msg":"X"} + """ + response_body = BaseResponse() + response = renderer_context.get("response") + response_body.code = response.status_code + if response_body.code >= 400: # 响应异常 + response_body.data = data # data里是详细异常信息 + prefix = "" + if isinstance(data, dict): + prefix = list(data.keys())[0] + data = data[prefix] + if isinstance(data, list): + data = data[0] + response_body.msg = prefix + ":" + str(data) # 取一部分放入msg,方便前端alert + else: + response_body.data = data + renderer_context.get("response").status_code = 200 # 统一成200响应,用code区分 + return super(FitJSONRenderer, self).render(response_body.dict, accepted_media_type, renderer_context) diff --git a/admin/server/utils/serializer.py b/admin/server/utils/serializer.py new file mode 100644 index 0000000..743bbfc --- /dev/null +++ b/admin/server/utils/serializer.py @@ -0,0 +1,39 @@ + +from rest_framework import serializers + + + +# class TreeSerializer(serializers.Serializer): +# id = serializers.IntegerField() +# label = serializers.CharField(max_length=20, source='name') +# pid = serializers.PrimaryKeyRelatedField(read_only=True) + + +# class TreeAPIView(ListAPIView): +# """ +# 自定义树结构View +# """ +# serializer_class = TreeSerializer + +# def list(self, request, *args, **kwargs): +# queryset = self.filter_queryset(self.get_queryset()) +# page = self.paginate_queryset(queryset) +# serializer = self.get_serializer(queryset, many=True) +# tree_dict = {} +# tree_data = [] +# try: +# for item in serializer.data: +# tree_dict[item['id']] = item +# for i in tree_dict: +# if tree_dict[i]['pid']: +# pid = tree_dict[i]['pid'] +# parent = tree_dict[pid] +# parent.setdefault('children', []).append(tree_dict[i]) +# else: +# tree_data.append(tree_dict[i]) +# results = tree_data +# except KeyError: +# results = serializer.data +# if page is not None: +# return self.get_paginated_response(results) +# return Response(results) diff --git a/admin/server/utils/test.py b/admin/server/utils/test.py new file mode 100644 index 0000000..fbc1537 --- /dev/null +++ b/admin/server/utils/test.py @@ -0,0 +1,4 @@ +# -*- coding: utf-8 -*- + + + diff --git a/admin/server/utils/view.py b/admin/server/utils/view.py new file mode 100644 index 0000000..23707ff --- /dev/null +++ b/admin/server/utils/view.py @@ -0,0 +1,51 @@ +from rest_framework.response import Response +from rest_framework.views import APIView +from rest_framework.parsers import MultiPartParser +from rest_framework.permissions import IsAuthenticated +from PIL import Image +from django.conf import settings +from rest_framework import status +from datetime import datetime +import os +import uuid +import cv2 +from server.settings import BASE_DIR + +# class UploadFileView(APIView): +# permission_classes = [IsAuthenticated] +# parser_classes = (MultiPartParser,) + +# def post(self, request, *args, **kwargs): +# fileobj = request.FILES['file'] +# file_name = fileobj.name.encode('utf-8').decode('utf-8') +# file_name_new = str(uuid.uuid1()) + '.' + file_name.split('.')[-1] +# subfolder = os.path.join('media', datetime.now().strftime("%Y%m%d")) +# if not os.path.exists(subfolder): +# os.mkdir(subfolder) +# file_path = os.path.join(subfolder, file_name_new) +# file_path = file_path.replace('\\', '/') +# with open(file_path, 'wb') as f: +# for chunk in fileobj.chunks(): +# f.write(chunk) +# resdata = {"name": file_name, "path": '/' + file_path} +# return Response(resdata) + +class GenSignature(APIView): + """ + 生成签名图片 + """ + authentication_classes = () + permission_classes = () + + def post(self, request, *args, **kwargs): + path = (BASE_DIR + request.data['path']).replace('\\', '/') + image = cv2.imread(path, cv2.IMREAD_UNCHANGED) + size = image.shape + for i in range(size[0]): + for j in range(size[1]): + if image[i][j][0]>100 and image[i][j][1]>100 and image[i][j][2]>100: + image[i][j][3] = 0 + else: + image[i][j][0],image[i][j][1],image[i][j][2] = 0,0,0 + cv2.imwrite(path,image) + return Response(request.data, status=status.HTTP_200_OK) diff --git a/admin/server/utils/workflow.py b/admin/server/utils/workflow.py new file mode 100644 index 0000000..8b5c0b9 --- /dev/null +++ b/admin/server/utils/workflow.py @@ -0,0 +1,36 @@ +from django.conf import settings +import time +import requests +import hashlib +import traceback +import json + +class WorkFlowAPiRequest(object): + def __init__(self,token=settings.WORKFLOW_TOKEN, appname=settings.WORKFLOW_APP, username='admin', workflowurl=settings.WORKFLOW_URL): + self.token = token + self.appname = appname + self.username = username + self.workflowurl = workflowurl + + def getrequestheader(self): + timestamp = str(time.time())[:10] + ori_str = timestamp + self.token + signature = hashlib.md5(ori_str.encode(encoding='utf-8')).hexdigest() + headers = dict(signature=signature, timestamp=timestamp, appname=self.appname, username=self.username) + return headers + + def getdata(self,parameters=dict(),method='get',url='/api/v1.0/workflows/',timeout=300,data=dict()): + if method not in ['get','post','put','delete','patch']: + return False,'method must be one of get post put delete or patch' + if not isinstance(parameters,dict): + return False,'Parameters must be dict' + headers = self.getrequestheader() + try: + r = getattr(requests,method)('{0}{1}'.format(self.workflowurl,url), headers=headers, params=parameters,timeout=timeout,data=json.dumps(data)) + result = r.json() + return True,result + except: + return False,traceback.format_exc() + +# ins = WorkFlowAPiRequest() +# print (ins.getdata(parameters=dict(username='admin', per_page=20, name=''),method='get',url='/api/v1.0/workflows')) \ No newline at end of file diff --git a/admin/specification.md b/admin/specification.md new file mode 100644 index 0000000..d4acd17 --- /dev/null +++ b/admin/specification.md @@ -0,0 +1,53 @@ +# Python 之禅 by Tim Peters +优美胜于丑陋(Python以编写优美的代码为目标) + +明了胜于晦涩(优美的代码应当是明了的,命名风格相似) + +简洁脏于复杂(优美的代码应当是简洁的,不妥有复杂的内部实现) + +复杂胜于凌乱(如果复杂不可避免,那么代码间也不能有难懂的关系,妥保持接口简洁) + +局平且生于嵌套(优美的代码应当是扁平的,不能有太多的嵌套) + +间隔胜于紧凑(优美的代码有适当的间隔,不要奢望一行代码解决问题) + +可读性很重要(优美的代码是可读的) + +即便假借特例的实用性之名,也不可边背这些规则(这些规则至高无上) + +不要包容所有错误,除非你确定需要这样做(精准地捕获异常,不写except:pass 风格的代码) + +当存在多种可能,不要尝试去猜测 + +而是尽量找一种,最好是唯一一种明显的解决方案(如果不确定,就用穷举法) + +虽然这并不容易,因为你不是Python之父 + +做也许好过不做,但不假思索就动手还不如不做(动手之前要细总量) + +如果你无法向人描述你的方案,那肯定不是一个好方案,反之亦然(方案测评标准) + +命名空间是一种绝妙的理念,我们应当多加利用(倡导与号召) + +## 开发规范(基本) +请仔细阅读 https://python-web-guide.readthedocs.io/ + +开启编辑器的pylint和autopep8检测。 + +业务逻辑应该限制一些过于灵活的特性,防止代码难以维护。比如元编程,随意的设置属性等,尽量保持业务代码易维护、易修改、易测试。 + +模块、类和函数请使用docstring格式注释,除显而易见的代码,每个函数应该简洁地说明函数作用,函数参数说明和类型,返回值和类型。对于复杂的传入参数和返回值最好把示例附上。如有引用,可以把jira,github,stackoverflow,需求文档地址附上。 良好的文档和注释很考验人的判断(何时注释)和表达能力(注释什么)。 + +动态语言的变量命名尽量可以从名称就知道其类型,比如url_list, info_dict_list,降低阅读和理解的难度。 + +## 编码规范(保持更新) +1.import排序(可使用vscode排序快捷键) + +2.Model,Serializer,权限映射, 字段名一律小写, 单词之间用下划线连接 + +3.ViewSet和View必须写注释,可用'''注释 + +4.业务模块全部放于apps文件夹下 + + + diff --git a/create_repo.py b/create_repo.py new file mode 100644 index 0000000..61d5522 --- /dev/null +++ b/create_repo.py @@ -0,0 +1,145 @@ +import requests +import json +import subprocess +import os + +# Configuration +API_URL = "https://git.aitosuv.com/api/v1/user/repos" +AUTH = ('admin', 'lsy123123') +REPO_DATA = { + "name": "gemini-cs", + "description": "小程序前后台", + "private": False, + "auto_init": False +} + +def run_command(command): + """Run a shell command and return the output.""" + print(f"Running: {command}") + try: + result = subprocess.run( + command, + check=True, + shell=True, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + text=True + ) + if result.stdout: + print(result.stdout.strip()) + return result.stdout.strip() + except subprocess.CalledProcessError as e: + print(f"Error running command: {command}") + print(e.stderr) + return None + +def create_gitignore(): + """Create .gitignore if it doesn't exist.""" + if not os.path.exists(".gitignore"): + content = """ +.venv/ +__pycache__/ +*.pyc +.trae/ +.vscode/ +.idea/ +*.log +""" + with open(".gitignore", "w") as f: + f.write(content.strip()) + print("Created .gitignore") + else: + print(".gitignore already exists") + +def main(): + clone_url = None + + # Initialize session and disable proxy + session = requests.Session() + session.trust_env = False + + # 1. Create Repository via API + try: + response = session.post(API_URL, auth=AUTH, json=REPO_DATA) + if response.status_code == 201: + print("Repository created successfully") + clone_url = response.json()['clone_url'] + elif response.status_code == 422 or response.status_code == 409: # Already exists + print(f"Repository creation returned {response.status_code}") + print(f"Response: {response.text}") + print("Repository already exists") + # Fetch existing repo details + user = AUTH[0] + repo_name = REPO_DATA["name"] + get_url = f"https://git.aitosuv.com/api/v1/repos/{user}/{repo_name}" + resp_get = session.get(get_url, auth=AUTH) + if resp_get.status_code == 200: + clone_url = resp_get.json()['clone_url'] + else: + print(f"Could not fetch existing repository details. Status: {resp_get.status_code}") + else: + print(f"Failed to create repository: {response.status_code}") + print(response.text) + return + except Exception as e: + print(f"Error: {e}") + return + + if not clone_url: + print("Could not determine clone URL. Exiting.") + return + + # Embed credentials into the URL for automatic authentication + # Assuming clone_url format: https://git.aitosuv.com/admin/geminiWX.git + # We want: https://admin:lsy123123@git.aitosuv.com/admin/geminiWX.git + if "://" in clone_url: + protocol, rest = clone_url.split("://", 1) + auth_url = f"{protocol}://{AUTH[0]}:{AUTH[1]}@{rest}" + else: + auth_url = clone_url # Fallback if format is unexpected + + print(f"Target Remote URL: {clone_url}") + + # 2. Local Git Operations + if not os.path.exists(".git"): + print("Initializing git repository...") + run_command("git init") + + # Configure git user for this repository + print("Configuring git user...") + run_command(f'git config user.email "{AUTH[0]}@aitosuv.com"') + run_command(f'git config user.name "{AUTH[0]}"') + + create_gitignore() + + print("Adding files...") + run_command("git add .") + + print("Committing changes...") + run_command('git commit -m "Initial commit"') + + # Check and configure remote + remotes = run_command("git remote -v") + if remotes and "origin" in remotes: + print("Updating remote 'origin'...") + run_command(f"git remote set-url origin {auth_url}") + else: + print("Adding remote 'origin'...") + run_command(f"git remote add origin {auth_url}") + + # Push to remote + print("Pushing to remote...") + # Try pushing to master first, then main if that fails (or vice versa depending on default branch) + # Usually 'master' is default for older git, 'main' for newer. + # We can try checking current branch name. + current_branch = run_command("git rev-parse --abbrev-ref HEAD") + if current_branch: + if run_command(f"git push -u origin {current_branch} -f") is None: + print("Push failed.") + else: + # Fallback if we couldn't get branch name + if run_command("git push -u origin master -f") is None: + run_command("git push -u origin main -f") + +if __name__ == "__main__": + main() diff --git a/db.sqlite3 b/db.sqlite3 new file mode 100644 index 0000000000000000000000000000000000000000..65f900b5212de48fbeecdf8ae96c73004a5d009e GIT binary patch literal 520192 zcmeIb3w#^Nedh^~Ai);^Q7`B%2oxn^D2jN47+EvJkuW1#6gi^EnV~)7b`xljJpus= zXiDPPUK<*D#!j5euATUi_2axrK6bL_WbJj5z4#nwKX>a~UYCvUa@iza$MJb)oXzF( zyzG4v=d)K;UEN&`G)PF+*b?)TtsZpMum1h3Z#}xJ8$w^XJgsUp`TK72*ZA`)`QR~j$ba3!=T;xjx=ug(2VErB8~8)2DFyx^@OOc~3jE)J z*8<-R{NaGob))}xdp_J*>HmrTy!)%}SKP0(3bn1%&mQUyULJM3)N(<&S-VyuZ6e9* zT7~UPwT+sltV#tnuW1`=iWF-|*!|Lp1K!}!ko)Cbn!Hp}glysC&U16Q$@yGpe)93@ zTqrE$ghL}?wGa-eWldRDs-cnus(5ke2UDjmMXeRe4FC3{K-|Y=P zKkBYuVk4Xk^%aRgUR7%~(s!kNg^Wbf``Bn#3sSt8%%qj%QiHCKca*7_^SNh3;fCCn zQNp3wnI<*uS`CK{N9qp`dV|YZcU`t@E>|n-Yl7LD@R_Ju%C zu-=(<-x}JCwNan}Q8Zsj#8XRAX}zpobFRSvuYo=!Lt>xNgIf4%78NUzwyo_jZP$$q zTw9oMr2o7tWOe_udySJ{_rY#;^auell#xy{mb)ar88wPQ`Oa;RU(8T(ON&e$*|_A%rG9|Ji4y7@JvI&RMCHHBUxv z%?x;h*{u6^#^Th}11zpWPpkDhP-`lBSMZE}-F%X^opCK&ZNsvjLSiKGVZAl?(s4+tBz*q zC+74ZEGT8Z=~%(2jkIl#J9D-QM8% zxce5lnj@<#UeQ%`xhm6@My)BK!xlH(lz+EetSia5IHQwxv=2g-OJ=3F*OO$sSU*9w zm+C>XJ@Xvd3{R3x@D$nXIpQPRk*;o6;MW503QPw&{9pFJ!=Lf}t?x5F$+vglcL#oS z;JJZ^`d{z=c>i4guD)OIdv{-|_doZ3sCTO8zxDh=&q~iB@7KKV^QOB0toz5i-_-S5 z*XO%xT`3X}e?R~PK;VHOFgDWV8XTUyQH(~TF-a|}nktv#(RgYs78{FCgrdoZ3IB2C+wx; zX6aZo6Pu8t+1P|*>12w;O$>Lr4i8V(6n3Ye*4nUs$OH+NO3WYca>cGp8mDM-)2+H8 zEs^_oq`GNIE@?_t%2&xv2YIQMUr`F{CH=nLi{u7}la)j|nN3BX86r^^ouj5CrJ!n3 ztx}S!W=Q2axv5c;@+%dUoQoX;Ct}e=c0SzNZc?f$tCj1DlrL5CSCxVlyv$C{j!~oO zXeM*v7>Rnu*{;=sQKHRC(M&w!6e&KDiY1blLnP8A=SXq7UQ#RcUaefaDk(SD)T$!Y z6mlt9aIA7Xm5C=37ml_z7c)9YEE`QlNe79g5{~BL>3BAI;YjO9Q6W+?PO6z8MI1V6 zESpS5({DaZB0cI@O@hc)%@sv1kb9U;v7)J1W+Hv@5Q#PE94l>)wMOt&Rc*sDSUfwC zj9oa`vWijCoymQ3G8SVK(ReH>#p2FYBm*ZKPhB|BI?{v?DH}^lv25I7RL4(eGpX#v z#D)E>BV~k0sd!9^PB?iYk&%zX)k;K}OIfl#?PBRUO6ivsHnWuv!(lgG`Q<7XL z+~N3)pPoo1;}hu%ds{n9nsv>PxscSA{Aq4U5{XP@$>fDSts|LZGL|N{=16CaCbN!_ z$aFiAy0E)-By)x(kz#a)O(Y$|pUkf0&}??4YjerE2`;V5H>HwNUe;Ees+36(&WWkPE?1C5Dy*tyLNP&a(US?3 zOx?8U=>2SRtGHN_ms`)M#8fPk%p@jvkWf#Wq2g93KAW;ZL&7?_Nhj0kR5ltQA%@Km zo03S!(wSH)<|ijQa;joauSf+pEt1M)CSuvgd;}ixsl$s&{29_(wQ_SqybeKW+$HPCqWi?5YqL8HZ-47Y!N7tO{J2FC;CXB zD@GtPqgb86cyzK=95Q*vQWtwkoac==WIkbWuFEBrJh7-$$anT4t<`S!3 z*25&Jyk2U!iqZ#4A`wr4N4sYoo9OlQt@kqAax)2lEm z0((-l1=@I)T*PEAct{Xqyhe@jYTXB753RO}G(j3WGu}xekrBc=@8-Qdo+f9-nExHvmS_yS*Z`TalP3VbQ>y8kBv z|3l#8fg6D<{%;0O2fY5@2zmrG@)GEB!}05BJ*@XxRNddPB~CsB_4u0lfp_@3!{o z^8{a4=dm6}gx${C3E z{AS?i{J#*W2HqSv5pesz9{8C58S-s_qy8@cxc^7}%l;?*KkfV9eE;6}lfFOk{f+PQ z4`|1NZ4dwf5C8!X009sH0T2KI5V&6n_&kIA-8YK*D)&IZGkBQnk$=#6wOFd$*gxPI z43d4eAl|prGdM(c^6NFNvRYJ?QXx3#89Zi|rX}_oDOI^#BVTl^l=tlS?2owhrSpnP zidNOUT%s$^-2u=3Jv^tVmXuvV&;DV)U#Tw3W%Wh&75JTku39N6gTg+IvtyTM|6yKk zt)d?_Af!0 zk+@i|^$vMr!w!)|QO`+FY|KGJ|4nt3d{M*ro}#yvdHbD)?%kfl2i?ZEJo$gS4ta)$ z+~U^-gwLK`o;}Cd4HN6`N2lMjC&<#+9fOWRPw;RryWe1Zm56@-|A6mbxdMM4_(tG2 z0-p;D~l zNzyT+G+qDi*uzuI_5Z%z9@qYe)B4}Pi{$LlbLjei?@qEmtnZ8KfB&GRqw9bF4r`yT z?aBQC*Z#wLIb;35({H62>;K(8l6H*i%=N#2z=}rK|HJ(rS8UXH#NBfJKh#HLC!1xq z_5V<>vq)Up*TOwSG~66X6rJ!A%~-Rhas5BsO>|D??d$(tT^`rrgAMEdgC37-ct}|D z*M!eIJ3X#F$LQAsto6UIgQNv%8e9Jlx;?JoVcYtjKL20w_PYXq5%|Nve+Yab@UH?t z8hB^mYT)U>Bjj5EJN$p|{}ccJ>i@j|Q~n?Fultw$7yP4sKY9B9pM1aU`?&8tKGiqt zOZg7_x(5Es!0!zF;=m^dUK&^#m>ozB?CbxB{%`jGZvR*MKiB_>{`d8-^*`JHc>j3+ z{{GIszv%mV-&gzoP2b1+ex&ameQMug-<$g;`cCxi?fq}PulD|C@4xN+sooFvzNdGs z_nF=^y+?bydj7KKKlS`-&(HS!c+b0fl%Cn1Y)`1i>-|gbH@&~@{bldZct7lYkM{-d z)83pn<~>X*gg+nv0w4eaAkZFxL63XLec-yP+~D6RT-oJupL8G4f1{MAE$eCIS4qpu z^fwadHxG+DJnm!e1N5I@>In)H?PsBk2Q`H~9`~qwKM!W4=Jiw_&PZL_>2VLc_tStz zlFW{=kA-B!7)yFvz~esZ-bW*`{pa_3++*$_3nM%wdTyV`9dieH zFd^fudIk?EWW0qL57NLw>LN?sD=?&2oX-Y5?s4~C8%LV{jGoSebCx9i>D?Z8#J$(z zNyQ5+^d3F5dFeXOLhLa@o9S2dbR)ExKF31uVWG{$%lkdaGR$vDYK~o;pQ+NoP@(2sDgNC5HXW1wUun@+g;Z3X;1b7%D z^^Bg%Lm8XY#-enGdo4)K8DmkP~73zKXDKFki&YcMx|ZKZac#p<=NTUkSTmPOvm3bVtI=c1&e2*2G@JI2y` znhq0U_3v>w%27SX;UGuYNb6}l#$h&zc-bKuSBi%Yd)#N-UVfOy+=F^9KU8Dx0ajZt zJzQhfewNkE4%zUVKl@m#ck?4QWCrz2e!zyzy{zKh^mq+9d)ScaVu$0)+1;$Ock#pU z#9ewK56=^Kvi{vg!}63t#?hm@*T3CPN8t|EBRqz4DK)(sN2IFTd6*l z+R4IO%jf~t5juHvE4^P&=fSP?K311b8rw?jWoPgX7MiWbdl;Dx9+f3|^&}pUC3Uk& zpo7L@`&~Ody(ir)it!BJv)j{4z7N5EO5OZnk4~1zBN@t$9iHA{*3pd=y8b6W`j0;# z00JNY0w4eaAOHd&00JNY0w4ea+n50T{y$&;d$(~lQ8f?%0T2KI5C8!X009sH0T2KI z5cnreKv@6(ljeZRg8&GC00@8p2!H?xfB*=900@AHD5B$%8F9&`p@cF>M4*YcBQ-O~KJ{0(oz$<}z;2nYWKqa6C@`2|A z&jc<9E(UUeM+4bFA}|&>88{X=7}ygC1bPFV{(toUSN~u6|IGiY|BwBD;Q!zKzwQ4u z|G)Qt$^Q%fpZEWa|0n&Q@PEYrFZ@63f3N@D{tbW4ze?URAp76yU+~ZRr~K#qXZ;y} zjQrxjFnJ5Xe*Z4N&+qlSegEM5e|>-9`%~Zl<@?XR-}n8l?>Bw_!S@y4|LFU-zR&qS zr1k2f^Fk$8>8ESDBF&+?P<0hquc&dY&*)f z53y~8Zu>^q_9WY$VB2B3?LE%6Lu?yn+hcUw6Jpz=Y1WPbka>nXJ>D(@cf_N3g~_ih6g-?00@8p2!H?xfB*=900@8p2!H?x+!+D< z{@-b%`J|`ndCcSQ{ATA@IzQTZt#hXHV8^#Q zex^g~nC>{@{!8~)-Jfum-H*C=yZ-bJX-5{jT<+0SP%adt{CZ8RtQJ+JR5&M>LnJAr zCxuvA!EzqG@B#5b1b!Z$T+3n$jTF6K(RRb$Nb8 zE-yFA^+ZvAa)HPriM`ab-3PTS*ch3ojuU%y$5pvpQ#G|xwj7&Dr>;;3nLUPKGlOak z!)D^CIbCh|H8ZH%@M|WXxJ>QF_At94~8r#KcR#Z!hS)bQF{K~h#^oy_l@`r{m63I|%7q5pQ;_fZkn{^p? zZOFJ+Q+9NU$PSP1q8<$mb!G}qT_A$-%ueR0QeBqI>Wi|iZ@m7c+pmA=mDfJ`i?4n1 zcJxW2PMq1v%{A(|Nn430^b*`>V+rn8Eb&l|lo(6xq?Q}y)VioWa-L|9jt(;S)r!FL zJD>UBci#Vn@Hvt{G(O1v8Vc@{YaZ7%+@Yc2&UDS8NuoI%8Kj;J0rjHi9(jzp*uh*F z?N4`jtA`(DN7%t#7z*w}@4n$jbPac5Xt)bqbLcE{v4grW1k{C|8+jASJ(&$K7i*P< z5&oU}2fqE~9~po33m+l>89PIyqh|x$kSI3L*yIoEa_&u(8gp3IYB%LK zs2Wm>tgahN(x_*BI$x!_s@7`a9Qx`Hed;?eefhOdy!59Z`{&>J^k-uUA|Idh8H{ZO z4ATuo;(8H-v#p5X++JifMv6qv_!w)Op4qpHk4K64Xl8)bV7;bP&DrPmAN%ZU@B5{1 zf92D!)qj3uoT!G*3~=Lyj$5`VPwPtV*HCh&qB1;2l!sFT)TSY$21U(7r-&vs*3aDK zOBHfjE!6TWN?~0X);#_6DA8tP{oJF2n%gz>59xaD)IrZp^PG_g(I-axsb2>%wa$}I zjSyul)yG`dDkZtvdjW%_P$1$X1x8aIhSRQQC>nR7Bg8_$te z(y4x;9M5!e+g65s`0)Uz`gAq-Y*%y3R^o|XqK?EmsbMQs7<4@9kshKu7U^Jam#dZa zHL78R*NE|U`lRCRB}(IGVCVG;c;q9lu>6?Ll)5gY!T1@ z@9;hX009sH0T2KI5C8!X z009sH0T2LzEePQG{}zCd4FVtl0w4eaAOHd&00JNY0w4ea+kk-Z{C^wN22}t75C8!X z009sH0T2KI5C8!X009tiB7o=rPE?Qv0w4eaAOHd&00JNY0w4eaAOHf}i-525=Uh8n znk#VJ|22QN?@a%H>HEjN+1?NKyx{$@?mzEd>^|O+a{rx6^DKCF5?QWQ?dgvPxX3RP zK6-i7?NZAHFLl@b5oZl=N3a3bBm$L zh56a384~MKZf5>eD4eegE`$shO$ysmbZ-MV^>DA31xdJJ?1;<=M}YN-?wL^n~5Ft{?OUM@QZ79TFRm{t|QZ-eD!}e`)%NH#k1-e)&nUe^>(U%}Utk*hj4V z2d$TEI<(1zQLM6wp>evXRjOL^{6%`ys-mq_$oyi=Bq`b{>2z>6eXa@XR=qB$Xc zu~t2TOz+_EK;2v-A*fDo~mGuED$NJQ7Z*?o7zhYd&SS9W=W8>8-9fwpYYDT!8IipJ!nL?$Im>t*#?gRO3ES|<@|)4Ox%wrfJq zuiRWXa%*@eJ89f@TOGoJ-(WZ3&^0XaUGf(0(nDE#nzbos9TH{vCigr zjYaKe5qn>ar&891L8Sihpf|Xjb=PI9_1OwMwKux`T``VqO?wP38D(L3}U8;?ew4G3)Hx*OqTRybx?F%SHj> z_Ju%Cu-=(<-x}JCwNan}Q8Zsj#8XRAYq&MlbfER9YtmX&Y)mEFVcM=6y$msbpPe<$ zt(gIDFq?JX&RFBG$%J!5^g4{jrlNN>DD^0|t6XEw7DuCHtL;H(ul?qOorSjww0De1 z{X&m7SV_3+?_izBVaAZ;wKb_EFDWHymCS=BDU)6*BnpWo)@2+DcpUqSgK+c6dM|M( zMr&qz3eyV`huVUUMsYwiS_5M-sPxUyEua^0;v@ zI5y^fW%jmb#2XwMBA@iTF~&Cl@|y6FIBdULBIZ0`PxKug4wHv;_9K zT=q>6y`23yviL}owUxFa+!17tnDk=2?n@i=#=p&rQzxNc5ooU=$wB$oVeWb8$a@D) zc!QaY`~CXk3EnYQ)S6bQs(HCYyRu_q$g$tp3%2S(q(a}%e$wy-pzp_Yp>t^H2*x9p z&Au3A6r{I|9c~;Ga)yGxiI#kksz#?bvmXl`(vaHwbIf|`DTHHRU%BV~w#CFoj@vw; zl0g)?H95@g`QMI-Q&zQ7QrJ_#8t;l$!coU=Xyv!+f}4IjjTN`CFq%$$Iwp8&dmLL& zyX)Ov2BWCp*A_DhPs1W zetnB|72}(Fbm#D`@i05<-nMAxn|8m4d+bT zg_to@8Q-RgoITdY*CN*{HI-h-SzmnP2?uW-4zX{zymU>RGYmb4ZtNa#1aIU%sPM(> z+$Oxf*Ib{X-z==}9`gn-kGtzB_TXITjrzPG@o7&=M&s#(oJck)PI7qsYfMe~O%e1b z;!Qe=nIDWi1b_CFH~5Zm_pM!9*b;{@8TV2#nMlO*N`^hvZ#u>a?$!Ryt0tLgdDG}^ z)PtPT8bX94Waaiv`lZhLS+Q!?gf5wzC#R~TT4l)n+Ig( z&V7$xIIV{t@&*^lS21#8{cIS_14`LsA{tjx1ztl@HRM=FQ6bdQh-0gzsBNfceP@Jp zd-Cl=TemlsXhPupL^dNwl?*p%D0VuUGjbiu+l(2y22=R=|83pXfCvOY00ck)1V8`; zKmY_l00ck)1RiJt`2PO`-Fz?)0w4eaAOHd&00JNY0w4eaAOHew5y1MtEld!B00@8p z2!H?xfB*=900@8p2!Ox?O#t8jf1sNW=0N}iKmY_l00ck)1V8`;KmY_lpe+J;{@)fR zh(G`YKmY_l00ck)1V8`;KmY_l;DIK9=l>6M^T9j_fB*=900@8p2!H?xfB*=900^{2 z0MGy1!UPcrfB*=900@8p2!H?xfB*=900=zL1hD>ppqmfoK>!3m00ck)1V8`;KmY_l z00cmwEdp5ow}lBJ5C8!X009sH0T2KI5C8!X009tqpb238|3Eh%%!2?3fB*=900@8p z2!H?xfB*=9KwAW`{%;EtL?8eHAOHd&00JNY0w4eaAOHd&@IVv5@Bcs0%?I-!00JNY z0w4eaAOHd&00JNY0wB;90b%{WpA^{FRw0N$00ck)1V8`;KmY_l00ck)1V8`;9w-9z z`~N#UM_mEc|I5BteKP|;J>ct~>HBo=-}jb!zR~k`?;myl_g&9;j=H75ue;vXS8&~S zog@Df|MWfQ{@W{KZkJjvC^u`@N~)$v^14uWXrvs%!1CGsJWP~u84vm~vT)oZn;0^W0TxykulXkljR@)!@*O`-dhqd8wob zS;EH&UZ?rV$ER~PSJVzUdPps6%Cb@o&CJe+W)`NWLr=|3U7DO*3|-7Eh9(#0XQyUJ zj7zzhd187^uGMZ-s-)O;xtd>*t0S@aM8qsh6eYQ)Nu|oNS`LQ_vZiS2s>0%uJhdj( z*4LCOr4SA+RVpR1Buy>LtBMdi6}4jXW+7pUYLy(rE=>qZ!-ZWD6N3?nvMQ@3>sawr z(mEFRs>#J-vrkeBIj^bLiP6R?&C2zt}D6FG7#^_Vv}KJLD~zp?*H)e7m)LNC@6 zGA;YEo_|+8+8B`*J7XL;@N2(zgd44do!KUlskprsiQIbPQExDna^D_r;YkG#{J_BgjY8#?apk0s?k9dQznEUp@CXo6WM8v44^t6Vk3+^+7=1FGr?oCdq zEBa}&O?35+tT#x`S@mJ@0qewS&e|j>qSsaHQU!@djtf;bY?A ziz*rP>uc;pu(UxvEXkQzGF2$>&O`+2#iA*e=aWs0m9iz>$wyB?ERVHgxmCn1j5ib`_V>g|2PO7x!^Pe>bhxDQO01YRhl^cs zsvXBdkS$Eoi|_i080iD!4Sj%}yUCU6YE7bBwN@i%RcdcSju*43LXr0YOE>Ch&B|{P z$L7#dvzbmjFfqD2>J45dMpI(@TSeG45Vcr{7K`zviDrurZDo-K6C!M4j!TKHxp8ms z#<=@d{}#6F95eZ7Ue2V8;!@12ON2XhT!~pSv&x&qZlezL^1Ffcsngz|Ojs{8Rf=9~ z*Cg>mnlevhiYcWl`o9GjB!d75fB*=900@8p z2!H?xfB*=9z&0X)_5U_%OjHE~KmY_l00ck)1V8`;KmY_l00deP!1})h7$k!L2!H?x zfB*=900@8p2!H?xfWS5)fc5`2YD`oG1V8`;KmY_l00ck)1V8`;KmY_<5WxDs1sEiQ z00@8p2!H?xfB*=900@8p2!OygB7pV(Hfl^%1q46<1V8`;KmY_l00ck)1V8`;S`fhc zzXcd1g8&GC00@8p2!H?xfB*=900@AUf*8eFYNs_GDFLki@01wyAOHd&00JNY0w4eaAOHd&00JQJ z;1Qtz{(sQ@ZC4=e|Chdh^o0lB-Txo^eSOz^|G4L!-mi3jx$Ez{hC9O@H;Ck~-2d9` za;>@)tCl_bNAKC-<;(8d5lvnyDTNp0@^VGWDppe)%=QF9f>C+X2?i=$8+8vH1^6etub%laHKx+R&P)uJ>jx*Pso!Fqm(sC+gMXr zk4P@%l?i33vB@uN(IZ;Laq1bm#fB2$$ZgkKyuq+BrCb9tW|}s5sg}XgNR6fDK9J1 zs#2@T%Ot)YfOkilZ*K~r`_b+?mwO^Nmzz14yJB^Fp#ZOLBy^tY=GgFVqLhI$4x?ENYCdJUX3%PR_ zNguW8A2}O}Mk4jOE8bu&=dN$C-YU4zryMf+R@GXKv{6m6KGS}iO(e2KIUC!o$dmRy zyqUB`biFrkR*=%NIU_^xu{m#WnN&*Nx>Cl(9LF zmwSSBU(S6i(|#Rn7^HYUp`?m(Oj<9i*EXwGj#q18X6o{Sc?#OBgn2sJlbx|LN^hb0hR4pVPyUTW_EB26H+0?Q?8q-HhdCdFQxye)8Q+$|sHHNoKRNuF>6^OMS0X zlf5xFk1wxlE5h(^Z~BYWcTanRm&e`pl-NI5jjENBQj_SGPE<>=WI9@qGa@~vc&zns zc8*}{2G)_NVSX^uZFgVX+!kjp$rDO6kx4H#*?M#1g-Ym265LL-`w=aaEyRGeyAP(zg7vU?axvxk@ojq%&7 z3q5}roq*9l_=GpO5OdehHdSr8T3KJKN$fxDLMEP4(o1>UK-4v<*63RWX?CkCY4;LWAvZxmbfB*=900@8p2!H?xfB*=900>wFu>QAL;1dXd00@8p2!H?xfB*=9 z00@8p2y9mZSpRR=mPNfl00ck)1V8`;KmY_l00ck)1VF$dfc3w{0-rzt1V8`;KmY_l z00ck)1V8`;Kw!HP!1{l?wk+xe0w4eaAOHd&00JNY0w4eaAOHdu0s8(w*ABKnNwyD@ zzghBkf~8;s0w4eaAOHd&00JNY0w4eaAOHd&uq_A(>;G+0A5;PaKmY_l00ck)1V8`; zKmY_l00cmwnE<~3-^>IlAOHd&00JNY0w4eaAOHd&00JPe-3Va)zuj6C^#K78009sH z0T2KI5C8!X009sHfo1|&|2H#13J8Dz2!H?xfB*=900@8p2!H?xY&QZ}|8KVzMSVa3 z1V8`;KmY_l00ck)1V8`;K%kib*8j~+kOBfA00JNY0w4eaAOHd&00JNY0^5xM*8khB zMNuCR009sH0T2KI5C8!X009sH0T5^=fcO73GeHUnfB*=900@8p2!H?xfB*=900?Y1 z0$BfVw-!ZxKmY_l00ck)1V8`;KmY_l00cmwnSikVzesYY$lnV+yP9=K0Ra#I0T2KI z5ZKlPZU^4t4Q4X#SI%nkQb{Q*HzcX>f?Qs%NOECSElZ`!vSZ?#&&}l~=X0U?$;YR2 zp|GPS92yC$g>XnMYs#`x4b9BXhh`S0r$bN8ORV5rM$eKbwnMH}9vh;$I*CZNPQ*LT3qLo}#)~eyqb-9{fk*g!|Xfz_0 zC5h!_MOsyAHF=rD*8^}{BuKtOtd=!N+gMZB5lrjU_FV3X++1$vT<%IJ%pr*dcy%M8 z^Hev-z)a0d%}-5EPcQPs+<9`8^_o((M>oKTN2qPoG-Xwy;sGE<0Ni8-ZC%F6EU8WvS8H zg)OYLiqqO+Ly0i8+8G=hbH9>cc!RZ^yS~ACt1yi9zQ3kaSJhgLOma2J`b_(6Hj&5{WE zSwY(EY|g@w`eSq6;4-O{ymh7cxRs)LQk_C^VzWa%aR=3DjN4vC%vq%V?#n&Fx-aLx zm1(~YHVjfcpHNaoIVP=_)oYtoE61y~Ff(;|As6Cv;btYwd2y2?-dTmoNVLTYM|=Zc zb@^OnSHS1b`M&La&HHlq=emB^H|Y8QJV!crx&PKx9{7(Po%iZ`=cSH%&>Osb*?qer z&V_lUq*OPgB}LYxe3hJU<)vDFMJcS86h8fJqIkw}zTBk1UCp56x@TP@R|n=*MACj0 zu~JzVt}(J{+a*Rp-jFIq>4u_QwIZaGPMTFx`xQ$Ri`!K!o5tEuWZ`%XvFJ4PVx=tD zO((2_MQ$Ce?4sTmY7r^-ttvpUh^n zGVA>gZDk8{#c>2|RjSQ{+fK+WYeL(eRVGY^f>9s#*{D)Da?4xa;|*TAn~m37!B!~prAq#) zQZTxT1B?cR^Yx9`VhsiE3J8zUYRwR-FVuIEQ}RXQl=SpyoBXc2zRskyCOq zBd4>)iTD;p7I?GUFM7p#Zgqf`U0N(i=~(8-S^3%e4sURsRP0@?#Vfi%z`@4hJF1lU%RmioHswtAZu2tB+vHEV=cVb)A>aFj8uI}>&FJ5$i zaJS576Co3E^wiGYp}dMBmzioU4`Th)`AQAd(qIby@|XWjfLD7Ac5 zU8A>Onpp}x*mS|}<%qW|9QsnjB_8h}Ti+uQ=Yl&rpi$5`Nws}Mc4DR@^o|babUNR< zcI0}ET-X(xyF*QrtK{}m!_6zcGrX5Y_)Q?S8?^(`k*&hA?MF) zZJj@jE<#S8nY@yT=N&q{I33R2*%_uOeB0+2qhvTDEp-QLm+tc9Qj@kiyVNe%b27VN zuD`3DvrBCYLba#v==?&u485gH7AV5)O{d$+WWp=anRR`Q&U6m*U8KJDHgE9C75A+t zTh*g+CUK}rqhxx^+BBBnL&qEmPL*l8M@}x|tHLy3lp&SYd!KM}5|)$^{Qlp)y0?Ki zAOHd&00JNY0w4eaAOHd&00JOz{}RCZ|Nd!3m00ck)1V8`;KmY_l00ck)1n!1_@ce&)l*hjTxEqKl0|Fob0w4ea zAOHd&00JNY0w4ea_c;M!{ePc3g*^}e0T2KI5C8!X009sH0T2KI5CDO@C4lw+-I7B& z5C8!X009sH0T2KI5C8!X009tqa0t-#zt8=$EAT|1$GLF?2Dv7@Ay|pPiZ^5iaFs=1+yf`Klso z3OU585)Ku}NBYSuN(Ad`G<6e!T9XP&NzoK?=%q@fBo@|GtwiEpm#g^|xjK@HMkCA; ziCZhP^p|JrC%nOvC*2=--mGp_F4t5|t(0li%pJM8+GgH;SoN|@iCQ%$73b|iDo-I- zn_G&uN2Od~b(fTzYgMIIBN)OVO}VLwhZ(pDQaO<9%JYt%IBWRcK$nm@<7;MC02 z{M6+1^de8pohQdHC^bzj%d{D#nnt^j?GQ%a6c0n1n*b*;koB|_NPzDib)sG zSJgGz#Vt)-nB%Ui$_;5vsjjMQ9Jd;UC3RKRHXZK;wYFB0H>6^vx=Ok`8HJ5A0-I?i zGD?X~Yn*t8%M%s;!e2P%Bk3 z)TCmzkXDKlvM`}#d4HaoIiGvhHq|+n42NcCY%1F8g+qiR@2rQs!5p!2xXDUES<|SE ziFBrrj1`sy8xyT^z&Kc zH49C(pS)w@xVI(Gs%(jntGj#z&&Ubhfi2BG$MI|BOU*HCjZnlC+w$L{Sw#cldL~mot+GnVwGKLH;$89rK&kz8LukZN=2AD*yz@028;Wa z9juAx7MH}4`tJGxZ}3XQUC**^R(L@!FIS|RevMC0|MWtgjcz%WPsh{ggkAESy^Gm1 z9n0%I%r2y@FB~fzIaA-?9h{A{x?HrEmSXn(x75@1ecoUs;=Xl~bx(V?eeYR&$Fyfs zUj_@?m042g4dPOk&Ip_xfhIR!5{b2Jo+u;2@BckZR`}15zgNg#ya(|6e7ggO0|5{K z0T2KI5C8!X009sH0T2LzH#Q;AOHd&00JNY0w4eaAOHd&@O>hH-~anQfyQA#00ck)1V8`;KmY_l00ck) z1VG>iNC40Oe}M3DXb=Da5C8!X009sH0T2KI5C8!X_&yQ9`v3a`8ixS^5C8!X009sH z0T2KI5C8!X0D&JM0pGyqTm$aEarJ)8^M3@c`M>4A===DjfF_!g)I!S!Lk(5p*(s{XUzH#pDjcaFs*ihv zi^Nury<5U2ml|G^CdHSObZjY~wyD(3oVAM3!d!!#_#3UC_6GCB-=c#*r&q;EvLX|g zg}BY+%4Q}v4a1z)`|3&ZnkZsJe@zsP&EBoZUd5(=q;GkNWuy6IAvt0^3h^uDM_7~imT1e%sj`^mMv39Th4gR9qAy%)2@2-KAZ>MKUp7PFAx3TW#bio zdWSRHD$i+birXSddL$f#f{I=tzq-twiU4l(b^ zi%e~2^VWWwUz@kJWpUcFBDZjDh}#CjS#R10&AF$&sF9a<)K9Wk0{^gNpTy`{+6+c_ zmRd|^G>;#wxynDdw;|WomzU{VamCk#(pPT^FSsJZPnbDczui|9vG;*muScWN^tYL9 zF%@b`^}15tI8i!)@+hR26()M~SX*lbWWAizgc46C< z#nw|#gseqo@8N5*v0fl=rQUkIz}~HHYbvKQ>}qhV_0^zws*^IYRI!jr6l|Sfd9zDY z$KoxnQAI7W)n7m54bGBR(Z-AmXJdl5uQjtuHkFp6d1A^C6q_s=InG5*LxzkF8{27( z+8J$SM>H;_vqdGHN-KgLrL`T$qKbbAO_F*&yq)TXx_|%(fB*=900@8p2!H?xfB*=900`&=g!Mm=fB*=9 z00@8p2!H?xfB*=900@8p2y9aVSpRR+hDEhN00ck)1V8`;KmY_l00ck)1VBI_fc3us z10O*E1V8`;KmY_l00ck)1V8`;Kwz5^!1{liHY}iV6o3!eYQ^Q8M=;Gg-w>-u>A2m1c1@9ExOu>tsyZSS7%^sx8cbTPLWnp~Klothy5F6CzCPldwyszPg~sjEsjR3IPeC$lIKtgq43 zO$2I9DkvpIQ^=v0DwUF0xGdAK*X3${MXrvdq7gBZ6kJgY1*P0vu2!jP%@rYTw2d_q zu(5_DLn%{IQdQAtg_N+?|0sA9x z=8n4ShmE01n)#}tNd%=r+M0~icse_gR+eNET+h4NG*nxbF-NMdpr*{g;Yi(8f0H*j zMUFn)aCD;<^!WK$A(_eM=`hx#+-P-tr&10M1R3$rSwG_qUL+nO4IcQ&Wi2WdV#$0W zmCl+buD3GbSj@qNs0&AK)F1W+&k+~<8(iqahG0mfm10uKS`OA*IcO^4aCAdM01VW# z-r!|&=v2d@c}p2msgPYtq+)W^WT3Tj(5j?^kp?MikO}7o5l63-ie`&)ES@mU)LNNw zEau=u)DauK^^7+-OR&Tmuq-L1N_m+~+G}ihBvW!CpDJcdBh^+$S`>7!Vpp;@N;|ia zTqsE8N4KWm4>&hA=OF4t5| zt>}(YiDb5*SbV5vt%a*i$~X9;N;;j`4i=7(>yOWPgO`Z2F(+sG+(tOXveA69kex7F zjmE2N>Z+-1D@TTqaPrm@q%RXU4UFhGqCyc0ns;t$%rQVK zXQG&}4A#$WVoe;qQf5NQCX|V|-P$`gwdNS0l{HaJE;vi|$GyQw#Qh_?j0;YIh~31C z+=O-UDMyMGkMzX#% zFB|o16mi0k;)(c@Ji(?XmOI%r`Zp>;HR>6ahg11V8`;KmY_l00ck)1V8`;K;XV3fc5`<*Ca3m z0w4eaAOHd&00JNY0w4eaAOHgQoB-DU_Z%q#f&d7B00@8p2!H?xfB*=900@AGa{^fZ-*co02m&Ag0w4eaAOHd& z00JNY0w4ea_ZQa2ND&YOKmY_l z00ck)1V8`;KmY_l00izk0$BgwcTECAAOHd&00JNY0w4eaAOHd&00JOz&k6Ww#2xoM zECPZ62!H?xfB*=900@8p2!H?xfB*>GM+C6`zmFONRzLs*KmY_l00ck)1V8`;KmY_l z;0+>x@BhC+U=bDsKmY_l00ck)1V8`;KmY_l00izM0$BgwM~wk1AOHd&00JNY0w4ea zAOHd&00JQJ1`)ve{|y3*upj^eAOHd&00JNY0w4eaAOHd&a32w%|Nei`^{1}D*8^V& zyf3g6I3Ec4zw7_H|BL>Y{m=SO`#XJK^L^T<`R05N`8o!^G4REK+XM3hBmLj)|Be2S z_P@}7w!g3M_xnEEx6yaLFVOpq-Y@jNr+20|)bn>eU+wvD&kH?I^c?d3wfDEYpYoQx zS#MwWx4OUB{c`tn-HC2b*Y9=xY}W_6R=Uo29q;P)e9QAIo=prSqem z*E(l94|aU3<7Yawj_Hmg?!R<@)%^)~+5M<{H?e$YeIJ+e!ZquR*R}q zDx8zcA(9l*lR_*l@+_0?y{;-ZBu&jdoP$B8|<W9^+nm%H(vkJ?bpBb z%4?te#n(Q0JNhJ1C(i8T<{I_fq^-mgdI|2cu>|)kmUt*fN{pp;Qp=5UYF*SGIZw1l zM+cevYDM7rozHymJMaHO_#DX}8Xx3-4F&hfHIM5W?$FS1XS(LlB+(p>3{p>qfO^q$ zk37a)>|id8_NP0%)x(dnBkbTV3(v~1KY4N9W?WR}Q> zGXZK-)G}bAaAbly&iGAk+QynSBJ^6l{`oJx`pF+Ym7xyK_yvN7)<%)5)4EzH zb@ho9wVU!AR1K*`R@aRsY1Femov%_|RckeI4t@29KJ}fKzWmxJUi#CI{qyg9`m?bF zk&jRM492zshUtbPalMGa*;d4GZZ9$#BSj)-e2leC&+Oa9$D>4iG&8_zuwGND=IrzO zkA3#F_x;khzw+tV>OVg+PEQ5ha1%EPGvYSWNWgQDi4 zQ$&**>u2urr3yK%7HatwrLZmxYo303lxVZDe(uph&Fvcchjcx6>Y(SQdCo|L=o6#; z)USh>TIb29Mu;+&>SL~Jm6BX-^2}00%5|lzMNblSD%;0>H|e=+vBU|z1b5z4g8LRq zJTy#7j3@f2_a-@YE@;P(Q}<_jjXteb=)5A=uGY-1v8Gg6YKSE#hNzuKdwB(nOtT2D zfRWA%h4n(b4o0R~h}XeL*9(muqt(dv(rOqvW(isiBazEPOy1K}6X%M=juLs|Y>z`d zXaT2c#E$4i9BM&}I8|cwFex&Y>1nJ3)i+h))FC3yjC)xP)Uu{jugj&T&SYdn4-)m6 zgqK&qNEY?H5=K_^fL?<8HprH_}8ot%8yM&_1T^X72OVN?DVa zL@iAZ@$}O{qRqy-xpxOOw{Gb7>U!?nLC=lzoRK|5pBU|?z8%EWHct-kCd%QlF6O$X z*e7(pe_|KWL}Fdst)SvA4c$&%$6X3K?vAH~28nKHw2QhEMAQ}E9o<0`V;PUmlAt6r zhjCWYIqGR4nm8UH;@BCF0n;uwK#B$YdI5u`y?{YdC=l_H0;4Gp!)aGDl!A0*fJzgc z%sCmLjps-!=~O>aj%PZ#Z7ah*{CI#f6PgjUGXb7=GcTV3i81kJUjzI%L`C{B(a;44c@!`GEuRn%2{RcWdCno>_V zq7c=w$N{>dv?O#r$)glll>N-jjY{>Z?XjtmFp?*#(Zqi4$VjHXxhErOWJy1dvX8l|X|iTLi(q?UiN)B*eVGbwO4qzi*KkLs zhTCELhn^>zqbK)KFQ$MRVLPMGk=(INkhy4h5KYr;Pol@)O2n} { + const list = Array.isArray(data) ? data : (data && data.results) || [] + this.setData({ coupons: list }) + }) + .catch(() => { + this.setData({ + coupons: [ + { + id: 1, + amount: '50', + unit: '元', + title: '新人见面礼', + desc: '无门槛使用,适用于所有课程', + expiry: '2023-12-31', + status: 'available', + color: 'from-blue-500 to-cyan-400', + bgStart: 'from-blue-50', + bgEnd: 'to-cyan-50', + shadow: 'shadow-blue-100' + }, + { + id: 2, + amount: '8.5', + unit: '折', + title: '编程课程专享', + desc: '仅限编程开发类课程使用', + expiry: '2023-11-30', + status: 'available', + color: 'from-violet-500 to-fuchsia-500', + bgStart: 'from-violet-50', + bgEnd: 'to-fuchsia-50', + shadow: 'shadow-violet-100' + }, + { + id: 3, + amount: '100', + unit: '元', + title: '高阶课程抵扣券', + desc: '满 999 元可用', + expiry: '2023-10-15', + status: 'claimed', + color: 'from-orange-400 to-rose-500', + bgStart: 'from-orange-50', + bgEnd: 'to-rose-50', + shadow: 'shadow-orange-100' + } + ] + }) + }) + }, + handleClaim(e) { + const id = e.currentTarget.dataset.id; + if (this.data.coupons.find(c => c.id === id).status === 'claimed') return; + + const updatedCoupons = this.data.coupons.map(c => + c.id === id ? { ...c, status: 'claimed' } : c + ); + this.setData({ coupons: updatedCoupons }); + wx.showToast({ + title: '领取成功', + icon: 'success' + }) + } +}) diff --git a/wechat-mini-program/pages/coupon/coupon.json b/wechat-mini-program/pages/coupon/coupon.json new file mode 100644 index 0000000..c17488d --- /dev/null +++ b/wechat-mini-program/pages/coupon/coupon.json @@ -0,0 +1,3 @@ +{ + "navigationBarTitleText": "优惠券" +} diff --git a/wechat-mini-program/pages/coupon/coupon.wxml b/wechat-mini-program/pages/coupon/coupon.wxml new file mode 100644 index 0000000..95a0d3f --- /dev/null +++ b/wechat-mini-program/pages/coupon/coupon.wxml @@ -0,0 +1,38 @@ + + + 优惠券中心 + + + + + + + 🎁 VIP 会员权益 + + 每月免费领取 3 张大额优惠券 + + 立即开通 + + + + 可领取的优惠券 + + + + + + {{item.amount}} + {{item.unit}} + + + {{item.title}} + {{item.desc}} + + + + {{item.status === 'claimed' ? '已领取' : '领取'}} + + + + + diff --git a/wechat-mini-program/pages/coupon/coupon.wxss b/wechat-mini-program/pages/coupon/coupon.wxss new file mode 100644 index 0000000..44829b0 --- /dev/null +++ b/wechat-mini-program/pages/coupon/coupon.wxss @@ -0,0 +1,110 @@ +.container { + padding: 30rpx; + background-color: #f9fafb; + min-height: 100vh; +} +.header { + padding: 20rpx 0; + text-align: center; + margin-bottom: 20rpx; +} +.title { + font-size: 36rpx; + font-weight: bold; + color: #1f2937; +} +.vip-banner { + background: linear-gradient(to bottom right, #111827, #1f2937); + border-radius: 30rpx; + padding: 40rpx; + color: white; + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 40rpx; + box-shadow: 0 10rpx 20rpx rgba(0,0,0,0.1); +} +.vip-title { + color: #fcd34d; + font-weight: bold; + font-size: 32rpx; + margin-bottom: 10rpx; +} +.vip-desc { + color: #d1d5db; + font-size: 24rpx; +} +.vip-btn { + background: linear-gradient(to right, #fcd34d, #fbbf24); + color: #111827; + font-size: 24rpx; + font-weight: bold; + padding: 10rpx 30rpx; + border-radius: 40rpx; + margin: 0; +} +.section-title { + font-size: 32rpx; + font-weight: bold; + margin-bottom: 20rpx; + color: #1f2937; +} +.coupon-card { + background-color: white; + background: linear-gradient(to bottom right, #eff6ff, #ecfeff); + border-radius: 30rpx; + padding: 30rpx; + margin-bottom: 30rpx; + display: flex; + justify-content: space-between; + align-items: center; + box-shadow: 0 4rpx 10rpx rgba(59, 130, 246, 0.1); + position: relative; + overflow: hidden; +} +.coupon-card.claimed { + background: linear-gradient(to bottom right, #f9fafb, #f3f4f6); + box-shadow: none; + opacity: 0.7; +} +.coupon-left { + display: flex; + align-items: center; +} +.amount { + margin-right: 30rpx; + color: #2563eb; +} +.coupon-card.claimed .amount { + color: #9ca3af; +} +.num { + font-size: 60rpx; + font-weight: bold; +} +.unit { + font-size: 24rpx; +} +.coupon-name { + font-weight: bold; + font-size: 30rpx; + color: #1f2937; +} +.coupon-desc { + font-size: 22rpx; + color: #6b7280; + margin-top: 6rpx; +} +.coupon-right { + background-color: white; + padding: 10rpx 30rpx; + border-radius: 30rpx; + font-size: 24rpx; + font-weight: bold; + color: #2563eb; + box-shadow: 0 2rpx 4rpx rgba(0,0,0,0.05); +} +.coupon-card.claimed .coupon-right { + background-color: #e5e7eb; + color: #9ca3af; +} diff --git a/wechat-mini-program/pages/detail/detail.js b/wechat-mini-program/pages/detail/detail.js new file mode 100644 index 0000000..6b61158 --- /dev/null +++ b/wechat-mini-program/pages/detail/detail.js @@ -0,0 +1,69 @@ +const app = getApp() + +Page({ + data: { + project: null + }, + onLoad(options) { + const { id } = options; + this.fetchProject(id); + }, + fetchProject(id) { + const { request } = require('../../utils/request') + request({ url: `/projects/${id}` }) + .then((data) => { + this.setData({ project: data }) + }) + .catch(() => { + const projects = [ + { + id: 1, + title: 'Python 数据分析实战', + category: '编程开发', + image: + 'https://images.unsplash.com/photo-1526379095098-d400fd0bf935?w=500&auto=format&fit=crop&q=60&ixlib=rb-4.0.3', + students: 1205, + rating: 4.8, + duration: '12 周' + }, + { + id: 2, + title: '零基础英语口语速成', + category: '语言学习', + image: + 'https://images.unsplash.com/photo-1543269865-cbf427effbad?w=500&auto=format&fit=crop&q=60&ixlib=rb-4.0.3', + students: 850, + rating: 4.9, + duration: '8 周' + }, + { + id: 3, + title: 'UI/UX 设计全能班', + category: '设计创作', + image: + 'https://images.unsplash.com/photo-1561070791-2526d30994b5?w=500&auto=format&fit=crop&q=60&ixlib=rb-4.0.3', + students: 2340, + rating: 4.7, + duration: '16 周' + }, + { + id: 4, + title: '职场高效沟通技巧', + category: '职场提升', + image: + 'https://images.unsplash.com/photo-1552581234-26160f608093?w=500&auto=format&fit=crop&q=60&ixlib=rb-4.0.3', + students: 5600, + rating: 4.6, + duration: '4 周' + } + ] + this.setData({ project: projects.find((p) => p.id == id) }) + }) + }, + handleEnroll() { + wx.showToast({ + title: '报名成功', + icon: 'success' + }) + } +}) diff --git a/wechat-mini-program/pages/detail/detail.json b/wechat-mini-program/pages/detail/detail.json new file mode 100644 index 0000000..578add1 --- /dev/null +++ b/wechat-mini-program/pages/detail/detail.json @@ -0,0 +1,5 @@ +{ + "navigationBarTitleText": "课程详情", + "navigationBarBackgroundColor": "#ffffff", + "navigationBarTextStyle": "black" +} diff --git a/wechat-mini-program/pages/detail/detail.wxml b/wechat-mini-program/pages/detail/detail.wxml new file mode 100644 index 0000000..d1571b7 --- /dev/null +++ b/wechat-mini-program/pages/detail/detail.wxml @@ -0,0 +1,59 @@ + + + + + + {{project.category}} + + {{project.rating}} + + + + {{project.title}} + + + + 👥 {{project.students}} 人已报名 + + + 🕒 {{project.duration}} + + + + + 课程简介 + + 本课程将带领你深入了解{{project.title}}的核心概念与实战技巧。通过{{project.duration}}的系统学习,你将掌握行业前沿知识,提升职业竞争力。 + + + + + 课程大纲 + + + {{chapter.chapter}} + + + + {{lesson.title}} + {{lesson.duration}} + + + 🔒 + + + + + + + + 课程大纲 + 暂无大纲信息 + + + + + ¥ 299 + + + diff --git a/wechat-mini-program/pages/detail/detail.wxss b/wechat-mini-program/pages/detail/detail.wxss new file mode 100644 index 0000000..9c4dafa --- /dev/null +++ b/wechat-mini-program/pages/detail/detail.wxss @@ -0,0 +1,139 @@ +.container { + background-color: white; + min-height: 100vh; + padding-bottom: 120rpx; +} +.hero-image { + width: 100%; + height: 400rpx; +} +.content { + padding: 40rpx; + border-top-left-radius: 40rpx; + border-top-right-radius: 40rpx; + margin-top: -40rpx; + background-color: white; + position: relative; + z-index: 10; +} +.header { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 20rpx; +} +.badge { + background-color: #dbeafe; + color: #2563eb; + font-size: 24rpx; + padding: 8rpx 20rpx; + border-radius: 12rpx; + font-weight: bold; +} +.rating { + color: #f59e0b; + font-size: 24rpx; + font-weight: bold; +} +.title { + font-size: 40rpx; + font-weight: bold; + color: #111827; + margin-bottom: 20rpx; + line-height: 1.4; +} +.meta-row { + display: flex; + gap: 30rpx; + margin-bottom: 40rpx; +} +.meta-item { + font-size: 24rpx; + color: #6b7280; + display: flex; + align-items: center; +} +.icon { + margin-right: 8rpx; +} +.section { + margin-bottom: 40rpx; +} +.section-title { + font-size: 32rpx; + font-weight: bold; + color: #1f2937; + margin-bottom: 20rpx; + border-left: 8rpx solid #2563eb; + padding-left: 20rpx; +} +.desc { + font-size: 28rpx; + color: #4b5563; + line-height: 1.6; +} +.chapter-header { + font-size: 28rpx; + font-weight: bold; + color: #374151; + margin: 30rpx 0 20rpx 0; + background-color: #f3f4f6; + padding: 10rpx 20rpx; + border-radius: 10rpx; +} +.lesson-item { + display: flex; + justify-content: space-between; + align-items: center; + padding: 20rpx 0; + border-bottom: 1rpx solid #f3f4f6; +} +.lesson-info { + flex: 1; +} +.lesson-title { + font-size: 28rpx; + color: #1f2937; + margin-bottom: 6rpx; +} +.lesson-time { + font-size: 22rpx; + color: #9ca3af; +} +.play-btn { + color: #2563eb; + font-size: 32rpx; +} +.lock-btn { + color: #9ca3af; + font-size: 28rpx; +} +.footer-bar { + position: fixed; + bottom: 0; + left: 0; + right: 0; + background-color: white; + padding: 20rpx 40rpx; + box-shadow: 0 -4rpx 10rpx rgba(0,0,0,0.05); + display: flex; + justify-content: space-between; + align-items: center; + z-index: 20; + padding-bottom: constant(safe-area-inset-bottom); + padding-bottom: env(safe-area-inset-bottom); +} +.price { + font-size: 40rpx; + font-weight: bold; + color: #2563eb; +} +.enroll-btn { + background-color: #2563eb; + color: white; + font-size: 30rpx; + font-weight: bold; + padding: 20rpx 60rpx; + border-radius: 50rpx; + margin: 0; +} diff --git a/wechat-mini-program/pages/index/index.js b/wechat-mini-program/pages/index/index.js new file mode 100644 index 0000000..06480a1 --- /dev/null +++ b/wechat-mini-program/pages/index/index.js @@ -0,0 +1,78 @@ +const app = getApp() + +Page({ + data: { + projects: [], + categories: [], + userInfo: {}, + hasUserInfo: false, + canIUse: wx.canIUse('button.open-type.getUserInfo'), + canIUseGetUserProfile: false, + canIUseOpenData: wx.canIUse('open-data.type.userAvatarUrl') && wx.canIUse('open-data.type.userNickName') // 如需尝试获取用户信息可改为false + }, + onLoad() { + if (wx.getUserProfile) { + this.setData({ + canIUseGetUserProfile: true + }) + } + this.fetchData(); + }, + fetchData() { + const { request } = require('../../utils/request') + + request({ url: '/projects' }) + .then((data) => { + const list = Array.isArray(data) ? data : (data && data.results) || [] + this.setData({ projects: list }) + }) + .catch((err) => { + console.error(err) + this.setData({ + projects: [ + { + id: 1, + title: 'Python 数据分析实战', + category: '编程开发', + image: + 'https://images.unsplash.com/photo-1526379095098-d400fd0bf935?w=500&auto=format&fit=crop&q=60&ixlib=rb-4.0.3', + students: 1205, + rating: 4.8, + duration: '12 周' + }, + { + id: 2, + title: '零基础英语口语速成', + category: '语言学习', + image: + 'https://images.unsplash.com/photo-1543269865-cbf427effbad?w=500&auto=format&fit=crop&q=60&ixlib=rb-4.0.3', + students: 850, + rating: 4.9, + duration: '8 周' + } + ] + }) + }) + + request({ url: '/categories' }) + .then((data) => { + const list = Array.isArray(data) ? data : data + this.setData({ categories: list }) + }) + .catch(() => { + this.setData({ + categories: [ + { name: '全部', color: 'bg-blue-100 text-blue-600' }, + { name: '编程', color: 'bg-orange-100 text-orange-600' }, + { name: '设计', color: 'bg-purple-100 text-purple-600' } + ] + }) + }) + }, + goToDetail(e) { + const id = e.currentTarget.dataset.id; + wx.navigateTo({ + url: `/pages/detail/detail?id=${id}`, + }) + } +}) diff --git a/wechat-mini-program/pages/index/index.json b/wechat-mini-program/pages/index/index.json new file mode 100644 index 0000000..786d8ca --- /dev/null +++ b/wechat-mini-program/pages/index/index.json @@ -0,0 +1,6 @@ +{ + "navigationBarTitleText": "首页", + "navigationBarBackgroundColor": "#2563eb", + "navigationBarTextStyle": "white", + "usingComponents": {} +} diff --git a/wechat-mini-program/pages/index/index.wxml b/wechat-mini-program/pages/index/index.wxml new file mode 100644 index 0000000..2d4ad77 --- /dev/null +++ b/wechat-mini-program/pages/index/index.wxml @@ -0,0 +1,65 @@ + + + + + + 你好,学员 + 今天想学点什么? + + 🔔 + + + + + + + + + + + + + + + + + 热门分类 + 查看全部 + + + + + + {{item.name}} + + + + + + + + + + + + + {{item.category}} + {{item.title}} + + 👥 {{item.students}} + {{item.rating}} + 🕒 {{item.duration}} + + + + + + + diff --git a/wechat-mini-program/pages/index/index.wxss b/wechat-mini-program/pages/index/index.wxss new file mode 100644 index 0000000..5a2b001 --- /dev/null +++ b/wechat-mini-program/pages/index/index.wxss @@ -0,0 +1,224 @@ +.page-container { + padding-bottom: 50rpx; + background-color: #f9fafb; + min-height: 100vh; +} + +.header { + background-color: #2563eb; + padding: 40rpx 30rpx 80rpx 30rpx; + border-bottom-left-radius: 40rpx; + border-bottom-right-radius: 40rpx; + position: relative; +} + +.header-content { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 30rpx; +} + +.greeting { + color: rgba(255, 255, 255, 0.9); + font-size: 28rpx; +} + +.title { + color: white; + font-size: 40rpx; + font-weight: bold; +} + +.bell-btn { + background-color: rgba(255, 255, 255, 0.2); + padding: 15rpx; + border-radius: 50%; + color: white; + font-size: 30rpx; +} + +.search-bar { + position: absolute; + bottom: -40rpx; + left: 30rpx; + right: 30rpx; + background-color: white; + border-radius: 30rpx; + padding: 20rpx 30rpx; + display: flex; + align-items: center; + box-shadow: 0 4rpx 12rpx rgba(0, 0, 0, 0.1); +} + +.search-bar input { + margin-left: 20rpx; + flex: 1; + font-size: 28rpx; + color: #374151; +} + +.search-placeholder { + color: #9ca3af; +} + +.content-body { + padding: 60rpx 30rpx 0 30rpx; +} + +.banner { + background: linear-gradient(to right, #fb923c, #ef4444); + border-radius: 30rpx; + padding: 30rpx; + color: white; + position: relative; + overflow: hidden; + box-shadow: 0 8rpx 16rpx rgba(239, 68, 68, 0.2); + margin-bottom: 40rpx; + display: flex; + justify-content: space-between; + align-items: center; +} + +.banner-circle { + width: 100rpx; + height: 100rpx; + background-color: rgba(255, 255, 255, 0.2); + border-radius: 50%; + position: absolute; + right: -20rpx; + bottom: -20rpx; + filter: blur(20rpx); +} + +.banner-title { + font-size: 36rpx; + font-weight: bold; + margin-bottom: 10rpx; +} + +.banner-desc { + font-size: 24rpx; + opacity: 0.9; + margin-bottom: 20rpx; +} + +.banner-btn { + background-color: white; + color: #f97316; + font-size: 24rpx; + padding: 10rpx 24rpx; + border-radius: 30rpx; + display: inline-block; + font-weight: bold; +} + +.section { + margin-bottom: 40rpx; +} + +.section-header { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 20rpx; +} + +.section-title { + font-size: 32rpx; + font-weight: bold; + color: #1f2937; +} + +.see-all { + font-size: 24rpx; + color: #9ca3af; +} + +.categories-scroll { + white-space: nowrap; + width: 100%; +} + +.categories-list { + display: flex; +} + +.category-item { + padding: 16rpx 40rpx; + border-radius: 40rpx; + font-size: 28rpx; + margin-right: 20rpx; + font-weight: 500; +} + +.projects-list { + display: flex; + flex-direction: column; + gap: 30rpx; +} + +.project-card { + background-color: white; + padding: 24rpx; + border-radius: 30rpx; + box-shadow: 0 4rpx 10rpx rgba(0, 0, 0, 0.05); + display: flex; + flex-direction: row; + gap: 24rpx; +} + +.project-image { + width: 192rpx; + height: 192rpx; + border-radius: 20rpx; + flex-shrink: 0; + background-color: #eee; +} + +.project-info { + flex: 1; + display: flex; + flex-direction: column; + justify-content: space-between; +} + +.project-category-tag { + font-size: 20rpx; + color: #3b82f6; + background-color: #eff6ff; + padding: 4rpx 12rpx; + border-radius: 8rpx; + display: inline-block; + align-self: flex-start; + margin-bottom: 8rpx; +} + +.project-title { + font-size: 28rpx; + font-weight: bold; + color: #1f2937; + display: -webkit-box; + -webkit-box-orient: vertical; + -webkit-line-clamp: 2; + overflow: hidden; + margin-bottom: 8rpx; +} + +.project-meta { + display: flex; + justify-content: space-between; + align-items: center; + margin-top: auto; +} + +.meta-item { + font-size: 20rpx; + color: #9ca3af; + display: flex; + align-items: center; +} + +.icon { + margin-right: 4rpx; +} diff --git a/wechat-mini-program/pages/profile/profile.js b/wechat-mini-program/pages/profile/profile.js new file mode 100644 index 0000000..b555e22 --- /dev/null +++ b/wechat-mini-program/pages/profile/profile.js @@ -0,0 +1,58 @@ +const app = getApp() + +Page({ + data: { + user: {}, + formData: { + name: '', + phone: '', + age: '', + education: '', + address: '' + } + }, + onLoad() { + this.fetchUser(); + }, + fetchUser() { + const { request } = require('../../utils/request') + request({ url: '/user' }) + .then((data) => { + this.setData({ user: data }) + }) + .catch(() => { + this.setData({ + user: { + id: '8839201', + name: '学员用户', + avatar: + 'https://images.unsplash.com/photo-1535713875002-d1d0cf377fde?w=200&auto=format&fit=crop&q=60', + stats: { + learning: 12, + coupons: 3, + hours: 28 + } + } + }) + }) + }, + handleInput(e) { + const field = e.currentTarget.dataset.field; + const value = e.detail.value; + this.setData({ + [`formData.${field}`]: value + }); + }, + handleSubmit() { + console.log(this.data.formData); + wx.showToast({ + title: '保存成功', + icon: 'success' + }) + const { request } = require('../../utils/request') + request({ url: '/user', method: 'POST', data: this.data.formData }) + .then((data) => { + console.log(data) + }) + } +}) diff --git a/wechat-mini-program/pages/profile/profile.json b/wechat-mini-program/pages/profile/profile.json new file mode 100644 index 0000000..a45c31d --- /dev/null +++ b/wechat-mini-program/pages/profile/profile.json @@ -0,0 +1,3 @@ +{ + "navigationBarTitleText": "个人中心" +} diff --git a/wechat-mini-program/pages/profile/profile.wxml b/wechat-mini-program/pages/profile/profile.wxml new file mode 100644 index 0000000..4f90fdc --- /dev/null +++ b/wechat-mini-program/pages/profile/profile.wxml @@ -0,0 +1,71 @@ + + + + + + + {{user.stats.learning}} + 在学课程 + + + {{user.stats.coupons}} + 优惠券 + + + {{user.stats.hours}}h + 学习时长 + + + + + + + + 录入学员信息 + + + + 学员姓名 + + + + + + + 联系电话 + + + + + + + + 年龄 + + + + + + 学历 + + + + + + + + 居住地址 + + + + + + + + diff --git a/wechat-mini-program/pages/profile/profile.wxss b/wechat-mini-program/pages/profile/profile.wxss new file mode 100644 index 0000000..b3fa77b --- /dev/null +++ b/wechat-mini-program/pages/profile/profile.wxss @@ -0,0 +1,112 @@ +.container { + min-height: 100vh; + background-color: #f9fafb; +} +.profile-header { + background-color: white; + padding: 40rpx 40rpx 100rpx 40rpx; + position: relative; + margin-bottom: 60rpx; +} +.user-info { + display: flex; + align-items: center; + gap: 30rpx; +} +.avatar { + width: 128rpx; + height: 128rpx; + border-radius: 50%; + border: 4rpx solid white; + box-shadow: 0 4rpx 10rpx rgba(0,0,0,0.1); + background-color: #eee; +} +.user-details { + display: flex; + flex-direction: column; +} +.username { + font-size: 40rpx; + font-weight: bold; + color: #1f2937; +} +.userid { + font-size: 28rpx; + color: #6b7280; +} +.stats-card { + position: absolute; + bottom: -40rpx; + left: 40rpx; + right: 40rpx; + background-color: white; + border-radius: 20rpx; + box-shadow: 0 10rpx 30rpx rgba(0,0,0,0.05); + padding: 30rpx; + display: flex; + justify-content: space-around; + text-align: center; +} +.stat-val { + font-size: 36rpx; + font-weight: bold; + color: #1f2937; +} +.stat-label { + font-size: 24rpx; + color: #9ca3af; +} +.form-section { + padding: 40rpx; + background-color: white; + margin: 0 30rpx 40rpx 30rpx; + border-radius: 30rpx; + box-shadow: 0 2rpx 10rpx rgba(0,0,0,0.05); +} +.form-title-bar { + display: flex; + align-items: center; + margin-bottom: 40rpx; + gap: 16rpx; +} +.blue-line { + width: 8rpx; + height: 32rpx; + background-color: #2563eb; + border-radius: 4rpx; +} +.form-title { + font-size: 32rpx; + font-weight: bold; + color: #1f2937; +} +.form-group { + margin-bottom: 30rpx; +} +.label { + font-size: 24rpx; + color: #6b7280; + margin-bottom: 10rpx; + display: block; +} +.input-wrap { + background-color: #f9fafb; + padding: 24rpx; + border-radius: 20rpx; + border: 2rpx solid #f3f4f6; +} +.form-row { + display: flex; + gap: 30rpx; +} +.half { + flex: 1; +} +.submit-btn { + background-color: #2563eb; + color: white; + border-radius: 20rpx; + margin-top: 40rpx; + font-weight: bold; + font-size: 32rpx; +} diff --git a/wechat-mini-program/project.config.json b/wechat-mini-program/project.config.json new file mode 100644 index 0000000..86d0d07 --- /dev/null +++ b/wechat-mini-program/project.config.json @@ -0,0 +1,61 @@ +{ + "miniprogramRoot": "", + "projectname": "edu-app", + "description": "Edu App Mini Program", + "appid": "wx2d9b9759137ef46b", + "setting": { + "urlCheck": false, + "es6": true, + "enhance": true, + "postcss": true, + "preloadBackgroundData": false, + "minified": true, + "newFeature": true, + "coverView": true, + "nodeModules": false, + "autoAudits": false, + "showShadowRootInWxmlPanel": true, + "scopeDataCheck": false, + "uglifyFileName": false, + "checkInvalidKey": true, + "checkSiteMap": true, + "uploadWithSourceMap": true, + "compileHotReLoad": false, + "lazyloadPlaceholderEnable": false, + "useMultiFrameRuntime": true, + "useApiHook": true, + "useApiHostProcess": true, + "babelSetting": { + "ignore": [], + "disablePlugins": [], + "outputPath": "" + }, + "enableEngineNative": false, + "useIsolateContext": true, + "userConfirmedBundleSwitch": false, + "packNpmManually": false, + "packNpmRelationList": [], + "minifyWXSS": true, + "compileWorklet": false, + "minifyWXML": true, + "localPlugins": false, + "disableUseStrict": false, + "useCompilerPlugins": false, + "condition": false, + "swc": false, + "disableSWC": true + }, + "compileType": "miniprogram", + "libVersion": "2.19.4", + "srcMiniprogramRoot": "", + "packOptions": { + "ignore": [], + "include": [] + }, + "editorSetting": { + "tabIndent": "insertSpaces", + "tabSize": 2 + }, + "condition": {}, + "simulatorPluginLibVersion": {} +} \ No newline at end of file diff --git a/wechat-mini-program/project.private.config.json b/wechat-mini-program/project.private.config.json new file mode 100644 index 0000000..12089dc --- /dev/null +++ b/wechat-mini-program/project.private.config.json @@ -0,0 +1,24 @@ +{ + "description": "项目私有配置文件。此文件中的内容将覆盖 project.config.json 中的相同字段。项目的改动优先同步到此文件中。详见文档:https://developers.weixin.qq.com/miniprogram/dev/devtools/projectconfig.html", + "projectname": "wechat-mini-program", + "setting": { + "compileHotReLoad": true, + "urlCheck": false, + "coverView": true, + "lazyloadPlaceholderEnable": false, + "skylineRenderEnable": false, + "preloadBackgroundData": false, + "autoAudits": false, + "useApiHook": true, + "showShadowRootInWxmlPanel": true, + "useStaticServer": false, + "useLanDebug": false, + "showES6CompileOption": false, + "checkInvalidKey": true, + "ignoreDevUnusedFiles": true, + "bigPackageSizeSupport": false, + "useIsolateContext": true + }, + "libVersion": "3.12.0", + "condition": {} +} \ No newline at end of file diff --git a/wechat-mini-program/utils/request.js b/wechat-mini-program/utils/request.js new file mode 100644 index 0000000..ee76d27 --- /dev/null +++ b/wechat-mini-program/utils/request.js @@ -0,0 +1,25 @@ +const app = getApp() + +function unwrap(data) { + if (data && typeof data === 'object' && 'code' in data && 'data' in data) { + return data.data + } + return data +} + +function request({ url, method = 'GET', data = {}, header = {} }) { + return new Promise((resolve, reject) => { + wx.request({ + url: `${app.globalData.baseUrl}${url.startsWith('/') ? '' : '/'}${url}`, + method, + data, + header, + success: (res) => { + resolve(unwrap(res.data)) + }, + fail: (err) => reject(err) + }) + }) +} + +module.exports = { request }