From e50afe5c6b5150204e1db9b505c669d995f498b6 Mon Sep 17 00:00:00 2001 From: dynastxu <151742029+ETOofficial@users.noreply.github.com> Date: Fri, 7 Nov 2025 15:09:46 +0800 Subject: [PATCH] =?UTF-8?q?=E7=A7=BB=E9=99=A4=E5=AD=90=E6=A0=91=E4=BB=A5?= =?UTF-8?q?=E4=BE=BF=E9=87=8D=E6=96=B0=E6=B7=BB=E5=8A=A0=E5=85=B6=E4=BB=96?= =?UTF-8?q?=E5=88=86=E6=94=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/DjangoBlog/.dockerignore | 12 - src/DjangoBlog/.gitattributes | 6 - src/DjangoBlog/.github/ISSUE_TEMPLATE.md | 18 - .../.github/workflows/codeql-analysis.yml | 49 - .../.github/workflows/deploy-master.yml | 176 - src/DjangoBlog/.github/workflows/django.yml | 371 --- src/DjangoBlog/.github/workflows/docker.yml | 43 - .../.github/workflows/publish-release.yml | 39 - src/DjangoBlog/.gitignore | 79 - src/DjangoBlog/Dockerfile | 15 - src/DjangoBlog/LICENSE | 20 - src/DjangoBlog/README.md | 158 - src/DjangoBlog/accounts/__init__.py | 0 src/DjangoBlog/accounts/admin.py | 60 - src/DjangoBlog/accounts/apps.py | 5 - src/DjangoBlog/accounts/forms.py | 117 - .../accounts/migrations/0001_initial.py | 49 - ...s_remove_bloguser_created_time_and_more.py | 46 - .../accounts/migrations/__init__.py | 0 src/DjangoBlog/accounts/models.py | 35 - .../accounts/templatetags/__init__.py | 0 src/DjangoBlog/accounts/tests.py | 207 -- src/DjangoBlog/accounts/urls.py | 28 - src/DjangoBlog/accounts/user_login_backend.py | 26 - src/DjangoBlog/accounts/utils.py | 49 - src/DjangoBlog/accounts/views.py | 204 -- src/DjangoBlog/blog/__init__.py | 0 src/DjangoBlog/blog/admin.py | 114 - src/DjangoBlog/blog/apps.py | 5 - src/DjangoBlog/blog/context_processors.py | 43 - src/DjangoBlog/blog/documents.py | 213 -- src/DjangoBlog/blog/forms.py | 19 - src/DjangoBlog/blog/management/__init__.py | 0 .../blog/management/commands/__init__.py | 0 .../blog/management/commands/build_index.py | 18 - .../management/commands/build_search_words.py | 13 - .../blog/management/commands/clear_cache.py | 11 - .../management/commands/create_testdata.py | 40 - .../blog/management/commands/ping_baidu.py | 50 - .../management/commands/sync_user_avatar.py | 47 - src/DjangoBlog/blog/middleware.py | 42 - .../blog/migrations/0001_initial.py | 137 - ...002_blogsettings_global_footer_and_more.py | 23 - .../0003_blogsettings_comment_need_review.py | 17 - ...de_blogsettings_analytics_code_and_more.py | 27 - ...options_alter_category_options_and_more.py | 300 -- .../0006_alter_blogsettings_options.py | 17 - src/DjangoBlog/blog/migrations/__init__.py | 0 src/DjangoBlog/blog/models.py | 376 --- src/DjangoBlog/blog/search_indexes.py | 13 - .../blog/static/account/css/account.css | 9 - .../blog/static/account/js/account.js | 47 - .../blog/static/assets/css/bootstrap.min.css | 6 - .../blog/static/assets/css/docs.min.css | 11 - .../css/ie10-viewport-bug-workaround.css | 13 - .../blog/static/assets/css/signin.css | 58 - .../static/assets/css/todc-bootstrap.min.css | 6 - .../blog/static/assets/img/checkmark.png | Bin 221 -> 0 bytes .../assets/js/ie-emulation-modes-warning.js | 51 - .../assets/js/ie10-viewport-bug-workaround.js | 23 - src/DjangoBlog/blog/static/blog/css/ie.css | 273 -- .../blog/static/blog/css/nprogress.css | 74 - .../blog/static/blog/css/oauth_style.css | 305 -- src/DjangoBlog/blog/static/blog/css/style.css | 2898 ----------------- ...MiZpBA-UFUIcVXSCEkx2cmqvXlWqW106F15M.woff2 | Bin 26368 -> 0 bytes ...MiZpBA-UFUIcVXSCEkx2cmqvXlWqWt06F15M.woff2 | Bin 37752 -> 0 bytes ...MiZpBA-UFUIcVXSCEkx2cmqvXlWqWtE6F15M.woff2 | Bin 54944 -> 0 bytes ...MiZpBA-UFUIcVXSCEkx2cmqvXlWqWtU6F15M.woff2 | Bin 4844 -> 0 bytes ...MiZpBA-UFUIcVXSCEkx2cmqvXlWqWtk6F15M.woff2 | Bin 17212 -> 0 bytes ...MiZpBA-UFUIcVXSCEkx2cmqvXlWqWu06F15M.woff2 | Bin 17880 -> 0 bytes ...126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWuU6F.woff2 | Bin 50216 -> 0 bytes ...MiZpBA-UFUIcVXSCEkx2cmqvXlWqWuk6F15M.woff2 | Bin 22920 -> 0 bytes ...MiZpBA-UFUIcVXSCEkx2cmqvXlWqWvU6F15M.woff2 | Bin 32016 -> 0 bytes ...MiZpBA-UFUIcVXSCEkx2cmqvXlWqWxU6F15M.woff2 | Bin 56528 -> 0 bytes ...Gs126MiZpBA-UvWbX2vVnXBbObj2OVTS-muw.woff2 | Bin 48320 -> 0 bytes ...126MiZpBA-UvWbX2vVnXBbObj2OVTS2mu1aB.woff2 | Bin 16920 -> 0 bytes ...126MiZpBA-UvWbX2vVnXBbObj2OVTSCmu1aB.woff2 | Bin 16496 -> 0 bytes ...126MiZpBA-UvWbX2vVnXBbObj2OVTSGmu1aB.woff2 | Bin 35156 -> 0 bytes ...126MiZpBA-UvWbX2vVnXBbObj2OVTSKmu1aB.woff2 | Bin 49268 -> 0 bytes ...126MiZpBA-UvWbX2vVnXBbObj2OVTSOmu1aB.woff2 | Bin 4504 -> 0 bytes ...126MiZpBA-UvWbX2vVnXBbObj2OVTSumu1aB.woff2 | Bin 26588 -> 0 bytes ...126MiZpBA-UvWbX2vVnXBbObj2OVTSymu1aB.woff2 | Bin 21332 -> 0 bytes ...126MiZpBA-UvWbX2vVnXBbObj2OVTUGmu1aB.woff2 | Bin 26596 -> 0 bytes ...126MiZpBA-UvWbX2vVnXBbObj2OVTVOmu1aB.woff2 | Bin 51912 -> 0 bytes .../blog/static/blog/fonts/open-sans.css | 600 ---- .../blog/static/blog/img/avatar.png | Bin 1493 -> 0 bytes .../blog/static/blog/img/icon-sn.svg | 1 - src/DjangoBlog/blog/static/blog/js/blog.js | 91 - src/DjangoBlog/blog/static/blog/js/html5.js | 8 - .../blog/static/blog/js/jquery-3.6.0.min.js | 2 - .../blog/static/blog/js/mathjax-loader.js | 142 - .../blog/static/blog/js/navigation.js | 55 - .../blog/static/blog/js/nprogress.js | 480 --- .../blog/static/pygments/default.css | 293 -- src/DjangoBlog/blog/templatetags/__init__.py | 0 src/DjangoBlog/blog/templatetags/blog_tags.py | 554 ---- src/DjangoBlog/blog/tests.py | 232 -- src/DjangoBlog/blog/urls.py | 62 - src/DjangoBlog/blog/views.py | 380 --- src/DjangoBlog/codecov.yml | 87 - src/DjangoBlog/comments/__init__.py | 0 src/DjangoBlog/comments/admin.py | 49 - src/DjangoBlog/comments/apps.py | 5 - src/DjangoBlog/comments/forms.py | 13 - .../comments/migrations/0001_initial.py | 38 - .../0002_alter_comment_is_enable.py | 18 - ...ns_remove_comment_created_time_and_more.py | 60 - .../comments/migrations/__init__.py | 0 src/DjangoBlog/comments/models.py | 39 - .../comments/templatetags/__init__.py | 0 .../comments/templatetags/comments_tags.py | 30 - src/DjangoBlog/comments/tests.py | 109 - src/DjangoBlog/comments/urls.py | 11 - src/DjangoBlog/comments/utils.py | 38 - src/DjangoBlog/comments/views.py | 63 - .../docker-compose/docker-compose.es.yml | 48 - .../deploy/docker-compose/docker-compose.yml | 60 - src/DjangoBlog/deploy/entrypoint.sh | 31 - src/DjangoBlog/deploy/k8s/configmap.yaml | 119 - src/DjangoBlog/deploy/k8s/deployment.yaml | 274 -- src/DjangoBlog/deploy/k8s/gateway.yaml | 17 - src/DjangoBlog/deploy/k8s/pv.yaml | 94 - src/DjangoBlog/deploy/k8s/pvc.yaml | 60 - src/DjangoBlog/deploy/k8s/service.yaml | 80 - src/DjangoBlog/deploy/k8s/storageclass.yaml | 10 - src/DjangoBlog/deploy/nginx.conf | 50 - src/DjangoBlog/djangoblog/__init__.py | 1 - src/DjangoBlog/djangoblog/admin_site.py | 64 - src/DjangoBlog/djangoblog/apps.py | 11 - src/DjangoBlog/djangoblog/blog_signals.py | 122 - .../djangoblog/elasticsearch_backend.py | 183 -- src/DjangoBlog/djangoblog/feeds.py | 40 - src/DjangoBlog/djangoblog/logentryadmin.py | 91 - .../djangoblog/plugin_manage/base_plugin.py | 194 -- .../plugin_manage/hook_constants.py | 22 - .../djangoblog/plugin_manage/hooks.py | 44 - .../djangoblog/plugin_manage/loader.py | 64 - src/DjangoBlog/djangoblog/settings.py | 404 --- src/DjangoBlog/djangoblog/sitemap.py | 59 - src/DjangoBlog/djangoblog/spider_notify.py | 21 - src/DjangoBlog/djangoblog/tests.py | 32 - src/DjangoBlog/djangoblog/urls.py | 78 - src/DjangoBlog/djangoblog/utils.py | 272 -- .../djangoblog/whoosh_cn_backend.py | 1044 ------ src/DjangoBlog/djangoblog/wsgi.py | 16 - src/DjangoBlog/docs/README-en.md | 158 - src/DjangoBlog/docs/config-en.md | 64 - src/DjangoBlog/docs/config.md | 58 - src/DjangoBlog/docs/docker-en.md | 114 - src/DjangoBlog/docs/docker.md | 114 - src/DjangoBlog/docs/es.md | 28 - src/DjangoBlog/docs/imgs/alipay.jpg | Bin 17961 -> 0 bytes src/DjangoBlog/docs/imgs/pycharm_logo.png | Bin 132045 -> 0 bytes src/DjangoBlog/docs/imgs/wechat.jpg | Bin 24722 -> 0 bytes src/DjangoBlog/docs/k8s-en.md | 141 - src/DjangoBlog/docs/k8s.md | 141 - .../locale/en/LC_MESSAGES/django.mo | Bin 11097 -> 0 bytes .../locale/en/LC_MESSAGES/django.po | 685 ---- .../locale/zh_Hans/LC_MESSAGES/django.mo | Bin 10321 -> 0 bytes .../locale/zh_Hans/LC_MESSAGES/django.po | 667 ---- .../locale/zh_Hant/LC_MESSAGES/django.mo | Bin 10268 -> 0 bytes .../locale/zh_Hant/LC_MESSAGES/django.po | 668 ---- src/DjangoBlog/manage.py | 22 - src/DjangoBlog/oauth/__init__.py | 0 src/DjangoBlog/oauth/admin.py | 54 - src/DjangoBlog/oauth/apps.py | 5 - src/DjangoBlog/oauth/forms.py | 12 - .../oauth/migrations/0001_initial.py | 57 - ...ptions_alter_oauthuser_options_and_more.py | 86 - .../0003_alter_oauthuser_nickname.py | 18 - src/DjangoBlog/oauth/migrations/__init__.py | 0 src/DjangoBlog/oauth/models.py | 67 - src/DjangoBlog/oauth/oauthmanager.py | 504 --- src/DjangoBlog/oauth/templatetags/__init__.py | 1 - .../oauth/templatetags/oauth_tags.py | 22 - src/DjangoBlog/oauth/tests.py | 249 -- src/DjangoBlog/oauth/urls.py | 25 - src/DjangoBlog/oauth/views.py | 253 -- src/DjangoBlog/owntracks/__init__.py | 0 src/DjangoBlog/owntracks/admin.py | 7 - src/DjangoBlog/owntracks/apps.py | 5 - .../owntracks/migrations/0001_initial.py | 31 - ...0002_alter_owntracklog_options_and_more.py | 22 - .../owntracks/migrations/__init__.py | 0 src/DjangoBlog/owntracks/models.py | 20 - src/DjangoBlog/owntracks/tests.py | 64 - src/DjangoBlog/owntracks/urls.py | 12 - src/DjangoBlog/owntracks/views.py | 127 - src/DjangoBlog/plugins/__init__.py | 1 - .../plugins/article_copyright/__init__.py | 1 - .../plugins/article_copyright/plugin.py | 37 - .../article_recommendation/__init__.py | 1 - .../plugins/article_recommendation/plugin.py | 205 -- .../css/recommendation.css | 166 - .../js/recommendation.js | 93 - .../plugins/external_links/__init__.py | 1 - .../plugins/external_links/plugin.py | 48 - .../plugins/image_lazy_loading/__init__.py | 1 - .../plugins/image_lazy_loading/plugin.py | 182 -- .../plugins/reading_time/__init__.py | 1 - src/DjangoBlog/plugins/reading_time/plugin.py | 51 - .../plugins/seo_optimizer/__init__.py | 1 - .../plugins/seo_optimizer/plugin.py | 147 - src/DjangoBlog/plugins/view_count/__init__.py | 1 - src/DjangoBlog/plugins/view_count/plugin.py | 18 - src/DjangoBlog/requirements.txt | Bin 1654 -> 0 bytes .../servermanager/MemcacheStorage.py | 32 - src/DjangoBlog/servermanager/__init__.py | 0 src/DjangoBlog/servermanager/admin.py | 19 - src/DjangoBlog/servermanager/api/__init__.py | 1 - src/DjangoBlog/servermanager/api/blogapi.py | 27 - src/DjangoBlog/servermanager/api/commonapi.py | 64 - src/DjangoBlog/servermanager/apps.py | 5 - .../servermanager/migrations/0001_initial.py | 45 - ...002_alter_emailsendlog_options_and_more.py | 32 - .../servermanager/migrations/__init__.py | 0 src/DjangoBlog/servermanager/models.py | 33 - src/DjangoBlog/servermanager/robot.py | 187 -- src/DjangoBlog/servermanager/tests.py | 79 - src/DjangoBlog/servermanager/urls.py | 10 - src/DjangoBlog/servermanager/views.py | 1 - .../templates/account/forget_password.html | 30 - src/DjangoBlog/templates/account/login.html | 46 - .../templates/account/registration_form.html | 29 - src/DjangoBlog/templates/account/result.html | 27 - .../templates/blog/article_archives.html | 60 - .../templates/blog/article_detail.html | 52 - .../templates/blog/article_index.html | 42 - src/DjangoBlog/templates/blog/error_page.html | 45 - src/DjangoBlog/templates/blog/links_list.html | 44 - .../templates/blog/tags/article_info.html | 79 - .../blog/tags/article_meta_info.html | 57 - .../blog/tags/article_pagination.html | 17 - .../templates/blog/tags/article_tag_list.html | 19 - .../templates/blog/tags/breadcrumb.html | 19 - .../templates/blog/tags/sidebar.html | 136 - .../templates/comments/tags/comment_item.html | 37 - .../comments/tags/comment_item_tree.html | 57 - .../templates/comments/tags/comment_list.html | 45 - .../templates/comments/tags/post_comment.html | 33 - .../templates/oauth/bindsuccess.html | 22 - .../templates/oauth/oauth_applications.html | 13 - .../templates/oauth/require_email.html | 46 - .../templates/owntracks/show_log_dates.html | 17 - .../templates/owntracks/show_maps.html | 135 - .../article_recommendation/__init__.py | 1 - .../article_recommendation/bottom_widget.html | 23 - .../sidebar_widget.html | 17 - .../templates/plugins/css_includes.html | 4 - .../templates/plugins/js_includes.html | 4 - .../search/indexes/blog/article_text.txt | 3 - src/DjangoBlog/templates/search/search.html | 66 - .../templates/share_layout/adsense.html | 6 - .../templates/share_layout/base.html | 119 - .../templates/share_layout/base_account.html | 47 - .../templates/share_layout/footer.html | 56 - .../templates/share_layout/nav.html | 30 - .../templates/share_layout/nav_node.html | 19 - 258 files changed, 21669 deletions(-) delete mode 100644 src/DjangoBlog/.dockerignore delete mode 100644 src/DjangoBlog/.gitattributes delete mode 100644 src/DjangoBlog/.github/ISSUE_TEMPLATE.md delete mode 100644 src/DjangoBlog/.github/workflows/codeql-analysis.yml delete mode 100644 src/DjangoBlog/.github/workflows/deploy-master.yml delete mode 100644 src/DjangoBlog/.github/workflows/django.yml delete mode 100644 src/DjangoBlog/.github/workflows/docker.yml delete mode 100644 src/DjangoBlog/.github/workflows/publish-release.yml delete mode 100644 src/DjangoBlog/.gitignore delete mode 100644 src/DjangoBlog/Dockerfile delete mode 100644 src/DjangoBlog/LICENSE delete mode 100644 src/DjangoBlog/README.md delete mode 100644 src/DjangoBlog/accounts/__init__.py delete mode 100644 src/DjangoBlog/accounts/admin.py delete mode 100644 src/DjangoBlog/accounts/apps.py delete mode 100644 src/DjangoBlog/accounts/forms.py delete mode 100644 src/DjangoBlog/accounts/migrations/0001_initial.py delete mode 100644 src/DjangoBlog/accounts/migrations/0002_alter_bloguser_options_remove_bloguser_created_time_and_more.py delete mode 100644 src/DjangoBlog/accounts/migrations/__init__.py delete mode 100644 src/DjangoBlog/accounts/models.py delete mode 100644 src/DjangoBlog/accounts/templatetags/__init__.py delete mode 100644 src/DjangoBlog/accounts/tests.py delete mode 100644 src/DjangoBlog/accounts/urls.py delete mode 100644 src/DjangoBlog/accounts/user_login_backend.py delete mode 100644 src/DjangoBlog/accounts/utils.py delete mode 100644 src/DjangoBlog/accounts/views.py delete mode 100644 src/DjangoBlog/blog/__init__.py delete mode 100644 src/DjangoBlog/blog/admin.py delete mode 100644 src/DjangoBlog/blog/apps.py delete mode 100644 src/DjangoBlog/blog/context_processors.py delete mode 100644 src/DjangoBlog/blog/documents.py delete mode 100644 src/DjangoBlog/blog/forms.py delete mode 100644 src/DjangoBlog/blog/management/__init__.py delete mode 100644 src/DjangoBlog/blog/management/commands/__init__.py delete mode 100644 src/DjangoBlog/blog/management/commands/build_index.py delete mode 100644 src/DjangoBlog/blog/management/commands/build_search_words.py delete mode 100644 src/DjangoBlog/blog/management/commands/clear_cache.py delete mode 100644 src/DjangoBlog/blog/management/commands/create_testdata.py delete mode 100644 src/DjangoBlog/blog/management/commands/ping_baidu.py delete mode 100644 src/DjangoBlog/blog/management/commands/sync_user_avatar.py delete mode 100644 src/DjangoBlog/blog/middleware.py delete mode 100644 src/DjangoBlog/blog/migrations/0001_initial.py delete mode 100644 src/DjangoBlog/blog/migrations/0002_blogsettings_global_footer_and_more.py delete mode 100644 src/DjangoBlog/blog/migrations/0003_blogsettings_comment_need_review.py delete mode 100644 src/DjangoBlog/blog/migrations/0004_rename_analyticscode_blogsettings_analytics_code_and_more.py delete mode 100644 src/DjangoBlog/blog/migrations/0005_alter_article_options_alter_category_options_and_more.py delete mode 100644 src/DjangoBlog/blog/migrations/0006_alter_blogsettings_options.py delete mode 100644 src/DjangoBlog/blog/migrations/__init__.py delete mode 100644 src/DjangoBlog/blog/models.py delete mode 100644 src/DjangoBlog/blog/search_indexes.py delete mode 100644 src/DjangoBlog/blog/static/account/css/account.css delete mode 100644 src/DjangoBlog/blog/static/account/js/account.js delete mode 100644 src/DjangoBlog/blog/static/assets/css/bootstrap.min.css delete mode 100644 src/DjangoBlog/blog/static/assets/css/docs.min.css delete mode 100644 src/DjangoBlog/blog/static/assets/css/ie10-viewport-bug-workaround.css delete mode 100644 src/DjangoBlog/blog/static/assets/css/signin.css delete mode 100644 src/DjangoBlog/blog/static/assets/css/todc-bootstrap.min.css delete mode 100644 src/DjangoBlog/blog/static/assets/img/checkmark.png delete mode 100644 src/DjangoBlog/blog/static/assets/js/ie-emulation-modes-warning.js delete mode 100644 src/DjangoBlog/blog/static/assets/js/ie10-viewport-bug-workaround.js delete mode 100644 src/DjangoBlog/blog/static/blog/css/ie.css delete mode 100644 src/DjangoBlog/blog/static/blog/css/nprogress.css delete mode 100644 src/DjangoBlog/blog/static/blog/css/oauth_style.css delete mode 100644 src/DjangoBlog/blog/static/blog/css/style.css delete mode 100644 src/DjangoBlog/blog/static/blog/fonts/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqW106F15M.woff2 delete mode 100644 src/DjangoBlog/blog/static/blog/fonts/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWt06F15M.woff2 delete mode 100644 src/DjangoBlog/blog/static/blog/fonts/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWtE6F15M.woff2 delete mode 100644 src/DjangoBlog/blog/static/blog/fonts/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWtU6F15M.woff2 delete mode 100644 src/DjangoBlog/blog/static/blog/fonts/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWtk6F15M.woff2 delete mode 100644 src/DjangoBlog/blog/static/blog/fonts/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWu06F15M.woff2 delete mode 100644 src/DjangoBlog/blog/static/blog/fonts/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWuU6F.woff2 delete mode 100644 src/DjangoBlog/blog/static/blog/fonts/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWuk6F15M.woff2 delete mode 100644 src/DjangoBlog/blog/static/blog/fonts/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWvU6F15M.woff2 delete mode 100644 src/DjangoBlog/blog/static/blog/fonts/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWxU6F15M.woff2 delete mode 100644 src/DjangoBlog/blog/static/blog/fonts/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTS-muw.woff2 delete mode 100644 src/DjangoBlog/blog/static/blog/fonts/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTS2mu1aB.woff2 delete mode 100644 src/DjangoBlog/blog/static/blog/fonts/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSCmu1aB.woff2 delete mode 100644 src/DjangoBlog/blog/static/blog/fonts/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSGmu1aB.woff2 delete mode 100644 src/DjangoBlog/blog/static/blog/fonts/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSKmu1aB.woff2 delete mode 100644 src/DjangoBlog/blog/static/blog/fonts/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSOmu1aB.woff2 delete mode 100644 src/DjangoBlog/blog/static/blog/fonts/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSumu1aB.woff2 delete mode 100644 src/DjangoBlog/blog/static/blog/fonts/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSymu1aB.woff2 delete mode 100644 src/DjangoBlog/blog/static/blog/fonts/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTUGmu1aB.woff2 delete mode 100644 src/DjangoBlog/blog/static/blog/fonts/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTVOmu1aB.woff2 delete mode 100644 src/DjangoBlog/blog/static/blog/fonts/open-sans.css delete mode 100644 src/DjangoBlog/blog/static/blog/img/avatar.png delete mode 100644 src/DjangoBlog/blog/static/blog/img/icon-sn.svg delete mode 100644 src/DjangoBlog/blog/static/blog/js/blog.js delete mode 100644 src/DjangoBlog/blog/static/blog/js/html5.js delete mode 100644 src/DjangoBlog/blog/static/blog/js/jquery-3.6.0.min.js delete mode 100644 src/DjangoBlog/blog/static/blog/js/mathjax-loader.js delete mode 100644 src/DjangoBlog/blog/static/blog/js/navigation.js delete mode 100644 src/DjangoBlog/blog/static/blog/js/nprogress.js delete mode 100755 src/DjangoBlog/blog/static/pygments/default.css delete mode 100644 src/DjangoBlog/blog/templatetags/__init__.py delete mode 100644 src/DjangoBlog/blog/templatetags/blog_tags.py delete mode 100644 src/DjangoBlog/blog/tests.py delete mode 100644 src/DjangoBlog/blog/urls.py delete mode 100644 src/DjangoBlog/blog/views.py delete mode 100644 src/DjangoBlog/codecov.yml delete mode 100644 src/DjangoBlog/comments/__init__.py delete mode 100644 src/DjangoBlog/comments/admin.py delete mode 100644 src/DjangoBlog/comments/apps.py delete mode 100644 src/DjangoBlog/comments/forms.py delete mode 100644 src/DjangoBlog/comments/migrations/0001_initial.py delete mode 100644 src/DjangoBlog/comments/migrations/0002_alter_comment_is_enable.py delete mode 100644 src/DjangoBlog/comments/migrations/0003_alter_comment_options_remove_comment_created_time_and_more.py delete mode 100644 src/DjangoBlog/comments/migrations/__init__.py delete mode 100644 src/DjangoBlog/comments/models.py delete mode 100644 src/DjangoBlog/comments/templatetags/__init__.py delete mode 100644 src/DjangoBlog/comments/templatetags/comments_tags.py delete mode 100644 src/DjangoBlog/comments/tests.py delete mode 100644 src/DjangoBlog/comments/urls.py delete mode 100644 src/DjangoBlog/comments/utils.py delete mode 100644 src/DjangoBlog/comments/views.py delete mode 100644 src/DjangoBlog/deploy/docker-compose/docker-compose.es.yml delete mode 100644 src/DjangoBlog/deploy/docker-compose/docker-compose.yml delete mode 100644 src/DjangoBlog/deploy/entrypoint.sh delete mode 100644 src/DjangoBlog/deploy/k8s/configmap.yaml delete mode 100644 src/DjangoBlog/deploy/k8s/deployment.yaml delete mode 100644 src/DjangoBlog/deploy/k8s/gateway.yaml delete mode 100644 src/DjangoBlog/deploy/k8s/pv.yaml delete mode 100644 src/DjangoBlog/deploy/k8s/pvc.yaml delete mode 100644 src/DjangoBlog/deploy/k8s/service.yaml delete mode 100644 src/DjangoBlog/deploy/k8s/storageclass.yaml delete mode 100644 src/DjangoBlog/deploy/nginx.conf delete mode 100644 src/DjangoBlog/djangoblog/__init__.py delete mode 100644 src/DjangoBlog/djangoblog/admin_site.py delete mode 100644 src/DjangoBlog/djangoblog/apps.py delete mode 100644 src/DjangoBlog/djangoblog/blog_signals.py delete mode 100644 src/DjangoBlog/djangoblog/elasticsearch_backend.py delete mode 100644 src/DjangoBlog/djangoblog/feeds.py delete mode 100644 src/DjangoBlog/djangoblog/logentryadmin.py delete mode 100644 src/DjangoBlog/djangoblog/plugin_manage/base_plugin.py delete mode 100644 src/DjangoBlog/djangoblog/plugin_manage/hook_constants.py delete mode 100644 src/DjangoBlog/djangoblog/plugin_manage/hooks.py delete mode 100644 src/DjangoBlog/djangoblog/plugin_manage/loader.py delete mode 100644 src/DjangoBlog/djangoblog/settings.py delete mode 100644 src/DjangoBlog/djangoblog/sitemap.py delete mode 100644 src/DjangoBlog/djangoblog/spider_notify.py delete mode 100644 src/DjangoBlog/djangoblog/tests.py delete mode 100644 src/DjangoBlog/djangoblog/urls.py delete mode 100644 src/DjangoBlog/djangoblog/utils.py delete mode 100644 src/DjangoBlog/djangoblog/whoosh_cn_backend.py delete mode 100644 src/DjangoBlog/djangoblog/wsgi.py delete mode 100644 src/DjangoBlog/docs/README-en.md delete mode 100644 src/DjangoBlog/docs/config-en.md delete mode 100644 src/DjangoBlog/docs/config.md delete mode 100644 src/DjangoBlog/docs/docker-en.md delete mode 100644 src/DjangoBlog/docs/docker.md delete mode 100644 src/DjangoBlog/docs/es.md delete mode 100644 src/DjangoBlog/docs/imgs/alipay.jpg delete mode 100644 src/DjangoBlog/docs/imgs/pycharm_logo.png delete mode 100644 src/DjangoBlog/docs/imgs/wechat.jpg delete mode 100644 src/DjangoBlog/docs/k8s-en.md delete mode 100644 src/DjangoBlog/docs/k8s.md delete mode 100644 src/DjangoBlog/locale/en/LC_MESSAGES/django.mo delete mode 100644 src/DjangoBlog/locale/en/LC_MESSAGES/django.po delete mode 100644 src/DjangoBlog/locale/zh_Hans/LC_MESSAGES/django.mo delete mode 100644 src/DjangoBlog/locale/zh_Hans/LC_MESSAGES/django.po delete mode 100644 src/DjangoBlog/locale/zh_Hant/LC_MESSAGES/django.mo delete mode 100644 src/DjangoBlog/locale/zh_Hant/LC_MESSAGES/django.po delete mode 100755 src/DjangoBlog/manage.py delete mode 100644 src/DjangoBlog/oauth/__init__.py delete mode 100644 src/DjangoBlog/oauth/admin.py delete mode 100644 src/DjangoBlog/oauth/apps.py delete mode 100644 src/DjangoBlog/oauth/forms.py delete mode 100644 src/DjangoBlog/oauth/migrations/0001_initial.py delete mode 100644 src/DjangoBlog/oauth/migrations/0002_alter_oauthconfig_options_alter_oauthuser_options_and_more.py delete mode 100644 src/DjangoBlog/oauth/migrations/0003_alter_oauthuser_nickname.py delete mode 100644 src/DjangoBlog/oauth/migrations/__init__.py delete mode 100644 src/DjangoBlog/oauth/models.py delete mode 100644 src/DjangoBlog/oauth/oauthmanager.py delete mode 100644 src/DjangoBlog/oauth/templatetags/__init__.py delete mode 100644 src/DjangoBlog/oauth/templatetags/oauth_tags.py delete mode 100644 src/DjangoBlog/oauth/tests.py delete mode 100644 src/DjangoBlog/oauth/urls.py delete mode 100644 src/DjangoBlog/oauth/views.py delete mode 100644 src/DjangoBlog/owntracks/__init__.py delete mode 100644 src/DjangoBlog/owntracks/admin.py delete mode 100644 src/DjangoBlog/owntracks/apps.py delete mode 100644 src/DjangoBlog/owntracks/migrations/0001_initial.py delete mode 100644 src/DjangoBlog/owntracks/migrations/0002_alter_owntracklog_options_and_more.py delete mode 100644 src/DjangoBlog/owntracks/migrations/__init__.py delete mode 100644 src/DjangoBlog/owntracks/models.py delete mode 100644 src/DjangoBlog/owntracks/tests.py delete mode 100644 src/DjangoBlog/owntracks/urls.py delete mode 100644 src/DjangoBlog/owntracks/views.py delete mode 100644 src/DjangoBlog/plugins/__init__.py delete mode 100644 src/DjangoBlog/plugins/article_copyright/__init__.py delete mode 100644 src/DjangoBlog/plugins/article_copyright/plugin.py delete mode 100644 src/DjangoBlog/plugins/article_recommendation/__init__.py delete mode 100644 src/DjangoBlog/plugins/article_recommendation/plugin.py delete mode 100644 src/DjangoBlog/plugins/article_recommendation/static/article_recommendation/css/recommendation.css delete mode 100644 src/DjangoBlog/plugins/article_recommendation/static/article_recommendation/js/recommendation.js delete mode 100644 src/DjangoBlog/plugins/external_links/__init__.py delete mode 100644 src/DjangoBlog/plugins/external_links/plugin.py delete mode 100644 src/DjangoBlog/plugins/image_lazy_loading/__init__.py delete mode 100644 src/DjangoBlog/plugins/image_lazy_loading/plugin.py delete mode 100644 src/DjangoBlog/plugins/reading_time/__init__.py delete mode 100644 src/DjangoBlog/plugins/reading_time/plugin.py delete mode 100644 src/DjangoBlog/plugins/seo_optimizer/__init__.py delete mode 100644 src/DjangoBlog/plugins/seo_optimizer/plugin.py delete mode 100644 src/DjangoBlog/plugins/view_count/__init__.py delete mode 100644 src/DjangoBlog/plugins/view_count/plugin.py delete mode 100644 src/DjangoBlog/requirements.txt delete mode 100644 src/DjangoBlog/servermanager/MemcacheStorage.py delete mode 100644 src/DjangoBlog/servermanager/__init__.py delete mode 100644 src/DjangoBlog/servermanager/admin.py delete mode 100644 src/DjangoBlog/servermanager/api/__init__.py delete mode 100644 src/DjangoBlog/servermanager/api/blogapi.py delete mode 100644 src/DjangoBlog/servermanager/api/commonapi.py delete mode 100644 src/DjangoBlog/servermanager/apps.py delete mode 100644 src/DjangoBlog/servermanager/migrations/0001_initial.py delete mode 100644 src/DjangoBlog/servermanager/migrations/0002_alter_emailsendlog_options_and_more.py delete mode 100644 src/DjangoBlog/servermanager/migrations/__init__.py delete mode 100644 src/DjangoBlog/servermanager/models.py delete mode 100644 src/DjangoBlog/servermanager/robot.py delete mode 100644 src/DjangoBlog/servermanager/tests.py delete mode 100644 src/DjangoBlog/servermanager/urls.py delete mode 100644 src/DjangoBlog/servermanager/views.py delete mode 100644 src/DjangoBlog/templates/account/forget_password.html delete mode 100644 src/DjangoBlog/templates/account/login.html delete mode 100644 src/DjangoBlog/templates/account/registration_form.html delete mode 100644 src/DjangoBlog/templates/account/result.html delete mode 100644 src/DjangoBlog/templates/blog/article_archives.html delete mode 100755 src/DjangoBlog/templates/blog/article_detail.html delete mode 100644 src/DjangoBlog/templates/blog/article_index.html delete mode 100644 src/DjangoBlog/templates/blog/error_page.html delete mode 100644 src/DjangoBlog/templates/blog/links_list.html delete mode 100644 src/DjangoBlog/templates/blog/tags/article_info.html delete mode 100644 src/DjangoBlog/templates/blog/tags/article_meta_info.html delete mode 100644 src/DjangoBlog/templates/blog/tags/article_pagination.html delete mode 100644 src/DjangoBlog/templates/blog/tags/article_tag_list.html delete mode 100644 src/DjangoBlog/templates/blog/tags/breadcrumb.html delete mode 100755 src/DjangoBlog/templates/blog/tags/sidebar.html delete mode 100644 src/DjangoBlog/templates/comments/tags/comment_item.html delete mode 100644 src/DjangoBlog/templates/comments/tags/comment_item_tree.html delete mode 100644 src/DjangoBlog/templates/comments/tags/comment_list.html delete mode 100644 src/DjangoBlog/templates/comments/tags/post_comment.html delete mode 100644 src/DjangoBlog/templates/oauth/bindsuccess.html delete mode 100644 src/DjangoBlog/templates/oauth/oauth_applications.html delete mode 100644 src/DjangoBlog/templates/oauth/require_email.html delete mode 100644 src/DjangoBlog/templates/owntracks/show_log_dates.html delete mode 100644 src/DjangoBlog/templates/owntracks/show_maps.html delete mode 100644 src/DjangoBlog/templates/plugins/article_recommendation/__init__.py delete mode 100644 src/DjangoBlog/templates/plugins/article_recommendation/bottom_widget.html delete mode 100644 src/DjangoBlog/templates/plugins/article_recommendation/sidebar_widget.html delete mode 100644 src/DjangoBlog/templates/plugins/css_includes.html delete mode 100644 src/DjangoBlog/templates/plugins/js_includes.html delete mode 100644 src/DjangoBlog/templates/search/indexes/blog/article_text.txt delete mode 100644 src/DjangoBlog/templates/search/search.html delete mode 100644 src/DjangoBlog/templates/share_layout/adsense.html delete mode 100644 src/DjangoBlog/templates/share_layout/base.html delete mode 100644 src/DjangoBlog/templates/share_layout/base_account.html delete mode 100644 src/DjangoBlog/templates/share_layout/footer.html delete mode 100644 src/DjangoBlog/templates/share_layout/nav.html delete mode 100644 src/DjangoBlog/templates/share_layout/nav_node.html diff --git a/src/DjangoBlog/.dockerignore b/src/DjangoBlog/.dockerignore deleted file mode 100644 index becd6f9..0000000 --- a/src/DjangoBlog/.dockerignore +++ /dev/null @@ -1,12 +0,0 @@ -bin/data/ -# virtualenv -venv/ -collectedstatic/ -djangoblog/whoosh_index/ -uploads/ -settings_production.py -*.md -docs/ -logs/ -static/ -.github/ diff --git a/src/DjangoBlog/.gitattributes b/src/DjangoBlog/.gitattributes deleted file mode 100644 index fd52ece..0000000 --- a/src/DjangoBlog/.gitattributes +++ /dev/null @@ -1,6 +0,0 @@ -blog/static/* linguist-vendored -*.js linguist-vendored -*.css linguist-vendored -* text=auto -*.sh text eol=lf -*.conf text eol=lf \ No newline at end of file diff --git a/src/DjangoBlog/.github/ISSUE_TEMPLATE.md b/src/DjangoBlog/.github/ISSUE_TEMPLATE.md deleted file mode 100644 index 2b5b7aa..0000000 --- a/src/DjangoBlog/.github/ISSUE_TEMPLATE.md +++ /dev/null @@ -1,18 +0,0 @@ - - -**我确定我已经查看了** (标注`[ ]`为`[x]`) - -- [ ] [DjangoBlog的readme](https://github.com/liangliangyy/DjangoBlog/blob/master/README.md) -- [ ] [配置说明](https://github.com/liangliangyy/DjangoBlog/blob/master/bin/config.md) -- [ ] [其他 Issues](https://github.com/liangliangyy/DjangoBlog/issues) - ----- - -**我要申请** (标注`[ ]`为`[x]`) - -- [ ] BUG 反馈 -- [ ] 添加新的特性或者功能 -- [ ] 请求技术支持 diff --git a/src/DjangoBlog/.github/workflows/codeql-analysis.yml b/src/DjangoBlog/.github/workflows/codeql-analysis.yml deleted file mode 100644 index 52775e0..0000000 --- a/src/DjangoBlog/.github/workflows/codeql-analysis.yml +++ /dev/null @@ -1,49 +0,0 @@ -name: "CodeQL" - -on: - push: - branches: - - master - - dev - paths-ignore: - - '**/*.md' - - '**/*.css' - - '**/*.js' - - '**/*.yml' - - '**/*.txt' - pull_request: - branches: - - master - - dev - paths-ignore: - - '**/*.md' - - '**/*.css' - - '**/*.js' - - '**/*.yml' - - '**/*.txt' - schedule: - - cron: '30 1 * * 0' - - -jobs: - CodeQL-Build: - runs-on: ubuntu-latest - permissions: - security-events: write - actions: read - contents: read - - steps: - - name: Checkout repository - uses: actions/checkout@v3 - - - name: Initialize CodeQL - uses: github/codeql-action/init@v3 - with: - languages: python - - - name: Autobuild - uses: github/codeql-action/autobuild@v3 - - - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v3 \ No newline at end of file diff --git a/src/DjangoBlog/.github/workflows/deploy-master.yml b/src/DjangoBlog/.github/workflows/deploy-master.yml deleted file mode 100644 index c07a326..0000000 --- a/src/DjangoBlog/.github/workflows/deploy-master.yml +++ /dev/null @@ -1,176 +0,0 @@ -name: 自动部署到生产环境 - -on: - workflow_run: - workflows: ["Django CI"] - types: - - completed - branches: - - master - workflow_dispatch: - inputs: - environment: - description: '部署环境' - required: true - default: 'production' - type: choice - options: - - production - - staging - image_tag: - description: '镜像标签 (默认: latest)' - required: false - default: 'latest' - type: string - skip_tests: - description: '跳过测试直接部署' - required: false - default: false - type: boolean - -env: - REGISTRY: registry.cn-shenzhen.aliyuncs.com - IMAGE_NAME: liangliangyy/djangoblog - NAMESPACE: djangoblog - -jobs: - deploy: - name: 构建镜像并部署到生产环境 - runs-on: ubuntu-latest - if: ${{ github.event.workflow_run.conclusion == 'success' || github.event_name == 'workflow_dispatch' }} - - steps: - - name: 检出代码 - uses: actions/checkout@v4 - - - name: 设置部署参数 - id: deploy-params - run: | - if [ "${{ github.event_name }}" = "workflow_dispatch" ]; then - echo "trigger_type=手动触发" >> $GITHUB_OUTPUT - echo "environment=${{ github.event.inputs.environment }}" >> $GITHUB_OUTPUT - echo "image_tag=${{ github.event.inputs.image_tag }}" >> $GITHUB_OUTPUT - echo "skip_tests=${{ github.event.inputs.skip_tests }}" >> $GITHUB_OUTPUT - else - echo "trigger_type=CI自动触发" >> $GITHUB_OUTPUT - echo "environment=production" >> $GITHUB_OUTPUT - echo "image_tag=latest" >> $GITHUB_OUTPUT - echo "skip_tests=false" >> $GITHUB_OUTPUT - fi - - - name: 显示部署信息 - run: | - echo "🚀 部署信息:" - echo " 触发方式: ${{ steps.deploy-params.outputs.trigger_type }}" - echo " 部署环境: ${{ steps.deploy-params.outputs.environment }}" - echo " 镜像标签: ${{ steps.deploy-params.outputs.image_tag }}" - echo " 跳过测试: ${{ steps.deploy-params.outputs.skip_tests }}" - - - name: 设置Docker Buildx - uses: docker/setup-buildx-action@v3 - - - name: 登录私有镜像仓库 - uses: docker/login-action@v3 - with: - registry: ${{ env.REGISTRY }} - username: ${{ secrets.REGISTRY_USERNAME }} - password: ${{ secrets.REGISTRY_PASSWORD }} - - - name: 提取镜像元数据 - id: meta - uses: docker/metadata-action@v5 - with: - images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} - tags: | - type=ref,event=branch - type=sha,prefix={{branch}}- - type=raw,value=${{ steps.deploy-params.outputs.image_tag }} - - - name: 构建并推送Docker镜像 - uses: docker/build-push-action@v5 - with: - context: . - file: ./Dockerfile - push: true - tags: ${{ steps.meta.outputs.tags }} - labels: ${{ steps.meta.outputs.labels }} - cache-from: type=gha - cache-to: type=gha,mode=max - platforms: linux/amd64 - - - name: 部署到生产服务器 - uses: appleboy/ssh-action@v1.0.3 - with: - host: ${{ secrets.PRODUCTION_HOST }} - username: ${{ secrets.PRODUCTION_USER }} - key: ${{ secrets.PRODUCTION_SSH_KEY }} - port: ${{ secrets.PRODUCTION_PORT || 22 }} - script: | - echo "🚀 开始部署 DjangoBlog..." - - # 检查kubectl是否可用 - if ! command -v kubectl &> /dev/null; then - echo "❌ 错误: kubectl 未安装或不在PATH中" - exit 1 - fi - - # 检查命名空间是否存在 - if ! kubectl get namespace ${{ env.NAMESPACE }} &> /dev/null; then - echo "❌ 错误: 命名空间 ${{ env.NAMESPACE }} 不存在" - exit 1 - fi - - # 更新deployment镜像 - echo "📦 更新deployment镜像为: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ steps.deploy-params.outputs.image_tag }}" - kubectl set image deployment/djangoblog \ - djangoblog=${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ steps.deploy-params.outputs.image_tag }} \ - -n ${{ env.NAMESPACE }} - - # 重启deployment - echo "🔄 重启deployment..." - kubectl -n ${{ env.NAMESPACE }} rollout restart deployment djangoblog - - # 等待deployment完成 - echo "⏳ 等待deployment完成..." - kubectl rollout status deployment/djangoblog -n ${{ env.NAMESPACE }} --timeout=300s - - # 检查deployment状态 - echo "✅ 检查deployment状态..." - kubectl get deployment djangoblog -n ${{ env.NAMESPACE }} - kubectl get pods -l app=djangoblog -n ${{ env.NAMESPACE }} - - echo "🎉 部署完成!" - - - name: 发送部署通知 - if: always() - run: | - # 设置通知内容 - if [ "${{ job.status }}" = "success" ]; then - TITLE="✅ DjangoBlog部署成功" - STATUS="成功" - else - TITLE="❌ DjangoBlog部署失败" - STATUS="失败" - fi - - MESSAGE="部署状态: ${STATUS} - 触发方式: ${{ steps.deploy-params.outputs.trigger_type }} - 部署环境: ${{ steps.deploy-params.outputs.environment }} - 镜像标签: ${{ steps.deploy-params.outputs.image_tag }} - 提交者: ${{ github.actor }} - 时间: $(date '+%Y-%m-%d %H:%M:%S') - - 查看详情: https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}" - - # 发送Server酱通知 - if [ -n "${{ secrets.SERVERCHAN_KEY }}" ]; then - echo "{\"title\": \"${TITLE}\", \"desp\": \"${MESSAGE}\"}" > /tmp/serverchan.json - - curl --location "https://sctapi.ftqq.com/${{ secrets.SERVERCHAN_KEY }}.send" \ - --header "Content-Type: application/json" \ - --data @/tmp/serverchan.json \ - --silent > /dev/null - - rm -f /tmp/serverchan.json - echo "📱 部署通知已发送" - fi \ No newline at end of file diff --git a/src/DjangoBlog/.github/workflows/django.yml b/src/DjangoBlog/.github/workflows/django.yml deleted file mode 100644 index ebe7953..0000000 --- a/src/DjangoBlog/.github/workflows/django.yml +++ /dev/null @@ -1,371 +0,0 @@ -name: Django CI - -on: - push: - branches: - - master - - dev - paths-ignore: - - '**/*.md' - - '**/*.css' - - '**/*.js' - pull_request: - branches: - - master - - dev - paths-ignore: - - '**/*.md' - - '**/*.css' - - '**/*.js' - -jobs: - test: - runs-on: ubuntu-latest - strategy: - fail-fast: false - matrix: - include: - # 标准测试 - Python 3.10 - - python-version: "3.10" - test-type: "standard" - database: "mysql" - elasticsearch: false - coverage: false - - # 标准测试 - Python 3.11 - - python-version: "3.11" - test-type: "standard" - database: "mysql" - elasticsearch: false - coverage: false - - # 完整测试 - 包含ES和覆盖率 - - python-version: "3.11" - test-type: "full" - database: "mysql" - elasticsearch: true - coverage: true - - # Docker构建测试 - - python-version: "3.11" - test-type: "docker" - database: "none" - elasticsearch: false - coverage: false - - name: Test (${{ matrix.test-type }}, Python ${{ matrix.python-version }}) - - steps: - - name: Checkout代码 - uses: actions/checkout@v4 - - - name: 设置测试信息 - id: test-info - run: | - echo "test_name=${{ matrix.test-type }}-py${{ matrix.python-version }}" >> $GITHUB_OUTPUT - if [ "${{ matrix.test-type }}" = "docker" ]; then - echo "skip_python_setup=true" >> $GITHUB_OUTPUT - else - echo "skip_python_setup=false" >> $GITHUB_OUTPUT - fi - - # MySQL数据库设置 (只有需要数据库的测试才执行) - - name: 启动MySQL数据库 - if: matrix.database == 'mysql' - uses: samin/mysql-action@v1.3 - with: - host port: 3306 - container port: 3306 - character set server: utf8mb4 - collation server: utf8mb4_general_ci - mysql version: latest - mysql root password: root - mysql database: djangoblog - mysql user: root - mysql password: root - - # Elasticsearch设置 (只有完整测试才执行) - - name: 配置系统参数 (ES) - if: matrix.elasticsearch == true - run: | - sudo swapoff -a - sudo sysctl -w vm.swappiness=1 - sudo sysctl -w fs.file-max=262144 - sudo sysctl -w vm.max_map_count=262144 - - - name: 启动Elasticsearch - if: matrix.elasticsearch == true - uses: miyataka/elasticsearch-github-actions@1 - with: - stack-version: '7.12.1' - plugins: 'https://release.infinilabs.com/analysis-ik/stable/elasticsearch-analysis-ik-7.12.1.zip' - - # Python环境设置 (Docker测试跳过) - - name: 设置Python ${{ matrix.python-version }} - if: steps.test-info.outputs.skip_python_setup == 'false' - uses: actions/setup-python@v5 - with: - python-version: ${{ matrix.python-version }} - cache: 'pip' - cache-dependency-path: 'requirements.txt' - - # 多层缓存策略优化 - - name: 缓存Python依赖 - if: steps.test-info.outputs.skip_python_setup == 'false' - uses: actions/cache@v4 - with: - path: | - ~/.cache/pip - .pytest_cache - key: ${{ runner.os }}-python-${{ matrix.python-version }}-${{ hashFiles('requirements.txt') }}-${{ hashFiles('**/pyproject.toml') }} - restore-keys: | - ${{ runner.os }}-python-${{ matrix.python-version }}-${{ hashFiles('requirements.txt') }}- - ${{ runner.os }}-python-${{ matrix.python-version }}- - ${{ runner.os }}-python- - - # Django缓存优化 (测试数据库等) - - name: 缓存Django资源 - if: matrix.test-type != 'docker' - uses: actions/cache@v4 - with: - path: | - .coverage* - htmlcov/ - .django_cache/ - key: ${{ runner.os }}-django-${{ matrix.test-type }}-${{ github.sha }} - restore-keys: | - ${{ runner.os }}-django-${{ matrix.test-type }}- - ${{ runner.os }}-django- - - - name: 安装Python依赖 - if: steps.test-info.outputs.skip_python_setup == 'false' - run: | - echo "📦 安装Python依赖 (Python ${{ matrix.python-version }})" - python -m pip install --upgrade pip setuptools wheel - - # 安装基础依赖 - pip install -r requirements.txt - - # 根据测试类型安装额外依赖 - if [ "${{ matrix.coverage }}" = "true" ]; then - echo "📊 安装覆盖率工具" - pip install coverage[toml] - fi - - # 验证关键依赖 - echo "🔍 验证关键依赖安装" - python -c "import django; print(f'Django version: {django.get_version()}')" - python -c "import MySQLdb; print('MySQL client: OK')" || python -c "import pymysql; print('PyMySQL client: OK')" - - if [ "${{ matrix.elasticsearch }}" = "true" ]; then - python -c "import elasticsearch; print('Elasticsearch client: OK')" - fi - - # Django环境准备 - - name: 准备Django环境 - if: matrix.test-type != 'docker' - env: - DJANGO_MYSQL_PASSWORD: root - DJANGO_MYSQL_HOST: 127.0.0.1 - DJANGO_ELASTICSEARCH_HOST: ${{ matrix.elasticsearch && '127.0.0.1:9200' || '' }} - run: | - echo "🔧 准备Django测试环境" - - # 等待数据库就绪 - echo "⏳ 等待MySQL数据库启动..." - for i in {1..30}; do - if python -c "import MySQLdb; MySQLdb.connect(host='127.0.0.1', user='root', passwd='root', db='djangoblog')" 2>/dev/null; then - echo "✅ MySQL数据库连接成功" - break - fi - echo "🔄 等待数据库启动... ($i/30)" - sleep 2 - done - - # 等待Elasticsearch就绪 (如果启用) - if [ "${{ matrix.elasticsearch }}" = "true" ]; then - echo "⏳ 等待Elasticsearch启动..." - for i in {1..30}; do - if curl -s http://127.0.0.1:9200/_cluster/health | grep -q '"status":"green"\|"status":"yellow"'; then - echo "✅ Elasticsearch连接成功" - break - fi - echo "🔄 等待Elasticsearch启动... ($i/30)" - sleep 2 - done - fi - - # Django测试执行 - - name: 执行数据库迁移 - if: matrix.test-type != 'docker' - env: - DJANGO_MYSQL_PASSWORD: root - DJANGO_MYSQL_HOST: 127.0.0.1 - DJANGO_ELASTICSEARCH_HOST: ${{ matrix.elasticsearch && '127.0.0.1:9200' || '' }} - run: | - echo "🗄️ 执行数据库迁移" - - # 检查迁移文件 - echo "📋 检查待应用的迁移..." - python manage.py showmigrations - - # 检查是否有未创建的迁移 - python manage.py makemigrations --check --verbosity 2 - - # 执行迁移 - python manage.py migrate --verbosity 2 - - echo "✅ 数据库迁移完成" - - - name: 运行Django测试 - if: matrix.test-type != 'docker' - env: - DJANGO_MYSQL_PASSWORD: root - DJANGO_MYSQL_HOST: 127.0.0.1 - DJANGO_ELASTICSEARCH_HOST: ${{ matrix.elasticsearch && '127.0.0.1:9200' || '' }} - run: | - echo "🧪 开始执行 ${{ matrix.test-type }} 测试 (Python ${{ matrix.python-version }})" - - # 显示Django配置信息 - python manage.py diffsettings | head -20 - - # 运行测试 - if [ "${{ matrix.coverage }}" = "true" ]; then - echo "📊 运行测试并生成覆盖率报告" - coverage run --source='.' --omit='*/venv/*,*/migrations/*,*/tests/*,manage.py' manage.py test --verbosity=2 - - echo "📈 生成覆盖率报告" - coverage xml - coverage report --show-missing - coverage html - - echo "📋 覆盖率统计:" - coverage report | tail -1 - else - echo "🧪 运行标准测试" - python manage.py test --verbosity=2 --failfast - fi - - echo "✅ 测试执行完成" - - # 覆盖率报告上传 (只有完整测试才执行) - - name: 上传覆盖率到Codecov - if: matrix.coverage == true && success() - uses: codecov/codecov-action@v4 - with: - token: ${{ secrets.CODECOV_TOKEN }} - file: ./coverage.xml - flags: unittests - name: codecov-${{ steps.test-info.outputs.test_name }} - fail_ci_if_error: false - verbose: true - - - name: 上传覆盖率到Codecov (备用) - if: matrix.coverage == true && failure() - uses: codecov/codecov-action@v4 - with: - file: ./coverage.xml - flags: unittests - name: codecov-${{ steps.test-info.outputs.test_name }}-fallback - fail_ci_if_error: false - verbose: true - - # Docker构建测试 - - name: 设置QEMU - if: matrix.test-type == 'docker' - uses: docker/setup-qemu-action@v3 - - - name: 设置Docker Buildx - if: matrix.test-type == 'docker' - uses: docker/setup-buildx-action@v3 - - - name: Docker构建测试 - if: matrix.test-type == 'docker' - uses: docker/build-push-action@v5 - with: - context: . - push: false - tags: djangoblog/djangoblog:test-${{ github.sha }} - cache-from: type=gha - cache-to: type=gha,mode=max - - # 收集测试工件 (失败时收集调试信息) - - name: 收集测试工件 - if: failure() && matrix.test-type != 'docker' - run: | - echo "🔍 收集测试失败的调试信息" - - # 收集Django日志 - if [ -d "logs" ]; then - echo "📄 Django日志文件:" - ls -la logs/ - if [ -f "logs/djangoblog.log" ]; then - echo "🔍 最新日志内容:" - tail -100 logs/djangoblog.log - fi - fi - - # 显示数据库状态 - echo "🗄️ 数据库连接状态:" - python -c " - try: - from django.db import connection - cursor = connection.cursor() - cursor.execute('SELECT VERSION()') - print(f'MySQL版本: {cursor.fetchone()[0]}') - cursor.execute('SHOW TABLES') - tables = cursor.fetchall() - print(f'数据库表数量: {len(tables)}') - except Exception as e: - print(f'数据库连接错误: {e}') - " || true - - # Elasticsearch状态 (如果启用) - if [ "${{ matrix.elasticsearch }}" = "true" ]; then - echo "🔍 Elasticsearch状态:" - curl -s http://127.0.0.1:9200/_cluster/health?pretty || true - fi - - # 上传测试工件 - - name: 上传覆盖率HTML报告 - if: matrix.coverage == true && always() - uses: actions/upload-artifact@v4 - with: - name: coverage-report-${{ steps.test-info.outputs.test_name }} - path: htmlcov/ - retention-days: 30 - - # 性能统计 - - name: 测试性能统计 - if: always() && matrix.test-type != 'docker' - run: | - echo "⚡ 测试性能统计:" - echo " 开始时间: $(date -d '@${{ job.started_at }}' '+%Y-%m-%d %H:%M:%S' 2>/dev/null || echo '未知')" - echo " 当前时间: $(date '+%Y-%m-%d %H:%M:%S')" - - # 系统资源使用情况 - echo "💻 系统资源:" - echo " CPU使用: $(top -bn1 | grep "Cpu(s)" | awk '{print $2}' | cut -d'%' -f1)%" - echo " 内存使用: $(free -h | awk '/^Mem:/ {printf "%.1f%%", $3/$2 * 100}')" - echo " 磁盘使用: $(df -h / | awk 'NR==2{printf "%s", $5}')" - - # 测试结果汇总 - - name: 测试完成总结 - if: always() - run: | - echo "📋 ============ 测试执行总结 ============" - echo " 🏷️ 测试类型: ${{ matrix.test-type }}" - echo " 🐍 Python版本: ${{ matrix.python-version }}" - echo " 🗄️ 数据库: ${{ matrix.database }}" - echo " 🔍 Elasticsearch: ${{ matrix.elasticsearch }}" - echo " 📊 覆盖率: ${{ matrix.coverage }}" - echo " ⚡ 状态: ${{ job.status }}" - echo " 📅 完成时间: $(date '+%Y-%m-%d %H:%M:%S')" - echo "============================================" - - # 根据测试结果显示不同消息 - if [ "${{ job.status }}" = "success" ]; then - echo "🎉 测试执行成功!" - else - echo "❌ 测试执行失败,请检查上面的日志" - fi diff --git a/src/DjangoBlog/.github/workflows/docker.yml b/src/DjangoBlog/.github/workflows/docker.yml deleted file mode 100644 index 904fef5..0000000 --- a/src/DjangoBlog/.github/workflows/docker.yml +++ /dev/null @@ -1,43 +0,0 @@ -name: docker - -on: - push: - paths-ignore: - - '**/*.md' - - '**/*.yml' - branches: - - 'master' - - 'dev' - -jobs: - docker: - runs-on: ubuntu-latest - steps: - - name: Set env to docker dev tag - if: endsWith(github.ref, '/dev') - run: | - echo "DOCKER_TAG=test" >> $GITHUB_ENV - - name: Set env to docker latest tag - if: endsWith(github.ref, '/master') - run: | - echo "DOCKER_TAG=latest" >> $GITHUB_ENV - - name: Checkout - uses: actions/checkout@v4 - - name: Set up QEMU - uses: docker/setup-qemu-action@v3 - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v3 - - - name: Login to DockerHub - uses: docker/login-action@v3 - with: - username: ${{ secrets.DOCKERHUB_USERNAME }} - password: ${{ secrets.DOCKERHUB_TOKEN }} - - name: Build and push - uses: docker/build-push-action@v5 - with: - context: . - push: true - tags: ${{ secrets.DOCKERHUB_USERNAME }}/djangoblog:${{env.DOCKER_TAG}} - - diff --git a/src/DjangoBlog/.github/workflows/publish-release.yml b/src/DjangoBlog/.github/workflows/publish-release.yml deleted file mode 100644 index 5eb0853..0000000 --- a/src/DjangoBlog/.github/workflows/publish-release.yml +++ /dev/null @@ -1,39 +0,0 @@ -name: publish release - -on: - release: - types: [ published ] - -jobs: - docker: - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@v3 - - - name: Docker meta - id: meta - uses: docker/metadata-action@v3 - with: - images: name/app - - name: Set up QEMU - uses: docker/setup-qemu-action@v2 - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v2 - - name: Login to DockerHub - uses: docker/login-action@v2 - with: - username: ${{ secrets.DOCKERHUB_USERNAME }} - password: ${{ secrets.DOCKERHUB_TOKEN }} - - name: Build and push - uses: docker/build-push-action@v3 - with: - context: . - push: true - platforms: | - linux/amd64 - linux/arm64 - linux/arm/v7 - linux/arm/v6 - linux/386 - tags: ${{ secrets.DOCKERHUB_USERNAME }}/djangoblog:${{ github.event.release.tag_name }} diff --git a/src/DjangoBlog/.gitignore b/src/DjangoBlog/.gitignore deleted file mode 100644 index 76302b1..0000000 --- a/src/DjangoBlog/.gitignore +++ /dev/null @@ -1,79 +0,0 @@ -# Byte-compiled / optimized / DLL files -__pycache__/ -*.py[cod] -*$py.class - -# C extensions -*.so - -# Distribution / packaging -.Python -env/ -build/ -develop-eggs/ -dist/ -downloads/ -eggs/ -.eggs/ -lib/ -lib64/ -parts/ -sdist/ -var/ -*.egg-info/ -.installed.cfg -*.egg - -# PyInstaller -# Usually these files are written by a python script from a template -# before PyInstaller builds the exe, so as to inject date/other infos into it. -*.manifest -*.spec - -# Installer logs -pip-log.txt -pip-delete-this-directory.txt - -# Unit test / coverage reports -htmlcov/ -.tox/ -.coverage -.coverage.* -.cache -nosetests.xml -coverage.xml -*,cover - -# Translations -*.pot - -# Django stuff: -*.log -logs/ - -# Sphinx documentation -docs/_build/ - -# PyBuilder -target/ - - -# PyCharm -# http://www.jetbrains.com/pycharm/webhelp/project.html -.idea -.iml -# virtualenv -venv/ - -collectedstatic/ -djangoblog/whoosh_index/ -google93fd32dbd906620a.html -baidu_verify_FlHL7cUyC9.html -BingSiteAuth.xml -cb9339dbe2ff86a5aa169d28dba5f615.txt -werobot_session.* -django.jpg -uploads/ -settings_production.py -werobot_session.db -bin/datas/ diff --git a/src/DjangoBlog/Dockerfile b/src/DjangoBlog/Dockerfile deleted file mode 100644 index 80b46ac..0000000 --- a/src/DjangoBlog/Dockerfile +++ /dev/null @@ -1,15 +0,0 @@ -FROM python:3.11 -ENV PYTHONUNBUFFERED 1 -WORKDIR /code/djangoblog/ -RUN apt-get update && \ - apt-get install default-libmysqlclient-dev gettext -y && \ - rm -rf /var/lib/apt/lists/* -ADD requirements.txt requirements.txt -RUN pip install --upgrade pip && \ - pip install --no-cache-dir -r requirements.txt && \ - pip install --no-cache-dir gunicorn[gevent] && \ - pip cache purge - -ADD . . -RUN chmod +x /code/djangoblog/deploy/entrypoint.sh -ENTRYPOINT ["/code/djangoblog/deploy/entrypoint.sh"] diff --git a/src/DjangoBlog/LICENSE b/src/DjangoBlog/LICENSE deleted file mode 100644 index 3b08474..0000000 --- a/src/DjangoBlog/LICENSE +++ /dev/null @@ -1,20 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2025 车亮亮 - -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. \ No newline at end of file diff --git a/src/DjangoBlog/README.md b/src/DjangoBlog/README.md deleted file mode 100644 index 56aa4cc..0000000 --- a/src/DjangoBlog/README.md +++ /dev/null @@ -1,158 +0,0 @@ -# DjangoBlog - -

- Django CI - CodeQL - codecov - license -

- -

- 一款功能强大、设计优雅的现代化博客系统 -
- English简体中文 -

- ---- - -DjangoBlog 是一款基于 Python 3.10 和 Django 4.0 构建的高性能博客平台。它不仅提供了传统博客的所有核心功能,还通过一个灵活的插件系统,让您可以轻松扩展和定制您的网站。无论您是个人博主、技术爱好者还是内容创作者,DjangoBlog 都旨在为您提供一个稳定、高效且易于维护的写作和发布环境。 - -## ✨ 特性亮点 - -- **强大的内容管理**: 支持文章、独立页面、分类和标签的完整管理。内置强大的 Markdown 编辑器,支持代码语法高亮。 -- **全文搜索**: 集成搜索引擎,提供快速、精准的文章内容搜索。 -- **互动评论系统**: 支持回复、邮件提醒等功能,评论内容同样支持 Markdown。 -- **灵活的侧边栏**: 可自定义展示最新文章、最多阅读、标签云等模块。 -- **社交化登录**: 内置 OAuth 支持,已集成 Google, GitHub, Facebook, 微博, QQ 等主流平台。 -- **高性能缓存**: 原生支持 Redis 缓存,并提供自动刷新机制,确保网站高速响应。 -- **SEO 友好**: 具备基础 SEO 功能,新内容发布后可自动通知 Google 和百度。 -- **便捷的插件系统**: 通过创建独立的插件来扩展博客功能,代码解耦,易于维护。我们已经通过插件实现了文章浏览计数、SEO 优化等功能! -- **集成图床**: 内置简单的图床功能,方便图片上传和管理。 -- **自动化前端**: 集成 `django-compressor`,自动压缩和优化 CSS 及 JavaScript 文件。 -- **健壮的运维**: 内置网站异常邮件提醒和微信公众号管理功能。 - -## 🛠️ 技术栈 - -- **后端**: Python 3.10, Django 4.0 -- **数据库**: MySQL, SQLite (可配置) -- **缓存**: Redis -- **前端**: HTML5, CSS3, JavaScript -- **搜索**: Whoosh, Elasticsearch (可配置) -- **编辑器**: Markdown (mdeditor) - -## 🚀 快速开始 - -### 1. 环境准备 - -确保您的系统中已安装 Python 3.10+ 和 MySQL/MariaDB。 - -### 2. 克隆与安装 - -```bash -# 克隆项目到本地 -git clone https://github.com/liangliangyy/DjangoBlog.git -cd DjangoBlog - -# 安装依赖 -pip install -r requirements.txt -``` - -### 3. 项目配置 - -- **数据库**: - 打开 `djangoblog/settings.py` 文件,找到 `DATABASES` 配置项,修改为您的 MySQL 连接信息。 - - ```python - DATABASES = { - 'default': { - 'ENGINE': 'django.db.backends.mysql', - 'NAME': 'djangoblog', - 'USER': 'root', - 'PASSWORD': 'your_password', - 'HOST': '127.0.0.1', - 'PORT': 3306, - } - } - ``` - 在 MySQL 中创建数据库: - ```sql - CREATE DATABASE `djangoblog` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - ``` - -- **更多配置**: - 关于邮件发送、OAuth 登录、缓存等更多高级配置,请参阅我们的 [详细配置文档](/docs/config.md)。 - -### 4. 初始化数据库 - -```bash -python manage.py makemigrations -python manage.py migrate - -# 创建一个超级管理员账户 -python manage.py createsuperuser -``` - -### 5. 运行项目 - -```bash -# (可选) 生成一些测试数据 -python manage.py create_testdata - -# (可选) 收集和压缩静态文件 -python manage.py collectstatic --noinput -python manage.py compress --force - -# 启动开发服务器 -python manage.py runserver -``` - -现在,在您的浏览器中访问 `http://127.0.0.1:8000/`,您应该能看到 DjangoBlog 的首页了! - -## 部署 - -- **传统部署**: 我们为您准备了非常详细的 [服务器部署教程](https://www.lylinux.net/article/2019/8/5/58.html)。 -- **Docker 部署**: 项目已全面支持 Docker。如果您熟悉容器化技术,请参考 [Docker 部署文档](/docs/docker.md) 来快速启动。 -- **Kubernetes 部署**: 我们也提供了完整的 [Kubernetes 部署指南](/docs/k8s.md),助您轻松上云。 - -## 🧩 插件系统 - -插件系统是 DjangoBlog 的核心特色之一。它允许您在不修改核心代码的情况下,通过编写独立的插件来为您的博客添加新功能。 - -- **工作原理**: 插件通过在预定义的“钩子”上注册回调函数来工作。例如,当一篇文章被渲染时,`after_article_body_get` 钩子会被触发,所有注册到此钩子的函数都会被执行。 -- **现有插件**: `view_count`(浏览计数), `seo_optimizer`(SEO优化)等都是通过插件系统实现的。 -- **开发您自己的插件**: 只需在 `plugins` 目录下创建一个新的文件夹,并编写您的 `plugin.py`。欢迎探索并为 DjangoBlog 社区贡献您的创意! - -## 🤝 贡献指南 - -我们热烈欢迎任何形式的贡献!如果您有好的想法或发现了 Bug,请随时提交 Issue 或 Pull Request。 - -## 📄 许可证 - -本项目基于 [MIT License](LICENSE) 开源。 - ---- - -## ❤️ 支持与赞助 - -如果您觉得这个项目对您有帮助,并且希望支持我继续维护和开发新功能,欢迎请我喝杯咖啡!您的每一份支持都是我前进的最大动力。 - -

- 支付宝赞助 - 微信赞助 -

-

- (左) 支付宝 / (右) 微信 -

- -## 🙏 鸣谢 - -特别感谢 **JetBrains** 为本项目提供的免费开源许可证。 - -

- - JetBrains Logo - -

- ---- -> 如果本项目帮助到了你,请在[这里](https://github.com/liangliangyy/DjangoBlog/issues/214)留下你的网址,让更多的人看到。您的回复将会是我继续更新维护下去的动力。 diff --git a/src/DjangoBlog/accounts/__init__.py b/src/DjangoBlog/accounts/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/src/DjangoBlog/accounts/admin.py b/src/DjangoBlog/accounts/admin.py deleted file mode 100644 index 29d162a..0000000 --- a/src/DjangoBlog/accounts/admin.py +++ /dev/null @@ -1,60 +0,0 @@ -from django import forms -from django.contrib.auth.admin import UserAdmin -from django.contrib.auth.forms import UserChangeForm -from django.contrib.auth.forms import UsernameField -from django.utils.translation import gettext_lazy as _ - -# Register your models here. -from .models import BlogUser - - -class BlogUserCreationForm(forms.ModelForm): - password1 = forms.CharField(label=_('password'), widget=forms.PasswordInput) - password2 = forms.CharField(label=_('Enter password again'), widget=forms.PasswordInput) - - class Meta: - model = BlogUser - fields = ('email',) - - def clean_password2(self): - # Check that the two password entries match - password1 = self.cleaned_data.get("password1") - password2 = self.cleaned_data.get("password2") - if password1 and password2 and password1 != password2: - raise forms.ValidationError(_("passwords do not match")) - return password2 - - def save(self, commit=True): - # Save the provided password in hashed format - user = super().save(commit=False) - user.set_password(self.cleaned_data["password1"]) - if commit: - user.source = 'adminsite' - user.save() - return user - - -class BlogUserChangeForm(UserChangeForm): - class Meta: - model = BlogUser - fields = '__all__' - field_classes = {'username': UsernameField} - - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) - - -class BlogUserAdmin(UserAdmin): - form = BlogUserChangeForm - add_form = BlogUserCreationForm - list_display = ( - 'id', - 'nickname', - 'username', - 'email', - 'last_login', - 'date_joined', - 'source') - list_display_links = ('id', 'username') - ordering = ('-id',) - search_fields = ('username', 'nickname', 'email') diff --git a/src/DjangoBlog/accounts/apps.py b/src/DjangoBlog/accounts/apps.py deleted file mode 100644 index 9b3fc5a..0000000 --- a/src/DjangoBlog/accounts/apps.py +++ /dev/null @@ -1,5 +0,0 @@ -from django.apps import AppConfig - - -class AccountsConfig(AppConfig): - name = 'accounts' diff --git a/src/DjangoBlog/accounts/forms.py b/src/DjangoBlog/accounts/forms.py deleted file mode 100644 index fce4137..0000000 --- a/src/DjangoBlog/accounts/forms.py +++ /dev/null @@ -1,117 +0,0 @@ -from django import forms -from django.contrib.auth import get_user_model, password_validation -from django.contrib.auth.forms import AuthenticationForm, UserCreationForm -from django.core.exceptions import ValidationError -from django.forms import widgets -from django.utils.translation import gettext_lazy as _ -from . import utils -from .models import BlogUser - - -class LoginForm(AuthenticationForm): - def __init__(self, *args, **kwargs): - super(LoginForm, self).__init__(*args, **kwargs) - self.fields['username'].widget = widgets.TextInput( - attrs={'placeholder': "username", "class": "form-control"}) - self.fields['password'].widget = widgets.PasswordInput( - attrs={'placeholder': "password", "class": "form-control"}) - - -class RegisterForm(UserCreationForm): - def __init__(self, *args, **kwargs): - super(RegisterForm, self).__init__(*args, **kwargs) - - self.fields['username'].widget = widgets.TextInput( - attrs={'placeholder': "username", "class": "form-control"}) - self.fields['email'].widget = widgets.EmailInput( - attrs={'placeholder': "email", "class": "form-control"}) - self.fields['password1'].widget = widgets.PasswordInput( - attrs={'placeholder': "password", "class": "form-control"}) - self.fields['password2'].widget = widgets.PasswordInput( - attrs={'placeholder': "repeat password", "class": "form-control"}) - - def clean_email(self): - email = self.cleaned_data['email'] - if get_user_model().objects.filter(email=email).exists(): - raise ValidationError(_("email already exists")) - return email - - class Meta: - model = get_user_model() - fields = ("username", "email") - - -class ForgetPasswordForm(forms.Form): - new_password1 = forms.CharField( - label=_("New password"), - widget=forms.PasswordInput( - attrs={ - "class": "form-control", - 'placeholder': _("New password") - } - ), - ) - - new_password2 = forms.CharField( - label="确认密码", - widget=forms.PasswordInput( - attrs={ - "class": "form-control", - 'placeholder': _("Confirm password") - } - ), - ) - - email = forms.EmailField( - label='邮箱', - widget=forms.TextInput( - attrs={ - 'class': 'form-control', - 'placeholder': _("Email") - } - ), - ) - - code = forms.CharField( - label=_('Code'), - widget=forms.TextInput( - attrs={ - 'class': 'form-control', - 'placeholder': _("Code") - } - ), - ) - - def clean_new_password2(self): - password1 = self.data.get("new_password1") - password2 = self.data.get("new_password2") - if password1 and password2 and password1 != password2: - raise ValidationError(_("passwords do not match")) - password_validation.validate_password(password2) - - return password2 - - def clean_email(self): - user_email = self.cleaned_data.get("email") - if not BlogUser.objects.filter( - email=user_email - ).exists(): - # todo 这里的报错提示可以判断一个邮箱是不是注册过,如果不想暴露可以修改 - raise ValidationError(_("email does not exist")) - return user_email - - def clean_code(self): - code = self.cleaned_data.get("code") - error = utils.verify( - email=self.cleaned_data.get("email"), - code=code, - ) - if error: - raise ValidationError(error) - return code - - -class ForgetPasswordCodeForm(forms.Form): - email = forms.EmailField( - label=_('Email'), - ) diff --git a/src/DjangoBlog/accounts/migrations/0001_initial.py b/src/DjangoBlog/accounts/migrations/0001_initial.py deleted file mode 100644 index d2fbcab..0000000 --- a/src/DjangoBlog/accounts/migrations/0001_initial.py +++ /dev/null @@ -1,49 +0,0 @@ -# Generated by Django 4.1.7 on 2023-03-02 07:14 - -import django.contrib.auth.models -import django.contrib.auth.validators -from django.db import migrations, models -import django.utils.timezone - - -class Migration(migrations.Migration): - - initial = True - - dependencies = [ - ('auth', '0012_alter_user_first_name_max_length'), - ] - - operations = [ - migrations.CreateModel( - name='BlogUser', - fields=[ - ('id', models.BigAutoField(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=150, 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')), - ('nickname', models.CharField(blank=True, max_length=100, verbose_name='昵称')), - ('created_time', models.DateTimeField(default=django.utils.timezone.now, verbose_name='创建时间')), - ('last_mod_time', models.DateTimeField(default=django.utils.timezone.now, verbose_name='修改时间')), - ('source', models.CharField(blank=True, max_length=100, verbose_name='创建来源')), - ('groups', 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')), - ('user_permissions', 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')), - ], - options={ - 'verbose_name': '用户', - 'verbose_name_plural': '用户', - 'ordering': ['-id'], - 'get_latest_by': 'id', - }, - managers=[ - ('objects', django.contrib.auth.models.UserManager()), - ], - ), - ] diff --git a/src/DjangoBlog/accounts/migrations/0002_alter_bloguser_options_remove_bloguser_created_time_and_more.py b/src/DjangoBlog/accounts/migrations/0002_alter_bloguser_options_remove_bloguser_created_time_and_more.py deleted file mode 100644 index 1a9f509..0000000 --- a/src/DjangoBlog/accounts/migrations/0002_alter_bloguser_options_remove_bloguser_created_time_and_more.py +++ /dev/null @@ -1,46 +0,0 @@ -# Generated by Django 4.2.5 on 2023-09-06 13:13 - -from django.db import migrations, models -import django.utils.timezone - - -class Migration(migrations.Migration): - - dependencies = [ - ('accounts', '0001_initial'), - ] - - operations = [ - migrations.AlterModelOptions( - name='bloguser', - options={'get_latest_by': 'id', 'ordering': ['-id'], 'verbose_name': 'user', 'verbose_name_plural': 'user'}, - ), - migrations.RemoveField( - model_name='bloguser', - name='created_time', - ), - migrations.RemoveField( - model_name='bloguser', - name='last_mod_time', - ), - migrations.AddField( - model_name='bloguser', - name='creation_time', - field=models.DateTimeField(default=django.utils.timezone.now, verbose_name='creation time'), - ), - migrations.AddField( - model_name='bloguser', - name='last_modify_time', - field=models.DateTimeField(default=django.utils.timezone.now, verbose_name='last modify time'), - ), - migrations.AlterField( - model_name='bloguser', - name='nickname', - field=models.CharField(blank=True, max_length=100, verbose_name='nick name'), - ), - migrations.AlterField( - model_name='bloguser', - name='source', - field=models.CharField(blank=True, max_length=100, verbose_name='create source'), - ), - ] diff --git a/src/DjangoBlog/accounts/migrations/__init__.py b/src/DjangoBlog/accounts/migrations/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/src/DjangoBlog/accounts/models.py b/src/DjangoBlog/accounts/models.py deleted file mode 100644 index 3baddbb..0000000 --- a/src/DjangoBlog/accounts/models.py +++ /dev/null @@ -1,35 +0,0 @@ -from django.contrib.auth.models import AbstractUser -from django.db import models -from django.urls import reverse -from django.utils.timezone import now -from django.utils.translation import gettext_lazy as _ -from djangoblog.utils import get_current_site - - -# Create your models here. - -class BlogUser(AbstractUser): - nickname = models.CharField(_('nick name'), max_length=100, blank=True) - creation_time = models.DateTimeField(_('creation time'), default=now) - last_modify_time = models.DateTimeField(_('last modify time'), default=now) - source = models.CharField(_('create source'), max_length=100, blank=True) - - def get_absolute_url(self): - return reverse( - 'blog:author_detail', kwargs={ - 'author_name': self.username}) - - def __str__(self): - return self.email - - def get_full_url(self): - site = get_current_site().domain - url = "https://{site}{path}".format(site=site, - path=self.get_absolute_url()) - return url - - class Meta: - ordering = ['-id'] - verbose_name = _('user') - verbose_name_plural = verbose_name - get_latest_by = 'id' diff --git a/src/DjangoBlog/accounts/templatetags/__init__.py b/src/DjangoBlog/accounts/templatetags/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/src/DjangoBlog/accounts/tests.py b/src/DjangoBlog/accounts/tests.py deleted file mode 100644 index 6893411..0000000 --- a/src/DjangoBlog/accounts/tests.py +++ /dev/null @@ -1,207 +0,0 @@ -from django.test import Client, RequestFactory, TestCase -from django.urls import reverse -from django.utils import timezone -from django.utils.translation import gettext_lazy as _ - -from accounts.models import BlogUser -from blog.models import Article, Category -from djangoblog.utils import * -from . import utils - - -# Create your tests here. - -class AccountTest(TestCase): - def setUp(self): - self.client = Client() - self.factory = RequestFactory() - self.blog_user = BlogUser.objects.create_user( - username="test", - email="admin@admin.com", - password="12345678" - ) - self.new_test = "xxx123--=" - - def test_validate_account(self): - site = get_current_site().domain - user = BlogUser.objects.create_superuser( - email="liangliangyy1@gmail.com", - username="liangliangyy1", - password="qwer!@#$ggg") - testuser = BlogUser.objects.get(username='liangliangyy1') - - loginresult = self.client.login( - username='liangliangyy1', - password='qwer!@#$ggg') - self.assertEqual(loginresult, True) - response = self.client.get('/admin/') - self.assertEqual(response.status_code, 200) - - category = Category() - category.name = "categoryaaa" - category.creation_time = timezone.now() - category.last_modify_time = timezone.now() - category.save() - - article = Article() - article.title = "nicetitleaaa" - article.body = "nicecontentaaa" - article.author = user - article.category = category - article.type = 'a' - article.status = 'p' - article.save() - - response = self.client.get(article.get_admin_url()) - self.assertEqual(response.status_code, 200) - - def test_validate_register(self): - self.assertEquals( - 0, len( - BlogUser.objects.filter( - email='user123@user.com'))) - response = self.client.post(reverse('account:register'), { - 'username': 'user1233', - 'email': 'user123@user.com', - 'password1': 'password123!q@wE#R$T', - 'password2': 'password123!q@wE#R$T', - }) - self.assertEquals( - 1, len( - BlogUser.objects.filter( - email='user123@user.com'))) - user = BlogUser.objects.filter(email='user123@user.com')[0] - sign = get_sha256(get_sha256(settings.SECRET_KEY + str(user.id))) - path = reverse('accounts:result') - url = '{path}?type=validation&id={id}&sign={sign}'.format( - path=path, id=user.id, sign=sign) - response = self.client.get(url) - self.assertEqual(response.status_code, 200) - - self.client.login(username='user1233', password='password123!q@wE#R$T') - user = BlogUser.objects.filter(email='user123@user.com')[0] - user.is_superuser = True - user.is_staff = True - user.save() - delete_sidebar_cache() - category = Category() - category.name = "categoryaaa" - category.creation_time = timezone.now() - category.last_modify_time = timezone.now() - category.save() - - article = Article() - article.category = category - article.title = "nicetitle333" - article.body = "nicecontentttt" - article.author = user - - article.type = 'a' - article.status = 'p' - article.save() - - response = self.client.get(article.get_admin_url()) - self.assertEqual(response.status_code, 200) - - response = self.client.get(reverse('account:logout')) - self.assertIn(response.status_code, [301, 302, 200]) - - response = self.client.get(article.get_admin_url()) - self.assertIn(response.status_code, [301, 302, 200]) - - response = self.client.post(reverse('account:login'), { - 'username': 'user1233', - 'password': 'password123' - }) - self.assertIn(response.status_code, [301, 302, 200]) - - response = self.client.get(article.get_admin_url()) - self.assertIn(response.status_code, [301, 302, 200]) - - def test_verify_email_code(self): - to_email = "admin@admin.com" - code = generate_code() - utils.set_code(to_email, code) - utils.send_verify_email(to_email, code) - - err = utils.verify("admin@admin.com", code) - self.assertEqual(err, None) - - err = utils.verify("admin@123.com", code) - self.assertEqual(type(err), str) - - def test_forget_password_email_code_success(self): - resp = self.client.post( - path=reverse("account:forget_password_code"), - data=dict(email="admin@admin.com") - ) - - self.assertEqual(resp.status_code, 200) - self.assertEqual(resp.content.decode("utf-8"), "ok") - - def test_forget_password_email_code_fail(self): - resp = self.client.post( - path=reverse("account:forget_password_code"), - data=dict() - ) - self.assertEqual(resp.content.decode("utf-8"), "错误的邮箱") - - resp = self.client.post( - path=reverse("account:forget_password_code"), - data=dict(email="admin@com") - ) - self.assertEqual(resp.content.decode("utf-8"), "错误的邮箱") - - def test_forget_password_email_success(self): - code = generate_code() - utils.set_code(self.blog_user.email, code) - data = dict( - new_password1=self.new_test, - new_password2=self.new_test, - email=self.blog_user.email, - code=code, - ) - resp = self.client.post( - path=reverse("account:forget_password"), - data=data - ) - self.assertEqual(resp.status_code, 302) - - # 验证用户密码是否修改成功 - blog_user = BlogUser.objects.filter( - email=self.blog_user.email, - ).first() # type: BlogUser - self.assertNotEqual(blog_user, None) - self.assertEqual(blog_user.check_password(data["new_password1"]), True) - - def test_forget_password_email_not_user(self): - data = dict( - new_password1=self.new_test, - new_password2=self.new_test, - email="123@123.com", - code="123456", - ) - resp = self.client.post( - path=reverse("account:forget_password"), - data=data - ) - - self.assertEqual(resp.status_code, 200) - - - def test_forget_password_email_code_error(self): - code = generate_code() - utils.set_code(self.blog_user.email, code) - data = dict( - new_password1=self.new_test, - new_password2=self.new_test, - email=self.blog_user.email, - code="111111", - ) - resp = self.client.post( - path=reverse("account:forget_password"), - data=data - ) - - self.assertEqual(resp.status_code, 200) - diff --git a/src/DjangoBlog/accounts/urls.py b/src/DjangoBlog/accounts/urls.py deleted file mode 100644 index 107a801..0000000 --- a/src/DjangoBlog/accounts/urls.py +++ /dev/null @@ -1,28 +0,0 @@ -from django.urls import path -from django.urls import re_path - -from . import views -from .forms import LoginForm - -app_name = "accounts" - -urlpatterns = [re_path(r'^login/$', - views.LoginView.as_view(success_url='/'), - name='login', - kwargs={'authentication_form': LoginForm}), - re_path(r'^register/$', - views.RegisterView.as_view(success_url="/"), - name='register'), - re_path(r'^logout/$', - views.LogoutView.as_view(), - name='logout'), - path(r'account/result.html', - views.account_result, - name='result'), - re_path(r'^forget_password/$', - views.ForgetPasswordView.as_view(), - name='forget_password'), - re_path(r'^forget_password_code/$', - views.ForgetPasswordEmailCode.as_view(), - name='forget_password_code'), - ] diff --git a/src/DjangoBlog/accounts/user_login_backend.py b/src/DjangoBlog/accounts/user_login_backend.py deleted file mode 100644 index 73cdca1..0000000 --- a/src/DjangoBlog/accounts/user_login_backend.py +++ /dev/null @@ -1,26 +0,0 @@ -from django.contrib.auth import get_user_model -from django.contrib.auth.backends import ModelBackend - - -class EmailOrUsernameModelBackend(ModelBackend): - """ - 允许使用用户名或邮箱登录 - """ - - def authenticate(self, request, username=None, password=None, **kwargs): - if '@' in username: - kwargs = {'email': username} - else: - kwargs = {'username': username} - try: - user = get_user_model().objects.get(**kwargs) - if user.check_password(password): - return user - except get_user_model().DoesNotExist: - return None - - def get_user(self, username): - try: - return get_user_model().objects.get(pk=username) - except get_user_model().DoesNotExist: - return None diff --git a/src/DjangoBlog/accounts/utils.py b/src/DjangoBlog/accounts/utils.py deleted file mode 100644 index 4b94bdf..0000000 --- a/src/DjangoBlog/accounts/utils.py +++ /dev/null @@ -1,49 +0,0 @@ -import typing -from datetime import timedelta - -from django.core.cache import cache -from django.utils.translation import gettext -from django.utils.translation import gettext_lazy as _ - -from djangoblog.utils import send_email - -_code_ttl = timedelta(minutes=5) - - -def send_verify_email(to_mail: str, code: str, subject: str = _("Verify Email")): - """发送重设密码验证码 - Args: - to_mail: 接受邮箱 - subject: 邮件主题 - code: 验证码 - """ - html_content = _( - "You are resetting the password, the verification code is:%(code)s, valid within 5 minutes, please keep it " - "properly") % {'code': code} - send_email([to_mail], subject, html_content) - - -def verify(email: str, code: str) -> typing.Optional[str]: - """验证code是否有效 - Args: - email: 请求邮箱 - code: 验证码 - Return: - 如果有错误就返回错误str - Node: - 这里的错误处理不太合理,应该采用raise抛出 - 否测调用方也需要对error进行处理 - """ - cache_code = get_code(email) - if cache_code != code: - return gettext("Verification code error") - - -def set_code(email: str, code: str): - """设置code""" - cache.set(email, code, _code_ttl.seconds) - - -def get_code(email: str) -> typing.Optional[str]: - """获取code""" - return cache.get(email) diff --git a/src/DjangoBlog/accounts/views.py b/src/DjangoBlog/accounts/views.py deleted file mode 100644 index ae67aec..0000000 --- a/src/DjangoBlog/accounts/views.py +++ /dev/null @@ -1,204 +0,0 @@ -import logging -from django.utils.translation import gettext_lazy as _ -from django.conf import settings -from django.contrib import auth -from django.contrib.auth import REDIRECT_FIELD_NAME -from django.contrib.auth import get_user_model -from django.contrib.auth import logout -from django.contrib.auth.forms import AuthenticationForm -from django.contrib.auth.hashers import make_password -from django.http import HttpResponseRedirect, HttpResponseForbidden -from django.http.request import HttpRequest -from django.http.response import HttpResponse -from django.shortcuts import get_object_or_404 -from django.shortcuts import render -from django.urls import reverse -from django.utils.decorators import method_decorator -from django.utils.http import url_has_allowed_host_and_scheme -from django.views import View -from django.views.decorators.cache import never_cache -from django.views.decorators.csrf import csrf_protect -from django.views.decorators.debug import sensitive_post_parameters -from django.views.generic import FormView, RedirectView - -from djangoblog.utils import send_email, get_sha256, get_current_site, generate_code, delete_sidebar_cache -from . import utils -from .forms import RegisterForm, LoginForm, ForgetPasswordForm, ForgetPasswordCodeForm -from .models import BlogUser - -logger = logging.getLogger(__name__) - - -# Create your views here. - -class RegisterView(FormView): - form_class = RegisterForm - template_name = 'account/registration_form.html' - - @method_decorator(csrf_protect) - def dispatch(self, *args, **kwargs): - return super(RegisterView, self).dispatch(*args, **kwargs) - - def form_valid(self, form): - if form.is_valid(): - user = form.save(False) - user.is_active = False - user.source = 'Register' - user.save(True) - site = get_current_site().domain - sign = get_sha256(get_sha256(settings.SECRET_KEY + str(user.id))) - - if settings.DEBUG: - site = '127.0.0.1:8000' - path = reverse('account:result') - url = "http://{site}{path}?type=validation&id={id}&sign={sign}".format( - site=site, path=path, id=user.id, sign=sign) - - content = """ -

请点击下面链接验证您的邮箱

- - {url} - - 再次感谢您! -
- 如果上面链接无法打开,请将此链接复制至浏览器。 - {url} - """.format(url=url) - send_email( - emailto=[ - user.email, - ], - title='验证您的电子邮箱', - content=content) - - url = reverse('accounts:result') + \ - '?type=register&id=' + str(user.id) - return HttpResponseRedirect(url) - else: - return self.render_to_response({ - 'form': form - }) - - -class LogoutView(RedirectView): - url = '/login/' - - @method_decorator(never_cache) - def dispatch(self, request, *args, **kwargs): - return super(LogoutView, self).dispatch(request, *args, **kwargs) - - def get(self, request, *args, **kwargs): - logout(request) - delete_sidebar_cache() - return super(LogoutView, self).get(request, *args, **kwargs) - - -class LoginView(FormView): - form_class = LoginForm - template_name = 'account/login.html' - success_url = '/' - redirect_field_name = REDIRECT_FIELD_NAME - login_ttl = 2626560 # 一个月的时间 - - @method_decorator(sensitive_post_parameters('password')) - @method_decorator(csrf_protect) - @method_decorator(never_cache) - def dispatch(self, request, *args, **kwargs): - - return super(LoginView, self).dispatch(request, *args, **kwargs) - - def get_context_data(self, **kwargs): - redirect_to = self.request.GET.get(self.redirect_field_name) - if redirect_to is None: - redirect_to = '/' - kwargs['redirect_to'] = redirect_to - - return super(LoginView, self).get_context_data(**kwargs) - - def form_valid(self, form): - form = AuthenticationForm(data=self.request.POST, request=self.request) - - if form.is_valid(): - delete_sidebar_cache() - logger.info(self.redirect_field_name) - - auth.login(self.request, form.get_user()) - if self.request.POST.get("remember"): - self.request.session.set_expiry(self.login_ttl) - return super(LoginView, self).form_valid(form) - # return HttpResponseRedirect('/') - else: - return self.render_to_response({ - 'form': form - }) - - def get_success_url(self): - - redirect_to = self.request.POST.get(self.redirect_field_name) - if not url_has_allowed_host_and_scheme( - url=redirect_to, allowed_hosts=[ - self.request.get_host()]): - redirect_to = self.success_url - return redirect_to - - -def account_result(request): - type = request.GET.get('type') - id = request.GET.get('id') - - user = get_object_or_404(get_user_model(), id=id) - logger.info(type) - if user.is_active: - return HttpResponseRedirect('/') - if type and type in ['register', 'validation']: - if type == 'register': - content = ''' - 恭喜您注册成功,一封验证邮件已经发送到您的邮箱,请验证您的邮箱后登录本站。 - ''' - title = '注册成功' - else: - c_sign = get_sha256(get_sha256(settings.SECRET_KEY + str(user.id))) - sign = request.GET.get('sign') - if sign != c_sign: - return HttpResponseForbidden() - user.is_active = True - user.save() - content = ''' - 恭喜您已经成功的完成邮箱验证,您现在可以使用您的账号来登录本站。 - ''' - title = '验证成功' - return render(request, 'account/result.html', { - 'title': title, - 'content': content - }) - else: - return HttpResponseRedirect('/') - - -class ForgetPasswordView(FormView): - form_class = ForgetPasswordForm - template_name = 'account/forget_password.html' - - def form_valid(self, form): - if form.is_valid(): - blog_user = BlogUser.objects.filter(email=form.cleaned_data.get("email")).get() - blog_user.password = make_password(form.cleaned_data["new_password2"]) - blog_user.save() - return HttpResponseRedirect('/login/') - else: - return self.render_to_response({'form': form}) - - -class ForgetPasswordEmailCode(View): - - def post(self, request: HttpRequest): - form = ForgetPasswordCodeForm(request.POST) - if not form.is_valid(): - return HttpResponse("错误的邮箱") - to_email = form.cleaned_data["email"] - - code = generate_code() - utils.send_verify_email(to_email, code) - utils.set_code(to_email, code) - - return HttpResponse("ok") diff --git a/src/DjangoBlog/blog/__init__.py b/src/DjangoBlog/blog/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/src/DjangoBlog/blog/admin.py b/src/DjangoBlog/blog/admin.py deleted file mode 100644 index 69d7f8e..0000000 --- a/src/DjangoBlog/blog/admin.py +++ /dev/null @@ -1,114 +0,0 @@ -from django import forms -from django.contrib import admin -from django.contrib.auth import get_user_model -from django.urls import reverse -from django.utils.html import format_html -from django.utils.translation import gettext_lazy as _ - -# Register your models here. -from .models import Article, Category, Tag, Links, SideBar, BlogSettings - - -class ArticleForm(forms.ModelForm): - # body = forms.CharField(widget=AdminPagedownWidget()) - - class Meta: - model = Article - fields = '__all__' - - -def makr_article_publish(modeladmin, request, queryset): - queryset.update(status='p') - - -def draft_article(modeladmin, request, queryset): - queryset.update(status='d') - - -def close_article_commentstatus(modeladmin, request, queryset): - queryset.update(comment_status='c') - - -def open_article_commentstatus(modeladmin, request, queryset): - queryset.update(comment_status='o') - - -makr_article_publish.short_description = _('Publish selected articles') -draft_article.short_description = _('Draft selected articles') -close_article_commentstatus.short_description = _('Close article comments') -open_article_commentstatus.short_description = _('Open article comments') - - -class ArticlelAdmin(admin.ModelAdmin): - list_per_page = 20 - search_fields = ('body', 'title') - form = ArticleForm - list_display = ( - 'id', - 'title', - 'author', - 'link_to_category', - 'creation_time', - 'views', - 'status', - 'type', - 'article_order') - list_display_links = ('id', 'title') - list_filter = ('status', 'type', 'category') - date_hierarchy = 'creation_time' - filter_horizontal = ('tags',) - exclude = ('creation_time', 'last_modify_time') - view_on_site = True - actions = [ - makr_article_publish, - draft_article, - close_article_commentstatus, - open_article_commentstatus] - raw_id_fields = ('author', 'category',) - - def link_to_category(self, obj): - info = (obj.category._meta.app_label, obj.category._meta.model_name) - link = reverse('admin:%s_%s_change' % info, args=(obj.category.id,)) - return format_html(u'%s' % (link, obj.category.name)) - - link_to_category.short_description = _('category') - - def get_form(self, request, obj=None, **kwargs): - form = super(ArticlelAdmin, self).get_form(request, obj, **kwargs) - form.base_fields['author'].queryset = get_user_model( - ).objects.filter(is_superuser=True) - return form - - def save_model(self, request, obj, form, change): - super(ArticlelAdmin, self).save_model(request, obj, form, change) - - def get_view_on_site_url(self, obj=None): - if obj: - url = obj.get_full_url() - return url - else: - from djangoblog.utils import get_current_site - site = get_current_site().domain - return site - - -class TagAdmin(admin.ModelAdmin): - exclude = ('slug', 'last_mod_time', 'creation_time') - - -class CategoryAdmin(admin.ModelAdmin): - list_display = ('name', 'parent_category', 'index') - exclude = ('slug', 'last_mod_time', 'creation_time') - - -class LinksAdmin(admin.ModelAdmin): - exclude = ('last_mod_time', 'creation_time') - - -class SideBarAdmin(admin.ModelAdmin): - list_display = ('name', 'content', 'is_enable', 'sequence') - exclude = ('last_mod_time', 'creation_time') - - -class BlogSettingsAdmin(admin.ModelAdmin): - pass diff --git a/src/DjangoBlog/blog/apps.py b/src/DjangoBlog/blog/apps.py deleted file mode 100644 index 7930587..0000000 --- a/src/DjangoBlog/blog/apps.py +++ /dev/null @@ -1,5 +0,0 @@ -from django.apps import AppConfig - - -class BlogConfig(AppConfig): - name = 'blog' diff --git a/src/DjangoBlog/blog/context_processors.py b/src/DjangoBlog/blog/context_processors.py deleted file mode 100644 index 73e3088..0000000 --- a/src/DjangoBlog/blog/context_processors.py +++ /dev/null @@ -1,43 +0,0 @@ -import logging - -from django.utils import timezone - -from djangoblog.utils import cache, get_blog_setting -from .models import Category, Article - -logger = logging.getLogger(__name__) - - -def seo_processor(requests): - key = 'seo_processor' - value = cache.get(key) - if value: - return value - else: - logger.info('set processor cache.') - setting = get_blog_setting() - value = { - 'SITE_NAME': setting.site_name, - 'SHOW_GOOGLE_ADSENSE': setting.show_google_adsense, - 'GOOGLE_ADSENSE_CODES': setting.google_adsense_codes, - 'SITE_SEO_DESCRIPTION': setting.site_seo_description, - 'SITE_DESCRIPTION': setting.site_description, - 'SITE_KEYWORDS': setting.site_keywords, - 'SITE_BASE_URL': requests.scheme + '://' + requests.get_host() + '/', - 'ARTICLE_SUB_LENGTH': setting.article_sub_length, - 'nav_category_list': Category.objects.all(), - 'nav_pages': Article.objects.filter( - type='p', - status='p'), - 'OPEN_SITE_COMMENT': setting.open_site_comment, - 'BEIAN_CODE': setting.beian_code, - 'ANALYTICS_CODE': setting.analytics_code, - "BEIAN_CODE_GONGAN": setting.gongan_beiancode, - "SHOW_GONGAN_CODE": setting.show_gongan_code, - "CURRENT_YEAR": timezone.now().year, - "GLOBAL_HEADER": setting.global_header, - "GLOBAL_FOOTER": setting.global_footer, - "COMMENT_NEED_REVIEW": setting.comment_need_review, - } - cache.set(key, value, 60 * 60 * 10) - return value diff --git a/src/DjangoBlog/blog/documents.py b/src/DjangoBlog/blog/documents.py deleted file mode 100644 index 0f1db7b..0000000 --- a/src/DjangoBlog/blog/documents.py +++ /dev/null @@ -1,213 +0,0 @@ -import time - -import elasticsearch.client -from django.conf import settings -from elasticsearch_dsl import Document, InnerDoc, Date, Integer, Long, Text, Object, GeoPoint, Keyword, Boolean -from elasticsearch_dsl.connections import connections - -from blog.models import Article - -ELASTICSEARCH_ENABLED = hasattr(settings, 'ELASTICSEARCH_DSL') - -if ELASTICSEARCH_ENABLED: - connections.create_connection( - hosts=[settings.ELASTICSEARCH_DSL['default']['hosts']]) - from elasticsearch import Elasticsearch - - es = Elasticsearch(settings.ELASTICSEARCH_DSL['default']['hosts']) - from elasticsearch.client import IngestClient - - c = IngestClient(es) - try: - c.get_pipeline('geoip') - except elasticsearch.exceptions.NotFoundError: - c.put_pipeline('geoip', body='''{ - "description" : "Add geoip info", - "processors" : [ - { - "geoip" : { - "field" : "ip" - } - } - ] - }''') - - -class GeoIp(InnerDoc): - continent_name = Keyword() - country_iso_code = Keyword() - country_name = Keyword() - location = GeoPoint() - - -class UserAgentBrowser(InnerDoc): - Family = Keyword() - Version = Keyword() - - -class UserAgentOS(UserAgentBrowser): - pass - - -class UserAgentDevice(InnerDoc): - Family = Keyword() - Brand = Keyword() - Model = Keyword() - - -class UserAgent(InnerDoc): - browser = Object(UserAgentBrowser, required=False) - os = Object(UserAgentOS, required=False) - device = Object(UserAgentDevice, required=False) - string = Text() - is_bot = Boolean() - - -class ElapsedTimeDocument(Document): - url = Keyword() - time_taken = Long() - log_datetime = Date() - ip = Keyword() - geoip = Object(GeoIp, required=False) - useragent = Object(UserAgent, required=False) - - class Index: - name = 'performance' - settings = { - "number_of_shards": 1, - "number_of_replicas": 0 - } - - class Meta: - doc_type = 'ElapsedTime' - - -class ElaspedTimeDocumentManager: - @staticmethod - def build_index(): - from elasticsearch import Elasticsearch - client = Elasticsearch(settings.ELASTICSEARCH_DSL['default']['hosts']) - res = client.indices.exists(index="performance") - if not res: - ElapsedTimeDocument.init() - - @staticmethod - def delete_index(): - from elasticsearch import Elasticsearch - es = Elasticsearch(settings.ELASTICSEARCH_DSL['default']['hosts']) - es.indices.delete(index='performance', ignore=[400, 404]) - - @staticmethod - def create(url, time_taken, log_datetime, useragent, ip): - ElaspedTimeDocumentManager.build_index() - ua = UserAgent() - ua.browser = UserAgentBrowser() - ua.browser.Family = useragent.browser.family - ua.browser.Version = useragent.browser.version_string - - ua.os = UserAgentOS() - ua.os.Family = useragent.os.family - ua.os.Version = useragent.os.version_string - - ua.device = UserAgentDevice() - ua.device.Family = useragent.device.family - ua.device.Brand = useragent.device.brand - ua.device.Model = useragent.device.model - ua.string = useragent.ua_string - ua.is_bot = useragent.is_bot - - doc = ElapsedTimeDocument( - meta={ - 'id': int( - round( - time.time() * - 1000)) - }, - url=url, - time_taken=time_taken, - log_datetime=log_datetime, - useragent=ua, ip=ip) - doc.save(pipeline="geoip") - - -class ArticleDocument(Document): - body = Text(analyzer='ik_max_word', search_analyzer='ik_smart') - title = Text(analyzer='ik_max_word', search_analyzer='ik_smart') - author = Object(properties={ - 'nickname': Text(analyzer='ik_max_word', search_analyzer='ik_smart'), - 'id': Integer() - }) - category = Object(properties={ - 'name': Text(analyzer='ik_max_word', search_analyzer='ik_smart'), - 'id': Integer() - }) - tags = Object(properties={ - 'name': Text(analyzer='ik_max_word', search_analyzer='ik_smart'), - 'id': Integer() - }) - - pub_time = Date() - status = Text() - comment_status = Text() - type = Text() - views = Integer() - article_order = Integer() - - class Index: - name = 'blog' - settings = { - "number_of_shards": 1, - "number_of_replicas": 0 - } - - class Meta: - doc_type = 'Article' - - -class ArticleDocumentManager(): - - def __init__(self): - self.create_index() - - def create_index(self): - ArticleDocument.init() - - def delete_index(self): - from elasticsearch import Elasticsearch - es = Elasticsearch(settings.ELASTICSEARCH_DSL['default']['hosts']) - es.indices.delete(index='blog', ignore=[400, 404]) - - def convert_to_doc(self, articles): - return [ - ArticleDocument( - meta={ - 'id': article.id}, - body=article.body, - title=article.title, - author={ - 'nickname': article.author.username, - 'id': article.author.id}, - category={ - 'name': article.category.name, - 'id': article.category.id}, - tags=[ - { - 'name': t.name, - 'id': t.id} for t in article.tags.all()], - pub_time=article.pub_time, - status=article.status, - comment_status=article.comment_status, - type=article.type, - views=article.views, - article_order=article.article_order) for article in articles] - - def rebuild(self, articles=None): - ArticleDocument.init() - articles = articles if articles else Article.objects.all() - docs = self.convert_to_doc(articles) - for doc in docs: - doc.save() - - def update_docs(self, docs): - for doc in docs: - doc.save() diff --git a/src/DjangoBlog/blog/forms.py b/src/DjangoBlog/blog/forms.py deleted file mode 100644 index 715be76..0000000 --- a/src/DjangoBlog/blog/forms.py +++ /dev/null @@ -1,19 +0,0 @@ -import logging - -from django import forms -from haystack.forms import SearchForm - -logger = logging.getLogger(__name__) - - -class BlogSearchForm(SearchForm): - querydata = forms.CharField(required=True) - - def search(self): - datas = super(BlogSearchForm, self).search() - if not self.is_valid(): - return self.no_query_found() - - if self.cleaned_data['querydata']: - logger.info(self.cleaned_data['querydata']) - return datas diff --git a/src/DjangoBlog/blog/management/__init__.py b/src/DjangoBlog/blog/management/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/src/DjangoBlog/blog/management/commands/__init__.py b/src/DjangoBlog/blog/management/commands/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/src/DjangoBlog/blog/management/commands/build_index.py b/src/DjangoBlog/blog/management/commands/build_index.py deleted file mode 100644 index 3c4acd7..0000000 --- a/src/DjangoBlog/blog/management/commands/build_index.py +++ /dev/null @@ -1,18 +0,0 @@ -from django.core.management.base import BaseCommand - -from blog.documents import ElapsedTimeDocument, ArticleDocumentManager, ElaspedTimeDocumentManager, \ - ELASTICSEARCH_ENABLED - - -# TODO 参数化 -class Command(BaseCommand): - help = 'build search index' - - def handle(self, *args, **options): - if ELASTICSEARCH_ENABLED: - ElaspedTimeDocumentManager.build_index() - manager = ElapsedTimeDocument() - manager.init() - manager = ArticleDocumentManager() - manager.delete_index() - manager.rebuild() diff --git a/src/DjangoBlog/blog/management/commands/build_search_words.py b/src/DjangoBlog/blog/management/commands/build_search_words.py deleted file mode 100644 index cfe7e0d..0000000 --- a/src/DjangoBlog/blog/management/commands/build_search_words.py +++ /dev/null @@ -1,13 +0,0 @@ -from django.core.management.base import BaseCommand - -from blog.models import Tag, Category - - -# TODO 参数化 -class Command(BaseCommand): - help = 'build search words' - - def handle(self, *args, **options): - datas = set([t.name for t in Tag.objects.all()] + - [t.name for t in Category.objects.all()]) - print('\n'.join(datas)) diff --git a/src/DjangoBlog/blog/management/commands/clear_cache.py b/src/DjangoBlog/blog/management/commands/clear_cache.py deleted file mode 100644 index 0d66172..0000000 --- a/src/DjangoBlog/blog/management/commands/clear_cache.py +++ /dev/null @@ -1,11 +0,0 @@ -from django.core.management.base import BaseCommand - -from djangoblog.utils import cache - - -class Command(BaseCommand): - help = 'clear the whole cache' - - def handle(self, *args, **options): - cache.clear() - self.stdout.write(self.style.SUCCESS('Cleared cache\n')) diff --git a/src/DjangoBlog/blog/management/commands/create_testdata.py b/src/DjangoBlog/blog/management/commands/create_testdata.py deleted file mode 100644 index 675d2ba..0000000 --- a/src/DjangoBlog/blog/management/commands/create_testdata.py +++ /dev/null @@ -1,40 +0,0 @@ -from django.contrib.auth import get_user_model -from django.contrib.auth.hashers import make_password -from django.core.management.base import BaseCommand - -from blog.models import Article, Tag, Category - - -class Command(BaseCommand): - help = 'create test datas' - - def handle(self, *args, **options): - user = get_user_model().objects.get_or_create( - email='test@test.com', username='测试用户', password=make_password('test!q@w#eTYU'))[0] - - pcategory = Category.objects.get_or_create( - name='我是父类目', parent_category=None)[0] - - category = Category.objects.get_or_create( - name='子类目', parent_category=pcategory)[0] - - category.save() - basetag = Tag() - basetag.name = "标签" - basetag.save() - for i in range(1, 20): - article = Article.objects.get_or_create( - category=category, - title='nice title ' + str(i), - body='nice content ' + str(i), - author=user)[0] - tag = Tag() - tag.name = "标签" + str(i) - tag.save() - article.tags.add(tag) - article.tags.add(basetag) - article.save() - - from djangoblog.utils import cache - cache.clear() - self.stdout.write(self.style.SUCCESS('created test datas \n')) diff --git a/src/DjangoBlog/blog/management/commands/ping_baidu.py b/src/DjangoBlog/blog/management/commands/ping_baidu.py deleted file mode 100644 index 2c7fbdd..0000000 --- a/src/DjangoBlog/blog/management/commands/ping_baidu.py +++ /dev/null @@ -1,50 +0,0 @@ -from django.core.management.base import BaseCommand - -from djangoblog.spider_notify import SpiderNotify -from djangoblog.utils import get_current_site -from blog.models import Article, Tag, Category - -site = get_current_site().domain - - -class Command(BaseCommand): - help = 'notify baidu url' - - def add_arguments(self, parser): - parser.add_argument( - 'data_type', - type=str, - choices=[ - 'all', - 'article', - 'tag', - 'category'], - help='article : all article,tag : all tag,category: all category,all: All of these') - - def get_full_url(self, path): - url = "https://{site}{path}".format(site=site, path=path) - return url - - def handle(self, *args, **options): - type = options['data_type'] - self.stdout.write('start get %s' % type) - - urls = [] - if type == 'article' or type == 'all': - for article in Article.objects.filter(status='p'): - urls.append(article.get_full_url()) - if type == 'tag' or type == 'all': - for tag in Tag.objects.all(): - url = tag.get_absolute_url() - urls.append(self.get_full_url(url)) - if type == 'category' or type == 'all': - for category in Category.objects.all(): - url = category.get_absolute_url() - urls.append(self.get_full_url(url)) - - self.stdout.write( - self.style.SUCCESS( - 'start notify %d urls' % - len(urls))) - SpiderNotify.baidu_notify(urls) - self.stdout.write(self.style.SUCCESS('finish notify')) diff --git a/src/DjangoBlog/blog/management/commands/sync_user_avatar.py b/src/DjangoBlog/blog/management/commands/sync_user_avatar.py deleted file mode 100644 index d0f4612..0000000 --- a/src/DjangoBlog/blog/management/commands/sync_user_avatar.py +++ /dev/null @@ -1,47 +0,0 @@ -import requests -from django.core.management.base import BaseCommand -from django.templatetags.static import static - -from djangoblog.utils import save_user_avatar -from oauth.models import OAuthUser -from oauth.oauthmanager import get_manager_by_type - - -class Command(BaseCommand): - help = 'sync user avatar' - - def test_picture(self, url): - try: - if requests.get(url, timeout=2).status_code == 200: - return True - except: - pass - - def handle(self, *args, **options): - static_url = static("../") - users = OAuthUser.objects.all() - self.stdout.write(f'开始同步{len(users)}个用户头像') - for u in users: - self.stdout.write(f'开始同步:{u.nickname}') - url = u.picture - if url: - if url.startswith(static_url): - if self.test_picture(url): - continue - else: - if u.metadata: - manage = get_manager_by_type(u.type) - url = manage.get_picture(u.metadata) - url = save_user_avatar(url) - else: - url = static('blog/img/avatar.png') - else: - url = save_user_avatar(url) - else: - url = static('blog/img/avatar.png') - if url: - self.stdout.write( - f'结束同步:{u.nickname}.url:{url}') - u.picture = url - u.save() - self.stdout.write('结束同步') diff --git a/src/DjangoBlog/blog/middleware.py b/src/DjangoBlog/blog/middleware.py deleted file mode 100644 index 94dd70c..0000000 --- a/src/DjangoBlog/blog/middleware.py +++ /dev/null @@ -1,42 +0,0 @@ -import logging -import time - -from ipware import get_client_ip -from user_agents import parse - -from blog.documents import ELASTICSEARCH_ENABLED, ElaspedTimeDocumentManager - -logger = logging.getLogger(__name__) - - -class OnlineMiddleware(object): - def __init__(self, get_response=None): - self.get_response = get_response - super().__init__() - - def __call__(self, request): - ''' page render time ''' - start_time = time.time() - response = self.get_response(request) - http_user_agent = request.META.get('HTTP_USER_AGENT', '') - ip, _ = get_client_ip(request) - user_agent = parse(http_user_agent) - if not response.streaming: - try: - cast_time = time.time() - start_time - if ELASTICSEARCH_ENABLED: - time_taken = round((cast_time) * 1000, 2) - url = request.path - from django.utils import timezone - ElaspedTimeDocumentManager.create( - url=url, - time_taken=time_taken, - log_datetime=timezone.now(), - useragent=user_agent, - ip=ip) - response.content = response.content.replace( - b'', str.encode(str(cast_time)[:5])) - except Exception as e: - logger.error("Error OnlineMiddleware: %s" % e) - - return response diff --git a/src/DjangoBlog/blog/migrations/0001_initial.py b/src/DjangoBlog/blog/migrations/0001_initial.py deleted file mode 100644 index 3d391b6..0000000 --- a/src/DjangoBlog/blog/migrations/0001_initial.py +++ /dev/null @@ -1,137 +0,0 @@ -# Generated by Django 4.1.7 on 2023-03-02 07:14 - -from django.conf import settings -from django.db import migrations, models -import django.db.models.deletion -import django.utils.timezone -import mdeditor.fields - - -class Migration(migrations.Migration): - - initial = True - - dependencies = [ - migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ] - - operations = [ - migrations.CreateModel( - name='BlogSettings', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('sitename', models.CharField(default='', max_length=200, verbose_name='网站名称')), - ('site_description', models.TextField(default='', max_length=1000, verbose_name='网站描述')), - ('site_seo_description', models.TextField(default='', max_length=1000, verbose_name='网站SEO描述')), - ('site_keywords', models.TextField(default='', max_length=1000, verbose_name='网站关键字')), - ('article_sub_length', models.IntegerField(default=300, verbose_name='文章摘要长度')), - ('sidebar_article_count', models.IntegerField(default=10, verbose_name='侧边栏文章数目')), - ('sidebar_comment_count', models.IntegerField(default=5, verbose_name='侧边栏评论数目')), - ('article_comment_count', models.IntegerField(default=5, verbose_name='文章页面默认显示评论数目')), - ('show_google_adsense', models.BooleanField(default=False, verbose_name='是否显示谷歌广告')), - ('google_adsense_codes', models.TextField(blank=True, default='', max_length=2000, null=True, verbose_name='广告内容')), - ('open_site_comment', models.BooleanField(default=True, verbose_name='是否打开网站评论功能')), - ('beiancode', models.CharField(blank=True, default='', max_length=2000, null=True, verbose_name='备案号')), - ('analyticscode', models.TextField(default='', max_length=1000, verbose_name='网站统计代码')), - ('show_gongan_code', models.BooleanField(default=False, verbose_name='是否显示公安备案号')), - ('gongan_beiancode', models.TextField(blank=True, default='', max_length=2000, null=True, verbose_name='公安备案号')), - ], - options={ - 'verbose_name': '网站配置', - 'verbose_name_plural': '网站配置', - }, - ), - migrations.CreateModel( - name='Links', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(max_length=30, unique=True, verbose_name='链接名称')), - ('link', models.URLField(verbose_name='链接地址')), - ('sequence', models.IntegerField(unique=True, verbose_name='排序')), - ('is_enable', models.BooleanField(default=True, verbose_name='是否显示')), - ('show_type', models.CharField(choices=[('i', '首页'), ('l', '列表页'), ('p', '文章页面'), ('a', '全站'), ('s', '友情链接页面')], default='i', max_length=1, verbose_name='显示类型')), - ('created_time', models.DateTimeField(default=django.utils.timezone.now, verbose_name='创建时间')), - ('last_mod_time', models.DateTimeField(default=django.utils.timezone.now, verbose_name='修改时间')), - ], - options={ - 'verbose_name': '友情链接', - 'verbose_name_plural': '友情链接', - 'ordering': ['sequence'], - }, - ), - migrations.CreateModel( - name='SideBar', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(max_length=100, verbose_name='标题')), - ('content', models.TextField(verbose_name='内容')), - ('sequence', models.IntegerField(unique=True, verbose_name='排序')), - ('is_enable', models.BooleanField(default=True, verbose_name='是否启用')), - ('created_time', models.DateTimeField(default=django.utils.timezone.now, verbose_name='创建时间')), - ('last_mod_time', models.DateTimeField(default=django.utils.timezone.now, verbose_name='修改时间')), - ], - options={ - 'verbose_name': '侧边栏', - 'verbose_name_plural': '侧边栏', - 'ordering': ['sequence'], - }, - ), - migrations.CreateModel( - name='Tag', - fields=[ - ('id', models.AutoField(primary_key=True, serialize=False)), - ('created_time', models.DateTimeField(default=django.utils.timezone.now, verbose_name='创建时间')), - ('last_mod_time', models.DateTimeField(default=django.utils.timezone.now, verbose_name='修改时间')), - ('name', models.CharField(max_length=30, unique=True, verbose_name='标签名')), - ('slug', models.SlugField(blank=True, default='no-slug', max_length=60)), - ], - options={ - 'verbose_name': '标签', - 'verbose_name_plural': '标签', - 'ordering': ['name'], - }, - ), - migrations.CreateModel( - name='Category', - fields=[ - ('id', models.AutoField(primary_key=True, serialize=False)), - ('created_time', models.DateTimeField(default=django.utils.timezone.now, verbose_name='创建时间')), - ('last_mod_time', models.DateTimeField(default=django.utils.timezone.now, verbose_name='修改时间')), - ('name', models.CharField(max_length=30, unique=True, verbose_name='分类名')), - ('slug', models.SlugField(blank=True, default='no-slug', max_length=60)), - ('index', models.IntegerField(default=0, verbose_name='权重排序-越大越靠前')), - ('parent_category', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='blog.category', verbose_name='父级分类')), - ], - options={ - 'verbose_name': '分类', - 'verbose_name_plural': '分类', - 'ordering': ['-index'], - }, - ), - migrations.CreateModel( - name='Article', - fields=[ - ('id', models.AutoField(primary_key=True, serialize=False)), - ('created_time', models.DateTimeField(default=django.utils.timezone.now, verbose_name='创建时间')), - ('last_mod_time', models.DateTimeField(default=django.utils.timezone.now, verbose_name='修改时间')), - ('title', models.CharField(max_length=200, unique=True, verbose_name='标题')), - ('body', mdeditor.fields.MDTextField(verbose_name='正文')), - ('pub_time', models.DateTimeField(default=django.utils.timezone.now, verbose_name='发布时间')), - ('status', models.CharField(choices=[('d', '草稿'), ('p', '发表')], default='p', max_length=1, verbose_name='文章状态')), - ('comment_status', models.CharField(choices=[('o', '打开'), ('c', '关闭')], default='o', max_length=1, verbose_name='评论状态')), - ('type', models.CharField(choices=[('a', '文章'), ('p', '页面')], default='a', max_length=1, verbose_name='类型')), - ('views', models.PositiveIntegerField(default=0, verbose_name='浏览量')), - ('article_order', models.IntegerField(default=0, verbose_name='排序,数字越大越靠前')), - ('show_toc', models.BooleanField(default=False, verbose_name='是否显示toc目录')), - ('author', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='作者')), - ('category', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='blog.category', verbose_name='分类')), - ('tags', models.ManyToManyField(blank=True, to='blog.tag', verbose_name='标签集合')), - ], - options={ - 'verbose_name': '文章', - 'verbose_name_plural': '文章', - 'ordering': ['-article_order', '-pub_time'], - 'get_latest_by': 'id', - }, - ), - ] diff --git a/src/DjangoBlog/blog/migrations/0002_blogsettings_global_footer_and_more.py b/src/DjangoBlog/blog/migrations/0002_blogsettings_global_footer_and_more.py deleted file mode 100644 index adbaa36..0000000 --- a/src/DjangoBlog/blog/migrations/0002_blogsettings_global_footer_and_more.py +++ /dev/null @@ -1,23 +0,0 @@ -# Generated by Django 4.1.7 on 2023-03-29 06:08 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('blog', '0001_initial'), - ] - - operations = [ - migrations.AddField( - model_name='blogsettings', - name='global_footer', - field=models.TextField(blank=True, default='', null=True, verbose_name='公共尾部'), - ), - migrations.AddField( - model_name='blogsettings', - name='global_header', - field=models.TextField(blank=True, default='', null=True, verbose_name='公共头部'), - ), - ] diff --git a/src/DjangoBlog/blog/migrations/0003_blogsettings_comment_need_review.py b/src/DjangoBlog/blog/migrations/0003_blogsettings_comment_need_review.py deleted file mode 100644 index e9f5502..0000000 --- a/src/DjangoBlog/blog/migrations/0003_blogsettings_comment_need_review.py +++ /dev/null @@ -1,17 +0,0 @@ -# Generated by Django 4.2.1 on 2023-05-09 07:45 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - dependencies = [ - ('blog', '0002_blogsettings_global_footer_and_more'), - ] - - operations = [ - migrations.AddField( - model_name='blogsettings', - name='comment_need_review', - field=models.BooleanField(default=False, verbose_name='评论是否需要审核'), - ), - ] diff --git a/src/DjangoBlog/blog/migrations/0004_rename_analyticscode_blogsettings_analytics_code_and_more.py b/src/DjangoBlog/blog/migrations/0004_rename_analyticscode_blogsettings_analytics_code_and_more.py deleted file mode 100644 index ceb1398..0000000 --- a/src/DjangoBlog/blog/migrations/0004_rename_analyticscode_blogsettings_analytics_code_and_more.py +++ /dev/null @@ -1,27 +0,0 @@ -# Generated by Django 4.2.1 on 2023-05-09 07:51 - -from django.db import migrations - - -class Migration(migrations.Migration): - dependencies = [ - ('blog', '0003_blogsettings_comment_need_review'), - ] - - operations = [ - migrations.RenameField( - model_name='blogsettings', - old_name='analyticscode', - new_name='analytics_code', - ), - migrations.RenameField( - model_name='blogsettings', - old_name='beiancode', - new_name='beian_code', - ), - migrations.RenameField( - model_name='blogsettings', - old_name='sitename', - new_name='site_name', - ), - ] diff --git a/src/DjangoBlog/blog/migrations/0005_alter_article_options_alter_category_options_and_more.py b/src/DjangoBlog/blog/migrations/0005_alter_article_options_alter_category_options_and_more.py deleted file mode 100644 index d08e853..0000000 --- a/src/DjangoBlog/blog/migrations/0005_alter_article_options_alter_category_options_and_more.py +++ /dev/null @@ -1,300 +0,0 @@ -# Generated by Django 4.2.5 on 2023-09-06 13:13 - -from django.conf import settings -from django.db import migrations, models -import django.db.models.deletion -import django.utils.timezone -import mdeditor.fields - - -class Migration(migrations.Migration): - - dependencies = [ - migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ('blog', '0004_rename_analyticscode_blogsettings_analytics_code_and_more'), - ] - - operations = [ - migrations.AlterModelOptions( - name='article', - options={'get_latest_by': 'id', 'ordering': ['-article_order', '-pub_time'], 'verbose_name': 'article', 'verbose_name_plural': 'article'}, - ), - migrations.AlterModelOptions( - name='category', - options={'ordering': ['-index'], 'verbose_name': 'category', 'verbose_name_plural': 'category'}, - ), - migrations.AlterModelOptions( - name='links', - options={'ordering': ['sequence'], 'verbose_name': 'link', 'verbose_name_plural': 'link'}, - ), - migrations.AlterModelOptions( - name='sidebar', - options={'ordering': ['sequence'], 'verbose_name': 'sidebar', 'verbose_name_plural': 'sidebar'}, - ), - migrations.AlterModelOptions( - name='tag', - options={'ordering': ['name'], 'verbose_name': 'tag', 'verbose_name_plural': 'tag'}, - ), - migrations.RemoveField( - model_name='article', - name='created_time', - ), - migrations.RemoveField( - model_name='article', - name='last_mod_time', - ), - migrations.RemoveField( - model_name='category', - name='created_time', - ), - migrations.RemoveField( - model_name='category', - name='last_mod_time', - ), - migrations.RemoveField( - model_name='links', - name='created_time', - ), - migrations.RemoveField( - model_name='sidebar', - name='created_time', - ), - migrations.RemoveField( - model_name='tag', - name='created_time', - ), - migrations.RemoveField( - model_name='tag', - name='last_mod_time', - ), - migrations.AddField( - model_name='article', - name='creation_time', - field=models.DateTimeField(default=django.utils.timezone.now, verbose_name='creation time'), - ), - migrations.AddField( - model_name='article', - name='last_modify_time', - field=models.DateTimeField(default=django.utils.timezone.now, verbose_name='modify time'), - ), - migrations.AddField( - model_name='category', - name='creation_time', - field=models.DateTimeField(default=django.utils.timezone.now, verbose_name='creation time'), - ), - migrations.AddField( - model_name='category', - name='last_modify_time', - field=models.DateTimeField(default=django.utils.timezone.now, verbose_name='modify time'), - ), - migrations.AddField( - model_name='links', - name='creation_time', - field=models.DateTimeField(default=django.utils.timezone.now, verbose_name='creation time'), - ), - migrations.AddField( - model_name='sidebar', - name='creation_time', - field=models.DateTimeField(default=django.utils.timezone.now, verbose_name='creation time'), - ), - migrations.AddField( - model_name='tag', - name='creation_time', - field=models.DateTimeField(default=django.utils.timezone.now, verbose_name='creation time'), - ), - migrations.AddField( - model_name='tag', - name='last_modify_time', - field=models.DateTimeField(default=django.utils.timezone.now, verbose_name='modify time'), - ), - migrations.AlterField( - model_name='article', - name='article_order', - field=models.IntegerField(default=0, verbose_name='order'), - ), - migrations.AlterField( - model_name='article', - name='author', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='author'), - ), - migrations.AlterField( - model_name='article', - name='body', - field=mdeditor.fields.MDTextField(verbose_name='body'), - ), - migrations.AlterField( - model_name='article', - name='category', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='blog.category', verbose_name='category'), - ), - migrations.AlterField( - model_name='article', - name='comment_status', - field=models.CharField(choices=[('o', 'Open'), ('c', 'Close')], default='o', max_length=1, verbose_name='comment status'), - ), - migrations.AlterField( - model_name='article', - name='pub_time', - field=models.DateTimeField(default=django.utils.timezone.now, verbose_name='publish time'), - ), - migrations.AlterField( - model_name='article', - name='show_toc', - field=models.BooleanField(default=False, verbose_name='show toc'), - ), - migrations.AlterField( - model_name='article', - name='status', - field=models.CharField(choices=[('d', 'Draft'), ('p', 'Published')], default='p', max_length=1, verbose_name='status'), - ), - migrations.AlterField( - model_name='article', - name='tags', - field=models.ManyToManyField(blank=True, to='blog.tag', verbose_name='tag'), - ), - migrations.AlterField( - model_name='article', - name='title', - field=models.CharField(max_length=200, unique=True, verbose_name='title'), - ), - migrations.AlterField( - model_name='article', - name='type', - field=models.CharField(choices=[('a', 'Article'), ('p', 'Page')], default='a', max_length=1, verbose_name='type'), - ), - migrations.AlterField( - model_name='article', - name='views', - field=models.PositiveIntegerField(default=0, verbose_name='views'), - ), - migrations.AlterField( - model_name='blogsettings', - name='article_comment_count', - field=models.IntegerField(default=5, verbose_name='article comment count'), - ), - migrations.AlterField( - model_name='blogsettings', - name='article_sub_length', - field=models.IntegerField(default=300, verbose_name='article sub length'), - ), - migrations.AlterField( - model_name='blogsettings', - name='google_adsense_codes', - field=models.TextField(blank=True, default='', max_length=2000, null=True, verbose_name='adsense code'), - ), - migrations.AlterField( - model_name='blogsettings', - name='open_site_comment', - field=models.BooleanField(default=True, verbose_name='open site comment'), - ), - migrations.AlterField( - model_name='blogsettings', - name='show_google_adsense', - field=models.BooleanField(default=False, verbose_name='show adsense'), - ), - migrations.AlterField( - model_name='blogsettings', - name='sidebar_article_count', - field=models.IntegerField(default=10, verbose_name='sidebar article count'), - ), - migrations.AlterField( - model_name='blogsettings', - name='sidebar_comment_count', - field=models.IntegerField(default=5, verbose_name='sidebar comment count'), - ), - migrations.AlterField( - model_name='blogsettings', - name='site_description', - field=models.TextField(default='', max_length=1000, verbose_name='site description'), - ), - migrations.AlterField( - model_name='blogsettings', - name='site_keywords', - field=models.TextField(default='', max_length=1000, verbose_name='site keywords'), - ), - migrations.AlterField( - model_name='blogsettings', - name='site_name', - field=models.CharField(default='', max_length=200, verbose_name='site name'), - ), - migrations.AlterField( - model_name='blogsettings', - name='site_seo_description', - field=models.TextField(default='', max_length=1000, verbose_name='site seo description'), - ), - migrations.AlterField( - model_name='category', - name='index', - field=models.IntegerField(default=0, verbose_name='index'), - ), - migrations.AlterField( - model_name='category', - name='name', - field=models.CharField(max_length=30, unique=True, verbose_name='category name'), - ), - migrations.AlterField( - model_name='category', - name='parent_category', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='blog.category', verbose_name='parent category'), - ), - migrations.AlterField( - model_name='links', - name='is_enable', - field=models.BooleanField(default=True, verbose_name='is show'), - ), - migrations.AlterField( - model_name='links', - name='last_mod_time', - field=models.DateTimeField(default=django.utils.timezone.now, verbose_name='modify time'), - ), - migrations.AlterField( - model_name='links', - name='link', - field=models.URLField(verbose_name='link'), - ), - migrations.AlterField( - model_name='links', - name='name', - field=models.CharField(max_length=30, unique=True, verbose_name='link name'), - ), - migrations.AlterField( - model_name='links', - name='sequence', - field=models.IntegerField(unique=True, verbose_name='order'), - ), - migrations.AlterField( - model_name='links', - name='show_type', - field=models.CharField(choices=[('i', 'index'), ('l', 'list'), ('p', 'post'), ('a', 'all'), ('s', 'slide')], default='i', max_length=1, verbose_name='show type'), - ), - migrations.AlterField( - model_name='sidebar', - name='content', - field=models.TextField(verbose_name='content'), - ), - migrations.AlterField( - model_name='sidebar', - name='is_enable', - field=models.BooleanField(default=True, verbose_name='is enable'), - ), - migrations.AlterField( - model_name='sidebar', - name='last_mod_time', - field=models.DateTimeField(default=django.utils.timezone.now, verbose_name='modify time'), - ), - migrations.AlterField( - model_name='sidebar', - name='name', - field=models.CharField(max_length=100, verbose_name='title'), - ), - migrations.AlterField( - model_name='sidebar', - name='sequence', - field=models.IntegerField(unique=True, verbose_name='order'), - ), - migrations.AlterField( - model_name='tag', - name='name', - field=models.CharField(max_length=30, unique=True, verbose_name='tag name'), - ), - ] diff --git a/src/DjangoBlog/blog/migrations/0006_alter_blogsettings_options.py b/src/DjangoBlog/blog/migrations/0006_alter_blogsettings_options.py deleted file mode 100644 index e36feb4..0000000 --- a/src/DjangoBlog/blog/migrations/0006_alter_blogsettings_options.py +++ /dev/null @@ -1,17 +0,0 @@ -# Generated by Django 4.2.7 on 2024-01-26 02:41 - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('blog', '0005_alter_article_options_alter_category_options_and_more'), - ] - - operations = [ - migrations.AlterModelOptions( - name='blogsettings', - options={'verbose_name': 'Website configuration', 'verbose_name_plural': 'Website configuration'}, - ), - ] diff --git a/src/DjangoBlog/blog/migrations/__init__.py b/src/DjangoBlog/blog/migrations/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/src/DjangoBlog/blog/models.py b/src/DjangoBlog/blog/models.py deleted file mode 100644 index 083788b..0000000 --- a/src/DjangoBlog/blog/models.py +++ /dev/null @@ -1,376 +0,0 @@ -import logging -import re -from abc import abstractmethod - -from django.conf import settings -from django.core.exceptions import ValidationError -from django.db import models -from django.urls import reverse -from django.utils.timezone import now -from django.utils.translation import gettext_lazy as _ -from mdeditor.fields import MDTextField -from uuslug import slugify - -from djangoblog.utils import cache_decorator, cache -from djangoblog.utils import get_current_site - -logger = logging.getLogger(__name__) - - -class LinkShowType(models.TextChoices): - I = ('i', _('index')) - L = ('l', _('list')) - P = ('p', _('post')) - A = ('a', _('all')) - S = ('s', _('slide')) - - -class BaseModel(models.Model): - id = models.AutoField(primary_key=True) - creation_time = models.DateTimeField(_('creation time'), default=now) - last_modify_time = models.DateTimeField(_('modify time'), default=now) - - def save(self, *args, **kwargs): - is_update_views = isinstance( - self, - Article) and 'update_fields' in kwargs and kwargs['update_fields'] == ['views'] - if is_update_views: - Article.objects.filter(pk=self.pk).update(views=self.views) - else: - if 'slug' in self.__dict__: - slug = getattr( - self, 'title') if 'title' in self.__dict__ else getattr( - self, 'name') - setattr(self, 'slug', slugify(slug)) - super().save(*args, **kwargs) - - def get_full_url(self): - site = get_current_site().domain - url = "https://{site}{path}".format(site=site, - path=self.get_absolute_url()) - return url - - class Meta: - abstract = True - - @abstractmethod - def get_absolute_url(self): - pass - - -class Article(BaseModel): - """文章""" - STATUS_CHOICES = ( - ('d', _('Draft')), - ('p', _('Published')), - ) - COMMENT_STATUS = ( - ('o', _('Open')), - ('c', _('Close')), - ) - TYPE = ( - ('a', _('Article')), - ('p', _('Page')), - ) - title = models.CharField(_('title'), max_length=200, unique=True) - body = MDTextField(_('body')) - pub_time = models.DateTimeField( - _('publish time'), blank=False, null=False, default=now) - status = models.CharField( - _('status'), - max_length=1, - choices=STATUS_CHOICES, - default='p') - comment_status = models.CharField( - _('comment status'), - max_length=1, - choices=COMMENT_STATUS, - default='o') - type = models.CharField(_('type'), max_length=1, choices=TYPE, default='a') - views = models.PositiveIntegerField(_('views'), default=0) - author = models.ForeignKey( - settings.AUTH_USER_MODEL, - verbose_name=_('author'), - blank=False, - null=False, - on_delete=models.CASCADE) - article_order = models.IntegerField( - _('order'), blank=False, null=False, default=0) - show_toc = models.BooleanField(_('show toc'), blank=False, null=False, default=False) - category = models.ForeignKey( - 'Category', - verbose_name=_('category'), - on_delete=models.CASCADE, - blank=False, - null=False) - tags = models.ManyToManyField('Tag', verbose_name=_('tag'), blank=True) - - def body_to_string(self): - return self.body - - def __str__(self): - return self.title - - class Meta: - ordering = ['-article_order', '-pub_time'] - verbose_name = _('article') - verbose_name_plural = verbose_name - get_latest_by = 'id' - - def get_absolute_url(self): - return reverse('blog:detailbyid', kwargs={ - 'article_id': self.id, - 'year': self.creation_time.year, - 'month': self.creation_time.month, - 'day': self.creation_time.day - }) - - @cache_decorator(60 * 60 * 10) - def get_category_tree(self): - tree = self.category.get_category_tree() - names = list(map(lambda c: (c.name, c.get_absolute_url()), tree)) - - return names - - def save(self, *args, **kwargs): - super().save(*args, **kwargs) - - def viewed(self): - self.views += 1 - self.save(update_fields=['views']) - - def comment_list(self): - cache_key = 'article_comments_{id}'.format(id=self.id) - value = cache.get(cache_key) - if value: - logger.info('get article comments:{id}'.format(id=self.id)) - return value - else: - comments = self.comment_set.filter(is_enable=True).order_by('-id') - cache.set(cache_key, comments, 60 * 100) - logger.info('set article comments:{id}'.format(id=self.id)) - return comments - - def get_admin_url(self): - info = (self._meta.app_label, self._meta.model_name) - return reverse('admin:%s_%s_change' % info, args=(self.pk,)) - - @cache_decorator(expiration=60 * 100) - def next_article(self): - # 下一篇 - return Article.objects.filter( - id__gt=self.id, status='p').order_by('id').first() - - @cache_decorator(expiration=60 * 100) - def prev_article(self): - # 前一篇 - return Article.objects.filter(id__lt=self.id, status='p').first() - - def get_first_image_url(self): - """ - Get the first image url from article.body. - :return: - """ - match = re.search(r'!\[.*?\]\((.+?)\)', self.body) - if match: - return match.group(1) - return "" - - -class Category(BaseModel): - """文章分类""" - name = models.CharField(_('category name'), max_length=30, unique=True) - parent_category = models.ForeignKey( - 'self', - verbose_name=_('parent category'), - blank=True, - null=True, - on_delete=models.CASCADE) - slug = models.SlugField(default='no-slug', max_length=60, blank=True) - index = models.IntegerField(default=0, verbose_name=_('index')) - - class Meta: - ordering = ['-index'] - verbose_name = _('category') - verbose_name_plural = verbose_name - - def get_absolute_url(self): - return reverse( - 'blog:category_detail', kwargs={ - 'category_name': self.slug}) - - def __str__(self): - return self.name - - @cache_decorator(60 * 60 * 10) - def get_category_tree(self): - """ - 递归获得分类目录的父级 - :return: - """ - categorys = [] - - def parse(category): - categorys.append(category) - if category.parent_category: - parse(category.parent_category) - - parse(self) - return categorys - - @cache_decorator(60 * 60 * 10) - def get_sub_categorys(self): - """ - 获得当前分类目录所有子集 - :return: - """ - categorys = [] - all_categorys = Category.objects.all() - - def parse(category): - if category not in categorys: - categorys.append(category) - childs = all_categorys.filter(parent_category=category) - for child in childs: - if category not in categorys: - categorys.append(child) - parse(child) - - parse(self) - return categorys - - -class Tag(BaseModel): - """文章标签""" - name = models.CharField(_('tag name'), max_length=30, unique=True) - slug = models.SlugField(default='no-slug', max_length=60, blank=True) - - def __str__(self): - return self.name - - def get_absolute_url(self): - return reverse('blog:tag_detail', kwargs={'tag_name': self.slug}) - - @cache_decorator(60 * 60 * 10) - def get_article_count(self): - return Article.objects.filter(tags__name=self.name).distinct().count() - - class Meta: - ordering = ['name'] - verbose_name = _('tag') - verbose_name_plural = verbose_name - - -class Links(models.Model): - """友情链接""" - - name = models.CharField(_('link name'), max_length=30, unique=True) - link = models.URLField(_('link')) - sequence = models.IntegerField(_('order'), unique=True) - is_enable = models.BooleanField( - _('is show'), default=True, blank=False, null=False) - show_type = models.CharField( - _('show type'), - max_length=1, - choices=LinkShowType.choices, - default=LinkShowType.I) - creation_time = models.DateTimeField(_('creation time'), default=now) - last_mod_time = models.DateTimeField(_('modify time'), default=now) - - class Meta: - ordering = ['sequence'] - verbose_name = _('link') - verbose_name_plural = verbose_name - - def __str__(self): - return self.name - - -class SideBar(models.Model): - """侧边栏,可以展示一些html内容""" - name = models.CharField(_('title'), max_length=100) - content = models.TextField(_('content')) - sequence = models.IntegerField(_('order'), unique=True) - is_enable = models.BooleanField(_('is enable'), default=True) - creation_time = models.DateTimeField(_('creation time'), default=now) - last_mod_time = models.DateTimeField(_('modify time'), default=now) - - class Meta: - ordering = ['sequence'] - verbose_name = _('sidebar') - verbose_name_plural = verbose_name - - def __str__(self): - return self.name - - -class BlogSettings(models.Model): - """blog的配置""" - site_name = models.CharField( - _('site name'), - max_length=200, - null=False, - blank=False, - default='') - site_description = models.TextField( - _('site description'), - max_length=1000, - null=False, - blank=False, - default='') - site_seo_description = models.TextField( - _('site seo description'), max_length=1000, null=False, blank=False, default='') - site_keywords = models.TextField( - _('site keywords'), - max_length=1000, - null=False, - blank=False, - default='') - article_sub_length = models.IntegerField(_('article sub length'), default=300) - sidebar_article_count = models.IntegerField(_('sidebar article count'), default=10) - sidebar_comment_count = models.IntegerField(_('sidebar comment count'), default=5) - article_comment_count = models.IntegerField(_('article comment count'), default=5) - show_google_adsense = models.BooleanField(_('show adsense'), default=False) - google_adsense_codes = models.TextField( - _('adsense code'), max_length=2000, null=True, blank=True, default='') - open_site_comment = models.BooleanField(_('open site comment'), default=True) - global_header = models.TextField("公共头部", null=True, blank=True, default='') - global_footer = models.TextField("公共尾部", null=True, blank=True, default='') - beian_code = models.CharField( - '备案号', - max_length=2000, - null=True, - blank=True, - default='') - analytics_code = models.TextField( - "网站统计代码", - max_length=1000, - null=False, - blank=False, - default='') - show_gongan_code = models.BooleanField( - '是否显示公安备案号', default=False, null=False) - gongan_beiancode = models.TextField( - '公安备案号', - max_length=2000, - null=True, - blank=True, - default='') - comment_need_review = models.BooleanField( - '评论是否需要审核', default=False, null=False) - - class Meta: - verbose_name = _('Website configuration') - verbose_name_plural = verbose_name - - def __str__(self): - return self.site_name - - def clean(self): - if BlogSettings.objects.exclude(id=self.id).count(): - raise ValidationError(_('There can only be one configuration')) - - def save(self, *args, **kwargs): - super().save(*args, **kwargs) - from djangoblog.utils import cache - cache.clear() diff --git a/src/DjangoBlog/blog/search_indexes.py b/src/DjangoBlog/blog/search_indexes.py deleted file mode 100644 index 7f1dfac..0000000 --- a/src/DjangoBlog/blog/search_indexes.py +++ /dev/null @@ -1,13 +0,0 @@ -from haystack import indexes - -from blog.models import Article - - -class ArticleIndex(indexes.SearchIndex, indexes.Indexable): - text = indexes.CharField(document=True, use_template=True) - - def get_model(self): - return Article - - def index_queryset(self, using=None): - return self.get_model().objects.filter(status='p') diff --git a/src/DjangoBlog/blog/static/account/css/account.css b/src/DjangoBlog/blog/static/account/css/account.css deleted file mode 100644 index 7d4cec7..0000000 --- a/src/DjangoBlog/blog/static/account/css/account.css +++ /dev/null @@ -1,9 +0,0 @@ -.button { - border: none; - padding: 4px 80px; - text-align: center; - text-decoration: none; - display: inline-block; - font-size: 16px; - margin: 4px 2px; -} \ No newline at end of file diff --git a/src/DjangoBlog/blog/static/account/js/account.js b/src/DjangoBlog/blog/static/account/js/account.js deleted file mode 100644 index f1a8771..0000000 --- a/src/DjangoBlog/blog/static/account/js/account.js +++ /dev/null @@ -1,47 +0,0 @@ -let wait = 60; - -function time(o) { - if (wait == 0) { - o.removeAttribute("disabled"); - o.value = "获取验证码"; - wait = 60 - return false - } else { - o.setAttribute("disabled", true); - o.value = "重新发送(" + wait + ")"; - wait--; - setTimeout(function () { - time(o) - }, - 1000) - } -} - -document.getElementById("btn").onclick = function () { - let id_email = $("#id_email") - let token = $("*[name='csrfmiddlewaretoken']").val() - let ts = this - let myErr = $("#myErr") - $.ajax( - { - url: "/forget_password_code/", - type: "POST", - data: { - "email": id_email.val(), - "csrfmiddlewaretoken": token - }, - success: function (result) { - if (result != "ok") { - myErr.remove() - id_email.after("") - return - } - myErr.remove() - time(ts) - }, - error: function (e) { - alert("发送失败,请重试") - } - } - ); -} diff --git a/src/DjangoBlog/blog/static/assets/css/bootstrap.min.css b/src/DjangoBlog/blog/static/assets/css/bootstrap.min.css deleted file mode 100644 index ed3905e..0000000 --- a/src/DjangoBlog/blog/static/assets/css/bootstrap.min.css +++ /dev/null @@ -1,6 +0,0 @@ -/*! - * Bootstrap v3.3.7 (http://getbootstrap.com) - * Copyright 2011-2016 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - *//*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{margin:.67em 0;font-size:2em}mark{color:#000;background:#ff0}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{height:0;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{margin:0;font:inherit;color:inherit}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}input{line-height:normal}input[type=checkbox],input[type=radio]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{padding:.35em .625em .75em;margin:0 2px;border:1px solid silver}legend{padding:0;border:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-spacing:0;border-collapse:collapse}td,th{padding:0}/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */@media print{*,:after,:before{color:#000!important;text-shadow:none!important;background:0 0!important;-webkit-box-shadow:none!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="javascript:"]:after,a[href^="#"]:after{content:""}blockquote,pre{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}.navbar{display:none}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #ddd!important}}@font-face{font-family:'Glyphicons Halflings';src:url(../fonts/glyphicons-halflings-regular.eot);src:url(../fonts/glyphicons-halflings-regular.eot?#iefix) format('embedded-opentype'),url(../fonts/glyphicons-halflings-regular.woff2) format('woff2'),url(../fonts/glyphicons-halflings-regular.woff) format('woff'),url(../fonts/glyphicons-halflings-regular.ttf) format('truetype'),url(../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular) format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:400;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\002a"}.glyphicon-plus:before{content:"\002b"}.glyphicon-eur:before,.glyphicon-euro:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}.glyphicon-cd:before{content:"\e201"}.glyphicon-save-file:before{content:"\e202"}.glyphicon-open-file:before{content:"\e203"}.glyphicon-level-up:before{content:"\e204"}.glyphicon-copy:before{content:"\e205"}.glyphicon-paste:before{content:"\e206"}.glyphicon-alert:before{content:"\e209"}.glyphicon-equalizer:before{content:"\e210"}.glyphicon-king:before{content:"\e211"}.glyphicon-queen:before{content:"\e212"}.glyphicon-pawn:before{content:"\e213"}.glyphicon-bishop:before{content:"\e214"}.glyphicon-knight:before{content:"\e215"}.glyphicon-baby-formula:before{content:"\e216"}.glyphicon-tent:before{content:"\26fa"}.glyphicon-blackboard:before{content:"\e218"}.glyphicon-bed:before{content:"\e219"}.glyphicon-apple:before{content:"\f8ff"}.glyphicon-erase:before{content:"\e221"}.glyphicon-hourglass:before{content:"\231b"}.glyphicon-lamp:before{content:"\e223"}.glyphicon-duplicate:before{content:"\e224"}.glyphicon-piggy-bank:before{content:"\e225"}.glyphicon-scissors:before{content:"\e226"}.glyphicon-bitcoin:before{content:"\e227"}.glyphicon-btc:before{content:"\e227"}.glyphicon-xbt:before{content:"\e227"}.glyphicon-yen:before{content:"\00a5"}.glyphicon-jpy:before{content:"\00a5"}.glyphicon-ruble:before{content:"\20bd"}.glyphicon-rub:before{content:"\20bd"}.glyphicon-scale:before{content:"\e230"}.glyphicon-ice-lolly:before{content:"\e231"}.glyphicon-ice-lolly-tasted:before{content:"\e232"}.glyphicon-education:before{content:"\e233"}.glyphicon-option-horizontal:before{content:"\e234"}.glyphicon-option-vertical:before{content:"\e235"}.glyphicon-menu-hamburger:before{content:"\e236"}.glyphicon-modal-window:before{content:"\e237"}.glyphicon-oil:before{content:"\e238"}.glyphicon-grain:before{content:"\e239"}.glyphicon-sunglasses:before{content:"\e240"}.glyphicon-text-size:before{content:"\e241"}.glyphicon-text-color:before{content:"\e242"}.glyphicon-text-background:before{content:"\e243"}.glyphicon-object-align-top:before{content:"\e244"}.glyphicon-object-align-bottom:before{content:"\e245"}.glyphicon-object-align-horizontal:before{content:"\e246"}.glyphicon-object-align-left:before{content:"\e247"}.glyphicon-object-align-vertical:before{content:"\e248"}.glyphicon-object-align-right:before{content:"\e249"}.glyphicon-triangle-right:before{content:"\e250"}.glyphicon-triangle-left:before{content:"\e251"}.glyphicon-triangle-bottom:before{content:"\e252"}.glyphicon-triangle-top:before{content:"\e253"}.glyphicon-console:before{content:"\e254"}.glyphicon-superscript:before{content:"\e255"}.glyphicon-subscript:before{content:"\e256"}.glyphicon-menu-left:before{content:"\e257"}.glyphicon-menu-right:before{content:"\e258"}.glyphicon-menu-down:before{content:"\e259"}.glyphicon-menu-up:before{content:"\e260"}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}:after,:before{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333;background-color:#fff}button,input,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#337ab7;text-decoration:none}a:focus,a:hover{color:#23527c;text-decoration:underline}a:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.carousel-inner>.item>a>img,.carousel-inner>.item>img,.img-responsive,.thumbnail a>img,.thumbnail>img{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{display:inline-block;max-width:100%;height:auto;padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}[role=button]{cursor:pointer}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-weight:400;line-height:1;color:#777}.h1,.h2,.h3,h1,h2,h3{margin-top:20px;margin-bottom:10px}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small{font-size:65%}.h4,.h5,.h6,h4,h5,h6{margin-top:10px;margin-bottom:10px}.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-size:75%}.h1,h1{font-size:36px}.h2,h2{font-size:30px}.h3,h3{font-size:24px}.h4,h4{font-size:18px}.h5,h5{font-size:14px}.h6,h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}.small,small{font-size:85%}.mark,mark{padding:.2em;background-color:#fcf8e3}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#777}.text-primary{color:#337ab7}a.text-primary:focus,a.text-primary:hover{color:#286090}.text-success{color:#3c763d}a.text-success:focus,a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:focus,a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:focus,a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:focus,a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#337ab7}a.bg-primary:focus,a.bg-primary:hover{background-color:#286090}.bg-success{background-color:#dff0d8}a.bg-success:focus,a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:focus,a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:focus,a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:focus,a.bg-danger:hover{background-color:#e4b9b9}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ol,ul{margin-top:0;margin-bottom:10px}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;margin-left:-5px;list-style:none}.list-inline>li{display:inline-block;padding-right:5px;padding-left:5px}dl{margin-top:0;margin-bottom:20px}dd,dt{line-height:1.42857143}dt{font-weight:700}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[data-original-title],abbr[title]{cursor:help;border-bottom:1px dotted #777}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote ol:last-child,blockquote p:last-child,blockquote ul:last-child{margin-bottom:0}blockquote .small,blockquote footer,blockquote small{display:block;font-size:80%;line-height:1.42857143;color:#777}blockquote .small:before,blockquote footer:before,blockquote small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;text-align:right;border-right:5px solid #eee;border-left:0}.blockquote-reverse .small:before,.blockquote-reverse footer:before,.blockquote-reverse small:before,blockquote.pull-right .small:before,blockquote.pull-right footer:before,blockquote.pull-right small:before{content:''}.blockquote-reverse .small:after,.blockquote-reverse footer:after,.blockquote-reverse small:after,blockquote.pull-right .small:after,blockquote.pull-right footer:after,blockquote.pull-right small:after{content:'\00A0 \2014'}address{margin-bottom:20px;font-style:normal;line-height:1.42857143}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:4px}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:3px;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.25);box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}kbd kbd{padding:0;font-size:100%;font-weight:700;-webkit-box-shadow:none;box-shadow:none}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857143;color:#333;word-break:break-all;word-wrap:break-word;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{margin-right:-15px;margin-left:-15px}.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{position:relative;min-height:1px;padding-right:15px;padding-left:15px}.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}table{background-color:transparent}caption{padding-top:8px;padding-bottom:8px;color:#777;text-align:left}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:20px}.table>tbody>tr>td,.table>tbody>tr>th,.table>tfoot>tr>td,.table>tfoot>tr>th,.table>thead>tr>td,.table>thead>tr>th{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>td,.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>td,.table>thead:first-child>tr:first-child>th{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>tbody>tr>td,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>td,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>thead>tr>th{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>tbody>tr>td,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>td,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border:1px solid #ddd}.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border-bottom-width:2px}.table-striped>tbody>tr:nth-of-type(odd){background-color:#f9f9f9}.table-hover>tbody>tr:hover{background-color:#f5f5f5}table col[class*=col-]{position:static;display:table-column;float:none}table td[class*=col-],table th[class*=col-]{position:static;display:table-cell;float:none}.table>tbody>tr.active>td,.table>tbody>tr.active>th,.table>tbody>tr>td.active,.table>tbody>tr>th.active,.table>tfoot>tr.active>td,.table>tfoot>tr.active>th,.table>tfoot>tr>td.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>thead>tr.active>th,.table>thead>tr>td.active,.table>thead>tr>th.active{background-color:#f5f5f5}.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr.active:hover>th,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover{background-color:#e8e8e8}.table>tbody>tr.success>td,.table>tbody>tr.success>th,.table>tbody>tr>td.success,.table>tbody>tr>th.success,.table>tfoot>tr.success>td,.table>tfoot>tr.success>th,.table>tfoot>tr>td.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>thead>tr.success>th,.table>thead>tr>td.success,.table>thead>tr>th.success{background-color:#dff0d8}.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr.success:hover>th,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover{background-color:#d0e9c6}.table>tbody>tr.info>td,.table>tbody>tr.info>th,.table>tbody>tr>td.info,.table>tbody>tr>th.info,.table>tfoot>tr.info>td,.table>tfoot>tr.info>th,.table>tfoot>tr>td.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>thead>tr.info>th,.table>thead>tr>td.info,.table>thead>tr>th.info{background-color:#d9edf7}.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr.info:hover>th,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover{background-color:#c4e3f3}.table>tbody>tr.warning>td,.table>tbody>tr.warning>th,.table>tbody>tr>td.warning,.table>tbody>tr>th.warning,.table>tfoot>tr.warning>td,.table>tfoot>tr.warning>th,.table>tfoot>tr>td.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>thead>tr.warning>th,.table>thead>tr>td.warning,.table>thead>tr>th.warning{background-color:#fcf8e3}.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr.warning:hover>th,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover{background-color:#faf2cc}.table>tbody>tr.danger>td,.table>tbody>tr.danger>th,.table>tbody>tr>td.danger,.table>tbody>tr>th.danger,.table>tfoot>tr.danger>td,.table>tfoot>tr.danger>th,.table>tfoot>tr>td.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>thead>tr.danger>th,.table>thead>tr>td.danger,.table>thead>tr>th.danger{background-color:#f2dede}.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr.danger:hover>th,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover{background-color:#ebcccc}.table-responsive{min-height:.01%;overflow-x:auto}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>td,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>thead>tr>th{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:700}input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=checkbox],input[type=radio]{margin:4px 0 0;margin-top:1px\9;line-height:normal}input[type=file]{display:block}input[type=range]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type=file]:focus,input[type=checkbox]:focus,input[type=radio]:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:14px;line-height:1.42857143;color:#555}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.42857143;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control::-ms-expand{background-color:transparent;border:0}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color:#eee;opacity:1}.form-control[disabled],fieldset[disabled] .form-control{cursor:not-allowed}textarea.form-control{height:auto}input[type=search]{-webkit-appearance:none}@media screen and (-webkit-min-device-pixel-ratio:0){input[type=date].form-control,input[type=time].form-control,input[type=datetime-local].form-control,input[type=month].form-control{line-height:34px}.input-group-sm input[type=date],.input-group-sm input[type=time],.input-group-sm input[type=datetime-local],.input-group-sm input[type=month],input[type=date].input-sm,input[type=time].input-sm,input[type=datetime-local].input-sm,input[type=month].input-sm{line-height:30px}.input-group-lg input[type=date],.input-group-lg input[type=time],.input-group-lg input[type=datetime-local],.input-group-lg input[type=month],input[type=date].input-lg,input[type=time].input-lg,input[type=datetime-local].input-lg,input[type=month].input-lg{line-height:46px}}.form-group{margin-bottom:15px}.checkbox,.radio{position:relative;display:block;margin-top:10px;margin-bottom:10px}.checkbox label,.radio label{min-height:20px;padding-left:20px;margin-bottom:0;font-weight:400;cursor:pointer}.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox],.radio input[type=radio],.radio-inline input[type=radio]{position:absolute;margin-top:4px\9;margin-left:-20px}.checkbox+.checkbox,.radio+.radio{margin-top:-5px}.checkbox-inline,.radio-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;font-weight:400;vertical-align:middle;cursor:pointer}.checkbox-inline+.checkbox-inline,.radio-inline+.radio-inline{margin-top:0;margin-left:10px}fieldset[disabled] input[type=checkbox],fieldset[disabled] input[type=radio],input[type=checkbox].disabled,input[type=checkbox][disabled],input[type=radio].disabled,input[type=radio][disabled]{cursor:not-allowed}.checkbox-inline.disabled,.radio-inline.disabled,fieldset[disabled] .checkbox-inline,fieldset[disabled] .radio-inline{cursor:not-allowed}.checkbox.disabled label,.radio.disabled label,fieldset[disabled] .checkbox label,fieldset[disabled] .radio label{cursor:not-allowed}.form-control-static{min-height:34px;padding-top:7px;padding-bottom:7px;margin-bottom:0}.form-control-static.input-lg,.form-control-static.input-sm{padding-right:0;padding-left:0}.input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}select[multiple].input-sm,textarea.input-sm{height:auto}.form-group-sm .form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.form-group-sm select.form-control{height:30px;line-height:30px}.form-group-sm select[multiple].form-control,.form-group-sm textarea.form-control{height:auto}.form-group-sm .form-control-static{height:30px;min-height:32px;padding:6px 10px;font-size:12px;line-height:1.5}.input-lg{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-lg{height:46px;line-height:46px}select[multiple].input-lg,textarea.input-lg{height:auto}.form-group-lg .form-control{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.form-group-lg select.form-control{height:46px;line-height:46px}.form-group-lg select[multiple].form-control,.form-group-lg textarea.form-control{height:auto}.form-group-lg .form-control-static{height:46px;min-height:38px;padding:11px 16px;font-size:18px;line-height:1.3333333}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center;pointer-events:none}.form-group-lg .form-control+.form-control-feedback,.input-group-lg+.form-control-feedback,.input-lg+.form-control-feedback{width:46px;height:46px;line-height:46px}.form-group-sm .form-control+.form-control-feedback,.input-group-sm+.form-control-feedback,.input-sm+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .checkbox,.has-success .checkbox-inline,.has-success .control-label,.has-success .help-block,.has-success .radio,.has-success .radio-inline,.has-success.checkbox label,.has-success.checkbox-inline label,.has-success.radio label,.has-success.radio-inline label{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;background-color:#dff0d8;border-color:#3c763d}.has-success .form-control-feedback{color:#3c763d}.has-warning .checkbox,.has-warning .checkbox-inline,.has-warning .control-label,.has-warning .help-block,.has-warning .radio,.has-warning .radio-inline,.has-warning.checkbox label,.has-warning.checkbox-inline label,.has-warning.radio label,.has-warning.radio-inline label{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;background-color:#fcf8e3;border-color:#8a6d3b}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .checkbox,.has-error .checkbox-inline,.has-error .control-label,.has-error .help-block,.has-error .radio,.has-error .radio-inline,.has-error.checkbox label,.has-error.checkbox-inline label,.has-error.radio label,.has-error.radio-inline label{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;background-color:#f2dede;border-color:#a94442}.has-error .form-control-feedback{color:#a94442}.has-feedback label~.form-control-feedback{top:25px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-static{display:inline-block}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .form-control,.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .checkbox,.form-inline .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .checkbox label,.form-inline .radio label{padding-left:0}.form-inline .checkbox input[type=checkbox],.form-inline .radio input[type=radio]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .checkbox,.form-horizontal .checkbox-inline,.form-horizontal .radio,.form-horizontal .radio-inline{padding-top:7px;margin-top:0;margin-bottom:0}.form-horizontal .checkbox,.form-horizontal .radio{min-height:27px}.form-horizontal .form-group{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.form-horizontal .control-label{padding-top:7px;margin-bottom:0;text-align:right}}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:11px;font-size:18px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:6px;font-size:12px}}.btn{display:inline-block;padding:6px 12px;margin-bottom:0;font-size:14px;font-weight:400;line-height:1.42857143;text-align:center;white-space:nowrap;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-image:none;border:1px solid transparent;border-radius:4px}.btn.active.focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn:active:focus,.btn:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.focus,.btn:focus,.btn:hover{color:#333;text-decoration:none}.btn.active,.btn:active{background-image:none;outline:0;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none;opacity:.65}a.btn.disabled,fieldset[disabled] a.btn{pointer-events:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default.focus,.btn-default:focus{color:#333;background-color:#e6e6e6;border-color:#8c8c8c}.btn-default:hover{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active.focus,.btn-default.active:focus,.btn-default.active:hover,.btn-default:active.focus,.btn-default:active:focus,.btn-default:active:hover,.open>.dropdown-toggle.btn-default.focus,.open>.dropdown-toggle.btn-default:focus,.open>.dropdown-toggle.btn-default:hover{color:#333;background-color:#d4d4d4;border-color:#8c8c8c}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{background-image:none}.btn-default.disabled.focus,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled].focus,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#337ab7;border-color:#2e6da4}.btn-primary.focus,.btn-primary:focus{color:#fff;background-color:#286090;border-color:#122b40}.btn-primary:hover{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active.focus,.btn-primary.active:focus,.btn-primary.active:hover,.btn-primary:active.focus,.btn-primary:active:focus,.btn-primary:active:hover,.open>.dropdown-toggle.btn-primary.focus,.open>.dropdown-toggle.btn-primary:focus,.open>.dropdown-toggle.btn-primary:hover{color:#fff;background-color:#204d74;border-color:#122b40}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled.focus,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled].focus,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#337ab7;border-color:#2e6da4}.btn-primary .badge{color:#337ab7;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success.focus,.btn-success:focus{color:#fff;background-color:#449d44;border-color:#255625}.btn-success:hover{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active.focus,.btn-success.active:focus,.btn-success.active:hover,.btn-success:active.focus,.btn-success:active:focus,.btn-success:active:hover,.open>.dropdown-toggle.btn-success.focus,.open>.dropdown-toggle.btn-success:focus,.open>.dropdown-toggle.btn-success:hover{color:#fff;background-color:#398439;border-color:#255625}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{background-image:none}.btn-success.disabled.focus,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled].focus,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info.focus,.btn-info:focus{color:#fff;background-color:#31b0d5;border-color:#1b6d85}.btn-info:hover{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active.focus,.btn-info.active:focus,.btn-info.active:hover,.btn-info:active.focus,.btn-info:active:focus,.btn-info:active:hover,.open>.dropdown-toggle.btn-info.focus,.open>.dropdown-toggle.btn-info:focus,.open>.dropdown-toggle.btn-info:hover{color:#fff;background-color:#269abc;border-color:#1b6d85}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{background-image:none}.btn-info.disabled.focus,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled].focus,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning.focus,.btn-warning:focus{color:#fff;background-color:#ec971f;border-color:#985f0d}.btn-warning:hover{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active.focus,.btn-warning.active:focus,.btn-warning.active:hover,.btn-warning:active.focus,.btn-warning:active:focus,.btn-warning:active:hover,.open>.dropdown-toggle.btn-warning.focus,.open>.dropdown-toggle.btn-warning:focus,.open>.dropdown-toggle.btn-warning:hover{color:#fff;background-color:#d58512;border-color:#985f0d}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled.focus,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled].focus,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger.focus,.btn-danger:focus{color:#fff;background-color:#c9302c;border-color:#761c19}.btn-danger:hover{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active.focus,.btn-danger.active:focus,.btn-danger.active:hover,.btn-danger:active.focus,.btn-danger:active:focus,.btn-danger:active:hover,.open>.dropdown-toggle.btn-danger.focus,.open>.dropdown-toggle.btn-danger:focus,.open>.dropdown-toggle.btn-danger:hover{color:#fff;background-color:#ac2925;border-color:#761c19}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled.focus,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled].focus,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{font-weight:400;color:#337ab7;border-radius:0}.btn-link,.btn-link.active,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:active,.btn-link:focus,.btn-link:hover{border-color:transparent}.btn-link:focus,.btn-link:hover{color:#23527c;text-decoration:underline;background-color:transparent}.btn-link[disabled]:focus,.btn-link[disabled]:hover,fieldset[disabled] .btn-link:focus,fieldset[disabled] .btn-link:hover{color:#777;text-decoration:none}.btn-group-lg>.btn,.btn-lg{padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.btn-group-sm>.btn,.btn-sm{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-group-xs>.btn,.btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition-timing-function:ease;-o-transition-timing-function:ease;transition-timing-function:ease;-webkit-transition-duration:.35s;-o-transition-duration:.35s;transition-duration:.35s;-webkit-transition-property:height,visibility;-o-transition-property:height,visibility;transition-property:height,visibility}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px dashed;border-top:4px solid\9;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown,.dropup{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;font-size:14px;text-align:left;list-style:none;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175)}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:1.42857143;color:#333;white-space:nowrap}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{color:#262626;text-decoration:none;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{color:#fff;text-decoration:none;background-color:#337ab7;outline:0}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{color:#777}.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{text-decoration:none;cursor:not-allowed;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{right:0;left:auto}.dropdown-menu-left{right:auto;left:0}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857143;color:#777;white-space:nowrap}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{content:"";border-top:0;border-bottom:4px dashed;border-bottom:4px solid\9}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:2px}@media (min-width:768px){.navbar-right .dropdown-menu{right:0;left:auto}.navbar-right .dropdown-menu-left{right:auto;left:0}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;float:left}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn,.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-bottom-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-right:8px;padding-left:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-right:12px;padding-left:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-top-left-radius:0;border-top-right-radius:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-top-right-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{display:table-cell;float:none;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle=buttons]>.btn input[type=checkbox],[data-toggle=buttons]>.btn input[type=radio],[data-toggle=buttons]>.btn-group>.btn input[type=checkbox],[data-toggle=buttons]>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*=col-]{float:none;padding-right:0;padding-left:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group .form-control:focus{z-index:3}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn,textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn,textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn{height:auto}.input-group .form-control,.input-group-addon,.input-group-btn{display:table-cell}.input-group .form-control:not(:first-child):not(:last-child),.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:14px;font-weight:400;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type=checkbox],.input-group-addon input[type=radio]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn-group:not(:last-child)>.btn,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:first-child>.btn-group:not(:first-child)>.btn,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:active,.input-group-btn>.btn:focus,.input-group-btn>.btn:hover{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{z-index:2;margin-left:-1px}.nav{padding-left:0;margin-bottom:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:focus,.nav>li>a:hover{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#777}.nav>li.disabled>a:focus,.nav>li.disabled>a:hover{color:#777;text-decoration:none;cursor:not-allowed;background-color:transparent}.nav .open>a,.nav .open>a:focus,.nav .open>a:hover{background-color:#eee;border-color:#337ab7}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:focus,.nav-tabs>li.active>a:hover{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:focus,.nav-pills>li.active>a:hover{color:#fff;background-color:#337ab7}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}@media (min-width:768px){.navbar{border-radius:4px}}@media (min-width:768px){.navbar-header{float:left}}.navbar-collapse{padding-right:15px;padding-left:15px;overflow-x:visible;-webkit-overflow-scrolling:touch;border-top:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1)}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;-webkit-box-shadow:none;box-shadow:none}.navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse{padding-right:0;padding-left:0}}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:340px}@media (max-device-width:480px) and (orientation:landscape){.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:200px}}.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-bottom,.navbar-fixed-top{position:fixed;right:0;left:0;z-index:1030}@media (min-width:768px){.navbar-fixed-bottom,.navbar-fixed-top{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;height:50px;padding:15px 15px;font-size:18px;line-height:20px}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-brand>img{display:block}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;padding:9px 10px;margin-top:8px;margin-right:15px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-nav .open .dropdown-menu .dropdown-header,.navbar-nav .open .dropdown-menu>li>a{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:focus,.navbar-nav .open .dropdown-menu>li>a:hover{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}}.navbar-form{padding:10px 15px;margin-top:8px;margin-right:-15px;margin-bottom:8px;margin-left:-15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1)}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .form-control-static{display:inline-block}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .form-control,.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .checkbox,.navbar-form .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .checkbox label,.navbar-form .radio label{padding-left:0}.navbar-form .checkbox input[type=checkbox],.navbar-form .radio input[type=radio]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}.navbar-form .form-group:last-child{margin-bottom:0}}@media (min-width:768px){.navbar-form{width:auto;padding-top:0;padding-bottom:0;margin-right:0;margin-left:0;border:0;-webkit-box-shadow:none;box-shadow:none}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-left-radius:0;border-top-right-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{margin-bottom:0;border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width:768px){.navbar-text{float:left;margin-right:15px;margin-left:15px}}@media (min-width:768px){.navbar-left{float:left!important}.navbar-right{float:right!important;margin-right:-15px}.navbar-right~.navbar-right{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:focus,.navbar-default .navbar-brand:hover{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a{color:#777}.navbar-default .navbar-nav>li>a:focus,.navbar-default .navbar-nav>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:focus,.navbar-default .navbar-nav>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:focus,.navbar-default .navbar-nav>.disabled>a:hover{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:focus,.navbar-default .navbar-toggle:hover{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:focus,.navbar-default .navbar-nav>.open>a:hover{color:#555;background-color:#e7e7e7}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-default .btn-link{color:#777}.navbar-default .btn-link:focus,.navbar-default .btn-link:hover{color:#333}.navbar-default .btn-link[disabled]:focus,.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:focus,fieldset[disabled] .navbar-default .btn-link:hover{color:#ccc}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#9d9d9d}.navbar-inverse .navbar-brand:focus,.navbar-inverse .navbar-brand:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a:focus,.navbar-inverse .navbar-nav>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:focus,.navbar-inverse .navbar-nav>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:focus,.navbar-inverse .navbar-nav>.disabled>a:hover{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:focus,.navbar-inverse .navbar-toggle:hover{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:focus,.navbar-inverse .navbar-nav>.open>a:hover{color:#fff;background-color:#080808}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#9d9d9d}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .btn-link{color:#9d9d9d}.navbar-inverse .btn-link:focus,.navbar-inverse .btn-link:hover{color:#fff}.navbar-inverse .btn-link[disabled]:focus,.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:focus,fieldset[disabled] .navbar-inverse .btn-link:hover{color:#444}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{padding:0 5px;color:#ccc;content:"/\00a0"}.breadcrumb>.active{color:#777}.pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;margin-left:-1px;line-height:1.42857143;color:#337ab7;text-decoration:none;background-color:#fff;border:1px solid #ddd}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-top-left-radius:4px;border-bottom-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-top-right-radius:4px;border-bottom-right-radius:4px}.pagination>li>a:focus,.pagination>li>a:hover,.pagination>li>span:focus,.pagination>li>span:hover{z-index:2;color:#23527c;background-color:#eee;border-color:#ddd}.pagination>.active>a,.pagination>.active>a:focus,.pagination>.active>a:hover,.pagination>.active>span,.pagination>.active>span:focus,.pagination>.active>span:hover{z-index:3;color:#fff;cursor:default;background-color:#337ab7;border-color:#337ab7}.pagination>.disabled>a,.pagination>.disabled>a:focus,.pagination>.disabled>a:hover,.pagination>.disabled>span,.pagination>.disabled>span:focus,.pagination>.disabled>span:hover{color:#777;cursor:not-allowed;background-color:#fff;border-color:#ddd}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px;line-height:1.3333333}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-top-left-radius:6px;border-bottom-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-top-right-radius:6px;border-bottom-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px;line-height:1.5}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-top-left-radius:3px;border-bottom-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-top-right-radius:3px;border-bottom-right-radius:3px}.pager{padding-left:0;margin:20px 0;text-align:center;list-style:none}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:focus,.pager li>a:hover{text-decoration:none;background-color:#eee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:focus,.pager .disabled>a:hover,.pager .disabled>span{color:#777;cursor:not-allowed;background-color:#fff}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}a.label:focus,a.label:hover{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#777}.label-default[href]:focus,.label-default[href]:hover{background-color:#5e5e5e}.label-primary{background-color:#337ab7}.label-primary[href]:focus,.label-primary[href]:hover{background-color:#286090}.label-success{background-color:#5cb85c}.label-success[href]:focus,.label-success[href]:hover{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:focus,.label-info[href]:hover{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:focus,.label-warning[href]:hover{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:focus,.label-danger[href]:hover{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:middle;background-color:#777;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-group-xs>.btn .badge,.btn-xs .badge{top:0;padding:1px 5px}a.badge:focus,a.badge:hover{color:#fff;text-decoration:none;cursor:pointer}.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#337ab7;background-color:#fff}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding-top:30px;padding-bottom:30px;margin-bottom:30px;color:inherit;background-color:#eee}.jumbotron .h1,.jumbotron h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:21px;font-weight:200}.jumbotron>hr{border-top-color:#d5d5d5}.container .jumbotron,.container-fluid .jumbotron{padding-right:15px;padding-left:15px;border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron,.container-fluid .jumbotron{padding-right:60px;padding-left:60px}.jumbotron .h1,.jumbotron h1{font-size:63px}}.thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:border .2s ease-in-out;-o-transition:border .2s ease-in-out;transition:border .2s ease-in-out}.thumbnail a>img,.thumbnail>img{margin-right:auto;margin-left:auto}a.thumbnail.active,a.thumbnail:focus,a.thumbnail:hover{border-color:#337ab7}.thumbnail .caption{padding:9px;color:#333}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:700}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.progress-bar{float:left;width:0;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#337ab7;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-webkit-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress-bar-striped,.progress-striped .progress-bar{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;background-size:40px 40px}.progress-bar.active,.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#5cb85c}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.media{margin-top:15px}.media:first-child{margin-top:0}.media,.media-body{overflow:hidden;zoom:1}.media-body{width:10000px}.media-object{display:block}.media-object.img-thumbnail{max-width:none}.media-right,.media>.pull-right{padding-left:10px}.media-left,.media>.pull-left{padding-right:10px}.media-body,.media-left,.media-right{display:table-cell;vertical-align:top}.media-middle{vertical-align:middle}.media-bottom{vertical-align:bottom}.media-heading{margin-top:0;margin-bottom:5px}.media-list{padding-left:0;list-style:none}.list-group{padding-left:0;margin-bottom:20px}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-left-radius:4px;border-top-right-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}a.list-group-item,button.list-group-item{color:#555}a.list-group-item .list-group-item-heading,button.list-group-item .list-group-item-heading{color:#333}a.list-group-item:focus,a.list-group-item:hover,button.list-group-item:focus,button.list-group-item:hover{color:#555;text-decoration:none;background-color:#f5f5f5}button.list-group-item{width:100%;text-align:left}.list-group-item.disabled,.list-group-item.disabled:focus,.list-group-item.disabled:hover{color:#777;cursor:not-allowed;background-color:#eee}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text{color:#777}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{z-index:2;color:#fff;background-color:#337ab7;border-color:#337ab7}.list-group-item.active .list-group-item-heading,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:focus .list-group-item-text,.list-group-item.active:hover .list-group-item-text{color:#c7ddef}.list-group-item-success{color:#3c763d;background-color:#dff0d8}a.list-group-item-success,button.list-group-item-success{color:#3c763d}a.list-group-item-success .list-group-item-heading,button.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:focus,a.list-group-item-success:hover,button.list-group-item-success:focus,button.list-group-item-success:hover{color:#3c763d;background-color:#d0e9c6}a.list-group-item-success.active,a.list-group-item-success.active:focus,a.list-group-item-success.active:hover,button.list-group-item-success.active,button.list-group-item-success.active:focus,button.list-group-item-success.active:hover{color:#fff;background-color:#3c763d;border-color:#3c763d}.list-group-item-info{color:#31708f;background-color:#d9edf7}a.list-group-item-info,button.list-group-item-info{color:#31708f}a.list-group-item-info .list-group-item-heading,button.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:focus,a.list-group-item-info:hover,button.list-group-item-info:focus,button.list-group-item-info:hover{color:#31708f;background-color:#c4e3f3}a.list-group-item-info.active,a.list-group-item-info.active:focus,a.list-group-item-info.active:hover,button.list-group-item-info.active,button.list-group-item-info.active:focus,button.list-group-item-info.active:hover{color:#fff;background-color:#31708f;border-color:#31708f}.list-group-item-warning{color:#8a6d3b;background-color:#fcf8e3}a.list-group-item-warning,button.list-group-item-warning{color:#8a6d3b}a.list-group-item-warning .list-group-item-heading,button.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:focus,a.list-group-item-warning:hover,button.list-group-item-warning:focus,button.list-group-item-warning:hover{color:#8a6d3b;background-color:#faf2cc}a.list-group-item-warning.active,a.list-group-item-warning.active:focus,a.list-group-item-warning.active:hover,button.list-group-item-warning.active,button.list-group-item-warning.active:focus,button.list-group-item-warning.active:hover{color:#fff;background-color:#8a6d3b;border-color:#8a6d3b}.list-group-item-danger{color:#a94442;background-color:#f2dede}a.list-group-item-danger,button.list-group-item-danger{color:#a94442}a.list-group-item-danger .list-group-item-heading,button.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:focus,a.list-group-item-danger:hover,button.list-group-item-danger:focus,button.list-group-item-danger:hover{color:#a94442;background-color:#ebcccc}a.list-group-item-danger.active,a.list-group-item-danger.active:focus,a.list-group-item-danger.active:hover,button.list-group-item-danger.active,button.list-group-item-danger.active:focus,button.list-group-item-danger.active:hover{color:#fff;background-color:#a94442;border-color:#a94442}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05);box-shadow:0 1px 1px rgba(0,0,0,.05)}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-left-radius:3px;border-top-right-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.panel-title>.small,.panel-title>.small>a,.panel-title>a,.panel-title>small,.panel-title>small>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.list-group,.panel>.panel-collapse>.list-group{margin-bottom:0}.panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child,.panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-left-radius:3px;border-top-right-radius:3px}.panel>.list-group:last-child .list-group-item:last-child,.panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.panel-heading+.panel-collapse>.list-group .list-group-item:first-child{border-top-left-radius:0;border-top-right-radius:0}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.list-group+.panel-footer{border-top-width:0}.panel>.panel-collapse>.table,.panel>.table,.panel>.table-responsive>.table{margin-bottom:0}.panel>.panel-collapse>.table caption,.panel>.table caption,.panel>.table-responsive>.table caption{padding-right:15px;padding-left:15px}.panel>.table-responsive:first-child>.table:first-child,.panel>.table:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table:first-child>thead:first-child>tr:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table-responsive:last-child>.table:last-child,.panel>.table:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body{border-top:1px solid #ddd}.panel>.table>tbody:first-child>tr:first-child td,.panel>.table>tbody:first-child>tr:first-child th{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{margin-bottom:0;border:0}.panel-group{margin-bottom:20px}.panel-group .panel{margin-bottom:0;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse>.list-group,.panel-group .panel-heading+.panel-collapse>.panel-body{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}.panel-default>.panel-heading .badge{color:#f5f5f5;background-color:#333}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#337ab7}.panel-primary>.panel-heading{color:#fff;background-color:#337ab7;border-color:#337ab7}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#337ab7}.panel-primary>.panel-heading .badge{color:#337ab7;background-color:#fff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#337ab7}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#d6e9c6}.panel-success>.panel-heading .badge{color:#dff0d8;background-color:#3c763d}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#d6e9c6}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#bce8f1}.panel-info>.panel-heading .badge{color:#d9edf7;background-color:#31708f}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#bce8f1}.panel-warning{border-color:#faebcc}.panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#faebcc}.panel-warning>.panel-heading .badge{color:#fcf8e3;background-color:#8a6d3b}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#faebcc}.panel-danger{border-color:#ebccd1}.panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ebccd1}.panel-danger>.panel-heading .badge{color:#f2dede;background-color:#a94442}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ebccd1}.embed-responsive{position:relative;display:block;height:0;padding:0;overflow:hidden}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive-4by3{padding-bottom:75%}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:21px;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;filter:alpha(opacity=20);opacity:.2}.close:focus,.close:hover{color:#000;text-decoration:none;cursor:pointer;filter:alpha(opacity=50);opacity:.5}button.close{-webkit-appearance:none;padding:0;cursor:pointer;background:0 0;border:0}.modal-open{overflow:hidden}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;display:none;overflow:hidden;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transition:-webkit-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out;-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);-o-transform:translate(0,-25%);transform:translate(0,-25%)}.modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);-o-transform:translate(0,0);transform:translate(0,0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #999;border:1px solid rgba(0,0,0,.2);border-radius:6px;outline:0;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5)}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{filter:alpha(opacity=0);opacity:0}.modal-backdrop.in{filter:alpha(opacity=50);opacity:.5}.modal-header{padding:15px;border-bottom:1px solid #e5e5e5}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:15px}.modal-footer{padding:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,.5);box-shadow:0 5px 15px rgba(0,0,0,.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1070;display:block;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:12px;font-style:normal;font-weight:400;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;filter:alpha(opacity=0);opacity:0;line-break:auto}.tooltip.in{filter:alpha(opacity=90);opacity:.9}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;background-color:#000;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-left .tooltip-arrow{right:5px;bottom:0;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-right .tooltip-arrow{bottom:0;left:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-left .tooltip-arrow{top:0;right:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-right .tooltip-arrow{top:0;left:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;font-style:normal;font-weight:400;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2);line-break:auto}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover>.arrow{border-width:11px}.popover>.arrow:after{content:"";border-width:10px}.popover.top>.arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,.25);border-bottom-width:0}.popover.top>.arrow:after{bottom:1px;margin-left:-10px;content:" ";border-top-color:#fff;border-bottom-width:0}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,.25);border-left-width:0}.popover.right>.arrow:after{bottom:-10px;left:1px;content:" ";border-right-color:#fff;border-left-width:0}.popover.bottom>.arrow{top:-11px;left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25)}.popover.bottom>.arrow:after{top:1px;margin-left:-10px;content:" ";border-top-width:0;border-bottom-color:#fff}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,.25)}.popover.left>.arrow:after{right:1px;bottom:-10px;content:" ";border-right-width:0;border-left-color:#fff}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>a>img,.carousel-inner>.item>img{line-height:1}@media all and (transform-3d),(-webkit-transform-3d){.carousel-inner>.item{-webkit-transition:-webkit-transform .6s ease-in-out;-o-transition:-o-transform .6s ease-in-out;transition:transform .6s ease-in-out;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;perspective:1000px}.carousel-inner>.item.active.right,.carousel-inner>.item.next{left:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.carousel-inner>.item.active.left,.carousel-inner>.item.prev{left:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}.carousel-inner>.item.active,.carousel-inner>.item.next.left,.carousel-inner>.item.prev.right{left:0;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;bottom:0;left:0;width:15%;font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6);background-color:rgba(0,0,0,0);filter:alpha(opacity=50);opacity:.5}.carousel-control.left{background-image:-webkit-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.5)),to(rgba(0,0,0,.0001)));background-image:linear-gradient(to right,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);background-repeat:repeat-x}.carousel-control.right{right:0;left:auto;background-image:-webkit-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.0001)),to(rgba(0,0,0,.5)));background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);background-repeat:repeat-x}.carousel-control:focus,.carousel-control:hover{color:#fff;text-decoration:none;filter:alpha(opacity=90);outline:0;opacity:.9}.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{position:absolute;top:50%;z-index:5;display:inline-block;margin-top:-10px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{left:50%;margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{right:50%;margin-right:-10px}.carousel-control .icon-next,.carousel-control .icon-prev{width:20px;height:20px;font-family:serif;line-height:1}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;padding-left:0;margin-left:-30%;text-align:center;list-style:none}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;cursor:pointer;background-color:#000\9;background-color:rgba(0,0,0,0);border:1px solid #fff;border-radius:10px}.carousel-indicators .active{width:12px;height:12px;margin:0;background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{width:30px;height:30px;margin-top:-10px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-10px}.carousel-caption{right:20%;left:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.btn-group-vertical>.btn-group:after,.btn-group-vertical>.btn-group:before,.btn-toolbar:after,.btn-toolbar:before,.clearfix:after,.clearfix:before,.container-fluid:after,.container-fluid:before,.container:after,.container:before,.dl-horizontal dd:after,.dl-horizontal dd:before,.form-horizontal .form-group:after,.form-horizontal .form-group:before,.modal-footer:after,.modal-footer:before,.modal-header:after,.modal-header:before,.nav:after,.nav:before,.navbar-collapse:after,.navbar-collapse:before,.navbar-header:after,.navbar-header:before,.navbar:after,.navbar:before,.pager:after,.pager:before,.panel-body:after,.panel-body:before,.row:after,.row:before{display:table;content:" "}.btn-group-vertical>.btn-group:after,.btn-toolbar:after,.clearfix:after,.container-fluid:after,.container:after,.dl-horizontal dd:after,.form-horizontal .form-group:after,.modal-footer:after,.modal-header:after,.nav:after,.navbar-collapse:after,.navbar-header:after,.navbar:after,.pager:after,.panel-body:after,.row:after{clear:both}.center-block{display:block;margin-right:auto;margin-left:auto}.pull-right{float:right!important}.pull-left{float:left!important}.hide{display:none!important}.show{display:block!important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none!important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-lg,.visible-md,.visible-sm,.visible-xs{display:none!important}.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block{display:none!important}@media (max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table!important}tr.visible-xs{display:table-row!important}td.visible-xs,th.visible-xs{display:table-cell!important}}@media (max-width:767px){.visible-xs-block{display:block!important}}@media (max-width:767px){.visible-xs-inline{display:inline!important}}@media (max-width:767px){.visible-xs-inline-block{display:inline-block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block!important}table.visible-sm{display:table!important}tr.visible-sm{display:table-row!important}td.visible-sm,th.visible-sm{display:table-cell!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-block{display:block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline{display:inline!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline-block{display:inline-block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block!important}table.visible-md{display:table!important}tr.visible-md{display:table-row!important}td.visible-md,th.visible-md{display:table-cell!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-block{display:block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline{display:inline!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline-block{display:inline-block!important}}@media (min-width:1200px){.visible-lg{display:block!important}table.visible-lg{display:table!important}tr.visible-lg{display:table-row!important}td.visible-lg,th.visible-lg{display:table-cell!important}}@media (min-width:1200px){.visible-lg-block{display:block!important}}@media (min-width:1200px){.visible-lg-inline{display:inline!important}}@media (min-width:1200px){.visible-lg-inline-block{display:inline-block!important}}@media (max-width:767px){.hidden-xs{display:none!important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none!important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none!important}}@media (min-width:1200px){.hidden-lg{display:none!important}}.visible-print{display:none!important}@media print{.visible-print{display:block!important}table.visible-print{display:table!important}tr.visible-print{display:table-row!important}td.visible-print,th.visible-print{display:table-cell!important}}.visible-print-block{display:none!important}@media print{.visible-print-block{display:block!important}}.visible-print-inline{display:none!important}@media print{.visible-print-inline{display:inline!important}}.visible-print-inline-block{display:none!important}@media print{.visible-print-inline-block{display:inline-block!important}}@media print{.hidden-print{display:none!important}} -/*# sourceMappingURL=bootstrap.min.css.map */ \ No newline at end of file diff --git a/src/DjangoBlog/blog/static/assets/css/docs.min.css b/src/DjangoBlog/blog/static/assets/css/docs.min.css deleted file mode 100644 index 3945197..0000000 --- a/src/DjangoBlog/blog/static/assets/css/docs.min.css +++ /dev/null @@ -1,11 +0,0 @@ -/*! - * IE10 viewport hack for Surface/desktop Windows 8 bug - * Copyright 2014-2015 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - */@-ms-viewport{width:device-width}@-o-viewport{width:device-width}@viewport{width:device-width}.hll{background-color:#ffc}.c{color:#999}.err{color:#A00;background-color:#FAA}.k{color:#069}.o{color:#555}.cm{color:#999}.cp{color:#099}.c1{color:#999}.cs{color:#999}.gd{background-color:#FCC;border:1px solid #C00}.ge{font-style:italic}.gr{color:red}.gh{color:#030}.gi{background-color:#CFC;border:1px solid #0C0}.go{color:#AAA}.gp{color:#009}.gu{color:#030}.gt{color:#9C6}.kc{color:#069}.kd{color:#069}.kn{color:#069}.kp{color:#069}.kr{color:#069}.kt{color:#078}.m{color:#F60}.s{color:#d44950}.na{color:#4f9fcf}.nb{color:#366}.nc{color:#0A8}.no{color:#360}.nd{color:#99F}.ni{color:#999}.ne{color:#C00}.nf{color:#C0F}.nl{color:#99F}.nn{color:#0CF}.nt{color:#2f6f9f}.nv{color:#033}.ow{color:#000}.w{color:#bbb}.mf{color:#F60}.mh{color:#F60}.mi{color:#F60}.mo{color:#F60}.sb{color:#C30}.sc{color:#C30}.sd{color:#C30;font-style:italic}.s2{color:#C30}.se{color:#C30}.sh{color:#C30}.si{color:#A00}.sx{color:#C30}.sr{color:#3AA}.s1{color:#C30}.ss{color:#FC3}.bp{color:#366}.vc{color:#033}.vg{color:#033}.vi{color:#033}.il{color:#F60}.css .nt+.nt,.css .o,.css .o+.nt{color:#999}.select2-container{position:relative;display:inline-block;zoom:1;*display:inline;vertical-align:top;padding:0;border:0}.select2-container:hover{border:0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.select2-container,.select2-drop,.select2-search,.select2-search input{-moz-box-sizing:border-box;-ms-box-sizing:border-box;-webkit-box-sizing:border-box;-khtml-box-sizing:border-box;box-sizing:border-box}.select2-container .select2-choice{display:block;overflow:hidden;text-decoration:none;padding:4px 12px;margin:0;color:#333;text-shadow:0 1px 0 #fff;white-space:nowrap;font-family:Arial,Helvetica,sans-serif;font-weight:700;font-size:13px;cursor:default;height:18px;background-color:#f3f3f3;background-image:-moz-linear-gradient(top,#f5f5f5,#f1f1f1);background-image:-webkit-gradient(linear,0 0,0 100%,from(#f5f5f5),to(#f1f1f1));background-image:-webkit-linear-gradient(top,#f5f5f5,#f1f1f1);background-image:-o-linear-gradient(top,#f5f5f5,#f1f1f1);background-image:linear-gradient(to bottom,#f5f5f5,#f1f1f1);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#fff1f1f1', GradientType=0);-webkit-background-clip:padding;-moz-background-clip:padding;background-clip:padding;border:1px solid #dcdcdc;-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;-moz-box-sizing:content-box;-ms-box-sizing:content-box;-webkit-box-sizing:content-box;-khtml-box-sizing:content-box;box-sizing:content-box}.select2-container .select2-choice:hover{color:#333;text-shadow:none;border-color:#c6c6c6;background-color:#f5f5f5;background-image:-moz-linear-gradient(top,#f8f8f8,#f1f1f1);background-image:-webkit-gradient(linear,0 0,0 100%,from(#f8f8f8),to(#f1f1f1));background-image:-webkit-linear-gradient(top,#f8f8f8,#f1f1f1);background-image:-o-linear-gradient(top,#f8f8f8,#f1f1f1);background-image:linear-gradient(to bottom,#f8f8f8,#f1f1f1);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff8f8f8', endColorstr='#fff1f1f1', GradientType=0);-webkit-box-shadow:0 1px 1px rgba(0,0,0,.1);-moz-box-shadow:0 1px 1px rgba(0,0,0,.1);box-shadow:0 1px 1px rgba(0,0,0,.1);background-position:0 0;-webkit-transition:none;-moz-transition:none;-o-transition:none;transition:none;z-index:2}.select2-container-active .select2-choice:hover{border:1px solid #4D90FE}.select2-container.select2-drop-above .select2-choice{background-image:-webkit-gradient(linear,left bottom,left top,color-stop(0,#eee),color-stop(.9,#fff));background-image:-webkit-linear-gradient(center bottom,#eee 0,#fff 90%);background-image:-moz-linear-gradient(center bottom,#eee 0,#fff 90%);background-image:-o-linear-gradient(bottom,#eee 0,#fff 90%);background-image:-ms-linear-gradient(top,#eee 0,#fff 90%);filter:progid:DXImageTransform.Microsoft.gradient( startColorstr='#eeeeee', endColorstr='#ffffff', GradientType=0 );background-image:linear-gradient(top,#eee 0,#fff 90%)}.select2-container .select2-choice span{margin-right:26px;display:block;overflow:hidden;white-space:nowrap;-o-text-overflow:ellipsis;-ms-text-overflow:ellipsis;text-overflow:ellipsis}.select2-container .select2-choice abbr{display:block;position:absolute;right:26px;top:8px;width:12px;height:12px;font-size:17px;line-height:16px;color:#595959;font-weight:700;cursor:pointer;text-decoration:none;border:0;outline:0}.select2-container .select2-choice abbr:hover{color:#222;cursor:pointer}.select2-drop-mask{position:absolute;left:0;top:0;z-index:9998;opacity:0}.select2-drop{background:#fff;color:#000;border:1px solid #aaa;position:absolute;top:100%;-webkit-box-shadow:0 2px 4px rgba(0,0,0,.2);-moz-box-shadow:0 2px 4px rgba(0,0,0,.2);-o-box-shadow:0 2px 4px rgba(0,0,0,.2);box-shadow:0 2px 4px rgba(0,0,0,.2);z-index:9999;width:100%;margin-top:1px}.select2-drop.select2-drop-above{margin-top:-1px;-webkit-box-shadow:0 -2px 4px rgba(0,0,0,.2);-moz-box-shadow:0 -2px 4px rgba(0,0,0,.2);-o-box-shadow:0 -2px 4px rgba(0,0,0,.2);box-shadow:0 -2px 4px rgba(0,0,0,.2)}.select2-container .select2-choice div{-webkit-border-radius:0 2px 2px 0;-moz-border-radius:0 2px 2px 0;border-radius:0 2px 2px 0;-moz-background-clip:padding;-webkit-background-clip:padding-box;background-clip:padding-box;position:absolute;right:0;top:0;display:block;height:100%;width:18px}.select2-container .select2-choice div b{background:url(/assets/img/select2.png) no-repeat -30px 2px;display:block;width:100%;height:100%}.select2-search{display:inline-block;white-space:nowrap;z-index:10000;min-height:26px;width:100%;margin:0;padding:4px 4px 0 4px}.select2-search-hidden{display:block;position:absolute;left:-10000px}.select2-search input{background:#fff url(/assets/img/select2.png) no-repeat 100% -22px;background:url(/assets/img/select2.png) no-repeat 100% -22px,-webkit-gradient(linear,left bottom,left top,color-stop(.85,#fff),color-stop(.99,#eee));background:url(/assets/img/select2.png) no-repeat 100% -22px,-webkit-linear-gradient(center bottom,#fff 85%,#eee 99%);background:url(/assets/img/select2.png) no-repeat 100% -22px,-moz-linear-gradient(center bottom,#fff 85%,#eee 99%);background:url(/assets/img/select2.png) no-repeat 100% -22px,-o-linear-gradient(bottom,#fff 85%,#eee 99%);background:url(/assets/img/select2.png) no-repeat 100% -22px,-ms-linear-gradient(top,#fff 85%,#eee 99%);background:url(/assets/img/select2.png) no-repeat 100% -22px,linear-gradient(top,#fff 85%,#eee 99%);padding:4px 20px 4px 5px;outline:0;border:1px solid #aaa;font-family:sans-serif;font-size:1em;width:100%;margin:0;height:auto!important;min-height:26px;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;border-radius:0;-moz-border-radius:0;-webkit-border-radius:0}.select2-drop.select2-drop-above .select2-search input{margin-top:4px}.select2-search input.select2-active{background:#fff url(../img/spinner.gif) no-repeat 100%;background:url(../img/spinner.gif) no-repeat 100%,-webkit-gradient(linear,left bottom,left top,color-stop(.85,#fff),color-stop(.99,#eee));background:url(../img/spinner.gif) no-repeat 100%,-webkit-linear-gradient(center bottom,#fff 85%,#eee 99%);background:url(../img/spinner.gif) no-repeat 100%,-moz-linear-gradient(center bottom,#fff 85%,#eee 99%);background:url(../img/spinner.gif) no-repeat 100%,-o-linear-gradient(bottom,#fff 85%,#eee 99%);background:url(../img/spinner.gif) no-repeat 100%,-ms-linear-gradient(top,#fff 85%,#eee 99%);background:url(../img/spinner.gif) no-repeat 100%,linear-gradient(top,#fff 85%,#eee 99%)}.select2-container-active .select2-choice,.select2-container-active .select2-choices{border:1px solid #4D90FE;outline:0}.select2-dropdown-open .select2-choice,.select2-dropdown-open .select2-choice:hover{background-color:#f4f4f4;background-image:-moz-linear-gradient(top,#f6f6f6,#f1f1f1);background-image:-webkit-gradient(linear,0 0,0 100%,from(#f6f6f6),to(#f1f1f1));background-image:-webkit-linear-gradient(top,#f6f6f6,#f1f1f1);background-image:-o-linear-gradient(top,#f6f6f6,#f1f1f1);background-image:linear-gradient(to bottom,#f6f6f6,#f1f1f1);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff6f6f6', endColorstr='#fff1f1f1', GradientType=0);-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.select2-dropdown-open .select2-choice div{background:0 0;border-left:none}.select2-results{margin:4px 1px 4px 0;padding:0;position:relative;overflow-x:hidden;overflow-y:auto;max-height:200px}.select2-results ul.select2-result-sub{margin:0}.select2-results ul.select2-result-sub>li .select2-result-label{padding-left:20px}.select2-results ul.select2-result-sub ul.select2-result-sub>li .select2-result-label{padding-left:40px}.select2-results ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub>li .select2-result-label{padding-left:60px}.select2-results ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub>li .select2-result-label{padding-left:80px}.select2-results ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub>li .select2-result-label{padding-left:100px}.select2-results ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub>li .select2-result-label{padding-left:110px}.select2-results ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub ul.select2-result-sub>li .select2-result-label{padding-left:120px}.select2-results li{list-style:none;display:list-item}.select2-results li.select2-result-with-children>.select2-result-label{font-weight:700}.select2-results .select2-result-label{padding:3px 7px 4px;margin:0;cursor:pointer}.select2-results .select2-highlighted{background:#eee}.select2-results li em{background:#feffde;font-style:normal}.select2-results .select2-highlighted em{background:0 0}.select2-results .select2-no-results,.select2-results .select2-searching,.select2-results .select2-selection-limit{background:#f4f4f4;display:list-item;padding-left:4px}.select2-results .select2-disabled{display:none}.select2-more-results.select2-active{background:#f4f4f4 url(../img/spinner.gif) no-repeat 100%}.select2-more-results{background:#f4f4f4;display:list-item}.select2-container.select2-container-disabled .select2-choice{color:#b3b3b3;border-color:#d9d9d9;background-color:#e6e6e6;background-image:none;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;text-shadow:none;cursor:default}.select2-container.select2-container-disabled .select2-choice div{opacity:.5;filter:alpha(opacity=50)}.select2-container-multi .select2-choices{background-color:#fff;border:1px solid #d9d9d9;border-top:1px solid silver;-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px;margin:0;padding:0;cursor:text;overflow:hidden;height:auto!important;height:1%;position:relative}.select2-container-multi .select2-choices:hover{border:1px solid #b9b9b9;border-top:1px solid #a0a0a0;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.select2-container-multi .select2-choices{min-height:26px}.select2-container-multi.select2-container-active .select2-choices{border:1px solid #4D90FE;outline:0}.select2-container-multi .select2-choices li{float:left;list-style:none}.select2-container-multi .select2-choices .select2-search-field{white-space:nowrap;margin:0;padding:0}.select2-container-multi .select2-choices .select2-search-field input{color:#666;background:0 0!important;font-family:sans-serif;font-size:100%;height:23px;padding:5px;margin:1px 0;outline:0;border:0;-webkit-box-shadow:none;-moz-box-shadow:none;-o-box-shadow:none;box-shadow:none}.select2-container-multi .select2-choices .select2-search-field input.select2-active{background:#fff url(../img/spinner.gif) no-repeat 100%!important}.select2-default{color:#999!important}.select2-container-multi .select2-choices .select2-search-choice{-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px;-moz-background-clip:padding;-webkit-background-clip:padding-box;background-clip:padding-box;background-color:#DAE4F6;color:#222;font-family:Arial;border:1px solid #DAE4F6;line-height:23px;padding:0 19px 0 5px;margin:1px;position:relative;cursor:default}.select2-container-multi .select2-choices .select2-search-choice span{cursor:default}.select2-container-multi .select2-choices .select2-search-choice-focus{background:#A6D7F5}.select2-search-choice-close{display:block;position:absolute;right:3px;top:4px;width:12px;height:13px;font-size:17px;line-height:16px;color:#444;font-weight:700;outline:0}.select2-search-choice-close:hover{text-decoration:none;color:#222;cursor:pointer}.select2-container-multi.select2-container-disabled .select2-choices{background-color:#f4f4f4;background-image:none;border:1px solid #ddd;cursor:default}.select2-container-multi.select2-container-disabled .select2-choices .select2-search-choice{background-image:none;background-color:#f4f4f4;border:1px solid #ddd;padding:3px 5px 3px 5px}.select2-container-multi.select2-container-disabled .select2-choices .select2-search-choice .select2-search-choice-close{display:none}.select2-result-selectable .select2-match,.select2-result-unselectable .select2-result-selectable .select2-match{font-weight:700}.select2-result-unselectable .select2-match{text-decoration:none}.select2-offscreen{position:absolute;left:-10000px}.select2-results::-webkit-scrollbar{height:16px;width:10px}.select2-results::-webkit-scrollbar-button:end:increment,.select2-results::-webkit-scrollbar-button:start:decrement{background-color:transparent;display:block;height:0}.select2-results::-webkit-scrollbar-track{background-clip:padding-box;border:solid transparent;border-width:0 0 0 4px}.select2-results::-webkit-scrollbar-track-piece{background-color:transparent;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.select2-results::-webkit-scrollbar:hover{background-color:#f3f3f3;border:1px solid #dbdbdb}.select2-results::-webkit-scrollbar-thumb:horizontal,.select2-results::-webkit-scrollbar-thumb:vertical{background-color:#c6c6c6;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.select2-results::-webkit-scrollbar-thumb{background-color:rgba(0,0,0,.2);border:solid transparent;border-width:0;-webkit-box-shadow:inset 1px 1px 0 rgba(0,0,0,.1),inset 0 -1px 0 rgba(0,0,0,.07);-moz-box-shadow:inset 1px 1px 0 rgba(0,0,0,.1),inset 0 -1px 0 rgba(0,0,0,.07);box-shadow:inset 1px 1px 0 rgba(0,0,0,.1),inset 0 -1px 0 rgba(0,0,0,.07);background-clip:padding-box}.select2-results::-webkit-scrollbar-thumb:hover{background-color:#949494}.select2-results::-webkit-scrollbar-thumb:active{background-color:rgba(0,0,0,.5);-webkit-box-shadow:inset 1px 1px 3px rgba(0,0,0,.35);-moz-box-shadow:inset 1px 1px 3px rgba(0,0,0,.35);box-shadow:inset 1px 1px 3px rgba(0,0,0,.35)}@media only screen and (-webkit-min-device-pixel-ratio:1.5){.select2-container .select2-choice div b,.select2-search input{background-image:url(/assets/img/select2x2.png)!important;background-repeat:no-repeat!important;background-size:60px 40px!important}.select2-search input{background-position:100% -21px!important}}/*! - * Bootstrap Docs (http://getbootstrap.com) - * Copyright 2011-2016 Twitter, Inc. - * Licensed under the Creative Commons Attribution 3.0 Unported License. For - * details, see https://creativecommons.org/licenses/by/3.0/. - */body{position:relative;padding-top:94px}.table code{font-size:13px;font-weight:400}h2 code,h3 code,h4 code{background-color:inherit}.btn-outline{color:#4d90fe;background-color:transparent;border-color:#4d90fe}.btn-outline:active,.btn-outline:focus,.btn-outline:hover{color:#fff;background-color:#4d90fe;border-color:#4d90fe}.btn-outline-inverse{color:#fff;background-color:transparent;border-color:#fff}.btn-outline-inverse:active,.btn-outline-inverse:focus,.btn-outline-inverse:hover{color:#2d87e2;text-shadow:none;background-color:#fff;border-color:#fff}#skippy{display:block;padding:1em;color:#777;background-color:#f1f1f1;outline:0}#skippy .skiplink-text{padding:.5em;outline:1px dotted}#content:focus{outline:0}.bs-docs-footer{padding-top:40px;padding-bottom:30px;margin-top:100px;color:#777;text-align:center;border-top:1px solid #e5e5e5}.bs-docs-footer-links{padding-left:0;margin-bottom:20px}.bs-docs-footer-links li{display:inline-block}.bs-docs-footer-links li+li{margin-left:15px}@media (min-width:768px){.bs-docs-footer{text-align:left}.bs-docs-footer p{margin-bottom:0}}.bs-docs-header,.bs-docs-masthead{position:relative;padding:30px 0;color:#b3d4f4;text-align:center;text-shadow:0 1px 0 rgba(0,0,0,.1);background-color:#2d87e2;background-image:-webkit-linear-gradient(top,#1b6ec1 0,#2d87e2 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#1b6ec1),to(#2d87e2));background-image:-o-linear-gradient(top,#1b6ec1 0,#2d87e2 100%);background-image:linear-gradient(to bottom,#1b6ec1 0,#2d87e2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#1b6ec1', endColorstr='#2d87e2', GradientType=0);background-repeat:repeat-x}.bs-docs-masthead .bs-docs-booticon{margin:0 auto 30px}.bs-docs-masthead h1{font-weight:300;line-height:1;color:#fff}.bs-docs-masthead .lead{margin:0 auto 30px;font-size:20px;color:#fff}.bs-docs-masthead .version{margin-top:-15px;color:#b3d4f4}.bs-docs-masthead .btn{width:100%;padding:15px 30px;font-size:20px}@media (min-width:480px){.bs-docs-masthead .btn{width:auto}}@media (min-width:768px){.bs-docs-masthead{padding:80px 0}.bs-docs-masthead h1{font-size:60px}.bs-docs-masthead .lead{font-size:24px}}@media (min-width:992px){.bs-docs-masthead .lead{width:80%;font-size:30px}}.bs-docs-header{margin-bottom:40px;font-size:20px}.bs-docs-header h1{margin-top:0;color:#fff}.bs-docs-header p{margin-bottom:0;font-weight:300;line-height:1.4}.bs-docs-header .container{position:relative}@media (min-width:768px){.bs-docs-header{padding-top:60px;padding-bottom:60px;font-size:24px;text-align:left}.bs-docs-header h1{font-size:60px;line-height:1}}@media (min-width:992px){.bs-docs-header h1,.bs-docs-header p{margin-right:380px}}.bs-docs-featurette{padding-top:40px;padding-bottom:40px;font-size:16px;line-height:1.5;color:#555;text-align:center;background-color:#fff;border-bottom:1px solid #e5e5e5}.bs-docs-featurette+.bs-docs-footer{margin-top:0;border-top:0}.bs-docs-featurette-title{margin-bottom:5px;font-size:30px;font-weight:400;color:#333}.half-rule{width:100px;margin:40px auto}.bs-docs-featurette h3{margin-bottom:5px;font-weight:400;color:#333}.bs-docs-featurette-img{display:block;margin-bottom:20px;color:#333}.bs-docs-featurette-img:hover{color:#337ab7;text-decoration:none}.bs-docs-featurette-img img{display:block;margin-bottom:15px}@media (min-width:480px){.bs-docs-featurette .img-responsive{margin-top:30px}}@media (min-width:768px){.bs-docs-featurette{padding-top:100px;padding-bottom:100px}.bs-docs-featurette-title{font-size:40px}.bs-docs-featurette .lead{max-width:80%;margin-right:auto;margin-left:auto}.bs-docs-featurette .img-responsive{margin-top:0}}.bs-docs-featured-sites{margin-right:-1px;margin-left:-1px}.bs-docs-featured-sites .col-xs-6{padding:1px}.bs-docs-featured-sites .img-responsive{margin-top:0}@media (min-width:768px){.bs-docs-featured-sites .col-sm-3:first-child img{border-top-left-radius:4px;border-bottom-left-radius:4px}.bs-docs-featured-sites .col-sm-3:last-child img{border-top-right-radius:4px;border-bottom-right-radius:4px}}.bs-examples .thumbnail{margin-bottom:10px}.bs-examples h4{margin-bottom:5px}.bs-examples p{margin-bottom:20px}@media (max-width:480px){.bs-examples{margin-right:-10px;margin-left:-10px}.bs-examples>[class^=col-]{padding-right:10px;padding-left:10px}}.bs-docs-sidebar.affix{position:static}@media (min-width:768px){.bs-docs-sidebar{padding-left:20px}}.bs-docs-sidenav{margin-top:50px;margin-bottom:20px}.bs-docs-sidebar .nav>li>a{display:block;padding:5px 20px;font-size:13px;font-weight:500;color:#222}.bs-docs-sidebar .nav>li>a:focus,.bs-docs-sidebar .nav>li>a:hover{text-decoration:none;background-color:#eee}.bs-docs-sidebar .nav>.active:focus>a,.bs-docs-sidebar .nav>.active:hover>a,.bs-docs-sidebar .nav>.active>a{color:#dd4b39;background-color:transparent}.bs-docs-sidebar .nav .nav{display:none;margin-bottom:8px}.bs-docs-sidebar .nav .nav>li>a{padding-top:1px;padding-bottom:1px;padding-left:30px;font-size:12px}.back-to-top,.bs-docs-theme-toggle{display:none;padding:4px 10px;margin-top:10px;margin-left:10px;font-size:12px;font-weight:500;color:#999}.back-to-top:hover,.bs-docs-theme-toggle:hover{color:#563d7c;text-decoration:none}.bs-docs-theme-toggle{margin-top:0}@media (min-width:768px){.back-to-top,.bs-docs-theme-toggle{display:block}}@media (min-width:992px){.bs-docs-sidebar .nav>.active>ul{display:block}.bs-docs-sidebar.affix,.bs-docs-sidebar.affix-bottom{width:213px}.bs-docs-sidebar.affix{position:fixed;top:80px}.bs-docs-sidebar.affix-bottom{position:absolute}.bs-docs-sidebar.affix .bs-docs-sidenav,.bs-docs-sidebar.affix-bottom .bs-docs-sidenav{margin-top:0;margin-bottom:0}}@media (min-width:1200px){.bs-docs-sidebar.affix,.bs-docs-sidebar.affix-bottom{width:263px}}.bs-docs-section{margin-bottom:60px}.bs-docs-section:last-child{margin-bottom:0}h1[id]{padding-top:20px;margin-top:0}.bs-callout{padding:20px;margin:20px 0;border:1px solid #eee;border-left-width:5px;border-radius:3px}.bs-callout h4{margin-top:0;margin-bottom:5px}.bs-callout p:last-child{margin-bottom:0}.bs-callout code{border-radius:3px}.bs-callout+.bs-callout{margin-top:-5px}.bs-callout-danger{border-left-color:#dd4b39}.bs-callout-danger h4{color:#c23321}.bs-callout-warning{border-left-color:#f1e7bc}.bs-callout-warning h4{color:#ba9e27}.bs-callout-info{border-left-color:#d0e3f0}.bs-callout-info h4{color:#3b86b9}.color-swatches{margin:0 -5px;overflow:hidden}.color-swatch{float:left;width:60px;height:60px;margin:0 5px;border-radius:3px}@media (min-width:768px){.color-swatch{width:100px;height:100px}}.color-swatches .gray-darker{background-color:#222}.color-swatches .gray-dark{background-color:#333}.color-swatches .gray{background-color:#555}.color-swatches .gray-light{background-color:#999}.color-swatches .gray-lighter{background-color:#eee}.color-swatches .brand-primary{background-color:#4d90fe}.color-swatches .brand-success{background-color:#35aa47}.color-swatches .brand-warning{background-color:#faa937}.color-swatches .brand-danger{background-color:#d84a38}.color-swatches .brand-info{background-color:#5bc0de}.color-swatches .bs-purple{background-color:#1b6ec1}.color-swatches .bs-purple-light{background-color:#c7bfd3}.color-swatches .bs-purple-lighter{background-color:#e5e1ea}.color-swatches .bs-gray{background-color:#f9f9f9}.bs-team .team-member{line-height:32px;color:#555}.bs-team .team-member:hover{color:#333;text-decoration:none}.bs-team .github-btn{float:right;width:180px;height:20px;margin-top:6px;border:none}.bs-team img{float:left;width:32px;margin-right:10px;border-radius:4px}.bs-docs-browser-bugs td p{margin-bottom:0}.bs-docs-browser-bugs th:first-child{width:18%}.show-grid{margin-bottom:15px}.show-grid [class^=col-]{padding-top:10px;padding-bottom:10px;background-color:#f9f9f9;border:1px solid #ddd}.bs-example{position:relative;padding:45px 15px 15px;margin:0 -15px 15px;border-color:#e5e5e5 #eee #eee;border-style:solid;border-width:1px 0;-webkit-box-shadow:inset 0 3px 6px rgba(0,0,0,.05);box-shadow:inset 0 3px 6px rgba(0,0,0,.05)}.bs-example:after{position:absolute;top:15px;left:15px;font-size:12px;font-weight:700;color:#959595;text-transform:uppercase;letter-spacing:1px;content:"Example"}.bs-example-padded-bottom{padding-bottom:24px}.bs-example+.highlight,.bs-example+.zero-clipboard+.highlight{margin:-15px -15px 15px;border-width:0 0 1px;border-radius:0}@media (min-width:768px){.bs-example{margin-right:0;margin-left:0;background-color:#fff;border-color:#ddd;border-width:1px;border-radius:4px 4px 0 0;-webkit-box-shadow:none;box-shadow:none}.bs-example+.highlight,.bs-example+.zero-clipboard+.highlight{margin-top:-16px;margin-right:0;margin-left:0;border-width:1px;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.bs-example-standalone{border-radius:4px}}.bs-example .container{width:auto}.bs-example>.alert:last-child,.bs-example>.form-control:last-child,.bs-example>.jumbotron:last-child,.bs-example>.list-group:last-child,.bs-example>.navbar:last-child,.bs-example>.panel:last-child,.bs-example>.progress:last-child,.bs-example>.table-responsive:last-child>.table,.bs-example>.table:last-child,.bs-example>.well:last-child,.bs-example>blockquote:last-child,.bs-example>ol:last-child,.bs-example>p:last-child,.bs-example>ul:last-child{margin-bottom:0}.bs-example>p>.close{float:none}.bs-example-type .table .type-info{color:#999;vertical-align:middle}.bs-example-type .table td{padding:15px 0;border-color:#eee}.bs-example-type .table tr:first-child td{border-top:0}.bs-example-type h1,.bs-example-type h2,.bs-example-type h3,.bs-example-type h4,.bs-example-type h5,.bs-example-type h6{margin:0}.bs-example-bg-classes p{padding:15px}.bs-example>.img-circle,.bs-example>.img-rounded,.bs-example>.img-thumbnail{margin:5px}.bs-example>.table-responsive>.table{background-color:#fff}.bs-example>.btn,.bs-example>.btn-group{margin-top:5px;margin-bottom:5px}.bs-example>.btn-toolbar+.btn-toolbar{margin-top:10px}.bs-example .select2-container.form-control,.bs-example-control-sizing input[type=text]+input[type=text],.bs-example-control-sizing select{margin-top:10px}.bs-example-form .input-group{margin-bottom:10px}.bs-example>textarea.form-control{resize:vertical}.bs-example>.list-group{max-width:400px}.bs-example .navbar:last-child{margin-bottom:0}.bs-navbar-bottom-example,.bs-navbar-top-example{z-index:1;padding:0;overflow:hidden}.bs-navbar-bottom-example .navbar-header,.bs-navbar-top-example .navbar-header{margin-left:0}.bs-navbar-bottom-example .navbar-fixed-bottom,.bs-navbar-top-example .navbar-fixed-top{position:relative;margin-right:0;margin-left:0}.bs-navbar-top-example{padding-bottom:90px}.bs-navbar-top-example:after{top:auto;bottom:15px}.bs-navbar-top-example .navbar-fixed-top{top:-1px}.bs-navbar-bottom-example{padding-top:90px}.bs-navbar-bottom-example .navbar-fixed-bottom{bottom:-1px}.bs-navbar-bottom-example .navbar{margin-bottom:0}@media (min-width:768px){.bs-navbar-bottom-example .navbar-fixed-bottom,.bs-navbar-top-example .navbar-fixed-top{position:absolute}}.bs-example .pagination{margin-top:10px;margin-bottom:10px}.bs-example>.pager{margin-top:0}.bs-example>.scrollable{height:200px;overflow-y:auto}.bs-example-modal{background-color:#f5f5f5}.bs-example-modal .modal{position:relative;top:auto;right:auto;bottom:auto;left:auto;z-index:1;display:block}.bs-example-modal .modal-dialog{left:auto;margin-right:auto;margin-left:auto}.bs-example .dropup>.dropdown-toggle,.bs-example>.dropdown>.dropdown-toggle{float:left}.bs-example-submenu .dropdown>.dropdown-menu,.bs-example-submenu .dropup>.dropdown-menu,.bs-example>.dropdown>.dropdown-menu{position:static;display:block;margin-bottom:5px;clear:left}.bs-example-submenu .dropdown-menu{margin-right:20px}.bs-example-tabs .nav-tabs{margin-bottom:15px}.bs-example-tooltips{text-align:center}.bs-example-tooltips>.btn{margin-top:5px;margin-bottom:5px}.bs-example-tooltip .tooltip{position:relative;display:inline-block;margin:10px 20px;opacity:1}.bs-example-popover{padding-bottom:24px;background-color:#f9f9f9}.bs-example-popover .popover{position:relative;display:block;float:left;width:260px;margin:20px}.scrollspy-example{position:relative;height:200px;margin-top:10px;overflow:auto}.bs-example>.nav-pills-stacked-example{max-width:300px}#collapseExample .well{margin-bottom:0}.bs-events-table>tbody>tr>td:first-child,.bs-events-table>thead>tr>th:first-child{white-space:nowrap}.bs-events-table>thead>tr>th:first-child{width:150px}.js-options-table>thead>tr>th:nth-child(1),.js-options-table>thead>tr>th:nth-child(2){width:100px}.js-options-table>thead>tr>th:nth-child(3){width:50px}.highlight{padding:9px 14px;margin-bottom:14px;background-color:#f7f7f9;border:1px solid #e1e1e8;border-radius:4px}.highlight pre{padding:0;margin-top:0;margin-bottom:0;word-break:normal;white-space:nowrap;background-color:transparent;border:0}.highlight pre code{font-size:inherit;color:#333}.highlight pre code:first-child{display:inline-block;padding-right:45px}.table-responsive .highlight pre{white-space:normal}.bs-table th small,.responsive-utilities th small{display:block;font-weight:400;color:#999}.responsive-utilities tbody th{font-weight:400}.responsive-utilities td{text-align:center}.responsive-utilities td.is-visible{color:#468847;background-color:#dff0d8!important}.responsive-utilities td.is-hidden{color:#ccc;background-color:#f9f9f9!important}.responsive-utilities-test{margin-top:5px}.responsive-utilities-test .col-xs-6{margin-bottom:10px}.responsive-utilities-test span{display:block;padding:15px 10px;font-size:14px;font-weight:700;line-height:1.1;text-align:center;border-radius:4px}.hidden-on .col-xs-6 .hidden-lg,.hidden-on .col-xs-6 .hidden-md,.hidden-on .col-xs-6 .hidden-sm,.hidden-on .col-xs-6 .hidden-xs,.visible-on .col-xs-6 .hidden-lg,.visible-on .col-xs-6 .hidden-md,.visible-on .col-xs-6 .hidden-sm,.visible-on .col-xs-6 .hidden-xs{color:#999;border:1px solid #ddd}.hidden-on .col-xs-6 .visible-lg-block,.hidden-on .col-xs-6 .visible-md-block,.hidden-on .col-xs-6 .visible-sm-block,.hidden-on .col-xs-6 .visible-xs-block,.visible-on .col-xs-6 .visible-lg-block,.visible-on .col-xs-6 .visible-md-block,.visible-on .col-xs-6 .visible-sm-block,.visible-on .col-xs-6 .visible-xs-block{color:#468847;background-color:#dff0d8;border:1px solid #d6e9c6}.bs-glyphicons{margin:0 -10px 20px;overflow:hidden}.bs-glyphicons-list{padding-left:0;list-style:none}.bs-glyphicons li{float:left;width:25%;height:115px;padding:10px;margin:0 -1px -1px 0;font-size:10px;line-height:1.4;text-align:center;border:1px solid #ddd}.bs-glyphicons .glyphicon{margin-top:5px;margin-bottom:10px;font-size:24px}.bs-glyphicons .glyphicon-class{display:block;text-align:center;word-wrap:break-word}.bs-glyphicons li:hover{background-color:#eee}@media (min-width:768px){.bs-glyphicons{margin-right:0;margin-left:0}.bs-glyphicons li{width:12.5%;font-size:12px}}.bs-customizer .toggle{float:right;margin-top:25px}.bs-customizer label{margin-top:10px;font-weight:500;color:#555}.bs-customizer h2{padding-top:30px;margin-top:0;margin-bottom:5px}.bs-customizer h3{margin-bottom:0}.bs-customizer h4{margin-top:15px;margin-bottom:0}.bs-customizer .bs-callout h4{margin-top:0;margin-bottom:5px}.bs-customizer input[type=text]{font-family:Menlo,Monaco,Consolas,"Courier New",monospace;background-color:#fafafa}.bs-customizer .help-block{margin-bottom:5px;font-size:12px}#less-section label{font-weight:400}.bs-customize-download .btn-outline{padding:20px}.bs-customizer-alert{position:fixed;top:0;right:0;left:0;z-index:1030;padding:15px 0;color:#fff;background-color:#d9534f;border-bottom:1px solid #b94441;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.25);box-shadow:inset 0 1px 0 rgba(255,255,255,.25)}.bs-customizer-alert .close{margin-top:-4px;font-size:24px}.bs-customizer-alert p{margin-bottom:0}.bs-customizer-alert .glyphicon{margin-right:5px}.bs-customizer-alert pre{margin:10px 0 0;color:#fff;background-color:#a83c3a;border-color:#973634;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,.05),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 2px 4px rgba(0,0,0,.05),0 1px 0 rgba(255,255,255,.1)}.bs-dropzone{position:relative;padding:20px;margin-bottom:20px;color:#777;text-align:center;border:2px dashed #eee;border-radius:4px}.bs-dropzone .import-header{margin-bottom:5px}.bs-dropzone .glyphicon-download-alt{font-size:40px}.bs-dropzone hr{width:100px}.bs-dropzone .lead{margin-bottom:10px;font-weight:400;color:#333}#import-manual-trigger{cursor:pointer}.bs-dropzone p:last-child{margin-bottom:0}.bs-brand-logos{display:table;width:100%;margin-bottom:15px;overflow:hidden;color:#1b6ec1;background-color:#f9f9f9;border-radius:4px}.bs-brand-item{padding:60px 0;text-align:center}.bs-brand-item+.bs-brand-item{border-top:1px solid #fff}.bs-brand-logos .inverse{color:#fff;background-color:#1b6ec1}.bs-brand-item h1,.bs-brand-item h3{margin-top:0;margin-bottom:0}.bs-brand-item .bs-docs-booticon{margin-right:auto;margin-left:auto}.bs-brand-item .glyphicon{width:30px;height:30px;margin:10px auto -10px;line-height:30px;color:#fff;border-radius:50%}.bs-brand-item .glyphicon-ok{background-color:#5cb85c}.bs-brand-item .glyphicon-remove{background-color:#d9534f}@media (min-width:768px){.bs-brand-item{display:table-cell;width:1%}.bs-brand-item+.bs-brand-item{border-top:0;border-left:1px solid #fff}.bs-brand-item h1{font-size:60px}}.zero-clipboard{position:relative;display:none}.btn-clipboard{position:absolute;top:0;right:0;z-index:10;display:block;padding:5px 8px;font-size:12px;color:#777;cursor:pointer;background-color:#fff;border:1px solid #e1e1e8;border-radius:0 4px 0 4px}.btn-clipboard-hover{color:#fff;background-color:#563d7c;border-color:#563d7c}@media (min-width:768px){.zero-clipboard{display:block}.bs-example+.zero-clipboard .btn-clipboard{top:-16px;border-top-right-radius:0}}.anchorjs-link{color:inherit}@media (max-width:480px){.anchorjs-link{display:none}}:hover>.anchorjs-link{opacity:.75;-webkit-transition:color .16s linear;-o-transition:color .16s linear;transition:color .16s linear}.anchorjs-link:focus,:hover>.anchorjs-link:hover{text-decoration:none;opacity:1}#focusedInput{border:1px solid #4d90fe!important;outline:0;outline:thin dotted\9;-webkit-box-shadow:none;box-shadow:none}.v4-tease{position:fixed;top:0;right:0;left:0;z-index:1030;display:block;padding:15px 20px;font-weight:700;color:#fff;text-align:center;background-color:#1b6ec1}.v4-tease:hover{color:#fff;text-decoration:none;background-color:#2d87e2}@media print{a[href]:after{content:""!important}}.bs-docs-navbar-masthead{top:48px}.bs-docs-dl-options h4{margin-top:15px;margin-bottom:5px} -/*# sourceMappingURL=docs.min.css.map */ \ No newline at end of file diff --git a/src/DjangoBlog/blog/static/assets/css/ie10-viewport-bug-workaround.css b/src/DjangoBlog/blog/static/assets/css/ie10-viewport-bug-workaround.css deleted file mode 100644 index 4b9518e..0000000 --- a/src/DjangoBlog/blog/static/assets/css/ie10-viewport-bug-workaround.css +++ /dev/null @@ -1,13 +0,0 @@ -/*! - * IE10 viewport hack for Surface/desktop Windows 8 bug - * Copyright 2014-2015 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - */ - -/* - * See the Getting Started docs for more information: - * http://getbootstrap.com/getting-started/#support-ie10-width - */ -@-ms-viewport { width: device-width; } -@-o-viewport { width: device-width; } -@viewport { width: device-width; } diff --git a/src/DjangoBlog/blog/static/assets/css/signin.css b/src/DjangoBlog/blog/static/assets/css/signin.css deleted file mode 100644 index 121fb0d..0000000 --- a/src/DjangoBlog/blog/static/assets/css/signin.css +++ /dev/null @@ -1,58 +0,0 @@ -body { - padding-top: 40px; - padding-bottom: 40px; - background-color: #fff; -} - -.form-signin { - max-width: 330px; - padding: 15px; - margin: 0 auto; -} -.form-signin-heading { - margin: 0 0 15px; - font-size: 18px; - font-weight: 400; - color: #555; -} -.form-signin .checkbox { - margin-bottom: 10px; - font-weight: normal; -} -.form-signin .form-control { - position: relative; - height: auto; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - padding: 10px; - font-size: 16px; -} -.form-signin .form-control:focus { - z-index: 2; -} -.form-signin input[type="email"] { - margin-bottom: 10px; -} -.form-signin input[type="password"] { - margin-bottom: 10px; -} -.card { - width: 304px; - padding: 20px 25px 30px; - margin: 0 auto 25px; - background-color: #f7f7f7; - border-radius: 2px; - -webkit-box-shadow: 0 2px 2px rgba(0, 0, 0, .3); - box-shadow: 0 2px 2px rgba(0, 0, 0, .3); -} -.card-signin { - width: 354px; - padding: 40px; -} -.card-signin .profile-img { - display: block; - width: 96px; - height: 96px; - margin: 0 auto 10px; -} diff --git a/src/DjangoBlog/blog/static/assets/css/todc-bootstrap.min.css b/src/DjangoBlog/blog/static/assets/css/todc-bootstrap.min.css deleted file mode 100644 index 66c9cb2..0000000 --- a/src/DjangoBlog/blog/static/assets/css/todc-bootstrap.min.css +++ /dev/null @@ -1,6 +0,0 @@ -/*! - * TODC Bootstrap v3.3.7-3.3.7 (http://todc.github.com/todc-bootstrap/) - * Copyright 2011-2016 Tim O'Donnell - * Licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) license - */.panel-group .panel-heading a.collapsed:before,.panel-group .panel-heading a:before{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:400;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.caret-left,.caret-right,.collapse-caret.collapsed:before,.collapse-caret:before,.dropdown-submenu>a:after{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px dashed;border-top:4px solid\9;border-right:4px solid transparent;border-left:4px solid transparent}body{font-family:Arial,Helvetica,sans-serif;font-size:13px;line-height:1.4;color:#333;background-color:#fff}button,input,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#15c}a:focus,a:hover{color:#15c}.img-rounded{border-radius:1px}.img-thumbnail{display:inline-block;max-width:100%;height:auto;padding:0;line-height:1.4;background-color:#fff;border:3px solid #fff;border-radius:0;-webkit-box-shadow:0 0 0 1px #aaa;box-shadow:0 0 0 1px #aaa;-webkit-transition:none;-o-transition:none;transition:none}.caret-left,.caret-right,.collapse-caret.collapsed:before,.dropdown-submenu>a:after{vertical-align:baseline;border-top:4px solid transparent;border-right:0 dotted;border-bottom:4px solid transparent;border-left:4px solid}.caret-left{margin-right:2px;margin-left:0;border-right:4px solid;border-left:0 dotted}.scrollable-shadow{background:-webkit-gradient(linear,left top,left bottom,color-stop(30%,#fff),to(rgba(255,255,255,0))),-webkit-gradient(linear,left top,left bottom,from(rgba(255,255,255,0)),color-stop(70%,#fff)) 0 100%,radial-gradient(50% 0,farthest-side,rgba(0,0,0,.2),rgba(0,0,0,0)),radial-gradient(50% 100%,farthest-side,rgba(0,0,0,.2),rgba(0,0,0,0)) 0 100%;background:-webkit-linear-gradient(white 30%,rgba(255,255,255,0)),-webkit-linear-gradient(rgba(255,255,255,0),#fff 70%) 0 100%,-webkit-radial-gradient(50% 0,farthest-side,rgba(0,0,0,.2),rgba(0,0,0,0)),-webkit-radial-gradient(50% 100%,farthest-side,rgba(0,0,0,.2),rgba(0,0,0,0)) 0 100%;background:-o-linear-gradient(white 30%,rgba(255,255,255,0)),-o-linear-gradient(rgba(255,255,255,0),#fff 70%) 0 100%,-o-radial-gradient(50% 0,farthest-side,rgba(0,0,0,.2),rgba(0,0,0,0)),-o-radial-gradient(50% 100%,farthest-side,rgba(0,0,0,.2),rgba(0,0,0,0)) 0 100%;background:linear-gradient(white 30%,rgba(255,255,255,0)),linear-gradient(rgba(255,255,255,0),#fff 70%) 0 100%,radial-gradient(50% 0,farthest-side,rgba(0,0,0,.2),rgba(0,0,0,0)),radial-gradient(50% 100%,farthest-side,rgba(0,0,0,.2),rgba(0,0,0,0)) 0 100%;background:-webkit-gradient(linear,left top,left bottom,color-stop(30%,#fff),to(rgba(255,255,255,0))),-webkit-gradient(linear,left top,left bottom,from(rgba(255,255,255,0)),color-stop(70%,#fff)) 0 100%,radial-gradient(farthest-side at 50% 0,rgba(0,0,0,.2),rgba(0,0,0,0)),radial-gradient(farthest-side at 50% 100%,rgba(0,0,0,.2),rgba(0,0,0,0)) 0 100%;background:linear-gradient(white 30%,rgba(255,255,255,0)),linear-gradient(rgba(255,255,255,0),#fff 70%) 0 100%,radial-gradient(farthest-side at 50% 0,rgba(0,0,0,.2),rgba(0,0,0,0)),radial-gradient(farthest-side at 50% 100%,rgba(0,0,0,.2),rgba(0,0,0,0)) 0 100%;background-repeat:no-repeat;background-attachment:local,local,scroll,scroll;-webkit-background-size:100% 40px,100% 40px,100% 6px,100% 6px;background-size:100% 40px,100% 40px,100% 6px,100% 6px}.mark,mark{background-color:#f9edbe}.text-primary{color:#4d90fe}a.text-primary:focus,a.text-primary:hover{color:#1a70fe}.text-warning{color:#333}a.text-warning:focus,a.text-warning:hover{color:#1a1a1a}.bg-primary{color:#fff;background-color:#4d90fe}a.bg-primary:focus,a.bg-primary:hover{background-color:#1a70fe}.bg-warning{background-color:#f9edbe}a.bg-warning:focus,a.bg-warning:hover{background-color:#f5e08f}code{padding:2px 4px;border-radius:0}kbd{border-radius:1px}pre{padding:9px;margin:0 0 9px;font-size:12px;line-height:1.4;border-radius:0}table{background-color:transparent}caption{color:#999}.table{margin-bottom:18px}.table>tbody>tr>td,.table>tbody>tr>th,.table>tfoot>tr>td,.table>tfoot>tr>th,.table>thead>tr>td,.table>thead>tr>th{line-height:1.4;border-top:1px solid #ddd}.table>thead>tr>th{border-bottom:2px solid #ddd}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-bordered{border:1px solid #ddd}.table-bordered>tbody>tr>td,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>td,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border:1px solid #ddd}.table-striped>tbody>tr:nth-of-type(odd){background-color:#f9f9f9}.table-hover>tbody>tr:hover{background-color:#ffc}.table>tbody>tr.warning>td,.table>tbody>tr.warning>th,.table>tbody>tr>td.warning,.table>tbody>tr>th.warning,.table>tfoot>tr.warning>td,.table>tfoot>tr.warning>th,.table>tfoot>tr>td.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>thead>tr.warning>th,.table>thead>tr>td.warning,.table>thead>tr>th.warning{background-color:#f9edbe}.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr.warning:hover>th,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover{background-color:#f7e7a7}@media screen and (max-width:767px){.table-responsive{margin-bottom:13.5px;border:1px solid #ddd}}legend{margin-bottom:18px;font-size:19.5px}input[type=radio],input[type=checkbox]{margin:2px 0 0}output{padding-top:6px;font-size:13px;line-height:1.4;color:#555}.form-control{height:30px;-webkit-appearance:none;padding:5px 8px;font-size:13px;line-height:1.4;background-color:#fff;border:1px solid #d9d9d9;border-top-color:silver;border-radius:2px;-webkit-box-shadow:none;box-shadow:none;-webkit-transition:none;-o-transition:none;transition:none}.form-control:hover{border:1px solid #b9b9b9;border-top-color:#a0a0a0;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.form-control:focus{border-color:#4d90fe;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(77,144,254,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(77,144,254,.6)}.form-control:focus{-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.3);box-shadow:inset 0 1px 2px rgba(0,0,0,.3)}.form-control::-ms-expand{background-color:transparent}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color:#f1f1f1;border:1px solid #e5e5e5}.form-control[disabled]:active,.form-control[disabled]:focus,.form-control[disabled]:hover,.form-control[readonly]:active,.form-control[readonly]:focus,.form-control[readonly]:hover,fieldset[disabled] .form-control:active,fieldset[disabled] .form-control:focus,fieldset[disabled] .form-control:hover{border:1px solid #e5e5e5;-webkit-box-shadow:none;box-shadow:none}.form-control[readonly] .form-control{border:1px solid #d9d9d9}.form-control[readonly] .form-control:active,.form-control[readonly] .form-control:focus,.form-control[readonly] .form-control:hover{border:1px solid #d9d9d9}textarea.form-control{padding-right:4px}@media screen and (-webkit-min-device-pixel-ratio:0){input[type=date].form-control,input[type=time].form-control,input[type=datetime-local].form-control,input[type=month].form-control{line-height:30px}.input-group-sm input[type=date],.input-group-sm input[type=time],.input-group-sm input[type=datetime-local],.input-group-sm input[type=month],input[type=date].input-sm,input[type=time].input-sm,input[type=datetime-local].input-sm,input[type=month].input-sm{line-height:26px}.input-group-lg input[type=date],.input-group-lg input[type=time],.input-group-lg input[type=datetime-local],.input-group-lg input[type=month],input[type=date].input-lg,input[type=time].input-lg,input[type=datetime-local].input-lg,input[type=month].input-lg{line-height:38px}}.checkbox label,.radio label{min-height:18px}.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox],.radio input[type=radio],.radio-inline input[type=radio],input[type=radio],input[type=checkbox]{position:relative;width:13px;width:16px\9;height:13px;height:16px\9;-webkit-appearance:none;background:#fff;border:1px solid #dcdcdc;border:1px solid transparent\9;border-radius:1px}.checkbox input[type=checkbox]:focus,.checkbox-inline input[type=checkbox]:focus,.radio input[type=radio]:focus,.radio-inline input[type=radio]:focus,input[type=radio]:focus,input[type=checkbox]:focus{border-color:#4d90fe;outline:0}.checkbox input[type=checkbox]:active,.checkbox-inline input[type=checkbox]:active,.radio input[type=radio]:active,.radio-inline input[type=radio]:active,input[type=radio]:active,input[type=checkbox]:active{background-color:#ebebeb;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffffffff', GradientType=0);border-color:#c6c6c6}.checkbox input[type=checkbox]:checked,.checkbox-inline input[type=checkbox]:checked,.radio input[type=radio]:checked,.radio-inline input[type=radio]:checked,input[type=radio]:checked,input[type=checkbox]:checked{background:#fff}.radio input[type=radio],.radio-inline input[type=radio],input[type=radio]{width:15px;width:18px\9;height:15px;height:18px\9;border-radius:1em}.radio input[type=radio]:checked::after,.radio-inline input[type=radio]:checked::after,input[type=radio]:checked::after{position:relative;top:3px;left:3px;display:block;width:7px;height:7px;content:'';background:#666;border-radius:1em}.checkbox input[type=checkbox]:hover,.checkbox-inline input[type=checkbox]:hover,input[type=checkbox]:hover{border-color:#c6c6c6;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.1);-webkit-box-shadow:none\9;box-shadow:inset 0 1px 1px rgba(0,0,0,.1);box-shadow:none\9}.checkbox input[type=checkbox]:checked::after,.checkbox-inline input[type=checkbox]:checked::after,input[type=checkbox]:checked::after{position:absolute;top:-6px;left:-5px;display:block;content:url(../img/checkmark.png)}.form-control-static{min-height:31px;padding-top:6px;padding-bottom:6px}.input-sm{height:26px;padding:3px 8px;font-size:12px;line-height:1.5;border-radius:1px}select.input-sm{height:26px;line-height:26px}select[multiple].input-sm,textarea.input-sm{height:auto}.form-group-sm .form-control{height:26px;padding:3px 8px;font-size:12px;line-height:1.5;border-radius:1px}.form-group-sm select.form-control{height:26px;line-height:26px}.form-group-sm .form-control-static{height:26px;min-height:30px;padding:4px 8px;font-size:12px;line-height:1.5}.input-lg{height:38px;padding:9px 14px;font-size:14px;line-height:1.3;border-radius:1px}select.input-lg{height:38px;line-height:38px}select[multiple].input-lg,textarea.input-lg{height:auto}.form-group-lg .form-control{height:38px;padding:9px 14px;font-size:14px;line-height:1.3;border-radius:1px}.form-group-lg select.form-control{height:38px;line-height:38px}.form-group-lg .form-control-static{height:38px;min-height:32px;padding:10px 14px;font-size:14px;line-height:1.3}.has-feedback .form-control{padding-right:37.5px}.form-control-feedback{top:23px;width:30px;height:30px;line-height:30px}.form-group-lg .form-control+.form-control-feedback,.input-group-lg+.form-control-feedback,.input-lg+.form-control-feedback{width:38px;height:38px;line-height:38px}.form-group-sm .form-control+.form-control-feedback,.input-group-sm+.form-control-feedback,.input-sm+.form-control-feedback{width:26px;height:26px;line-height:26px}.has-success .checkbox,.has-success .checkbox-inline,.has-success .control-label,.has-success .help-block,.has-success .radio,.has-success .radio-inline,.has-success.checkbox label,.has-success.checkbox-inline label,.has-success.radio label,.has-success.radio-inline label{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;background-color:#dff0d8;border-color:#3c763d}.has-success .form-control-feedback{color:#3c763d}.has-success .form-control{-webkit-box-shadow:none;box-shadow:none}.has-success .form-control:hover{border-color:#3c763d;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.1) inset;box-shadow:0 1px 2px rgba(0,0,0,.1) inset}.has-success .form-control:focus{border-color:#3c763d;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.3) inset;box-shadow:0 1px 2px rgba(0,0,0,.3) inset}.has-warning .checkbox,.has-warning .checkbox-inline,.has-warning .control-label,.has-warning .help-block,.has-warning .radio,.has-warning .radio-inline,.has-warning.checkbox label,.has-warning.checkbox-inline label,.has-warning.radio label,.has-warning.radio-inline label{color:#e09b17}.has-warning .form-control{border-color:#e09b17;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-warning .form-control:focus{border-color:#b27b12;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #f0c36d;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #f0c36d}.has-warning .input-group-addon{color:#e09b17;background-color:#f9edbe;border-color:#e09b17}.has-warning .form-control-feedback{color:#e09b17}.has-warning .form-control{-webkit-box-shadow:none;box-shadow:none}.has-warning .form-control:hover{border-color:#e09b17;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.1) inset;box-shadow:0 1px 2px rgba(0,0,0,.1) inset}.has-warning .form-control:focus{border-color:#e09b17;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.3) inset;box-shadow:0 1px 2px rgba(0,0,0,.3) inset}.has-error .checkbox,.has-error .checkbox-inline,.has-error .control-label,.has-error .help-block,.has-error .radio,.has-error .radio-inline,.has-error.checkbox label,.has-error.checkbox-inline label,.has-error.radio label,.has-error.radio-inline label{color:#dd4b39}.has-error .form-control{border-color:#dd4b39;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-error .form-control:focus{border-color:#c23321;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ec9a90;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ec9a90}.has-error .input-group-addon{color:#dd4b39;background-color:#f2dede;border-color:#dd4b39}.has-error .form-control-feedback{color:#dd4b39}.has-error .form-control{-webkit-box-shadow:none;box-shadow:none}.has-error .form-control:hover{border-color:#dd4b39;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.1) inset;box-shadow:0 1px 2px rgba(0,0,0,.1) inset}.has-error .form-control:focus{border-color:#dd4b39;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.3) inset;box-shadow:0 1px 2px rgba(0,0,0,.3) inset}.has-feedback label~.form-control-feedback{top:23px}.help-block{color:#777}.form-horizontal .checkbox-inline,.form-horizontal .control-label,.form-horizontal .radio-inline{padding-top:5px}@media (min-width:768px){.form-inline .form-group,.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control,.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-static,.navbar-form .form-control-static{display:inline-block}.form-inline .input-group,.navbar-form .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .form-control,.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn,.navbar-form .input-group .form-control,.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn{width:auto}.form-inline .input-group>.form-control,.navbar-form .input-group>.form-control{width:100%}.form-inline .control-label,.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.form-inline .checkbox,.form-inline .radio,.navbar-form .checkbox,.navbar-form .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .checkbox label,.form-inline .radio label,.navbar-form .checkbox label,.navbar-form .radio label{padding-left:0}.form-inline .checkbox input[type=checkbox],.form-inline .radio input[type=radio],.navbar-form .checkbox input[type=checkbox],.navbar-form .radio input[type=radio]{position:relative;margin-bottom:-2px;margin-left:0}.form-inline .has-feedback .form-control-feedback,.navbar-form .has-feedback .form-control-feedback{top:0}}.form-horizontal .checkbox,.form-horizontal .checkbox-inline,.form-horizontal .radio,.form-horizontal .radio-inline{padding-top:6px}.form-horizontal .checkbox,.form-horizontal .radio{min-height:24px}@media (min-width:768px){.form-horizontal .control-label{padding-top:6px}.form-horizontal .has-feedback .form-control-feedback{top:0}}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:10px;font-size:14px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:4px;font-size:12px}}.btn{padding:5px 12px;font-size:13px;font-weight:700;line-height:18px;cursor:default;-webkit-background-clip:border-box;background-clip:border-box;border-radius:2px;-webkit-box-shadow:none;box-shadow:none}.btn:hover{-webkit-box-shadow:0 1px 1px rgba(0,0,0,.1);box-shadow:0 1px 1px rgba(0,0,0,.1)}.btn.active,.btn:active{-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.btn-default{color:#333;text-shadow:0 1px rgba(0,0,0,.1);text-shadow:0 1px 0 #fff;background-color:#f3f3f3;background-image:-webkit-linear-gradient(top,#f5f5f5 0,#f1f1f1 100%);background-image:-o-linear-gradient(top,#f5f5f5 0,#f1f1f1 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#f1f1f1));background-image:linear-gradient(to bottom,#f5f5f5 0,#f1f1f1 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#fff1f1f1', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border:1px solid #dcdcdc}.btn-default:hover{text-shadow:0 1px rgba(0,0,0,.3);-webkit-box-shadow:0 1px 1px rgba(0,0,0,.2);box-shadow:0 1px 1px rgba(0,0,0,.2)}.btn-default.active,.btn-default.focus,.btn-default:active,.btn-default:focus,.btn-default:hover,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e4e4e4;background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e4e4e4 100%);background-image:-o-linear-gradient(top,#f5f5f5 0,#e4e4e4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#e4e4e4));background-image:linear-gradient(to bottom,#f5f5f5 0,#e4e4e4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe4e4e4', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border:1px solid #cfcfcf}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{text-shadow:0 1px rgba(0,0,0,.3);background-image:-webkit-linear-gradient(top,#f5f5f5 0,#d8d8d8 100%);background-image:-o-linear-gradient(top,#f5f5f5 0,#d8d8d8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#d8d8d8));background-image:linear-gradient(to bottom,#f5f5f5 0,#d8d8d8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffd8d8d8', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border:1px solid #c3c3c3;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.3);box-shadow:inset 0 1px 2px rgba(0,0,0,.3)}.btn-default.focus,.btn-default:focus{border:1px solid #dcdcdc;-webkit-box-shadow:inset 0 0 0 1px #fff;box-shadow:inset 0 0 0 1px #fff}.btn-default.disabled.focus,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled].focus,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#f5f5f5;background-image:-webkit-linear-gradient(top,#f5f5f5 0,#f1f1f1 100%);background-image:-o-linear-gradient(top,#f5f5f5 0,#f1f1f1 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#f1f1f1));background-image:linear-gradient(to bottom,#f5f5f5 0,#f1f1f1 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#fff1f1f1', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border:1px solid #dcdcdc;-webkit-box-shadow:none;box-shadow:none}.btn-default .badge{color:#dcdcdc;background-color:#333}.btn-default:hover{text-shadow:none;background-image:-webkit-linear-gradient(top,#f8f8f8 0,#f1f1f1 100%);background-image:-o-linear-gradient(top,#f8f8f8 0,#f1f1f1 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f8f8f8),to(#f1f1f1));background-image:linear-gradient(to bottom,#f8f8f8 0,#f1f1f1 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff8f8f8', endColorstr='#fff1f1f1', GradientType=0);background-repeat:repeat-x;background-position:0 0;border-color:#c6c6c6;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.1);box-shadow:0 1px 1px rgba(0,0,0,.1);-webkit-transition:none;-o-transition:none;transition:none}.btn-default.active,.btn-default:active,.open .dropdown-toggle.btn-default{text-shadow:0 1px 0 #fff;background-color:#e8e8e8;background-image:-webkit-linear-gradient(top,#f6f6f6 0,#f1f1f1 100%);background-image:-o-linear-gradient(top,#f6f6f6 0,#f1f1f1 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f6f6f6),to(#f1f1f1));background-image:linear-gradient(to bottom,#f6f6f6 0,#f1f1f1 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff6f6f6', endColorstr='#fff1f1f1', GradientType=0);background-repeat:repeat-x;border:1px solid #dcdcdc;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.btn-default.focus,.btn-default:focus{background-color:#f3f3f3;border-color:#4d90fe;outline-style:none}.btn-default.disabled.focus,.btn-default.disabled:active,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled].focus,.btn-default[disabled]:active,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:active,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{text-shadow:none;background-color:#f3f3f3}.btn-default .badge{color:#f3f3f3;text-shadow:none}.btn-primary{color:#fff;text-shadow:0 1px rgba(0,0,0,.1);background-image:-webkit-linear-gradient(top,#4d90fe 0,#4787ed 100%);background-image:-o-linear-gradient(top,#4d90fe 0,#4787ed 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#4d90fe),to(#4787ed));background-image:linear-gradient(to bottom,#4d90fe 0,#4787ed 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff4d90fe', endColorstr='#ff4787ed', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border:1px solid #3079ed}.btn-primary:hover{text-shadow:0 1px rgba(0,0,0,.3);-webkit-box-shadow:0 1px 1px rgba(0,0,0,.2);box-shadow:0 1px 1px rgba(0,0,0,.2)}.btn-primary.active,.btn-primary.focus,.btn-primary:active,.btn-primary:focus,.btn-primary:hover,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#3078eb;background-image:-webkit-linear-gradient(top,#4d90fe 0,#3078eb 100%);background-image:-o-linear-gradient(top,#4d90fe 0,#3078eb 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#4d90fe),to(#3078eb));background-image:linear-gradient(to bottom,#4d90fe 0,#3078eb 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff4d90fe', endColorstr='#ff3078eb', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border:1px solid #196aeb}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{text-shadow:0 1px rgba(0,0,0,.3);background-image:-webkit-linear-gradient(top,#4d90fe 0,#1969e8 100%);background-image:-o-linear-gradient(top,#4d90fe 0,#1969e8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#4d90fe),to(#1969e8));background-image:linear-gradient(to bottom,#4d90fe 0,#1969e8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff4d90fe', endColorstr='#ff1969e8', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border:1px solid #135fd7;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.3);box-shadow:inset 0 1px 2px rgba(0,0,0,.3)}.btn-primary.focus,.btn-primary:focus{border:1px solid #3079ed;-webkit-box-shadow:inset 0 0 0 1px #fff;box-shadow:inset 0 0 0 1px #fff}.btn-primary.disabled.focus,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled].focus,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#4d90fe;background-image:-webkit-linear-gradient(top,#4d90fe 0,#4787ed 100%);background-image:-o-linear-gradient(top,#4d90fe 0,#4787ed 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#4d90fe),to(#4787ed));background-image:linear-gradient(to bottom,#4d90fe 0,#4787ed 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff4d90fe', endColorstr='#ff4787ed', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border:1px solid #3079ed;-webkit-box-shadow:none;box-shadow:none}.btn-primary .badge{color:#3079ed;background-color:#fff}.btn-success{color:#fff;text-shadow:0 1px rgba(0,0,0,.1);background-image:-webkit-linear-gradient(top,#35aa47 0,#35aa47 100%);background-image:-o-linear-gradient(top,#35aa47 0,#35aa47 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#35aa47),to(#35aa47));background-image:linear-gradient(to bottom,#35aa47 0,#35aa47 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff35aa47', endColorstr='#ff35aa47', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border:1px solid #359947}.btn-success:hover{text-shadow:0 1px rgba(0,0,0,.3);-webkit-box-shadow:0 1px 1px rgba(0,0,0,.2);box-shadow:0 1px 1px rgba(0,0,0,.2)}.btn-success.active,.btn-success.focus,.btn-success:active,.btn-success:focus,.btn-success:hover,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#2f973f;background-image:-webkit-linear-gradient(top,#35aa47 0,#2f973f 100%);background-image:-o-linear-gradient(top,#35aa47 0,#2f973f 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#35aa47),to(#2f973f));background-image:linear-gradient(to bottom,#35aa47 0,#2f973f 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff35aa47', endColorstr='#ff2f973f', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border:1px solid #2e863e}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{text-shadow:0 1px rgba(0,0,0,.3);background-image:-webkit-linear-gradient(top,#35aa47 0,#298337 100%);background-image:-o-linear-gradient(top,#35aa47 0,#298337 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#35aa47),to(#298337));background-image:linear-gradient(to bottom,#35aa47 0,#298337 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff35aa47', endColorstr='#ff298337', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border:1px solid #287335;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.3);box-shadow:inset 0 1px 2px rgba(0,0,0,.3)}.btn-success.focus,.btn-success:focus{border:1px solid #359947;-webkit-box-shadow:inset 0 0 0 1px #fff;box-shadow:inset 0 0 0 1px #fff}.btn-success.disabled.focus,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled].focus,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#35aa47;background-image:-webkit-linear-gradient(top,#35aa47 0,#35aa47 100%);background-image:-o-linear-gradient(top,#35aa47 0,#35aa47 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#35aa47),to(#35aa47));background-image:linear-gradient(to bottom,#35aa47 0,#35aa47 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff35aa47', endColorstr='#ff35aa47', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border:1px solid #359947;-webkit-box-shadow:none;box-shadow:none}.btn-success .badge{color:#359947;background-color:#fff}.btn-info{color:#fff;text-shadow:0 1px rgba(0,0,0,.1);background-image:-webkit-linear-gradient(top,#5bc0de 0,#5bc0de 100%);background-image:-o-linear-gradient(top,#5bc0de 0,#5bc0de 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5bc0de),to(#5bc0de));background-image:linear-gradient(to bottom,#5bc0de 0,#5bc0de 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff5bc0de', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border:1px solid #46b8da}.btn-info:hover{text-shadow:0 1px rgba(0,0,0,.3);-webkit-box-shadow:0 1px 1px rgba(0,0,0,.2);box-shadow:0 1px 1px rgba(0,0,0,.2)}.btn-info.active,.btn-info.focus,.btn-info:active,.btn-info:focus,.btn-info:hover,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#46b8da;background-image:-webkit-linear-gradient(top,#5bc0de 0,#46b8da 100%);background-image:-o-linear-gradient(top,#5bc0de 0,#46b8da 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5bc0de),to(#46b8da));background-image:linear-gradient(to bottom,#5bc0de 0,#46b8da 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff46b8da', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border:1px solid #31b0d5}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{text-shadow:0 1px rgba(0,0,0,.3);background-image:-webkit-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:-o-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5bc0de),to(#31b0d5));background-image:linear-gradient(to bottom,#5bc0de 0,#31b0d5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border:1px solid #28a1c5;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.3);box-shadow:inset 0 1px 2px rgba(0,0,0,.3)}.btn-info.focus,.btn-info:focus{border:1px solid #46b8da;-webkit-box-shadow:inset 0 0 0 1px #fff;box-shadow:inset 0 0 0 1px #fff}.btn-info.disabled.focus,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled].focus,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#5bc0de;background-image:-webkit-linear-gradient(top,#5bc0de 0,#5bc0de 100%);background-image:-o-linear-gradient(top,#5bc0de 0,#5bc0de 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5bc0de),to(#5bc0de));background-image:linear-gradient(to bottom,#5bc0de 0,#5bc0de 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff5bc0de', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border:1px solid #46b8da;-webkit-box-shadow:none;box-shadow:none}.btn-info .badge{color:#46b8da;background-color:#fff}.btn-warning{color:#fff;text-shadow:0 1px rgba(0,0,0,.1);background-image:-webkit-linear-gradient(top,#fbb450 0,#faa937 100%);background-image:-o-linear-gradient(top,#fbb450 0,#faa937 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fbb450),to(#faa937));background-image:linear-gradient(to bottom,#fbb450 0,#faa937 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fffaa937', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border:1px solid #faa328}.btn-warning:hover{text-shadow:0 1px rgba(0,0,0,.3);-webkit-box-shadow:0 1px 1px rgba(0,0,0,.2);box-shadow:0 1px 1px rgba(0,0,0,.2)}.btn-warning.active,.btn-warning.focus,.btn-warning:active,.btn-warning:focus,.btn-warning:hover,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#f99e1e;background-image:-webkit-linear-gradient(top,#fbb450 0,#f99e1e 100%);background-image:-o-linear-gradient(top,#fbb450 0,#f99e1e 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fbb450),to(#f99e1e));background-image:linear-gradient(to bottom,#fbb450 0,#f99e1e 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff99e1e', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border:1px solid #f9980f}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{text-shadow:0 1px rgba(0,0,0,.3);background-image:-webkit-linear-gradient(top,#fbb450 0,#f89306 100%);background-image:-o-linear-gradient(top,#fbb450 0,#f89306 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fbb450),to(#f89306));background-image:linear-gradient(to bottom,#fbb450 0,#f89306 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff89306', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border:1px solid #e98b06;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.3);box-shadow:inset 0 1px 2px rgba(0,0,0,.3)}.btn-warning.focus,.btn-warning:focus{border:1px solid #faa328;-webkit-box-shadow:inset 0 0 0 1px #fff;box-shadow:inset 0 0 0 1px #fff}.btn-warning.disabled.focus,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled].focus,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#fbb450;background-image:-webkit-linear-gradient(top,#fbb450 0,#faa937 100%);background-image:-o-linear-gradient(top,#fbb450 0,#faa937 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fbb450),to(#faa937));background-image:linear-gradient(to bottom,#fbb450 0,#faa937 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fffaa937', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border:1px solid #faa328;-webkit-box-shadow:none;box-shadow:none}.btn-warning .badge{color:#faa328;background-color:#fff}.btn-danger{color:#fff;text-shadow:0 1px rgba(0,0,0,.1);background-image:-webkit-linear-gradient(top,#dd4b39 0,#d14836 100%);background-image:-o-linear-gradient(top,#dd4b39 0,#d14836 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dd4b39),to(#d14836));background-image:linear-gradient(to bottom,#dd4b39 0,#d14836 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdd4b39', endColorstr='#ffd14836', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border:1px solid #c6322a}.btn-danger:hover{text-shadow:0 1px rgba(0,0,0,.3);-webkit-box-shadow:0 1px 1px rgba(0,0,0,.2);box-shadow:0 1px 1px rgba(0,0,0,.2)}.btn-danger.active,.btn-danger.focus,.btn-danger:active,.btn-danger:focus,.btn-danger:hover,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c13e2c;background-image:-webkit-linear-gradient(top,#dd4b39 0,#c13e2c 100%);background-image:-o-linear-gradient(top,#dd4b39 0,#c13e2c 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dd4b39),to(#c13e2c));background-image:linear-gradient(to bottom,#dd4b39 0,#c13e2c 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdd4b39', endColorstr='#ffc13e2c', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border:1px solid #b12d26}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{text-shadow:0 1px rgba(0,0,0,.3);background-image:-webkit-linear-gradient(top,#dd4b39 0,#ad3727 100%);background-image:-o-linear-gradient(top,#dd4b39 0,#ad3727 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dd4b39),to(#ad3727));background-image:linear-gradient(to bottom,#dd4b39 0,#ad3727 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdd4b39', endColorstr='#ffad3727', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border:1px solid #9c2721;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.3);box-shadow:inset 0 1px 2px rgba(0,0,0,.3)}.btn-danger.focus,.btn-danger:focus{border:1px solid #c6322a;-webkit-box-shadow:inset 0 0 0 1px #fff;box-shadow:inset 0 0 0 1px #fff}.btn-danger.disabled.focus,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled].focus,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#dd4b39;background-image:-webkit-linear-gradient(top,#dd4b39 0,#d14836 100%);background-image:-o-linear-gradient(top,#dd4b39 0,#d14836 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dd4b39),to(#d14836));background-image:linear-gradient(to bottom,#dd4b39 0,#d14836 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdd4b39', endColorstr='#ffd14836', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border:1px solid #c6322a;-webkit-box-shadow:none;box-shadow:none}.btn-danger .badge{color:#c6322a;background-color:#fff}.btn-link{color:#15c}.btn-link,.btn-link.active,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link.focus,.btn-link:active,.btn-link:focus,.btn-link:hover{border-color:transparent}.btn-link.focus,.btn-link:focus,.btn-link:hover{color:#15c;background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link[disabled]:focus .btn-link[disabled].focus,.btn-link[disabled]:focus fieldset[disabled] .btn-link.focus,.btn-link[disabled]:hover,fieldset[disabled] .btn-link:focus .btn-link[disabled].focus,fieldset[disabled] .btn-link:focus fieldset[disabled] .btn-link.focus,fieldset[disabled] .btn-link:hover{color:#333}.btn-group-lg>.btn,.btn-lg{padding:9px 14px;font-size:14px;line-height:1.3;border-radius:2px}.btn-group-sm>.btn,.btn-sm{padding:3px 8px;font-size:12px;line-height:1.5;border-radius:2px}.btn-group-xs>.btn,.btn-xs{padding:2px 6px;font-size:11px;line-height:1.25;border-radius:1px}.dropdown-menu{padding:6px 0;margin:1px 0 0;font-size:13px;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-radius:0;-webkit-box-shadow:0 2px 4px rgba(0,0,0,.2);box-shadow:0 2px 4px rgba(0,0,0,.2)}.dropdown-menu .divider{height:1px;margin:8px 0;overflow:hidden;background-color:#ebebeb}.dropdown-menu>li>a{position:relative;padding:3px 30px}.dropdown-menu>li>a .glyphicon{position:absolute;top:4px;left:7px}.dropdown-menu li>a:focus,.dropdown-menu li>a:hover,.dropdown-submenu:focus>a,.dropdown-submenu:hover>a{color:#333;background-color:#eee;background-image:-webkit-linear-gradient(top,#eee 0,#eee 100%);background-image:-o-linear-gradient(top,#eee 0,#eee 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#eee),to(#eee));background-image:linear-gradient(to bottom,#eee 0,#eee 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffeeeeee', endColorstr='#ffeeeeee', GradientType=0);background-repeat:repeat-x}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{color:#333;background-color:#eee;background-image:-webkit-linear-gradient(top,#eee 0,#eee 100%);background-image:-o-linear-gradient(top,#eee 0,#eee 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#eee),to(#eee));background-image:linear-gradient(to bottom,#eee 0,#eee 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffeeeeee', endColorstr='#ffeeeeee', GradientType=0);background-repeat:repeat-x}.dropdown-header{color:#999}.dropdown-submenu{position:relative}.dropdown-submenu>.dropdown-menu{top:0;left:100%;margin-left:-1px;border-radius:0}.dropdown-submenu:hover>.dropdown-menu{display:block}.dropup .dropdown-submenu>.dropdown-menu{top:auto;bottom:0;margin-top:0;margin-bottom:-2px;border-radius:0}.dropdown-submenu>a:after{position:absolute;right:10px;margin-top:5px;content:""}.dropdown-submenu.dropdown-menu-left,.dropdown-submenu.pull-left{float:none!important}.dropdown-submenu.dropdown-menu-left>.dropdown-menu,.dropdown-submenu.pull-left>.dropdown-menu{left:-100%;margin-left:18px;border-radius:0}.btn-group-vertical>.btn:focus,.btn-group>.btn:focus{z-index:3}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:16px}.btn-group>.btn+.dropdown-toggle{-webkit-box-shadow:none;box-shadow:none}.btn-group>.dropdown-toggle:hover{-webkit-box-shadow:0 1px 1px rgba(0,0,0,.1);box-shadow:0 1px 1px rgba(0,0,0,.1)}.btn-group>.btn-danger.dropdown-toggle:hover,.btn-group>.btn-info.dropdown-toggle:hover,.btn-group>.btn-primary.dropdown-toggle:hover,.btn-group>.btn-success.dropdown-toggle:hover,.btn-group>.btn-warning.dropdown-toggle:hover{-webkit-box-shadow:0 1px 1px rgba(0,0,0,.2);box-shadow:0 1px 1px rgba(0,0,0,.2)}.btn-group>.btn.dropdown-toggle.active,.btn-group>.btn.dropdown-toggle:active{-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.btn-group>.btn-danger.dropdown-toggle.active,.btn-group>.btn-danger.dropdown-toggle:active,.btn-group>.btn-info.dropdown-toggle.active,.btn-group>.btn-info.dropdown-toggle:active,.btn-group>.btn-primary.dropdown-toggle.active,.btn-group>.btn-primary.dropdown-toggle:active,.btn-group>.btn-success.dropdown-toggle.active,.btn-group>.btn-success.dropdown-toggle:active,.btn-group>.btn-warning.dropdown-toggle.active,.btn-group>.btn-warning.dropdown-toggle:active{-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.3);box-shadow:inset 0 1px 2px rgba(0,0,0,.3)}.btn-group>.btn-sm.dropdown-toggle{padding:5px 7px}.btn-group>.btn-lg.dropdown-toggle{padding:9px 9px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 1px 6px rgba(0,0,0,.15);box-shadow:inset 0 1px 6px rgba(0,0,0,.15)}.btn-group.open .btn.dropdown-toggle{background-color:#f3f3f3;background-image:none;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.btn-group.open .btn-primary.dropdown-toggle{background-color:#4d90fe;background-image:none;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.3);box-shadow:inset 0 1px 2px rgba(0,0,0,.3)}.btn-group.open .btn-warning.dropdown-toggle{background-color:#faa937;background-image:none;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.3);box-shadow:inset 0 1px 2px rgba(0,0,0,.3)}.btn-group.open .btn-danger.dropdown-toggle{background-color:#d84a38;background-image:none;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.3);box-shadow:inset 0 1px 2px rgba(0,0,0,.3)}.btn-group.open .btn-success.dropdown-toggle{background-color:#35aa47;background-image:none;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.3);box-shadow:inset 0 1px 2px rgba(0,0,0,.3)}.btn-group.open .btn-info.dropdown-toggle{background-color:#5bc0de;background-image:none;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.3);box-shadow:inset 0 1px 2px rgba(0,0,0,.3)}.btn-lg .caret{border-width:5px 5px 0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-left-radius:2px;border-top-right-radius:2px}.btn-group-vertical>.btn:last-child:not(:first-child){border-bottom-right-radius:2px;border-bottom-left-radius:2px}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:38px;padding:9px 14px;font-size:14px;line-height:1.3;border-radius:1px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:38px;line-height:38px}select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn,textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:26px;padding:3px 8px;font-size:12px;line-height:1.5;border-radius:1px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:26px;line-height:26px}select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn,textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn{height:auto}.input-group .form-control,.input-group-addon,.input-group-btn{margin:0;border-radius:0}.input-group-addon{padding:5px 8px;font-size:13px;color:#555;border:1px solid #d9d9d9;border-top-color:silver;border-radius:2px}.input-group-addon.input-sm{padding:3px 8px;font-size:12px;border-radius:1px}.input-group-addon.input-lg{padding:9px 14px;font-size:14px;border-radius:1px}.input-group-addon input[type=radio],.input-group-addon input[type=checkbox]{margin-bottom:-3px}.nav>li.disabled>a{color:#999}.nav>li.disabled>a:focus,.nav>li.disabled>a:hover{color:#999}.nav .open>a,.nav .open>a:focus,.nav .open>a:hover{color:#fff;background-color:#999;border-color:#999}.nav-tabs>li>a{color:#666;border-radius:2px 2px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:focus,.nav-tabs>li.active>a:hover{font-weight:700;color:#333}.nav-tabs-google>li{margin:0 -1px 0 0}.nav-tabs-google>li>a{padding:12px 8px;margin:0 8px;line-height:1.4;color:#777;border:3px solid transparent;border-width:3px 0;border-radius:0}.nav-tabs-google>li>a:first-of-type{margin-left:0}.nav-tabs-google>li>a:focus,.nav-tabs-google>li>a:hover{background-color:transparent;border-top-color:transparent}.nav-tabs-google>li>a:hover{color:#000;border-bottom-color:transparent}.nav-tabs-google>li>a:active{color:#dd4b39}.nav-tabs-google>li>a:focus{color:#000;outline:0}.nav-tabs-google>li.active>a,.nav-tabs-google>li.active>a:focus,.nav-tabs-google>li.active>a:hover{color:#dd4b39;border:3px solid transparent;border-width:3px 0;border-bottom-color:#dd4b39}.nav-pills>li>a{border-radius:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:focus,.nav-pills>li.active>a:hover{color:#fff;background-color:#4d90fe}.navbar{min-height:28px;margin-bottom:18px}@media (min-width:768px){.navbar{border-radius:2px}}.navbar-brand{height:28px;padding:5px 15px;font-size:14px;line-height:18px}.navbar-brand>.glyphicon{margin-top:0}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{padding:5px 10px;margin-top:1px;margin-right:15px;margin-bottom:1px;border-radius:2px}.navbar-nav{margin:2px -15px}.navbar-nav>li>a{padding-top:5px;padding-bottom:5px;line-height:18px}@media (max-width:767px){.navbar-nav .open .dropdown-menu>li>a{line-height:18px}}@media (min-width:768px){.navbar-nav{margin:0}.navbar-nav>li>a{padding-top:5px;padding-bottom:5px}}.navbar-form{padding:10px 15px;margin-top:0;margin-right:-15px;margin-bottom:0;margin-left:-15px;-webkit-box-shadow:none;box-shadow:none}.navbar-form>.input-group .form-control{margin-top:1px;margin-bottom:1px}@media (min-width:768px){.navbar-form{padding-top:0;padding-bottom:0;margin-right:0;margin-left:0}}.navbar-form .form-control{height:26px;padding:3px 8px}.navbar .btn,.navbar-btn{padding:3px 8px;margin-top:1px;margin-bottom:1px}.navbar .btn.btn-sm,.navbar-btn.btn-sm{margin-top:1px;margin-bottom:1px}.navbar .btn.btn-xs,.navbar-btn.btn-xs{padding:2px 6px;margin-top:4px;margin-bottom:4px}.navbar-text{margin-top:5px;margin-bottom:5px}.navbar-default{background-color:#2d2d2d;border-color:#000}.navbar-default .navbar-brand{color:#999}.navbar-default .navbar-brand:focus,.navbar-default .navbar-brand:hover{color:#fff;background-color:transparent}.navbar-default .navbar-brand>.caret{border-top-color:#999;border-bottom-color:#999}.navbar-default .navbar-text{color:#999}.navbar-default .navbar-nav>li>a{color:#999}.navbar-default .navbar-nav>li>a:focus,.navbar-default .navbar-nav>li>a:hover{color:#fff;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:focus,.navbar-default .navbar-nav>.active>a:hover{color:#fff;background-color:#141414}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:focus,.navbar-default .navbar-nav>.disabled>a:hover{color:#555;background-color:transparent}.navbar-default .navbar-toggle{border-color:#222}.navbar-default .navbar-toggle:focus,.navbar-default .navbar-toggle:hover{background-color:#333}.navbar-default .navbar-toggle .icon-bar{background-color:#fff}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#000}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:focus,.navbar-default .navbar-nav>.open>a:hover{color:#fff;background-color:#141414}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#999}.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover{color:#fff;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-color:#141414}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#555;background-color:transparent}}.navbar-default .navbar-link{color:#999}.navbar-default .navbar-link:hover{color:#fff}.navbar-default .btn-link{color:#999}.navbar-default .btn-link:focus,.navbar-default .btn-link:hover{color:#fff}.navbar-default .btn-link[disabled]:focus,.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:focus,fieldset[disabled] .navbar-default .btn-link:hover{color:#555}.navbar-inverse{background-color:#fafafa;border-color:#dbdbdb}.navbar-inverse .navbar-brand{color:#999}.navbar-inverse .navbar-brand:focus,.navbar-inverse .navbar-brand:hover{color:grey;background-color:transparent}.navbar-inverse .navbar-brand>.caret{border-top-color:#999;border-bottom-color:#999}.navbar-inverse .navbar-text{color:#999}.navbar-inverse .navbar-nav>li>a{color:#999}.navbar-inverse .navbar-nav>li>a:focus,.navbar-inverse .navbar-nav>li>a:hover{color:#333;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:focus,.navbar-inverse .navbar-nav>.active>a:hover{color:#333;background-color:#e1e1e1}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:focus,.navbar-inverse .navbar-nav>.disabled>a:hover{color:#ccc;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#ddd}.navbar-inverse .navbar-toggle:focus,.navbar-inverse .navbar-toggle:hover{background-color:#ddd}.navbar-inverse .navbar-toggle .icon-bar{background-color:#888}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#e8e8e8}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:focus,.navbar-inverse .navbar-nav>.open>a:hover{color:#333;background-color:#e1e1e1}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#dbdbdb}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#dbdbdb}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#999}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover{color:#333;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover{color:#333;background-color:#e1e1e1}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#ccc;background-color:transparent}}.navbar-inverse .navbar-link{color:#999}.navbar-inverse .navbar-link:hover{color:#333}.navbar-inverse .btn-link{color:#999}.navbar-inverse .btn-link:focus,.navbar-inverse .btn-link:hover{color:#333}.navbar-inverse .btn-link[disabled]:focus,.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:focus,fieldset[disabled] .navbar-inverse .btn-link:hover{color:#ccc}.navbar-masthead{min-height:44px;margin-bottom:18px}@media (min-width:768px){.navbar-masthead{border-radius:2px}}.navbar-masthead .navbar-static-top{z-index:1005}.navbar-masthead .navbar-fixed-bottom,.navbar-masthead .navbar-fixed-top{z-index:1029}.navbar-masthead .navbar-brand{height:44px;padding:13px 15px;font-size:20px}.navbar-masthead .navbar-brand>.glyphicon{margin-top:-3px}@media (min-width:768px){.navbar>.container .navbar-masthead .navbar-brand,.navbar>.container-fluid .navbar-masthead .navbar-brand{margin-left:-15px}}.navbar-masthead .navbar-toggle{margin-top:7px;margin-right:15px;margin-bottom:7px}.navbar-masthead .navbar-nav{margin:6px -15px}@media (min-width:768px){.navbar-masthead .navbar-nav{margin:6px 0}.navbar-masthead .navbar-nav>li>a{padding-top:8px;padding-bottom:6px}}.navbar-masthead .navbar-form{padding:10px 15px;margin-top:0;margin-right:-15px;margin-bottom:0;margin-left:-15px}.navbar-masthead .navbar-form>.input-group .form-control{margin-top:7px;margin-bottom:7px}@media (max-width:767px){.navbar-masthead .navbar-form .form-group{margin-bottom:5px}}@media (min-width:768px){.navbar-masthead .navbar-form{padding-top:0;padding-bottom:0;margin-right:0;margin-left:0}}.navbar-masthead .navbar-form .form-control{height:30px;padding:5px 8px}.navbar-masthead.navbar .btn,.navbar-masthead.navbar-btn{padding:5px 8px;margin-top:7px;margin-bottom:7px}.navbar-masthead.navbar .btn.btn-sm,.navbar-masthead.navbar-btn.btn-sm{padding:3px 8px;margin-top:9px;margin-bottom:9px}.navbar-masthead.navbar .btn.btn-xs,.navbar-masthead.navbar-btn.btn-xs{padding:2px 6px;margin-top:12px;margin-bottom:12px}.navbar-masthead .navbar-text{margin-top:13px;margin-bottom:13px}.navbar-masthead.navbar-default{background-color:#f1f1f1;border-color:#e5e5e5}.navbar-masthead.navbar-default .navbar-brand{color:#777}.navbar-masthead.navbar-default .navbar-brand:focus,.navbar-masthead.navbar-default .navbar-brand:hover{color:#777;background-color:transparent}.navbar-masthead.navbar-default .navbar-brand>.caret{border-top-color:#777;border-bottom-color:#777}.navbar-masthead.navbar-default .navbar-text{color:#777}.navbar-masthead.navbar-default .navbar-nav>li>a{color:#777}.navbar-masthead.navbar-default .navbar-nav>li>a:focus,.navbar-masthead.navbar-default .navbar-nav>li>a:hover{color:#333;background-color:transparent}.navbar-masthead.navbar-default .navbar-nav>.active>a,.navbar-masthead.navbar-default .navbar-nav>.active>a:focus,.navbar-masthead.navbar-default .navbar-nav>.active>a:hover{color:#333;background-color:#f1f1f1}.navbar-masthead.navbar-default .navbar-nav>.disabled>a,.navbar-masthead.navbar-default .navbar-nav>.disabled>a:focus,.navbar-masthead.navbar-default .navbar-nav>.disabled>a:hover{color:#bbb;background-color:transparent}.navbar-masthead.navbar-default .navbar-toggle{border-color:#dcdcdc}.navbar-masthead.navbar-default .navbar-toggle:focus,.navbar-masthead.navbar-default .navbar-toggle:hover{background-color:#e4e4e4}.navbar-masthead.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-masthead.navbar-default .navbar-collapse,.navbar-masthead.navbar-default .navbar-form{border-color:#dfdfdf}.navbar-masthead.navbar-default .navbar-nav>.open>a,.navbar-masthead.navbar-default .navbar-nav>.open>a:focus,.navbar-masthead.navbar-default .navbar-nav>.open>a:hover{color:#333;background-color:#f1f1f1}@media (max-width:767px){.navbar-masthead.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-masthead.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-masthead.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover{color:#333;background-color:transparent}.navbar-masthead.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-masthead.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-masthead.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover{color:#333;background-color:#f1f1f1}.navbar-masthead.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-masthead.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-masthead.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#bbb;background-color:transparent}}.navbar-masthead.navbar-default .navbar-link{color:#777}.navbar-masthead.navbar-default .navbar-link:hover{color:#333}.navbar-masthead.navbar-default .btn-link{color:#777}.navbar-masthead.navbar-default .btn-link:focus,.navbar-masthead.navbar-default .btn-link:hover{color:#333}.navbar-masthead.navbar-default .btn-link[disabled]:focus,.navbar-masthead.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-masthead.navbar-default .btn-link:focus,fieldset[disabled] .navbar-masthead.navbar-default .btn-link:hover{color:#bbb}.navbar-masthead.navbar-inverse{background-color:#444;border-color:#333}.navbar-masthead.navbar-inverse .navbar-brand{color:#fff}.navbar-masthead.navbar-inverse .navbar-brand:focus,.navbar-masthead.navbar-inverse .navbar-brand:hover{color:#fff;background-color:transparent}.navbar-masthead.navbar-inverse .navbar-brand>.caret{border-top-color:#fff;border-bottom-color:#fff}.navbar-masthead.navbar-inverse .navbar-text{color:#999}.navbar-masthead.navbar-inverse .navbar-nav>li>a{color:#fff}.navbar-masthead.navbar-inverse .navbar-nav>li>a:focus,.navbar-masthead.navbar-inverse .navbar-nav>li>a:hover{color:#bbb;background-color:transparent}.navbar-masthead.navbar-inverse .navbar-nav>.active>a,.navbar-masthead.navbar-inverse .navbar-nav>.active>a:focus,.navbar-masthead.navbar-inverse .navbar-nav>.active>a:hover{color:#bbb;background-color:#444}.navbar-masthead.navbar-inverse .navbar-nav>.disabled>a,.navbar-masthead.navbar-inverse .navbar-nav>.disabled>a:focus,.navbar-masthead.navbar-inverse .navbar-nav>.disabled>a:hover{color:#777;background-color:transparent}.navbar-masthead.navbar-inverse .navbar-toggle{border-color:#222}.navbar-masthead.navbar-inverse .navbar-toggle:focus,.navbar-masthead.navbar-inverse .navbar-toggle:hover{background-color:#333}.navbar-masthead.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-masthead.navbar-inverse .navbar-collapse,.navbar-masthead.navbar-inverse .navbar-form{border-color:#323232}.navbar-masthead.navbar-inverse .navbar-nav>.open>a,.navbar-masthead.navbar-inverse .navbar-nav>.open>a:focus,.navbar-masthead.navbar-inverse .navbar-nav>.open>a:hover{color:#bbb;background-color:#444}@media (max-width:767px){.navbar-masthead.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#333}.navbar-masthead.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#333}.navbar-masthead.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#fff}.navbar-masthead.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-masthead.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover{color:#bbb;background-color:transparent}.navbar-masthead.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-masthead.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-masthead.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover{color:#bbb;background-color:#444}.navbar-masthead.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-masthead.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-masthead.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#777;background-color:transparent}}.navbar-masthead.navbar-inverse .navbar-link{color:#fff}.navbar-masthead.navbar-inverse .navbar-link:hover{color:#bbb}.navbar-masthead.navbar-inverse .btn-link{color:#fff}.navbar-masthead.navbar-inverse .btn-link:focus,.navbar-masthead.navbar-inverse .btn-link:hover{color:#bbb}.navbar-masthead.navbar-inverse .btn-link[disabled]:focus,.navbar-masthead.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-masthead.navbar-inverse .btn-link:focus,fieldset[disabled] .navbar-masthead.navbar-inverse .btn-link:hover{color:#777}.navbar-toolbar{min-height:36px;margin-bottom:18px}@media (min-width:768px){.navbar-toolbar{border-radius:2px}}.navbar-toolbar .navbar-static-top{z-index:1008}.navbar-toolbar .navbar-fixed-bottom,.navbar-toolbar .navbar-fixed-top{z-index:1028}.navbar-toolbar .navbar-brand{height:36px;padding:9px 15px;font-size:16px;font-weight:700}@media (min-width:768px){.navbar>.container .navbar-toolbar .navbar-brand,.navbar>.container-fluid .navbar-toolbar .navbar-brand{margin-left:-15px}}.navbar-toolbar .navbar-toggle{margin-top:3px;margin-right:15px;margin-bottom:3px}.navbar-toolbar .navbar-nav{margin:4px -15px}.navbar-toolbar .navbar-nav>li{position:relative}.navbar-toolbar .navbar-nav>li>a{padding:9px 15px}.navbar-toolbar .navbar-nav>li>a:focus,.navbar-toolbar .navbar-nav>li>a:hover{text-decoration:underline}.navbar-toolbar .navbar-nav>li>.dropdown-menu{margin-top:1px}.navbar-toolbar .navbar-nav>.active>a{font-weight:700}.navbar-toolbar .navbar-nav>.active>a:before{position:absolute;bottom:-1px;left:50%;display:inline-block;margin-left:-8px;content:'';border-right:8px solid transparent;border-bottom:8px solid transparent;border-left:8px solid transparent}.navbar-toolbar .navbar-nav>.active>a:after{position:absolute;bottom:-1px;left:50%;display:inline-block;margin-left:-7px;content:'';border-right:7px solid transparent;border-bottom:7px solid transparent;border-left:7px solid transparent}@media (min-width:768px){.navbar-toolbar .navbar-nav{margin:0}.navbar-toolbar .navbar-nav>li>a{padding-top:9px;padding-bottom:9px}}.navbar-toolbar .navbar-form{padding:10px 15px;margin-top:0;margin-right:-15px;margin-bottom:0;margin-left:-15px}.navbar-toolbar .navbar-form>.input-group .form-control{margin-top:3px;margin-bottom:3px}@media (max-width:767px){.navbar-toolbar .navbar-form .form-group{margin-bottom:5px}}@media (min-width:768px){.navbar-toolbar .navbar-form{padding-top:0;padding-bottom:0;margin-right:0;margin-left:0}}.navbar-toolbar .navbar-form .form-control{height:30px;padding:5px 8px}.navbar-toolbar .dropdown-menu{border-top:1px none}.navbar-toolbar.navbar .btn,.navbar-toolbar.navbar-btn{padding:5px 8px;margin-top:3px;margin-bottom:3px}.navbar-toolbar.navbar .btn.btn-sm,.navbar-toolbar.navbar-btn.btn-sm{padding:3px 8px;margin-top:5px;margin-bottom:5px}.navbar-toolbar.navbar .btn.btn-xs,.navbar-toolbar.navbar-btn.btn-xs{padding:2px 6px;margin-top:8px;margin-bottom:8px}.navbar-toolbar .navbar-text{margin-top:9px;margin-bottom:9px}.navbar-toolbar.navbar-default{background-color:#fff;border-color:#ebebeb}.navbar-toolbar.navbar-default .navbar-brand{color:#dd4b39}.navbar-toolbar.navbar-default .navbar-brand:focus,.navbar-toolbar.navbar-default .navbar-brand:hover{color:#dd4b39;background-color:transparent}.navbar-toolbar.navbar-default .navbar-brand>.caret{border-top-color:#dd4b39;border-bottom-color:#dd4b39}.navbar-toolbar.navbar-default .navbar-text{color:#777}.navbar-toolbar.navbar-default .navbar-nav>li>a{color:#777}.navbar-toolbar.navbar-default .navbar-nav>li>a:focus,.navbar-toolbar.navbar-default .navbar-nav>li>a:hover{color:#333;background-color:transparent}.navbar-toolbar.navbar-default .navbar-nav>.active>a,.navbar-toolbar.navbar-default .navbar-nav>.active>a:focus,.navbar-toolbar.navbar-default .navbar-nav>.active>a:hover{color:#333;background-color:#f2f2f2}.navbar-toolbar.navbar-default .navbar-nav>.active>a:before{border-bottom:8px solid #ebebeb}.navbar-toolbar.navbar-default .navbar-nav>.active>a:after{border-bottom:7px solid #fff}.navbar-toolbar.navbar-default .navbar-nav>.disabled>a,.navbar-toolbar.navbar-default .navbar-nav>.disabled>a:focus,.navbar-toolbar.navbar-default .navbar-nav>.disabled>a:hover{color:#bbb;background-color:transparent}.navbar-toolbar.navbar-default .navbar-toggle{border-color:#dcdcdc}.navbar-toolbar.navbar-default .navbar-toggle:focus,.navbar-toolbar.navbar-default .navbar-toggle:hover{background-color:#e4e4e4}.navbar-toolbar.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-toolbar.navbar-default .navbar-collapse,.navbar-toolbar.navbar-default .navbar-form{border-color:#ededed}.navbar-toolbar.navbar-default .navbar-nav>.open>a,.navbar-toolbar.navbar-default .navbar-nav>.open>a:focus,.navbar-toolbar.navbar-default .navbar-nav>.open>a:hover{color:#333;background-color:#f2f2f2}@media (max-width:767px){.navbar-toolbar.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-toolbar.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-toolbar.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover{color:#333;background-color:transparent}.navbar-toolbar.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-toolbar.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-toolbar.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover{color:#333;background-color:#f2f2f2}.navbar-toolbar.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-toolbar.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-toolbar.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#bbb;background-color:transparent}}.navbar-toolbar.navbar-default .navbar-link{color:#777}.navbar-toolbar.navbar-default .navbar-link:hover{color:#333}.navbar-toolbar.navbar-default .btn-link{color:#777}.navbar-toolbar.navbar-default .btn-link:focus,.navbar-toolbar.navbar-default .btn-link:hover{color:#333}.navbar-toolbar.navbar-default .btn-link[disabled]:focus,.navbar-toolbar.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-toolbar.navbar-default .btn-link:focus,fieldset[disabled] .navbar-toolbar.navbar-default .btn-link:hover{color:#bbb}.navbar-toolbar.navbar-inverse{background-color:#444;border-color:#333}.navbar-toolbar.navbar-inverse .navbar-brand{color:#fff}.navbar-toolbar.navbar-inverse .navbar-brand:focus,.navbar-toolbar.navbar-inverse .navbar-brand:hover{color:#fff;background-color:transparent}.navbar-toolbar.navbar-inverse .navbar-brand>.caret{border-top-color:#fff;border-bottom-color:#fff}.navbar-toolbar.navbar-inverse .navbar-text{color:#999}.navbar-toolbar.navbar-inverse .navbar-nav>li>a{color:#fff}.navbar-toolbar.navbar-inverse .navbar-nav>li>a:focus,.navbar-toolbar.navbar-inverse .navbar-nav>li>a:hover{color:#fff;background-color:transparent}.navbar-toolbar.navbar-inverse .navbar-nav>.active>a,.navbar-toolbar.navbar-inverse .navbar-nav>.active>a:focus,.navbar-toolbar.navbar-inverse .navbar-nav>.active>a:hover{color:#fff;background-color:#444}.navbar-toolbar.navbar-inverse .navbar-nav>.active>a:before{border-bottom:8px solid #333}.navbar-toolbar.navbar-inverse .navbar-nav>.active>a:after{border-bottom:7px solid #fff}.navbar-toolbar.navbar-inverse .navbar-nav>.disabled>a,.navbar-toolbar.navbar-inverse .navbar-nav>.disabled>a:focus,.navbar-toolbar.navbar-inverse .navbar-nav>.disabled>a:hover{color:#777;background-color:transparent}.navbar-toolbar.navbar-inverse .navbar-toggle{border-color:#222}.navbar-toolbar.navbar-inverse .navbar-toggle:focus,.navbar-toolbar.navbar-inverse .navbar-toggle:hover{background-color:#333}.navbar-toolbar.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-toolbar.navbar-inverse .navbar-collapse,.navbar-toolbar.navbar-inverse .navbar-form{border-color:#323232}.navbar-toolbar.navbar-inverse .navbar-nav>.open>a,.navbar-toolbar.navbar-inverse .navbar-nav>.open>a:focus,.navbar-toolbar.navbar-inverse .navbar-nav>.open>a:hover{color:#fff;background-color:#444}@media (max-width:767px){.navbar-toolbar.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#333}.navbar-toolbar.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#333}.navbar-toolbar.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#fff}.navbar-toolbar.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-toolbar.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover{color:#fff;background-color:transparent}.navbar-toolbar.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-toolbar.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-toolbar.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-color:#444}.navbar-toolbar.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-toolbar.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-toolbar.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#777;background-color:transparent}}.navbar-toolbar.navbar-inverse .navbar-link{color:#fff}.navbar-toolbar.navbar-inverse .navbar-link:hover{color:#fff}.navbar-toolbar.navbar-inverse .btn-link{color:#fff}.navbar-toolbar.navbar-inverse .btn-link:focus,.navbar-toolbar.navbar-inverse .btn-link:hover{color:#fff}.navbar-toolbar.navbar-inverse .btn-link[disabled]:focus,.navbar-toolbar.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-toolbar.navbar-inverse .btn-link:focus,fieldset[disabled] .navbar-toolbar.navbar-inverse .btn-link:hover{color:#777}.navbar-static-top{border-radius:0}.navbar-fixed-top,.navbar-static-top{border-width:1px 0}.navbar-fixed-bottom{border-width:1px 0}.navbar-fixed-bottom,.navbar-fixed-top{position:fixed;right:0;left:0;border-radius:0}.navbar-fixed-bottom,.navbar-fixed-top{border-radius:0}.navbar-fixed-top{top:0}.navbar-fixed-bottom{bottom:0;margin-bottom:0}.navbar-btn{padding:3px 8px;margin-top:1px}.btn.navbar-masthead-btn{margin-top:7px}.btn.navbar-toolbar-btn{margin-top:3px}.navbar-link{color:#999}.navbar-link:hover{color:#fff}.navbar-inverse .navbar-link{color:#999}.navbar-inverse .navbar-link:hover{color:#333}.navbar-form .checkbox-inline,.navbar-form .radio-inline{color:#999}.breadcrumb{padding:13px 15px;margin-bottom:18px;background-color:#f3f3f3;border-radius:2px}.breadcrumb>li+li{position:relative;display:inline-block;margin-left:20px}.breadcrumb>li+li:before{border-radius:5px}.breadcrumb>li+li:after,.breadcrumb>li+li:before{position:absolute;width:0;height:0;content:""}.breadcrumb>li+li:before{border:7px solid transparent}.breadcrumb>li+li:after{border:5px solid transparent}.breadcrumb>li+li:after,.breadcrumb>li+li:before{top:9px;left:100%}.breadcrumb>li+li:before{margin-top:-7px;border-left:7px solid;border-left-color:#777}.breadcrumb>li+li:after{margin-top:-5px;border-left:5px solid #f3f3f3}.breadcrumb>li+li:after,.breadcrumb>li+li:before{left:-16px}.breadcrumb>li+li:before{color:#999;content:""}.breadcrumb>li>a{color:#999}.breadcrumb>li>a:hover{color:#000}.breadcrumb>.active,.breadcrumb>.active>a{color:#000}.breadcrumb-inverse{background-color:#393832}.breadcrumb-inverse>li+li{position:relative;display:inline-block}.breadcrumb-inverse>li+li:before{border-radius:5px}.breadcrumb-inverse>li+li:after,.breadcrumb-inverse>li+li:before{position:absolute;width:0;height:0;content:""}.breadcrumb-inverse>li+li:before{border:7px solid transparent}.breadcrumb-inverse>li+li:after{border:5px solid transparent}.breadcrumb-inverse>li+li:after,.breadcrumb-inverse>li+li:before{top:9px;left:100%}.breadcrumb-inverse>li+li:before{margin-top:-7px;border-left:7px solid;border-left-color:#666}.breadcrumb-inverse>li+li:after{margin-top:-5px;border-left:5px solid #393832}.breadcrumb-inverse>li+li:after,.breadcrumb-inverse>li+li:before{left:-16px}.breadcrumb-inverse>li>a{color:#999}.breadcrumb-inverse>li>a:hover{color:#fff}.breadcrumb-inverse>.active,.breadcrumb-inverse>.active>a{color:#fff}.breadcrumb-sm{padding:4px 15px;background-color:#fff;border-bottom:1px solid #ebebeb}.breadcrumb-sm.breadcrumb-inverse{background-color:#393832}.pagination{margin:18px 0;border-radius:2px}.pagination>li>a,.pagination>li>span{padding:5px 12px;line-height:1.4;color:#333;background-color:#f3f3f3;border:1px solid #dcdcdc}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-top-left-radius:2px;border-bottom-left-radius:2px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-top-right-radius:2px;border-bottom-right-radius:2px}.pagination>li>a:focus,.pagination>li>a:hover,.pagination>li>span:focus,.pagination>li>span:hover{color:#333;background-color:#f5f5f5;border-color:#c6c6c6;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.1);box-shadow:0 1px 1px rgba(0,0,0,.1)}.pagination>li>a:active{background-color:#f4f4f4;background-image:-webkit-linear-gradient(top,#f6f6f6 0,#f1f1f1 100%);background-image:-o-linear-gradient(top,#f6f6f6 0,#f1f1f1 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f6f6f6),to(#f1f1f1));background-image:linear-gradient(to bottom,#f6f6f6 0,#f1f1f1 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff6f6f6', endColorstr='#fff1f1f1', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.pagination>.active>a,.pagination>.active>a:focus,.pagination>.active>a:hover,.pagination>.active>span,.pagination>.active>span:focus,.pagination>.active>span:hover{color:#4d90fe;background-color:#f5f5f5;border-color:#c6c6c6;-webkit-box-shadow:none;box-shadow:none}.pagination>.disabled>a,.pagination>.disabled>a:focus,.pagination>.disabled>a:hover,.pagination>.disabled>span,.pagination>.disabled>span:focus,.pagination>.disabled>span:hover{color:#b3b3b3;text-shadow:none;background-color:#f3f3f3;background-image:-webkit-linear-gradient(top,#f5f5f5 0,#f1f1f1 100%);background-image:-o-linear-gradient(top,#f5f5f5 0,#f1f1f1 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#f1f1f1));background-image:linear-gradient(to bottom,#f5f5f5 0,#f1f1f1 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#fff1f1f1', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#d9d9d9;-webkit-box-shadow:none;box-shadow:none}.pagination-lg>li>a,.pagination-lg>li>span{padding:9px 14px;font-size:14px;line-height:1.3}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-top-left-radius:1px;border-bottom-left-radius:1px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-top-right-radius:1px;border-bottom-right-radius:1px}.pagination-sm>li>a,.pagination-sm>li>span{padding:3px 8px;font-size:12px;line-height:1.5}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-top-left-radius:1px;border-bottom-left-radius:1px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-top-right-radius:1px;border-bottom-right-radius:1px}.pager{margin:18px 0}.pager li>a,.pager li>span{padding:11px 24px;overflow:visible;font-size:14px;color:#777;text-decoration:none;white-space:nowrap;cursor:default;background-color:#fff;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);border:1px solid #5b5b5b;border:1px solid rgba(0,0,0,.1);border-radius:2px;outline:0;-webkit-box-shadow:0 2px 1px rgba(0,0,0,.1),0 0 1px rgba(0,0,0,.1);box-shadow:0 2px 1px rgba(0,0,0,.1),0 0 1px rgba(0,0,0,.1)}.pager li>a:focus,.pager li>a:hover{color:#444;background-color:#fff}.pager li>a:active{color:#444;background-color:#fff}.pager li .icon-prev{position:relative;display:inline-block;padding-right:8px}.pager li .icon-prev:before{border-radius:5px}.pager li .icon-prev:after,.pager li .icon-prev:before{position:absolute;width:0;height:0;content:""}.pager li .icon-prev:before{border:7px solid transparent}.pager li .icon-prev:after{border:4px solid transparent}.pager li .icon-prev:after,.pager li .icon-prev:before{top:-5px;right:100%}.pager li .icon-prev:before{margin-top:-7px;border-right:7px solid;border-right-color:inherit}.pager li .icon-prev:after{margin-top:-4px;border-right:4px solid #fff}.pager li .icon-next{position:relative;display:inline-block;padding-left:8px}.pager li .icon-next:before{border-radius:5px}.pager li .icon-next:after,.pager li .icon-next:before{position:absolute;width:0;height:0;content:""}.pager li .icon-next:before{border:7px solid transparent}.pager li .icon-next:after{border:4px solid transparent}.pager li .icon-next:after,.pager li .icon-next:before{top:-5px;left:100%}.pager li .icon-next:before{margin-top:-7px;border-left:7px solid;border-left-color:inherit}.pager li .icon-next:after{margin-top:-4px;border-left:4px solid #fff}.pager .disabled>a,.pager .disabled>a:focus,.pager .disabled>a:hover,.pager .disabled>span{color:#b3b3b3;background-color:#fafafa;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);border-color:#d9d9d9;-webkit-box-shadow:none;box-shadow:none}.pager .disabled .icon-prev{position:relative;display:inline-block;padding-right:8px}.pager .disabled .icon-prev:before{border-radius:5px}.pager .disabled .icon-prev:after,.pager .disabled .icon-prev:before{position:absolute;width:0;height:0;content:""}.pager .disabled .icon-prev:before{border:7px solid transparent}.pager .disabled .icon-prev:after{border:4px solid transparent}.pager .disabled .icon-prev:after,.pager .disabled .icon-prev:before{top:-5px;right:100%}.pager .disabled .icon-prev:before{margin-top:-7px;border-right:7px solid;border-right-color:#b3b3b3}.pager .disabled .icon-prev:after{margin-top:-4px;border-right:4px solid #fafafa}.pager .disabled .icon-next{position:relative;display:inline-block;padding-left:8px}.pager .disabled .icon-next:before{border-radius:5px}.pager .disabled .icon-next:after,.pager .disabled .icon-next:before{position:absolute;width:0;height:0;content:""}.pager .disabled .icon-next:before{border:7px solid transparent}.pager .disabled .icon-next:after{border:4px solid transparent}.pager .disabled .icon-next:after,.pager .disabled .icon-next:before{top:-5px;left:100%}.pager .disabled .icon-next:before{margin-top:-7px;border-left:7px solid;border-left-color:#b3b3b3}.pager .disabled .icon-next:after{margin-top:-4px;border-left:4px solid #fafafa}.label{font-size:80%;border-radius:0}.label-default{background-color:#999}.label-default[href]:focus,.label-default[href]:hover{background-color:grey}.label-primary{background-color:#4d90fe}.label-primary[href]:focus,.label-primary[href]:hover{background-color:#1a70fe}.label-success{background-color:#35aa47}.label-success[href]:focus,.label-success[href]:hover{background-color:#298337}.label-info{background-color:#5bc0de}.label-info[href]:focus,.label-info[href]:hover{background-color:#31b0d5}.label-warning{background-color:#faa937}.label-warning[href]:focus,.label-warning[href]:hover{background-color:#f89306}.label-danger{background-color:#d84a38}.label-danger[href]:focus,.label-danger[href]:hover{background-color:#b93524}.badge{font-size:12px}.btn-group-xs>.btn .badge,.btn-xs .badge{font-size:11px}.list-group-item.active>.badge,li.list-group-item.active a>.badge{color:#fff;background-color:#dd4b39}.nav-pills>.active>a>.badge{color:#15c;background-color:#fff}.jumbotron{color:inherit;background-color:#eee}.jumbotron .h1,.jumbotron h1{color:inherit}.jumbotron p{font-size:20px}.container .jumbotron,.container-fluid .jumbotron{border-radius:1px}@media screen and (min-width:768px){.jumbotron .h1,.jumbotron h1{font-size:59px}}.thumbnail{display:block;padding:0;margin-bottom:18px;line-height:1.4;background-color:#fff;border:1px solid #fff;border-radius:0}a.thumbnail.active,a.thumbnail:focus,a.thumbnail:hover{border-color:#fff;-webkit-box-shadow:0 0 0 1px #dedede;box-shadow:0 0 0 1px #dedede}.thumbnail .caption{padding:9px 4px;color:#000}.alert{padding:8px;margin-bottom:18px;border-radius:2px}.alert .alert-link{font-weight:700}.alert-dismissable,.alert-dismissible{padding-right:28px}.alert-success{color:#3c763d;background-color:#dff0d8;border-color:#a3d48e}.alert-success hr{border-top-color:#93cd7c}.alert-success .alert-link{color:#2b542c}.alert-info{color:#31708f;background-color:#d9edf7;border-color:#85c5e5}.alert-info hr{border-top-color:#70bbe1}.alert-info .alert-link{color:#245269}.alert-warning{color:#333;background-color:#f9edbe;border-color:#f0c36d}.alert-warning hr{border-top-color:#eeb956}.alert-warning .alert-link{color:#1a1a1a}.alert-danger{color:#a94442;background-color:#f2dede;border-color:#d59595}.alert-danger hr{border-top-color:#ce8383}.alert-danger .alert-link{color:#843534}.alert-danger,.alert-info,.alert-success,.alert-warning{text-shadow:0 1px 0 rgba(255,255,255,.5)}.progress{height:14px;height:18px;padding:1px;margin-bottom:18px;font-size:12px;background-color:transparent;background-image:none;border:1px solid #999;border-radius:0;-webkit-box-shadow:none;box-shadow:none}.progress-bar{line-height:1.25;background-color:#6188f5;background-image:none;-webkit-box-shadow:none;box-shadow:none}.progress-bar-striped,.progress-striped .progress-bar{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;background-size:40px 40px}.progress-bar-success{background-color:#2f973f}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-info{background-color:#53bddc}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-warning{background-color:#fbb450}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-danger{background-color:#c13e2c}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.list-group-item{color:#222;background-color:#fff;border:1px solid #e5e5e5}.list-group-item:first-child{border-top-left-radius:0;border-top-right-radius:0}.list-group-item:last-child{border-bottom-right-radius:0;border-bottom-left-radius:0}.list-group-item .dropdown{display:none}.list-group-item .dropdown-toggle{display:inline-block;padding:5px 6px 5px 5px;color:#222}a.list-group-item,button.list-group-item{color:#555}a.list-group-item .list-group-item-heading,button.list-group-item .list-group-item-heading{color:#333}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{font-weight:700;color:#dd4b39;background-color:transparent;border-color:#e5e5e5;border-left:4px solid #dd4b39;border-left-color:#dd4b39}.list-group-item.active .list-group-item-text,.list-group-item.active:focus .list-group-item-text,.list-group-item.active:hover .list-group-item-text{font-weight:400;color:#888}.list-group-item.active:focus,.list-group-item.active:hover{background-color:#eee}a.list-group-item:focus,a.list-group-item:hover,li.list-group-item a:focus,li.list-group-item a:hover{color:#555;text-decoration:none;background-color:#eee}li.list-group-item{padding:0;margin-bottom:0;border:0 none}li.list-group-item>a{display:block;padding:5px 17px;margin:0 0 0 14px;color:#222}li.list-group-item.active,li.list-group-item.active:focus,li.list-group-item.active:hover{background-color:transparent}li.list-group-item.active:focus>a,li.list-group-item.active:hover>a,li.list-group-item.active>a{margin-left:10px;color:#dd4b39}.list-group-item-success{color:#3c763d;background-color:#dff0d8}a.list-group-item-success,button.list-group-item-success{color:#3c763d}a.list-group-item-success .list-group-item-heading,button.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:focus,a.list-group-item-success:hover,button.list-group-item-success:focus,button.list-group-item-success:hover{color:#3c763d;background-color:#d0e9c6}a.list-group-item-success.active,a.list-group-item-success.active:focus,a.list-group-item-success.active:hover,button.list-group-item-success.active,button.list-group-item-success.active:focus,button.list-group-item-success.active:hover{color:#fff;background-color:#3c763d;border-color:#3c763d}.list-group-item-info{color:#31708f;background-color:#d9edf7}a.list-group-item-info,button.list-group-item-info{color:#31708f}a.list-group-item-info .list-group-item-heading,button.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:focus,a.list-group-item-info:hover,button.list-group-item-info:focus,button.list-group-item-info:hover{color:#31708f;background-color:#c4e3f3}a.list-group-item-info.active,a.list-group-item-info.active:focus,a.list-group-item-info.active:hover,button.list-group-item-info.active,button.list-group-item-info.active:focus,button.list-group-item-info.active:hover{color:#fff;background-color:#31708f;border-color:#31708f}.list-group-item-warning{color:#333;background-color:#f9edbe}a.list-group-item-warning,button.list-group-item-warning{color:#333}a.list-group-item-warning .list-group-item-heading,button.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:focus,a.list-group-item-warning:hover,button.list-group-item-warning:focus,button.list-group-item-warning:hover{color:#333;background-color:#f7e7a7}a.list-group-item-warning.active,a.list-group-item-warning.active:focus,a.list-group-item-warning.active:hover,button.list-group-item-warning.active,button.list-group-item-warning.active:focus,button.list-group-item-warning.active:hover{color:#fff;background-color:#333;border-color:#333}.list-group-item-danger{color:#a94442;background-color:#f2dede}a.list-group-item-danger,button.list-group-item-danger{color:#a94442}a.list-group-item-danger .list-group-item-heading,button.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:focus,a.list-group-item-danger:hover,button.list-group-item-danger:focus,button.list-group-item-danger:hover{color:#a94442;background-color:#ebcccc}a.list-group-item-danger.active,a.list-group-item-danger.active:focus,a.list-group-item-danger.active:hover,button.list-group-item-danger.active,button.list-group-item-danger.active:focus,button.list-group-item-danger.active:hover{color:#fff;background-color:#a94442;border-color:#a94442}.list-group-item-wrapper{margin-left:14px}.list-group-item-wrapper:hover>.dropdown{display:block}.list-group-item-wrapper>a{display:block;padding:5px 17px;margin:0;color:#222}.list-group-item-wrapper>.dropdown:hover+a{background-color:#eee}.list-group-item-wrapper>.dropdown.open{display:block}.list-group-item-wrapper>.dropdown.open+a{background-color:#eee}.list-group-item-wrapper>.dropdown>.dropdown-menu{margin-top:0}.list-group-header{display:block;padding:10px 30px 10px 15px;font-size:11px;font-weight:700;line-height:1.4;color:#999;text-shadow:0 1px 0 rgba(255,255,255,.5);text-transform:uppercase}li.list-group-header{padding:3px 15px}.list-group .list-group-header{margin-top:9px}.list-group-item-menu{padding:0;margin:0;border:0 none;border-radius:0;-webkit-box-shadow:none;box-shadow:none}.list-group-item-menu .list-group-item-wrapper>a{padding-left:30px}.list-group-item-menu .list-group-item-menu .list-group-item-wrapper>a{padding-left:44px}.list-group-item-menu>.list-group-item .collapse-caret{margin-left:28px}.collapse-caret{position:absolute;z-index:1;display:inline-block;width:17px;height:28px;margin-left:14px}.collapse-caret:before{position:absolute;top:12px;left:5px;margin-left:0;content:'';border-bottom:0 dotted}.collapse-caret:hover{background-color:#eee}.collapse-caret.collapsed:before{top:10px;left:6px}.list-group .divider{height:1px;margin:8px 0;margin-right:15px;margin-left:15px;overflow:hidden;background-color:#e5e5e5}.panel{word-wrap:break-word;background-color:#fff;border:1px solid transparent;border-bottom-width:2px;border-radius:3px;-webkit-box-shadow:none;box-shadow:none}.panel-body{padding:15px 20px}.panel-heading{padding:15px 20px;border-top-left-radius:3px;border-top-right-radius:3px}.panel-title{font-size:16px}.panel-footer{padding:15px 20px;background-color:#f8f8f8;border-top:1px solid #e5e5e5;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.list-group{padding:15px 20px;padding-top:0}.panel>.list-group:first-child .list-group-item:first-child{border-top-left-radius:2px;border-top-right-radius:2px}.panel>.list-group:last-child .list-group-item:last-child{border-bottom-right-radius:2px;border-bottom-left-radius:2px}.panel>.panel-collapse>.table caption,.panel>.table caption,.panel>.table-responsive>.table caption{padding-right:15px 20px;padding-left:15px 20px}.panel>.table-responsive:first-child>.table:first-child,.panel>.table:first-child{border-top-left-radius:2px;border-top-right-radius:2px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table:first-child>thead:first-child>tr:first-child{border-top-left-radius:2px;border-top-right-radius:2px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child{border-top-left-radius:2px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child{border-top-right-radius:2px}.panel>.table-responsive:last-child>.table:last-child,.panel>.table:last-child{border-bottom-right-radius:2px;border-bottom-left-radius:2px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-right-radius:2px;border-bottom-left-radius:2px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:2px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:2px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body{border-top:1px solid #ddd}.panel-default{border-color:#d8d8d8}.panel-default>.panel-heading{color:#333;background-color:#fff;border-color:#fff}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#d8d8d8}.panel-default>.panel-heading .badge{color:#fff;background-color:#333}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#d8d8d8}.panel-primary{border-color:#4d90fe}.panel-primary>.panel-heading{color:#fff;background-color:#4d90fe;border-color:#4d90fe}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#4d90fe}.panel-primary>.panel-heading .badge{color:#4d90fe;background-color:#fff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#4d90fe}.panel-success{border-color:#a3d48e}.panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#a3d48e}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#a3d48e}.panel-success>.panel-heading .badge{color:#dff0d8;background-color:#3c763d}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#a3d48e}.panel-info{border-color:#85c5e5}.panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#85c5e5}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#85c5e5}.panel-info>.panel-heading .badge{color:#d9edf7;background-color:#31708f}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#85c5e5}.panel-warning{border-color:#f0c36d}.panel-warning>.panel-heading{color:#333;background-color:#f9edbe;border-color:#f0c36d}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#f0c36d}.panel-warning>.panel-heading .badge{color:#f9edbe;background-color:#333}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#f0c36d}.panel-danger{border-color:#d59595}.panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#d59595}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#d59595}.panel-danger>.panel-heading .badge{color:#f2dede;background-color:#a94442}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#d59595}.panel-group{margin-bottom:18px}.panel-group .panel{border-color:transparent;border-radius:0}.panel-group .panel+.panel{margin-top:-3px}.panel-group .panel-heading{padding:0 15px;background-color:#fafafa;border-top:1px dashed #ccc;border-bottom:1px dashed #ccc}.panel-group .panel-heading a{display:block;padding:10px 0 9px;color:#444;text-decoration:none}.panel-group .panel-heading a:before{margin-right:7px;content:"\e082"}.panel-group .panel-heading a:hover{background-color:#f5f5f5}.panel-group .panel-heading a:focus{outline:0}.panel-group .panel-heading a.collapsed:before{margin-right:7px;content:"\e081"}.panel-group .panel-heading .panel-title{font-size:13px}.panel-group .panel-heading+.panel-collapse>.list-group,.panel-group .panel-heading+.panel-collapse>.panel-body{border-top:0 none}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:0 none}.well{background-color:#f1f1f1;border:1px solid #e5e5e5;border-radius:0;-webkit-box-shadow:none;box-shadow:none}.well-lg{border-radius:0}.well-sm{border-radius:0}.scrollable::-webkit-scrollbar{width:10px;height:16px}.scrollable::-webkit-scrollbar:hover{background-color:#f3f3f3;border:1px solid #dbdbdb}.scrollable::-webkit-scrollbar-button:end:increment,.scrollable::-webkit-scrollbar-button:start:decrement{display:block;height:0;background-color:transparent}.scrollable::-webkit-scrollbar-track{-webkit-background-clip:padding-box;background-clip:padding-box;border:solid transparent;border-width:0 0 0 4px}.scrollable::-webkit-scrollbar-track-piece{background-color:transparent;border-radius:0}.scrollable::-webkit-scrollbar-thumb{background-color:#515151;background-color:rgba(0,0,0,.2);-webkit-background-clip:padding-box;background-clip:padding-box;border:solid transparent;border-width:0;-webkit-box-shadow:inset 1px 1px 0 rgba(0,0,0,.1),inset 0 -1px 0 rgba(0,0,0,.07);box-shadow:inset 1px 1px 0 rgba(0,0,0,.1),inset 0 -1px 0 rgba(0,0,0,.07)}.scrollable::-webkit-scrollbar-thumb:hover{background-color:#949494}.scrollable::-webkit-scrollbar-thumb:active{background-color:#3b3b3b;background-color:rgba(0,0,0,.5);-webkit-box-shadow:inset 1px 1px 3px rgba(0,0,0,.35);box-shadow:inset 1px 1px 3px rgba(0,0,0,.35)}.scrollable::-webkit-scrollbar-thumb:horizontal,.scrollable::-webkit-scrollbar-thumb:vertical{background-color:#c6c6c6;border-radius:0}.modal-content{color:#222;border:1px solid #aaa;border:1px solid rgba(0,0,0,.333);border-radius:0;-webkit-box-shadow:0 4px 16px rgba(0,0,0,.2);box-shadow:0 4px 16px rgba(0,0,0,.2)}.modal-backdrop{background-color:#fff}.modal-header .close{font-weight:400;filter:alpha(opacity=40);opacity:.4}.modal-body{padding:15px}.tooltip{font-family:Arial,Helvetica,sans-serif;font-size:11px;font-style:normal;font-weight:400;font-weight:700;line-height:1.4;line-height:1.25;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-break:break-word;word-spacing:normal;word-wrap:normal;white-space:normal;line-break:auto}.tooltip.in{filter:alpha(opacity=100);opacity:1}.tooltip-inner{padding:7px 9px;background-color:#2a2a2a;border:1px solid #fff;border-radius:0}.tooltip-arrow:before{position:absolute;z-index:-1;content:" ";border:7px solid transparent}.tooltip.top .tooltip-arrow,.tooltip.top-left .tooltip-arrow,.tooltip.top-right .tooltip-arrow{bottom:1px;border-top-color:#2a2a2a}.tooltip.top .tooltip-arrow:before,.tooltip.top-left .tooltip-arrow:before,.tooltip.top-right .tooltip-arrow:before{top:-5px;left:-7px;border-top-color:#fff;border-bottom:0 dotted}.tooltip.right .tooltip-arrow{left:1px;border-right-color:#2a2a2a}.tooltip.right .tooltip-arrow:before{top:-7px;right:-5px;border-right-color:#fff;border-left:0 dotted}.tooltip.left .tooltip-arrow{right:1px;border-left-color:#2a2a2a}.tooltip.left .tooltip-arrow:before{top:-7px;left:-5px;border-right:0 dotted;border-left-color:#fff}.tooltip.bottom .tooltip-arrow,.tooltip.bottom-left .tooltip-arrow,.tooltip.bottom-right .tooltip-arrow{top:1px;border-bottom-color:#2a2a2a}.tooltip.bottom .tooltip-arrow:before,.tooltip.bottom-left .tooltip-arrow:before,.tooltip.bottom-right .tooltip-arrow:before{bottom:-5px;left:-7px;border-top:0 dotted;border-bottom-color:#fff}.popover{padding:0;font-family:Arial,Helvetica,sans-serif;font-size:13px;font-style:normal;font-weight:400;line-height:1.4;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;background-color:#fff;border-radius:2px;-webkit-box-shadow:0 2px 10px rgba(0,0,0,.2);box-shadow:0 2px 10px rgba(0,0,0,.2);line-break:auto}.popover-footer,.popover-title{padding:10px;font-size:13px;background-color:#f5f5f5;border-bottom:1px solid #ccc;border-bottom:1px solid rgba(0,0,0,.2);border-radius:0}.popover-footer{border-top:1px solid #ccc;border-top:1px solid rgba(0,0,0,.2);border-bottom:none}.popover-content{padding:10px}.carousel{width:100%;padding:50px;overflow:hidden;background-color:#f5f5f5;background-image:-webkit-linear-gradient(top,#eee 0,#f5f5f5 100%),-webkit-linear-gradient(bottom,#eee 0,#f5f5f5 100%);background-image:-o-linear-gradient(top,#eee 0,#f5f5f5 100%),-o-linear-gradient(bottom,#eee 0,#f5f5f5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#eee),to(#f5f5f5)),-webkit-gradient(linear,left bottom,left top,from(#eee),to(#f5f5f5));background-image:linear-gradient(to bottom,#eee 0,#f5f5f5 100%),linear-gradient(to top,#eee 0,#f5f5f5 100%);background-repeat:no-repeat;background-position:0 0,0 100%;-webkit-background-size:100% 10px;background-size:100% 10px}.carousel-control{width:100px;color:#777;text-shadow:none;filter:alpha(opacity=33);opacity:.33}.carousel-control.left{background-image:none}.carousel-control.right{background-image:none}.carousel-control:focus,.carousel-control:hover{color:#777}.carousel-control .icon-next:before,.carousel-control .icon-prev:before{content:''}.carousel-control .icon-prev{position:relative;position:absolute;right:0;display:inline-block}.carousel-control .icon-prev:before{border-radius:20px}.carousel-control .icon-prev:after,.carousel-control .icon-prev:before{position:absolute;width:0;height:0;content:""}.carousel-control .icon-prev:before{border:22px solid transparent}.carousel-control .icon-prev:after{border:19px solid transparent}.carousel-control .icon-prev:after,.carousel-control .icon-prev:before{top:8px;right:100%}.carousel-control .icon-prev:before{margin-top:-22px;border-right:22px solid;border-right-color:#777}.carousel-control .icon-prev:after{margin-top:-19px;border-right:19px solid #f5f5f5}.carousel-control .icon-next{position:relative;position:absolute;right:0;left:50%;display:inline-block}.carousel-control .icon-next:before{border-radius:20px}.carousel-control .icon-next:after,.carousel-control .icon-next:before{position:absolute;width:0;height:0;content:""}.carousel-control .icon-next:before{border:22px solid transparent}.carousel-control .icon-next:after{border:19px solid transparent}.carousel-control .icon-next:after,.carousel-control .icon-next:before{top:8px;left:100%}.carousel-control .icon-next:before{margin-top:-22px;border-left:22px solid;border-left-color:#777}.carousel-control .icon-next:after{margin-top:-19px;border-left:19px solid #f5f5f5}.carousel-control .icon-next:after,.carousel-control .icon-next:before{left:50%}.carousel-indicators{bottom:5px;left:0;width:100%;margin-left:0}.carousel-indicators li{background-color:#c2c2c2;border:1px solid #c2c2c2}.carousel-indicators .active{width:10px;height:10px;margin:1px;background-color:#444;border:1px solid #444}.carousel-caption{right:0;bottom:0;left:0;padding:10px;color:#fff;text-shadow:none;background-color:#262626;background-color:rgba(0,0,0,.55)} -/*# sourceMappingURL=todc-bootstrap.min.css.map */ \ No newline at end of file diff --git a/src/DjangoBlog/blog/static/assets/img/checkmark.png b/src/DjangoBlog/blog/static/assets/img/checkmark.png deleted file mode 100644 index 4bd0eb350087ae1c5dedf8dfce9d24272d6db7a8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 221 zcmeAS@N?(olHy`uVBq!ia0vp^Vj#@H1|*Mc$*~4fjKx9jP7LeL$-D$|rhB?LhIn`< zrz{XmSTb=Z&*38p6En+u{{Q{|+S|v#(9kHqZt~J1u~=QV01lshZx0+fvtho3b7I!N zzo`X(CakVvh~#fO=oFl9W?*1+b#juy;s5o$?>AkQcH>Qx;N@~rlJFJ%ut7mhgTe~DWM4f;?+@i diff --git a/src/DjangoBlog/blog/static/assets/js/ie-emulation-modes-warning.js b/src/DjangoBlog/blog/static/assets/js/ie-emulation-modes-warning.js deleted file mode 100644 index 3f97ba5..0000000 --- a/src/DjangoBlog/blog/static/assets/js/ie-emulation-modes-warning.js +++ /dev/null @@ -1,51 +0,0 @@ -// NOTICE!! DO NOT USE ANY OF THIS JAVASCRIPT -// IT'S JUST JUNK FOR OUR DOCS! -// ++++++++++++++++++++++++++++++++++++++++++ -/*! - * Copyright 2014-2015 Twitter, Inc. - * - * Licensed under the Creative Commons Attribution 3.0 Unported License. For - * details, see https://creativecommons.org/licenses/by/3.0/. - */ -// Intended to prevent false-positive bug reports about Bootstrap not working properly in old versions of IE due to folks testing using IE's unreliable emulation modes. -(function () { - 'use strict'; - - function emulatedIEMajorVersion() { - var groups = /MSIE ([0-9.]+)/.exec(window.navigator.userAgent) - if (groups === null) { - return null - } - var ieVersionNum = parseInt(groups[1], 10) - var ieMajorVersion = Math.floor(ieVersionNum) - return ieMajorVersion - } - - function actualNonEmulatedIEMajorVersion() { - // Detects the actual version of IE in use, even if it's in an older-IE emulation mode. - // IE JavaScript conditional compilation docs: https://msdn.microsoft.com/library/121hztk3%28v=vs.94%29.aspx - // @cc_on docs: https://msdn.microsoft.com/library/8ka90k2e%28v=vs.94%29.aspx - var jscriptVersion = new Function('/*@cc_on return @_jscript_version; @*/')() // jshint ignore:line - if (jscriptVersion === undefined) { - return 11 // IE11+ not in emulation mode - } - if (jscriptVersion < 9) { - return 8 // IE8 (or lower; haven't tested on IE<8) - } - return jscriptVersion // IE9 or IE10 in any mode, or IE11 in non-IE11 mode - } - - var ua = window.navigator.userAgent - if (ua.indexOf('Opera') > -1 || ua.indexOf('Presto') > -1) { - return // Opera, which might pretend to be IE - } - var emulated = emulatedIEMajorVersion() - if (emulated === null) { - return // Not IE - } - var nonEmulated = actualNonEmulatedIEMajorVersion() - - if (emulated !== nonEmulated) { - window.alert('WARNING: You appear to be using IE' + nonEmulated + ' in IE' + emulated + ' emulation mode.\nIE emulation modes can behave significantly differently from ACTUAL older versions of IE.\nPLEASE DON\'T FILE BOOTSTRAP BUGS based on testing in IE emulation modes!') - } -})(); diff --git a/src/DjangoBlog/blog/static/assets/js/ie10-viewport-bug-workaround.js b/src/DjangoBlog/blog/static/assets/js/ie10-viewport-bug-workaround.js deleted file mode 100644 index 479a6eb..0000000 --- a/src/DjangoBlog/blog/static/assets/js/ie10-viewport-bug-workaround.js +++ /dev/null @@ -1,23 +0,0 @@ -/*! - * IE10 viewport hack for Surface/desktop Windows 8 bug - * Copyright 2014-2015 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - */ - -// See the Getting Started docs for more information: -// http://getbootstrap.com/getting-started/#support-ie10-width - -(function () { - 'use strict'; - - if (navigator.userAgent.match(/IEMobile\/10\.0/)) { - var msViewportStyle = document.createElement('style') - msViewportStyle.appendChild( - document.createTextNode( - '@-ms-viewport{width:auto!important}' - ) - ) - document.querySelector('head').appendChild(msViewportStyle) - } - -})(); diff --git a/src/DjangoBlog/blog/static/blog/css/ie.css b/src/DjangoBlog/blog/static/blog/css/ie.css deleted file mode 100644 index 706f510..0000000 --- a/src/DjangoBlog/blog/static/blog/css/ie.css +++ /dev/null @@ -1,273 +0,0 @@ -/* -Styles for older IE versions (previous to IE9). -*/ - -body { - background-color: #e6e6e6; -} -body.custom-background-empty { - background-color: #fff; -} -body.custom-background-empty .site, -body.custom-background-white .site { - box-shadow: none; - margin-bottom: 0; - margin-top: 0; - padding: 0; -} -.assistive-text, -.site .screen-reader-text { - clip: rect(1px 1px 1px 1px); -} -.full-width .site-content { - float: none; - width: 100%; -} -img.size-full, -img.size-large, -img.header-image, -img.wp-post-image, -img[class*="align"], -img[class*="wp-image-"], -img[class*="attachment-"] { - width: auto; /* Prevent stretching of full-size and large-size images with height and width attributes in IE8 */ -} -.author-avatar { - float: left; - margin-top: 8px; - margin-top: 0.571428571rem; -} -.author-description { - float: right; - width: 80%; -} -.site { - box-shadow: 0 2px 6px rgba(100, 100, 100, 0.3); - margin: 48px auto; - max-width: 960px; - overflow: hidden; - padding: 0 40px; -} -.site-content { - float: left; - width: 65.104166667%; -} -body.template-front-page .site-content, -body.attachment .site-content, -body.full-width .site-content { - width: 100%; -} -.widget-area { - float: right; - width: 26.041666667%; -} -.site-header h1, -.site-header h2 { - text-align: left; -} -.site-header h1 { - font-size: 26px; - line-height: 1.846153846; -} -.main-navigation ul.nav-menu, -.main-navigation div.nav-menu > ul { - border-bottom: 1px solid #ededed; - border-top: 1px solid #ededed; - display: inline-block !important; - text-align: left; - width: 100%; -} -.main-navigation ul { - margin: 0; - text-indent: 0; -} -.main-navigation li a, -.main-navigation li { - display: inline-block; - text-decoration: none; -} -.ie7 .main-navigation li a, -.ie7 .main-navigation li { - display: inline; -} -.main-navigation li a { - border-bottom: 0; - color: #6a6a6a; - line-height: 3.692307692; - text-transform: uppercase; -} -.main-navigation li a:hover { - color: #000; -} -.main-navigation li { - margin: 0 40px 0 0; - position: relative; -} -.main-navigation li ul { - margin: 0; - padding: 0; - position: absolute; - top: 100%; - z-index: 1; - height: 1px; - width: 1px; - overflow: hidden; - clip: rect(1px, 1px, 1px, 1px); -} -.ie7 .main-navigation li ul { - clip: inherit; - display: none; - left: 0; - overflow: visible; -} -.main-navigation li ul ul, -.ie7 .main-navigation li ul ul { - top: 0; - left: 100%; -} -.main-navigation ul li:hover > ul, -.main-navigation ul li:focus > ul, -.main-navigation .focus > ul { - border-left: 0; - clip: inherit; - overflow: inherit; - height: inherit; - width: inherit; -} -.ie7 .main-navigation ul li:hover > ul, -.ie7 .main-navigation ul li:focus > ul { - display: block; -} -.main-navigation li ul li a { - background: #efefef; - border-bottom: 1px solid #ededed; - display: block; - font-size: 11px; - line-height: 2.181818182; - padding: 8px 10px; - width: 180px; -} -.main-navigation li ul li a:hover { - background: #e3e3e3; - color: #444; -} -.main-navigation .current-menu-item > a, -.main-navigation .current-menu-ancestor > a, -.main-navigation .current_page_item > a, -.main-navigation .current_page_ancestor > a { - color: #636363; - font-weight: bold; -} -.main-navigation .menu-toggle { - display: none; -} -.entry-header .entry-title { - font-size: 22px; -} -#respond form input[type="text"] { - width: 46.333333333%; -} -#respond form textarea.blog-textarea { - width: 79.666666667%; -} -.template-front-page .site-content, -.template-front-page article { - overflow: hidden; -} -.template-front-page.has-post-thumbnail article { - float: left; - width: 47.916666667%; -} -.entry-page-image { - float: right; - margin-bottom: 0; - width: 47.916666667%; -} -/* IE Front Page Template Widget fix */ -.template-front-page .widget-area { - clear: both; -} -.template-front-page .widget { - width: 100% !important; - border: none; -} -.template-front-page .widget-area .widget, -.template-front-page .first.front-widgets, -.template-front-page.two-sidebars .widget-area .front-widgets { - float: left; - margin-bottom: 24px; - width: 51.875%; -} -.template-front-page .second.front-widgets, -.template-front-page .widget-area .widget:nth-child(odd) { - clear: right; -} -.template-front-page .first.front-widgets, -.template-front-page .second.front-widgets, -.template-front-page.two-sidebars .widget-area .front-widgets + .front-widgets { - float: right; - margin: 0 0 24px; - width: 39.0625%; -} -.template-front-page.two-sidebars .widget, -.template-front-page.two-sidebars .widget:nth-child(even) { - float: none; - width: auto; -} -/* add input font for ul { - text-align: right; -} -.rtl .main-navigation ul li ul li, -.rtl .main-navigation ul li ul li ul li { - margin-left: 40px; - margin-right: auto; -} -.rtl .main-navigation li ul ul { - position: absolute; - bottom: 0; - right: 100%; - z-index: 1; -} -.ie7 .rtl .main-navigation li ul ul { - position: absolute; - bottom: 0; - right: 100%; - z-index: 1; -} -.ie7 .rtl .main-navigation ul li { - z-index: 99; -} -.ie7 .rtl .main-navigation li ul { - position: absolute; - bottom: 100%; - right: 0; - z-index: 1; -} -.ie7 .rtl .main-navigation li { - margin-right: auto; - margin-left: 40px; -} -.ie7 .rtl .main-navigation li ul ul ul { - position: relative; - z-index: 1; -} \ No newline at end of file diff --git a/src/DjangoBlog/blog/static/blog/css/nprogress.css b/src/DjangoBlog/blog/static/blog/css/nprogress.css deleted file mode 100644 index 90c7b6c..0000000 --- a/src/DjangoBlog/blog/static/blog/css/nprogress.css +++ /dev/null @@ -1,74 +0,0 @@ -/* Make clicks pass-through */ -#nprogress { - pointer-events: none; -} - -#nprogress .bar { - background: red; - - position: fixed; - z-index: 1031; - top: 0; - left: 0; - - width: 100%; - height: 2px; -} - -/* Fancy blur effect */ -#nprogress .peg { - display: block; - position: absolute; - right: 0px; - width: 100px; - height: 100%; - box-shadow: 0 0 10px #29d, 0 0 5px #29d; - opacity: 1.0; - - -webkit-transform: rotate(3deg) translate(0px, -4px); - -ms-transform: rotate(3deg) translate(0px, -4px); - transform: rotate(3deg) translate(0px, -4px); -} - -/* Remove these to get rid of the spinner */ -#nprogress .spinner { - display: block; - position: fixed; - z-index: 1031; - top: 15px; - right: 15px; -} - -#nprogress .spinner-icon { - width: 18px; - height: 18px; - box-sizing: border-box; - - border: solid 2px transparent; - border-top-color: red; - border-left-color: red; - border-radius: 50%; - - -webkit-animation: nprogress-spinner 400ms linear infinite; - animation: nprogress-spinner 400ms linear infinite; -} - -.nprogress-custom-parent { - overflow: hidden; - position: relative; -} - -.nprogress-custom-parent #nprogress .spinner, -.nprogress-custom-parent #nprogress .bar { - position: absolute; -} - -@-webkit-keyframes nprogress-spinner { - 0% { -webkit-transform: rotate(0deg); } - 100% { -webkit-transform: rotate(360deg); } -} -@keyframes nprogress-spinner { - 0% { transform: rotate(0deg); } - 100% { transform: rotate(360deg); } -} - diff --git a/src/DjangoBlog/blog/static/blog/css/oauth_style.css b/src/DjangoBlog/blog/static/blog/css/oauth_style.css deleted file mode 100644 index 8af78af..0000000 --- a/src/DjangoBlog/blog/static/blog/css/oauth_style.css +++ /dev/null @@ -1,305 +0,0 @@ - -.icon-sn-google { - background-position: 0 -28px; -} - -.icon-sn-bg-google { - background-color: #4285f4; - background-position: 0 0; -} - -.fa-sn-google { - color: #4285f4; -} - -.icon-sn-github { - background-position: -28px -28px; -} - -.icon-sn-bg-github { - background-color: #333; - background-position: -28px 0; -} - -.fa-sn-github { - color: #333; -} - -.icon-sn-weibo { - background-position: -56px -28px; -} - -.icon-sn-bg-weibo { - background-color: #e90d24; - background-position: -56px 0; -} - -.fa-sn-weibo { - color: #e90d24; -} - -.icon-sn-qq { - background-position: -84px -28px; -} - -.icon-sn-bg-qq { - background-color: #0098e6; - background-position: -84px 0; -} - -.fa-sn-qq { - color: #0098e6; -} - -.icon-sn-twitter { - background-position: -112px -28px; -} - -.icon-sn-bg-twitter { - background-color: #50abf1; - background-position: -112px 0; -} - -.fa-sn-twitter { - color: #50abf1; -} - -.icon-sn-facebook { - background-position: -140px -28px; -} - -.icon-sn-bg-facebook { - background-color: #4862a3; - background-position: -140px 0; -} - -.fa-sn-facebook { - color: #4862a3; -} - -.icon-sn-renren { - background-position: -168px -28px; -} - -.icon-sn-bg-renren { - background-color: #197bc8; - background-position: -168px 0; -} - -.fa-sn-renren { - color: #197bc8; -} - -.icon-sn-tqq { - background-position: -196px -28px; -} - -.icon-sn-bg-tqq { - background-color: #1f9ed2; - background-position: -196px 0; -} - -.fa-sn-tqq { - color: #1f9ed2; -} - -.icon-sn-douban { - background-position: -224px -28px; -} - -.icon-sn-bg-douban { - background-color: #279738; - background-position: -224px 0; -} - -.fa-sn-douban { - color: #279738; -} - -.icon-sn-weixin { - background-position: -252px -28px; -} - -.icon-sn-bg-weixin { - background-color: #00b500; - background-position: -252px 0; -} - -.fa-sn-weixin { - color: #00b500; -} - -.icon-sn-dotted { - background-position: -280px -28px; -} - -.icon-sn-bg-dotted { - background-color: #eee; - background-position: -280px 0; -} - -.fa-sn-dotted { - color: #eee; -} - -.icon-sn-site { - background-position: -308px -28px; -} - -.icon-sn-bg-site { - background-color: #00b500; - background-position: -308px 0; -} - -.fa-sn-site { - color: #00b500; -} - -.icon-sn-linkedin { - background-position: -336px -28px; -} - -.icon-sn-bg-linkedin { - background-color: #0077b9; - background-position: -336px 0; -} - -.fa-sn-linkedin { - color: #0077b9; -} - -[class*=icon-sn-] { - display: inline-block; - background-image: url('../img/icon-sn.svg'); - background-repeat: no-repeat; - width: 28px; - height: 28px; - vertical-align: middle; - background-size: auto 56px; -} - -[class*=icon-sn-]:hover { - opacity: .8; - filter: alpha(opacity=80); -} - -.btn-sn-google { - background: #4285f4; -} - -.btn-sn-google:active, .btn-sn-google:focus, .btn-sn-google:hover { - background: #2a75f3; -} - -.btn-sn-github { - background: #333; -} - -.btn-sn-github:active, .btn-sn-github:focus, .btn-sn-github:hover { - background: #262626; -} - -.btn-sn-weibo { - background: #e90d24; -} - -.btn-sn-weibo:active, .btn-sn-weibo:focus, .btn-sn-weibo:hover { - background: #d10c20; -} - -.btn-sn-qq { - background: #0098e6; -} - -.btn-sn-qq:active, .btn-sn-qq:focus, .btn-sn-qq:hover { - background: #0087cd; -} - -.btn-sn-twitter { - background: #50abf1; -} - -.btn-sn-twitter:active, .btn-sn-twitter:focus, .btn-sn-twitter:hover { - background: #38a0ef; -} - -.btn-sn-facebook { - background: #4862a3; -} - -.btn-sn-facebook:active, .btn-sn-facebook:focus, .btn-sn-facebook:hover { - background: #405791; -} - -.btn-sn-renren { - background: #197bc8; -} - -.btn-sn-renren:active, .btn-sn-renren:focus, .btn-sn-renren:hover { - background: #166db1; -} - -.btn-sn-tqq { - background: #1f9ed2; -} - -.btn-sn-tqq:active, .btn-sn-tqq:focus, .btn-sn-tqq:hover { - background: #1c8dbc; -} - -.btn-sn-douban { - background: #279738; -} - -.btn-sn-douban:active, .btn-sn-douban:focus, .btn-sn-douban:hover { - background: #228330; -} - -.btn-sn-weixin { - background: #00b500; -} - -.btn-sn-weixin:active, .btn-sn-weixin:focus, .btn-sn-weixin:hover { - background: #009c00; -} - -.btn-sn-dotted { - background: #eee; -} - -.btn-sn-dotted:active, .btn-sn-dotted:focus, .btn-sn-dotted:hover { - background: #e1e1e1; -} - -.btn-sn-site { - background: #00b500; -} - -.btn-sn-site:active, .btn-sn-site:focus, .btn-sn-site:hover { - background: #009c00; -} - -.btn-sn-linkedin { - background: #0077b9; -} - -.btn-sn-linkedin:active, .btn-sn-linkedin:focus, .btn-sn-linkedin:hover { - background: #0067a0; -} - -[class*=btn-sn-], [class*=btn-sn-]:active, [class*=btn-sn-]:focus, [class*=btn-sn-]:hover { - border: none; - color: #fff; -} - -.btn-sn-more { - padding: 0; -} - -.btn-sn-more, .btn-sn-more:active, .btn-sn-more:hover { - box-shadow: none; -} - -[class*=btn-sn-] [class*=icon-sn-] { - background-color: transparent; -} \ No newline at end of file diff --git a/src/DjangoBlog/blog/static/blog/css/style.css b/src/DjangoBlog/blog/static/blog/css/style.css deleted file mode 100644 index cdbd790..0000000 --- a/src/DjangoBlog/blog/static/blog/css/style.css +++ /dev/null @@ -1,2898 +0,0 @@ -html, body, div, span, applet, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, acronym, address, big, cite, code, del, dfn, em, img, ins, kbd, q, s, samp, small, strike, strong, sub, sup, tt, var, b, u, i, center, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, table, caption, tbody, tfoot, thead, tr, th, td, article, aside, canvas, details, embed, figure, figcaption, footer, header, hgroup, menu, nav, output, ruby, section, summary, time, mark, audio, video { - margin: 0; - padding: 0; - border: 0; - font-size: 100%; - vertical-align: baseline; -} - -body { - line-height: 1; -} - -ol, -ul { - list-style: none; -} - -blockquote, -q { - quotes: none; -} - -blockquote:before, -blockquote:after, -q:before, -q:after { - content: ''; - content: none; -} - -table { - border-collapse: collapse; - border-spacing: 0; -} - -caption, -th, -td { - font-weight: normal; - text-align: left; -} - -h1, -h2, -h3, -h4, -h5, -h6 { - clear: both; -} - -html { - overflow-y: scroll; - font-size: 100%; - -webkit-text-size-adjust: 100%; - -ms-text-size-adjust: 100%; -} - -a:focus { - outline: thin dotted; -} - -article, -aside, -details, -figcaption, -figure, -footer, -header, -hgroup, -nav, -section { - display: block; -} - -audio, -canvas, -video { - display: inline-block; -} - -audio:not([controls]) { - display: none; -} - -del { - color: #333; -} - -ins { - background: #fff9c0; - text-decoration: none; -} - -hr { - background-color: #ccc; - border: 0; - height: 1px; - margin: 24px; - margin-bottom: 1.714285714rem; -} - -sub, -sup { - font-size: 75%; - line-height: 0; - position: relative; - vertical-align: baseline; -} - -sup { - top: -0.5em; -} - -sub { - bottom: -0.25em; -} - -small { - font-size: smaller; -} - -img { - border: 0; - -ms-interpolation-mode: bicubic; -} - -/* Clearing floats */ -.clear:after, -.wrapper:after, -.format-status .entry-header:after { - clear: both; -} - -.clear:before, -.clear:after, -.wrapper:before, -.wrapper:after, -.format-status .entry-header:before, -.format-status .entry-header:after { - display: table; - content: ""; -} - - -/* =Repeatable patterns --------------------------------------------------------------- */ - -/* Small headers */ -.archive-title, -.page-title, -.widget-title, -.entry-content th, -.comment-content th { - font-size: 11px; - font-size: 0.785714286rem; - line-height: 2.181818182; - font-weight: bold; - text-transform: uppercase; - color: #636363; -} - -/* Shared Post Format styling */ -article.format-quote footer.entry-meta, -article.format-link footer.entry-meta, -article.format-status footer.entry-meta { - font-size: 11px; - font-size: 0.785714286rem; - line-height: 2.181818182; -} - -/* Form fields, general styles first */ -button, -input, -select, -textarea { - border: 1px solid #ccc; - border-radius: 3px; - font-family: inherit; - padding: 6px; - padding: 0.428571429rem; -} - -button, -input { - line-height: normal; -} - -textarea { - font-size: 100%; - overflow: auto; - vertical-align: top; -} - -/* Reset non-text input types */ -input[type="checkbox"], -input[type="radio"], -input[type="file"], -input[type="hidden"], -input[type="image"], -input[type="color"] { - border: 0; - border-radius: 0; - padding: 0; -} - -/* Buttons */ -.menu-toggle, -input[type="submit"], -input[type="button"], -input[type="reset"], -article.post-password-required input[type=submit], -.bypostauthor cite span { - padding: 6px 10px; - padding: 0.428571429rem 0.714285714rem; - font-size: 11px; - font-size: 0.785714286rem; - line-height: 1.428571429; - font-weight: normal; - color: #7c7c7c; - background-color: #e6e6e6; - background-repeat: repeat-x; - background-image: -moz-linear-gradient(top, #f4f4f4, #e6e6e6); - background-image: -ms-linear-gradient(top, #f4f4f4, #e6e6e6); - background-image: -webkit-linear-gradient(top, #f4f4f4, #e6e6e6); - background-image: -o-linear-gradient(top, #f4f4f4, #e6e6e6); - background-image: linear-gradient(to bottom, #f4f4f4, #e6e6e6); - border: 1px solid #d2d2d2; - border-radius: 3px; - box-shadow: 0 1px 2px rgba(64, 64, 64, 0.1); -} - -.menu-toggle, -button, -input[type="submit"], -input[type="button"], -input[type="reset"] { - cursor: pointer; -} - -button[disabled], -input[disabled] { - cursor: default; -} - -.menu-toggle:hover, -.menu-toggle:focus, -button:hover, -input[type="submit"]:hover, -input[type="button"]:hover, -input[type="reset"]:hover, -article.post-password-required input[type=submit]:hover { - color: #5e5e5e; - background-color: #ebebeb; - background-repeat: repeat-x; - background-image: -moz-linear-gradient(top, #f9f9f9, #ebebeb); - background-image: -ms-linear-gradient(top, #f9f9f9, #ebebeb); - background-image: -webkit-linear-gradient(top, #f9f9f9, #ebebeb); - background-image: -o-linear-gradient(top, #f9f9f9, #ebebeb); - background-image: linear-gradient(to bottom, #f9f9f9, #ebebeb); -} - -.menu-toggle:active, -.menu-toggle.toggled-on, -button:active, -input[type="submit"]:active, -input[type="button"]:active, -input[type="reset"]:active { - color: #757575; - background-color: #e1e1e1; - background-repeat: repeat-x; - background-image: -moz-linear-gradient(top, #ebebeb, #e1e1e1); - background-image: -ms-linear-gradient(top, #ebebeb, #e1e1e1); - background-image: -webkit-linear-gradient(top, #ebebeb, #e1e1e1); - background-image: -o-linear-gradient(top, #ebebeb, #e1e1e1); - background-image: linear-gradient(to bottom, #ebebeb, #e1e1e1); - box-shadow: inset 0 0 8px 2px #c6c6c6, 0 1px 0 0 #f4f4f4; - border-color: transparent; -} - -.bypostauthor cite span { - color: #fff; - background-color: #21759b; - background-image: none; - border: 1px solid #1f6f93; - border-radius: 2px; - box-shadow: none; - padding: 0; -} - -/* Responsive images */ -.entry-content img, -.comment-content img, -.widget img { - max-width: 100%; /* Fluid images for posts, comments, and widgets */ -} - -img[class*="align"], -img[class*="wp-image-"], -img[class*="attachment-"] { - height: auto; /* Make sure images with WordPress-added height and width attributes are scaled correctly */ -} - -img.size-full, -img.size-large, -img.header-image, -img.wp-post-image { - max-width: 100%; - height: auto; /* Make sure images with WordPress-added height and width attributes are scaled correctly */ -} - -/* Make sure videos and embeds fit their containers */ -embed, -iframe, -object, -video { - max-width: 100%; -} - -.entry-content .twitter-tweet-rendered { - max-width: 100% !important; /* Override the Twitter embed fixed width */ -} - -/* Images */ -.alignleft { - float: left; -} - -.alignright { - float: right; -} - -.aligncenter { - display: block; - margin-left: auto; - margin-right: auto; -} - -.entry-content img, -.comment-content img, -.widget img, -img.header-image, -.author-avatar img, -img.wp-post-image { - /* Add fancy borders to all WordPress-added images but not things like badges and icons and the like */ - border-radius: 3px; - box-shadow: 0 1px 4px rgba(0, 0, 0, 0.2); -} - -.wp-caption { - max-width: 100%; /* Keep wide captions from overflowing their container. */ - padding: 4px; -} - -.wp-caption .wp-caption-text, -.gallery-caption, -.entry-caption { - font-style: italic; - font-size: 12px; - font-size: 0.857142857rem; - line-height: 2; - color: #757575; -} - -img.wp-smiley, -.rsswidget img { - border: 0; - border-radius: 0; - box-shadow: none; - margin-bottom: 0; - margin-top: 0; - padding: 0; -} - -.entry-content dl.gallery-item { - margin: 0; -} - -.gallery-item a, -.gallery-caption { - width: 90%; -} - -.gallery-item a { - display: block; -} - -.gallery-caption a { - display: inline; -} - -.gallery-columns-1 .gallery-item a { - max-width: 100%; - width: auto; -} - -.gallery .gallery-icon img { - height: auto; - max-width: 90%; - padding: 5%; -} - -.gallery-columns-1 .gallery-icon img { - padding: 3%; -} - -/* Navigation */ -.site-content nav { - clear: both; - line-height: 2; - overflow: hidden; -} - -#nav-above { - padding: 24px 0; - padding: 1.714285714rem 0; -} - -#nav-above { - display: none; -} - -.paged #nav-above { - display: block; -} - -.nav-previous, -.previous-image { - float: left; - width: 50%; -} - -.nav-next, -.next-image { - float: right; - text-align: right; - width: 50%; -} - -.nav-single + .comments-area, -#comment-nav-above { - margin: 48px 0; - margin: 3.428571429rem 0; -} - -/* Author profiles */ -.author .archive-header { - margin-bottom: 24px; - margin-bottom: 1.714285714rem; -} - -.author-info { - border-top: 1px solid #ededed; - margin: 24px 0; - margin: 1.714285714rem 0; - padding-top: 24px; - padding-top: 1.714285714rem; - overflow: hidden; -} - -.author-description p { - color: #757575; - font-size: 13px; - font-size: 0.928571429rem; - line-height: 1.846153846; -} - -.author.archive .author-info { - border-top: 0; - margin: 0 0 48px; - margin: 0 0 3.428571429rem; -} - -.author.archive .author-avatar { - margin-top: 0; -} - - -/* =Basic structure --------------------------------------------------------------- */ - -/* Body, links, basics */ -html { - font-size: 87.5%; -} - -body { - font-size: 14px; - font-size: 1rem; - font-family: Helvetica, Arial, sans-serif; - text-rendering: optimizeLegibility; - color: #444; -} - -body.custom-font-enabled { - font-family: "Open Sans", Helvetica, Arial, sans-serif; -} - -a { - outline: none; - color: #21759b; -} - -a:hover { - color: #0f3647; -} - -/* Assistive text */ -.assistive-text, -.site .screen-reader-text { - position: absolute !important; - clip: rect(1px, 1px, 1px, 1px); - overflow: hidden; - height: 1px; - width: 1px; -} - -.main-navigation .assistive-text:focus, -.site .screen-reader-text:hover, -.site .screen-reader-text:active, -.site .screen-reader-text:focus { - background: #fff; - border: 2px solid #333; - border-radius: 3px; - clip: auto !important; - color: #000; - display: block; - font-size: 12px; - height: auto; - padding: 12px; - position: absolute; - top: 5px; - left: 5px; - width: auto; - z-index: 100000; /* Above WP toolbar */ -} - -/* Page structure */ -.site { - padding: 0 24px; - padding: 0 1.714285714rem; - background-color: #fff; -} - -.site-content { - margin: 24px 0 0; - margin: 1.714285714rem 0 0; -} - -.widget-area { - margin: 24px 0 0; - margin: 1.714285714rem 0 0; -} - -/* Header */ -.site-header { - padding: 24px 0; - padding: 1.714285714rem 0; -} - -.site-header h1, -.site-header h2 { - text-align: center; -} - -.site-header h1 a, -.site-header h2 a { - color: #515151; - display: inline-block; - text-decoration: none; -} - -.site-header h1 a:hover, -.site-header h2 a:hover { - color: #21759b; -} - -.site-header h1 { - font-size: 24px; - font-size: 1.714285714rem; - line-height: 1.285714286; - margin-bottom: 14px; - margin-bottom: 1rem; -} - -.site-header h2 { - font-weight: normal; - font-size: 13px; - font-size: 0.928571429rem; - line-height: 1.846153846; - color: #757575; -} - -.header-image { - margin-top: 24px; - margin-top: 1.714285714rem; -} - -/* Navigation Menu */ -.main-navigation { - margin-top: 24px; - margin-top: 1.714285714rem; - text-align: center; -} - -.main-navigation li { - margin-top: 24px; - margin-top: 1.714285714rem; - font-size: 12px; - font-size: 0.857142857rem; - line-height: 1.42857143; -} - -.main-navigation a { - color: #5e5e5e; -} - -.main-navigation a:hover, -.main-navigation a:focus { - color: #21759b; -} - -.main-navigation ul.nav-menu, -.main-navigation div.nav-menu > ul { - display: none; -} - -.main-navigation ul.nav-menu.toggled-on, -.menu-toggle { - display: inline-block; -} - -/* Banner */ -section[role="banner"] { - margin-bottom: 48px; - margin-bottom: 3.428571429rem; -} - -/* Sidebar */ -.widget-area .widget { - -webkit-hyphens: auto; - -moz-hyphens: auto; - hyphens: auto; - margin-bottom: 48px; - margin-bottom: 3.428571429rem; - word-wrap: break-word; -} - -.widget-area .widget h3 { - margin-bottom: 24px; - margin-bottom: 1.714285714rem; -} - -.widget-area .widget p, -.widget-area .widget li, -.widget-area .widget .textwidget { - font-size: 13px; - font-size: 0.928571429rem; - line-height: 1.846153846; -} - -.widget-area .widget p { - margin-bottom: 24px; - margin-bottom: 1.714285714rem; -} - -.widget-area .textwidget ul, -.widget-area .textwidget ol { - list-style: disc outside; - margin: 0 0 24px; - margin: 0 0 1.714285714rem; -} - -.widget-area .textwidget li > ul, -.widget-area .textwidget li > ol { - margin-bottom: 0; -} - -.widget-area .textwidget ol { - list-style: decimal; -} - -.widget-area .textwidget li { - margin-left: 36px; - margin-left: 2.571428571rem; -} - -.widget-area .widget a { - color: #757575; -} - -.widget-area .widget a:hover { - color: #21759b; -} - -.widget-area .widget a:visited { - color: #9f9f9f; -} - -.widget-area #s { - width: 53.66666666666%; /* define a width to avoid dropping a wider submit button */ -} - -/* Footer */ -footer[role="contentinfo"] { - border-top: 1px solid #ededed; - clear: both; - font-size: 12px; - font-size: 0.857142857rem; - line-height: 2; - max-width: 960px; - max-width: 68.571428571rem; - margin-top: 24px; - margin-top: 1.714285714rem; - margin-left: auto; - margin-right: auto; - padding: 24px 0; - padding: 1.714285714rem 0; -} - -footer[role="contentinfo"] a { - color: #686868; -} - -footer[role="contentinfo"] a:hover { - color: #21759b; -} - -.site-info span[role=separator] { - padding: 0 0.3em 0 0.6em; -} - -.site-info span[role=separator]::before { - content: '\002f'; -} - - -/* =Main content and comment content --------------------------------------------------------------- */ - -.entry-meta { - clear: both; -} - -.entry-header { - margin-bottom: 24px; - margin-bottom: 1.714285714rem; -} - -.entry-header img.wp-post-image { - margin-bottom: 24px; - margin-bottom: 1.714285714rem; -} - -.entry-header .entry-title { - font-size: 20px; - font-size: 1.428571429rem; - line-height: 1.2; - font-weight: normal; -} - -.entry-header .entry-title a { - text-decoration: none; -} - -.entry-header .entry-format { - margin-top: 24px; - margin-top: 1.714285714rem; - font-weight: normal; -} - -.entry-header .comments-link { - margin-top: 24px; - margin-top: 1.714285714rem; - font-size: 13px; - font-size: 0.928571429rem; - line-height: 1.846153846; - color: #757575; -} - -.comments-link a, -.entry-meta a { - color: #757575; -} - -.comments-link a:hover, -.entry-meta a:hover { - color: #21759b; -} - -article.sticky .featured-post { - border-top: 4px double #ededed; - border-bottom: 4px double #ededed; - color: #757575; - font-size: 13px; - font-size: 0.928571429rem; - line-height: 3.692307692; - margin-bottom: 24px; - margin-bottom: 1.714285714rem; - text-align: center; -} - -.entry-content, -.entry-summary, -.mu_register { - line-height: 1.714285714; -} - -.entry-content h1, -.comment-content h1, -.entry-content h2, -.comment-content h2, -.entry-content h3, -.comment-content h3, -.entry-content h4, -.comment-content h4, -.entry-content h5, -.comment-content h5, -.entry-content h6, -.comment-content h6 { - margin: 24px 0; - margin: 1.714285714rem 0; - line-height: 1.714285714; -} - -.entry-content h1, -.comment-content h1 { - font-size: 21px; - font-size: 1.5rem; - line-height: 1.5; -} - -.entry-content h2, -.comment-content h2, -.mu_register h2 { - font-size: 18px; - font-size: 1.285714286rem; - line-height: 1.6; -} - -.entry-content h3, -.comment-content h3 { - font-size: 16px; - font-size: 1.142857143rem; - line-height: 1.846153846; -} - -.entry-content h4, -.comment-content h4 { - font-size: 14px; - font-size: 1rem; - line-height: 1.846153846; -} - -.entry-content h5, -.comment-content h5 { - font-size: 13px; - font-size: 0.928571429rem; - line-height: 1.846153846; -} - -.entry-content h6, -.comment-content h6 { - font-size: 12px; - font-size: 0.857142857rem; - line-height: 1.846153846; -} - -.entry-content p, -.entry-summary p, -.comment-content p, -.mu_register p { - margin: 0 0 24px; - margin: 0 0 1.714285714rem; - line-height: 1.714285714; -} - -.entry-content a:visited, -.comment-content a:visited { - color: #9f9f9f; -} - -.entry-content .more-link { - white-space: nowrap; -} - -.entry-content ol, -.comment-content ol, -.entry-content ul, -.comment-content ul, -.mu_register ul { - margin: 0 0 24px; - margin: 0 0 1.714285714rem; - line-height: 1.714285714; -} - -.entry-content ul ul, -.comment-content ul ul, -.entry-content ol ol, -.comment-content ol ol, -.entry-content ul ol, -.comment-content ul ol, -.entry-content ol ul, -.comment-content ol ul { - margin-bottom: 0; -} - -.entry-content ul, -.comment-content ul, -.mu_register ul { - list-style: disc outside; -} - -.entry-content ol, -.comment-content ol { - list-style: decimal outside; -} - -.entry-content li, -.comment-content li, -.mu_register li { - margin: 0 0 0 36px; - margin: 0 0 0 2.571428571rem; -} - -.entry-content blockquote, -.comment-content blockquote { - margin-bottom: 24px; - margin-bottom: 1.714285714rem; - padding: 24px; - padding: 1.714285714rem; - font-style: italic; -} - -.entry-content blockquote p:last-child, -.comment-content blockquote p:last-child { - margin-bottom: 0; -} - -.entry-content code, -.comment-content code { - font-family: Consolas, Monaco, Lucida Console, monospace; - font-size: 12px; - font-size: 0.857142857rem; - line-height: 2; -} - -.entry-content pre, -.comment-content pre { - border: 1px solid #ededed; - color: #666; - font-family: Consolas, Monaco, Lucida Console, monospace; - font-size: 12px; - font-size: 0.857142857rem; - line-height: 1.714285714; - margin: 24px 0; - margin: 1.714285714rem 0; - overflow: auto; - padding: 24px; - padding: 1.714285714rem; -} - -.entry-content pre code, -.comment-content pre code { - display: block; -} - -.entry-content abbr, -.comment-content abbr, -.entry-content dfn, -.comment-content dfn, -.entry-content acronym, -.comment-content acronym { - border-bottom: 1px dotted #666; - cursor: help; -} - -.entry-content address, -.comment-content address { - display: block; - line-height: 1.714285714; - margin: 0 0 24px; - margin: 0 0 1.714285714rem; -} - -img.alignleft, -.wp-caption.alignleft { - margin: 12px 24px 12px 0; - margin: 0.857142857rem 1.714285714rem 0.857142857rem 0; -} - -img.alignright, -.wp-caption.alignright { - margin: 12px 0 12px 24px; - margin: 0.857142857rem 0 0.857142857rem 1.714285714rem; -} - -img.aligncenter, -.wp-caption.aligncenter { - clear: both; - margin-top: 12px; - margin-top: 0.857142857rem; - margin-bottom: 12px; - margin-bottom: 0.857142857rem; -} - -.entry-content embed, -.entry-content iframe, -.entry-content object, -.entry-content video { - margin-bottom: 24px; - margin-bottom: 1.714285714rem; -} - -.entry-content dl, -.comment-content dl { - margin: 0 24px; - margin: 0 1.714285714rem; -} - -.entry-content dt, -.comment-content dt { - font-weight: bold; - line-height: 1.714285714; -} - -.entry-content dd, -.comment-content dd { - line-height: 1.714285714; - margin-bottom: 24px; - margin-bottom: 1.714285714rem; -} - -.entry-content table, -.comment-content table { - border-bottom: 1px solid #ededed; - color: #757575; - font-size: 12px; - font-size: 0.857142857rem; - line-height: 2; - margin: 0 0 24px; - margin: 0 0 1.714285714rem; - width: 100%; -} - -.entry-content table caption, -.comment-content table caption { - font-size: 16px; - font-size: 1.142857143rem; - margin: 24px 0; - margin: 1.714285714rem 0; -} - -.entry-content td, -.comment-content td { - border-top: 1px solid #ededed; - padding: 6px 10px 6px 0; -} - -.site-content article { - border-bottom: 4px double #ededed; - margin-bottom: 72px; - margin-bottom: 5.142857143rem; - padding-bottom: 24px; - padding-bottom: 1.714285714rem; - word-wrap: break-word; - -webkit-hyphens: auto; - -moz-hyphens: auto; - hyphens: auto; -} - -.page-links { - clear: both; - line-height: 1.714285714; -} - -footer.entry-meta { - margin-top: 24px; - margin-top: 1.714285714rem; - font-size: 13px; - font-size: 0.928571429rem; - line-height: 1.846153846; - color: #757575; -} - -.single-author .entry-meta .by-author { - display: none; -} - -.mu_register h2 { - color: #757575; - font-weight: normal; -} - - -/* =Archives --------------------------------------------------------------- */ - -.archive-header, -.page-header { - margin-bottom: 48px; - margin-bottom: 3.428571429rem; - padding-bottom: 22px; - padding-bottom: 1.571428571rem; - border-bottom: 1px solid #ededed; -} - -.archive-meta { - color: #757575; - font-size: 12px; - font-size: 0.857142857rem; - line-height: 2; - margin-top: 22px; - margin-top: 1.571428571rem; -} - -/* =Single audio/video attachment view --------------------------------------------------------------- */ - -.attachment .entry-content .mejs-audio { - max-width: 400px; -} - -.attachment .entry-content .mejs-container { - margin-bottom: 24px; -} - - -/* =Single image attachment view --------------------------------------------------------------- */ - -.article.attachment { - overflow: hidden; -} - -.image-attachment div.attachment { - text-align: center; -} - -.image-attachment div.attachment p { - text-align: center; -} - -.image-attachment div.attachment img { - display: block; - height: auto; - margin: 0 auto; - max-width: 100%; -} - -.image-attachment .entry-caption { - margin-top: 8px; - margin-top: 0.571428571rem; -} - - -/* =Aside post format --------------------------------------------------------------- */ - -article.format-aside h1 { - margin-bottom: 24px; - margin-bottom: 1.714285714rem; -} - -article.format-aside h1 a { - text-decoration: none; - color: #4d525a; -} - -article.format-aside h1 a:hover { - color: #2e3542; -} - -article.format-aside .aside { - padding: 24px 24px 0; - padding: 1.714285714rem; - background: #d2e0f9; - border-left: 22px solid #a8bfe8; -} - -article.format-aside p { - font-size: 13px; - font-size: 0.928571429rem; - line-height: 1.846153846; - color: #4a5466; -} - -article.format-aside blockquote:last-child, -article.format-aside p:last-child { - margin-bottom: 0; -} - - -/* =Post formats --------------------------------------------------------------- */ - -/* Image posts */ -article.format-image footer h1 { - font-size: 13px; - font-size: 0.928571429rem; - line-height: 1.846153846; - font-weight: normal; -} - -article.format-image footer h2 { - font-size: 11px; - font-size: 0.785714286rem; - line-height: 2.181818182; -} - -article.format-image footer a h2 { - font-weight: normal; -} - -/* Link posts */ -article.format-link header { - padding: 0 10px; - padding: 0 0.714285714rem; - float: right; - font-size: 11px; - font-size: 0.785714286rem; - line-height: 2.181818182; - font-weight: bold; - font-style: italic; - text-transform: uppercase; - color: #848484; - background-color: #ebebeb; - border-radius: 3px; -} - -article.format-link .entry-content { - max-width: 80%; - float: left; -} - -article.format-link .entry-content a { - font-size: 22px; - font-size: 1.571428571rem; - line-height: 1.090909091; - text-decoration: none; -} - -/* Quote posts */ -article.format-quote .entry-content p { - margin: 0; - padding-bottom: 24px; - padding-bottom: 1.714285714rem; -} - -article.format-quote .entry-content blockquote { - display: block; - padding: 24px 24px 0; - padding: 1.714285714rem 1.714285714rem 0; - font-size: 15px; - font-size: 1.071428571rem; - line-height: 1.6; - font-style: normal; - color: #6a6a6a; - background: #efefef; -} - -/* Status posts */ -.format-status .entry-header { - margin-bottom: 24px; - margin-bottom: 1.714285714rem; -} - -.format-status .entry-header header { - display: inline-block; -} - -.format-status .entry-header h1 { - font-size: 15px; - font-size: 1.071428571rem; - font-weight: normal; - line-height: 1.6; - margin: 0; -} - -.format-status .entry-header h2 { - font-size: 12px; - font-size: 0.857142857rem; - font-weight: normal; - line-height: 2; - margin: 0; -} - -.format-status .entry-header header a { - color: #757575; -} - -.format-status .entry-header header a:hover { - color: #21759b; -} - -.format-status .entry-header img { - float: left; - margin-right: 21px; - margin-right: 1.5rem; -} - - -/* =Comments --------------------------------------------------------------- */ - -.comments-title { - margin-bottom: 48px; - margin-bottom: 3.428571429rem; - font-size: 16px; - font-size: 1.142857143rem; - line-height: 1.5; - font-weight: normal; -} - -.comments-area article { - margin: 24px 0; - margin: 1.714285714rem 0; -} - -.comments-area article header { - margin: 0 0 48px; - margin: 0 0 3.428571429rem; - overflow: hidden; - position: relative; -} - -.comments-area article header img { - float: left; - padding: 0; - line-height: 0; -} - -.comments-area article header cite, -.comments-area article header time { - display: block; - margin-left: 85px; - margin-left: 6.071428571rem; -} - -.comments-area article header cite { - font-style: normal; - font-size: 15px; - font-size: 1.071428571rem; - line-height: 1.42857143; -} - -.comments-area cite b { - font-weight: normal; -} - -.comments-area article header time { - line-height: 1.714285714; - text-decoration: none; - font-size: 12px; - font-size: 0.857142857rem; - color: #5e5e5e; -} - -.comments-area article header a { - text-decoration: none; - color: #5e5e5e; -} - -.comments-area article header a:hover { - color: #21759b; -} - -.comments-area article header cite a { - color: #444; -} - -.comments-area article header cite a:hover { - text-decoration: underline; -} - -.comments-area article header h4 { - position: absolute; - top: 0; - right: 0; - padding: 6px 12px; - padding: 0.428571429rem 0.857142857rem; - font-size: 12px; - font-size: 0.857142857rem; - font-weight: normal; - color: #fff; - background-color: #0088d0; - background-repeat: repeat-x; - background-image: -moz-linear-gradient(top, #009cee, #0088d0); - background-image: -ms-linear-gradient(top, #009cee, #0088d0); - background-image: -webkit-linear-gradient(top, #009cee, #0088d0); - background-image: -o-linear-gradient(top, #009cee, #0088d0); - background-image: linear-gradient(to bottom, #009cee, #0088d0); - border-radius: 3px; - border: 1px solid #007cbd; -} - -.comments-area .bypostauthor cite span { - position: absolute; - margin-left: 5px; - margin-left: 0.357142857rem; - padding: 2px 5px; - padding: 0.142857143rem 0.357142857rem; - font-size: 10px; - font-size: 0.714285714rem; -} - -.comments-area .bypostauthor cite b { - font-weight: bold; -} - -a.comment-reply-link, -a.comment-edit-link { - color: #686868; - font-size: 13px; - font-size: 0.928571429rem; - line-height: 1.846153846; -} - -a.comment-reply-link:hover, -a.comment-edit-link:hover { - color: #21759b; -} - -.commentlist .pingback { - line-height: 1.714285714; - margin-bottom: 24px; - margin-bottom: 1.714285714rem; -} - -/* Comment form */ -#respond { - margin-top: 48px; - margin-top: 3.428571429rem; -} - -#respond h3#reply-title { - font-size: 16px; - font-size: 1.142857143rem; - line-height: 1.5; -} - -#respond h3#reply-title #cancel-comment-reply-link { - margin-left: 10px; - margin-left: 0.714285714rem; - font-weight: normal; - font-size: 12px; - font-size: 0.857142857rem; -} - -#respond form { - margin: 24px 0; - margin: 1.714285714rem 0; -} - -#respond form p { - margin: 11px 0; - margin: 0.785714286rem 0; -} - -#respond form p.logged-in-as { - margin-bottom: 24px; - margin-bottom: 1.714285714rem; -} - -#respond form label { - display: block; - line-height: 1.714285714; -} - -#respond form input[type="text"], -#respond form textarea { - -moz-box-sizing: border-box; - box-sizing: border-box; - font-size: 12px; - font-size: 0.857142857rem; - line-height: 1.714285714; - padding: 10px; - padding: 0.714285714rem; - width: 100%; -} - -#respond form p.form-allowed-tags { - margin: 0; - font-size: 12px; - font-size: 0.857142857rem; - line-height: 2; - color: #5e5e5e; -} - -#respond #wp-comment-cookies-consent { - margin: 0 10px 0 0; -} - -#respond .comment-form-cookies-consent label { - display: inline; -} - -.required { - color: red; -} - - -/* =Front page template --------------------------------------------------------------- */ - -.entry-page-image { - margin-bottom: 14px; - margin-bottom: 1rem; -} - -.template-front-page .site-content article { - border: 0; - margin-bottom: 0; -} - -.template-front-page .widget-area { - clear: both; - float: none; - width: auto; - padding-top: 24px; - padding-top: 1.714285714rem; - border-top: 1px solid #ededed; -} - -.template-front-page .widget-area .widget li { - margin: 8px 0 0; - margin: 0.571428571rem 0 0; - font-size: 13px; - font-size: 0.928571429rem; - line-height: 1.714285714; - list-style-type: square; - list-style-position: inside; -} - -.template-front-page .widget-area .widget li a { - color: #757575; -} - -.template-front-page .widget-area .widget li a:hover { - color: #21759b; -} - -.template-front-page .widget-area .widget_text img { - float: left; - margin: 8px 24px 8px 0; - margin: 0.571428571rem 1.714285714rem 0.571428571rem 0; -} - - -/* =Widgets --------------------------------------------------------------- */ - -.widget select { - max-width: 100%; -} - -.widget-area .widget ul ul { - margin-left: 12px; - margin-left: 0.857142857rem; -} - -.widget_rss li { - margin: 12px 0; - margin: 0.857142857rem 0; -} - -.widget_recent_entries .post-date, -.widget_rss .rss-date { - color: #aaa; - font-size: 11px; - font-size: 0.785714286rem; - margin-left: 12px; - margin-left: 0.857142857rem; -} - -.wp-calendar-nav, -#wp-calendar { - margin: 0; - width: 100%; - font-size: 13px; - font-size: 0.928571429rem; - line-height: 1.846153846; - color: #686868; -} - -#wp-calendar th, -#wp-calendar td, -#wp-calendar caption { - text-align: left; -} - -.wp-calendar-nav { - display: table; -} - -.wp-calendar-nav span { - display: table-cell; -} - -.wp-calendar-nav-next, -#wp-calendar #next { - padding-right: 24px; - padding-right: 1.714285714rem; - text-align: right; -} - -.widget_search label { - display: block; - font-size: 13px; - font-size: 0.928571429rem; - line-height: 1.846153846; -} - -.widget_twitter li { - list-style-type: none; -} - -.widget_twitter .timesince { - display: block; - text-align: right; -} - -.tagcloud ul { - list-style-type: none; -} - -.tagcloud ul li { - display: inline-block; -} - -.widget-area .widget.widget_tag_cloud li { - line-height: 1; -} - -.template-front-page .widget-area .widget.widget_tag_cloud li { - margin: 0; -} - -.widget-area .gallery-columns-2.gallery-size-full .gallery-icon img, -.widget-area .gallery-columns-3.gallery-size-full .gallery-icon img, -.widget-area .gallery-columns-4.gallery-size-full .gallery-icon img, -.widget-area .gallery-columns-5.gallery-size-full .gallery-icon img, -.widget-area .gallery-columns-6 .gallery-icon img, -.widget-area .gallery-columns-7 .gallery-icon img, -.widget-area .gallery-columns-8 .gallery-icon img, -.widget-area .gallery-columns-9 .gallery-icon img { - height: auto; - max-width: 80%; -} - -/* =Plugins ------------------------------------------------ */ - -img#wpstats { - display: block; - margin: 0 auto 24px; - margin: 0 auto 1.714285714rem; -} - - -/* =Media queries --------------------------------------------------------------- */ - -/* Does the same thing as , - * but in the future W3C standard way. -ms- prefix is required for IE10+ to - * render responsive styling in Windows 8 "snapped" views; IE10+ does not honor - * the meta tag. See https://core.trac.wordpress.org/ticket/25888. - */ -@-ms-viewport { - width: device-width; -} - -@viewport { - width: device-width; -} - -/* Minimum width of 600 pixels. */ -@media screen and (min-width: 600px) { - .author-avatar { - float: left; - margin-top: 8px; - margin-top: 0.571428571rem; - } - - .author-description { - float: right; - width: 80%; - } - - .site { - margin: 0 auto; - max-width: 960px; - max-width: 68.571428571rem; - overflow: hidden; - } - - .site-content { - float: left; - width: 65.104166667%; - } - - body.template-front-page .site-content, - body.attachment .site-content, - body.full-width .site-content { - width: 100%; - } - - .widget-area { - float: right; - width: 26.041666667%; - } - - .site-header h1, - .site-header h2 { - text-align: left; - } - - .site-header h1 { - font-size: 26px; - font-size: 1.857142857rem; - line-height: 1.846153846; - margin-bottom: 0; - } - - .main-navigation ul.nav-menu, - .main-navigation div.nav-menu > ul { - border-bottom: 1px solid #ededed; - border-top: 1px solid #ededed; - display: inline-block !important; - text-align: left; - width: 100%; - } - - .main-navigation ul { - margin: 0; - text-indent: 0; - } - - .main-navigation li a, - .main-navigation li { - display: inline-block; - text-decoration: none; - } - - .main-navigation li a { - border-bottom: 0; - color: #6a6a6a; - line-height: 3.692307692; - text-transform: uppercase; - white-space: nowrap; - } - - .main-navigation li a:hover, - .main-navigation li a:focus { - color: #000; - } - - .main-navigation li { - margin: 0 40px 0 0; - margin: 0 2.857142857rem 0 0; - position: relative; - } - - .main-navigation li ul { - margin: 0; - padding: 0; - position: absolute; - top: 100%; - z-index: 1; - height: 1px; - width: 1px; - overflow: hidden; - clip: rect(1px, 1px, 1px, 1px); - } - - .main-navigation li ul ul { - top: 0; - left: 100%; - } - - .main-navigation ul li:hover > ul, - .main-navigation ul li:focus > ul, - .main-navigation .focus > ul { - border-left: 0; - clip: inherit; - overflow: inherit; - height: inherit; - width: inherit; - } - - .main-navigation li ul li a { - background: #efefef; - border-bottom: 1px solid #ededed; - display: block; - font-size: 11px; - font-size: 0.785714286rem; - line-height: 2.181818182; - padding: 8px 10px; - padding: 0.571428571rem 0.714285714rem; - width: 180px; - width: 12.85714286rem; - white-space: normal; - } - - .main-navigation li ul li a:hover, - .main-navigation li ul li a:focus { - background: #e3e3e3; - color: #444; - } - - .main-navigation .current-menu-item > a, - .main-navigation .current-menu-ancestor > a, - .main-navigation .current_page_item > a, - .main-navigation .current_page_ancestor > a { - color: #636363; - font-weight: bold; - } - - .menu-toggle { - display: none; - } - - .entry-header .entry-title { - font-size: 22px; - font-size: 1.571428571rem; - } - - #respond form input[type="text"] { - width: 46.333333333%; - } - - #respond form textarea.blog-textarea { - width: 79.666666667%; - } - - .template-front-page .site-content, - .template-front-page article { - overflow: hidden; - } - - .template-front-page.has-post-thumbnail article { - float: left; - width: 47.916666667%; - } - - .entry-page-image { - float: right; - margin-bottom: 0; - width: 47.916666667%; - } - - .template-front-page .widget-area .widget, - .template-front-page.two-sidebars .widget-area .front-widgets { - float: left; - width: 51.875%; - margin-bottom: 24px; - margin-bottom: 1.714285714rem; - } - - .template-front-page .widget-area .widget:nth-child(odd) { - clear: right; - } - - .template-front-page .widget-area .widget:nth-child(even), - .template-front-page.two-sidebars .widget-area .front-widgets + .front-widgets { - float: right; - width: 39.0625%; - margin: 0 0 24px; - margin: 0 0 1.714285714rem; - } - - .template-front-page.two-sidebars .widget, - .template-front-page.two-sidebars .widget:nth-child(even) { - float: none; - width: auto; - } - - .commentlist .children { - margin-left: 48px; - margin-left: 3.428571429rem; - } -} - -/* Minimum width of 960 pixels. */ -@media screen and (min-width: 960px) { - body { - background-color: #e6e6e6; - } - - body .site { - padding: 0 40px; - padding: 0 2.857142857rem; - margin-top: 48px; - margin-top: 3.428571429rem; - margin-bottom: 48px; - margin-bottom: 3.428571429rem; - box-shadow: 0 2px 6px rgba(100, 100, 100, 0.3); - } - - body.custom-background-empty { - background-color: #fff; - } - - body.custom-background-empty .site, - body.custom-background-white .site { - padding: 0; - margin-top: 0; - margin-bottom: 0; - box-shadow: none; - } -} - - -/* =Print ------------------------------------------------ */ - -@media print { - body { - background: none !important; - color: #000; - font-size: 10pt; - } - - footer a[rel=bookmark]:link:after, - footer a[rel=bookmark]:visited:after { - content: " [" attr(href) "] "; /* Show URLs */ - } - - a { - text-decoration: none; - } - - .entry-content img, - .comment-content img, - .author-avatar img, - img.wp-post-image { - border-radius: 0; - box-shadow: none; - } - - .site { - clear: both !important; - display: block !important; - float: none !important; - max-width: 100%; - position: relative !important; - } - - .site-header { - margin-bottom: 72px; - margin-bottom: 5.142857143rem; - text-align: left; - } - - .site-header h1 { - font-size: 21pt; - line-height: 1; - text-align: left; - } - - .site-header h2 { - color: #000; - font-size: 10pt; - text-align: left; - } - - .site-header h1 a, - .site-header h2 a { - color: #000; - } - - .author-avatar, - #colophon, - #respond, - .commentlist .comment-edit-link, - .commentlist .reply, - .entry-header .comments-link, - .entry-meta .edit-link a, - .page-link, - .site-content nav, - .widget-area, - img.header-image, - .main-navigation { - display: none; - } - - .wrapper { - border-top: none; - box-shadow: none; - } - - .site-content { - margin: 0; - width: auto; - } - - .entry-header .entry-title, - .entry-title { - font-size: 21pt; - } - - footer.entry-meta, - footer.entry-meta a { - color: #444; - font-size: 10pt; - } - - .author-description { - float: none; - width: auto; - } - - /* Comments */ - .commentlist > li.comment { - background: none; - position: relative; - width: auto; - } - - - - .comments-area article header cite, - .comments-area article header time { - margin-left: 50px; - margin-left: 3.57142857rem; - } -} - -.breadcrumb -div { - display: inline; - font-size: 13px; - margin-left: -3px; -} - -#wp-auto-top { - position: fixed; - top: 45%; - right: 50%; - display: block; - margin-right: -540px; - z-index: 9999; -} - -#wp-auto-top-top, #wp-auto-top-comment, #wp-auto-top-bottom { - background: url(https://www.lylinux.org/wp-content/plugins/wp-auto-top/img/1.png) no-repeat; - position: relative; - cursor: pointer; - height: 25px; - width: 29px; - margin: 10px 0 0; -} - -#wp-auto-top-comment { - background-position: left -30px; - height: 32px; -} - -#wp-auto-top-bottom { - background-position: left -68px; -} - -#wp-auto-top-comment:hover { - background-position: right -30px; -} - -#wp-auto-top-top:hover { - background-position: right 0; -} - -#wp-auto-top-bottom:hover { - background-position: right -68px; -} - -.widget-login { - margin-top: 15px !important; -} - -/* ------------------------------------------------------------------------- * - * Comments -/* ------------------------------------------------------------------------- */ -#comments { - margin-top: 20px; -} - -#pinglist-container { - display: none; -} - -.comment-tabs { - margin-bottom: 20px; - font-size: 15px; - border-bottom: 2px solid #e5e5e5; -} - -.comment-tabs li { - float: left; - margin-bottom: -2px; -} - -.comment-tabs li a { - display: block; - padding: 0 10px 10px; - font-weight: 600; - color: #aaa; - border-bottom: 2px solid #e5e5e5; -} - -.comment-tabs li a:hover { - color: #444; - border-color: #ccc; -} - -.comment-tabs li span { - margin-left: 8px; - padding: 0 6px; - border-radius: 4px; - background-color: #e5e5e5; -} - -.comment-tabs li i { - margin-right: 6px; -} - -.comment-tabs li.active a { - color: #e8554e; - border-bottom-color: #e8554e; -} - -.commentlist, .pinglist { - margin-bottom: 20px; -} - -.commentlist li, .pinglist li { - padding-left: 60px; - font-size: 14px; - line-height: 22px; - font-weight: 400; -} - -.commentlist .comment-body, .pinglist li { - position: relative; - padding-bottom: 20px; - clear: both; - word-break: break-all; -} - -/* 评论整体布局 - 使用相对定位实现头像左侧布局 */ -.commentlist .comment-body { - position: relative; - padding-left: 60px; /* 为48px头像 + 12px间距留出空间 */ - min-height: 48px; /* 确保有足够高度容纳头像 */ -} - -/* 评论作者信息 - 用户名和时间在同一行 */ -.commentlist .comment-author { - display: inline-block; - margin: 0 10px 5px 0; - font-size: 13px; - position: relative; -} - -.commentlist .comment-meta { - display: inline-block; - margin: 0 0 8px 0; - font-size: 12px; - color: #666; -} - -.commentlist .comment-awaiting-moderation { - display: block; - font-size: 13px; - line-height: 22px; -} - -/* 头像样式 - 绝对定位到左侧 */ -.commentlist .comment-author .avatar { - position: absolute !important; - left: -60px; /* 定位到容器左侧 */ - top: 0; - width: 48px !important; - height: 48px !important; - border-radius: 50%; - display: block; - object-fit: cover; - background-color: #f5f5f5; - border: 1px solid #ddd; -} - -/* 评论作者名称样式 */ -.commentlist .comment-author .fn { - display: inline; - margin: 0; - font-weight: 600; - color: #2e7bb8; - font-size: 13px; -} - -.commentlist .comment-author .fn a { - color: #2e7bb8; - text-decoration: none; -} - -.commentlist .comment-author .fn a:hover { - text-decoration: underline; -} - -/* 评论内容样式 */ -.commentlist .comment-body p { - margin: 5px 0 10px 0; - line-height: 1.5; -} - -.commentlist .fn, .pinglist .ping-link { - color: #444; - font-size: 13px; - font-style: normal; - font-weight: 600; -} - -.commentlist .says { - display: none; -} - -/* 通用头像样式 */ -.commentlist .avatar { - width: 48px !important; - height: 48px !important; - border-radius: 50%; - display: block; - object-fit: cover; - background-color: #f5f5f5; - border: 1px solid #ddd; -} - -.commentlist .comment-meta:before, .pinglist .ping-meta:before { - - vertical-align: 4%; - margin-right: 3px; - font-size: 10px; - font-family: FontAwesome; - color: #ccc; -} - -.commentlist .comment-meta a, .pinglist .ping-meta { - color: #aaa; -} - -.commentlist .reply { - font-size: 13px; - line-height: 16px; -} - -.commentlist .reply a, -.commentlist .comment-reply-chain { - color: #aaa; -} - -.commentlist .reply a:hover, -.commentlist .comment-reply-chain:hover { - color: #444; -} - -.comment-awaiting-moderation { - color: #e8554e; - font-style: normal; -} - -/* pings */ -.pinglist li { - padding-left: 0; -} - -/* comment text */ -.commentlist .comment-body p { - margin-bottom: 8px; - color: #777; - clear: both; -} - -.commentlist .comment-body strong { - font-weight: 600; -} - -.commentlist .comment-body ol li { - margin-left: 2em; - padding: 0; - list-style: decimal; -} - -.commentlist .comment-body ul li { - margin-left: 2em; - padding: 0; - list-style: square; -} - -/* post author & admin comment */ -.commentlist li.bypostauthor > .comment-body:after, -.commentlist li.comment-author-admin > .comment-body:after { - display: block; - position: absolute; - content: "\f040"; - width: 12px; - line-height: 12px; - font-style: normal; - font-family: FontAwesome; - text-align: center; - color: #fff; - background-color: #e8554e; -} - -.commentlist li.comment-author-admin > .comment-body:after { - content: "\f005"; /* star for admin */ -} - -.commentlist li.bypostauthor > .comment-body:after, -.commentlist li.comment-author-admin > .comment-body:after { - padding: 3px; - top: 32px; - left: -28px; - font-size: 12px; - border-radius: 100%; -} - -.commentlist li li.bypostauthor > .comment-body:after, -.commentlist li li.comment-author-admin > .comment-body:after { - padding: 2px; - top: 22px; - left: -26px; - font-size: 10px; - border-radius: 100%; -} - -/* child comment */ -.commentlist li ul { -} - -.commentlist li li { - margin: 0; - padding-left: 48px; -} - -/* 嵌套评论整体布局 */ -.commentlist li li .comment-body { - padding-left: 60px; /* 为48px头像 + 12px间距留出空间 */ - min-height: 48px; /* 确保有足够高度容纳头像 */ -} - -/* 嵌套评论作者信息 */ -.commentlist li li .comment-author { - display: inline-block; - margin: 0 8px 5px 0; - font-size: 12px; /* 稍小一点 */ -} - -.commentlist li li .comment-meta { - display: inline-block; - margin: 0 0 8px 0; - font-size: 11px; /* 稍小一点 */ - color: #666; -} - -/* 评论容器整体左移 - 使用更高优先级 */ -#comments #commentlist-container.comment-tab { - margin-left: -15px !important; /* 在小屏幕上向左移动15px */ - padding-left: 0 !important; /* 移除左内边距 */ - position: relative !important; /* 确保定位正确 */ -} - -/* 在较大屏幕上进一步左移 */ -@media screen and (min-width: 600px) { - #comments #commentlist-container.comment-tab { - margin-left: -30px !important; /* 在大屏幕上向左移动30px */ - } - - /* 响应式设计下的评论布局 - 保持48px头像 */ - .commentlist .comment-body { - padding-left: 60px !important; /* 为48px头像 + 12px间距留出空间 */ - min-height: 48px !important; - } - - .commentlist .comment-author { - display: inline-block !important; - margin: 0 8px 5px 0 !important; - } - - .commentlist .comment-meta { - display: inline-block !important; - margin: 0 0 8px 0 !important; - } - - /* 响应式设计下头像保持48px */ - .commentlist .comment-author .avatar { - left: -60px !important; - width: 48px !important; - height: 48px !important; - } - - /* 嵌套评论在响应式设计下也保持48px头像 */ - .commentlist li li .comment-body { - padding-left: 60px !important; - min-height: 48px !important; - } - - .commentlist li li .comment-author .avatar { - left: -60px !important; - width: 48px !important; - height: 48px !important; - } -} - -/* 嵌套评论头像 */ -.commentlist li li .comment-author .avatar { - position: absolute !important; - left: -60px; /* 定位到容器左侧 */ - top: 0; - width: 48px !important; - height: 48px !important; - border-radius: 50%; - display: block; - object-fit: cover; - background-color: #f5f5f5; - border: 1px solid #ddd; -} - -/* comments : nav -/* ------------------------------------ */ -.comments-nav { - margin-bottom: 20px; -} - -.comments-nav a { - font-weight: 600; -} - -.comments-nav .nav-previous { - float: left; -} - -.comments-nav .nav-next { - float: right; -} - -/* comments : form -/* ------------------------------------ */ -.logged-in-as, -.comment-notes, -.form-allowed-tags { - display: none; -} - -#respond { - position: relative; -} - -#reply-title { - margin-bottom: 20px; -} - -li #reply-title { - margin: 0 !important; - padding: 0; - height: 0; - font-size: 0; - border-top: 0; -} - -#cancel-comment-reply-link { - float: right; - bottom: 26px; - right: 20px; - font-size: 12px; - color: #999; -} - -#cancel-comment-reply-link:hover { - color: #777; -} - -#commentform { - margin-bottom: 20px; - padding: 10px 20px 20px; - border-radius: 4px; - background-color: #e5e5e5; -} - -#commentform p.comment-form-author { - float: left; - width: 48%; -} - -#commentform p.comment-form-email { - float: right; - width: 48%; -} - -#commentform p.comment-form-url, -#commentform p.comment-form-comment { - clear: both; -} - -#commentform label { - display: block; - padding: 6px 0; - font-weight: 600; -} - -#commentform input[type="text"], -#commentform textarea { - max-width: 100%; - width: 100%; -} - -#commentform textarea { - height: 100px; -} - -#commentform p.form-submit { - margin-top: 10px; -} - -.logged-in #reply-title { - margin-bottom: 20px; -} - -.logged-in #commentform p.comment-form-comment { - margin-top: 10px; -} - -.logged-in #commentform p.comment-form-comment label { - display: none; -} - -.heading, -#reply-title { - margin-bottom: 1em; - font-size: 18px; - font-weight: 600; - text-transform: uppercase; - color: #222; -} - -.heading i { - margin-right: 6px; - font-size: 22px; -} - -.group:before { - content: ""; - display: table; -} - -.group:after { - content: ""; - display: table; - clear: both; -} - -.cancel-comment { - margin: 0; - padding: 0; - border: 0; - font: inherit; - vertical-align: baseline; -} - -#rocket { - position: fixed; - right: 50px; - bottom: 50px; - display: block; - visibility: hidden; - width: 26px; - height: 48px; - background: url("data:image/png;base64,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") no-repeat 50% 0; - cursor: pointer; - -webkit-transition: all 0s; - transition: all 0s; -} - -#rocket:hover { - background-position: 50% -62px; -} - -#rocket.show { - visibility: visible; - opacity: 1; -} - -#rocket.move { - background-position: 50% -62px; - -webkit-animation: toTop .8s ease-in; - animation: toTop .8s ease-in; - animation-fill-mode: forwards; - -webkit-animation-fill-mode: forwards; -} - -.comment-markdown { - float: right; - font-size: small; -} - -.breadcrumb { - margin-bottom: 20px; - list-style: none; - border-radius: 4px; -} - -.breadcrumb > li { - display: inline-block; -} - -.breadcrumb > li + li:before { - color: #ccc; - content: "/\00a0"; -} - -.breadcrumb > .active { - color: #777; -} - -.break_line { - height: 1px; - border: none; - /*border-top: 1px dashed #f5d6d6;*/ -} - -/* ============================================================================= - 评论内容溢出修复样式 - 解决代码块和长文本撑开页面布局的问题 - ============================================================================= */ - -/* 评论容器基础样式 */ -.comment-body { - overflow-wrap: break-word; - word-wrap: break-word; - word-break: break-word; - max-width: 100%; - box-sizing: border-box; -} - -/* 修复评论中的代码块溢出 */ -.comment-content pre, -.comment-body pre { - white-space: pre-wrap !important; - word-wrap: break-word !important; - overflow-wrap: break-word !important; - max-width: 100% !important; - overflow-x: auto; - padding: 10px; - background-color: #f8f8f8; - border: 1px solid #ddd; - border-radius: 4px; - font-size: 12px; - line-height: 1.4; - margin: 10px 0; -} - -/* 修复评论中的行内代码 */ -.comment-content code, -.comment-body code { - word-wrap: break-word !important; - overflow-wrap: break-word !important; - white-space: pre-wrap; - max-width: 100%; - display: inline-block; - vertical-align: top; -} - -/* 修复评论中的长链接 */ -.comment-content a, -.comment-body a { - word-wrap: break-word !important; - overflow-wrap: break-word !important; - word-break: break-all; - max-width: 100%; -} - -/* 修复评论段落 */ -.comment-content p, -.comment-body p { - word-wrap: break-word !important; - overflow-wrap: break-word !important; - max-width: 100%; - margin: 10px 0; -} - -/* 特殊处理代码高亮块 - 关键修复! */ -.comment-content .codehilite, -.comment-body .codehilite { - max-width: 100% !important; - overflow-x: auto; - margin: 10px 0; - background: #f8f8f8 !important; - border: 1px solid #ddd; - border-radius: 4px; - padding: 10px; - font-size: 12px; - line-height: 1.4; - /* 关键:防止内容撑开容器 */ - width: 100%; - box-sizing: border-box; - display: block; -} - -.comment-content .codehilite pre, -.comment-body .codehilite pre { - white-space: pre-wrap !important; - word-wrap: break-word !important; - overflow-wrap: break-word !important; - margin: 0 !important; - padding: 0 !important; - background: transparent !important; - border: none !important; - font-size: inherit; - line-height: inherit; - /* 确保pre标签不会超出父容器 */ - max-width: 100%; - width: 100%; - box-sizing: border-box; -} - -/* 修复代码高亮中的span标签 */ -.comment-content .codehilite span, -.comment-body .codehilite span { - word-wrap: break-word !important; - overflow-wrap: break-word !important; - /* 防止行内元素导致的溢出 */ - display: inline; - max-width: 100%; -} - -/* 针对特定的代码高亮类 */ -.comment-content .codehilite .kt, -.comment-content .codehilite .nf, -.comment-content .codehilite .n, -.comment-content .codehilite .p, -.comment-body .codehilite .kt, -.comment-body .codehilite .nf, -.comment-body .codehilite .n, -.comment-body .codehilite .p { - word-wrap: break-word !important; - overflow-wrap: break-word !important; -} - -/* 搜索结果高亮样式 */ -.search-result { - margin-bottom: 30px; - padding: 20px; - border: 1px solid #e1e1e1; - border-radius: 5px; - background: #fff; -} - -.search-result .entry-title { - margin: 0 0 10px 0; - font-size: 1.5em; -} - -.search-result .entry-title a { - color: #2c3e50; - text-decoration: none; -} - -.search-result .entry-title a:hover { - color: #3498db; -} - -.search-result .entry-meta { - color: #7f8c8d; - font-size: 0.9em; - margin-bottom: 15px; -} - -.search-result .entry-meta span { - margin-right: 15px; -} - -.search-excerpt { - line-height: 1.6; - color: #555; -} - -.search-excerpt p { - margin: 10px 0; -} - -/* 搜索关键词高亮 */ -.search-excerpt em, -.search-result .entry-title em { - background-color: #fff3cd; - color: #856404; - font-style: normal; - font-weight: bold; - padding: 2px 4px; - border-radius: 3px; -} - -.more-link { - color: #3498db; - text-decoration: none; - font-weight: bold; -} - -.more-link:hover { - text-decoration: underline; -} -.comment-content .codehilite .w, -.comment-content .codehilite .o, -.comment-body .codehilite .kt, -.comment-body .codehilite .nf, -.comment-body .codehilite .n, -.comment-body .codehilite .p, -.comment-body .codehilite .w, -.comment-body .codehilite .o { - word-break: break-all; - overflow-wrap: break-word; -} - -/* 修复评论列表项 */ -.commentlist li { - max-width: 100%; - overflow: hidden; - box-sizing: border-box; -} - -/* 确保评论内容不超出容器 */ -.commentlist .comment-body { - max-width: calc(100% - 20px); /* 留出一些边距 */ - margin-left: 10px; - margin-right: 10px; - overflow: hidden; /* 防止内容溢出 */ - word-wrap: break-word; -} - -/* 重要:限制评论列表项的最大宽度 */ -.commentlist li[style*="margin-left"] { - max-width: calc(100% - 2rem) !important; - overflow: hidden; - box-sizing: border-box; -} - -/* 特别处理深层嵌套的评论 */ -.commentlist li[style*="margin-left: 3rem"], -.commentlist li[style*="margin-left: 6rem"], -.commentlist li[style*="margin-left: 9rem"] { - max-width: calc(100% - 1rem) !important; -} - -/* 移动端优化 */ -@media (max-width: 768px) { - .comment-content pre, - .comment-body pre { - font-size: 11px; - padding: 8px; - margin: 8px 0; - } - - .commentlist .comment-body { - max-width: calc(100% - 10px); - margin-left: 5px; - margin-right: 5px; - } - - /* 移动端评论缩进调整 */ - .commentlist li[style*="margin-left"] { - margin-left: 1rem !important; - max-margin-left: 2rem !important; - } -} - -/* 防止表格溢出 */ -.comment-content table, -.comment-body table { - max-width: 100%; - overflow-x: auto; - display: block; - white-space: nowrap; -} - -/* 修复图片溢出 */ -.comment-content img, -.comment-body img { - max-width: 100% !important; - height: auto !important; -} - -/* 修复引用块 */ -.comment-content blockquote, -.comment-body blockquote { - max-width: 100%; - overflow-wrap: break-word; - word-wrap: break-word; - padding: 10px 15px; - margin: 10px 0; - border-left: 4px solid #ddd; - background-color: #f9f9f9; -} \ No newline at end of file diff --git a/src/DjangoBlog/blog/static/blog/fonts/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqW106F15M.woff2 b/src/DjangoBlog/blog/static/blog/fonts/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqW106F15M.woff2 deleted file mode 100644 index 0fb066c55bf8721bc6ddf650ed76208b21ddd250..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26368 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%0Dog?`W~V4;Yj5&}{JQU+om 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�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 z z$58lL!sssviZy<)(8KnJJIz3}2V6_=zLcWq;VAmNY;K??HC5jMqM;D(O5jqX!)ks( z3|j4cl)%*bYEq{sRL>cgiSNPeSq(YQL(}qVgg-6l_#EAsn%C>y5ziT&lw9DH^26uv z=M&_aTePdK)5ZNJJn;wtXB@iFg-}!ECdQ&rbq5boeSvHF&6Ng@u`t(955=$L>&SC- zi2DD7MqpEe<9$FpVtg}xnwNr{3sq<(2py#PaJ=JGS{0g;5DrG>mB2!{Ybrc7l_p43g5lg+A^A6BH&D{4d_ zR|z+=I7|V24swK}O1PUqwluwXdO%#8qKGprJH<~)T+%vrQgSRF`mtU^HzbxEN@;;G1$mZVsN*g zrtlDi05_ldw)RN)`SNsve^`+RS;<9V9D>PkZ_eiMMb9@M#S{6+S+WNQDU)bs#9=T?c7(!jArcqM zWzsRl+)5x_5qFa7;PRa3hN{-s?8~wkrH_K$$XDEze&kY;dY|PhpCrjDkNChheoYGh z!=KX@-2jB}n+Yxn{=LjUmz9yezM+i`Ysrc~7yOPU9bbWFxcM^d@|*8`w`@g(hVmP^ zm%W>4&xm|0oMJD(?{NfDX<(o*xqz{v^X1?98rYqBm!>_6#+cu z0iUHJS3TCaG4)9oG^Mwh_o>EoM?Z|dm(;#u z0y7QFVlPX=qWo%kj{HPR3!(QNeCL(TK8qAeU_}+DwQ4DofydAfkIU62j(&}X+EhS- zASo)*NL$Mhjv(T!sMdNef%67#c8R>6Zm&}SEjEZ$G`@f)sGC96lPR>Z2$W=V9(jX9 zY8>5=*T)H>dhM*XaFDT~i`>iD=gJberDLPK= zV8P+2|kKZ zwq48FLa{<1gj?GKcw+n*u9y$~zac@%CSF&B3!X>h-o$87A`3Do;u{fC3a&F9&GKx-kLs)mCBaz1 zt8}%1=f+Ogt6>R$MpBbjiAh$iAu-vJur8ih3d6*T6?B{8d;lgPf`Hzj8NHEio4O81 zJ;9mbY`@6bk-X;k&NKh-ITGE_aF9uv^uueF#u@loaN7t5rH?6EsX9XrROtNladKjZ zbq+`&nvzE!sBq8Ef+WZrR_XmI@7YvjAc6`RKYbiYr&IL`c4;%gjK(CW!1-Om^YmvK zbP)~Y*J49&X@~+9=hyL+zq~k6rtmt8e)%^l@4oR0Af58)+iMos%YLQ2KvRNYozgU` ziPo6R_S41iSJv`eJ)9IrZi{Q!D+@F<*!gt zm6$Gyg2!IU7TQVAQaS%IZYk#FD3Zkm5z2RYXb19Tej+qA*TIL?Us^7Z&ZldQ#QR<7 z*?TP5-%pD+70@h}mDkJ9kHumY)w*9{;_nTKqK_Bgaw?tuH`h*?L){~KlPIJ!I1V?p z2xBk|f&(zCvsJl|je7+4^FS$;V`zTVkn<+frkd;Pm(`cHe zU&R#saj$W!ZTed+lK~eK=#Mb3L=B?;~eje>_ z+o>`q_GdT37Wrt?JM38DRnN$9c}4w|TyBa_=9#hxc-v*}RqSpIgI{VpLC`GA3z}2) zShL(P?rP9>e0Bl}ucvPD*~baIjZS3+m%+R=+5_ zJwZunwv0)?$tKo^kEaw7JJ&~B0fW)6^f^`vcHjYgE=tZcLaOEp(Nej>hEPSF3AhdD zOj@wcs8SR4cIUR06$aJ-GZ0?Kcnl8}gc@{;rZ94&skk&L~sF5dU(cdA>QiVe2> zCb5BOi35eO+hu^upyN;3F&l7PjlYj%zL7I_hJVa{epWTYgj(t%PS7thQ0(eUE-_tm zk}g^1IE1*7o&CxCR%Px^ojYqUib?D-*OHX!8> za8B=^gNllx0HAb$+Xh#GcLJBV5qL(iJ#ZlrXj2(01jTQ5G38AT=% zRWMNn&u$g)y!AQrN5l&IC=Gv@MguZ`rYYtrww7X0-l=|<5#=#x+9oibW6t8((OH>A zHda#AO^!JHm|X{Vf+eW5$YT(##cWe_@6@7YR%eJl>gjhjm}q`scq!b=Xp_c%0W z`B!GFa_x&0Gz`LX1IGIUvGR@`MsBWoIgS{`RzGSrSsn7YrA(; z6L0aPCqjTubxx17} z5w)N7EJxffkIiiMbt9}P^e9`;Q3oomB}V1{{}hK&-!o#hIc75cHiB( zGD?;)>z3sY47g0KXX3T4OCtCj50mm2#505H^YYQCb2S|HuP563xC;&d-u|_y6h=cH zp_h-@6x>UbY}?Tj9Yt$!BMCpPx=4Is;tzx@e9^W=HeE-g(OsjRBe!y(7`6Fyjp8ek zYr5<+RLjNkbe9;A<=VCq9GnuI|0 zi8LQ4b4_N3g!ajoz$dK74fwKZsxE0TlmyPG+_IU0p+V5f!IRYz9uzLd>!#H(m3=$G zkQ63SCcL7kC{|+Y7Mbz-7tFwMVP6Tn)P~>D*KYjv%0G=KPoKf{kStV_6&Z1WG0HC1l*vL!^Yr3t)}2DQx9?b!hvfc?KDb4o zh%27Sh^y;cYGe#{HX~c)SKk+y5Ny^TS%g|Fk>2l@K^S(HRmZuIb+9^;WeW{7iwdG3 z&)7+GBgRY-A1iLV_3N?(>K2_{Tl}NIENu8gu-5_!0{Y&Efqm{l-UC^pKniT$@PL&S zJ{SXzmb!`du|*5Kqzl|zLL+#OE+>s_r7&x&tVQw)ln?$D+yQ*z6Pb1L=7-U09f%{e z$mIAl@m6}$DMJSQnuMiirPSE>sk$DD;XX`iUs++Bg+*wdGn>Z%9VB3B{?YNc;$W_? ztZ+kyT=l&P1DNS?+R&j(&{xd!AhK<0=>~|*06SpSq|1c?Z$$wT2JgkY@D+VUzfov! z1f)mIPzycjVOH?G>abk(iCoWM3=CGpHwDi7GEVHs8yLJ?e5YgPXiSAi12L8n^Q<-I zyZZ^e%NL2bv0BeS2T2rFWxVk4xJ1X;0Lysu@zPgpX56Mi-rV54i)QXzSEoRVon}dO zK%+|2B|-c?FsxIVqWhl7@YpG*Gh|Hb;oL%I_U~h!v7W5EiO7LdY#<6Kuv%6X65J9k z*Z~@nLn`IcY=L_&mTTA@)tPXKTzMOHq6mdyG@H1Y^Hz=J8DFtS&55W#opWx9d~~z# zXeh7b(^GFJ#Cn$#1Zs}sne#fq@|lPfz~?DZKl5{LrF?#8-;v*LKk!)c?JyvOGMW}6 z(m`|Hlf0a%8D^rM7Y8IsbeRV!!?L5eqxw#PbRr_P!aajy;Di+-I}ZRN6xr2p6=}fHk@AFk(wrR4RK$2CN6( z#CRQg-4%2X$+E6dqU)qwIy`3@#O+kxhy4e?84b`K_$=>YL4|S*&u?0{#63f*>Kak6 zuo32M=8Wq|N^k>ngnSrDDZ(|Y`(US3ER{$XkY(7>o+v{)%WzlVwj*z4y|o&S*>8^O z`r+Y*JoMvn55C>jK2H2b_LMOtTH16`-I_TIHXLUi1b?R^SKBU_mX7>Kt=H?>umS&c z3M{O}A0fS-4ayo9L0gL_QJk7|*0#nrE}PwS7el>l`zdJU8kUeoF{u%GvemlOgAy)q zlH5FW$@L81TT=@bkK{}$Nfa*Vt*XchyPCUO1D9*lBytDFAt}0PTem|}^W{hSTMRjT zYUS%X`~Gj`-J6289Ph-E=$+>5;KewCs;_sDvOCym&_?vZ`9rG|L5UbW8MdXiyjF56@(iFInhB)J9jvnoK!Y zZBBCQ28g;dYehn2^N@}E$V(Z`OTyfKP&9feL)jl~7FK!`D2*D+M@hW!47u-_H5%*? zkV@Cq0#oGQgPZ)<$zSh(e|*aPz6z`0{@kx$Z!%zWr|-RRUn;ZCs8_^nez-Si z*rd3onsRShbu71Go&AKie7u8?(Ht0A^#-%SMqQ-NoqhpN3s&I)?ACLmOYjLZ)y41- z^D0{ORQ)_8iH`Dm!b@c=+)|nXroO`?cn_b{Kh}d*?WSAU;Fy<|BTOd884O8oP zgAd#^Lik;k5i25KG*HP>`BNj7x_C1eaMey=C$tE=gtJ^D8;J3M5ORdbktM_)$rR$R zdUG@5js+qB6fyFE9016IZtL?U!&R4&whi#krlhDaQLsSC>vNrUH{Q7?pQ64d#ztMV2S=W2Q^uap5*CjJtU*bos7>8`;O}qSlMpg~8 zQRBj_HM7&!QK^M{u`yGORA9?canKM$3DDt$lBD<}rHJu8N|WJ$3LrSU0v}c? zg0VJN@>NR~enPIogS6+G?CS>tU=xSfM~mk|>{iSsPl`;8=4GO6Z3}j}(0H9GT+H)fgIP=!$6BgW8woo; zYZQ@iWO8Jzl)|oq;9E0IeP@Uyj39hfiADNteO`#q**huL#0Cgw(@QGH5Hp6B#@`b|IN+!dLnn?&f+Q9x(qzbz zqezJ|6>2nSGR8)%u*L>k>~X*mC!BG?6*t`Rz>}?PV+UUB5&@ZH@PcgKlS4H%za#NG z3Nc^_fkcof5<}u3M4+XSq@;w9v}DB8GRbPW?=GGxk< zEk~|A`3e*&QmjO&GUX~%s#2{+trO~;RPU72&N%B_593{M(IuB%an&`~HE7hNS&LR} z+I8rN3E}gRwUlrvcT)0FW{#)6BSIHKp;Nl0AcQh}9Wek>GkmcILq@FTb$^!ixl^s{^2g_9-GO+l4 z2F1_6=TU2k$j4>Ca-}=T60d+t^BXR)7mz?F3x(EKpJc4;d@Y{F$_yb0-2a}F1E6w z33m=ci)P1_2ehyJ^1O7!D*yqMLB;?`=xK0$2|Nw$;~mJ!7U&a{qJxb)v}}Bip>@cY zK$AP^Ut~7*xc%qahz+D?Q%MK&6D5Z%DF*E(Vy+dP4bR0fWYu7CI`;Ay?Sp+$wi9nD z9%7ftke*jHN?xW{Y<{cpY!aw_S)bO@AhIlXJx#A|PNxg2r8cAdK^_^aV3zpC;7Cb2 zq$TAN-QtZ&uiY=Mz+Nw6tH?<<FCPFt4}h-j!b-q${|_GAEmpQwD6FY;BsiTA;S zRCnl!ebm1S~20BO~qHcA*HwMj3$i}=fpdHgaPiOQr>$UW9)bZj2;j8#h%IVE|!Nj z;#z%x!Ic?UVuAjpQr@%Zuy2tmy^CG$nG4fBfO!UgpmS1T$3TVcgJ#->2aLv7w2U=r z9_2LkcCXhobg!uI#MHIf)V8o|TBf?j0#&t}%DNOPvR&SUWeu&AHhfAd9XiW%wo-I|jG1^=_zhS)z5bN%caFpBT0O0Ktm@Qk)VhZP*ISmg|a4Z%1mf`l1MD zCs;Y5(MGL0IIF7Ia8u(?_;|2dInk<(x2nP8V5pkVxaL2`8-cl^4NkcjH(ENY7Hn1W z4VfA}p>bn%{f*W)_TwM?Y`body)v~UXzl>tSlO|q9yM^C7JAK&B*c&A(}xc*dstBS zxg$RqY>H1r>8N9Krrdg7EC%{gc%HLb&X{m$a`Ec1%bUFjirJ)F=Z%R{D;9Qc_CPc5 UcvwA;rb=>|#XkJ7)1UifyfYnu5b&3 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 z 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�y1BX2w-_>#C z$oBK5S@0124XzgZ6hbbkS%)_>Foj`o+-#!;7ew|UNJNu74qH?aFU)j*RcQjRNCkpz z&!bAA>={B8SyBQTO_bNeP_7L|tkmILts|AxAlRPnQT!e(k>Fl9%dRNv6Y;oRA}2VNm^khc zrf<~`b$f$Bcl0T93-j+}7@k>zb-;JpI^g&(n-^R}WZz*-fYCfR@%={K$ZeoBt;$L{ zrGA)$9?$~r%%yWAwuH?C)BYuXYjuJ^F(6>66KwaP7mxcUnyhXUPv(YX#aA zX}jd8h}OJnsA7f2v)6p|@)n~%9)}0kCDVDCK+82fEZHz>d!x#{tCvvk1F~2WVAiG6 zW}jUUJ*S}Rmra!3P=#Rrd*5+`9>LJcaVIAlsds0l$SYmmd)3P+y$OW@j-^YEbxZ|N z#}~yiEi4EoP7*G=_8q%eLUEOsi@GJ|8aFvb<-s&y^xikEk7 z_u=$O0|W&}iADVlys=CIv!OSK)5EYLF~Tf(`9*Yn3z7Vi4#L~=fbK1g8itF5#dK20 z!~9g+)vF4qSpQAM%V_%49-K+Rp3ZJ`OKJ6rRB^@zT$~6Uy z61WjOO{Qi@LS&WZW66tva-JRq@;M{xthqDsX^Xu#u@6VGWSV#ruX{M|V;dJj2y=yz z(}-h5Aa3(gG>`o5kcP}GG!$-tTbJP~QXSPx#-?fKXRTAh+jt=J$pE%_%ZpK$_QWHJ z+60T7ltQrncWDSz0K1bPRke1ur8bCOtGSS=T1wY?G^>|sanQrEoY1A{|DU+#d0+i{ zJPMw3&r(z4r)H>`QoRJPXcw!%ij#Wj%zc@x20Higp+qS;4(9GZ=0AEpUe%*nljF3Dpi`lCbQE1g*Hz&(s#=-KAz{RpI5VKB(1ge8{I@yMVL_J% z>~s(t99*12M5#W6>goD0?EK`UN8MG*dYqTzDkt?Bw|mltLN-d}GcxL7t0R5sb=rZQ zRw{E7Hy^^!t3}ywQc>k=NBJg&LYS%XG~Q%H`eyhD97YQyA3{V+Y1@xQwOoa^n{Lyn z&oXHSQmIbFG6{wi3702@nKoAggxeup3T;i}JXyM12Wct8SY@I#Yec0qkq0_}P&>kL zO_VXkve|YoFA7$rCuhoQBjTmS+nw>#yg$AsrrKc9b(KWH!M`L*7Q8^}phYQi3CZqH zW=b(lvv3c2m7)dv_+;@!%3S+pmT)hag;N0z8I0aote1m~x*KxkXtD z9X{n&t_{{w<%LbjqbBH>D$!_|R5$g4YvCr27-U(JpjgUh8SGb@wTX?H>^fygrKf~N zeLDv1l2ukE!?FzgaDgbON$y*Wv)txU<@Deh*BTrDs3KlKP-!EC1OyeC!VF^L7`>iB zbX!?ST{@%bUsv#ya@8#TY%mx(te9hgd6pDOa`l{~-0ES@%*Ix{MdQu+nGwe|XX5^b zR@W5TaGaab2U37Q%@cE71nJvSI#8S%@QE@t6d#i8$lClTiLK(~>9X%0Da%wbt8Oe} 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 z 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 Pu4qbk^nN#<0{{R3`@#bj diff --git a/src/DjangoBlog/blog/static/blog/fonts/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWu06F15M.woff2 b/src/DjangoBlog/blog/static/blog/fonts/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWu06F15M.woff2 deleted file mode 100644 index 2e849f65afeac077be56acf8faeb4067ccbb855f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17880 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 J(Lr?p007wi)93&I diff --git a/src/DjangoBlog/blog/static/blog/fonts/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWuk6F15M.woff2 b/src/DjangoBlog/blog/static/blog/fonts/memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWuk6F15M.woff2 deleted file mode 100644 index e5c936bb102b8d01d7511fca8bb67ebdc059e8c5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22920 zcmV(@K-Rx^Pew8T0RR9109l9t7XSbN0FbNz09g$H0RR9100000000000000000000 z0000QgBTl&HXMN(KS)+VQiELvU_Vn-K~#YtCmsNSEGrWTf;b7E6fag05DLOXx^D}C zPyjH2h7JKX0we>290VW*i3kUVatwwR8+M8p7`F$+?Ev((|Lt8f;f{AZExRWsc4Q!r z0|u`S&Hw+WBquTy;tolT)vDiEFtQ3o3WxSSXbPG85J{eB(M-885-E4VkZ|topvRTL z8b?wkpLb>SI5?4x519HvEv__DFIBEZtKL3^|1b3HoG7EFs^8&XV_iSp_b6QKU$Gra zl2DzTxMhe8!&0(f6n9?y{XsAZ778=BXHYocOwKJu9ei((Amh3$Z7Mng@ijj3bR*%w z!3{-Hu5I;!j^7!kSHC>#56_DBz9fk5>1gaM(jU^Jz{Mx|b9)7g0C#$bl=b|1eop_~ z=av_Jv6nbOEI=VaYBK+;Ogd9$MhM$Cvx#V@+G)+u*zo+^{?A=fIU>a@w4d*84#WgZ z9yU@T)%Pyg7y~vo=77Pd+D6NWk}M-J3w?fk`i0?tTm7G@o!Q8|T{HVK;_JCHul{ai zY&&6Kf{Gw52q*}GVxl8X;k{=OJVod<9Re1xn&Guo%hK0aTFbb9hLeoS`1q*dvf+C;=+6oVTWk|Aed&+oNWs%Msvf@w%ZN~aWJP%ZHzY{DFZkL&?}fc}2}y7o&uH*&UVDWPd82j-EDAR;drv`r3_ zVp5BJR|>b?Zo^QaB25Ab$RTroOiG7P#P25roo8av0}v z9$F6VKP+l@1-ZokCWs%FP~@k={=85e1fR12=#X;d-j$C}|A2KE0uDn^VJWJBLatKf z&~(mCt)eL18UFiUPRqOtXXt-{RGU>c)NYrv^#RHstqvukIU*yH=W0@#;)!HM+8lnj3p8L*pr1s!5 zCn7F!9c1}mbgX?0x1NbzYohK5H}nfsge}=PqD5^HHh7-54KaC}Wf0D`{-2hs~!=wBFsZ40NnvT!!f5SsuD)G=`r0jR!N46qdd z1;jd@{y!F=g8K|O3AergJ_UIXd=dL2@NJ^cz<1Sr2EHNlEASnRufe_Wvv0tk-1-(w zxbq8qO6ou0Ym^;~000gE0(-F8yC9C^aV&i|v^gTE8|Cb0nIbto-8s%`dHJJN5Z5P#uZOEjExKJE05T&JNCV|C3N{|X9y7Z zH2?tskoreyAz=Vv=jerT_#xgKhV}M!vzCK%O|=@Fr{>MzqFh_o^b82;;zE3K_@6-~ zocenLHV7uF0I&W@mT&1lOn|_|xHH@}T!YKU@o)(4y5)++$pTxp5Me?g0RM|V8k!vH z8mhtOV|iEvdwuxIu+uO+yaf;A3bq749h@EP9c;i9V}uw6CT!@^(21b~SQ}WEtqbSm#u1bXRsV2c~3}`pt`oc&PPy+yfm<9khL=g4= zQ!HLy7248Hc=8q{gg{y@AEk_9PnPb|+r$w?7eJXZa%l!SdsL8?fy0Hw1&? zgbgmSb1-gSShWo7;}F3Gd&>cVpUW*o?gjOK8cRhyec{S@E-N14_)ofcw0%tvfdQ~Q zn+g@C9Yy%j5ZP067?>ZZ{xZ%^tBW1{jDEVHrssean2pn^v6Lpe-1; z8KTRf(8!1PoX8#!{1LG{(UCiTl#rhESxkS7pub0t*HuV%9X|h)5=q}sXR=?4P9Cm! zGDO4+Apa9dzgAsIKc(Ae33)@1EK3I5u2;vk;zwQ#8g5V{1athU6L;+?2n-Erh#->v z160E&M`L!|^z4bCXIq?S>OBT?h4vS&%D^Cyv4C=S5QabYnM)d+N&{g3oSk&=+tBhV zZz_5`MaacARA69ZtQDRD0PB||CyZCEJe`Yh4+UasU9=wv09$V;H5jZMEjR!u&!(XG z#e9e%<>Gd3SILJG#Gwz$G@eOh;z}veD?(+f~qjx>whwKJ2Hbqn-1cx>r^Fql7{K?$;rC_s6Jx?-yu&|DPE9=x^xz^t*WR#aA%+#b2TL>Mxl4 z_ScyFaWmMzI)nMY6RdBF{OxnmwuXPS`NwqaUrF`9X7~S@rurAV^`BJr|G4u1KYd~C zNZNOV@l>$-nYf&1C@aqrYtK2ipEun4s%z)@lZwLW)ZQfxJAa66i0Ehs}Y8M;>vy~Dk zbhmQi)qf3o5X-1?8B_tTOa3wQd!2#H(k{DM1?~V$l@Nau}uk;_Rqo+>`7m zESUC@6TvKkqfT}6kd|rmll^8nxCDd>l&jFH&3OOS|Lyy*D1)ZW%2Y%v=d_!8FXjFf z`?E(N!!SOc2I*XV`z=ce0!KPCO2p9s`F^7O64=VBUZ6=-BwO!$S@L7KMc`lY~_DQ3JWNr)NvW zmZwZ0%$zmzhKQBKWYB3Sl2~6?TT@+CSz#?ND=jH5DlEv)vzSdrLoTSFrqgQFDy2d$ zlS;%QK$yelaXHy+7L!4zQNxff{ru?gP?iEe;l}#ta7`sYxY@^Hw+u3Y+Wh)3Z3%AV z%wX(VO>Kf64aSY0#)8pvGiio7P?AFo z*<9bzhf@_DX#gGNn3M@HBgIYvW`qH!6Rw|KBtNB?ww_V4Y}l>MRY}81|1>meTR2%p z9Z*7Ly;_{xmyfwbR22?U*!Zq}0LWmz$E1YQ{CV`20-_}mq~XQTNk4F#H8E@Kc0P9xZg;!%qh ztMP1ntm%^1rBmye84W|e?6y5QQo*K%~9E! zvriX6JulmD!uAo1E*!X6xL-mz#jY!}sQTeJ7qwQRDa(;x`6O4k_Ttb*6AHhvr z=M6y{fB3$+jPxpzJhjhz&ziA zqF{1dYe|=wmzo!~>`By!-TY)yMT0&x%gvuX%SbH(FUl}H zhpilQTgZ*Ap$NDyk>BZ9mN9OvEI8XS9>kKdGqmzi6TnR7IL3BM;{bsf{{2#a=eZSG zVC6xia+$VYQSI~M0B&w@8d&0eguyk98{W2>Dk3kDL^TWI6K?R;8N&IpW2sd@lzS*{pWcf|!~K*pjN@)-*Lkbx(&zR`q=JZ)lpVdQm( z4&{f1b32SOzpUUDDr=|(r_HU|w5T*Tfj^Ag%1s}jt_E~T5laQ18Pk4O5rl=by$hB# zcPz&>qM*=@0L)D33O*3GRkzsq5lcW5&_yM|;&P^?#F4NOEQGlxji0JpvT_9*xzhQ| z`CxZ8lvA6$?MK}L2Gt|JzXPIer)MC5pANIQY178OsWM6LZQH&}+kFWz=P=XCQ3Vn9 zT`r`yn`77?;auV1S28c4h2IN{#05sP4-jaf@c35sdV9Kx@D{23K{J-YdSJ?RS zN3?&-f-z~fP|6}pD4w9VU?R-DYXc^b=24R-yzrRkX1x_}MA(4P=UwD;OqW$?qoYA! zVt8nvv@Ea)?vBi0GuGp4Fwm4bX@Tll(OBd7g`J@kV)^MwQRbsJtlrhhp#z-LcZYyO zc@qRzJsO>MTX4HwJ3eX*F8kP~F|KH1Q6{nZw8Bzp(k@tWLL`y6f{cH_b}tlK9??#4 zQXb*?=pNXEja&6mp$~rJRz%DGi2{Q!FYsK(9FJsfcK(cR)}e|>M|Z=rP*(ef^X>u$6xg$3wy@Zdo+zY`s(qH> ztJ*{iC59x#sWI=TBoGh9F!epm5AS-9MT+MM6NYB$cDi;w{5q6_ncIkNu*Xo0FBdeI zDXR%W{Za%U0MMZ;0H?lRJ}9J8wiPe!MQ!G8=$fW64_3};VTRc|y%Xi;3o+;?2$CN# z_&6yq2KKrEVZQk{>)Z)9&}iaLz^eP7ht7P;&&w8bt0k9OuM9t#HFe(rtMFemLNUKt zb52xMY6NP$GK37tgqsO_$6aMAA`a8 z=kW<9h2xyEyXx-mA&>uP#2kSe*RQ?hf!k%Z9LQLh1g3LNOeLcH+Rz~O^;F340bsMy z;Y!07A#FEC*{4^EjxfLGgo^PAxcy6JA4Pc-Q@^q9_V0r&6bYyW#wA?g&kY)h5;pk@ zGe|HZddn#%0qnx$OJ0g-SMlGe-nqM?o*+4f? zZRwCt5Ui}S%<-r>Q}YKSq8shaQ^K$m3^+-X<03mFET8^oo^vUPNsD$?q!c)&*A4!$ zoc_=h>K4pp*}A!#43!<#$Rx&6>S38v zlG^Ur*Z-RjBD-g_L0_V_!QSuM0>#>hOE_(Re&>pOo^3Z#7W%()bij)WF4@V~n`Mi+ ztSN&n3JMd$X6mXVWp*rS529X-byM8sCfQTMh9v6ATddE`vOFaxtV{|bNTDY00E_su z8P})Gj4YO16vi_3HYU;5O)(p-y0$PxX=T=_KHHfDgh9DUx!QY!)+td?@vWPmx2FSm!#H3+mpKNybMtqsf@f;DKop56oE>XK# zoFEJ-?_a`P_F7nXRe>U1ui8m8!XDLJ3~20yZJgpMPYYpDU0gAQ z<|GIukm!H!S*k-^hW}83y9LJ7*x)&RHarTGS3dL~PC5>7g8x%nfZ1 zq5&uemU0p}<>G0D{LXA<(QIsb+`%{1Ro6}~a;-F4)Ae~btydpyD%&&l{VTE3I3wh= zJwsjxQ79yfHx_joDuMu8syp^k!NC$ef5ym_X;Yj)f9puh^ugiZVDWzg8rHv1<(;6Z zy*1}6g8M@&NxxXF(l?ogZy3+=^E`Wx@u}uc*!X}q90_U~_j=f6byqcUN zVR9ByzGW;bSC%(8A)csfVX{us5`7>$m7xtt(J2|u(O3$fc$sqr6I z*Ez5s9NxEwWbZmVzL@A+1F3n}9sO66OIWoe{s^_~i@_G{s^k;y*~nE3;*Z*ujEDv^A}q2& ztQ^@59&39%es(xD+NkKq%L8tiY{2d%9-f;2+8J~9UKB4ct>W!mfPN&+9gQZ;JUhVd z$u`cfs_!it95dRd>k%*$nRx>-I#V}101_S--K>)M|5T0KwWoMb_HIx8;#;0K9@GA- zZ_2Un{I%(A%?z&I{?Y3vkKvsj82_}u>c`ubnSt(~K4AG{@508LzvlV+F6w=G_8VVi zaAYUGj~hNW`X0^m{LI(C6}jX4eFrX`+MK69yy6b73i(7#703ao)-}|y4xHkGD+H;bnl)2VW__AcUBc` zd*wJEacuWrHGAER603Z?0U>Cz6bSQf zg&6D1G?&lM*Rw+ROu+QX9s!;fCY)eT7}k`j)WjAW@6*nHpZo_Oa)bVsr@gAD3-XVo zGMyfjRpO`JZin8udPRLV@sy=te@Zy>eql4AR8#DE(evgj-KO&{{j*&?r~e(T`1aYj&RBSGca$R>-ytPIbkWW%$DNr;Zo$e z(q-7wy$@{37+3p+>+jckzaxbzcTZV%E7-1jfvSzlaKZ#%`j|IWq2zPR}?W^FbgpN6+1Q#X$M*)%@KdDzY1i1%ePO(;{*Fw(w z-h|jTc+1yWW;Hx|mz}rPA=NklDy4nPoQliV(T-6niU)8mW>70gjBw=9YpAJZP2{C{ zC6trwoB>Her=XE2D~*{Yu9nX{C-Yv!sVSw*)i*ZrOo}1V3+UW>zK+}2aX81#9`=eY zK#{d``+;l5=|N;vCNjZTc`R>O1mZP9OAV~MTsjbTTES(2I;(nFqFrFGd|RRwI`=hC z9Lf#PaLbgTwV}0|j2>gN<>x@%o3K0uS3`0>w(Oo~k}z27^JA`NTiUt9bTSGH$q6VX zVHNbu7!S7Suukzy?L+e=s>A@9$>A}V>btK6tpOjDX^l8^Kxdq%op0`?%YbTZmQ@n% zs<^^qDc7O~;y!e%Rnwk8EHlqpJB6${dwqgMBDcYSb5A02o_bX{urmmlN&O`w*cN?3hs?onXdv09v zQa%r1yZIm%MRv1Hb-DYv$GtPybtELp#fjOrqQGf3V1zo`AO0%hu3v4tQ~!pueAvQ* z2T{FS#*R3l^<|{=HWvduqPx}Vo{uYKHeuH(*egey!#I1?fywt^sWX*30}&wN;Id86 zW+c2lzJ8{D#Vm0YNj)LoUZL@D`(roS!}fQ~`Yv}Dy7D~&gKSLhe{O2FcSA(JbAM#?Z^*xT zi=G>|QYYQrbusiXZ%f_K$}scMOEZTN`JC4LSypAOoHOnh z!Y%D-Ai`{8LMKH85Q+Z6j-Wv4uvRs&wB=g#5yiUB{fqqOv-QwlESSgsPpk% z$V|FCt^{PV5#N0G6V&Vsj3-Nao%BU}^W#fzug4tIEE|nJL2mxw&vk~UxKKZ#HiHs=wodL_@?AJ>+*ut{Y2L;w1KsR^y6{k1hJL6iCbtpU*| ztcacG!U-qtAY;+?Znc$ePaof(`VIScRIF8(sr;hA@nYCyCl`65!kVwwv`>>wBv1I? zay-cy8#38RMYTLV&(aBd?smn`b;3)ty)E_VOW{;LXwu1m>h;)LCHaKbJOa_7on})! zzcn|5e`}3@)MfRanW9-`x1;tI^s?Sz^pvp)p9?R|ZeW_ROm4AXMd1CHD<6^x4^-HG zjIJ>bUNeX8fhtrryA|auv!&}%r>0Q8Xz;suSZ@|2p`GX!%vaJdHBOxNy5l^Xs+Zuc zLET+vmTb|`-fOWN_jevrmnTaK`#aUAe9kJ;$B#xiuk46uxXdJ) zH{ZovHQ&m;AvQ79PxDW-xq*W(bq_OI2a0?iKD3Uss?)Dj;rJ<`mosG|%UH}h+X%G# z!=Z}Wci~*kO3hNB;{}#i$m7FjQ&6oJ#&m5cn7>i1t#DhzbxL`@7ql6|o>g1tk$6#m z&Q9&>ZubyPcn^@?H@CEHhvdjZS=;i4XPwKyzDou9?1Ioo&o^I!serDjhbM>XR|i`m??i?X zC)JGD7FW^45zL+KYl}ww#wPov7qb1+4%R()^1#S-oS1$O)$!;MfetnK1N7?RAH2^o z(CZ~5Zuy-Ih)ND zJQev>6e16UXe&BZNLJo@TgBIX0OSe^8Vv>(4jus!2^lpM4cK3^HJU+KS33}}lAS03 zJHT|uBkjSKz5QXGj;C8=6^bcQy8$dQP+Z+KZ9bMSd-2SQ3 z9*%*V4D=Iqllk8MnXn1|FStEZcqceZGJ{iM^Ze3BamWWQH<7#CO;``+$xd}>$M0sQiN0Pg$e{4jAcjx7SUOOux_aWo*z9Z6b;y_w)`01oqQv4DiqZ%@y)?F_ zI|;~O>l3q?3_xq)IEslESBr*jf&hkH4r;!O>I%M9GEUPB1_Z2USqMY5SS)BUldRV( zay&j6wQUOl3nMRd&T+-+w2DX9k&9svvN&V8GN%it^6i9zu$tMiqnXc|SoHtW5lvaR zyiK`0WX`o{ii5ILI#<$EDHQtp)(=YO^TBu=c&)KCQz&M1`h2!2*rFVZ#UM{2i##jV zQ1PfgRo5Z2hX=!9@F?_Ta-MqqVt0BB!-Rf^ z+AOds1?5Rq?bBu%l&DFOD^Sa|ya*u?4ntlT)L zF_r=zQRp6N4{~81JM7?oe;^Q)m0XVQhIAT&T44-flQ0$WyH@q+czTghaY2x%NtTot|qwr1@CcR8Z(^(!& zzF0`m)MTJg=#u56xl$_@!rP-3n2{Q!gHM87p5#z2NV@m_RZ4PHz$Z=H_GYsPy*{R3 z1_y8=hD{=hYO>0!4bkWs9_~*V`w=kSh9<+n=gwT=rh*b70-aXW1$@$v2pn(>Y!(EU z^Jgr6Qta;LA`#%INpB$V1r}qJCE^?8F;9)^bMTzwghI$P zbS8x`_W=IL3v-bmTNmpZ%X$`ZlM-q@69s8*wZ0t(054a(()ZTGd)*J;%LFAjk100jR*LurK-)qxEmzzCH9pajH9#BY3-0P)X? zSi$T+BFNnVc+`pX+yps;J|I*_>6$BB`-8z%r3`0>?0 z-LUlceu$vmnPsCCXtH7L?v)gM-D477vDQxm}OEuFY&wnn!-Tc*S{YgA>+Psu~2A zqA9EeU}90tP`?zpGHEQp;zk)bmYo)8biL&U;+G4BsC{%k8Y^M6>Am%TN?B&J z^z#I=-E8>XPd!{u;=xin4}-gaUFaG=*i=ywaRR4oycUkh2ZMEbORgnip93?816L+t8+Z~pGrH%2`cT5Um!_BF|M{$N`vrV! zdZ!!k`QBRpR4J4iogF|74Js?6leNj}R~CDFEBNmIp>rwZs=b1qDdR}GxzK*k*606r zHn$C=;@|mke0)bP5j_De-V(L8Yu6oqX=`Qn*A~0vDCO!oxJj?jSb7{U+cEEl$+Ga~ z!w02`dU+*GJgc1V+(Lh`gyaPihDN54-Ps*k&8K|>8jhf1*CD0(!To-dadak|DT_Xg zJ%tv>-?#Y3wQ6G4tJIPEY9X)aCI+O?@J&t4)i=0w!XbfjCYx*X6boW+i$)zfN_vXOjyPXsGQ6Qm1PmnnRC-Pf%oU3>_-IorM$h`Rs?EZG1@uaVxF|?kEHxIU160rnSP}`BJ|goE zJ)-*3qu6rFTPF0TzSh_^-Yv5v8jh24my5>7#=QBs2U;a zLKjNH8{_ksHRpJ*vjd52iy9nYbdY})IH~G0B5wrDaRgr&^|(#g6W;iGN=hv*>JszG zaw|KvDA8QAcOzV<%%c*4gd?yuU_Kq6$KGvog?j9SR;9`+aYBTKP^H!bU+di!942=Y zz*rzWbnW-)*qpqq7$2PJTCNAiGH2(owILHG0z0#LQG6cT1_c^HpgqOPIdq1d@P1ik zNe-O|a(`1OM8SzcsAazx+s1Auk-C6?5OSeuz4X7VGC@cq^U@UmPa_{ucAk%ryWU;` z_kw_5f#HDPf%P-k!hll(xBl5fK{17*QtK;0uwYd|z(T;b0xtt{uP|SdtqHvL7zjE#28 z@ZISZYgoLC7Nj19z{Tl3?oH>OQAw>2(8U4;)m*3+{S~!nN>~K zHAO`g@fy3}3NDepwC_^1QtvIyNaP)xc7#Tnnp`7_*c^+P4yr9Kd;#SM8>rE4 zRo0jkPu90M9vdr(`m*sz?O5^6814JwiW*V?*<2D)6gREtqLKZ9^SXBBwF>U{!2&5M@oz zcbe1GPaBP1OsYP$QLJD^3ylVLIPi|F535JJxFpnK?=l-Bt2#NK*I^fJbhw!8h^K9} z>e#uZ#o#6<(({L2x>EVN6CPc^IlS>UUmQKK$@AV3?Cnn*fk&}AA4Gu!*^l|KD-0Cu zei4`JAT7D*z|eB#A|8SKoyun89sYrhUmraNVnI|FSXV_aH!S3DFGN{StL()h%+Fhs;0<#6hc`KQB5J; zjP@WB^Eb+>NS46sULB5U9tRv&r(Mfx7!8-6!4(wbX0XU@S?es1nMODjhA(t)T2vHw z&Z-rcYe2LP+i{kg__Nxm8T!-N`Srt$*_<{GnIe_IfRJo}KvyeWJAf>>1oBktwC3DD6oaEXXdjxNRwhSo_u=Gnxe^Rvlc;PyUhB?st&{I^%KZ>=85v&F^FBc-R}sgm~3!T=-Hk%_MZ zrqgj6ZrCc+=S8!LHH0)cOPYC{NY$n%y4P#{cDmR>HW7)c4xQf~0E@yoX3!GepDBcq@wd_FLILcuf5%TywQ_$j_lDb2;_rI(xl3HPm#ES*Of71){5E*& z>%Ph+?~6x<|L0NQ-kU;1X^^(!9NcQ;b={*-QOsCO*LV1w!Vyq#93QjtH-r!>zxY_n zTEFr+6ZYhQ5=3>$HMBDpDu$*l5G`H<#($@Tq@$~2I?Zzzn#cf_5`?%2UcgD%P&{-)4w38yW7`n+nCA9!sw!joiEI%tG}-x{y{oYRH0n?l-amvjDVuM5i?}p zj_6v?j{U=cO@eIs+$v+*3)AsJGp~uRJ%>d4f(->Fs>IU*i??h{FZ?Bp3|SdODYExo z)CRlrkI^~?EIA}@jIc)y;R2;C1*KnL=L+|{s!PY3j>k4!Vx|n!)0R|K71{GrDvjk* zT#+|kfn!WpvCJ2Vl&`L-k0L=kQz`^(`wR8~Rr093t~U>=3{K?1|Kvtc#xP1C9_=j9 zBsoK(XcCTmrCKVt&daE!Sw(03LHb$>sd(eeh+&wcNX5dO@n%Kqt^<}GMCCiSo>eJ` zC6CHXlM&*pGDJK0g^{+kS{1^(4Xa^EC7dBI2O3=e1}0;C6m<$!@N>@V7pFVSF+9{O z4DRY~i@n1u2^E;rv1Ea4# zn2V0e51?1pL$Pd!OP{acD!wlsh0o_X{)#T_sZ;~UtIEM;x)rzLuki@hM46_gH4=2M zBJhHwywA&qA;5y7>JFtI48-1arZaDTVRJrTz(M8FK@JH+7IFaW3~J4?3oXlDKpns^ zs@R_Yz**V!M~WU#`8b;w zMM)GsFF7gNEe3IxM1Rod6K0$Mw_o53^VnMZQpDTTjapx0H72)umK?ykpw?8-O~r#A z)O4YckNYg$NhbPNmh|Sj>*o3%+_cG2DU%Ux_{DvWIV8es=m)UM$yR7+gSM;dU1;Gv zLdKIk13~__7Nrt~o`fj*Qm@}5&(>z21nssPHg)&?82v%SH_=uvb-pP3MRqP(&-bTY z!a<_L6kA?eAR(whyk9=bXSy1lV+=Kux|(cB!S+=U%8^g1n4H#XwH1+=CVcyiAksWc zkU45bUwW6$%CnRJLj9k}K7%dJ=aYK5K}KWE z`RR#X^hi_yQx6rE%_b}~29bzwPyudmRZjR?|*flzI$tO7T&L(#$jVv6ZD` ziR!NAQ;Z+9wudj+VxXmWJYY&yts+@CLNZsRR{PPZ8=v{BihXdSkp%0=_2!4(GI}Ns z=vWkL#Cz@uR#bi67k2T5t4#|_{nXTJE7+c16JgVshnPDG1(+G<*Y3-E-fKaL$E6R$ zSB+Nao?7+;;p~CEjwx&c^N?E|i|9fTlp&NX)AcenId{#(0*s z3aA7q4gnDnwkXMiWUaVC-HLxCa}>8cj!_RulLVPD8+{|G{E33$0`P&Tu*ibdjj@be zxAug6h+^rX9Fma?vuL$#rF#o?a7kRy<+vK(OZtxXNxZK`jLEQ~s#jtv6yr6g%EEa)mDyRqDK5sL^AS<(rh{2VnR4h*$VH}ozDPHB$mS6#}*I8}8 z2|Y1KCuiF{Hn~+>s@9by5`uGV&!6ZVOWpDKGpCkNl96;Kz-fzlf0TSDP}97v4emYf zUl=A%?Ktd$Zl^h--p`t*!P!`=B;UF%FPX`>(xgR_Y*hpFq6EKsAkE#fJ`Z2L**a8R zxBJ3foi_PchWvLWyKZ<7z3x>C1yuQPo=&bX1ymxJC5=dqq{~axN(pj?e&%IOSlgk`V8_Ok7y{a=fSE)ax{-QoUo9;JvcZ|4nc`q{g&&*++hde9V-X#YvKq zf!4NlsAZIe7y|UqTA?&9f0_+!nEhHDkb0vo<4gqV%qQw_7rz&!)}ttVamOIizlj2Z zbM7Z{_VtGAFSiv|s?k7s@Gv4$*Q?c-*yyb2x+QlSPg4xX@swhFORD_8l-+?0)^>{B zvL)t6&SHwCcYY+wrO^xfc_+PX82IAe)?dhiXHu1yq{4a;2#wL^oHk+53z4qbU0fVB zYZ@ZBRUvKNqZM6F*lmts+P+{orrXI#zh3#aC>R>DUL$_nSv|z-u*jj0%O$S=b5+a)?FA`^Y(mdKmCqO$(wp9F3abTR1H`$ph$wGMOEPmgkeq3 zZ0qPIM@21|sG<64KCkFCrvX;QRMp~9Z|67?3cXfFr&2&3EhT7;CKd6>rL3N*bA!}$?R;ZwNI{F_>h@Xm9rHbO} zX63D!&S@p~(W#9++%xC|y%xLN`!U$J-G@&2$Y#}wl&gNUg+vSNsK_?qOlLlqD|-v7 zG=aVL47HXf6CP^;mDlRmk)9h%IEXas;#ZHqMYKzS*=WV3GRinHapG<~S}xSwKmtZ1 zBbXh&=EiQOpcWM@#i9!IAZltjYArc}HPw7YT3{bBrrd)SLLx<(ah?gbx8gEcX(rFC zH~;_kQ<4}Au=X(*$4Q>?`(mcr!%Pwme;_Mu_~_9hS$==U^}tg5RjVpZsa9m9@ff3c zy0Dc-ivctBxLD=*JQCSBhXKjPnrT~8C&641#eQ6KNkeNPrGCQK6sq<+S}Wbn$&&kK zb@7L?adg%fpz|?_pEkQ{uFt>-mg8hi#BivAMYAHOh4UN@jO<7vNGWuC+Mr{UZ>2wC zpp(jGgpoL+B-2tjax#Ktdc!fPp#b(eXRWago2WjCRjUh>lw8KHdgEjj+Gkh27%NK* zt%iylLhcU-{E>88d=y&}V*z^%Ol4jnI-1I0x_7)?TQ*3fE#Mr~(3|qviLuDMhiH2lHFrW0~U^E6fi>g`IyffSP$`NoD4;~Wx;L5N<(L8E?lmu_vKU6T(rNRT>IlDCKVxdUm>M5kVkkG4yMT2R11c)oO zkfbqMP`6Kk+3Z1H#LOGCM-^jMOEWXLx~ezYr|22tPVQh&>tJs!W@WJ;E=IhnM4MY% z&z6_ee+Z}=#_x&xU3Ueas&HUY;4j=%CghAyTIeejf=FlJ27Kjl$Z=-8&|z4nVS0nH z#Ix&cfwdnsQ`E z2Zp9K)dR`rlIc+4i-<2bVO7(WzG>;Mn{*S|e4$W6)wuyFE3y-DLQ1%IMYQWdx(tbu z@JW@cRMMr+D6bL#lLf_)dMBI%MS`16zY>bWaACh(YD_5yHv89NgncGsXK~Lv=rfwX z0bd!Q=9tyhLxdU4Sn)DZUlIs8=}e-nMB>{S`q-Y!rfae^J9FR^-3O_DY3H?@q-%53 zbakmNFW8r$m{nWa&cSU`bJ)G3IpeonulfvnWi?|CtE;5Psv(oFWMD zi1Q%ica%0$P?Sd7@#0!Go5Vb+$U;^dv5M}@<6%TuKw&`3YIfzLDN=Xl^UnMXB4F%} zb{N{!)Om7m`ELvmEJ;3 zExlGxJS6N&cVn4G7KO?gwdlHoUFx*b6mG-a$#6$!%83l{EUGDGW}XRSpBn35HngmV zsY4NG8WVUBZGup%Od6V223Stlr5ThObx@5tC25i%Xfo5}q9QUl)--y0G*>9Jce79l z=1-@B^syzpwSBs2&4$X0s#fkad{LmPo1TxRc&^=OqVNi_7su0role8Ci&;gry&s!R zbxuT-3K`PvtUnn#fdP-r)RP!RtCXBUMG0eNB@lHoJzW+f`3v2-b{}fNCiySoK7~Rq zql{YoTU8E;HJgcwSKRVj*ooTOdcBa21-Qv*RcgH1Ie<*f^ee5Czn>*nfQ?4V+G7zM z${_LZagoJsv@TIse1%ON+F8k(fj9D;8^6wn@yD#VONun>&uxdhCF)5+t!k-VSF^GYK2l*ea))PludYHyTn1VIa?X?#SsN-af`WuI7{q7 z94ZlH;%{C&O6*0;iR%R4HIPu9f+uzd#TcEgQQ%?~pN|syHdEK_=3!M7a7U?IaLW z*4YN4z>?TB2?r`S!S28q)y4%Ut38bGW;592iamvLn+~RX2XN?V%lC|INLBTEy?I04 zi_g{K_IO*$Y0VZ1ZjW_gYeiiAyx{TDFLT;lQEyLMHk+%v=W7);JYjtPf%g7F>5E}) zSLY)_sBTW0NGRmU#N&B=n}bBFF0+(6kN=7t2xc+pnb;>`k*y)N-xp{hIHl#bm1wed zp_B4KUTRL0i@I{4pz)O3G#JALw5%lk<+FV(YP;zloM8@A!5B;OYD`1+j`hFww> zE6d<5Wq5!s!CFg5$50TQ6-2?kU{paXSpjSKykeP}Zb?lG#!Jv@G1QhXi9S5|u{Yk7AdzT%#WIAK`H=5p=b zopG=2O>}21O;!yLlEwcfSFqhuf7#ip(#G~`CHsBaHJ_{cfAq8bViiSQdEr3wp>QPW z%HZj(J5D0Ka#KXHPA_Ft+<6kUs)&-6#$DJFaWRIuwqkjyqp)m!T3KRZ{l$XY-3B>6 z=vtSS|HaL8`Qtr=8jA`;U>Burk*!9KeNf$^r*u)H?)1`TFyb6uM0leajx)lcndly* zWuPl&F9=u>LCFkuTaES{vv*52VaB!AlBzvqzA>o52ea%cPs23)hDilRmvtw4dD~>3Yy8rHVv<;wpu4EyUxi}zrO@_g>Q15bDft& zoc5%?y-e6>fljcH^cztg;S&;q)|oMbolg$0u0%J?lk|+*TCuSg!Rt+qUXK!V4epT@ zcyY$N6gmw~@k(6+Y$T|*x*K;x-~Fyxt95$MMy(?f*X0!2lsn3jCt8MKtcgQkbX!rI z(tCKiy_1>Js!OzL`~7d@CP*r%1T{X^s9CHt|D$46Bpe%>L>beWm&V;{>0j)i=HuP# ztKH4~-iNj5dopEj^iv+u%i3T=P!o@>V{h&7dA4WA*Vai-e)KG}gJj8+$qdnQkL1W4 zrhWu%%G7D$r{MC6MdsPJa&rp{qkj$A`4CPEs%{nwFmD|Xe%KCoUPhZ@<2ZJFKWaWb z_nEiz*&NcDxDnru3k+48uWU+FexcB?juaLdc41N?*ks7xIe^S`XB)%1xZ-D27h_I*wR=88MmmK>X9FCLaWipE%ldI~+Aq_2TgR*wf1_Op4 zkUjkwn-LtBJxJD_G|$VC(z2OusK7b6!q4|~<77EXvd=X91yg2YbG7J8X1h95;kOmX za93B1>Qk=C;h2|I1 z6b_vOgHFUYrGo~$1rb!kWy zkeodkS>3LS$r_Mq&_hL9Q+!+ zT0gaN|5FrArBOH*LnVElQRJmBKn!BG_#t}-lu4}B<$Jh)exWQM1a{B}|93)tz@~oC zSEpr7QN_7RdT4c}mEA){KGp)xm)s(|Jql^kj^pwke#-GhFNAv#tv!GELq*A|a#P1; zeS5|sJt0}q)rmD8O?UGUZW_Db?7tb!`j5S1ImbNvY+TQ+`9;b^;{79_z>#pM4>D|X z2K5`s*e=BEwj3`(zUsDtXkGY-Fe#GFw9a(>?!wYIp@q9{=3EYlLm(Qq)6d z*nBBqJtinNNht{l*FA3n3t21 zc7XufoldSG1Pu0os_7Iny6(E^Xm&XZt|I)6^uxGvxtNUyyz9)Df3GvnWAc%>f5LS; z&(7@aXnTAPyA&wqHe|)oqU|@fcb#T&qG$o_&ntaJ4X}zWOLDj~eq*!k_1M zsR`REQ>p`Sg2~H9r)DEYLl=m{4eTN3(c6&`tiDFHr>M0vt{hWk6r0+#cMyl>x@clD zDlC$o80*nuBLfi>v-bz3Xw@?g3YXJH9`ZH`+zg@`sAv2dtGPxjM86JEP| z8-S%!I`yJAyY!RWyVNTZWspB!+&6EE!`6vAF7xZZQ*Owkh{S#-34gOX9}ZzZ0O+f& z#)9@TyXZ6gQ0J41fM^u%6NBO_|qkms{LBGcPm`z6h zdRH%;0Hq2gPRr+1P34o&g;D~kfSbhS6_nO>rD#?ZDBcOaEXxz{_;jvBB+SUTkv~nY zpGNxRr8&YzX-`;`{d>t#re>xGMn;`Vm+M-<+wbP{8H=lt|4~XVE%t3T;aJKqF}fKZ zj%rc5CMGWRCFmBzvDqTl?tIFN&BdcS6k=RnN01A79h1hFhR6A(k&AsuR-%*NeH25{ z3S*VblgAevgKH9^l&H*>1c^p7EDfU8W{*145 zQU3n-to)9bV3Tc%FTTjwnn9*-Jg-i8Cny7o$*G&$k#_9ha7hZgB|q4D@S1poqLBwB z(U2{MD0tl?M}ASSlNX%!m=YR2Djo6I7)@hGoFLYrGzuXZVX&Yve5lolY$Gb_^#~mZ zj(C2-6SITj^&)|zZ&w_upxC5DLHOh0FH8Gt))*LLA)s*?jkfeI*yai74~$l&?j}po)%NIDNt*I7 zf|zU@3#wAs!wG&lW6+@CVpKd}tRO&rhAbOJhA9Kq*&B>a3EN6wHXy!un$3iex>Y=nGrT42-Gz6tNW3F zTRoC&lbdWLYjn)UWKacv$Gr{iULE9Hm_Xyl4h}ZFdnx=J9e+Iz0%>J!jqGL@nu94p z;H~#_5E8Ytt_veGs4`bS;j1hj+XUdfQBd9a0XyH3&xhQ>MjKj1?G#4^LVz8w^SX9Z z+()t~WNEBSN|5-BllqLyhDG@F^+~nsu30B%@K^(%M!PB%Ak)lH0S3*jR zZIpj!zg{S;1aJp0i(4^stLN^K%D}-a0ZF+UEJS2b7mBPf5SNNz?*uzFNY*LO<7G6T z6B$Kmk%jH|h6L{!vooLT=v<@3OhLc{{vLuEVdtSZW=YIS>M6 zLdj4p@86ejB(@?i(&4b69sxyKNPCo02*!zZs7u}|pf=1V;Fvl=#0Lr?3=(z5%QCKs z4&epQmx@6WbMT<+J5|G|tq8oO zH#epR%KjB*@d5?u!Xek)SPut-A(RG)`l(S=(o9 zq#)VrM$?4QaX226(~p-yFU z;!}4teD^9_b78Z(BU*;{9ceQ8-YRMd%l7>0uEM7%E(yI?G4S8cF0^v zk*Pw1`YfAtGgW9^;A*go>)cC8&?{VHz)(e{5jXnr^9d_>S(*I7IpVkRQYH^~c9FjQ zvbLx@wK9)+8+hHFN@fHQ060(F{m-zQ-#fN{c8q6$7Qg*!m;z_r`RMPLFPZJOQFjr^ zz(4`84*}=k%upvTBa`0Kux|mw-RRsg212q}ZZD~jBW@ggNXUJ4*g#?nhD%%Dkl4hm z1E;qFct5@1@xcOT`y!Ybn_54>X~F}8Jb21SfqRx25!;Ee;fkeM^bXuf+%Oa{%!RgR zJp+aSuaEoShf@VMv`Ork8)MsQ=%BW|`-xwGy^47$pp#RM(xqu62hJl1hZzz6 zD{z$+5nJKTL_;RPKkxIf^Weul9nesQ$*+uzrCB6xWT}vM!^wcv_^EY1TfA-6kW(+CIpMd~4*D+Yu!-1hd z0e%MHC2|#D(ykw^o{+~j;Xhgi2o0M8L(nV1>BdSBgt0IrK8%7Qgmy&|-RSlh0ubac zAmHRz;9#TM20~4Mgb+Fp3M_OSG=xzn5~L7^3_17!1=`?0sE~lKp+P&GiVp2GdvX(yg(6c3fp7hHo^nZBHV*o;etRU=PXf3Ui9 z=)&4L=_)_B!zE};7LqK}w93MQLAhbU*e+W}YLW(PX4$l4jo_#VOUBZJ^SsR){jejW zqGL*>@lIMzu^Hccri49Kzl^n>TV5padnwRk*K3H5rVug=_WtY4q7){LFG8y@N7bVm zTT)^&RH$55pmfTGQh?EOr*vMcQz+3mVMiXNVpVmT5ox5M8db3*C~a|!q3X5Tf8t$3 z)S+jkO)qQ%V`wt4bgi(`8tZK+S-91L%2 z^6?7@3UP!*M8(9p5|UEVGO}{=+7z_w(5Xwe9=-bXD;h9pC~~|QHu98tlEz?h3HRd8 z*u~Am%SYrV2?z>-GHm%j+omHXs5<)9W8+jZ7@DFxVfDLHnEwoKMOn0sTet7mw&;jU1E8l4MR>>NJNg3trte7O~#X)%^~kTH`jgP0KcS4%}FuR^*gd zDa4N?xm0Scv|%c3X;iaYtO?NKx$_PQokkF+xfyWMrYsErOaND++&X_WXo1g&;U zbdCwTt&YB;a|q2DRlS?Y9$d1=_EKs?_w@DUKGLW%?}()cQFY59Zvy<^E@ehC_k_L8 zNC6k(3~^Q9b4%cHW9Vl=Nn`DtUPj^4I>;27;ZS>!$yA8bK{XMJG8;*hm(xlD!&p|w zZrQ+!=5P_ZEJVmM8j0sL>XStA$tZEjq-OioJBnT>6SXK*gbHhTKRlQ)Ls*5{@U;+Y zYQe<6?op77MxYbOpBVY;vTxDISG;eM$lLfild;XYQOts6ogGlfnozR0aGqwBTzWt@ z6UiB~pGigO6#A)Tl#GF2#G*vPEAhl*JdUTL&6cf%NVxT<;V2ZgDC2Mjfk-4p&&VHL zWyHt?W}yMzpz}R}$n6Eg<$a85NUHMO_URB-0 zUEIZAl?6K}RdqdpH**R6TrrbX;zk8zw8CO>=@R0P^xN;>p{H(Z`8Dr;W^glnB1%SM zpEINWkvgdCR{Myo__ONB7j(Y5&t}@Jt_H<6`AEG^xx73Vgw)si3kUZNDPJ+8_~%JnCHtGy;+q4X;}Wy33o0y4~2C6Zh_Ir zs1u}BP?P`vQ<9T09IFFruB`tBDXaAm4j(OA%wcrQ^2wOzVd$jj-k`%3YjHM<^8|+# z6BtKO0#(dg@GxAJ42_DDs8c-@vON2$1>d$3CgT^%bSb-+w)qFbp7r{}zk(^5aC2AE z;)a%ROM}AO@yBr(zE>;y@6Q5CWvZTc|L-oon(XpQ`fSifM=Fv}WUq2lwuKesa@mp5V@I zpr)}Jv52cwJPAKQ+ic~gOi^}D#h?rfRAv+wAX$Q<7)Toh24R5}6SF`UWvu%5tB>CH z9s6p6aIAl4lTA`0^b9OpSJeuSAj=BfZxxYya2aA--_J(A?u*K|clWcx^(y++R_GeI zfFK|t2!e{Bh#N5yE6ug zoTt<-!(=HR2~waG$1Y>KeRW^LL$&t*o}SrRpidAYV^NEqy04;CgdrIj^;|TNCUkc& zmzKah_7J6=1*9Az$aTL*{0G36Q-&nXh6dOk%eE|Oo_DkU6Fh3fh>-*cG?=td@imte zuKeC}zr_FSnaH}0S$Eoj!aud9`xnA&34}wTGp8a{WnJBokg~v!fB4_;+rBdc9s|)N zHSwzNtWOD)My9Gqai!c&HHjb?#+cbChFtgd-P?pZK)478O?LmhPT>${ z+9@24hs6KaU#b2Q{xy(n=jpssGp>OLFfepB(%*nI)NK z5?U-o5FqU(cwqr5fKYe~NcTJh#dk}9(j_>=Q0DZpt1tjA3a zTCgOiZXgzSKT?SMu1)p;Eu;W|LCX7zYrv;AOF197^qc3wKPZ|%@!?niy+j+||I z3``&0H*)m!DcBtSSg7IX#r$LZ)Z;M2u^aPG1R0JWgv7^E?aNPw1fPseJ((1K%4r1t z0WY3Bop{=I^3=ZRQ@13aap*mLZR(k+?q{9n&Rh|EHX`|KWaxR!J$Hrc`6&Jc-q7w& z-R@^&FN%i0-jjM!vT(k&^`-UJ`5PQBDfyS}#`g}|UiO>b`*iaaHobpU{ng3ps|S{+ zU2%T3`8Ckd&jQS&eQ{SOI=cRwYsWnVhyS8Ra7zLL;1ACOR$WU17%BDQgo%ds7qoA zD3Zd3bbKFNM1qT{I8r3h7b~JODnk`9;TPgyga3W&reVX-=*U#JbR7Wh698JiqU9D< zQ$V`ZFrNq81XOJhx~MYfddx0|NcOvRbNSal&rxlRltjACzb(X1@7;7!# z1`7w}P@3dK@u+eFHLd^AO1AE>zYXIQDYRyjt;*y$iCRxSKxvq-_HixYECW>+JAPM<}!9%OW z;UWGOJCVr$_NobKKBws=m0ZRuK+}zM!sxqtbT064u=8KNx-6bF z!VlYxupP|~Yu#T^+~flYSQdA0vXPM@IRbVxQUF*#lY}HCl{A0XD+UMNR<3tB<2FyF zj;e)rdabV^$~4E;+(ks`cYLkB*pxY*QOi%xs`U?i3-FX${&aM$y@s`zoL}o9rk73^ z)kHn5)?)IC408HrnDq{l({()dzb#KtrlRr?ynG~PF=Y<%V*U?>kjz3xiG;qFqh{%) z6jq#eaS}Fb84ETkwg{(b%~-FCi94Mo7#Da-l}l=Btf_IwR=4GwG-aqrT>M=t#(GUC z{|{?9uIM>+#Bt&y#UsMrh5?}Rc0SyI>7(BO2zYUOrYay@$o{762cWzZ#M;jX*rNi# zmD~pzgK^{;S*hUa(OcD05OVB{Bq>;OA~kjD*3|r|nW`prT3mkWtjzR*e;c>ZQIN}m zVqd(9WdJ$#H!ZsM*r5aUx1T4MxY4Uj)feexv*REPV%z z4F4~HJ&J$2Yc$;d8$2JxN$`IgZh`kg`X+eXz?~PgGx?Il$8?{ehv1!%9s;lGeGBe& z>;qWA^e5h3E1}y*avxxlkbL1cW5rfbFih(!R;?&O{hxV7B!T#I7Ap18Ty8kla`o9a? ze!d5}x)8!)A?jZ`?twXTj_I|JZ~rY${tv$U-yHR>B<1ept@~0F_t82J?H008$s z7AmfRiW^|*!-)SyjG*%v%6qBMb8L)%^M{pe-`B@d7aLFkerS%&owkuVeT7~%xNMRq zk)vJ2utv)1nJKUbaM^;fc6EK4T$DZuM|m>9PH5i%TYd*wwjmOq=?A(08eKhvZcoSc z^*TuZgTRLbFs?C<)_^{l!Dau@d2X`utFRgnt8Wx z8-CLPAmN}I0b$$l9Fr2ACqJ@z&jtWWDVf6DZ%cpB{Eh*RmOT|>fUJjcu*}TL;w;OJ z`NhuXE&p@jz}#zRXGw0zGnQ;w|y z;V@0|*snn&PNVK3toDuC`%N>|1;A1ui)66i=gtJxlq?32y$Dsw2UECv4qjNDbo!6< z6#=<8SNo0+k`ks`HjQD8ZnOV7WZ?3LkJD+wp{5|hHgU!Bz`?|ufhswsVbY>1wd;** zN$Ht61^wwwnpK@0e1_H7($73DguMy*mR%H*Xb#YM8h0%?ApM4T%U3V2)&o5f_% zX;cb191i1`2mAMn6!-}@R|gMjD)~Xe&BF(^0y2ThHit$_aARkN6W4BOW4vZ_j)0r? zeLOB@^r`L*LK%HXIV%mPJRDb!+A@R)+cKkY9_L}TR>*;plt+b4&Bu5p$G9qja5Y68 znE*|ajU`}aHR^Q2Z)=O>mu@s#&ls_6*sb(+NyAZT7MhPOVW)z+poH>CHLu4O?{h{} zS2;vs?R$n%AcNbKX@(d4W%0ubh!#YUhUX(ECEyTiT595W`C%<3HspOS{AH@1o2%Cn zK_kV*PtC~{Ut24ePpW0-pW587gp`DaPdAggKvCSq2r!hyqCKj%sGY=g$?NRo@zmg@ z6pxN(gs-?pmkER}GEX)Zvt)^>i`z~B^Df<$Dz~wYot$(Dgn%>4{RES<-pd2w_T0WZ zqGNO=VY&F#xBZWxJcQpuJccur#wVpCO#kUKIxDj#A2mvs8 zUZt`l6^{m-SXatnK(mBZ#OGGYuS)lTRoL5>IX~M)FC#bxL;bdjhz5 zK(TL0`dJ1u8gt&VEf2k_qMyt1Tpsg#KV5%$b}%>mEthCG?j{=q}D@li5&79U5;pY6c7; z`^fcAkTEAbLsih*Sr+p)_3s)gL)k@Jqet7PBtVNp6PuwDB=luAPZu5vzyKrIQn?Y3 zGBN;5xgQA5>Km9a2X=tT~7f;F#s2!>Y3!_|^dD6(H^v z46IJd zX;PcpzOv=*MrF;-aWyOfOdQKizqA#YQdc{YfibBBLn;CSlJoBgJ|8mOAks!~lOCcG z>3OhwALiyLnS(LQ4mOmFL4`B;wJ%wC3sV1ym*zuzwhCW?ZyrHarYXRq@2!1kYTnRP zdh%zkH&!rqo;jR~Qg8fi-(-Xpl7{AlbC8RU?o5Cg0uuOw8)MNFPzQxX_#iuX5k6!G zF>fLcg>Z{Te%=J~Aen{1VTrKVJFFBaZ4-uO=C-bEd-#tdC75{(>99S7;#_$vx=7iW zKy*m5U=09#(VF7jo}q6?tx-fLzOQF%63Tm4Eb4C9lDwQ7Uu zDjkHhoTMXXRx(}~K>3KW+Nnv}moohzh=ag?WIfk^@3BZy(Flw)O!1cnj+zVu{FRy2 zFe3WENjm_Jp#H9xEV^X;LX|mp1Z6;o9>d1unbHvvbZs%0qVO(Aj>EZluVmBq)^~Ul z3bwqf@qtf*-TBx{&{IYm{?cned}BK#t^Hc*lO8rKkb2JlVmeV8Dg_D9sn}y10tf&P z0*T^9|Kdt~(@@XF?2y1DS|IX`#6pMY36`DW$dWB=KawinZ)Ug|8O- z;hu}Klc-$Cx%R59sfi7VO|LXvv8K1uRHk8b9ulpSAR(sX&xC{p1c5;aD6ByZxQq^V zoS;y99Y;zqCDMg*_Ds){!!7{Di`x{jl;rSNuc+f*$4_2(5gYST(lVDyT@4D2_*g}T znsv-&6D=?^ajwNaLr_3ZaI1lgr2XY$u$EN|gjd{5XmcSLTV#pV6!CBz`9JHZoo~~7 zy+JwLFk~%`?k8*j!|W_7E9mm`_MlW9Sgum8yC!AO?;JL%3WY`!#R5@}#SPe52PL)Q zjiHPoS)!({BAB*4l8isSo8-0Ii5aV*nBW6a^yVDm}X z7#d2js0M3`AyCO8PYPs9t5O=mVioQ-xiPq;0W5UK@bF+vDSFpWhrE#Q3R5U~LTga~ z#cPVnH4V+OyHRANT)s&(w5NWW94&~TiN|6lU_%A{N!fEX?<7M>VXvQ6rj!985 zz!tMi9Xmmc^O$*~L?b>pAfuM$+WUTe?i}jv#MiG>Ge)Eeicsvj00eL`U(x(D!kagJ zhKS>6mku%Doy}EoMe12vRTa$ho76bEiYhbF6SN6gXaJ8I3GLLm5`vz3tTTDpGu!m~ zdB*JYTE%IOJTTyABD!r25-FwLA*TLCK(Z*}CRjaJI|m>{2{5os`X?ZMS$fWb#>dhx zdOHpWgFLE-!)QdC|C_lBDopjrG?0H>JrQ8i#8##yUahPswwG4QCyY^LI) z+UR7O#XyqNUX{u(+JZB^tZ1lV^fu@Tk0+}Zm{8k;<~bV6JbLxT+vEQv_d;mLH>*kJ z_=2rdJcvif4loGN&gYe*L+aK*wBs#0RHd_bc-q8i{y(@us>9nETZE%wv2APhm$A>h zi!e8Nw5s|ePYS4W@Xn7t%9Bq;%jwT2AxDOnS6)R)V%x4dM2sQOEfB`WN>VYqm5Y^<^bbV7gW(b;D{;Lb^#yMo_<-=WT;wk<&O zdej077b5)#M76oMB~SzQ9(-?N2hH2;gy#cGUHU5MyMkFS6$Dr1b*WeDEMS2jVVvS3 zqw@xqT97D}Na+TTDZ6t;GBjqNk!3|wl>{OiJszGohJzvSvB^a28w%tScYlZnYG!BW zH`7W}iNcCFOz8%~^<%^oD!>!x*niP^Ko~v`0XDw7jA~-)7*!Sa%h$~gOTUrn1+#B3 zLA_DpF462CRES2Cj^*)J&ZFwesdevTO7OLV1!Uen?VQY-m)Sc#gX_Qup}Bx)r@8wE zSus*u#+$Gg%MZCJ0&Mo?@sS7rimQ8v-3{wxX^%qFWt({()c;q>Y+7NntgKBl`V>9` ztbE>O{Oe?Q7TEIq>ZN~lbLtalMmV8=zBfG2cw2IGy7)f!;YH%sgwLxqyDh5jNw#)`}H+X!ec# zK?g--E8}Suka?1{zEOWUu(Qs&&U6=U{`mdiX1(efap&q@z-8x{``&&C4>=TQxVSIc z#nT2-fL&7#S^Ne)@b17^z!~7o^S-A4gJ#TEqE{>@R?IKt)c@v<^=v|a&Uv}v#De)A zsn(u5f-~syM>0;qZz^8A@}4tyG^I&hFqCx)aa&^*U0qT1=07U5nd^n(jk+f8<%PCy z3A1BO*^@61ci&>E=bJ18)gumHGf=StCn20aY$Q~Z%K*+b@8Y;IOLf`^YT&c3V65pj{bSf*Es{`dXlLB!N1!59D z_B3d05~4={<)IxeE@zHEOud$RG3tWvKj+?Q`=ZSsVSkb_tXH!$$2Zh(ILu;I3dU-N6p8(1_+XA*yZ9%WQKCIL9;Qe}7 zi;Soz$PC2Ukn<&Vg@%Yff##ipvh6N?+}kDFeO>41T1vlvcTC@C4ID4EOSQ|XuQrHq z&DD4gtrh)jP}d*q^&BvsEtOqpvoUuKU4QT|%fw8lLBQ;rSN@dZ2!lic))sp!rys)% z8KNP_BBP9ct#4x5l({Jk3Y%mTmM=lmz;>#Wz9R0QxrVc&kQ=B_%+&}Sk>u6&O(_1L zdZ6bKG7680$paI->OWZXy7R+!Idi0i9hCG7IwqA4=+MxZ-F>-3amEcFga~X-X z$-0KTi~jA3kE7$kTdYy&YkLG*?I2YuF=rE-#W5a*^&@jqRV2a*{SI&Deb^H%5y z<;MYkcphvki?6h)qaWmLS$j{ib*)?6)vmTHG500^9XrJ-?a8c)mzEL+L$)jM(M<}r zh-^qL)MO8#ju&;b40}a=<^5Y+xBnXlzN=PuW^wavLb}6bhAIA8gY`EER*&)7}ato=24SzDePC6f$f06 zm_cZiVBGnp;l*|PX0t27pF(AG8LNu^ry-{lAFYC|)E@uW-2^)A05yp5Zv1z^`sq2= z+|B!Y|HT};zA4-EPyP1D!x!&z;6b5$y(+nk*$uLa)){eb_=Dpvoss)rNj7D54N%qR zqCVT7D6j79A^NAh=@tA0jY-IfN9P46y>Ab_kH*C3#04DM9*RiAuY7#f zTT18VOQc-Wp){}6XH$V@JNl9%{E{lbTy{u+8t|{Qxd}D8L8>&@n1weNhPkundk39E zOEW`$3_RzxGMHf~|^tei}HUME4==>Wzpzemq z_fqUhg@Ktxse%EFF}RfV7t4$00oTv8RT!MtW!zJ6r2_eCR{&M_xq~FM& z!lg0on(Gs)1h4f4X&+j~!8Y>D17(&`xan%vJ9JrAU2}4i<9ZQqMPU-iDO=bhn^|Xj zZ1Koq(;8VcSZ?l@n_emS3y6N8pWndEn3<6&{DfAR%JQcK^S?RH{CncAAHZ#*%4*W@4z2g|$ng}VgZ zFjfKTf|l!~lcik+p%Yw)2zI^(SmGFua*cliG|zgQM{uL*$PCeehLxWB|K_$G)rHXu zE6;C#%Z2-k&zhcG(LI@dvOM*q{|TZKFkBDghc8nj-$|=hjblr5W9x{m#|(3?2KL<5 zTuRq>*Q(75ZSf{Sl$6t?%6Uo|(64bNM@zNRm33W>&pxiZnN79HifF5&%};ZHTWjf{ zfO8Q(6x24l4=22So85TfAW;Cu!v+IeFJp1`*Ze^S{zV(Vb1R4`9G_f5*{9!zj$`>H zK)-YB{%&BMhdFTN-=Pw@? zdyBLaDb+qJx35Ru;qyDERvnChjGHE&@#&oKU~Lu1&!@8%@FlcJ$gsz$jjF+Hnkg>= zM42hyy{`SY3xxOKNcc+C{WuCVisPnpvx1ux&rumBb;qyjk<}?%}Rro~1&KolB`0Vg@fumky zu*`hogDq0601;!%dN{glarj~(jzt6CerJ8l0p)5K2feD%MK=1;mOt+q{5x=?5jLjV z>mOubZOthgN@v2zevy5&fIHE(i=Vfcem!eX^r?Nmz5Sm8$~xnH>62;Io|%w6IVi@+ zne~SM2dk0<>u&h^^y!aEdOvl=0L@{aGhePdK5e;?Q(+emW!6*+#*$C_UzR;S_s#;p zFQrZ`8A?9|zpXKlZcJ1o8GC2=k+qW@t>Uv&75Cz5EI{JU@wU?MUio3_&npes3%p*K zijry&*Yx!UeFd0LYVsc23y@#Yem8vN*r*JV^#?mpv;HEWo8)#GxfA)8AgJ4_x{GS( zrctgp7*##Fq*c8!?K|U*yMHwG(5ncnN^IBRz6^`BLCWeSSE>o)?p1NJ=s^_+4F>F& zEA#Gm*B^OYe5~KNMXab>$mBQXaVfPHD&K2g;o*9vnnLyWKA)*Ii2WN9MY3b6A^PtIjU5xk237HQ4)M5%KrgiSdeo! z8;T=t2#z<~7MW#&syLdUXunse=YL(l4JOw4y%AyZoeHMeFAwGUJyOBm%X&wCqkHs> zP}-NJOUu(x`s3F;C5H$(x{_={nkG?Fg13b%Nvli7kRl-P_i?|jkYqo)Atz6tZVy^w zn~P?3u-u*AJ7iGE$&=4s*yaaWFMBqnc(w!)Fi#qfp3c{!@caE>T_OdPuFnzcQ|*C^ zEOY*R1?qsKw~hh|t(`7mU9$PY!Zws&PpZFO1`7FGmeDif_#`0T5o(!XJ5sdbwghSk zfti0n!>}UN~U?F+3rx!vEKKg&sCr+zt zykoyAVAhk?(HXEyyGMUb_Ry!~p#xk-T~|K$Q9p-TzL7s^^gLdlf2Uh<!i*=)C`&*ziJlpR{DK|(iePKRwf>){C{;z}L z%d|GC7$*)+Cm{35uBNJ*0a~!+Y%^PTU*sd*h3^khXgYIp>zZw@wF+Emid*dAnJ?OG z?j=tuT4RfEbF=pV-j|MNW#4EZqDz@8(HGqq3T?Vo^Cx;7sG1`S`!pDE`FzQX`LMxV zo9w3d#MO=yX>A4a{Pio!&Mtgm@Z%sZ1{XsqMlzDs?$FC1HX^@31%3Yu?3g7Ba%S=R zu@=Ltr5b3(E9$;QGD)zl5N#fcj;! zpkEUW*3MhR>zWVq%$`Kk1dZI5D=%5UtF(2Is>P#~a+C_uaS%k+j?w z0Qg-n-q-~rf?75uQ8<9Qj{^JOblvBwPU);B2#E%G9=7F@J-oPgQ!BaKrA0p!oU+<3 z(4iR!uN$|DQ~rR5tNOXqI{$zEpGN7~wuWh3Zrky4(N&W!>XGQ2rOUyT_TbcsB1Og! za#Lfd8P$+$vPIRYBY|roW7QSvkx{7O&>=_;-h2o zJP4rMsQ%M_G&+Y%UsLqH6LLy+)#+9LY<#=>ms0Ah1JjTlK5Vxx?mZ(B?wE; zj94zd84ppwyn@#1CP|s=MOS9sZ$H?K0~9+~ee8EPd~N>SR}KbeP44{XJ@50&Qv;#~ zst#AJfPTjQ8qoP>Q0F|Pv3=OWi5e3%wvdGlwsB)BVvyBg73EhYvJ#F+d^L&OYymNz zkq{^L(F3bi zlf z-}-EasmPhZF~lMo6(dcywo{hW&5TF=V>kJAJrWx+UmraotkTTMl3L*BS_-aMOqQdE zK~3Mt*TYUt=V-zj{nEM|Hsr`5_Nkx-r|Wyw8e2A3+WBjShCb%~{2Lu3>pUf^BAJ#) zbi<3n_kpLq6F$*#^`1Dj1X~;<6|w7aeaLB^w$xlr){_dF@bjpxf;y?e&O9j!Ui`6_ z`|S%{SHu$u-~cUIp=FlFecF!U2?4y#MvnH_Qs=GN5FsDO8Zu!gb$-1UA+ZNmgxQX# zfb2rTQRy~ZC_X(jhA8D^i95aBL`;52MnOnQBb5=+MeE1qaY3GxBAFTzgIe1emy5@p zgz4ilTT%ri^XuooARmLU<#Rlxa$-SrYk&Mc1gd@4u?jr7y&~^#(}bW0c5c|-anES! z$@_~;fb6dl142be=60taG`#HaeJw{}o;&Vw>H2hcJn<@EcZ|4kxx2>(OXsmXvkgfj z$f50<>Y|5grYx>4T1t3x@%^=l*}h8q%vdl7da$hsDQ_rucirLQuVR9)n|K?&-i_Zs zSv`www2dIvJr?VEt+Ejx@;!%N$4WHUJ(c)d^ie3klf^{z>OzaEm*;mgwe#OQ7aTXA zdqmE#Wa)fBR?asTd`4!W9N=T+4S;wSSDCm4kb+E|+W@vM(3usuk%DoL(~;QbC;BL| zeY;!rk2F&jdo#9(rBQ76E^7K=7B(~6x!Ero8_W$+iKCUY(6;|ME-!x2DmB*h&P^>} z#OAfR5gmb_=f^$W_>Vpx$C;B8+@%x{)dcto6i2hcy2W+lrR9k)MOBq0^wvr!M%aYX z*sNQZPI);HxGunXMs{kH%{h>xp94?#U?G4WfQuKAVtuwxyrA|lfa7S=#KVD$g)E(s z;G4AJL{s*SuO>aEAf=e&c3RErVbrD2$}I|Ga&i-gQI%R2wl0}q{8<(Z5fW_b0smNs z;8zMOKmfE(5ymV;nDvpNrZLcWCQ3#T5no+m zh}Ho2%zjmJa-)U?2L30#teGk)=LyF1^G&TetGC8_83^-0yKtsg7|AD6}?5)V!E( z6;Rn*2x;tmxE!^4o&uv_aXcRNCthawm1q=VU)(&#j9Eh1{#y%aZ9`oS6bwuCc3u!w z`=OVJoq*(4>hSRK0r|6e?h1+P=`2eSII!i*k$nIG%7RQGhw;ApD&8~*%Mzy2H1i|w zUc7n0FaXLAxT=yohq$MNU!WUme!t9zQ;q>#K@K} zN0mtij%5sDLc4^5<3U5d^4aVtu#nS-gCNiv^44sO29h=tkMY0|5NKzZTY?jrGH@OG zKO%S#;ZEdAbGF97(YF=+T!o2mL*_n>iono^96K|qERYeg#aZKsF9qz6!!QN`-&Kkh zyBP`GjE}@(o|}A-Rrn|A& z>e$7)F1K_V4sX9@Xl)k-h@kGHKiu9LU6SXH1I-}l^9vOXo35xkF`M=-^~%!mjlygU zx?PG^^>fWk*IrlFKK9 zGiH|7o2fbzala|L8$mYy{9?-DY%0#OC&}t2$SpJ!b14U1U1BPlKDoSUI5)S_#LU*1 z55QWx%COgSOdNZj<3OOIE~8no^XZ~j7G4#)v!SRJtcS1MY_#%Yas1Pl$HOmEbT!I; zHKrk|z~r&PVzZxyk;2j_j!4K|X1s3QrHkY2r_sMJV6PhRE4@{5=y?_Aov5I}8=WN^ z`B*87`##mY7SuXQv*BY-_}&94f&k;lvh3KewN06rgTbzCKc;F#otM^bc4=dA8=;#H z7=lXqo&ywDhEpeEmK8YA9aCf$$H85j8gS|G3fh@oxw7#X*8a@Q&EhHnH2To8WeB9Z zXcd#s0wC_PqZYvVPcorgt*SVA)-e9_>l48t73djs5B+Cxt+#P0ev7n|C&>#t%>I

yq7*qm%QJo07-UB3(?kORr6T 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Ș-@zJown>?#?x@c}kv#450}7s2c2ZiwMfS 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 diff --git a/src/DjangoBlog/blog/static/blog/fonts/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTS-muw.woff2 b/src/DjangoBlog/blog/static/blog/fonts/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTS-muw.woff2 deleted file mode 100644 index b5d54e7629057f310f8ef458e67ba2f568032139..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 48320 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 diff --git a/src/DjangoBlog/blog/static/blog/fonts/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTS2mu1aB.woff2 b/src/DjangoBlog/blog/static/blog/fonts/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTS2mu1aB.woff2 deleted file mode 100644 index bed5b67c827d153d0ad4f1da91c3a24cd0e476f1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16920 zcmV(_K-9l?Pew8T0RR91074i57XSbN0Cp$<070Js0RR9100000000000000000000 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 diff --git a/src/DjangoBlog/blog/static/blog/fonts/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSCmu1aB.woff2 b/src/DjangoBlog/blog/static/blog/fonts/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSCmu1aB.woff2 deleted file mode 100644 index 9164ccba92f8e4e78b7199c8a8098147293968ee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16496 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 diff --git a/src/DjangoBlog/blog/static/blog/fonts/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSGmu1aB.woff2 b/src/DjangoBlog/blog/static/blog/fonts/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSGmu1aB.woff2 deleted file mode 100644 index 08bed85e3d0d366be9b055236c4ce01db4e7b505..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35156 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 diff --git a/src/DjangoBlog/blog/static/blog/fonts/open-sans.css b/src/DjangoBlog/blog/static/blog/fonts/open-sans.css deleted file mode 100644 index e6dd4a9..0000000 --- a/src/DjangoBlog/blog/static/blog/fonts/open-sans.css +++ /dev/null @@ -1,600 +0,0 @@ -/* cyrillic-ext */ -@font-face { - font-family: 'Open Sans'; - font-style: italic; - font-weight: 300; - font-stretch: 100%; - font-display: swap; - src: url(memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWtE6F15M.woff2) format('woff2'); - unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; -} -/* cyrillic */ -@font-face { - font-family: 'Open Sans'; - font-style: italic; - font-weight: 300; - font-stretch: 100%; - font-display: swap; - src: url(memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWvU6F15M.woff2) format('woff2'); - unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; -} -/* greek-ext */ -@font-face { - font-family: 'Open Sans'; - font-style: italic; - font-weight: 300; - font-stretch: 100%; - font-display: swap; - src: url(memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWtU6F15M.woff2) format('woff2'); - unicode-range: U+1F00-1FFF; -} -/* greek */ -@font-face { - font-family: 'Open Sans'; - font-style: italic; - font-weight: 300; - font-stretch: 100%; - font-display: swap; - src: url(memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWuk6F15M.woff2) format('woff2'); - unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF; -} -/* hebrew */ -@font-face { - font-family: 'Open Sans'; - font-style: italic; - font-weight: 300; - font-stretch: 100%; - font-display: swap; - src: url(memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWu06F15M.woff2) format('woff2'); - unicode-range: U+0307-0308, U+0590-05FF, U+200C-2010, U+20AA, U+25CC, U+FB1D-FB4F; -} -/* math */ -@font-face { - font-family: 'Open Sans'; - font-style: italic; - font-weight: 300; - font-stretch: 100%; - font-display: swap; - src: url(memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWxU6F15M.woff2) format('woff2'); - unicode-range: U+0302-0303, U+0305, U+0307-0308, U+0310, U+0312, U+0315, U+031A, U+0326-0327, U+032C, U+032F-0330, U+0332-0333, U+0338, U+033A, U+0346, U+034D, U+0391-03A1, U+03A3-03A9, U+03B1-03C9, U+03D1, U+03D5-03D6, U+03F0-03F1, U+03F4-03F5, U+2016-2017, U+2034-2038, U+203C, U+2040, U+2043, U+2047, U+2050, U+2057, U+205F, U+2070-2071, U+2074-208E, U+2090-209C, U+20D0-20DC, U+20E1, U+20E5-20EF, U+2100-2112, U+2114-2115, U+2117-2121, U+2123-214F, U+2190, U+2192, U+2194-21AE, U+21B0-21E5, U+21F1-21F2, U+21F4-2211, U+2213-2214, U+2216-22FF, U+2308-230B, U+2310, U+2319, U+231C-2321, U+2336-237A, U+237C, U+2395, U+239B-23B7, U+23D0, U+23DC-23E1, U+2474-2475, U+25AF, U+25B3, U+25B7, U+25BD, U+25C1, U+25CA, U+25CC, U+25FB, U+266D-266F, U+27C0-27FF, U+2900-2AFF, U+2B0E-2B11, U+2B30-2B4C, U+2BFE, U+3030, U+FF5B, U+FF5D, U+1D400-1D7FF, U+1EE00-1EEFF; -} -/* symbols */ -@font-face { - font-family: 'Open Sans'; - font-style: italic; - font-weight: 300; - font-stretch: 100%; - font-display: swap; - src: url(memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqW106F15M.woff2) format('woff2'); - unicode-range: U+0001-000C, U+000E-001F, U+007F-009F, U+20DD-20E0, U+20E2-20E4, U+2150-218F, U+2190, U+2192, U+2194-2199, U+21AF, U+21E6-21F0, U+21F3, U+2218-2219, U+2299, U+22C4-22C6, U+2300-243F, U+2440-244A, U+2460-24FF, U+25A0-27BF, U+2800-28FF, U+2921-2922, U+2981, U+29BF, U+29EB, U+2B00-2BFF, U+4DC0-4DFF, U+FFF9-FFFB, U+10140-1018E, U+10190-1019C, U+101A0, U+101D0-101FD, U+102E0-102FB, U+10E60-10E7E, U+1D2C0-1D2D3, U+1D2E0-1D37F, U+1F000-1F0FF, U+1F100-1F1AD, U+1F1E6-1F1FF, U+1F30D-1F30F, U+1F315, U+1F31C, U+1F31E, U+1F320-1F32C, U+1F336, U+1F378, U+1F37D, U+1F382, U+1F393-1F39F, U+1F3A7-1F3A8, U+1F3AC-1F3AF, U+1F3C2, U+1F3C4-1F3C6, U+1F3CA-1F3CE, U+1F3D4-1F3E0, U+1F3ED, U+1F3F1-1F3F3, U+1F3F5-1F3F7, U+1F408, U+1F415, U+1F41F, U+1F426, U+1F43F, U+1F441-1F442, U+1F444, U+1F446-1F449, U+1F44C-1F44E, U+1F453, U+1F46A, U+1F47D, U+1F4A3, U+1F4B0, U+1F4B3, U+1F4B9, U+1F4BB, U+1F4BF, U+1F4C8-1F4CB, U+1F4D6, U+1F4DA, U+1F4DF, U+1F4E3-1F4E6, U+1F4EA-1F4ED, U+1F4F7, U+1F4F9-1F4FB, U+1F4FD-1F4FE, U+1F503, U+1F507-1F50B, U+1F50D, U+1F512-1F513, U+1F53E-1F54A, U+1F54F-1F5FA, U+1F610, U+1F650-1F67F, U+1F687, U+1F68D, U+1F691, U+1F694, U+1F698, U+1F6AD, U+1F6B2, U+1F6B9-1F6BA, U+1F6BC, U+1F6C6-1F6CF, U+1F6D3-1F6D7, U+1F6E0-1F6EA, U+1F6F0-1F6F3, U+1F6F7-1F6FC, U+1F700-1F7FF, U+1F800-1F80B, U+1F810-1F847, U+1F850-1F859, U+1F860-1F887, U+1F890-1F8AD, U+1F8B0-1F8BB, U+1F8C0-1F8C1, U+1F900-1F90B, U+1F93B, U+1F946, U+1F984, U+1F996, U+1F9E9, U+1FA00-1FA6F, U+1FA70-1FA7C, U+1FA80-1FA89, U+1FA8F-1FAC6, U+1FACE-1FADC, U+1FADF-1FAE9, U+1FAF0-1FAF8, U+1FB00-1FBFF; -} -/* vietnamese */ -@font-face { - font-family: 'Open Sans'; - font-style: italic; - font-weight: 300; - font-stretch: 100%; - font-display: swap; - src: url(memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWtk6F15M.woff2) format('woff2'); - unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB; -} -/* latin-ext */ -@font-face { - font-family: 'Open Sans'; - font-style: italic; - font-weight: 300; - font-stretch: 100%; - font-display: swap; - src: url(memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWt06F15M.woff2) format('woff2'); - unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; -} -/* latin */ -@font-face { - font-family: 'Open Sans'; - font-style: italic; - font-weight: 300; - font-stretch: 100%; - font-display: swap; - src: url(memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWuU6F.woff2) format('woff2'); - unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; -} -/* cyrillic-ext */ -@font-face { - font-family: 'Open Sans'; - font-style: italic; - font-weight: 400; - font-stretch: 100%; - font-display: swap; - src: url(memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWtE6F15M.woff2) format('woff2'); - unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; -} -/* cyrillic */ -@font-face { - font-family: 'Open Sans'; - font-style: italic; - font-weight: 400; - font-stretch: 100%; - font-display: swap; - src: url(memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWvU6F15M.woff2) format('woff2'); - unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; -} -/* greek-ext */ -@font-face { - font-family: 'Open Sans'; - font-style: italic; - font-weight: 400; - font-stretch: 100%; - font-display: swap; - src: url(memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWtU6F15M.woff2) format('woff2'); - unicode-range: U+1F00-1FFF; -} -/* greek */ -@font-face { - font-family: 'Open Sans'; - font-style: italic; - font-weight: 400; - font-stretch: 100%; - font-display: swap; - src: url(memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWuk6F15M.woff2) format('woff2'); - unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF; -} -/* hebrew */ -@font-face { - font-family: 'Open Sans'; - font-style: italic; - font-weight: 400; - font-stretch: 100%; - font-display: swap; - src: url(memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWu06F15M.woff2) format('woff2'); - unicode-range: U+0307-0308, U+0590-05FF, U+200C-2010, U+20AA, U+25CC, U+FB1D-FB4F; -} -/* math */ -@font-face { - font-family: 'Open Sans'; - font-style: italic; - font-weight: 400; - font-stretch: 100%; - font-display: swap; - src: url(memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWxU6F15M.woff2) format('woff2'); - unicode-range: U+0302-0303, U+0305, U+0307-0308, U+0310, U+0312, U+0315, U+031A, U+0326-0327, U+032C, U+032F-0330, U+0332-0333, U+0338, U+033A, U+0346, U+034D, U+0391-03A1, U+03A3-03A9, U+03B1-03C9, U+03D1, U+03D5-03D6, U+03F0-03F1, U+03F4-03F5, U+2016-2017, U+2034-2038, U+203C, U+2040, U+2043, U+2047, U+2050, U+2057, U+205F, U+2070-2071, U+2074-208E, U+2090-209C, U+20D0-20DC, U+20E1, U+20E5-20EF, U+2100-2112, U+2114-2115, U+2117-2121, U+2123-214F, U+2190, U+2192, U+2194-21AE, U+21B0-21E5, U+21F1-21F2, U+21F4-2211, U+2213-2214, U+2216-22FF, U+2308-230B, U+2310, U+2319, U+231C-2321, U+2336-237A, U+237C, U+2395, U+239B-23B7, U+23D0, U+23DC-23E1, U+2474-2475, U+25AF, U+25B3, U+25B7, U+25BD, U+25C1, U+25CA, U+25CC, U+25FB, U+266D-266F, U+27C0-27FF, U+2900-2AFF, U+2B0E-2B11, U+2B30-2B4C, U+2BFE, U+3030, U+FF5B, U+FF5D, U+1D400-1D7FF, U+1EE00-1EEFF; -} -/* symbols */ -@font-face { - font-family: 'Open Sans'; - font-style: italic; - font-weight: 400; - font-stretch: 100%; - font-display: swap; - src: url(memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqW106F15M.woff2) format('woff2'); - unicode-range: U+0001-000C, U+000E-001F, U+007F-009F, U+20DD-20E0, U+20E2-20E4, U+2150-218F, U+2190, U+2192, U+2194-2199, U+21AF, U+21E6-21F0, U+21F3, U+2218-2219, U+2299, U+22C4-22C6, U+2300-243F, U+2440-244A, U+2460-24FF, U+25A0-27BF, U+2800-28FF, U+2921-2922, U+2981, U+29BF, U+29EB, U+2B00-2BFF, U+4DC0-4DFF, U+FFF9-FFFB, U+10140-1018E, U+10190-1019C, U+101A0, U+101D0-101FD, U+102E0-102FB, U+10E60-10E7E, U+1D2C0-1D2D3, U+1D2E0-1D37F, U+1F000-1F0FF, U+1F100-1F1AD, U+1F1E6-1F1FF, U+1F30D-1F30F, U+1F315, U+1F31C, U+1F31E, U+1F320-1F32C, U+1F336, U+1F378, U+1F37D, U+1F382, U+1F393-1F39F, U+1F3A7-1F3A8, U+1F3AC-1F3AF, U+1F3C2, U+1F3C4-1F3C6, U+1F3CA-1F3CE, U+1F3D4-1F3E0, U+1F3ED, U+1F3F1-1F3F3, U+1F3F5-1F3F7, U+1F408, U+1F415, U+1F41F, U+1F426, U+1F43F, U+1F441-1F442, U+1F444, U+1F446-1F449, U+1F44C-1F44E, U+1F453, U+1F46A, U+1F47D, U+1F4A3, U+1F4B0, U+1F4B3, U+1F4B9, U+1F4BB, U+1F4BF, U+1F4C8-1F4CB, U+1F4D6, U+1F4DA, U+1F4DF, U+1F4E3-1F4E6, U+1F4EA-1F4ED, U+1F4F7, U+1F4F9-1F4FB, U+1F4FD-1F4FE, U+1F503, U+1F507-1F50B, U+1F50D, U+1F512-1F513, U+1F53E-1F54A, U+1F54F-1F5FA, U+1F610, U+1F650-1F67F, U+1F687, U+1F68D, U+1F691, U+1F694, U+1F698, U+1F6AD, U+1F6B2, U+1F6B9-1F6BA, U+1F6BC, U+1F6C6-1F6CF, U+1F6D3-1F6D7, U+1F6E0-1F6EA, U+1F6F0-1F6F3, U+1F6F7-1F6FC, U+1F700-1F7FF, U+1F800-1F80B, U+1F810-1F847, U+1F850-1F859, U+1F860-1F887, U+1F890-1F8AD, U+1F8B0-1F8BB, U+1F8C0-1F8C1, U+1F900-1F90B, U+1F93B, U+1F946, U+1F984, U+1F996, U+1F9E9, U+1FA00-1FA6F, U+1FA70-1FA7C, U+1FA80-1FA89, U+1FA8F-1FAC6, U+1FACE-1FADC, U+1FADF-1FAE9, U+1FAF0-1FAF8, U+1FB00-1FBFF; -} -/* vietnamese */ -@font-face { - font-family: 'Open Sans'; - font-style: italic; - font-weight: 400; - font-stretch: 100%; - font-display: swap; - src: url(memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWtk6F15M.woff2) format('woff2'); - unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB; -} -/* latin-ext */ -@font-face { - font-family: 'Open Sans'; - font-style: italic; - font-weight: 400; - font-stretch: 100%; - font-display: swap; - src: url(memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWt06F15M.woff2) format('woff2'); - unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; -} -/* latin */ -@font-face { - font-family: 'Open Sans'; - font-style: italic; - font-weight: 400; - font-stretch: 100%; - font-display: swap; - src: url(memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWuU6F.woff2) format('woff2'); - unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; -} -/* cyrillic-ext */ -@font-face { - font-family: 'Open Sans'; - font-style: italic; - font-weight: 600; - font-stretch: 100%; - font-display: swap; - src: url(memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWtE6F15M.woff2) format('woff2'); - unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; -} -/* cyrillic */ -@font-face { - font-family: 'Open Sans'; - font-style: italic; - font-weight: 600; - font-stretch: 100%; - font-display: swap; - src: url(memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWvU6F15M.woff2) format('woff2'); - unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; -} -/* greek-ext */ -@font-face { - font-family: 'Open Sans'; - font-style: italic; - font-weight: 600; - font-stretch: 100%; - font-display: swap; - src: url(memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWtU6F15M.woff2) format('woff2'); - unicode-range: U+1F00-1FFF; -} -/* greek */ -@font-face { - font-family: 'Open Sans'; - font-style: italic; - font-weight: 600; - font-stretch: 100%; - font-display: swap; - src: url(memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWuk6F15M.woff2) format('woff2'); - unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF; -} -/* hebrew */ -@font-face { - font-family: 'Open Sans'; - font-style: italic; - font-weight: 600; - font-stretch: 100%; - font-display: swap; - src: url(memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWu06F15M.woff2) format('woff2'); - unicode-range: U+0307-0308, U+0590-05FF, U+200C-2010, U+20AA, U+25CC, U+FB1D-FB4F; -} -/* math */ -@font-face { - font-family: 'Open Sans'; - font-style: italic; - font-weight: 600; - font-stretch: 100%; - font-display: swap; - src: url(memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWxU6F15M.woff2) format('woff2'); - unicode-range: U+0302-0303, U+0305, U+0307-0308, U+0310, U+0312, U+0315, U+031A, U+0326-0327, U+032C, U+032F-0330, U+0332-0333, U+0338, U+033A, U+0346, U+034D, U+0391-03A1, U+03A3-03A9, U+03B1-03C9, U+03D1, U+03D5-03D6, U+03F0-03F1, U+03F4-03F5, U+2016-2017, U+2034-2038, U+203C, U+2040, U+2043, U+2047, U+2050, U+2057, U+205F, U+2070-2071, U+2074-208E, U+2090-209C, U+20D0-20DC, U+20E1, U+20E5-20EF, U+2100-2112, U+2114-2115, U+2117-2121, U+2123-214F, U+2190, U+2192, U+2194-21AE, U+21B0-21E5, U+21F1-21F2, U+21F4-2211, U+2213-2214, U+2216-22FF, U+2308-230B, U+2310, U+2319, U+231C-2321, U+2336-237A, U+237C, U+2395, U+239B-23B7, U+23D0, U+23DC-23E1, U+2474-2475, U+25AF, U+25B3, U+25B7, U+25BD, U+25C1, U+25CA, U+25CC, U+25FB, U+266D-266F, U+27C0-27FF, U+2900-2AFF, U+2B0E-2B11, U+2B30-2B4C, U+2BFE, U+3030, U+FF5B, U+FF5D, U+1D400-1D7FF, U+1EE00-1EEFF; -} -/* symbols */ -@font-face { - font-family: 'Open Sans'; - font-style: italic; - font-weight: 600; - font-stretch: 100%; - font-display: swap; - src: url(memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqW106F15M.woff2) format('woff2'); - unicode-range: U+0001-000C, U+000E-001F, U+007F-009F, U+20DD-20E0, U+20E2-20E4, U+2150-218F, U+2190, U+2192, U+2194-2199, U+21AF, U+21E6-21F0, U+21F3, U+2218-2219, U+2299, U+22C4-22C6, U+2300-243F, U+2440-244A, U+2460-24FF, U+25A0-27BF, U+2800-28FF, U+2921-2922, U+2981, U+29BF, U+29EB, U+2B00-2BFF, U+4DC0-4DFF, U+FFF9-FFFB, U+10140-1018E, U+10190-1019C, U+101A0, U+101D0-101FD, U+102E0-102FB, U+10E60-10E7E, U+1D2C0-1D2D3, U+1D2E0-1D37F, U+1F000-1F0FF, U+1F100-1F1AD, U+1F1E6-1F1FF, U+1F30D-1F30F, U+1F315, U+1F31C, U+1F31E, U+1F320-1F32C, U+1F336, U+1F378, U+1F37D, U+1F382, U+1F393-1F39F, U+1F3A7-1F3A8, U+1F3AC-1F3AF, U+1F3C2, U+1F3C4-1F3C6, U+1F3CA-1F3CE, U+1F3D4-1F3E0, U+1F3ED, U+1F3F1-1F3F3, U+1F3F5-1F3F7, U+1F408, U+1F415, U+1F41F, U+1F426, U+1F43F, U+1F441-1F442, U+1F444, U+1F446-1F449, U+1F44C-1F44E, U+1F453, U+1F46A, U+1F47D, U+1F4A3, U+1F4B0, U+1F4B3, U+1F4B9, U+1F4BB, U+1F4BF, U+1F4C8-1F4CB, U+1F4D6, U+1F4DA, U+1F4DF, U+1F4E3-1F4E6, U+1F4EA-1F4ED, U+1F4F7, U+1F4F9-1F4FB, U+1F4FD-1F4FE, U+1F503, U+1F507-1F50B, U+1F50D, U+1F512-1F513, U+1F53E-1F54A, U+1F54F-1F5FA, U+1F610, U+1F650-1F67F, U+1F687, U+1F68D, U+1F691, U+1F694, U+1F698, U+1F6AD, U+1F6B2, U+1F6B9-1F6BA, U+1F6BC, U+1F6C6-1F6CF, U+1F6D3-1F6D7, U+1F6E0-1F6EA, U+1F6F0-1F6F3, U+1F6F7-1F6FC, U+1F700-1F7FF, U+1F800-1F80B, U+1F810-1F847, U+1F850-1F859, U+1F860-1F887, U+1F890-1F8AD, U+1F8B0-1F8BB, U+1F8C0-1F8C1, U+1F900-1F90B, U+1F93B, U+1F946, U+1F984, U+1F996, U+1F9E9, U+1FA00-1FA6F, U+1FA70-1FA7C, U+1FA80-1FA89, U+1FA8F-1FAC6, U+1FACE-1FADC, U+1FADF-1FAE9, U+1FAF0-1FAF8, U+1FB00-1FBFF; -} -/* vietnamese */ -@font-face { - font-family: 'Open Sans'; - font-style: italic; - font-weight: 600; - font-stretch: 100%; - font-display: swap; - src: url(memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWtk6F15M.woff2) format('woff2'); - unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB; -} -/* latin-ext */ -@font-face { - font-family: 'Open Sans'; - font-style: italic; - font-weight: 600; - font-stretch: 100%; - font-display: swap; - src: url(memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWt06F15M.woff2) format('woff2'); - unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; -} -/* latin */ -@font-face { - font-family: 'Open Sans'; - font-style: italic; - font-weight: 600; - font-stretch: 100%; - font-display: swap; - src: url(memtYaGs126MiZpBA-UFUIcVXSCEkx2cmqvXlWqWuU6F.woff2) format('woff2'); - unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; -} -/* cyrillic-ext */ -@font-face { - font-family: 'Open Sans'; - font-style: normal; - font-weight: 300; - font-stretch: 100%; - font-display: swap; - src: url(memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSKmu1aB.woff2) format('woff2'); - unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; -} -/* cyrillic */ -@font-face { - font-family: 'Open Sans'; - font-style: normal; - font-weight: 300; - font-stretch: 100%; - font-display: swap; - src: url(memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSumu1aB.woff2) format('woff2'); - unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; -} -/* greek-ext */ -@font-face { - font-family: 'Open Sans'; - font-style: normal; - font-weight: 300; - font-stretch: 100%; - font-display: swap; - src: url(memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSOmu1aB.woff2) format('woff2'); - unicode-range: U+1F00-1FFF; -} -/* greek */ -@font-face { - font-family: 'Open Sans'; - font-style: normal; - font-weight: 300; - font-stretch: 100%; - font-display: swap; - src: url(memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSymu1aB.woff2) format('woff2'); - unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF; -} -/* hebrew */ -@font-face { - font-family: 'Open Sans'; - font-style: normal; - font-weight: 300; - font-stretch: 100%; - font-display: swap; - src: url(memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTS2mu1aB.woff2) format('woff2'); - unicode-range: U+0307-0308, U+0590-05FF, U+200C-2010, U+20AA, U+25CC, U+FB1D-FB4F; -} -/* math */ -@font-face { - font-family: 'Open Sans'; - font-style: normal; - font-weight: 300; - font-stretch: 100%; - font-display: swap; - src: url(memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTVOmu1aB.woff2) format('woff2'); - unicode-range: U+0302-0303, U+0305, U+0307-0308, U+0310, U+0312, U+0315, U+031A, U+0326-0327, U+032C, U+032F-0330, U+0332-0333, U+0338, U+033A, U+0346, U+034D, U+0391-03A1, U+03A3-03A9, U+03B1-03C9, U+03D1, U+03D5-03D6, U+03F0-03F1, U+03F4-03F5, U+2016-2017, U+2034-2038, U+203C, U+2040, U+2043, U+2047, U+2050, U+2057, U+205F, U+2070-2071, U+2074-208E, U+2090-209C, U+20D0-20DC, U+20E1, U+20E5-20EF, U+2100-2112, U+2114-2115, U+2117-2121, U+2123-214F, U+2190, U+2192, U+2194-21AE, U+21B0-21E5, U+21F1-21F2, U+21F4-2211, U+2213-2214, U+2216-22FF, U+2308-230B, U+2310, U+2319, U+231C-2321, U+2336-237A, U+237C, U+2395, U+239B-23B7, U+23D0, U+23DC-23E1, U+2474-2475, U+25AF, U+25B3, U+25B7, U+25BD, U+25C1, U+25CA, U+25CC, U+25FB, U+266D-266F, U+27C0-27FF, U+2900-2AFF, U+2B0E-2B11, U+2B30-2B4C, U+2BFE, U+3030, U+FF5B, U+FF5D, U+1D400-1D7FF, U+1EE00-1EEFF; -} -/* symbols */ -@font-face { - font-family: 'Open Sans'; - font-style: normal; - font-weight: 300; - font-stretch: 100%; - font-display: swap; - src: url(memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTUGmu1aB.woff2) format('woff2'); - unicode-range: U+0001-000C, U+000E-001F, U+007F-009F, U+20DD-20E0, U+20E2-20E4, U+2150-218F, U+2190, U+2192, U+2194-2199, U+21AF, U+21E6-21F0, U+21F3, U+2218-2219, U+2299, U+22C4-22C6, U+2300-243F, U+2440-244A, U+2460-24FF, U+25A0-27BF, U+2800-28FF, U+2921-2922, U+2981, U+29BF, U+29EB, U+2B00-2BFF, U+4DC0-4DFF, U+FFF9-FFFB, U+10140-1018E, U+10190-1019C, U+101A0, U+101D0-101FD, U+102E0-102FB, U+10E60-10E7E, U+1D2C0-1D2D3, U+1D2E0-1D37F, U+1F000-1F0FF, U+1F100-1F1AD, U+1F1E6-1F1FF, U+1F30D-1F30F, U+1F315, U+1F31C, U+1F31E, U+1F320-1F32C, U+1F336, U+1F378, U+1F37D, U+1F382, U+1F393-1F39F, U+1F3A7-1F3A8, U+1F3AC-1F3AF, U+1F3C2, U+1F3C4-1F3C6, U+1F3CA-1F3CE, U+1F3D4-1F3E0, U+1F3ED, U+1F3F1-1F3F3, U+1F3F5-1F3F7, U+1F408, U+1F415, U+1F41F, U+1F426, U+1F43F, U+1F441-1F442, U+1F444, U+1F446-1F449, U+1F44C-1F44E, U+1F453, U+1F46A, U+1F47D, U+1F4A3, U+1F4B0, U+1F4B3, U+1F4B9, U+1F4BB, U+1F4BF, U+1F4C8-1F4CB, U+1F4D6, U+1F4DA, U+1F4DF, U+1F4E3-1F4E6, U+1F4EA-1F4ED, U+1F4F7, U+1F4F9-1F4FB, U+1F4FD-1F4FE, U+1F503, U+1F507-1F50B, U+1F50D, U+1F512-1F513, U+1F53E-1F54A, U+1F54F-1F5FA, U+1F610, U+1F650-1F67F, U+1F687, U+1F68D, U+1F691, U+1F694, U+1F698, U+1F6AD, U+1F6B2, U+1F6B9-1F6BA, U+1F6BC, U+1F6C6-1F6CF, U+1F6D3-1F6D7, U+1F6E0-1F6EA, U+1F6F0-1F6F3, U+1F6F7-1F6FC, U+1F700-1F7FF, U+1F800-1F80B, U+1F810-1F847, U+1F850-1F859, U+1F860-1F887, U+1F890-1F8AD, U+1F8B0-1F8BB, U+1F8C0-1F8C1, U+1F900-1F90B, U+1F93B, U+1F946, U+1F984, U+1F996, U+1F9E9, U+1FA00-1FA6F, U+1FA70-1FA7C, U+1FA80-1FA89, U+1FA8F-1FAC6, U+1FACE-1FADC, U+1FADF-1FAE9, U+1FAF0-1FAF8, U+1FB00-1FBFF; -} -/* vietnamese */ -@font-face { - font-family: 'Open Sans'; - font-style: normal; - font-weight: 300; - font-stretch: 100%; - font-display: swap; - src: url(memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSCmu1aB.woff2) format('woff2'); - unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB; -} -/* latin-ext */ -@font-face { - font-family: 'Open Sans'; - font-style: normal; - font-weight: 300; - font-stretch: 100%; - font-display: swap; - src: url(memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSGmu1aB.woff2) format('woff2'); - unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; -} -/* latin */ -@font-face { - font-family: 'Open Sans'; - font-style: normal; - font-weight: 300; - font-stretch: 100%; - font-display: swap; - src: url(memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTS-muw.woff2) format('woff2'); - unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; -} -/* cyrillic-ext */ -@font-face { - font-family: 'Open Sans'; - font-style: normal; - font-weight: 400; - font-stretch: 100%; - font-display: swap; - src: url(memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSKmu1aB.woff2) format('woff2'); - unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; -} -/* cyrillic */ -@font-face { - font-family: 'Open Sans'; - font-style: normal; - font-weight: 400; - font-stretch: 100%; - font-display: swap; - src: url(memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSumu1aB.woff2) format('woff2'); - unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; -} -/* greek-ext */ -@font-face { - font-family: 'Open Sans'; - font-style: normal; - font-weight: 400; - font-stretch: 100%; - font-display: swap; - src: url(memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSOmu1aB.woff2) format('woff2'); - unicode-range: U+1F00-1FFF; -} -/* greek */ -@font-face { - font-family: 'Open Sans'; - font-style: normal; - font-weight: 400; - font-stretch: 100%; - font-display: swap; - src: url(memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSymu1aB.woff2) format('woff2'); - unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF; -} -/* hebrew */ -@font-face { - font-family: 'Open Sans'; - font-style: normal; - font-weight: 400; - font-stretch: 100%; - font-display: swap; - src: url(memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTS2mu1aB.woff2) format('woff2'); - unicode-range: U+0307-0308, U+0590-05FF, U+200C-2010, U+20AA, U+25CC, U+FB1D-FB4F; -} -/* math */ -@font-face { - font-family: 'Open Sans'; - font-style: normal; - font-weight: 400; - font-stretch: 100%; - font-display: swap; - src: url(memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTVOmu1aB.woff2) format('woff2'); - unicode-range: U+0302-0303, U+0305, U+0307-0308, U+0310, U+0312, U+0315, U+031A, U+0326-0327, U+032C, U+032F-0330, U+0332-0333, U+0338, U+033A, U+0346, U+034D, U+0391-03A1, U+03A3-03A9, U+03B1-03C9, U+03D1, U+03D5-03D6, U+03F0-03F1, U+03F4-03F5, U+2016-2017, U+2034-2038, U+203C, U+2040, U+2043, U+2047, U+2050, U+2057, U+205F, U+2070-2071, U+2074-208E, U+2090-209C, U+20D0-20DC, U+20E1, U+20E5-20EF, U+2100-2112, U+2114-2115, U+2117-2121, U+2123-214F, U+2190, U+2192, U+2194-21AE, U+21B0-21E5, U+21F1-21F2, U+21F4-2211, U+2213-2214, U+2216-22FF, U+2308-230B, U+2310, U+2319, U+231C-2321, U+2336-237A, U+237C, U+2395, U+239B-23B7, U+23D0, U+23DC-23E1, U+2474-2475, U+25AF, U+25B3, U+25B7, U+25BD, U+25C1, U+25CA, U+25CC, U+25FB, U+266D-266F, U+27C0-27FF, U+2900-2AFF, U+2B0E-2B11, U+2B30-2B4C, U+2BFE, U+3030, U+FF5B, U+FF5D, U+1D400-1D7FF, U+1EE00-1EEFF; -} -/* symbols */ -@font-face { - font-family: 'Open Sans'; - font-style: normal; - font-weight: 400; - font-stretch: 100%; - font-display: swap; - src: url(memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTUGmu1aB.woff2) format('woff2'); - unicode-range: U+0001-000C, U+000E-001F, U+007F-009F, U+20DD-20E0, U+20E2-20E4, U+2150-218F, U+2190, U+2192, U+2194-2199, U+21AF, U+21E6-21F0, U+21F3, U+2218-2219, U+2299, U+22C4-22C6, U+2300-243F, U+2440-244A, U+2460-24FF, U+25A0-27BF, U+2800-28FF, U+2921-2922, U+2981, U+29BF, U+29EB, U+2B00-2BFF, U+4DC0-4DFF, U+FFF9-FFFB, U+10140-1018E, U+10190-1019C, U+101A0, U+101D0-101FD, U+102E0-102FB, U+10E60-10E7E, U+1D2C0-1D2D3, U+1D2E0-1D37F, U+1F000-1F0FF, U+1F100-1F1AD, U+1F1E6-1F1FF, U+1F30D-1F30F, U+1F315, U+1F31C, U+1F31E, U+1F320-1F32C, U+1F336, U+1F378, U+1F37D, U+1F382, U+1F393-1F39F, U+1F3A7-1F3A8, U+1F3AC-1F3AF, U+1F3C2, U+1F3C4-1F3C6, U+1F3CA-1F3CE, U+1F3D4-1F3E0, U+1F3ED, U+1F3F1-1F3F3, U+1F3F5-1F3F7, U+1F408, U+1F415, U+1F41F, U+1F426, U+1F43F, U+1F441-1F442, U+1F444, U+1F446-1F449, U+1F44C-1F44E, U+1F453, U+1F46A, U+1F47D, U+1F4A3, U+1F4B0, U+1F4B3, U+1F4B9, U+1F4BB, U+1F4BF, U+1F4C8-1F4CB, U+1F4D6, U+1F4DA, U+1F4DF, U+1F4E3-1F4E6, U+1F4EA-1F4ED, U+1F4F7, U+1F4F9-1F4FB, U+1F4FD-1F4FE, U+1F503, U+1F507-1F50B, U+1F50D, U+1F512-1F513, U+1F53E-1F54A, U+1F54F-1F5FA, U+1F610, U+1F650-1F67F, U+1F687, U+1F68D, U+1F691, U+1F694, U+1F698, U+1F6AD, U+1F6B2, U+1F6B9-1F6BA, U+1F6BC, U+1F6C6-1F6CF, U+1F6D3-1F6D7, U+1F6E0-1F6EA, U+1F6F0-1F6F3, U+1F6F7-1F6FC, U+1F700-1F7FF, U+1F800-1F80B, U+1F810-1F847, U+1F850-1F859, U+1F860-1F887, U+1F890-1F8AD, U+1F8B0-1F8BB, U+1F8C0-1F8C1, U+1F900-1F90B, U+1F93B, U+1F946, U+1F984, U+1F996, U+1F9E9, U+1FA00-1FA6F, U+1FA70-1FA7C, U+1FA80-1FA89, U+1FA8F-1FAC6, U+1FACE-1FADC, U+1FADF-1FAE9, U+1FAF0-1FAF8, U+1FB00-1FBFF; -} -/* vietnamese */ -@font-face { - font-family: 'Open Sans'; - font-style: normal; - font-weight: 400; - font-stretch: 100%; - font-display: swap; - src: url(memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSCmu1aB.woff2) format('woff2'); - unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB; -} -/* latin-ext */ -@font-face { - font-family: 'Open Sans'; - font-style: normal; - font-weight: 400; - font-stretch: 100%; - font-display: swap; - src: url(memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSGmu1aB.woff2) format('woff2'); - unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; -} -/* latin */ -@font-face { - font-family: 'Open Sans'; - font-style: normal; - font-weight: 400; - font-stretch: 100%; - font-display: swap; - src: url(memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTS-muw.woff2) format('woff2'); - unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; -} -/* cyrillic-ext */ -@font-face { - font-family: 'Open Sans'; - font-style: normal; - font-weight: 600; - font-stretch: 100%; - font-display: swap; - src: url(memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSKmu1aB.woff2) format('woff2'); - unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; -} -/* cyrillic */ -@font-face { - font-family: 'Open Sans'; - font-style: normal; - font-weight: 600; - font-stretch: 100%; - font-display: swap; - src: url(memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSumu1aB.woff2) format('woff2'); - unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; -} -/* greek-ext */ -@font-face { - font-family: 'Open Sans'; - font-style: normal; - font-weight: 600; - font-stretch: 100%; - font-display: swap; - src: url(memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSOmu1aB.woff2) format('woff2'); - unicode-range: U+1F00-1FFF; -} -/* greek */ -@font-face { - font-family: 'Open Sans'; - font-style: normal; - font-weight: 600; - font-stretch: 100%; - font-display: swap; - src: url(memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSymu1aB.woff2) format('woff2'); - unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF; -} -/* hebrew */ -@font-face { - font-family: 'Open Sans'; - font-style: normal; - font-weight: 600; - font-stretch: 100%; - font-display: swap; - src: url(memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTS2mu1aB.woff2) format('woff2'); - unicode-range: U+0307-0308, U+0590-05FF, U+200C-2010, U+20AA, U+25CC, U+FB1D-FB4F; -} -/* math */ -@font-face { - font-family: 'Open Sans'; - font-style: normal; - font-weight: 600; - font-stretch: 100%; - font-display: swap; - src: url(memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTVOmu1aB.woff2) format('woff2'); - unicode-range: U+0302-0303, U+0305, U+0307-0308, U+0310, U+0312, U+0315, U+031A, U+0326-0327, U+032C, U+032F-0330, U+0332-0333, U+0338, U+033A, U+0346, U+034D, U+0391-03A1, U+03A3-03A9, U+03B1-03C9, U+03D1, U+03D5-03D6, U+03F0-03F1, U+03F4-03F5, U+2016-2017, U+2034-2038, U+203C, U+2040, U+2043, U+2047, U+2050, U+2057, U+205F, U+2070-2071, U+2074-208E, U+2090-209C, U+20D0-20DC, U+20E1, U+20E5-20EF, U+2100-2112, U+2114-2115, U+2117-2121, U+2123-214F, U+2190, U+2192, U+2194-21AE, U+21B0-21E5, U+21F1-21F2, U+21F4-2211, U+2213-2214, U+2216-22FF, U+2308-230B, U+2310, U+2319, U+231C-2321, U+2336-237A, U+237C, U+2395, U+239B-23B7, U+23D0, U+23DC-23E1, U+2474-2475, U+25AF, U+25B3, U+25B7, U+25BD, U+25C1, U+25CA, U+25CC, U+25FB, U+266D-266F, U+27C0-27FF, U+2900-2AFF, U+2B0E-2B11, U+2B30-2B4C, U+2BFE, U+3030, U+FF5B, U+FF5D, U+1D400-1D7FF, U+1EE00-1EEFF; -} -/* symbols */ -@font-face { - font-family: 'Open Sans'; - font-style: normal; - font-weight: 600; - font-stretch: 100%; - font-display: swap; - src: url(memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTUGmu1aB.woff2) format('woff2'); - unicode-range: U+0001-000C, U+000E-001F, U+007F-009F, U+20DD-20E0, U+20E2-20E4, U+2150-218F, U+2190, U+2192, U+2194-2199, U+21AF, U+21E6-21F0, U+21F3, U+2218-2219, U+2299, U+22C4-22C6, U+2300-243F, U+2440-244A, U+2460-24FF, U+25A0-27BF, U+2800-28FF, U+2921-2922, U+2981, U+29BF, U+29EB, U+2B00-2BFF, U+4DC0-4DFF, U+FFF9-FFFB, U+10140-1018E, U+10190-1019C, U+101A0, U+101D0-101FD, U+102E0-102FB, U+10E60-10E7E, U+1D2C0-1D2D3, U+1D2E0-1D37F, U+1F000-1F0FF, U+1F100-1F1AD, U+1F1E6-1F1FF, U+1F30D-1F30F, U+1F315, U+1F31C, U+1F31E, U+1F320-1F32C, U+1F336, U+1F378, U+1F37D, U+1F382, U+1F393-1F39F, U+1F3A7-1F3A8, U+1F3AC-1F3AF, U+1F3C2, U+1F3C4-1F3C6, U+1F3CA-1F3CE, U+1F3D4-1F3E0, U+1F3ED, U+1F3F1-1F3F3, U+1F3F5-1F3F7, U+1F408, U+1F415, U+1F41F, U+1F426, U+1F43F, U+1F441-1F442, U+1F444, U+1F446-1F449, U+1F44C-1F44E, U+1F453, U+1F46A, U+1F47D, U+1F4A3, U+1F4B0, U+1F4B3, U+1F4B9, U+1F4BB, U+1F4BF, U+1F4C8-1F4CB, U+1F4D6, U+1F4DA, U+1F4DF, U+1F4E3-1F4E6, U+1F4EA-1F4ED, U+1F4F7, U+1F4F9-1F4FB, U+1F4FD-1F4FE, U+1F503, U+1F507-1F50B, U+1F50D, U+1F512-1F513, U+1F53E-1F54A, U+1F54F-1F5FA, U+1F610, U+1F650-1F67F, U+1F687, U+1F68D, U+1F691, U+1F694, U+1F698, U+1F6AD, U+1F6B2, U+1F6B9-1F6BA, U+1F6BC, U+1F6C6-1F6CF, U+1F6D3-1F6D7, U+1F6E0-1F6EA, U+1F6F0-1F6F3, U+1F6F7-1F6FC, U+1F700-1F7FF, U+1F800-1F80B, U+1F810-1F847, U+1F850-1F859, U+1F860-1F887, U+1F890-1F8AD, U+1F8B0-1F8BB, U+1F8C0-1F8C1, U+1F900-1F90B, U+1F93B, U+1F946, U+1F984, U+1F996, U+1F9E9, U+1FA00-1FA6F, U+1FA70-1FA7C, U+1FA80-1FA89, U+1FA8F-1FAC6, U+1FACE-1FADC, U+1FADF-1FAE9, U+1FAF0-1FAF8, U+1FB00-1FBFF; -} -/* vietnamese */ -@font-face { - font-family: 'Open Sans'; - font-style: normal; - font-weight: 600; - font-stretch: 100%; - font-display: swap; - src: url(memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSCmu1aB.woff2) format('woff2'); - unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB; -} -/* latin-ext */ -@font-face { - font-family: 'Open Sans'; - font-style: normal; - font-weight: 600; - font-stretch: 100%; - font-display: swap; - src: url(memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSGmu1aB.woff2) format('woff2'); - unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; -} -/* latin */ -@font-face { - font-family: 'Open Sans'; - font-style: normal; - font-weight: 600; - font-stretch: 100%; - font-display: swap; - src: url(memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTS-muw.woff2) format('woff2'); - unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; -} diff --git a/src/DjangoBlog/blog/static/blog/img/avatar.png b/src/DjangoBlog/blog/static/blog/img/avatar.png deleted file mode 100644 index 320756f0defe537f858c10086b44e6c011bd3161..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1493 zcmaJ>do+}J82)`@m@yOkO}VvHh#Hpd6S)CwpZ7h_``2@x3>W$V1;UpE0DuDR zpuL+E>;5jhw1L=4<6bFXPue=$0#JI5xN=-p$~A)yx;X<7zXJd?1ptY3g^mLdg8(qe z0KoEl094Q9KXctDJzxS49k2)MY1dl0QihABIa6`tI1(g7j?$q2B>gR*+1q-sdOq~= zZHDd;ugEo zK3-TU^N5q10^t`uKCK9iOmncuy8!3D>blZu_vRi0Ft{Z8n47!YS#JtqXD;8jXH)t# z!C;@Lv5LyE0B%iPCA2mkP_v1n&*L8AZfyX5d{N*&qP#uGY&~XUOq4&bJtbt>j%Z^b z;Lvt`LBv9x0iMh9o>!~@C~?;nULXrhH#dP=ae!Pc_#xFQFw#z@Xx7`t>}EX%nWzDN z6c>>Dd*o`Lcny02oJrn^5;rNiNFEpV;u|330$XM&7=xj&O^x;Jav#J!kOj#N475rW z%vz{Xf^kM~U;-mT8;#{$Rx8v-wMr21?OqZXgXO?GvP@MT0=7pfu>G5?Q9Jys4&mt~ zN3A;k1@oeeivS;KhnhOb8vKa!vtbhx*QhIVm9C|@cV0z1OTFkbk>Xz|z$ryB%0JR% zE6~mzp0D}>%jx%iBvj2Kzgk8w`C(`Ai;lDxY1}{f)$UiJE`4%o+G#@0TkVX-R~@^4 zo58{6?J-(6o~yVC)8_V^iWk%iqE-_%%IgLL0-r5;iW4p;@PzuO_N$5wsLVRwOl7@j z_Rm~Gz<9;$Vb7k3;_kX(533MNTN37j>30Uz8$L42dyf($TuaLk^-xyX>tN!fzzd$( zs(e~<=;XSbZp4F$cAw$V7(x0T!*BM~+L_!BSy2g7R}Qzj#~-;du{|s7w#u}>*}HO_ zT|ju5xYvhhQoPQt=F{PHMT(}*o5H6t`wOzB$ya9a1lt6$P%Aw)yLetFa|O;UU7q3= z7)sc;)h6Wgj_^1z;wWN^X40~9<23r2iGpVAM}9ykd=*d9bNtl2ul;bEN$~eSah^)~AYD7l@a(M$z8>P-`Ke*LwR zUR~wPH!;V0P1~l8p_^x$Z3ts!#=W_oR+)F)8oXT3l|BFT8DWrm2BT z?>o}mlFadqe~x8KHil+1Mn`XUbQYBRF1{~$PKeo?D7-t?@ipI5sKQ*GHswT{jIn6E zu*yHDV!K|?c#ZlSb*2`>xegIjK0w7ELXgmE`Ncbr#qttVfJEY((vt zoloVIY!x-lnA!s`&E)}35ms(l#XNygBdQkak|SB^P|Aeh+Ios4`MQ-C;mc317|E`@hinEQ(Mjw1#P4 z2`?|vPZmhCPdA!+G&=Zr^a;zLb0?$#b|bq@3=uO!BQp=g$PzKOG(o;X5K9EH dCSXPehla%cx1eM)_pnp|XjHoWV>`yhzW{rieeD1M diff --git a/src/DjangoBlog/blog/static/blog/img/icon-sn.svg b/src/DjangoBlog/blog/static/blog/img/icon-sn.svg deleted file mode 100644 index 2c2da0a..0000000 --- a/src/DjangoBlog/blog/static/blog/img/icon-sn.svg +++ /dev/null @@ -1 +0,0 @@ -icon-sn \ No newline at end of file diff --git a/src/DjangoBlog/blog/static/blog/js/blog.js b/src/DjangoBlog/blog/static/blog/js/blog.js deleted file mode 100644 index c50dd7d..0000000 --- a/src/DjangoBlog/blog/static/blog/js/blog.js +++ /dev/null @@ -1,91 +0,0 @@ -/** - * Created by liangliang on 2016/11/20. - */ - - -function do_reply(parentid) { - console.log(parentid); - $("#id_parent_comment_id").val(parentid) - $("#commentform").appendTo($("#div-comment-" + parentid)); - $("#reply-title").hide(); - $("#cancel_comment").show(); -} - -function cancel_reply() { - $("#reply-title").show(); - $("#cancel_comment").hide(); - $("#id_parent_comment_id").val('') - $("#commentform").appendTo($("#respond")); -} - -NProgress.start(); -NProgress.set(0.4); -//Increment -var interval = setInterval(function () { - NProgress.inc(); -}, 1000); -$(document).ready(function () { - NProgress.done(); - clearInterval(interval); -}); - - -/** 侧边栏回到顶部 */ -var rocket = $('#rocket'); - -$(window).on('scroll', debounce(slideTopSet, 300)); - -function debounce(func, wait) { - var timeout; - return function () { - clearTimeout(timeout); - timeout = setTimeout(func, wait); - }; -} - -function slideTopSet() { - var top = $(document).scrollTop(); - - if (top > 200) { - rocket.addClass('show'); - } else { - rocket.removeClass('show'); - } -} - -$(document).on('click', '#rocket', function (event) { - rocket.addClass('move'); - $('body, html').animate({ - scrollTop: 0 - }, 800); -}); -$(document).on('animationEnd', function () { - setTimeout(function () { - rocket.removeClass('move'); - }, 400); - -}); -$(document).on('webkitAnimationEnd', function () { - setTimeout(function () { - rocket.removeClass('move'); - }, 400); -}); - - -window.onload = function () { - var replyLinks = document.querySelectorAll(".comment-reply-link"); - for (var i = 0; i < replyLinks.length; i++) { - replyLinks[i].onclick = function () { - var pk = this.getAttribute("data-pk"); - do_reply(pk); - }; - } -}; - -// $(document).ready(function () { -// var form = $('#i18n-form'); -// var selector = $('.i18n-select'); -// selector.on('change', function () { -// form.submit(); -// }); -// }); \ No newline at end of file diff --git a/src/DjangoBlog/blog/static/blog/js/html5.js b/src/DjangoBlog/blog/static/blog/js/html5.js deleted file mode 100644 index 6168aac..0000000 --- a/src/DjangoBlog/blog/static/blog/js/html5.js +++ /dev/null @@ -1,8 +0,0 @@ -/* - HTML5 Shiv v3.7.0 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed -*/ -(function(l,f){function m(){var a=e.elements;return"string"==typeof a?a.split(" "):a}function i(a){var b=n[a[o]];b||(b={},h++,a[o]=h,n[h]=b);return b}function p(a,b,c){b||(b=f);if(g)return b.createElement(a);c||(c=i(b));b=c.cache[a]?c.cache[a].cloneNode():r.test(a)?(c.cache[a]=c.createElem(a)).cloneNode():c.createElem(a);return b.canHaveChildren&&!s.test(a)?c.frag.appendChild(b):b}function t(a,b){if(!b.cache)b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag(); -a.createElement=function(c){return!e.shivMethods?b.createElem(c):p(c,a,b)};a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+m().join().replace(/[\w\-]+/g,function(a){b.createElem(a);b.frag.createElement(a);return'c("'+a+'")'})+");return n}")(e,b.frag)}function q(a){a||(a=f);var b=i(a);if(e.shivCSS&&!j&&!b.hasCSS){var c,d=a;c=d.createElement("p");d=d.getElementsByTagName("head")[0]||d.documentElement;c.innerHTML="x"; -c=d.insertBefore(c.lastChild,d.firstChild);b.hasCSS=!!c}g||t(a,b);return a}var k=l.html5||{},s=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,r=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,j,o="_html5shiv",h=0,n={},g;(function(){try{var a=f.createElement("a");a.innerHTML="";j="hidden"in a;var b;if(!(b=1==a.childNodes.length)){f.createElement("a");var c=f.createDocumentFragment();b="undefined"==typeof c.cloneNode|| -"undefined"==typeof c.createDocumentFragment||"undefined"==typeof c.createElement}g=b}catch(d){g=j=!0}})();var e={elements:k.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output progress section summary template time video",version:"3.7.0",shivCSS:!1!==k.shivCSS,supportsUnknownElements:g,shivMethods:!1!==k.shivMethods,type:"default",shivDocument:q,createElement:p,createDocumentFragment:function(a,b){a||(a=f); -if(g)return a.createDocumentFragment();for(var b=b||i(a),c=b.frag.cloneNode(),d=0,e=m(),h=e.length;d+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="

",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0 { - console.log('MathJax渲染完成'); - // 触发自定义事件,通知其他脚本MathJax已就绪 - document.dispatchEvent(new CustomEvent('mathjaxReady')); - }).catch(error => { - console.error('MathJax渲染失败:', error); - }); - } - }, - // 输出配置 - chtml: { - scale: 1, - minScale: 0.5, - matchFontHeight: false, - displayAlign: 'center', - displayIndent: '0' - } - }; - } - - /** - * 加载MathJax库 - */ - function loadMathJax() { - console.log('检测到数学公式,开始加载MathJax...'); - - const script = document.createElement('script'); - script.src = 'https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js'; - script.async = true; - script.defer = true; - - script.onload = function() { - console.log('MathJax库加载成功'); - }; - - script.onerror = function() { - console.error('MathJax库加载失败,尝试备用CDN...'); - // 备用CDN - const fallbackScript = document.createElement('script'); - fallbackScript.src = 'https://polyfill.io/v3/polyfill.min.js?features=es6'; - fallbackScript.onload = function() { - const mathJaxScript = document.createElement('script'); - mathJaxScript.src = 'https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-MML-AM_CHTML'; - mathJaxScript.async = true; - document.head.appendChild(mathJaxScript); - }; - document.head.appendChild(fallbackScript); - }; - - document.head.appendChild(script); - } - - /** - * 初始化函数 - */ - function init() { - // 等待DOM完全加载 - if (document.readyState === 'loading') { - document.addEventListener('DOMContentLoaded', init); - return; - } - - // 检测是否需要加载MathJax - if (hasMathFormulas()) { - // 先配置,再加载 - configureMathJax(); - loadMathJax(); - } else { - console.log('未检测到数学公式,跳过MathJax加载'); - } - } - - // 提供重新渲染的全局方法,供动态内容使用 - window.rerenderMathJax = function(element) { - if (window.MathJax && window.MathJax.typesetPromise) { - const target = element || document.body; - return window.MathJax.typesetPromise([target]); - } - return Promise.resolve(); - }; - - // 启动初始化 - init(); -})(); diff --git a/src/DjangoBlog/blog/static/blog/js/navigation.js b/src/DjangoBlog/blog/static/blog/js/navigation.js deleted file mode 100644 index f7141bf..0000000 --- a/src/DjangoBlog/blog/static/blog/js/navigation.js +++ /dev/null @@ -1,55 +0,0 @@ -/** - * Handles toggling the navigation menu for small screens and - * accessibility for submenu items. - */ -( function() { - var nav = document.getElementById( 'site-navigation' ), button, menu; - if ( ! nav ) { - return; - } - - button = nav.getElementsByTagName( 'button' )[0]; - menu = nav.getElementsByTagName( 'ul' )[0]; - if ( ! button ) { - return; - } - - // Hide button if menu is missing or empty. - if ( ! menu || ! menu.childNodes.length ) { - button.style.display = 'none'; - return; - } - - button.onclick = function() { - if ( -1 === menu.className.indexOf( 'nav-menu' ) ) { - menu.className = 'nav-menu'; - } - - if ( -1 !== button.className.indexOf( 'toggled-on' ) ) { - button.className = button.className.replace( ' toggled-on', '' ); - menu.className = menu.className.replace( ' toggled-on', '' ); - } else { - button.className += ' toggled-on'; - menu.className += ' toggled-on'; - } - }; -} )(); - -// Better focus for hidden submenu items for accessibility. -( function( $ ) { - $( '.main-navigation' ).find( 'a' ).on( 'focus.twentytwelve blur.twentytwelve', function() { - $( this ).parents( '.menu-item, .page_item' ).toggleClass( 'focus' ); - } ); - - if ( 'ontouchstart' in window ) { - $('body').on( 'touchstart.twentytwelve', '.menu-item-has-children > a, .page_item_has_children > a', function( e ) { - var el = $( this ).parent( 'li' ); - - if ( ! el.hasClass( 'focus' ) ) { - e.preventDefault(); - el.toggleClass( 'focus' ); - el.siblings( '.focus').removeClass( 'focus' ); - } - } ); - } -} )( jQuery ); diff --git a/src/DjangoBlog/blog/static/blog/js/nprogress.js b/src/DjangoBlog/blog/static/blog/js/nprogress.js deleted file mode 100644 index d29c2aa..0000000 --- a/src/DjangoBlog/blog/static/blog/js/nprogress.js +++ /dev/null @@ -1,480 +0,0 @@ -/* NProgress, (c) 2013, 2014 Rico Sta. Cruz - http://ricostacruz.com/nprogress - * @license MIT */ - -;(function(root, factory) { - - if (typeof define === 'function' && define.amd) { - define(factory); - } else if (typeof exports === 'object') { - module.exports = factory(); - } else { - root.NProgress = factory(); - } - -})(this, function() { - var NProgress = {}; - - NProgress.version = '0.2.0'; - - var Settings = NProgress.settings = { - minimum: 0.08, - easing: 'linear', - positionUsing: '', - speed: 200, - trickle: true, - trickleSpeed: 200, - showSpinner: true, - barSelector: '[role="bar"]', - spinnerSelector: '[role="spinner"]', - parent: 'body', - template: '
' - }; - - /** - * Updates configuration. - * - * NProgress.configure({ - * minimum: 0.1 - * }); - */ - NProgress.configure = function(options) { - var key, value; - for (key in options) { - value = options[key]; - if (value !== undefined && options.hasOwnProperty(key)) Settings[key] = value; - } - - return this; - }; - - /** - * Last number. - */ - - NProgress.status = null; - - /** - * Sets the progress bar status, where `n` is a number from `0.0` to `1.0`. - * - * NProgress.set(0.4); - * NProgress.set(1.0); - */ - - NProgress.set = function(n) { - var started = NProgress.isStarted(); - - n = clamp(n, Settings.minimum, 1); - NProgress.status = (n === 1 ? null : n); - - var progress = NProgress.render(!started), - bar = progress.querySelector(Settings.barSelector), - speed = Settings.speed, - ease = Settings.easing; - - progress.offsetWidth; /* Repaint */ - - queue(function(next) { - // Set positionUsing if it hasn't already been set - if (Settings.positionUsing === '') Settings.positionUsing = NProgress.getPositioningCSS(); - - // Add transition - css(bar, barPositionCSS(n, speed, ease)); - - if (n === 1) { - // Fade out - css(progress, { - transition: 'none', - opacity: 1 - }); - progress.offsetWidth; /* Repaint */ - - setTimeout(function() { - css(progress, { - transition: 'all ' + speed + 'ms linear', - opacity: 0 - }); - setTimeout(function() { - NProgress.remove(); - next(); - }, speed); - }, speed); - } else { - setTimeout(next, speed); - } - }); - - return this; - }; - - NProgress.isStarted = function() { - return typeof NProgress.status === 'number'; - }; - - /** - * Shows the progress bar. - * This is the same as setting the status to 0%, except that it doesn't go backwards. - * - * NProgress.start(); - * - */ - NProgress.start = function() { - if (!NProgress.status) NProgress.set(0); - - var work = function() { - setTimeout(function() { - if (!NProgress.status) return; - NProgress.trickle(); - work(); - }, Settings.trickleSpeed); - }; - - if (Settings.trickle) work(); - - return this; - }; - - /** - * Hides the progress bar. - * This is the *sort of* the same as setting the status to 100%, with the - * difference being `done()` makes some placebo effect of some realistic motion. - * - * NProgress.done(); - * - * If `true` is passed, it will show the progress bar even if its hidden. - * - * NProgress.done(true); - */ - - NProgress.done = function(force) { - if (!force && !NProgress.status) return this; - - return NProgress.inc(0.3 + 0.5 * Math.random()).set(1); - }; - - /** - * Increments by a random amount. - */ - - NProgress.inc = function(amount) { - var n = NProgress.status; - - if (!n) { - return NProgress.start(); - } else if(n > 1) { - - } else { - if (typeof amount !== 'number') { - if (n >= 0 && n < 0.2) { amount = 0.1; } - else if (n >= 0.2 && n < 0.5) { amount = 0.04; } - else if (n >= 0.5 && n < 0.8) { amount = 0.02; } - else if (n >= 0.8 && n < 0.99) { amount = 0.005; } - else { amount = 0; } - } - - n = clamp(n + amount, 0, 0.994); - return NProgress.set(n); - } - }; - - NProgress.trickle = function() { - return NProgress.inc(); - }; - - /** - * Waits for all supplied jQuery promises and - * increases the progress as the promises resolve. - * - * @param $promise jQUery Promise - */ - (function() { - var initial = 0, current = 0; - - NProgress.promise = function($promise) { - if (!$promise || $promise.state() === "resolved") { - return this; - } - - if (current === 0) { - NProgress.start(); - } - - initial++; - current++; - - $promise.always(function() { - current--; - if (current === 0) { - initial = 0; - NProgress.done(); - } else { - NProgress.set((initial - current) / initial); - } - }); - - return this; - }; - - })(); - - /** - * (Internal) renders the progress bar markup based on the `template` - * setting. - */ - - NProgress.render = function(fromStart) { - if (NProgress.isRendered()) return document.getElementById('nprogress'); - - addClass(document.documentElement, 'nprogress-busy'); - - var progress = document.createElement('div'); - progress.id = 'nprogress'; - progress.innerHTML = Settings.template; - - var bar = progress.querySelector(Settings.barSelector), - perc = fromStart ? '-100' : toBarPerc(NProgress.status || 0), - parent = document.querySelector(Settings.parent), - spinner; - - css(bar, { - transition: 'all 0 linear', - transform: 'translate3d(' + perc + '%,0,0)' - }); - - if (!Settings.showSpinner) { - spinner = progress.querySelector(Settings.spinnerSelector); - spinner && removeElement(spinner); - } - - if (parent != document.body) { - addClass(parent, 'nprogress-custom-parent'); - } - - parent.appendChild(progress); - return progress; - }; - - /** - * Removes the element. Opposite of render(). - */ - - NProgress.remove = function() { - removeClass(document.documentElement, 'nprogress-busy'); - removeClass(document.querySelector(Settings.parent), 'nprogress-custom-parent'); - var progress = document.getElementById('nprogress'); - progress && removeElement(progress); - }; - - /** - * Checks if the progress bar is rendered. - */ - - NProgress.isRendered = function() { - return !!document.getElementById('nprogress'); - }; - - /** - * Determine which positioning CSS rule to use. - */ - - NProgress.getPositioningCSS = function() { - // Sniff on document.body.style - var bodyStyle = document.body.style; - - // Sniff prefixes - var vendorPrefix = ('WebkitTransform' in bodyStyle) ? 'Webkit' : - ('MozTransform' in bodyStyle) ? 'Moz' : - ('msTransform' in bodyStyle) ? 'ms' : - ('OTransform' in bodyStyle) ? 'O' : ''; - - if (vendorPrefix + 'Perspective' in bodyStyle) { - // Modern browsers with 3D support, e.g. Webkit, IE10 - return 'translate3d'; - } else if (vendorPrefix + 'Transform' in bodyStyle) { - // Browsers without 3D support, e.g. IE9 - return 'translate'; - } else { - // Browsers without translate() support, e.g. IE7-8 - return 'margin'; - } - }; - - /** - * Helpers - */ - - function clamp(n, min, max) { - if (n < min) return min; - if (n > max) return max; - return n; - } - - /** - * (Internal) converts a percentage (`0..1`) to a bar translateX - * percentage (`-100%..0%`). - */ - - function toBarPerc(n) { - return (-1 + n) * 100; - } - - - /** - * (Internal) returns the correct CSS for changing the bar's - * position given an n percentage, and speed and ease from Settings - */ - - function barPositionCSS(n, speed, ease) { - var barCSS; - - if (Settings.positionUsing === 'translate3d') { - barCSS = { transform: 'translate3d('+toBarPerc(n)+'%,0,0)' }; - } else if (Settings.positionUsing === 'translate') { - barCSS = { transform: 'translate('+toBarPerc(n)+'%,0)' }; - } else { - barCSS = { 'margin-left': toBarPerc(n)+'%' }; - } - - barCSS.transition = 'all '+speed+'ms '+ease; - - return barCSS; - } - - /** - * (Internal) Queues a function to be executed. - */ - - var queue = (function() { - var pending = []; - - function next() { - var fn = pending.shift(); - if (fn) { - fn(next); - } - } - - return function(fn) { - pending.push(fn); - if (pending.length == 1) next(); - }; - })(); - - /** - * (Internal) Applies css properties to an element, similar to the jQuery - * css method. - * - * While this helper does assist with vendor prefixed property names, it - * does not perform any manipulation of values prior to setting styles. - */ - - var css = (function() { - var cssPrefixes = [ 'Webkit', 'O', 'Moz', 'ms' ], - cssProps = {}; - - function camelCase(string) { - return string.replace(/^-ms-/, 'ms-').replace(/-([\da-z])/gi, function(match, letter) { - return letter.toUpperCase(); - }); - } - - function getVendorProp(name) { - var style = document.body.style; - if (name in style) return name; - - var i = cssPrefixes.length, - capName = name.charAt(0).toUpperCase() + name.slice(1), - vendorName; - while (i--) { - vendorName = cssPrefixes[i] + capName; - if (vendorName in style) return vendorName; - } - - return name; - } - - function getStyleProp(name) { - name = camelCase(name); - return cssProps[name] || (cssProps[name] = getVendorProp(name)); - } - - function applyCss(element, prop, value) { - prop = getStyleProp(prop); - element.style[prop] = value; - } - - return function(element, properties) { - var args = arguments, - prop, - value; - - if (args.length == 2) { - for (prop in properties) { - value = properties[prop]; - if (value !== undefined && properties.hasOwnProperty(prop)) applyCss(element, prop, value); - } - } else { - applyCss(element, args[1], args[2]); - } - } - })(); - - /** - * (Internal) Determines if an element or space separated list of class names contains a class name. - */ - - function hasClass(element, name) { - var list = typeof element == 'string' ? element : classList(element); - return list.indexOf(' ' + name + ' ') >= 0; - } - - /** - * (Internal) Adds a class to an element. - */ - - function addClass(element, name) { - var oldList = classList(element), - newList = oldList + name; - - if (hasClass(oldList, name)) return; - - // Trim the opening space. - element.className = newList.substring(1); - } - - /** - * (Internal) Removes a class from an element. - */ - - function removeClass(element, name) { - var oldList = classList(element), - newList; - - if (!hasClass(element, name)) return; - - // Replace the class name. - newList = oldList.replace(' ' + name + ' ', ' '); - - // Trim the opening and closing spaces. - element.className = newList.substring(1, newList.length - 1); - } - - /** - * (Internal) Gets a space separated list of the class names on the element. - * The list is wrapped with a single space on each end to facilitate finding - * matches within the list. - */ - - function classList(element) { - return (' ' + (element && element.className || '') + ' ').replace(/\s+/gi, ' '); - } - - /** - * (Internal) Removes an element from the DOM. - */ - - function removeElement(element) { - element && element.parentNode && element.parentNode.removeChild(element); - } - - return NProgress; -}); diff --git a/src/DjangoBlog/blog/static/pygments/default.css b/src/DjangoBlog/blog/static/pygments/default.css deleted file mode 100755 index 73e6e49..0000000 --- a/src/DjangoBlog/blog/static/pygments/default.css +++ /dev/null @@ -1,293 +0,0 @@ -.codehilite .hll { - background-color: #ffffcc -} - -.codehilite { - background: #ffffff; -} - -.codehilite .c { - color: #177500 -} - -/* Comment */ -.codehilite .err { - color: #000000 -} - -/* Error */ -.codehilite .k { - color: #A90D91 -} - -/* Keyword */ -.codehilite .l { - color: #1C01CE -} - -/* Literal */ -.codehilite .n { - color: #000000 -} - -/* Name */ -.codehilite .o { - color: #000000 -} - -/* Operator */ -.codehilite .ch { - color: #177500 -} - -/* Comment.Hashbang */ -.codehilite .cm { - color: #177500 -} - -/* Comment.Multiline */ -.codehilite .cp { - color: #633820 -} - -/* Comment.Preproc */ -.codehilite .cpf { - color: #177500 -} - -/* Comment.PreprocFile */ -.codehilite .c1 { - color: #177500 -} - -/* Comment.Single */ -.codehilite .cs { - color: #177500 -} - -/* Comment.Special */ -.codehilite .kc { - color: #A90D91 -} - -/* Keyword.Constant */ -.codehilite .kd { - color: #A90D91 -} - -/* Keyword.Declaration */ -.codehilite .kn { - color: #A90D91 -} - -/* Keyword.Namespace */ -.codehilite .kp { - color: #A90D91 -} - -/* Keyword.Pseudo */ -.codehilite .kr { - color: #A90D91 -} - -/* Keyword.Reserved */ -.codehilite .kt { - color: #A90D91 -} - -/* Keyword.Type */ -.codehilite .ld { - color: #1C01CE -} - -/* Literal.Date */ -.codehilite .m { - color: #1C01CE -} - -/* Literal.Number */ -.codehilite .s { - color: #C41A16 -} - -/* Literal.String */ -.codehilite .na { - color: #836C28 -} - -/* Name.Attribute */ -.codehilite .nb { - color: #A90D91 -} - -/* Name.Builtin */ -.codehilite .nc { - color: #3F6E75 -} - -/* Name.Class */ -.codehilite .no { - color: #000000 -} - -/* Name.Constant */ -.codehilite .nd { - color: #000000 -} - -/* Name.Decorator */ -.codehilite .ni { - color: #000000 -} - -/* Name.Entity */ -.codehilite .ne { - color: #000000 -} - -/* Name.Exception */ -.codehilite .nf { - color: #000000 -} - -/* Name.Function */ -.codehilite .nl { - color: #000000 -} - -/* Name.Label */ -.codehilite .nn { - color: #000000 -} - -/* Name.Namespace */ -.codehilite .nx { - color: #000000 -} - -/* Name.Other */ -.codehilite .py { - color: #000000 -} - -/* Name.Property */ -.codehilite .nt { - color: #000000 -} - -/* Name.Tag */ -.codehilite .nv { - color: #000000 -} - -/* Name.Variable */ -.codehilite .ow { - color: #000000 -} - -/* Operator.Word */ -.codehilite .mb { - color: #1C01CE -} - -/* Literal.Number.Bin */ -.codehilite .mf { - color: #1C01CE -} - -/* Literal.Number.Float */ -.codehilite .mh { - color: #1C01CE -} - -/* Literal.Number.Hex */ -.codehilite .mi { - color: #1C01CE -} - -/* Literal.Number.Integer */ -.codehilite .mo { - color: #1C01CE -} - -/* Literal.Number.Oct */ -.codehilite .sb { - color: #C41A16 -} - -/* Literal.String.Backtick */ -.codehilite .sc { - color: #2300CE -} - -/* Literal.String.Char */ -.codehilite .sd { - color: #C41A16 -} - -/* Literal.String.Doc */ -.codehilite .s2 { - color: #C41A16 -} - -/* Literal.String.Double */ -.codehilite .se { - color: #C41A16 -} - -/* Literal.String.Escape */ -.codehilite .sh { - color: #C41A16 -} - -/* Literal.String.Heredoc */ -.codehilite .si { - color: #C41A16 -} - -/* Literal.String.Interpol */ -.codehilite .sx { - color: #C41A16 -} - -/* Literal.String.Other */ -.codehilite .sr { - color: #C41A16 -} - -/* Literal.String.Regex */ -.codehilite .s1 { - color: #C41A16 -} - -/* Literal.String.Single */ -.codehilite .ss { - color: #C41A16 -} - -/* Literal.String.Symbol */ -.codehilite .bp { - color: #5B269A -} - -/* Name.Builtin.Pseudo */ -.codehilite .vc { - color: #000000 -} - -/* Name.Variable.Class */ -.codehilite .vg { - color: #000000 -} - -/* Name.Variable.Global */ -.codehilite .vi { - color: #000000 -} - -/* Name.Variable.Instance */ -.codehilite .il { - color: #1C01CE -} - -/* Literal.Number.Integer.Long */ \ No newline at end of file diff --git a/src/DjangoBlog/blog/templatetags/__init__.py b/src/DjangoBlog/blog/templatetags/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/src/DjangoBlog/blog/templatetags/blog_tags.py b/src/DjangoBlog/blog/templatetags/blog_tags.py deleted file mode 100644 index 024f2c8..0000000 --- a/src/DjangoBlog/blog/templatetags/blog_tags.py +++ /dev/null @@ -1,554 +0,0 @@ -import hashlib -import logging -import random -import urllib - -from django import template -from django.conf import settings -from django.db.models import Q -from django.shortcuts import get_object_or_404 -from django.template.defaultfilters import stringfilter -from django.templatetags.static import static -from django.urls import reverse -from django.utils.safestring import mark_safe - -from blog.models import Article, Category, Tag, Links, SideBar, LinkShowType -from comments.models import Comment -from djangoblog.utils import CommonMarkdown, sanitize_html -from djangoblog.utils import cache -from djangoblog.utils import get_current_site -from oauth.models import OAuthUser -from djangoblog.plugin_manage import hooks - -logger = logging.getLogger(__name__) - -register = template.Library() - - -@register.simple_tag(takes_context=True) -def head_meta(context): - return mark_safe(hooks.apply_filters('head_meta', '', context)) - - -@register.simple_tag -def timeformat(data): - try: - return data.strftime(settings.TIME_FORMAT) - except Exception as e: - logger.error(e) - return "" - - -@register.simple_tag -def datetimeformat(data): - try: - return data.strftime(settings.DATE_TIME_FORMAT) - except Exception as e: - logger.error(e) - return "" - - -@register.filter() -@stringfilter -def custom_markdown(content): - """ - 通用markdown过滤器,应用文章内容插件 - 主要用于文章内容处理 - """ - html_content = CommonMarkdown.get_markdown(content) - - # 然后应用插件过滤器优化HTML - from djangoblog.plugin_manage import hooks - from djangoblog.plugin_manage.hook_constants import ARTICLE_CONTENT_HOOK_NAME - optimized_html = hooks.apply_filters(ARTICLE_CONTENT_HOOK_NAME, html_content) - - return mark_safe(optimized_html) - - -@register.filter() -@stringfilter -def sidebar_markdown(content): - html_content = CommonMarkdown.get_markdown(content) - return mark_safe(html_content) - - -@register.simple_tag(takes_context=True) -def render_article_content(context, article, is_summary=False): - """ - 渲染文章内容,包含完整的上下文信息供插件使用 - - Args: - context: 模板上下文 - article: 文章对象 - is_summary: 是否为摘要模式(首页使用) - """ - if not article or not hasattr(article, 'body'): - return '' - - # 先转换Markdown为HTML - html_content = CommonMarkdown.get_markdown(article.body) - - # 如果是摘要模式,先截断内容再应用插件 - if is_summary: - # 截断HTML内容到合适的长度(约300字符) - from django.utils.html import strip_tags - from django.template.defaultfilters import truncatechars - - # 先去除HTML标签,截断纯文本,然后重新转换为HTML - plain_text = strip_tags(html_content) - truncated_text = truncatechars(plain_text, 300) - - # 重新转换截断后的文本为HTML(简化版,避免复杂的插件处理) - html_content = CommonMarkdown.get_markdown(truncated_text) - - # 然后应用插件过滤器,传递完整的上下文 - from djangoblog.plugin_manage import hooks - from djangoblog.plugin_manage.hook_constants import ARTICLE_CONTENT_HOOK_NAME - - # 获取request对象 - request = context.get('request') - - # 应用所有文章内容相关的插件 - # 注意:摘要模式下某些插件(如版权声明)可能不适用 - optimized_html = hooks.apply_filters( - ARTICLE_CONTENT_HOOK_NAME, - html_content, - article=article, - request=request, - context=context, - is_summary=is_summary # 传递摘要标志,插件可以据此调整行为 - ) - - return mark_safe(optimized_html) - - -@register.simple_tag -def get_markdown_toc(content): - from djangoblog.utils import CommonMarkdown - body, toc = CommonMarkdown.get_markdown_with_toc(content) - return mark_safe(toc) - - -@register.filter() -@stringfilter -def comment_markdown(content): - content = CommonMarkdown.get_markdown(content) - return mark_safe(sanitize_html(content)) - - -@register.filter(is_safe=True) -@stringfilter -def truncatechars_content(content): - """ - 获得文章内容的摘要 - :param content: - :return: - """ - from django.template.defaultfilters import truncatechars_html - from djangoblog.utils import get_blog_setting - blogsetting = get_blog_setting() - return truncatechars_html(content, blogsetting.article_sub_length) - - -@register.filter(is_safe=True) -@stringfilter -def truncate(content): - from django.utils.html import strip_tags - - return strip_tags(content)[:150] - - -@register.inclusion_tag('blog/tags/breadcrumb.html') -def load_breadcrumb(article): - """ - 获得文章面包屑 - :param article: - :return: - """ - names = article.get_category_tree() - from djangoblog.utils import get_blog_setting - blogsetting = get_blog_setting() - site = get_current_site().domain - names.append((blogsetting.site_name, '/')) - names = names[::-1] - - return { - 'names': names, - 'title': article.title, - 'count': len(names) + 1 - } - - -@register.inclusion_tag('blog/tags/article_tag_list.html') -def load_articletags(article): - """ - 文章标签 - :param article: - :return: - """ - tags = article.tags.all() - tags_list = [] - for tag in tags: - url = tag.get_absolute_url() - count = tag.get_article_count() - tags_list.append(( - url, count, tag, random.choice(settings.BOOTSTRAP_COLOR_TYPES) - )) - return { - 'article_tags_list': tags_list - } - - -@register.inclusion_tag('blog/tags/sidebar.html') -def load_sidebar(user, linktype): - """ - 加载侧边栏 - :return: - """ - value = cache.get("sidebar" + linktype) - if value: - value['user'] = user - return value - else: - logger.info('load sidebar') - from djangoblog.utils import get_blog_setting - blogsetting = get_blog_setting() - recent_articles = Article.objects.filter( - status='p')[:blogsetting.sidebar_article_count] - sidebar_categorys = Category.objects.all() - extra_sidebars = SideBar.objects.filter( - is_enable=True).order_by('sequence') - most_read_articles = Article.objects.filter(status='p').order_by( - '-views')[:blogsetting.sidebar_article_count] - dates = Article.objects.datetimes('creation_time', 'month', order='DESC') - links = Links.objects.filter(is_enable=True).filter( - Q(show_type=str(linktype)) | Q(show_type=LinkShowType.A)) - commment_list = Comment.objects.filter(is_enable=True).order_by( - '-id')[:blogsetting.sidebar_comment_count] - # 标签云 计算字体大小 - # 根据总数计算出平均值 大小为 (数目/平均值)*步长 - increment = 5 - tags = Tag.objects.all() - sidebar_tags = None - if tags and len(tags) > 0: - s = [t for t in [(t, t.get_article_count()) for t in tags] if t[1]] - count = sum([t[1] for t in s]) - dd = 1 if (count == 0 or not len(tags)) else count / len(tags) - import random - sidebar_tags = list( - map(lambda x: (x[0], x[1], (x[1] / dd) * increment + 10), s)) - random.shuffle(sidebar_tags) - - value = { - 'recent_articles': recent_articles, - 'sidebar_categorys': sidebar_categorys, - 'most_read_articles': most_read_articles, - 'article_dates': dates, - 'sidebar_comments': commment_list, - 'sidabar_links': links, - 'show_google_adsense': blogsetting.show_google_adsense, - 'google_adsense_codes': blogsetting.google_adsense_codes, - 'open_site_comment': blogsetting.open_site_comment, - 'show_gongan_code': blogsetting.show_gongan_code, - 'sidebar_tags': sidebar_tags, - 'extra_sidebars': extra_sidebars - } - cache.set("sidebar" + linktype, value, 60 * 60 * 60 * 3) - logger.info('set sidebar cache.key:{key}'.format(key="sidebar" + linktype)) - value['user'] = user - return value - - -@register.inclusion_tag('blog/tags/article_meta_info.html') -def load_article_metas(article, user): - """ - 获得文章meta信息 - :param article: - :return: - """ - return { - 'article': article, - 'user': user - } - - -@register.inclusion_tag('blog/tags/article_pagination.html') -def load_pagination_info(page_obj, page_type, tag_name): - previous_url = '' - next_url = '' - if page_type == '': - if page_obj.has_next(): - next_number = page_obj.next_page_number() - next_url = reverse('blog:index_page', kwargs={'page': next_number}) - if page_obj.has_previous(): - previous_number = page_obj.previous_page_number() - previous_url = reverse( - 'blog:index_page', kwargs={ - 'page': previous_number}) - if page_type == '分类标签归档': - tag = get_object_or_404(Tag, name=tag_name) - if page_obj.has_next(): - next_number = page_obj.next_page_number() - next_url = reverse( - 'blog:tag_detail_page', - kwargs={ - 'page': next_number, - 'tag_name': tag.slug}) - if page_obj.has_previous(): - previous_number = page_obj.previous_page_number() - previous_url = reverse( - 'blog:tag_detail_page', - kwargs={ - 'page': previous_number, - 'tag_name': tag.slug}) - if page_type == '作者文章归档': - if page_obj.has_next(): - next_number = page_obj.next_page_number() - next_url = reverse( - 'blog:author_detail_page', - kwargs={ - 'page': next_number, - 'author_name': tag_name}) - if page_obj.has_previous(): - previous_number = page_obj.previous_page_number() - previous_url = reverse( - 'blog:author_detail_page', - kwargs={ - 'page': previous_number, - 'author_name': tag_name}) - - if page_type == '分类目录归档': - category = get_object_or_404(Category, name=tag_name) - if page_obj.has_next(): - next_number = page_obj.next_page_number() - next_url = reverse( - 'blog:category_detail_page', - kwargs={ - 'page': next_number, - 'category_name': category.slug}) - if page_obj.has_previous(): - previous_number = page_obj.previous_page_number() - previous_url = reverse( - 'blog:category_detail_page', - kwargs={ - 'page': previous_number, - 'category_name': category.slug}) - - return { - 'previous_url': previous_url, - 'next_url': next_url, - 'page_obj': page_obj - } - - -@register.inclusion_tag('blog/tags/article_info.html') -def load_article_detail(article, isindex, user): - """ - 加载文章详情 - :param article: - :param isindex:是否列表页,若是列表页只显示摘要 - :return: - """ - from djangoblog.utils import get_blog_setting - blogsetting = get_blog_setting() - - return { - 'article': article, - 'isindex': isindex, - 'user': user, - 'open_site_comment': blogsetting.open_site_comment, - } - - -# 返回用户头像URL -# 模板使用方法: {{ email|gravatar_url:150 }} -@register.filter -def gravatar_url(email, size=40): - """获得用户头像 - 优先使用OAuth头像,否则使用默认头像""" - cachekey = 'avatar/' + email - url = cache.get(cachekey) - if url: - return url - - # 检查OAuth用户是否有自定义头像 - usermodels = OAuthUser.objects.filter(email=email) - if usermodels: - # 过滤出有头像的用户 - users_with_picture = list(filter(lambda x: x.picture is not None, usermodels)) - if users_with_picture: - # 获取默认头像路径用于比较 - default_avatar_path = static('blog/img/avatar.png') - - # 优先选择非默认头像的用户,否则选择第一个 - non_default_users = [u for u in users_with_picture if u.picture != default_avatar_path and not u.picture.endswith('/avatar.png')] - selected_user = non_default_users[0] if non_default_users else users_with_picture[0] - - url = selected_user.picture - cache.set(cachekey, url, 60 * 60 * 24) # 缓存24小时 - - avatar_type = 'non-default' if non_default_users else 'default' - logger.info('Using {} OAuth avatar for {} from {}'.format(avatar_type, email, selected_user.type)) - return url - - # 使用默认头像 - url = static('blog/img/avatar.png') - cache.set(cachekey, url, 60 * 60 * 24) # 缓存24小时 - logger.info('Using default avatar for {}'.format(email)) - return url - - -@register.filter -def gravatar(email, size=40): - """获得用户头像HTML标签""" - url = gravatar_url(email, size) - return mark_safe( - '用户头像' % - (url, size, size)) - - -@register.simple_tag -def query(qs, **kwargs): - """ template tag which allows queryset filtering. Usage: - {% query books author=author as mybooks %} - {% for book in mybooks %} - ... - {% endfor %} - """ - return qs.filter(**kwargs) - - -@register.filter -def addstr(arg1, arg2): - """concatenate arg1 & arg2""" - return str(arg1) + str(arg2) - - -# === 插件系统模板标签 === - -@register.simple_tag(takes_context=True) -def render_plugin_widgets(context, position, **kwargs): - """ - 渲染指定位置的所有插件组件 - - Args: - context: 模板上下文 - position: 位置标识 - **kwargs: 传递给插件的额外参数 - - Returns: - 按优先级排序的所有插件HTML内容 - """ - from djangoblog.plugin_manage.loader import get_loaded_plugins - - widgets = [] - - for plugin in get_loaded_plugins(): - try: - widget_data = plugin.render_position_widget( - position=position, - context=context, - **kwargs - ) - if widget_data: - widgets.append(widget_data) - except Exception as e: - logger.error(f"Error rendering widget from plugin {plugin.PLUGIN_NAME}: {e}") - - # 按优先级排序(数字越小优先级越高) - widgets.sort(key=lambda x: x['priority']) - - # 合并HTML内容 - html_parts = [widget['html'] for widget in widgets] - return mark_safe(''.join(html_parts)) - - -@register.simple_tag(takes_context=True) -def plugin_head_resources(context): - """渲染所有插件的head资源(仅自定义HTML,CSS已集成到压缩系统)""" - from djangoblog.plugin_manage.loader import get_loaded_plugins - - resources = [] - - for plugin in get_loaded_plugins(): - try: - # 只处理自定义head HTML(CSS文件已通过压缩系统处理) - head_html = plugin.get_head_html(context) - if head_html: - resources.append(head_html) - - except Exception as e: - logger.error(f"Error loading head resources from plugin {plugin.PLUGIN_NAME}: {e}") - - return mark_safe('\n'.join(resources)) - - -@register.simple_tag(takes_context=True) -def plugin_body_resources(context): - """渲染所有插件的body资源(仅自定义HTML,JS已集成到压缩系统)""" - from djangoblog.plugin_manage.loader import get_loaded_plugins - - resources = [] - - for plugin in get_loaded_plugins(): - try: - # 只处理自定义body HTML(JS文件已通过压缩系统处理) - body_html = plugin.get_body_html(context) - if body_html: - resources.append(body_html) - - except Exception as e: - logger.error(f"Error loading body resources from plugin {plugin.PLUGIN_NAME}: {e}") - - return mark_safe('\n'.join(resources)) - - -@register.inclusion_tag('plugins/css_includes.html') -def plugin_compressed_css(): - """插件CSS压缩包含模板""" - from djangoblog.plugin_manage.loader import get_loaded_plugins - - css_files = [] - for plugin in get_loaded_plugins(): - for css_file in plugin.get_css_files(): - css_url = plugin.get_static_url(css_file) - css_files.append(css_url) - - return {'css_files': css_files} - - -@register.inclusion_tag('plugins/js_includes.html') -def plugin_compressed_js(): - """插件JS压缩包含模板""" - from djangoblog.plugin_manage.loader import get_loaded_plugins - - js_files = [] - for plugin in get_loaded_plugins(): - for js_file in plugin.get_js_files(): - js_url = plugin.get_static_url(js_file) - js_files.append(js_url) - - return {'js_files': js_files} - - - - -@register.simple_tag(takes_context=True) -def plugin_widget(context, plugin_name, widget_type='default', **kwargs): - """ - 渲染指定插件的组件 - - 使用方式: - {% plugin_widget 'article_recommendation' 'bottom' article=article count=5 %} - """ - from djangoblog.plugin_manage.loader import get_plugin_by_slug - - plugin = get_plugin_by_slug(plugin_name) - if plugin and hasattr(plugin, 'render_template'): - try: - widget_context = {**context.flatten(), **kwargs} - template_name = f"{widget_type}.html" - return mark_safe(plugin.render_template(template_name, widget_context)) - except Exception as e: - logger.error(f"Error rendering plugin widget {plugin_name}.{widget_type}: {e}") - - return "" \ No newline at end of file diff --git a/src/DjangoBlog/blog/tests.py b/src/DjangoBlog/blog/tests.py deleted file mode 100644 index ee13505..0000000 --- a/src/DjangoBlog/blog/tests.py +++ /dev/null @@ -1,232 +0,0 @@ -import os - -from django.conf import settings -from django.core.files.uploadedfile import SimpleUploadedFile -from django.core.management import call_command -from django.core.paginator import Paginator -from django.templatetags.static import static -from django.test import Client, RequestFactory, TestCase -from django.urls import reverse -from django.utils import timezone - -from accounts.models import BlogUser -from blog.forms import BlogSearchForm -from blog.models import Article, Category, Tag, SideBar, Links -from blog.templatetags.blog_tags import load_pagination_info, load_articletags -from djangoblog.utils import get_current_site, get_sha256 -from oauth.models import OAuthUser, OAuthConfig - - -# Create your tests here. - -class ArticleTest(TestCase): - def setUp(self): - self.client = Client() - self.factory = RequestFactory() - - def test_validate_article(self): - site = get_current_site().domain - user = BlogUser.objects.get_or_create( - email="liangliangyy@gmail.com", - username="liangliangyy")[0] - user.set_password("liangliangyy") - user.is_staff = True - user.is_superuser = True - user.save() - response = self.client.get(user.get_absolute_url()) - self.assertEqual(response.status_code, 200) - response = self.client.get('/admin/servermanager/emailsendlog/') - response = self.client.get('admin/admin/logentry/') - s = SideBar() - s.sequence = 1 - s.name = 'test' - s.content = 'test content' - s.is_enable = True - s.save() - - category = Category() - category.name = "category" - category.creation_time = timezone.now() - category.last_mod_time = timezone.now() - category.save() - - tag = Tag() - tag.name = "nicetag" - tag.save() - - article = Article() - article.title = "nicetitle" - article.body = "nicecontent" - article.author = user - article.category = category - article.type = 'a' - article.status = 'p' - - article.save() - self.assertEqual(0, article.tags.count()) - article.tags.add(tag) - article.save() - self.assertEqual(1, article.tags.count()) - - for i in range(20): - article = Article() - article.title = "nicetitle" + str(i) - article.body = "nicetitle" + str(i) - article.author = user - article.category = category - article.type = 'a' - article.status = 'p' - article.save() - article.tags.add(tag) - article.save() - from blog.documents import ELASTICSEARCH_ENABLED - if ELASTICSEARCH_ENABLED: - call_command("build_index") - response = self.client.get('/search', {'q': 'nicetitle'}) - self.assertEqual(response.status_code, 200) - - response = self.client.get(article.get_absolute_url()) - self.assertEqual(response.status_code, 200) - from djangoblog.spider_notify import SpiderNotify - SpiderNotify.notify(article.get_absolute_url()) - response = self.client.get(tag.get_absolute_url()) - self.assertEqual(response.status_code, 200) - - response = self.client.get(category.get_absolute_url()) - self.assertEqual(response.status_code, 200) - - response = self.client.get('/search', {'q': 'django'}) - self.assertEqual(response.status_code, 200) - s = load_articletags(article) - self.assertIsNotNone(s) - - self.client.login(username='liangliangyy', password='liangliangyy') - - response = self.client.get(reverse('blog:archives')) - self.assertEqual(response.status_code, 200) - - p = Paginator(Article.objects.all(), settings.PAGINATE_BY) - self.check_pagination(p, '', '') - - p = Paginator(Article.objects.filter(tags=tag), settings.PAGINATE_BY) - self.check_pagination(p, '分类标签归档', tag.slug) - - p = Paginator( - Article.objects.filter( - author__username='liangliangyy'), settings.PAGINATE_BY) - self.check_pagination(p, '作者文章归档', 'liangliangyy') - - p = Paginator(Article.objects.filter(category=category), settings.PAGINATE_BY) - self.check_pagination(p, '分类目录归档', category.slug) - - f = BlogSearchForm() - f.search() - # self.client.login(username='liangliangyy', password='liangliangyy') - from djangoblog.spider_notify import SpiderNotify - SpiderNotify.baidu_notify([article.get_full_url()]) - - from blog.templatetags.blog_tags import gravatar_url, gravatar - u = gravatar_url('liangliangyy@gmail.com') - u = gravatar('liangliangyy@gmail.com') - - link = Links( - sequence=1, - name="lylinux", - link='https://wwww.lylinux.net') - link.save() - response = self.client.get('/links.html') - self.assertEqual(response.status_code, 200) - - response = self.client.get('/feed/') - self.assertEqual(response.status_code, 200) - - response = self.client.get('/sitemap.xml') - self.assertEqual(response.status_code, 200) - - self.client.get("/admin/blog/article/1/delete/") - self.client.get('/admin/servermanager/emailsendlog/') - self.client.get('/admin/admin/logentry/') - self.client.get('/admin/admin/logentry/1/change/') - - def check_pagination(self, p, type, value): - for page in range(1, p.num_pages + 1): - s = load_pagination_info(p.page(page), type, value) - self.assertIsNotNone(s) - if s['previous_url']: - response = self.client.get(s['previous_url']) - self.assertEqual(response.status_code, 200) - if s['next_url']: - response = self.client.get(s['next_url']) - self.assertEqual(response.status_code, 200) - - def test_image(self): - import requests - rsp = requests.get( - 'https://www.python.org/static/img/python-logo.png') - imagepath = os.path.join(settings.BASE_DIR, 'python.png') - with open(imagepath, 'wb') as file: - file.write(rsp.content) - rsp = self.client.post('/upload') - self.assertEqual(rsp.status_code, 403) - sign = get_sha256(get_sha256(settings.SECRET_KEY)) - with open(imagepath, 'rb') as file: - imgfile = SimpleUploadedFile( - 'python.png', file.read(), content_type='image/jpg') - form_data = {'python.png': imgfile} - rsp = self.client.post( - '/upload?sign=' + sign, form_data, follow=True) - self.assertEqual(rsp.status_code, 200) - os.remove(imagepath) - from djangoblog.utils import save_user_avatar, send_email - send_email(['qq@qq.com'], 'testTitle', 'testContent') - save_user_avatar( - 'https://www.python.org/static/img/python-logo.png') - - def test_errorpage(self): - rsp = self.client.get('/eee') - self.assertEqual(rsp.status_code, 404) - - def test_commands(self): - user = BlogUser.objects.get_or_create( - email="liangliangyy@gmail.com", - username="liangliangyy")[0] - user.set_password("liangliangyy") - user.is_staff = True - user.is_superuser = True - user.save() - - c = OAuthConfig() - c.type = 'qq' - c.appkey = 'appkey' - c.appsecret = 'appsecret' - c.save() - - u = OAuthUser() - u.type = 'qq' - u.openid = 'openid' - u.user = user - u.picture = static("/blog/img/avatar.png") - u.metadata = ''' -{ -"figureurl": "https://qzapp.qlogo.cn/qzapp/101513904/C740E30B4113EAA80E0D9918ABC78E82/30" -}''' - u.save() - - u = OAuthUser() - u.type = 'qq' - u.openid = 'openid1' - u.picture = 'https://qzapp.qlogo.cn/qzapp/101513904/C740E30B4113EAA80E0D9918ABC78E82/30' - u.metadata = ''' - { - "figureurl": "https://qzapp.qlogo.cn/qzapp/101513904/C740E30B4113EAA80E0D9918ABC78E82/30" - }''' - u.save() - - from blog.documents import ELASTICSEARCH_ENABLED - if ELASTICSEARCH_ENABLED: - call_command("build_index") - call_command("ping_baidu", "all") - call_command("create_testdata") - call_command("clear_cache") - call_command("sync_user_avatar") - call_command("build_search_words") diff --git a/src/DjangoBlog/blog/urls.py b/src/DjangoBlog/blog/urls.py deleted file mode 100644 index adf2703..0000000 --- a/src/DjangoBlog/blog/urls.py +++ /dev/null @@ -1,62 +0,0 @@ -from django.urls import path -from django.views.decorators.cache import cache_page - -from . import views - -app_name = "blog" -urlpatterns = [ - path( - r'', - views.IndexView.as_view(), - name='index'), - path( - r'page//', - views.IndexView.as_view(), - name='index_page'), - path( - r'article////.html', - views.ArticleDetailView.as_view(), - name='detailbyid'), - path( - r'category/.html', - views.CategoryDetailView.as_view(), - name='category_detail'), - path( - r'category//.html', - views.CategoryDetailView.as_view(), - name='category_detail_page'), - path( - r'author/.html', - views.AuthorDetailView.as_view(), - name='author_detail'), - path( - r'author//.html', - views.AuthorDetailView.as_view(), - name='author_detail_page'), - path( - r'tag/.html', - views.TagDetailView.as_view(), - name='tag_detail'), - path( - r'tag//.html', - views.TagDetailView.as_view(), - name='tag_detail_page'), - path( - 'archives.html', - cache_page( - 60 * 60)( - views.ArchivesView.as_view()), - name='archives'), - path( - 'links.html', - views.LinkListView.as_view(), - name='links'), - path( - r'upload', - views.fileupload, - name='upload'), - path( - r'clean', - views.clean_cache_view, - name='clean'), -] diff --git a/src/DjangoBlog/blog/views.py b/src/DjangoBlog/blog/views.py deleted file mode 100644 index 773bb75..0000000 --- a/src/DjangoBlog/blog/views.py +++ /dev/null @@ -1,380 +0,0 @@ -import logging -import os -import uuid - -from django.conf import settings -from django.core.paginator import Paginator -from django.http import HttpResponse, HttpResponseForbidden -from django.shortcuts import get_object_or_404 -from django.shortcuts import render -from django.templatetags.static import static -from django.utils import timezone -from django.utils.translation import gettext_lazy as _ -from django.views.decorators.csrf import csrf_exempt -from django.views.generic.detail import DetailView -from django.views.generic.list import ListView -from haystack.views import SearchView - -from blog.models import Article, Category, LinkShowType, Links, Tag -from comments.forms import CommentForm -from djangoblog.plugin_manage import hooks -from djangoblog.plugin_manage.hook_constants import ARTICLE_CONTENT_HOOK_NAME -from djangoblog.utils import cache, get_blog_setting, get_sha256 - -logger = logging.getLogger(__name__) - - -class ArticleListView(ListView): - # template_name属性用于指定使用哪个模板进行渲染 - template_name = 'blog/article_index.html' - - # context_object_name属性用于给上下文变量取名(在模板中使用该名字) - context_object_name = 'article_list' - - # 页面类型,分类目录或标签列表等 - page_type = '' - paginate_by = settings.PAGINATE_BY - page_kwarg = 'page' - link_type = LinkShowType.L - - def get_view_cache_key(self): - return self.request.get['pages'] - - @property - def page_number(self): - page_kwarg = self.page_kwarg - page = self.kwargs.get( - page_kwarg) or self.request.GET.get(page_kwarg) or 1 - return page - - def get_queryset_cache_key(self): - """ - 子类重写.获得queryset的缓存key - """ - raise NotImplementedError() - - def get_queryset_data(self): - """ - 子类重写.获取queryset的数据 - """ - raise NotImplementedError() - - def get_queryset_from_cache(self, cache_key): - ''' - 缓存页面数据 - :param cache_key: 缓存key - :return: - ''' - value = cache.get(cache_key) - if value: - logger.info('get view cache.key:{key}'.format(key=cache_key)) - return value - else: - article_list = self.get_queryset_data() - cache.set(cache_key, article_list) - logger.info('set view cache.key:{key}'.format(key=cache_key)) - return article_list - - def get_queryset(self): - ''' - 重写默认,从缓存获取数据 - :return: - ''' - key = self.get_queryset_cache_key() - value = self.get_queryset_from_cache(key) - return value - - def get_context_data(self, **kwargs): - kwargs['linktype'] = self.link_type - return super(ArticleListView, self).get_context_data(**kwargs) - - -class IndexView(ArticleListView): - ''' - 首页 - ''' - # 友情链接类型 - link_type = LinkShowType.I - - def get_queryset_data(self): - article_list = Article.objects.filter(type='a', status='p') - return article_list - - def get_queryset_cache_key(self): - cache_key = 'index_{page}'.format(page=self.page_number) - return cache_key - - -class ArticleDetailView(DetailView): - ''' - 文章详情页面 - ''' - template_name = 'blog/article_detail.html' - model = Article - pk_url_kwarg = 'article_id' - context_object_name = "article" - - def get_context_data(self, **kwargs): - comment_form = CommentForm() - - article_comments = self.object.comment_list() - parent_comments = article_comments.filter(parent_comment=None) - blog_setting = get_blog_setting() - paginator = Paginator(parent_comments, blog_setting.article_comment_count) - page = self.request.GET.get('comment_page', '1') - if not page.isnumeric(): - page = 1 - else: - page = int(page) - if page < 1: - page = 1 - if page > paginator.num_pages: - page = paginator.num_pages - - p_comments = paginator.page(page) - next_page = p_comments.next_page_number() if p_comments.has_next() else None - prev_page = p_comments.previous_page_number() if p_comments.has_previous() else None - - if next_page: - kwargs[ - 'comment_next_page_url'] = self.object.get_absolute_url() + f'?comment_page={next_page}#commentlist-container' - if prev_page: - kwargs[ - 'comment_prev_page_url'] = self.object.get_absolute_url() + f'?comment_page={prev_page}#commentlist-container' - kwargs['form'] = comment_form - kwargs['article_comments'] = article_comments - kwargs['p_comments'] = p_comments - kwargs['comment_count'] = len( - article_comments) if article_comments else 0 - - kwargs['next_article'] = self.object.next_article - kwargs['prev_article'] = self.object.prev_article - - context = super(ArticleDetailView, self).get_context_data(**kwargs) - article = self.object - - # 触发文章详情加载钩子,让插件可以添加额外的上下文数据 - from djangoblog.plugin_manage.hook_constants import ARTICLE_DETAIL_LOAD - hooks.run_action(ARTICLE_DETAIL_LOAD, article=article, context=context, request=self.request) - - # Action Hook, 通知插件"文章详情已获取" - hooks.run_action('after_article_body_get', article=article, request=self.request) - return context - - -class CategoryDetailView(ArticleListView): - ''' - 分类目录列表 - ''' - page_type = "分类目录归档" - - def get_queryset_data(self): - slug = self.kwargs['category_name'] - category = get_object_or_404(Category, slug=slug) - - categoryname = category.name - self.categoryname = categoryname - categorynames = list( - map(lambda c: c.name, category.get_sub_categorys())) - article_list = Article.objects.filter( - category__name__in=categorynames, status='p') - return article_list - - def get_queryset_cache_key(self): - slug = self.kwargs['category_name'] - category = get_object_or_404(Category, slug=slug) - categoryname = category.name - self.categoryname = categoryname - cache_key = 'category_list_{categoryname}_{page}'.format( - categoryname=categoryname, page=self.page_number) - return cache_key - - def get_context_data(self, **kwargs): - - categoryname = self.categoryname - try: - categoryname = categoryname.split('/')[-1] - except BaseException: - pass - kwargs['page_type'] = CategoryDetailView.page_type - kwargs['tag_name'] = categoryname - return super(CategoryDetailView, self).get_context_data(**kwargs) - - -class AuthorDetailView(ArticleListView): - ''' - 作者详情页 - ''' - page_type = '作者文章归档' - - def get_queryset_cache_key(self): - from uuslug import slugify - author_name = slugify(self.kwargs['author_name']) - cache_key = 'author_{author_name}_{page}'.format( - author_name=author_name, page=self.page_number) - return cache_key - - def get_queryset_data(self): - author_name = self.kwargs['author_name'] - article_list = Article.objects.filter( - author__username=author_name, type='a', status='p') - return article_list - - def get_context_data(self, **kwargs): - author_name = self.kwargs['author_name'] - kwargs['page_type'] = AuthorDetailView.page_type - kwargs['tag_name'] = author_name - return super(AuthorDetailView, self).get_context_data(**kwargs) - - -class TagDetailView(ArticleListView): - ''' - 标签列表页面 - ''' - page_type = '分类标签归档' - - def get_queryset_data(self): - slug = self.kwargs['tag_name'] - tag = get_object_or_404(Tag, slug=slug) - tag_name = tag.name - self.name = tag_name - article_list = Article.objects.filter( - tags__name=tag_name, type='a', status='p') - return article_list - - def get_queryset_cache_key(self): - slug = self.kwargs['tag_name'] - tag = get_object_or_404(Tag, slug=slug) - tag_name = tag.name - self.name = tag_name - cache_key = 'tag_{tag_name}_{page}'.format( - tag_name=tag_name, page=self.page_number) - return cache_key - - def get_context_data(self, **kwargs): - # tag_name = self.kwargs['tag_name'] - tag_name = self.name - kwargs['page_type'] = TagDetailView.page_type - kwargs['tag_name'] = tag_name - return super(TagDetailView, self).get_context_data(**kwargs) - - -class ArchivesView(ArticleListView): - ''' - 文章归档页面 - ''' - page_type = '文章归档' - paginate_by = None - page_kwarg = None - template_name = 'blog/article_archives.html' - - def get_queryset_data(self): - return Article.objects.filter(status='p').all() - - def get_queryset_cache_key(self): - cache_key = 'archives' - return cache_key - - -class LinkListView(ListView): - model = Links - template_name = 'blog/links_list.html' - - def get_queryset(self): - return Links.objects.filter(is_enable=True) - - -class EsSearchView(SearchView): - def get_context(self): - paginator, page = self.build_page() - context = { - "query": self.query, - "form": self.form, - "page": page, - "paginator": paginator, - "suggestion": None, - } - if hasattr(self.results, "query") and self.results.query.backend.include_spelling: - context["suggestion"] = self.results.query.get_spelling_suggestion() - context.update(self.extra_context()) - - return context - - -@csrf_exempt -def fileupload(request): - """ - 该方法需自己写调用端来上传图片,该方法仅提供图床功能 - :param request: - :return: - """ - if request.method == 'POST': - sign = request.GET.get('sign', None) - if not sign: - return HttpResponseForbidden() - if not sign == get_sha256(get_sha256(settings.SECRET_KEY)): - return HttpResponseForbidden() - response = [] - for filename in request.FILES: - timestr = timezone.now().strftime('%Y/%m/%d') - imgextensions = ['jpg', 'png', 'jpeg', 'bmp'] - fname = u''.join(str(filename)) - isimage = len([i for i in imgextensions if fname.find(i) >= 0]) > 0 - base_dir = os.path.join(settings.STATICFILES, "files" if not isimage else "image", timestr) - if not os.path.exists(base_dir): - os.makedirs(base_dir) - savepath = os.path.normpath(os.path.join(base_dir, f"{uuid.uuid4().hex}{os.path.splitext(filename)[-1]}")) - if not savepath.startswith(base_dir): - return HttpResponse("only for post") - with open(savepath, 'wb+') as wfile: - for chunk in request.FILES[filename].chunks(): - wfile.write(chunk) - if isimage: - from PIL import Image - image = Image.open(savepath) - image.save(savepath, quality=20, optimize=True) - url = static(savepath) - response.append(url) - return HttpResponse(response) - - else: - return HttpResponse("only for post") - - -def page_not_found_view( - request, - exception, - template_name='blog/error_page.html'): - if exception: - logger.error(exception) - url = request.get_full_path() - return render(request, - template_name, - {'message': _('Sorry, the page you requested is not found, please click the home page to see other?'), - 'statuscode': '404'}, - status=404) - - -def server_error_view(request, template_name='blog/error_page.html'): - return render(request, - template_name, - {'message': _('Sorry, the server is busy, please click the home page to see other?'), - 'statuscode': '500'}, - status=500) - - -def permission_denied_view( - request, - exception, - template_name='blog/error_page.html'): - if exception: - logger.error(exception) - return render( - request, template_name, { - 'message': _('Sorry, you do not have permission to access this page?'), - 'statuscode': '403'}, status=403) - - -def clean_cache_view(request): - cache.clear() - return HttpResponse('ok') diff --git a/src/DjangoBlog/codecov.yml b/src/DjangoBlog/codecov.yml deleted file mode 100644 index 2298829..0000000 --- a/src/DjangoBlog/codecov.yml +++ /dev/null @@ -1,87 +0,0 @@ -codecov: - require_ci_to_pass: yes - -coverage: - precision: 2 - round: down - range: "70...100" - - status: - project: - default: - target: auto - threshold: 1% - informational: true - patch: - default: - target: auto - threshold: 1% - informational: true - -parsers: - gcov: - branch_detection: - conditional: yes - loop: yes - method: no - macro: no - -comment: - layout: "reach,diff,flags,tree" - behavior: default - require_changes: no - -ignore: - # Django 相关 - - "*/migrations/*" - - "manage.py" - - "*/settings.py" - - "*/wsgi.py" - - "*/asgi.py" - - # 测试相关 - - "*/tests/*" - - "*/test_*.py" - - "*/*test*.py" - - # 静态文件和模板 - - "*/static/*" - - "*/templates/*" - - "*/collectedstatic/*" - - # 国际化文件 - - "*/locale/*" - - "**/*.po" - - "**/*.mo" - - # 文档和部署 - - "*/docs/*" - - "*/deploy/*" - - "README*.md" - - "LICENSE" - - "Dockerfile" - - "docker-compose*.yml" - - "*.yaml" - - "*.yml" - - # 开发环境 - - "*/venv/*" - - "*/__pycache__/*" - - "*.pyc" - - ".coverage" - - "coverage.xml" - - # 日志文件 - - "*/logs/*" - - "*.log" - - # 特定文件 - - "*/whoosh_cn_backend.py" # 搜索后端 - - "*/elasticsearch_backend.py" # 搜索后端 - - "*/MemcacheStorage.py" # 缓存存储 - - "*/robot.py" # 机器人相关 - - # 配置文件 - - "codecov.yml" - - ".coveragerc" - - "requirements*.txt" diff --git a/src/DjangoBlog/comments/__init__.py b/src/DjangoBlog/comments/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/src/DjangoBlog/comments/admin.py b/src/DjangoBlog/comments/admin.py deleted file mode 100644 index dbde14f..0000000 --- a/src/DjangoBlog/comments/admin.py +++ /dev/null @@ -1,49 +0,0 @@ -from django.contrib import admin -from django.urls import reverse -from django.utils.html import format_html -from django.utils.translation import gettext_lazy as _ - - -def disable_commentstatus(modeladmin, request, queryset): - queryset.update(is_enable=False) - - -def enable_commentstatus(modeladmin, request, queryset): - queryset.update(is_enable=True) - - -disable_commentstatus.short_description = _('Disable comments') -enable_commentstatus.short_description = _('Enable comments') - - -class CommentAdmin(admin.ModelAdmin): - list_per_page = 20 - list_display = ( - 'id', - 'body', - 'link_to_userinfo', - 'link_to_article', - 'is_enable', - 'creation_time') - list_display_links = ('id', 'body', 'is_enable') - list_filter = ('is_enable',) - exclude = ('creation_time', 'last_modify_time') - actions = [disable_commentstatus, enable_commentstatus] - raw_id_fields = ('author', 'article') - search_fields = ('body',) - - def link_to_userinfo(self, obj): - info = (obj.author._meta.app_label, obj.author._meta.model_name) - link = reverse('admin:%s_%s_change' % info, args=(obj.author.id,)) - return format_html( - u'%s' % - (link, obj.author.nickname if obj.author.nickname else obj.author.email)) - - def link_to_article(self, obj): - info = (obj.article._meta.app_label, obj.article._meta.model_name) - link = reverse('admin:%s_%s_change' % info, args=(obj.article.id,)) - return format_html( - u'%s' % (link, obj.article.title)) - - link_to_userinfo.short_description = _('User') - link_to_article.short_description = _('Article') diff --git a/src/DjangoBlog/comments/apps.py b/src/DjangoBlog/comments/apps.py deleted file mode 100644 index ff01b77..0000000 --- a/src/DjangoBlog/comments/apps.py +++ /dev/null @@ -1,5 +0,0 @@ -from django.apps import AppConfig - - -class CommentsConfig(AppConfig): - name = 'comments' diff --git a/src/DjangoBlog/comments/forms.py b/src/DjangoBlog/comments/forms.py deleted file mode 100644 index e83737d..0000000 --- a/src/DjangoBlog/comments/forms.py +++ /dev/null @@ -1,13 +0,0 @@ -from django import forms -from django.forms import ModelForm - -from .models import Comment - - -class CommentForm(ModelForm): - parent_comment_id = forms.IntegerField( - widget=forms.HiddenInput, required=False) - - class Meta: - model = Comment - fields = ['body'] diff --git a/src/DjangoBlog/comments/migrations/0001_initial.py b/src/DjangoBlog/comments/migrations/0001_initial.py deleted file mode 100644 index 61d1e53..0000000 --- a/src/DjangoBlog/comments/migrations/0001_initial.py +++ /dev/null @@ -1,38 +0,0 @@ -# Generated by Django 4.1.7 on 2023-03-02 07:14 - -from django.conf import settings -from django.db import migrations, models -import django.db.models.deletion -import django.utils.timezone - - -class Migration(migrations.Migration): - - initial = True - - dependencies = [ - ('blog', '0001_initial'), - migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ] - - operations = [ - migrations.CreateModel( - name='Comment', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('body', models.TextField(max_length=300, verbose_name='正文')), - ('created_time', models.DateTimeField(default=django.utils.timezone.now, verbose_name='创建时间')), - ('last_mod_time', models.DateTimeField(default=django.utils.timezone.now, verbose_name='修改时间')), - ('is_enable', models.BooleanField(default=True, verbose_name='是否显示')), - ('article', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='blog.article', verbose_name='文章')), - ('author', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='作者')), - ('parent_comment', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='comments.comment', verbose_name='上级评论')), - ], - options={ - 'verbose_name': '评论', - 'verbose_name_plural': '评论', - 'ordering': ['-id'], - 'get_latest_by': 'id', - }, - ), - ] diff --git a/src/DjangoBlog/comments/migrations/0002_alter_comment_is_enable.py b/src/DjangoBlog/comments/migrations/0002_alter_comment_is_enable.py deleted file mode 100644 index 17c44db..0000000 --- a/src/DjangoBlog/comments/migrations/0002_alter_comment_is_enable.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 4.1.7 on 2023-04-24 13:48 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('comments', '0001_initial'), - ] - - operations = [ - migrations.AlterField( - model_name='comment', - name='is_enable', - field=models.BooleanField(default=False, verbose_name='是否显示'), - ), - ] diff --git a/src/DjangoBlog/comments/migrations/0003_alter_comment_options_remove_comment_created_time_and_more.py b/src/DjangoBlog/comments/migrations/0003_alter_comment_options_remove_comment_created_time_and_more.py deleted file mode 100644 index a1ca970..0000000 --- a/src/DjangoBlog/comments/migrations/0003_alter_comment_options_remove_comment_created_time_and_more.py +++ /dev/null @@ -1,60 +0,0 @@ -# Generated by Django 4.2.5 on 2023-09-06 13:13 - -from django.conf import settings -from django.db import migrations, models -import django.db.models.deletion -import django.utils.timezone - - -class Migration(migrations.Migration): - - dependencies = [ - migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ('blog', '0005_alter_article_options_alter_category_options_and_more'), - ('comments', '0002_alter_comment_is_enable'), - ] - - operations = [ - migrations.AlterModelOptions( - name='comment', - options={'get_latest_by': 'id', 'ordering': ['-id'], 'verbose_name': 'comment', 'verbose_name_plural': 'comment'}, - ), - migrations.RemoveField( - model_name='comment', - name='created_time', - ), - migrations.RemoveField( - model_name='comment', - name='last_mod_time', - ), - migrations.AddField( - model_name='comment', - name='creation_time', - field=models.DateTimeField(default=django.utils.timezone.now, verbose_name='creation time'), - ), - migrations.AddField( - model_name='comment', - name='last_modify_time', - field=models.DateTimeField(default=django.utils.timezone.now, verbose_name='last modify time'), - ), - migrations.AlterField( - model_name='comment', - name='article', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='blog.article', verbose_name='article'), - ), - migrations.AlterField( - model_name='comment', - name='author', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='author'), - ), - migrations.AlterField( - model_name='comment', - name='is_enable', - field=models.BooleanField(default=False, verbose_name='enable'), - ), - migrations.AlterField( - model_name='comment', - name='parent_comment', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='comments.comment', verbose_name='parent comment'), - ), - ] diff --git a/src/DjangoBlog/comments/migrations/__init__.py b/src/DjangoBlog/comments/migrations/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/src/DjangoBlog/comments/models.py b/src/DjangoBlog/comments/models.py deleted file mode 100644 index 7c3bbc8..0000000 --- a/src/DjangoBlog/comments/models.py +++ /dev/null @@ -1,39 +0,0 @@ -from django.conf import settings -from django.db import models -from django.utils.timezone import now -from django.utils.translation import gettext_lazy as _ - -from blog.models import Article - - -# Create your models here. - -class Comment(models.Model): - body = models.TextField('正文', max_length=300) - creation_time = models.DateTimeField(_('creation time'), default=now) - last_modify_time = models.DateTimeField(_('last modify time'), default=now) - author = models.ForeignKey( - settings.AUTH_USER_MODEL, - verbose_name=_('author'), - on_delete=models.CASCADE) - article = models.ForeignKey( - Article, - verbose_name=_('article'), - on_delete=models.CASCADE) - parent_comment = models.ForeignKey( - 'self', - verbose_name=_('parent comment'), - blank=True, - null=True, - on_delete=models.CASCADE) - is_enable = models.BooleanField(_('enable'), - default=False, blank=False, null=False) - - class Meta: - ordering = ['-id'] - verbose_name = _('comment') - verbose_name_plural = verbose_name - get_latest_by = 'id' - - def __str__(self): - return self.body diff --git a/src/DjangoBlog/comments/templatetags/__init__.py b/src/DjangoBlog/comments/templatetags/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/src/DjangoBlog/comments/templatetags/comments_tags.py b/src/DjangoBlog/comments/templatetags/comments_tags.py deleted file mode 100644 index fde02b4..0000000 --- a/src/DjangoBlog/comments/templatetags/comments_tags.py +++ /dev/null @@ -1,30 +0,0 @@ -from django import template - -register = template.Library() - - -@register.simple_tag -def parse_commenttree(commentlist, comment): - """获得当前评论子评论的列表 - 用法: {% parse_commenttree article_comments comment as childcomments %} - """ - datas = [] - - def parse(c): - childs = commentlist.filter(parent_comment=c, is_enable=True) - for child in childs: - datas.append(child) - parse(child) - - parse(comment) - return datas - - -@register.inclusion_tag('comments/tags/comment_item.html') -def show_comment_item(comment, ischild): - """评论""" - depth = 1 if ischild else 2 - return { - 'comment_item': comment, - 'depth': depth - } diff --git a/src/DjangoBlog/comments/tests.py b/src/DjangoBlog/comments/tests.py deleted file mode 100644 index 2a7f55f..0000000 --- a/src/DjangoBlog/comments/tests.py +++ /dev/null @@ -1,109 +0,0 @@ -from django.test import Client, RequestFactory, TransactionTestCase -from django.urls import reverse - -from accounts.models import BlogUser -from blog.models import Category, Article -from comments.models import Comment -from comments.templatetags.comments_tags import * -from djangoblog.utils import get_max_articleid_commentid - - -# Create your tests here. - -class CommentsTest(TransactionTestCase): - def setUp(self): - self.client = Client() - self.factory = RequestFactory() - from blog.models import BlogSettings - value = BlogSettings() - value.comment_need_review = True - value.save() - - self.user = BlogUser.objects.create_superuser( - email="liangliangyy1@gmail.com", - username="liangliangyy1", - password="liangliangyy1") - - def update_article_comment_status(self, article): - comments = article.comment_set.all() - for comment in comments: - comment.is_enable = True - comment.save() - - def test_validate_comment(self): - self.client.login(username='liangliangyy1', password='liangliangyy1') - - category = Category() - category.name = "categoryccc" - category.save() - - article = Article() - article.title = "nicetitleccc" - article.body = "nicecontentccc" - article.author = self.user - article.category = category - article.type = 'a' - article.status = 'p' - article.save() - - comment_url = reverse( - 'comments:postcomment', kwargs={ - 'article_id': article.id}) - - response = self.client.post(comment_url, - { - 'body': '123ffffffffff' - }) - - self.assertEqual(response.status_code, 302) - - article = Article.objects.get(pk=article.pk) - self.assertEqual(len(article.comment_list()), 0) - self.update_article_comment_status(article) - - self.assertEqual(len(article.comment_list()), 1) - - response = self.client.post(comment_url, - { - 'body': '123ffffffffff', - }) - - self.assertEqual(response.status_code, 302) - - article = Article.objects.get(pk=article.pk) - self.update_article_comment_status(article) - self.assertEqual(len(article.comment_list()), 2) - parent_comment_id = article.comment_list()[0].id - - response = self.client.post(comment_url, - { - 'body': ''' - # Title1 - - ```python - import os - ``` - - [url](https://www.lylinux.net/) - - [ddd](http://www.baidu.com) - - - ''', - 'parent_comment_id': parent_comment_id - }) - - self.assertEqual(response.status_code, 302) - self.update_article_comment_status(article) - article = Article.objects.get(pk=article.pk) - self.assertEqual(len(article.comment_list()), 3) - comment = Comment.objects.get(id=parent_comment_id) - tree = parse_commenttree(article.comment_list(), comment) - self.assertEqual(len(tree), 1) - data = show_comment_item(comment, True) - self.assertIsNotNone(data) - s = get_max_articleid_commentid() - self.assertIsNotNone(s) - - from comments.utils import send_comment_email - send_comment_email(comment) diff --git a/src/DjangoBlog/comments/urls.py b/src/DjangoBlog/comments/urls.py deleted file mode 100644 index 7df3fab..0000000 --- a/src/DjangoBlog/comments/urls.py +++ /dev/null @@ -1,11 +0,0 @@ -from django.urls import path - -from . import views - -app_name = "comments" -urlpatterns = [ - path( - 'article//postcomment', - views.CommentPostView.as_view(), - name='postcomment'), -] diff --git a/src/DjangoBlog/comments/utils.py b/src/DjangoBlog/comments/utils.py deleted file mode 100644 index f01dba7..0000000 --- a/src/DjangoBlog/comments/utils.py +++ /dev/null @@ -1,38 +0,0 @@ -import logging - -from django.utils.translation import gettext_lazy as _ - -from djangoblog.utils import get_current_site -from djangoblog.utils import send_email - -logger = logging.getLogger(__name__) - - -def send_comment_email(comment): - site = get_current_site().domain - subject = _('Thanks for your comment') - article_url = f"https://{site}{comment.article.get_absolute_url()}" - html_content = _("""

Thank you very much for your comments on this site

- You can visit %(article_title)s - to review your comments, - Thank you again! -
- If the link above cannot be opened, please copy this link to your browser. - %(article_url)s""") % {'article_url': article_url, 'article_title': comment.article.title} - tomail = comment.author.email - send_email([tomail], subject, html_content) - try: - if comment.parent_comment: - html_content = _("""Your comment on %(article_title)s
has - received a reply.
%(comment_body)s -
- go check it out! -
- If the link above cannot be opened, please copy this link to your browser. - %(article_url)s - """) % {'article_url': article_url, 'article_title': comment.article.title, - 'comment_body': comment.parent_comment.body} - tomail = comment.parent_comment.author.email - send_email([tomail], subject, html_content) - except Exception as e: - logger.error(e) diff --git a/src/DjangoBlog/comments/views.py b/src/DjangoBlog/comments/views.py deleted file mode 100644 index ad9b2b9..0000000 --- a/src/DjangoBlog/comments/views.py +++ /dev/null @@ -1,63 +0,0 @@ -# Create your views here. -from django.core.exceptions import ValidationError -from django.http import HttpResponseRedirect -from django.shortcuts import get_object_or_404 -from django.utils.decorators import method_decorator -from django.views.decorators.csrf import csrf_protect -from django.views.generic.edit import FormView - -from accounts.models import BlogUser -from blog.models import Article -from .forms import CommentForm -from .models import Comment - - -class CommentPostView(FormView): - form_class = CommentForm - template_name = 'blog/article_detail.html' - - @method_decorator(csrf_protect) - def dispatch(self, *args, **kwargs): - return super(CommentPostView, self).dispatch(*args, **kwargs) - - def get(self, request, *args, **kwargs): - article_id = self.kwargs['article_id'] - article = get_object_or_404(Article, pk=article_id) - url = article.get_absolute_url() - return HttpResponseRedirect(url + "#comments") - - def form_invalid(self, form): - article_id = self.kwargs['article_id'] - article = get_object_or_404(Article, pk=article_id) - - return self.render_to_response({ - 'form': form, - 'article': article - }) - - def form_valid(self, form): - """提交的数据验证合法后的逻辑""" - user = self.request.user - author = BlogUser.objects.get(pk=user.pk) - article_id = self.kwargs['article_id'] - article = get_object_or_404(Article, pk=article_id) - - if article.comment_status == 'c' or article.status == 'c': - raise ValidationError("该文章评论已关闭.") - comment = form.save(False) - comment.article = article - from djangoblog.utils import get_blog_setting - settings = get_blog_setting() - if not settings.comment_need_review: - comment.is_enable = True - comment.author = author - - if form.cleaned_data['parent_comment_id']: - parent_comment = Comment.objects.get( - pk=form.cleaned_data['parent_comment_id']) - comment.parent_comment = parent_comment - - comment.save(True) - return HttpResponseRedirect( - "%s#div-comment-%d" % - (article.get_absolute_url(), comment.pk)) diff --git a/src/DjangoBlog/deploy/docker-compose/docker-compose.es.yml b/src/DjangoBlog/deploy/docker-compose/docker-compose.es.yml deleted file mode 100644 index 83e35ff..0000000 --- a/src/DjangoBlog/deploy/docker-compose/docker-compose.es.yml +++ /dev/null @@ -1,48 +0,0 @@ -version: '3' - -services: - es: - image: liangliangyy/elasticsearch-analysis-ik:8.6.1 - container_name: es - restart: always - environment: - - discovery.type=single-node - - "ES_JAVA_OPTS=-Xms512m -Xmx512m" - ports: - - 9200:9200 - volumes: - - ./bin/datas/es/:/usr/share/elasticsearch/data/ - - kibana: - image: kibana:8.6.1 - restart: always - container_name: kibana - ports: - - 5601:5601 - environment: - - ELASTICSEARCH_HOSTS=http://es:9200 - - djangoblog: - build: . - restart: always - command: bash -c 'sh /code/djangoblog/bin/docker_start.sh' - ports: - - "8000:8000" - volumes: - - ./collectedstatic:/code/djangoblog/collectedstatic - - ./uploads:/code/djangoblog/uploads - environment: - - DJANGO_MYSQL_DATABASE=djangoblog - - DJANGO_MYSQL_USER=root - - DJANGO_MYSQL_PASSWORD=DjAnGoBlOg!2!Q@W#E - - DJANGO_MYSQL_HOST=db - - DJANGO_MYSQL_PORT=3306 - - DJANGO_MEMCACHED_LOCATION=memcached:11211 - - DJANGO_ELASTICSEARCH_HOST=es:9200 - links: - - db - - memcached - depends_on: - - db - container_name: djangoblog - diff --git a/src/DjangoBlog/deploy/docker-compose/docker-compose.yml b/src/DjangoBlog/deploy/docker-compose/docker-compose.yml deleted file mode 100644 index 9609af3..0000000 --- a/src/DjangoBlog/deploy/docker-compose/docker-compose.yml +++ /dev/null @@ -1,60 +0,0 @@ -version: '3' - -services: - db: - image: mysql:latest - restart: always - environment: - - MYSQL_DATABASE=djangoblog - - MYSQL_ROOT_PASSWORD=DjAnGoBlOg!2!Q@W#E - ports: - - 3306:3306 - volumes: - - ./bin/datas/mysql/:/var/lib/mysql - depends_on: - - redis - container_name: db - - djangoblog: - build: - context: ../../ - restart: always - command: bash -c 'sh /code/djangoblog/bin/docker_start.sh' - ports: - - "8000:8000" - volumes: - - ./collectedstatic:/code/djangoblog/collectedstatic - - ./logs:/code/djangoblog/logs - - ./uploads:/code/djangoblog/uploads - environment: - - DJANGO_MYSQL_DATABASE=djangoblog - - DJANGO_MYSQL_USER=root - - DJANGO_MYSQL_PASSWORD=DjAnGoBlOg!2!Q@W#E - - DJANGO_MYSQL_HOST=db - - DJANGO_MYSQL_PORT=3306 - - DJANGO_REDIS_URL=redis:6379 - links: - - db - - redis - depends_on: - - db - container_name: djangoblog - nginx: - restart: always - image: nginx:latest - ports: - - "80:80" - - "443:443" - volumes: - - ./bin/nginx.conf:/etc/nginx/nginx.conf - - ./collectedstatic:/code/djangoblog/collectedstatic - links: - - djangoblog:djangoblog - container_name: nginx - - redis: - restart: always - image: redis:latest - container_name: redis - ports: - - "6379:6379" diff --git a/src/DjangoBlog/deploy/entrypoint.sh b/src/DjangoBlog/deploy/entrypoint.sh deleted file mode 100644 index 2fb6491..0000000 --- a/src/DjangoBlog/deploy/entrypoint.sh +++ /dev/null @@ -1,31 +0,0 @@ -#!/usr/bin/env bash -NAME="djangoblog" -DJANGODIR=/code/djangoblog -USER=root -GROUP=root -NUM_WORKERS=1 -DJANGO_WSGI_MODULE=djangoblog.wsgi - - -echo "Starting $NAME as `whoami`" - -cd $DJANGODIR - -export PYTHONPATH=$DJANGODIR:$PYTHONPATH - -python manage.py makemigrations && \ - python manage.py migrate && \ - python manage.py collectstatic --noinput && \ - python manage.py compress --force && \ - python manage.py build_index && \ - python manage.py compilemessages || exit 1 - -exec gunicorn ${DJANGO_WSGI_MODULE}:application \ ---name $NAME \ ---workers $NUM_WORKERS \ ---user=$USER --group=$GROUP \ ---bind 0.0.0.0:8000 \ ---log-level=debug \ ---log-file=- \ ---worker-class gevent \ ---threads 4 diff --git a/src/DjangoBlog/deploy/k8s/configmap.yaml b/src/DjangoBlog/deploy/k8s/configmap.yaml deleted file mode 100644 index 835d4ad..0000000 --- a/src/DjangoBlog/deploy/k8s/configmap.yaml +++ /dev/null @@ -1,119 +0,0 @@ -apiVersion: v1 -kind: ConfigMap -metadata: - name: web-nginx-config - namespace: djangoblog -data: - nginx.conf: | - user nginx; - worker_processes auto; - error_log /var/log/nginx/error.log notice; - pid /var/run/nginx.pid; - - events { - worker_connections 1024; - multi_accept on; - use epoll; - } - - http { - include /etc/nginx/mime.types; - default_type application/octet-stream; - - log_format main '$remote_addr - $remote_user [$time_local] "$request" ' - '$status $body_bytes_sent "$http_referer" ' - '"$http_user_agent" "$http_x_forwarded_for"'; - - access_log /var/log/nginx/access.log main; - - sendfile on; - keepalive_timeout 65; - gzip on; - gzip_disable "msie6"; - - gzip_vary on; - gzip_proxied any; - gzip_comp_level 8; - gzip_buffers 16 8k; - gzip_http_version 1.1; - gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png; - - # Include server configurations - include /etc/nginx/conf.d/*.conf; - } - djangoblog.conf: | - server { - server_name lylinux.net; - root /code/djangoblog/collectedstatic/; - listen 80; - keepalive_timeout 70; - location /static/ { - expires max; - alias /code/djangoblog/collectedstatic/; - } - - location ~* (robots\.txt|ads\.txt|favicon\.ico|favion\.ico|crossdomain\.xml|google93fd32dbd906620a\.html|BingSiteAuth\.xml|baidu_verify_Ijeny6KrmS\.html)$ { - root /resource/djangopub; - expires 1d; - access_log off; - error_log off; - } - - location / { - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header Host $http_host; - proxy_set_header X-NginX-Proxy true; - proxy_redirect off; - if (!-f $request_filename) { - proxy_pass http://djangoblog:8000; - break; - } - } - } - server { - server_name www.lylinux.net; - listen 80; - return 301 https://lylinux.net$request_uri; - } - resource.lylinux.net.conf: | - server { - index index.html index.htm; - server_name resource.lylinux.net; - root /resource/; - - location /djangoblog/ { - alias /code/djangoblog/collectedstatic/; - } - - access_log off; - error_log off; - include lylinux/resource.conf; - } - lylinux.resource.conf: | - expires max; - access_log off; - log_not_found off; - add_header Pragma public; - add_header Cache-Control "public"; - add_header "Access-Control-Allow-Origin" "*"; - ---- -apiVersion: v1 -kind: ConfigMap -metadata: - name: djangoblog-env - namespace: djangoblog -data: - DJANGO_MYSQL_DATABASE: djangoblog - DJANGO_MYSQL_USER: db_user - DJANGO_MYSQL_PASSWORD: db_password - DJANGO_MYSQL_HOST: db_host - DJANGO_MYSQL_PORT: db_port - DJANGO_REDIS_URL: "redis:6379" - DJANGO_DEBUG: "False" - MYSQL_ROOT_PASSWORD: db_password - MYSQL_DATABASE: djangoblog - MYSQL_PASSWORD: db_password - DJANGO_SECRET_KEY: xxxxxxxxxxxxxxxxxxxxxxxxxxxxx - diff --git a/src/DjangoBlog/deploy/k8s/deployment.yaml b/src/DjangoBlog/deploy/k8s/deployment.yaml deleted file mode 100644 index b50c411..0000000 --- a/src/DjangoBlog/deploy/k8s/deployment.yaml +++ /dev/null @@ -1,274 +0,0 @@ -apiVersion: apps/v1 -kind: Deployment -metadata: - name: djangoblog - namespace: djangoblog - labels: - app: djangoblog -spec: - replicas: 3 - selector: - matchLabels: - app: djangoblog - template: - metadata: - labels: - app: djangoblog - spec: - containers: - - name: djangoblog - image: liangliangyy/djangoblog:latest - imagePullPolicy: Always - ports: - - containerPort: 8000 - envFrom: - - configMapRef: - name: djangoblog-env - readinessProbe: - httpGet: - path: /health/ - port: 8000 - initialDelaySeconds: 10 - periodSeconds: 30 - livenessProbe: - httpGet: - path: /health/ - port: 8000 - initialDelaySeconds: 10 - periodSeconds: 30 - resources: - requests: - cpu: 10m - memory: 100Mi - limits: - cpu: "2" - memory: 2Gi - volumeMounts: - - name: djangoblog - mountPath: /code/djangoblog/collectedstatic - - name: resource - mountPath: /resource - volumes: - - name: djangoblog - persistentVolumeClaim: - claimName: djangoblog-pvc - - name: resource - persistentVolumeClaim: - claimName: resource-pvc - ---- -apiVersion: apps/v1 -kind: Deployment -metadata: - name: redis - namespace: djangoblog - labels: - app: redis -spec: - replicas: 1 - selector: - matchLabels: - app: redis - template: - metadata: - labels: - app: redis - spec: - containers: - - name: redis - image: redis:latest - imagePullPolicy: IfNotPresent - ports: - - containerPort: 6379 - resources: - requests: - cpu: 10m - memory: 100Mi - limits: - cpu: 200m - memory: 2Gi - ---- -apiVersion: apps/v1 -kind: Deployment -metadata: - name: db - namespace: djangoblog - labels: - app: db -spec: - replicas: 1 - selector: - matchLabels: - app: db - template: - metadata: - labels: - app: db - spec: - containers: - - name: db - image: mysql:latest - imagePullPolicy: IfNotPresent - ports: - - containerPort: 3306 - envFrom: - - configMapRef: - name: djangoblog-env - readinessProbe: - exec: - command: - - mysqladmin - - ping - - "-h" - - "127.0.0.1" - - "-u" - - "root" - - "-p$MYSQL_ROOT_PASSWORD" - initialDelaySeconds: 10 - periodSeconds: 10 - livenessProbe: - exec: - command: - - mysqladmin - - ping - - "-h" - - "127.0.0.1" - - "-u" - - "root" - - "-p$MYSQL_ROOT_PASSWORD" - initialDelaySeconds: 10 - periodSeconds: 10 - resources: - requests: - cpu: 10m - memory: 100Mi - limits: - cpu: "2" - memory: 2Gi - volumeMounts: - - name: db-data - mountPath: /var/lib/mysql - volumes: - - name: db-data - persistentVolumeClaim: - claimName: db-pvc - ---- -apiVersion: apps/v1 -kind: Deployment -metadata: - name: nginx - namespace: djangoblog - labels: - app: nginx -spec: - replicas: 1 - selector: - matchLabels: - app: nginx - template: - metadata: - labels: - app: nginx - spec: - containers: - - name: nginx - image: nginx:latest - imagePullPolicy: IfNotPresent - ports: - - containerPort: 80 - resources: - requests: - cpu: 10m - memory: 100Mi - limits: - cpu: "2" - memory: 2Gi - volumeMounts: - - name: nginx-config - mountPath: /etc/nginx/nginx.conf - subPath: nginx.conf - - name: nginx-config - mountPath: /etc/nginx/conf.d/default.conf - subPath: djangoblog.conf - - name: nginx-config - mountPath: /etc/nginx/conf.d/resource.lylinux.net.conf - subPath: resource.lylinux.net.conf - - name: nginx-config - mountPath: /etc/nginx/lylinux/resource.conf - subPath: lylinux.resource.conf - - name: djangoblog-pvc - mountPath: /code/djangoblog/collectedstatic - - name: resource-pvc - mountPath: /resource - volumes: - - name: nginx-config - configMap: - name: web-nginx-config - - name: djangoblog-pvc - persistentVolumeClaim: - claimName: djangoblog-pvc - - name: resource-pvc - persistentVolumeClaim: - claimName: resource-pvc - ---- -apiVersion: apps/v1 -kind: Deployment -metadata: - name: elasticsearch - namespace: djangoblog - labels: - app: elasticsearch -spec: - replicas: 1 - selector: - matchLabels: - app: elasticsearch - template: - metadata: - labels: - app: elasticsearch - spec: - containers: - - name: elasticsearch - image: liangliangyy/elasticsearch-analysis-ik:8.6.1 - imagePullPolicy: IfNotPresent - env: - - name: discovery.type - value: single-node - - name: ES_JAVA_OPTS - value: "-Xms256m -Xmx256m" - - name: xpack.security.enabled - value: "false" - - name: xpack.monitoring.templates.enabled - value: "false" - ports: - - containerPort: 9200 - resources: - requests: - cpu: 10m - memory: 100Mi - limits: - cpu: "2" - memory: 2Gi - readinessProbe: - httpGet: - path: / - port: 9200 - initialDelaySeconds: 15 - periodSeconds: 30 - livenessProbe: - httpGet: - path: / - port: 9200 - initialDelaySeconds: 15 - periodSeconds: 30 - volumeMounts: - - name: elasticsearch-data - mountPath: /usr/share/elasticsearch/data/ - volumes: - - name: elasticsearch-data - persistentVolumeClaim: - claimName: elasticsearch-pvc diff --git a/src/DjangoBlog/deploy/k8s/gateway.yaml b/src/DjangoBlog/deploy/k8s/gateway.yaml deleted file mode 100644 index a8de073..0000000 --- a/src/DjangoBlog/deploy/k8s/gateway.yaml +++ /dev/null @@ -1,17 +0,0 @@ -apiVersion: networking.k8s.io/v1 -kind: Ingress -metadata: - name: nginx - namespace: djangoblog -spec: - ingressClassName: nginx - rules: - - http: - paths: - - path: / - pathType: Prefix - backend: - service: - name: nginx - port: - number: 80 \ No newline at end of file diff --git a/src/DjangoBlog/deploy/k8s/pv.yaml b/src/DjangoBlog/deploy/k8s/pv.yaml deleted file mode 100644 index 874b72f..0000000 --- a/src/DjangoBlog/deploy/k8s/pv.yaml +++ /dev/null @@ -1,94 +0,0 @@ -apiVersion: v1 -kind: PersistentVolume -metadata: - name: local-pv-db -spec: - capacity: - storage: 10Gi - volumeMode: Filesystem - accessModes: - - ReadWriteOnce - persistentVolumeReclaimPolicy: Retain - storageClassName: local-storage - local: - path: /mnt/local-storage-db - nodeAffinity: - required: - nodeSelectorTerms: - - matchExpressions: - - key: kubernetes.io/hostname - operator: In - values: - - master ---- -apiVersion: v1 -kind: PersistentVolume -metadata: - name: local-pv-djangoblog -spec: - capacity: - storage: 5Gi - volumeMode: Filesystem - accessModes: - - ReadWriteOnce - persistentVolumeReclaimPolicy: Retain - storageClassName: local-storage - local: - path: /mnt/local-storage-djangoblog - nodeAffinity: - required: - nodeSelectorTerms: - - matchExpressions: - - key: kubernetes.io/hostname - operator: In - values: - - master - - ---- -apiVersion: v1 -kind: PersistentVolume -metadata: - name: local-pv-resource -spec: - capacity: - storage: 5Gi - volumeMode: Filesystem - accessModes: - - ReadWriteOnce - persistentVolumeReclaimPolicy: Retain - storageClassName: local-storage - local: - path: /mnt/resource/ - nodeAffinity: - required: - nodeSelectorTerms: - - matchExpressions: - - key: kubernetes.io/hostname - operator: In - values: - - master - ---- -apiVersion: v1 -kind: PersistentVolume -metadata: - name: local-pv-elasticsearch -spec: - capacity: - storage: 5Gi - volumeMode: Filesystem - accessModes: - - ReadWriteOnce - persistentVolumeReclaimPolicy: Retain - storageClassName: local-storage - local: - path: /mnt/local-storage-elasticsearch - nodeAffinity: - required: - nodeSelectorTerms: - - matchExpressions: - - key: kubernetes.io/hostname - operator: In - values: - - master \ No newline at end of file diff --git a/src/DjangoBlog/deploy/k8s/pvc.yaml b/src/DjangoBlog/deploy/k8s/pvc.yaml deleted file mode 100644 index ef238c5..0000000 --- a/src/DjangoBlog/deploy/k8s/pvc.yaml +++ /dev/null @@ -1,60 +0,0 @@ -apiVersion: v1 -kind: PersistentVolumeClaim -metadata: - name: db-pvc - namespace: djangoblog -spec: - storageClassName: local-storage - volumeName: local-pv-db - accessModes: - - ReadWriteOnce - resources: - requests: - storage: 10Gi - - ---- -apiVersion: v1 -kind: PersistentVolumeClaim -metadata: - name: djangoblog-pvc - namespace: djangoblog -spec: - volumeName: local-pv-djangoblog - storageClassName: local-storage - accessModes: - - ReadWriteOnce - resources: - requests: - storage: 5Gi - ---- -apiVersion: v1 -kind: PersistentVolumeClaim -metadata: - name: resource-pvc - namespace: djangoblog -spec: - volumeName: local-pv-resource - storageClassName: local-storage - accessModes: - - ReadWriteOnce - resources: - requests: - storage: 5Gi - ---- -apiVersion: v1 -kind: PersistentVolumeClaim -metadata: - name: elasticsearch-pvc - namespace: djangoblog -spec: - volumeName: local-pv-elasticsearch - storageClassName: local-storage - accessModes: - - ReadWriteOnce - resources: - requests: - storage: 5Gi - \ No newline at end of file diff --git a/src/DjangoBlog/deploy/k8s/service.yaml b/src/DjangoBlog/deploy/k8s/service.yaml deleted file mode 100644 index 4ef2931..0000000 --- a/src/DjangoBlog/deploy/k8s/service.yaml +++ /dev/null @@ -1,80 +0,0 @@ -apiVersion: v1 -kind: Service -metadata: - name: djangoblog - namespace: djangoblog - labels: - app: djangoblog -spec: - selector: - app: djangoblog - ports: - - protocol: TCP - port: 8000 - targetPort: 8000 - type: ClusterIP ---- -apiVersion: v1 -kind: Service -metadata: - name: nginx - namespace: djangoblog - labels: - app: nginx -spec: - selector: - app: nginx - ports: - - protocol: TCP - port: 80 - targetPort: 80 - type: ClusterIP ---- -apiVersion: v1 -kind: Service -metadata: - name: redis - namespace: djangoblog - labels: - app: redis -spec: - selector: - app: redis - ports: - - protocol: TCP - port: 6379 - targetPort: 6379 - type: ClusterIP ---- -apiVersion: v1 -kind: Service -metadata: - name: db - namespace: djangoblog - labels: - app: db -spec: - selector: - app: db - ports: - - protocol: TCP - port: 3306 - targetPort: 3306 - type: ClusterIP ---- -apiVersion: v1 -kind: Service -metadata: - name: elasticsearch - namespace: djangoblog - labels: - app: elasticsearch -spec: - selector: - app: elasticsearch - ports: - - protocol: TCP - port: 9200 - targetPort: 9200 - type: ClusterIP - diff --git a/src/DjangoBlog/deploy/k8s/storageclass.yaml b/src/DjangoBlog/deploy/k8s/storageclass.yaml deleted file mode 100644 index 5d5a14c..0000000 --- a/src/DjangoBlog/deploy/k8s/storageclass.yaml +++ /dev/null @@ -1,10 +0,0 @@ -apiVersion: storage.k8s.io/v1 -kind: StorageClass -metadata: - name: local-storage - annotations: - storageclass.kubernetes.io/is-default-class: "true" -provisioner: kubernetes.io/no-provisioner -volumeBindingMode: Immediate - - diff --git a/src/DjangoBlog/deploy/nginx.conf b/src/DjangoBlog/deploy/nginx.conf deleted file mode 100644 index 32161d8..0000000 --- a/src/DjangoBlog/deploy/nginx.conf +++ /dev/null @@ -1,50 +0,0 @@ -user nginx; -worker_processes auto; - -error_log /var/log/nginx/error.log notice; -pid /var/run/nginx.pid; - - -events { - worker_connections 1024; -} - - -http { - include /etc/nginx/mime.types; - default_type application/octet-stream; - - log_format main '$remote_addr - $remote_user [$time_local] "$request" ' - '$status $body_bytes_sent "$http_referer" ' - '"$http_user_agent" "$http_x_forwarded_for"'; - - access_log /var/log/nginx/access.log main; - - sendfile on; - #tcp_nopush on; - - keepalive_timeout 65; - - #gzip on; - - server { - root /code/djangoblog/collectedstatic/; - listen 80; - keepalive_timeout 70; - location /static/ { - expires max; - alias /code/djangoblog/collectedstatic/; - } - location / { - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header Host $http_host; - proxy_set_header X-NginX-Proxy true; - proxy_redirect off; - if (!-f $request_filename) { - proxy_pass http://djangoblog:8000; - break; - } - } - } -} diff --git a/src/DjangoBlog/djangoblog/__init__.py b/src/DjangoBlog/djangoblog/__init__.py deleted file mode 100644 index 1e205f4..0000000 --- a/src/DjangoBlog/djangoblog/__init__.py +++ /dev/null @@ -1 +0,0 @@ -default_app_config = 'djangoblog.apps.DjangoblogAppConfig' diff --git a/src/DjangoBlog/djangoblog/admin_site.py b/src/DjangoBlog/djangoblog/admin_site.py deleted file mode 100644 index f120405..0000000 --- a/src/DjangoBlog/djangoblog/admin_site.py +++ /dev/null @@ -1,64 +0,0 @@ -from django.contrib.admin import AdminSite -from django.contrib.admin.models import LogEntry -from django.contrib.sites.admin import SiteAdmin -from django.contrib.sites.models import Site - -from accounts.admin import * -from blog.admin import * -from blog.models import * -from comments.admin import * -from comments.models import * -from djangoblog.logentryadmin import LogEntryAdmin -from oauth.admin import * -from oauth.models import * -from owntracks.admin import * -from owntracks.models import * -from servermanager.admin import * -from servermanager.models import * - - -class DjangoBlogAdminSite(AdminSite): - site_header = 'djangoblog administration' - site_title = 'djangoblog site admin' - - def __init__(self, name='admin'): - super().__init__(name) - - def has_permission(self, request): - return request.user.is_superuser - - # def get_urls(self): - # urls = super().get_urls() - # from django.urls import path - # from blog.views import refresh_memcache - # - # my_urls = [ - # path('refresh/', self.admin_view(refresh_memcache), name="refresh"), - # ] - # return urls + my_urls - - -admin_site = DjangoBlogAdminSite(name='admin') - -admin_site.register(Article, ArticlelAdmin) -admin_site.register(Category, CategoryAdmin) -admin_site.register(Tag, TagAdmin) -admin_site.register(Links, LinksAdmin) -admin_site.register(SideBar, SideBarAdmin) -admin_site.register(BlogSettings, BlogSettingsAdmin) - -admin_site.register(commands, CommandsAdmin) -admin_site.register(EmailSendLog, EmailSendLogAdmin) - -admin_site.register(BlogUser, BlogUserAdmin) - -admin_site.register(Comment, CommentAdmin) - -admin_site.register(OAuthUser, OAuthUserAdmin) -admin_site.register(OAuthConfig, OAuthConfigAdmin) - -admin_site.register(OwnTrackLog, OwnTrackLogsAdmin) - -admin_site.register(Site, SiteAdmin) - -admin_site.register(LogEntry, LogEntryAdmin) diff --git a/src/DjangoBlog/djangoblog/apps.py b/src/DjangoBlog/djangoblog/apps.py deleted file mode 100644 index d29e318..0000000 --- a/src/DjangoBlog/djangoblog/apps.py +++ /dev/null @@ -1,11 +0,0 @@ -from django.apps import AppConfig - -class DjangoblogAppConfig(AppConfig): - default_auto_field = 'django.db.models.BigAutoField' - name = 'djangoblog' - - def ready(self): - super().ready() - # Import and load plugins here - from .plugin_manage.loader import load_plugins - load_plugins() \ No newline at end of file diff --git a/src/DjangoBlog/djangoblog/blog_signals.py b/src/DjangoBlog/djangoblog/blog_signals.py deleted file mode 100644 index 393f441..0000000 --- a/src/DjangoBlog/djangoblog/blog_signals.py +++ /dev/null @@ -1,122 +0,0 @@ -import _thread -import logging - -import django.dispatch -from django.conf import settings -from django.contrib.admin.models import LogEntry -from django.contrib.auth.signals import user_logged_in, user_logged_out -from django.core.mail import EmailMultiAlternatives -from django.db.models.signals import post_save -from django.dispatch import receiver - -from comments.models import Comment -from comments.utils import send_comment_email -from djangoblog.spider_notify import SpiderNotify -from djangoblog.utils import cache, expire_view_cache, delete_sidebar_cache, delete_view_cache -from djangoblog.utils import get_current_site -from oauth.models import OAuthUser - -logger = logging.getLogger(__name__) - -oauth_user_login_signal = django.dispatch.Signal(['id']) -send_email_signal = django.dispatch.Signal( - ['emailto', 'title', 'content']) - - -@receiver(send_email_signal) -def send_email_signal_handler(sender, **kwargs): - emailto = kwargs['emailto'] - title = kwargs['title'] - content = kwargs['content'] - - msg = EmailMultiAlternatives( - title, - content, - from_email=settings.DEFAULT_FROM_EMAIL, - to=emailto) - msg.content_subtype = "html" - - from servermanager.models import EmailSendLog - log = EmailSendLog() - log.title = title - log.content = content - log.emailto = ','.join(emailto) - - try: - result = msg.send() - log.send_result = result > 0 - except Exception as e: - logger.error(f"失败邮箱号: {emailto}, {e}") - log.send_result = False - log.save() - - -@receiver(oauth_user_login_signal) -def oauth_user_login_signal_handler(sender, **kwargs): - id = kwargs['id'] - oauthuser = OAuthUser.objects.get(id=id) - site = get_current_site().domain - if oauthuser.picture and not oauthuser.picture.find(site) >= 0: - from djangoblog.utils import save_user_avatar - oauthuser.picture = save_user_avatar(oauthuser.picture) - oauthuser.save() - - delete_sidebar_cache() - - -@receiver(post_save) -def model_post_save_callback( - sender, - instance, - created, - raw, - using, - update_fields, - **kwargs): - clearcache = False - if isinstance(instance, LogEntry): - return - if 'get_full_url' in dir(instance): - is_update_views = update_fields == {'views'} - if not settings.TESTING and not is_update_views: - try: - notify_url = instance.get_full_url() - SpiderNotify.baidu_notify([notify_url]) - except Exception as ex: - logger.error("notify sipder", ex) - if not is_update_views: - clearcache = True - - if isinstance(instance, Comment): - if instance.is_enable: - path = instance.article.get_absolute_url() - site = get_current_site().domain - if site.find(':') > 0: - site = site[0:site.find(':')] - - expire_view_cache( - path, - servername=site, - serverport=80, - key_prefix='blogdetail') - if cache.get('seo_processor'): - cache.delete('seo_processor') - comment_cache_key = 'article_comments_{id}'.format( - id=instance.article.id) - cache.delete(comment_cache_key) - delete_sidebar_cache() - delete_view_cache('article_comments', [str(instance.article.pk)]) - - _thread.start_new_thread(send_comment_email, (instance,)) - - if clearcache: - cache.clear() - - -@receiver(user_logged_in) -@receiver(user_logged_out) -def user_auth_callback(sender, request, user, **kwargs): - if user and user.username: - logger.info(user) - delete_sidebar_cache() - # cache.clear() diff --git a/src/DjangoBlog/djangoblog/elasticsearch_backend.py b/src/DjangoBlog/djangoblog/elasticsearch_backend.py deleted file mode 100644 index 4afe498..0000000 --- a/src/DjangoBlog/djangoblog/elasticsearch_backend.py +++ /dev/null @@ -1,183 +0,0 @@ -from django.utils.encoding import force_str -from elasticsearch_dsl import Q -from haystack.backends import BaseEngine, BaseSearchBackend, BaseSearchQuery, log_query -from haystack.forms import ModelSearchForm -from haystack.models import SearchResult -from haystack.utils import log as logging - -from blog.documents import ArticleDocument, ArticleDocumentManager -from blog.models import Article - -logger = logging.getLogger(__name__) - - -class ElasticSearchBackend(BaseSearchBackend): - def __init__(self, connection_alias, **connection_options): - super( - ElasticSearchBackend, - self).__init__( - connection_alias, - **connection_options) - self.manager = ArticleDocumentManager() - self.include_spelling = True - - def _get_models(self, iterable): - models = iterable if iterable and iterable[0] else Article.objects.all() - docs = self.manager.convert_to_doc(models) - return docs - - def _create(self, models): - self.manager.create_index() - docs = self._get_models(models) - self.manager.rebuild(docs) - - def _delete(self, models): - for m in models: - m.delete() - return True - - def _rebuild(self, models): - models = models if models else Article.objects.all() - docs = self.manager.convert_to_doc(models) - self.manager.update_docs(docs) - - def update(self, index, iterable, commit=True): - - models = self._get_models(iterable) - self.manager.update_docs(models) - - def remove(self, obj_or_string): - models = self._get_models([obj_or_string]) - self._delete(models) - - def clear(self, models=None, commit=True): - self.remove(None) - - @staticmethod - def get_suggestion(query: str) -> str: - """获取推荐词, 如果没有找到添加原搜索词""" - - search = ArticleDocument.search() \ - .query("match", body=query) \ - .suggest('suggest_search', query, term={'field': 'body'}) \ - .execute() - - keywords = [] - for suggest in search.suggest.suggest_search: - if suggest["options"]: - keywords.append(suggest["options"][0]["text"]) - else: - keywords.append(suggest["text"]) - - return ' '.join(keywords) - - @log_query - def search(self, query_string, **kwargs): - logger.info('search query_string:' + query_string) - - start_offset = kwargs.get('start_offset') - end_offset = kwargs.get('end_offset') - - # 推荐词搜索 - if getattr(self, "is_suggest", None): - suggestion = self.get_suggestion(query_string) - else: - suggestion = query_string - - q = Q('bool', - should=[Q('match', body=suggestion), Q('match', title=suggestion)], - minimum_should_match="70%") - - search = ArticleDocument.search() \ - .query('bool', filter=[q]) \ - .filter('term', status='p') \ - .filter('term', type='a') \ - .source(False)[start_offset: end_offset] - - results = search.execute() - hits = results['hits'].total - raw_results = [] - for raw_result in results['hits']['hits']: - app_label = 'blog' - model_name = 'Article' - additional_fields = {} - - result_class = SearchResult - - result = result_class( - app_label, - model_name, - raw_result['_id'], - raw_result['_score'], - **additional_fields) - raw_results.append(result) - facets = {} - spelling_suggestion = None if query_string == suggestion else suggestion - - return { - 'results': raw_results, - 'hits': hits, - 'facets': facets, - 'spelling_suggestion': spelling_suggestion, - } - - -class ElasticSearchQuery(BaseSearchQuery): - def _convert_datetime(self, date): - if hasattr(date, 'hour'): - return force_str(date.strftime('%Y%m%d%H%M%S')) - else: - return force_str(date.strftime('%Y%m%d000000')) - - def clean(self, query_fragment): - """ - Provides a mechanism for sanitizing user input before presenting the - value to the backend. - - Whoosh 1.X differs here in that you can no longer use a backslash - to escape reserved characters. Instead, the whole word should be - quoted. - """ - words = query_fragment.split() - cleaned_words = [] - - for word in words: - if word in self.backend.RESERVED_WORDS: - word = word.replace(word, word.lower()) - - for char in self.backend.RESERVED_CHARACTERS: - if char in word: - word = "'%s'" % word - break - - cleaned_words.append(word) - - return ' '.join(cleaned_words) - - def build_query_fragment(self, field, filter_type, value): - return value.query_string - - def get_count(self): - results = self.get_results() - return len(results) if results else 0 - - def get_spelling_suggestion(self, preferred_query=None): - return self._spelling_suggestion - - def build_params(self, spelling_query=None): - kwargs = super(ElasticSearchQuery, self).build_params(spelling_query=spelling_query) - return kwargs - - -class ElasticSearchModelSearchForm(ModelSearchForm): - - def search(self): - # 是否建议搜索 - self.searchqueryset.query.backend.is_suggest = self.data.get("is_suggest") != "no" - sqs = super().search() - return sqs - - -class ElasticSearchEngine(BaseEngine): - backend = ElasticSearchBackend - query = ElasticSearchQuery diff --git a/src/DjangoBlog/djangoblog/feeds.py b/src/DjangoBlog/djangoblog/feeds.py deleted file mode 100644 index 8c4e851..0000000 --- a/src/DjangoBlog/djangoblog/feeds.py +++ /dev/null @@ -1,40 +0,0 @@ -from django.contrib.auth import get_user_model -from django.contrib.syndication.views import Feed -from django.utils import timezone -from django.utils.feedgenerator import Rss201rev2Feed - -from blog.models import Article -from djangoblog.utils import CommonMarkdown - - -class DjangoBlogFeed(Feed): - feed_type = Rss201rev2Feed - - description = '大巧无工,重剑无锋.' - title = "且听风吟 大巧无工,重剑无锋. " - link = "/feed/" - - def author_name(self): - return get_user_model().objects.first().nickname - - def author_link(self): - return get_user_model().objects.first().get_absolute_url() - - def items(self): - return Article.objects.filter(type='a', status='p').order_by('-pub_time')[:5] - - def item_title(self, item): - return item.title - - def item_description(self, item): - return CommonMarkdown.get_markdown(item.body) - - def feed_copyright(self): - now = timezone.now() - return "Copyright© {year} 且听风吟".format(year=now.year) - - def item_link(self, item): - return item.get_absolute_url() - - def item_guid(self, item): - return diff --git a/src/DjangoBlog/djangoblog/logentryadmin.py b/src/DjangoBlog/djangoblog/logentryadmin.py deleted file mode 100644 index 2f6a535..0000000 --- a/src/DjangoBlog/djangoblog/logentryadmin.py +++ /dev/null @@ -1,91 +0,0 @@ -from django.contrib import admin -from django.contrib.admin.models import DELETION -from django.contrib.contenttypes.models import ContentType -from django.urls import reverse, NoReverseMatch -from django.utils.encoding import force_str -from django.utils.html import escape -from django.utils.safestring import mark_safe -from django.utils.translation import gettext_lazy as _ - - -class LogEntryAdmin(admin.ModelAdmin): - list_filter = [ - 'content_type' - ] - - search_fields = [ - 'object_repr', - 'change_message' - ] - - list_display_links = [ - 'action_time', - 'get_change_message', - ] - list_display = [ - 'action_time', - 'user_link', - 'content_type', - 'object_link', - 'get_change_message', - ] - - def has_add_permission(self, request): - return False - - def has_change_permission(self, request, obj=None): - return ( - request.user.is_superuser or - request.user.has_perm('admin.change_logentry') - ) and request.method != 'POST' - - def has_delete_permission(self, request, obj=None): - return False - - def object_link(self, obj): - object_link = escape(obj.object_repr) - content_type = obj.content_type - - if obj.action_flag != DELETION and content_type is not None: - # try returning an actual link instead of object repr string - try: - url = reverse( - 'admin:{}_{}_change'.format(content_type.app_label, - content_type.model), - args=[obj.object_id] - ) - object_link = '{}'.format(url, object_link) - except NoReverseMatch: - pass - return mark_safe(object_link) - - object_link.admin_order_field = 'object_repr' - object_link.short_description = _('object') - - def user_link(self, obj): - content_type = ContentType.objects.get_for_model(type(obj.user)) - user_link = escape(force_str(obj.user)) - try: - # try returning an actual link instead of object repr string - url = reverse( - 'admin:{}_{}_change'.format(content_type.app_label, - content_type.model), - args=[obj.user.pk] - ) - user_link = '{}'.format(url, user_link) - except NoReverseMatch: - pass - return mark_safe(user_link) - - user_link.admin_order_field = 'user' - user_link.short_description = _('user') - - def get_queryset(self, request): - queryset = super(LogEntryAdmin, self).get_queryset(request) - return queryset.prefetch_related('content_type') - - def get_actions(self, request): - actions = super(LogEntryAdmin, self).get_actions(request) - if 'delete_selected' in actions: - del actions['delete_selected'] - return actions diff --git a/src/DjangoBlog/djangoblog/plugin_manage/base_plugin.py b/src/DjangoBlog/djangoblog/plugin_manage/base_plugin.py deleted file mode 100644 index df1ce0b..0000000 --- a/src/DjangoBlog/djangoblog/plugin_manage/base_plugin.py +++ /dev/null @@ -1,194 +0,0 @@ -import logging -from pathlib import Path - -from django.template import TemplateDoesNotExist -from django.template.loader import render_to_string - -logger = logging.getLogger(__name__) - - -class BasePlugin: - # 插件元数据 - PLUGIN_NAME = None - PLUGIN_DESCRIPTION = None - PLUGIN_VERSION = None - PLUGIN_AUTHOR = None - - # 插件配置 - SUPPORTED_POSITIONS = [] # 支持的显示位置 - DEFAULT_PRIORITY = 100 # 默认优先级(数字越小优先级越高) - POSITION_PRIORITIES = {} # 各位置的优先级 {'sidebar': 50, 'article_bottom': 80} - - def __init__(self): - if not all([self.PLUGIN_NAME, self.PLUGIN_DESCRIPTION, self.PLUGIN_VERSION]): - raise ValueError("Plugin metadata (PLUGIN_NAME, PLUGIN_DESCRIPTION, PLUGIN_VERSION) must be defined.") - - # 设置插件路径 - self.plugin_dir = self._get_plugin_directory() - self.plugin_slug = self._get_plugin_slug() - - self.init_plugin() - self.register_hooks() - - def _get_plugin_directory(self): - """获取插件目录路径""" - import inspect - plugin_file = inspect.getfile(self.__class__) - return Path(plugin_file).parent - - def _get_plugin_slug(self): - """获取插件标识符(目录名)""" - return self.plugin_dir.name - - def init_plugin(self): - """ - 插件初始化逻辑 - 子类可以重写此方法来实现特定的初始化操作 - """ - logger.info(f'{self.PLUGIN_NAME} initialized.') - - def register_hooks(self): - """ - 注册插件钩子 - 子类可以重写此方法来注册特定的钩子 - """ - pass - - # === 位置渲染系统 === - def render_position_widget(self, position, context, **kwargs): - """ - 根据位置渲染插件组件 - - Args: - position: 位置标识 - context: 模板上下文 - **kwargs: 额外参数 - - Returns: - dict: {'html': 'HTML内容', 'priority': 优先级} 或 None - """ - if position not in self.SUPPORTED_POSITIONS: - return None - - # 检查条件显示 - if not self.should_display(position, context, **kwargs): - return None - - # 调用具体的位置渲染方法 - method_name = f'render_{position}_widget' - if hasattr(self, method_name): - html = getattr(self, method_name)(context, **kwargs) - if html: - priority = self.POSITION_PRIORITIES.get(position, self.DEFAULT_PRIORITY) - return { - 'html': html, - 'priority': priority, - 'plugin_name': self.PLUGIN_NAME - } - - return None - - def should_display(self, position, context, **kwargs): - """ - 判断插件是否应该在指定位置显示 - 子类可重写此方法实现条件显示逻辑 - - Args: - position: 位置标识 - context: 模板上下文 - **kwargs: 额外参数 - - Returns: - bool: 是否显示 - """ - return True - - # === 各位置渲染方法 - 子类重写 === - def render_sidebar_widget(self, context, **kwargs): - """渲染侧边栏组件""" - return None - - def render_article_bottom_widget(self, context, **kwargs): - """渲染文章底部组件""" - return None - - def render_article_top_widget(self, context, **kwargs): - """渲染文章顶部组件""" - return None - - def render_header_widget(self, context, **kwargs): - """渲染页头组件""" - return None - - def render_footer_widget(self, context, **kwargs): - """渲染页脚组件""" - return None - - def render_comment_before_widget(self, context, **kwargs): - """渲染评论前组件""" - return None - - def render_comment_after_widget(self, context, **kwargs): - """渲染评论后组件""" - return None - - # === 模板系统 === - def render_template(self, template_name, context=None): - """ - 渲染插件模板 - - Args: - template_name: 模板文件名 - context: 模板上下文 - - Returns: - HTML字符串 - """ - if context is None: - context = {} - - template_path = f"plugins/{self.plugin_slug}/{template_name}" - - try: - return render_to_string(template_path, context) - except TemplateDoesNotExist: - logger.warning(f"Plugin template not found: {template_path}") - return "" - - # === 静态资源系统 === - def get_static_url(self, static_file): - """获取插件静态文件URL""" - from django.templatetags.static import static - return static(f"{self.plugin_slug}/static/{self.plugin_slug}/{static_file}") - - def get_css_files(self): - """获取插件CSS文件列表""" - return [] - - def get_js_files(self): - """获取插件JavaScript文件列表""" - return [] - - def get_head_html(self, context=None): - """获取需要插入到中的HTML内容""" - return "" - - def get_body_html(self, context=None): - """获取需要插入到底部的HTML内容""" - return "" - - def get_plugin_info(self): - """ - 获取插件信息 - :return: 包含插件元数据的字典 - """ - return { - 'name': self.PLUGIN_NAME, - 'description': self.PLUGIN_DESCRIPTION, - 'version': self.PLUGIN_VERSION, - 'author': self.PLUGIN_AUTHOR, - 'slug': self.plugin_slug, - 'directory': str(self.plugin_dir), - 'supported_positions': self.SUPPORTED_POSITIONS, - 'priorities': self.POSITION_PRIORITIES - } diff --git a/src/DjangoBlog/djangoblog/plugin_manage/hook_constants.py b/src/DjangoBlog/djangoblog/plugin_manage/hook_constants.py deleted file mode 100644 index 8ed4e89..0000000 --- a/src/DjangoBlog/djangoblog/plugin_manage/hook_constants.py +++ /dev/null @@ -1,22 +0,0 @@ -ARTICLE_DETAIL_LOAD = 'article_detail_load' -ARTICLE_CREATE = 'article_create' -ARTICLE_UPDATE = 'article_update' -ARTICLE_DELETE = 'article_delete' - -ARTICLE_CONTENT_HOOK_NAME = "the_content" - -# 位置钩子常量 -POSITION_HOOKS = { - 'article_top': 'article_top_widgets', - 'article_bottom': 'article_bottom_widgets', - 'sidebar': 'sidebar_widgets', - 'header': 'header_widgets', - 'footer': 'footer_widgets', - 'comment_before': 'comment_before_widgets', - 'comment_after': 'comment_after_widgets', -} - -# 资源注入钩子 -HEAD_RESOURCES_HOOK = 'head_resources' -BODY_RESOURCES_HOOK = 'body_resources' - diff --git a/src/DjangoBlog/djangoblog/plugin_manage/hooks.py b/src/DjangoBlog/djangoblog/plugin_manage/hooks.py deleted file mode 100644 index d712540..0000000 --- a/src/DjangoBlog/djangoblog/plugin_manage/hooks.py +++ /dev/null @@ -1,44 +0,0 @@ -import logging - -logger = logging.getLogger(__name__) - -_hooks = {} - - -def register(hook_name: str, callback: callable): - """ - 注册一个钩子回调。 - """ - if hook_name not in _hooks: - _hooks[hook_name] = [] - _hooks[hook_name].append(callback) - logger.debug(f"Registered hook '{hook_name}' with callback '{callback.__name__}'") - - -def run_action(hook_name: str, *args, **kwargs): - """ - 执行一个 Action Hook。 - 它会按顺序执行所有注册到该钩子上的回调函数。 - """ - if hook_name in _hooks: - logger.debug(f"Running action hook '{hook_name}'") - for callback in _hooks[hook_name]: - try: - callback(*args, **kwargs) - except Exception as e: - logger.error(f"Error running action hook '{hook_name}' callback '{callback.__name__}': {e}", exc_info=True) - - -def apply_filters(hook_name: str, value, *args, **kwargs): - """ - 执行一个 Filter Hook。 - 它会把 value 依次传递给所有注册的回调函数进行处理。 - """ - if hook_name in _hooks: - logger.debug(f"Applying filter hook '{hook_name}'") - for callback in _hooks[hook_name]: - try: - value = callback(value, *args, **kwargs) - except Exception as e: - logger.error(f"Error applying filter hook '{hook_name}' callback '{callback.__name__}': {e}", exc_info=True) - return value diff --git a/src/DjangoBlog/djangoblog/plugin_manage/loader.py b/src/DjangoBlog/djangoblog/plugin_manage/loader.py deleted file mode 100644 index ee750d0..0000000 --- a/src/DjangoBlog/djangoblog/plugin_manage/loader.py +++ /dev/null @@ -1,64 +0,0 @@ -import os -import logging -from django.conf import settings - -logger = logging.getLogger(__name__) - -# 全局插件注册表 -_loaded_plugins = [] - -def load_plugins(): - """ - Dynamically loads and initializes plugins from the 'plugins' directory. - This function is intended to be called when the Django app registry is ready. - """ - global _loaded_plugins - _loaded_plugins = [] - - for plugin_name in settings.ACTIVE_PLUGINS: - plugin_path = os.path.join(settings.PLUGINS_DIR, plugin_name) - if os.path.isdir(plugin_path) and os.path.exists(os.path.join(plugin_path, 'plugin.py')): - try: - # 导入插件模块 - plugin_module = __import__(f'plugins.{plugin_name}.plugin', fromlist=['plugin']) - - # 获取插件实例 - if hasattr(plugin_module, 'plugin'): - plugin_instance = plugin_module.plugin - _loaded_plugins.append(plugin_instance) - logger.info(f"Successfully loaded plugin: {plugin_name} - {plugin_instance.PLUGIN_NAME}") - else: - logger.warning(f"Plugin {plugin_name} does not have 'plugin' instance") - - except ImportError as e: - logger.error(f"Failed to import plugin: {plugin_name}", exc_info=e) - except AttributeError as e: - logger.error(f"Failed to get plugin instance: {plugin_name}", exc_info=e) - except Exception as e: - logger.error(f"Unexpected error loading plugin: {plugin_name}", exc_info=e) - -def get_loaded_plugins(): - """获取所有已加载的插件""" - return _loaded_plugins - -def get_plugin_by_name(plugin_name): - """根据名称获取插件""" - for plugin in _loaded_plugins: - if plugin.plugin_slug == plugin_name: - return plugin - return None - -def get_plugin_by_slug(plugin_slug): - """根据slug获取插件""" - for plugin in _loaded_plugins: - if plugin.plugin_slug == plugin_slug: - return plugin - return None - -def get_plugins_info(): - """获取所有插件的信息""" - return [plugin.get_plugin_info() for plugin in _loaded_plugins] - -def get_plugins_by_position(position): - """获取支持指定位置的插件""" - return [plugin for plugin in _loaded_plugins if position in plugin.SUPPORTED_POSITIONS] \ No newline at end of file diff --git a/src/DjangoBlog/djangoblog/settings.py b/src/DjangoBlog/djangoblog/settings.py deleted file mode 100644 index 0bed20d..0000000 --- a/src/DjangoBlog/djangoblog/settings.py +++ /dev/null @@ -1,404 +0,0 @@ -""" -Django settings for djangoblog project. - -Generated by 'django-admin startproject' using Django 1.10.2. - -For more information on this file, see -https://docs.djangoproject.com/en/1.10/topics/settings/ - -For the full list of settings and their values, see -https://docs.djangoproject.com/en/1.10/ref/settings/ -""" -import os -import sys -from pathlib import Path - -from django.utils.translation import gettext_lazy as _ - - -def env_to_bool(env, default): - str_val = os.environ.get(env) - return default if str_val is None else str_val == 'True' - - -# Build paths inside the project like this: BASE_DIR / 'subdir'. -BASE_DIR = Path(__file__).resolve().parent.parent - -# Quick-start development settings - unsuitable for production -# See https://docs.djangoproject.com/en/1.10/howto/deployment/checklist/ - -# SECURITY WARNING: keep the secret key used in production secret! -SECRET_KEY = os.environ.get( - 'DJANGO_SECRET_KEY') or 'n9ceqv38)#&mwuat@(mjb_p%em$e8$qyr#fw9ot!=ba6lijx-6' -# SECURITY WARNING: don't run with debug turned on in production! -DEBUG = env_to_bool('DJANGO_DEBUG', True) -# DEBUG = False -TESTING = len(sys.argv) > 1 and sys.argv[1] == 'test' - -# ALLOWED_HOSTS = [] -ALLOWED_HOSTS = ['*', '127.0.0.1', 'example.com'] -# django 4.0新增配置 -CSRF_TRUSTED_ORIGINS = ['http://example.com'] -# Application definition - - -INSTALLED_APPS = [ - # 'django.contrib.admin', - 'django.contrib.admin.apps.SimpleAdminConfig', - 'django.contrib.auth', - 'django.contrib.contenttypes', - 'django.contrib.sessions', - 'django.contrib.messages', - 'django.contrib.staticfiles', - 'django.contrib.sites', - 'django.contrib.sitemaps', - 'mdeditor', - 'haystack', - 'blog', - 'accounts', - 'comments', - 'oauth', - 'servermanager', - 'owntracks', - 'compressor', - 'djangoblog' -] - -MIDDLEWARE = [ - - 'django.middleware.security.SecurityMiddleware', - 'django.contrib.sessions.middleware.SessionMiddleware', - 'django.middleware.locale.LocaleMiddleware', - 'django.middleware.gzip.GZipMiddleware', - # 'django.middleware.cache.UpdateCacheMiddleware', - 'django.middleware.common.CommonMiddleware', - # 'django.middleware.cache.FetchFromCacheMiddleware', - 'django.middleware.csrf.CsrfViewMiddleware', - 'django.contrib.auth.middleware.AuthenticationMiddleware', - 'django.contrib.messages.middleware.MessageMiddleware', - 'django.middleware.clickjacking.XFrameOptionsMiddleware', - 'django.middleware.http.ConditionalGetMiddleware', - 'blog.middleware.OnlineMiddleware' -] - -ROOT_URLCONF = 'djangoblog.urls' - -TEMPLATES = [ - { - 'BACKEND': 'django.template.backends.django.DjangoTemplates', - 'DIRS': [os.path.join(BASE_DIR, 'templates')], - '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', - 'blog.context_processors.seo_processor' - ], - }, - }, -] - -WSGI_APPLICATION = 'djangoblog.wsgi.application' - -# Database -# https://docs.djangoproject.com/en/1.10/ref/settings/#databases - - -DATABASES = { - 'default': { - 'ENGINE': 'django.db.backends.mysql', - 'NAME': os.environ.get('DJANGO_MYSQL_DATABASE') or 'djangoblog', - 'USER': os.environ.get('DJANGO_MYSQL_USER') or 'root', - 'PASSWORD': os.environ.get('DJANGO_MYSQL_PASSWORD') or 'root', - 'HOST': os.environ.get('DJANGO_MYSQL_HOST') or '127.0.0.1', - 'PORT': int( - os.environ.get('DJANGO_MYSQL_PORT') or 3306), - 'OPTIONS': { - 'charset': 'utf8mb4'}, - }} - -# Password validation -# https://docs.djangoproject.com/en/1.10/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', - }, -] - -LANGUAGES = ( - ('en', _('English')), - ('zh-hans', _('Simplified Chinese')), - ('zh-hant', _('Traditional Chinese')), -) -LOCALE_PATHS = ( - os.path.join(BASE_DIR, 'locale'), -) - -LANGUAGE_CODE = 'zh-hans' - -TIME_ZONE = 'Asia/Shanghai' - -USE_I18N = True - -USE_L10N = True - -USE_TZ = False - -# Static files (CSS, JavaScript, Images) -# https://docs.djangoproject.com/en/1.10/howto/static-files/ - - -HAYSTACK_CONNECTIONS = { - 'default': { - 'ENGINE': 'djangoblog.whoosh_cn_backend.WhooshEngine', - 'PATH': os.path.join(os.path.dirname(__file__), 'whoosh_index'), - }, -} -# Automatically update searching index -HAYSTACK_SIGNAL_PROCESSOR = 'haystack.signals.RealtimeSignalProcessor' -# Allow user login with username and password -AUTHENTICATION_BACKENDS = [ - 'accounts.user_login_backend.EmailOrUsernameModelBackend'] - -STATIC_ROOT = os.path.join(BASE_DIR, 'collectedstatic') - -STATIC_URL = '/static/' -STATICFILES = os.path.join(BASE_DIR, 'static') - -# 添加插件静态文件目录 -STATICFILES_DIRS = [ - os.path.join(BASE_DIR, 'plugins'), # 让Django能找到插件的静态文件 -] - -AUTH_USER_MODEL = 'accounts.BlogUser' -LOGIN_URL = '/login/' - -TIME_FORMAT = '%Y-%m-%d %H:%M:%S' -DATE_TIME_FORMAT = '%Y-%m-%d' - -# bootstrap color styles -BOOTSTRAP_COLOR_TYPES = [ - 'default', 'primary', 'success', 'info', 'warning', 'danger' -] - -# paginate -PAGINATE_BY = 10 -# http cache timeout -CACHE_CONTROL_MAX_AGE = 2592000 -# cache setting -CACHES = { - 'default': { - 'BACKEND': 'django.core.cache.backends.locmem.LocMemCache', - 'TIMEOUT': 10800, - 'LOCATION': 'unique-snowflake', - } -} -# 使用redis作为缓存 -if os.environ.get("DJANGO_REDIS_URL"): - CACHES = { - 'default': { - 'BACKEND': 'django.core.cache.backends.redis.RedisCache', - 'LOCATION': f'redis://{os.environ.get("DJANGO_REDIS_URL")}', - } - } - -SITE_ID = 1 -BAIDU_NOTIFY_URL = os.environ.get('DJANGO_BAIDU_NOTIFY_URL') \ - or 'http://data.zz.baidu.com/urls?site=https://www.lylinux.net&token=1uAOGrMsUm5syDGn' - -# Email: -EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend' -EMAIL_USE_TLS = env_to_bool('DJANGO_EMAIL_TLS', False) -EMAIL_USE_SSL = env_to_bool('DJANGO_EMAIL_SSL', True) -EMAIL_HOST = os.environ.get('DJANGO_EMAIL_HOST') or 'smtp.mxhichina.com' -EMAIL_PORT = int(os.environ.get('DJANGO_EMAIL_PORT') or 465) -EMAIL_HOST_USER = os.environ.get('DJANGO_EMAIL_USER') -EMAIL_HOST_PASSWORD = os.environ.get('DJANGO_EMAIL_PASSWORD') -DEFAULT_FROM_EMAIL = EMAIL_HOST_USER -SERVER_EMAIL = EMAIL_HOST_USER -# Setting debug=false did NOT handle except email notifications -ADMINS = [('admin', os.environ.get('DJANGO_ADMIN_EMAIL') or 'admin@admin.com')] -# WX ADMIN password(Two times md5) -WXADMIN = os.environ.get( - 'DJANGO_WXADMIN_PASSWORD') or '995F03AC401D6CABABAEF756FC4D43C7' - -LOG_PATH = os.path.join(BASE_DIR, 'logs') -if not os.path.exists(LOG_PATH): - os.makedirs(LOG_PATH, exist_ok=True) - -LOGGING = { - 'version': 1, - 'disable_existing_loggers': False, - 'root': { - 'level': 'INFO', - 'handlers': ['console', 'log_file'], - }, - 'formatters': { - 'verbose': { - 'format': '[%(asctime)s] %(levelname)s [%(name)s.%(funcName)s:%(lineno)d %(module)s] %(message)s', - } - }, - 'filters': { - 'require_debug_false': { - '()': 'django.utils.log.RequireDebugFalse', - }, - 'require_debug_true': { - '()': 'django.utils.log.RequireDebugTrue', - }, - }, - 'handlers': { - 'log_file': { - 'level': 'INFO', - 'class': 'logging.handlers.TimedRotatingFileHandler', - 'filename': os.path.join(LOG_PATH, 'djangoblog.log'), - 'when': 'D', - 'formatter': 'verbose', - 'interval': 1, - 'delay': True, - 'backupCount': 5, - 'encoding': 'utf-8' - }, - 'console': { - 'level': 'DEBUG', - 'filters': ['require_debug_true'], - 'class': 'logging.StreamHandler', - 'formatter': 'verbose' - }, - 'null': { - 'class': 'logging.NullHandler', - }, - 'mail_admins': { - 'level': 'ERROR', - 'filters': ['require_debug_false'], - 'class': 'django.utils.log.AdminEmailHandler' - } - }, - 'loggers': { - 'djangoblog': { - 'handlers': ['log_file', 'console'], - 'level': 'INFO', - 'propagate': True, - }, - 'django.request': { - 'handlers': ['mail_admins'], - 'level': 'ERROR', - 'propagate': False, - } - } -} - -STATICFILES_FINDERS = ( - 'django.contrib.staticfiles.finders.FileSystemFinder', - 'django.contrib.staticfiles.finders.AppDirectoriesFinder', - # other - 'compressor.finders.CompressorFinder', -) -COMPRESS_ENABLED = True -# 根据环境变量决定是否启用离线压缩 -COMPRESS_OFFLINE = os.environ.get('COMPRESS_OFFLINE', 'False').lower() == 'true' - -# 压缩输出目录 -COMPRESS_OUTPUT_DIR = 'compressed' - -# 压缩文件名模板 - 包含哈希值用于缓存破坏 -COMPRESS_CSS_HASHING_METHOD = 'mtime' -COMPRESS_JS_HASHING_METHOD = 'mtime' - -# 高级CSS压缩过滤器 -COMPRESS_CSS_FILTERS = [ - # 创建绝对URL - 'compressor.filters.css_default.CssAbsoluteFilter', - # CSS压缩器 - 高压缩等级 - 'compressor.filters.cssmin.CSSCompressorFilter', -] - -# 高级JS压缩过滤器 -COMPRESS_JS_FILTERS = [ - # JS压缩器 - 高压缩等级 - 'compressor.filters.jsmin.SlimItFilter', -] - -# 压缩缓存配置 -COMPRESS_CACHE_BACKEND = 'default' -COMPRESS_CACHE_KEY_FUNCTION = 'compressor.cache.simple_cachekey' - -# 预压缩配置 -COMPRESS_PRECOMPILERS = ( - # 支持SCSS/SASS - ('text/x-scss', 'django_libsass.SassCompiler'), - ('text/x-sass', 'django_libsass.SassCompiler'), -) - -# 压缩性能优化 -COMPRESS_MINT_DELAY = 30 # 压缩延迟(秒) -COMPRESS_MTIME_DELAY = 10 # 修改时间检查延迟 -COMPRESS_REBUILD_TIMEOUT = 2592000 # 重建超时(30天) - -# 压缩等级配置 -COMPRESS_CSS_COMPRESSOR = 'compressor.css.CssCompressor' -COMPRESS_JS_COMPRESSOR = 'compressor.js.JsCompressor' - -# 静态文件缓存配置 -STATICFILES_STORAGE = 'django.contrib.staticfiles.storage.ManifestStaticFilesStorage' - -# 浏览器缓存配置(通过中间件或服务器配置) -COMPRESS_URL = STATIC_URL -COMPRESS_ROOT = STATIC_ROOT - -MEDIA_ROOT = os.path.join(BASE_DIR, 'uploads') -MEDIA_URL = '/media/' -X_FRAME_OPTIONS = 'SAMEORIGIN' - -# 安全头部配置 - 防XSS和其他攻击 -SECURE_BROWSER_XSS_FILTER = True -SECURE_CONTENT_TYPE_NOSNIFF = True -SECURE_REFERRER_POLICY = 'strict-origin-when-cross-origin' - -# 内容安全策略 (CSP) - 防XSS攻击 -CSP_DEFAULT_SRC = ["'self'"] -CSP_SCRIPT_SRC = ["'self'", "'unsafe-inline'", "cdn.mathjax.org", "*.googleapis.com"] -CSP_STYLE_SRC = ["'self'", "'unsafe-inline'", "*.googleapis.com", "*.gstatic.com"] -CSP_IMG_SRC = ["'self'", "data:", "*.lylinux.net", "*.gravatar.com", "*.githubusercontent.com"] -CSP_FONT_SRC = ["'self'", "*.googleapis.com", "*.gstatic.com"] -CSP_CONNECT_SRC = ["'self'"] -CSP_FRAME_SRC = ["'none'"] -CSP_OBJECT_SRC = ["'none'"] - -DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' - -if os.environ.get('DJANGO_ELASTICSEARCH_HOST'): - ELASTICSEARCH_DSL = { - 'default': { - 'hosts': os.environ.get('DJANGO_ELASTICSEARCH_HOST') - }, - } - HAYSTACK_CONNECTIONS = { - 'default': { - 'ENGINE': 'djangoblog.elasticsearch_backend.ElasticSearchEngine', - }, - } - -# Plugin System -PLUGINS_DIR = BASE_DIR / 'plugins' -ACTIVE_PLUGINS = [ - 'article_copyright', - 'reading_time', - 'external_links', - 'view_count', - 'seo_optimizer', - 'image_lazy_loading', - 'article_recommendation', -] - diff --git a/src/DjangoBlog/djangoblog/sitemap.py b/src/DjangoBlog/djangoblog/sitemap.py deleted file mode 100644 index 8b7d446..0000000 --- a/src/DjangoBlog/djangoblog/sitemap.py +++ /dev/null @@ -1,59 +0,0 @@ -from django.contrib.sitemaps import Sitemap -from django.urls import reverse - -from blog.models import Article, Category, Tag - - -class StaticViewSitemap(Sitemap): - priority = 0.5 - changefreq = 'daily' - - def items(self): - return ['blog:index', ] - - def location(self, item): - return reverse(item) - - -class ArticleSiteMap(Sitemap): - changefreq = "monthly" - priority = "0.6" - - def items(self): - return Article.objects.filter(status='p') - - def lastmod(self, obj): - return obj.last_modify_time - - -class CategorySiteMap(Sitemap): - changefreq = "Weekly" - priority = "0.6" - - def items(self): - return Category.objects.all() - - def lastmod(self, obj): - return obj.last_modify_time - - -class TagSiteMap(Sitemap): - changefreq = "Weekly" - priority = "0.3" - - def items(self): - return Tag.objects.all() - - def lastmod(self, obj): - return obj.last_modify_time - - -class UserSiteMap(Sitemap): - changefreq = "Weekly" - priority = "0.3" - - def items(self): - return list(set(map(lambda x: x.author, Article.objects.all()))) - - def lastmod(self, obj): - return obj.date_joined diff --git a/src/DjangoBlog/djangoblog/spider_notify.py b/src/DjangoBlog/djangoblog/spider_notify.py deleted file mode 100644 index 7b909e9..0000000 --- a/src/DjangoBlog/djangoblog/spider_notify.py +++ /dev/null @@ -1,21 +0,0 @@ -import logging - -import requests -from django.conf import settings - -logger = logging.getLogger(__name__) - - -class SpiderNotify(): - @staticmethod - def baidu_notify(urls): - try: - data = '\n'.join(urls) - result = requests.post(settings.BAIDU_NOTIFY_URL, data=data) - logger.info(result.text) - except Exception as e: - logger.error(e) - - @staticmethod - def notify(url): - SpiderNotify.baidu_notify(url) diff --git a/src/DjangoBlog/djangoblog/tests.py b/src/DjangoBlog/djangoblog/tests.py deleted file mode 100644 index 01237d9..0000000 --- a/src/DjangoBlog/djangoblog/tests.py +++ /dev/null @@ -1,32 +0,0 @@ -from django.test import TestCase - -from djangoblog.utils import * - - -class DjangoBlogTest(TestCase): - def setUp(self): - pass - - def test_utils(self): - md5 = get_sha256('test') - self.assertIsNotNone(md5) - c = CommonMarkdown.get_markdown(''' - # Title1 - - ```python - import os - ``` - - [url](https://www.lylinux.net/) - - [ddd](http://www.baidu.com) - - - ''') - self.assertIsNotNone(c) - d = { - 'd': 'key1', - 'd2': 'key2' - } - data = parse_dict_to_url(d) - self.assertIsNotNone(data) diff --git a/src/DjangoBlog/djangoblog/urls.py b/src/DjangoBlog/djangoblog/urls.py deleted file mode 100644 index 6a9e1de..0000000 --- a/src/DjangoBlog/djangoblog/urls.py +++ /dev/null @@ -1,78 +0,0 @@ -"""djangoblog URL Configuration - -The `urlpatterns` list routes URLs to views. For more information please see: - https://docs.djangoproject.com/en/1.10/topics/http/urls/ -Examples: -Function views - 1. Add an import: from my_app import views - 2. Add a URL to urlpatterns: url(r'^$', views.home, name='home') -Class-based views - 1. Add an import: from other_app.views import Home - 2. Add a URL to urlpatterns: url(r'^$', Home.as_view(), name='home') -Including another URLconf - 1. Import the include() function: from django.conf.urls import url, include - 2. Add a URL to urlpatterns: url(r'^blog/', include('blog.urls')) -""" -from django.conf import settings -from django.conf.urls.i18n import i18n_patterns -from django.conf.urls.static import static -from django.contrib.sitemaps.views import sitemap -from django.urls import path, include -from django.urls import re_path -from haystack.views import search_view_factory -from django.http import JsonResponse -import time - -from blog.views import EsSearchView -from djangoblog.admin_site import admin_site -from djangoblog.elasticsearch_backend import ElasticSearchModelSearchForm -from djangoblog.feeds import DjangoBlogFeed -from djangoblog.sitemap import ArticleSiteMap, CategorySiteMap, StaticViewSitemap, TagSiteMap, UserSiteMap - -sitemaps = { - - 'blog': ArticleSiteMap, - 'Category': CategorySiteMap, - 'Tag': TagSiteMap, - 'User': UserSiteMap, - 'static': StaticViewSitemap -} - -handler404 = 'blog.views.page_not_found_view' -handler500 = 'blog.views.server_error_view' -handle403 = 'blog.views.permission_denied_view' - - -def health_check(request): - """ - 健康检查接口 - 简单返回服务健康状态 - """ - return JsonResponse({ - 'status': 'healthy', - 'timestamp': time.time() - }) - -urlpatterns = [ - path('i18n/', include('django.conf.urls.i18n')), - path('health/', health_check, name='health_check'), -] -urlpatterns += i18n_patterns( - re_path(r'^admin/', admin_site.urls), - re_path(r'', include('blog.urls', namespace='blog')), - re_path(r'mdeditor/', include('mdeditor.urls')), - re_path(r'', include('comments.urls', namespace='comment')), - re_path(r'', include('accounts.urls', namespace='account')), - re_path(r'', include('oauth.urls', namespace='oauth')), - re_path(r'^sitemap\.xml$', sitemap, {'sitemaps': sitemaps}, - name='django.contrib.sitemaps.views.sitemap'), - re_path(r'^feed/$', DjangoBlogFeed()), - re_path(r'^rss/$', DjangoBlogFeed()), - re_path('^search', search_view_factory(view_class=EsSearchView, form_class=ElasticSearchModelSearchForm), - name='search'), - re_path(r'', include('servermanager.urls', namespace='servermanager')), - re_path(r'', include('owntracks.urls', namespace='owntracks')) - , prefix_default_language=False) + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT) -if settings.DEBUG: - urlpatterns += static(settings.MEDIA_URL, - document_root=settings.MEDIA_ROOT) diff --git a/src/DjangoBlog/djangoblog/utils.py b/src/DjangoBlog/djangoblog/utils.py deleted file mode 100644 index 91d2b91..0000000 --- a/src/DjangoBlog/djangoblog/utils.py +++ /dev/null @@ -1,272 +0,0 @@ -#!/usr/bin/env python -# encoding: utf-8 - - -import logging -import os -import random -import string -import uuid -from hashlib import sha256 - -import bleach -import markdown -import requests -from django.conf import settings -from django.contrib.sites.models import Site -from django.core.cache import cache -from django.templatetags.static import static - -logger = logging.getLogger(__name__) - - -def get_max_articleid_commentid(): - from blog.models import Article - from comments.models import Comment - return (Article.objects.latest().pk, Comment.objects.latest().pk) - - -def get_sha256(str): - m = sha256(str.encode('utf-8')) - return m.hexdigest() - - -def cache_decorator(expiration=3 * 60): - def wrapper(func): - def news(*args, **kwargs): - try: - view = args[0] - key = view.get_cache_key() - except: - key = None - if not key: - unique_str = repr((func, args, kwargs)) - - m = sha256(unique_str.encode('utf-8')) - key = m.hexdigest() - value = cache.get(key) - if value is not None: - # logger.info('cache_decorator get cache:%s key:%s' % (func.__name__, key)) - if str(value) == '__default_cache_value__': - return None - else: - return value - else: - logger.debug( - 'cache_decorator set cache:%s key:%s' % - (func.__name__, key)) - value = func(*args, **kwargs) - if value is None: - cache.set(key, '__default_cache_value__', expiration) - else: - cache.set(key, value, expiration) - return value - - return news - - return wrapper - - -def expire_view_cache(path, servername, serverport, key_prefix=None): - ''' - 刷新视图缓存 - :param path:url路径 - :param servername:host - :param serverport:端口 - :param key_prefix:前缀 - :return:是否成功 - ''' - from django.http import HttpRequest - from django.utils.cache import get_cache_key - - request = HttpRequest() - request.META = {'SERVER_NAME': servername, 'SERVER_PORT': serverport} - request.path = path - - key = get_cache_key(request, key_prefix=key_prefix, cache=cache) - if key: - logger.info('expire_view_cache:get key:{path}'.format(path=path)) - if cache.get(key): - cache.delete(key) - return True - return False - - -@cache_decorator() -def get_current_site(): - site = Site.objects.get_current() - return site - - -class CommonMarkdown: - @staticmethod - def _convert_markdown(value): - md = markdown.Markdown( - extensions=[ - 'extra', - 'codehilite', - 'toc', - 'tables', - ] - ) - body = md.convert(value) - toc = md.toc - return body, toc - - @staticmethod - def get_markdown_with_toc(value): - body, toc = CommonMarkdown._convert_markdown(value) - return body, toc - - @staticmethod - def get_markdown(value): - body, toc = CommonMarkdown._convert_markdown(value) - return body - - -def send_email(emailto, title, content): - from djangoblog.blog_signals import send_email_signal - send_email_signal.send( - send_email.__class__, - emailto=emailto, - title=title, - content=content) - - -def generate_code() -> str: - """生成随机数验证码""" - return ''.join(random.sample(string.digits, 6)) - - -def parse_dict_to_url(dict): - from urllib.parse import quote - url = '&'.join(['{}={}'.format(quote(k, safe='/'), quote(v, safe='/')) - for k, v in dict.items()]) - return url - - -def get_blog_setting(): - value = cache.get('get_blog_setting') - if value: - return value - else: - from blog.models import BlogSettings - if not BlogSettings.objects.count(): - setting = BlogSettings() - setting.site_name = 'djangoblog' - setting.site_description = '基于Django的博客系统' - setting.site_seo_description = '基于Django的博客系统' - setting.site_keywords = 'Django,Python' - setting.article_sub_length = 300 - setting.sidebar_article_count = 10 - setting.sidebar_comment_count = 5 - setting.show_google_adsense = False - setting.open_site_comment = True - setting.analytics_code = '' - setting.beian_code = '' - setting.show_gongan_code = False - setting.comment_need_review = False - setting.save() - value = BlogSettings.objects.first() - logger.info('set cache get_blog_setting') - cache.set('get_blog_setting', value) - return value - - -def save_user_avatar(url): - ''' - 保存用户头像 - :param url:头像url - :return: 本地路径 - ''' - logger.info(url) - - try: - basedir = os.path.join(settings.STATICFILES, 'avatar') - rsp = requests.get(url, timeout=2) - if rsp.status_code == 200: - if not os.path.exists(basedir): - os.makedirs(basedir) - - image_extensions = ['.jpg', '.png', 'jpeg', '.gif'] - isimage = len([i for i in image_extensions if url.endswith(i)]) > 0 - ext = os.path.splitext(url)[1] if isimage else '.jpg' - save_filename = str(uuid.uuid4().hex) + ext - logger.info('保存用户头像:' + basedir + save_filename) - with open(os.path.join(basedir, save_filename), 'wb+') as file: - file.write(rsp.content) - return static('avatar/' + save_filename) - except Exception as e: - logger.error(e) - return static('blog/img/avatar.png') - - -def delete_sidebar_cache(): - from blog.models import LinkShowType - keys = ["sidebar" + x for x in LinkShowType.values] - for k in keys: - logger.info('delete sidebar key:' + k) - cache.delete(k) - - -def delete_view_cache(prefix, keys): - from django.core.cache.utils import make_template_fragment_key - key = make_template_fragment_key(prefix, keys) - cache.delete(key) - - -def get_resource_url(): - if settings.STATIC_URL: - return settings.STATIC_URL - else: - site = get_current_site() - return 'http://' + site.domain + '/static/' - - -ALLOWED_TAGS = ['a', 'abbr', 'acronym', 'b', 'blockquote', 'code', 'em', 'i', 'li', 'ol', 'pre', 'strong', 'ul', 'h1', - 'h2', 'p', 'span', 'div'] - -# 安全的class值白名单 - 只允许代码高亮相关的class -ALLOWED_CLASSES = [ - 'codehilite', 'highlight', 'hll', 'c', 'err', 'k', 'l', 'n', 'o', 'p', 'cm', 'cp', 'c1', 'cs', - 'gd', 'ge', 'gr', 'gh', 'gi', 'go', 'gp', 'gs', 'gu', 'gt', 'kc', 'kd', 'kn', 'kp', 'kr', 'kt', - 'ld', 'm', 'mf', 'mh', 'mi', 'mo', 'na', 'nb', 'nc', 'no', 'nd', 'ni', 'ne', 'nf', 'nl', 'nn', - 'nt', 'nv', 'ow', 'w', 'mb', 'mh', 'mi', 'mo', 'sb', 'sc', 'sd', 'se', 'sh', 'si', 'sx', 's2', - 's1', 'ss', 'bp', 'vc', 'vg', 'vi', 'il' -] - -def class_filter(tag, name, value): - """自定义class属性过滤器""" - if name == 'class': - # 只允许预定义的安全class值 - allowed_classes = [cls for cls in value.split() if cls in ALLOWED_CLASSES] - return ' '.join(allowed_classes) if allowed_classes else False - return value - -# 安全的属性白名单 -ALLOWED_ATTRIBUTES = { - 'a': ['href', 'title'], - 'abbr': ['title'], - 'acronym': ['title'], - 'span': class_filter, - 'div': class_filter, - 'pre': class_filter, - 'code': class_filter -} - -# 安全的协议白名单 - 防止javascript:等危险协议 -ALLOWED_PROTOCOLS = ['http', 'https', 'mailto'] - -def sanitize_html(html): - """ - 安全的HTML清理函数 - 使用bleach库进行白名单过滤,防止XSS攻击 - """ - return bleach.clean( - html, - tags=ALLOWED_TAGS, - attributes=ALLOWED_ATTRIBUTES, - protocols=ALLOWED_PROTOCOLS, # 限制允许的协议 - strip=True, # 移除不允许的标签而不是转义 - strip_comments=True # 移除HTML注释 - ) diff --git a/src/DjangoBlog/djangoblog/whoosh_cn_backend.py b/src/DjangoBlog/djangoblog/whoosh_cn_backend.py deleted file mode 100644 index 04e3f7f..0000000 --- a/src/DjangoBlog/djangoblog/whoosh_cn_backend.py +++ /dev/null @@ -1,1044 +0,0 @@ -# encoding: utf-8 - -from __future__ import absolute_import, division, print_function, unicode_literals - -import json -import os -import re -import shutil -import threading -import warnings - -import six -from django.conf import settings -from django.core.exceptions import ImproperlyConfigured -from datetime import datetime -from django.utils.encoding import force_str -from haystack.backends import BaseEngine, BaseSearchBackend, BaseSearchQuery, EmptyResults, log_query -from haystack.constants import DJANGO_CT, DJANGO_ID, ID -from haystack.exceptions import MissingDependency, SearchBackendError, SkipDocument -from haystack.inputs import Clean, Exact, PythonData, Raw -from haystack.models import SearchResult -from haystack.utils import get_identifier, get_model_ct -from haystack.utils import log as logging -from haystack.utils.app_loading import haystack_get_model -from jieba.analyse import ChineseAnalyzer -from whoosh import index -from whoosh.analysis import StemmingAnalyzer -from whoosh.fields import BOOLEAN, DATETIME, IDLIST, KEYWORD, NGRAM, NGRAMWORDS, NUMERIC, Schema, TEXT -from whoosh.fields import ID as WHOOSH_ID -from whoosh.filedb.filestore import FileStorage, RamStorage -from whoosh.highlight import ContextFragmenter, HtmlFormatter -from whoosh.highlight import highlight as whoosh_highlight -from whoosh.qparser import QueryParser -from whoosh.searching import ResultsPage -from whoosh.writing import AsyncWriter - -try: - import whoosh -except ImportError: - raise MissingDependency( - "The 'whoosh' backend requires the installation of 'Whoosh'. Please refer to the documentation.") - -# Handle minimum requirement. -if not hasattr(whoosh, '__version__') or whoosh.__version__ < (2, 5, 0): - raise MissingDependency( - "The 'whoosh' backend requires version 2.5.0 or greater.") - -# Bubble up the correct error. - -DATETIME_REGEX = re.compile( - '^(?P\d{4})-(?P\d{2})-(?P\d{2})T(?P\d{2}):(?P\d{2}):(?P\d{2})(\.\d{3,6}Z?)?$') -LOCALS = threading.local() -LOCALS.RAM_STORE = None - - -class WhooshHtmlFormatter(HtmlFormatter): - """ - This is a HtmlFormatter simpler than the whoosh.HtmlFormatter. - We use it to have consistent results across backends. Specifically, - Solr, Xapian and Elasticsearch are using this formatting. - """ - template = '<%(tag)s>%(t)s' - - -class WhooshSearchBackend(BaseSearchBackend): - # Word reserved by Whoosh for special use. - RESERVED_WORDS = ( - 'AND', - 'NOT', - 'OR', - 'TO', - ) - - # Characters reserved by Whoosh for special use. - # The '\\' must come first, so as not to overwrite the other slash - # replacements. - RESERVED_CHARACTERS = ( - '\\', '+', '-', '&&', '||', '!', '(', ')', '{', '}', - '[', ']', '^', '"', '~', '*', '?', ':', '.', - ) - - def __init__(self, connection_alias, **connection_options): - super( - WhooshSearchBackend, - self).__init__( - connection_alias, - **connection_options) - self.setup_complete = False - self.use_file_storage = True - self.post_limit = getattr( - connection_options, - 'POST_LIMIT', - 128 * 1024 * 1024) - self.path = connection_options.get('PATH') - - if connection_options.get('STORAGE', 'file') != 'file': - self.use_file_storage = False - - if self.use_file_storage and not self.path: - raise ImproperlyConfigured( - "You must specify a 'PATH' in your settings for connection '%s'." % - connection_alias) - - self.log = logging.getLogger('haystack') - - def setup(self): - """ - Defers loading until needed. - """ - from haystack import connections - new_index = False - - # Make sure the index is there. - if self.use_file_storage and not os.path.exists(self.path): - os.makedirs(self.path) - new_index = True - - if self.use_file_storage and not os.access(self.path, os.W_OK): - raise IOError( - "The path to your Whoosh index '%s' is not writable for the current user/group." % - self.path) - - if self.use_file_storage: - self.storage = FileStorage(self.path) - else: - global LOCALS - - if getattr(LOCALS, 'RAM_STORE', None) is None: - LOCALS.RAM_STORE = RamStorage() - - self.storage = LOCALS.RAM_STORE - - self.content_field_name, self.schema = self.build_schema( - connections[self.connection_alias].get_unified_index().all_searchfields()) - self.parser = QueryParser(self.content_field_name, schema=self.schema) - - if new_index is True: - self.index = self.storage.create_index(self.schema) - else: - try: - self.index = self.storage.open_index(schema=self.schema) - except index.EmptyIndexError: - self.index = self.storage.create_index(self.schema) - - self.setup_complete = True - - def build_schema(self, fields): - schema_fields = { - ID: WHOOSH_ID(stored=True, unique=True), - DJANGO_CT: WHOOSH_ID(stored=True), - DJANGO_ID: WHOOSH_ID(stored=True), - } - # Grab the number of keys that are hard-coded into Haystack. - # We'll use this to (possibly) fail slightly more gracefully later. - initial_key_count = len(schema_fields) - content_field_name = '' - - for field_name, field_class in fields.items(): - if field_class.is_multivalued: - if field_class.indexed is False: - schema_fields[field_class.index_fieldname] = IDLIST( - stored=True, field_boost=field_class.boost) - else: - schema_fields[field_class.index_fieldname] = KEYWORD( - stored=True, commas=True, scorable=True, field_boost=field_class.boost) - elif field_class.field_type in ['date', 'datetime']: - schema_fields[field_class.index_fieldname] = DATETIME( - stored=field_class.stored, sortable=True) - elif field_class.field_type == 'integer': - schema_fields[field_class.index_fieldname] = NUMERIC( - stored=field_class.stored, numtype=int, field_boost=field_class.boost) - elif field_class.field_type == 'float': - schema_fields[field_class.index_fieldname] = NUMERIC( - stored=field_class.stored, numtype=float, field_boost=field_class.boost) - elif field_class.field_type == 'boolean': - # Field boost isn't supported on BOOLEAN as of 1.8.2. - schema_fields[field_class.index_fieldname] = BOOLEAN( - stored=field_class.stored) - elif field_class.field_type == 'ngram': - schema_fields[field_class.index_fieldname] = NGRAM( - minsize=3, maxsize=15, stored=field_class.stored, field_boost=field_class.boost) - elif field_class.field_type == 'edge_ngram': - schema_fields[field_class.index_fieldname] = NGRAMWORDS(minsize=2, maxsize=15, at='start', - stored=field_class.stored, - field_boost=field_class.boost) - else: - # schema_fields[field_class.index_fieldname] = TEXT(stored=True, analyzer=StemmingAnalyzer(), field_boost=field_class.boost, sortable=True) - schema_fields[field_class.index_fieldname] = TEXT( - stored=True, analyzer=ChineseAnalyzer(), field_boost=field_class.boost, sortable=True) - if field_class.document is True: - content_field_name = field_class.index_fieldname - schema_fields[field_class.index_fieldname].spelling = True - - # Fail more gracefully than relying on the backend to die if no fields - # are found. - if len(schema_fields) <= initial_key_count: - raise SearchBackendError( - "No fields were found in any search_indexes. Please correct this before attempting to search.") - - return (content_field_name, Schema(**schema_fields)) - - def update(self, index, iterable, commit=True): - if not self.setup_complete: - self.setup() - - self.index = self.index.refresh() - writer = AsyncWriter(self.index) - - for obj in iterable: - try: - doc = index.full_prepare(obj) - except SkipDocument: - self.log.debug(u"Indexing for object `%s` skipped", obj) - else: - # Really make sure it's unicode, because Whoosh won't have it any - # other way. - for key in doc: - doc[key] = self._from_python(doc[key]) - - # Document boosts aren't supported in Whoosh 2.5.0+. - if 'boost' in doc: - del doc['boost'] - - try: - writer.update_document(**doc) - except Exception as e: - if not self.silently_fail: - raise - - # We'll log the object identifier but won't include the actual object - # to avoid the possibility of that generating encoding errors while - # processing the log message: - self.log.error( - u"%s while preparing object for update" % - e.__class__.__name__, - exc_info=True, - extra={ - "data": { - "index": index, - "object": get_identifier(obj)}}) - - if len(iterable) > 0: - # For now, commit no matter what, as we run into locking issues - # otherwise. - writer.commit() - - def remove(self, obj_or_string, commit=True): - if not self.setup_complete: - self.setup() - - self.index = self.index.refresh() - whoosh_id = get_identifier(obj_or_string) - - try: - self.index.delete_by_query( - q=self.parser.parse( - u'%s:"%s"' % - (ID, whoosh_id))) - except Exception as e: - if not self.silently_fail: - raise - - self.log.error( - "Failed to remove document '%s' from Whoosh: %s", - whoosh_id, - e, - exc_info=True) - - def clear(self, models=None, commit=True): - if not self.setup_complete: - self.setup() - - self.index = self.index.refresh() - - if models is not None: - assert isinstance(models, (list, tuple)) - - try: - if models is None: - self.delete_index() - else: - models_to_delete = [] - - for model in models: - models_to_delete.append( - u"%s:%s" % - (DJANGO_CT, get_model_ct(model))) - - self.index.delete_by_query( - q=self.parser.parse( - u" OR ".join(models_to_delete))) - except Exception as e: - if not self.silently_fail: - raise - - if models is not None: - self.log.error( - "Failed to clear Whoosh index of models '%s': %s", - ','.join(models_to_delete), - e, - exc_info=True) - else: - self.log.error( - "Failed to clear Whoosh index: %s", e, exc_info=True) - - def delete_index(self): - # Per the Whoosh mailing list, if wiping out everything from the index, - # it's much more efficient to simply delete the index files. - if self.use_file_storage and os.path.exists(self.path): - shutil.rmtree(self.path) - elif not self.use_file_storage: - self.storage.clean() - - # Recreate everything. - self.setup() - - def optimize(self): - if not self.setup_complete: - self.setup() - - self.index = self.index.refresh() - self.index.optimize() - - def calculate_page(self, start_offset=0, end_offset=None): - # Prevent against Whoosh throwing an error. Requires an end_offset - # greater than 0. - if end_offset is not None and end_offset <= 0: - end_offset = 1 - - # Determine the page. - page_num = 0 - - if end_offset is None: - end_offset = 1000000 - - if start_offset is None: - start_offset = 0 - - page_length = end_offset - start_offset - - if page_length and page_length > 0: - page_num = int(start_offset / page_length) - - # Increment because Whoosh uses 1-based page numbers. - page_num += 1 - return page_num, page_length - - @log_query - def search( - self, - query_string, - sort_by=None, - start_offset=0, - end_offset=None, - fields='', - highlight=False, - facets=None, - date_facets=None, - query_facets=None, - narrow_queries=None, - spelling_query=None, - within=None, - dwithin=None, - distance_point=None, - models=None, - limit_to_registered_models=None, - result_class=None, - **kwargs): - if not self.setup_complete: - self.setup() - - # A zero length query should return no results. - if len(query_string) == 0: - return { - 'results': [], - 'hits': 0, - } - - query_string = force_str(query_string) - - # A one-character query (non-wildcard) gets nabbed by a stopwords - # filter and should yield zero results. - if len(query_string) <= 1 and query_string != u'*': - return { - 'results': [], - 'hits': 0, - } - - reverse = False - - if sort_by is not None: - # Determine if we need to reverse the results and if Whoosh can - # handle what it's being asked to sort by. Reversing is an - # all-or-nothing action, unfortunately. - sort_by_list = [] - reverse_counter = 0 - - for order_by in sort_by: - if order_by.startswith('-'): - reverse_counter += 1 - - if reverse_counter and reverse_counter != len(sort_by): - raise SearchBackendError("Whoosh requires all order_by fields" - " to use the same sort direction") - - for order_by in sort_by: - if order_by.startswith('-'): - sort_by_list.append(order_by[1:]) - - if len(sort_by_list) == 1: - reverse = True - else: - sort_by_list.append(order_by) - - if len(sort_by_list) == 1: - reverse = False - - sort_by = sort_by_list[0] - - if facets is not None: - warnings.warn( - "Whoosh does not handle faceting.", - Warning, - stacklevel=2) - - if date_facets is not None: - warnings.warn( - "Whoosh does not handle date faceting.", - Warning, - stacklevel=2) - - if query_facets is not None: - warnings.warn( - "Whoosh does not handle query faceting.", - Warning, - stacklevel=2) - - narrowed_results = None - self.index = self.index.refresh() - - if limit_to_registered_models is None: - limit_to_registered_models = getattr( - settings, 'HAYSTACK_LIMIT_TO_REGISTERED_MODELS', True) - - if models and len(models): - model_choices = sorted(get_model_ct(model) for model in models) - elif limit_to_registered_models: - # Using narrow queries, limit the results to only models handled - # with the current routers. - model_choices = self.build_models_list() - else: - model_choices = [] - - if len(model_choices) > 0: - if narrow_queries is None: - narrow_queries = set() - - narrow_queries.add(' OR '.join( - ['%s:%s' % (DJANGO_CT, rm) for rm in model_choices])) - - narrow_searcher = None - - if narrow_queries is not None: - # Potentially expensive? I don't see another way to do it in - # Whoosh... - narrow_searcher = self.index.searcher() - - for nq in narrow_queries: - recent_narrowed_results = narrow_searcher.search( - self.parser.parse(force_str(nq)), limit=None) - - if len(recent_narrowed_results) <= 0: - return { - 'results': [], - 'hits': 0, - } - - if narrowed_results: - narrowed_results.filter(recent_narrowed_results) - else: - narrowed_results = recent_narrowed_results - - self.index = self.index.refresh() - - if self.index.doc_count(): - searcher = self.index.searcher() - parsed_query = self.parser.parse(query_string) - - # In the event of an invalid/stopworded query, recover gracefully. - if parsed_query is None: - return { - 'results': [], - 'hits': 0, - } - - page_num, page_length = self.calculate_page( - start_offset, end_offset) - - search_kwargs = { - 'pagelen': page_length, - 'sortedby': sort_by, - 'reverse': reverse, - } - - # Handle the case where the results have been narrowed. - if narrowed_results is not None: - search_kwargs['filter'] = narrowed_results - - try: - raw_page = searcher.search_page( - parsed_query, - page_num, - **search_kwargs - ) - except ValueError: - if not self.silently_fail: - raise - - return { - 'results': [], - 'hits': 0, - 'spelling_suggestion': None, - } - - # Because as of Whoosh 2.5.1, it will return the wrong page of - # results if you request something too high. :( - if raw_page.pagenum < page_num: - return { - 'results': [], - 'hits': 0, - 'spelling_suggestion': None, - } - - results = self._process_results( - raw_page, - highlight=highlight, - query_string=query_string, - spelling_query=spelling_query, - result_class=result_class) - searcher.close() - - if hasattr(narrow_searcher, 'close'): - narrow_searcher.close() - - return results - else: - if self.include_spelling: - if spelling_query: - spelling_suggestion = self.create_spelling_suggestion( - spelling_query) - else: - spelling_suggestion = self.create_spelling_suggestion( - query_string) - else: - spelling_suggestion = None - - return { - 'results': [], - 'hits': 0, - 'spelling_suggestion': spelling_suggestion, - } - - def more_like_this( - self, - model_instance, - additional_query_string=None, - start_offset=0, - end_offset=None, - models=None, - limit_to_registered_models=None, - result_class=None, - **kwargs): - if not self.setup_complete: - self.setup() - - # Deferred models will have a different class ("RealClass_Deferred_fieldname") - # which won't be in our registry: - model_klass = model_instance._meta.concrete_model - - field_name = self.content_field_name - narrow_queries = set() - narrowed_results = None - self.index = self.index.refresh() - - if limit_to_registered_models is None: - limit_to_registered_models = getattr( - settings, 'HAYSTACK_LIMIT_TO_REGISTERED_MODELS', True) - - if models and len(models): - model_choices = sorted(get_model_ct(model) for model in models) - elif limit_to_registered_models: - # Using narrow queries, limit the results to only models handled - # with the current routers. - model_choices = self.build_models_list() - else: - model_choices = [] - - if len(model_choices) > 0: - if narrow_queries is None: - narrow_queries = set() - - narrow_queries.add(' OR '.join( - ['%s:%s' % (DJANGO_CT, rm) for rm in model_choices])) - - if additional_query_string and additional_query_string != '*': - narrow_queries.add(additional_query_string) - - narrow_searcher = None - - if narrow_queries is not None: - # Potentially expensive? I don't see another way to do it in - # Whoosh... - narrow_searcher = self.index.searcher() - - for nq in narrow_queries: - recent_narrowed_results = narrow_searcher.search( - self.parser.parse(force_str(nq)), limit=None) - - if len(recent_narrowed_results) <= 0: - return { - 'results': [], - 'hits': 0, - } - - if narrowed_results: - narrowed_results.filter(recent_narrowed_results) - else: - narrowed_results = recent_narrowed_results - - page_num, page_length = self.calculate_page(start_offset, end_offset) - - self.index = self.index.refresh() - raw_results = EmptyResults() - - if self.index.doc_count(): - query = "%s:%s" % (ID, get_identifier(model_instance)) - searcher = self.index.searcher() - parsed_query = self.parser.parse(query) - results = searcher.search(parsed_query) - - if len(results): - raw_results = results[0].more_like_this( - field_name, top=end_offset) - - # Handle the case where the results have been narrowed. - if narrowed_results is not None and hasattr(raw_results, 'filter'): - raw_results.filter(narrowed_results) - - try: - raw_page = ResultsPage(raw_results, page_num, page_length) - except ValueError: - if not self.silently_fail: - raise - - return { - 'results': [], - 'hits': 0, - 'spelling_suggestion': None, - } - - # Because as of Whoosh 2.5.1, it will return the wrong page of - # results if you request something too high. :( - if raw_page.pagenum < page_num: - return { - 'results': [], - 'hits': 0, - 'spelling_suggestion': None, - } - - results = self._process_results(raw_page, result_class=result_class) - searcher.close() - - if hasattr(narrow_searcher, 'close'): - narrow_searcher.close() - - return results - - def _process_results( - self, - raw_page, - highlight=False, - query_string='', - spelling_query=None, - result_class=None): - from haystack import connections - results = [] - - # It's important to grab the hits first before slicing. Otherwise, this - # can cause pagination failures. - hits = len(raw_page) - - if result_class is None: - result_class = SearchResult - - facets = {} - spelling_suggestion = None - unified_index = connections[self.connection_alias].get_unified_index() - indexed_models = unified_index.get_indexed_models() - - for doc_offset, raw_result in enumerate(raw_page): - score = raw_page.score(doc_offset) or 0 - app_label, model_name = raw_result[DJANGO_CT].split('.') - additional_fields = {} - model = haystack_get_model(app_label, model_name) - - if model and model in indexed_models: - for key, value in raw_result.items(): - index = unified_index.get_index(model) - string_key = str(key) - - if string_key in index.fields and hasattr( - index.fields[string_key], 'convert'): - # Special-cased due to the nature of KEYWORD fields. - if index.fields[string_key].is_multivalued: - if value is None or len(value) == 0: - additional_fields[string_key] = [] - else: - additional_fields[string_key] = value.split( - ',') - else: - additional_fields[string_key] = index.fields[string_key].convert( - value) - else: - additional_fields[string_key] = self._to_python(value) - - del (additional_fields[DJANGO_CT]) - del (additional_fields[DJANGO_ID]) - - if highlight: - sa = StemmingAnalyzer() - formatter = WhooshHtmlFormatter('em') - terms = [token.text for token in sa(query_string)] - - whoosh_result = whoosh_highlight( - additional_fields.get(self.content_field_name), - terms, - sa, - ContextFragmenter(), - formatter - ) - additional_fields['highlighted'] = { - self.content_field_name: [whoosh_result], - } - - result = result_class( - app_label, - model_name, - raw_result[DJANGO_ID], - score, - **additional_fields) - results.append(result) - else: - hits -= 1 - - if self.include_spelling: - if spelling_query: - spelling_suggestion = self.create_spelling_suggestion( - spelling_query) - else: - spelling_suggestion = self.create_spelling_suggestion( - query_string) - - return { - 'results': results, - 'hits': hits, - 'facets': facets, - 'spelling_suggestion': spelling_suggestion, - } - - def create_spelling_suggestion(self, query_string): - spelling_suggestion = None - reader = self.index.reader() - corrector = reader.corrector(self.content_field_name) - cleaned_query = force_str(query_string) - - if not query_string: - return spelling_suggestion - - # Clean the string. - for rev_word in self.RESERVED_WORDS: - cleaned_query = cleaned_query.replace(rev_word, '') - - for rev_char in self.RESERVED_CHARACTERS: - cleaned_query = cleaned_query.replace(rev_char, '') - - # Break it down. - query_words = cleaned_query.split() - suggested_words = [] - - for word in query_words: - suggestions = corrector.suggest(word, limit=1) - - if len(suggestions) > 0: - suggested_words.append(suggestions[0]) - - spelling_suggestion = ' '.join(suggested_words) - return spelling_suggestion - - def _from_python(self, value): - """ - Converts Python values to a string for Whoosh. - - Code courtesy of pysolr. - """ - if hasattr(value, 'strftime'): - if not hasattr(value, 'hour'): - value = datetime(value.year, value.month, value.day, 0, 0, 0) - elif isinstance(value, bool): - if value: - value = 'true' - else: - value = 'false' - elif isinstance(value, (list, tuple)): - value = u','.join([force_str(v) for v in value]) - elif isinstance(value, (six.integer_types, float)): - # Leave it alone. - pass - else: - value = force_str(value) - return value - - def _to_python(self, value): - """ - Converts values from Whoosh to native Python values. - - A port of the same method in pysolr, as they deal with data the same way. - """ - if value == 'true': - return True - elif value == 'false': - return False - - if value and isinstance(value, six.string_types): - possible_datetime = DATETIME_REGEX.search(value) - - if possible_datetime: - date_values = possible_datetime.groupdict() - - for dk, dv in date_values.items(): - date_values[dk] = int(dv) - - return datetime( - date_values['year'], - date_values['month'], - date_values['day'], - date_values['hour'], - date_values['minute'], - date_values['second']) - - try: - # Attempt to use json to load the values. - converted_value = json.loads(value) - - # Try to handle most built-in types. - if isinstance( - converted_value, - (list, - tuple, - set, - dict, - six.integer_types, - float, - complex)): - return converted_value - except BaseException: - # If it fails (SyntaxError or its ilk) or we don't trust it, - # continue on. - pass - - return value - - -class WhooshSearchQuery(BaseSearchQuery): - def _convert_datetime(self, date): - if hasattr(date, 'hour'): - return force_str(date.strftime('%Y%m%d%H%M%S')) - else: - return force_str(date.strftime('%Y%m%d000000')) - - def clean(self, query_fragment): - """ - Provides a mechanism for sanitizing user input before presenting the - value to the backend. - - Whoosh 1.X differs here in that you can no longer use a backslash - to escape reserved characters. Instead, the whole word should be - quoted. - """ - words = query_fragment.split() - cleaned_words = [] - - for word in words: - if word in self.backend.RESERVED_WORDS: - word = word.replace(word, word.lower()) - - for char in self.backend.RESERVED_CHARACTERS: - if char in word: - word = "'%s'" % word - break - - cleaned_words.append(word) - - return ' '.join(cleaned_words) - - def build_query_fragment(self, field, filter_type, value): - from haystack import connections - query_frag = '' - is_datetime = False - - if not hasattr(value, 'input_type_name'): - # Handle when we've got a ``ValuesListQuerySet``... - if hasattr(value, 'values_list'): - value = list(value) - - if hasattr(value, 'strftime'): - is_datetime = True - - if isinstance(value, six.string_types) and value != ' ': - # It's not an ``InputType``. Assume ``Clean``. - value = Clean(value) - else: - value = PythonData(value) - - # Prepare the query using the InputType. - prepared_value = value.prepare(self) - - if not isinstance(prepared_value, (set, list, tuple)): - # Then convert whatever we get back to what pysolr wants if needed. - prepared_value = self.backend._from_python(prepared_value) - - # 'content' is a special reserved word, much like 'pk' in - # Django's ORM layer. It indicates 'no special field'. - if field == 'content': - index_fieldname = '' - else: - index_fieldname = u'%s:' % connections[self._using].get_unified_index( - ).get_index_fieldname(field) - - filter_types = { - 'content': '%s', - 'contains': '*%s*', - 'endswith': "*%s", - 'startswith': "%s*", - 'exact': '%s', - 'gt': "{%s to}", - 'gte': "[%s to]", - 'lt': "{to %s}", - 'lte': "[to %s]", - 'fuzzy': u'%s~', - } - - if value.post_process is False: - query_frag = prepared_value - else: - if filter_type in [ - 'content', - 'contains', - 'startswith', - 'endswith', - 'fuzzy']: - if value.input_type_name == 'exact': - query_frag = prepared_value - else: - # Iterate over terms & incorportate the converted form of - # each into the query. - terms = [] - - if isinstance(prepared_value, six.string_types): - possible_values = prepared_value.split(' ') - else: - if is_datetime is True: - prepared_value = self._convert_datetime( - prepared_value) - - possible_values = [prepared_value] - - for possible_value in possible_values: - terms.append( - filter_types[filter_type] % - self.backend._from_python(possible_value)) - - if len(terms) == 1: - query_frag = terms[0] - else: - query_frag = u"(%s)" % " AND ".join(terms) - elif filter_type == 'in': - in_options = [] - - for possible_value in prepared_value: - is_datetime = False - - if hasattr(possible_value, 'strftime'): - is_datetime = True - - pv = self.backend._from_python(possible_value) - - if is_datetime is True: - pv = self._convert_datetime(pv) - - if isinstance(pv, six.string_types) and not is_datetime: - in_options.append('"%s"' % pv) - else: - in_options.append('%s' % pv) - - query_frag = "(%s)" % " OR ".join(in_options) - elif filter_type == 'range': - start = self.backend._from_python(prepared_value[0]) - end = self.backend._from_python(prepared_value[1]) - - if hasattr(prepared_value[0], 'strftime'): - start = self._convert_datetime(start) - - if hasattr(prepared_value[1], 'strftime'): - end = self._convert_datetime(end) - - query_frag = u"[%s to %s]" % (start, end) - elif filter_type == 'exact': - if value.input_type_name == 'exact': - query_frag = prepared_value - else: - prepared_value = Exact(prepared_value).prepare(self) - query_frag = filter_types[filter_type] % prepared_value - else: - if is_datetime is True: - prepared_value = self._convert_datetime(prepared_value) - - query_frag = filter_types[filter_type] % prepared_value - - if len(query_frag) and not isinstance(value, Raw): - if not query_frag.startswith('(') and not query_frag.endswith(')'): - query_frag = "(%s)" % query_frag - - return u"%s%s" % (index_fieldname, query_frag) - - # if not filter_type in ('in', 'range'): - # # 'in' is a bit of a special case, as we don't want to - # # convert a valid list/tuple to string. Defer handling it - # # until later... - # value = self.backend._from_python(value) - - -class WhooshEngine(BaseEngine): - backend = WhooshSearchBackend - query = WhooshSearchQuery diff --git a/src/DjangoBlog/djangoblog/wsgi.py b/src/DjangoBlog/djangoblog/wsgi.py deleted file mode 100644 index 2295efd..0000000 --- a/src/DjangoBlog/djangoblog/wsgi.py +++ /dev/null @@ -1,16 +0,0 @@ -""" -WSGI config for djangoblog 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/1.10/howto/deployment/wsgi/ -""" - -import os - -from django.core.wsgi import get_wsgi_application - -os.environ.setdefault("DJANGO_SETTINGS_MODULE", "djangoblog.settings") - -application = get_wsgi_application() diff --git a/src/DjangoBlog/docs/README-en.md b/src/DjangoBlog/docs/README-en.md deleted file mode 100644 index 37ea069..0000000 --- a/src/DjangoBlog/docs/README-en.md +++ /dev/null @@ -1,158 +0,0 @@ -# DjangoBlog - -

- Django CI - CodeQL - codecov - license -

- -

- A powerful, elegant, and modern blog system. -
- English简体中文 -

- ---- - -DjangoBlog is a high-performance blog platform built with Python 3.10 and Django 4.0. It not only provides all the core functionalities of a traditional blog but also features a flexible plugin system, allowing you to easily extend and customize your website. Whether you are a personal blogger, a tech enthusiast, or a content creator, DjangoBlog aims to provide a stable, efficient, and easy-to-maintain environment for writing and publishing. - -## ✨ Features - -- **Powerful Content Management**: Full support for managing articles, standalone pages, categories, and tags. Comes with a powerful built-in Markdown editor with syntax highlighting. -- **Full-Text Search**: Integrated search engine for fast and accurate content searching. -- **Interactive Comment System**: Supports replies, email notifications, and Markdown formatting in comments. -- **Flexible Sidebar**: Customizable modules for displaying recent articles, most viewed posts, tag cloud, and more. -- **Social Login**: Built-in OAuth support, with integrations for Google, GitHub, Facebook, Weibo, QQ, and other major platforms. -- **High-Performance Caching**: Native support for Redis caching with an automatic refresh mechanism to ensure high-speed website responses. -- **SEO Friendly**: Basic SEO features are included, with automatic notifications to Google and Baidu upon new content publication. -- **Extensible Plugin System**: Extend blog functionalities by creating standalone plugins, ensuring decoupled and maintainable code. We have already implemented features like view counting and SEO optimization through plugins! -- **Integrated Image Hosting**: A simple, built-in image hosting feature for easy uploads and management. -- **Automated Frontend**: Integrated with `django-compressor` to automatically compress and optimize CSS and JavaScript files. -- **Robust Operations**: Built-in email notifications for website exceptions and management capabilities through a WeChat Official Account. - -## 🛠️ Tech Stack - -- **Backend**: Python 3.10, Django 4.0 -- **Database**: MySQL, SQLite (configurable) -- **Cache**: Redis -- **Frontend**: HTML5, CSS3, JavaScript -- **Search**: Whoosh, Elasticsearch (configurable) -- **Editor**: Markdown (mdeditor) - -## 🚀 Getting Started - -### 1. Prerequisites - -Ensure you have Python 3.10+ and MySQL/MariaDB installed on your system. - -### 2. Clone & Installation - -```bash -# Clone the project to your local machine -git clone https://github.com/liangliangyy/DjangoBlog.git -cd DjangoBlog - -# Install dependencies -pip install -r requirements.txt -``` - -### 3. Project Configuration - -- **Database**: - Open `djangoblog/settings.py`, locate the `DATABASES` section, and update it with your MySQL connection details. - - ```python - DATABASES = { - 'default': { - 'ENGINE': 'django.db.backends.mysql', - 'NAME': 'djangoblog', - 'USER': 'root', - 'PASSWORD': 'your_password', - 'HOST': '127.0.0.1', - 'PORT': 3306, - } - } - ``` - Create the database in MySQL: - ```sql - CREATE DATABASE `djangoblog` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - ``` - -- **More Configurations**: - For advanced settings such as email, OAuth, caching, and more, please refer to our [Detailed Configuration Guide](/docs/config-en.md). - -### 4. Database Initialization - -```bash -python manage.py makemigrations -python manage.py migrate - -# Create a superuser account -python manage.py createsuperuser -``` - -### 5. Running the Project - -```bash -# (Optional) Generate some test data -python manage.py create_testdata - -# (Optional) Collect and compress static files -python manage.py collectstatic --noinput -python manage.py compress --force - -# Start the development server -python manage.py runserver -``` - -Now, open your browser and navigate to `http://127.0.0.1:8000/`. You should see the DjangoBlog homepage! - -## Deployment - -- **Traditional Deployment**: A detailed guide for server deployment is available here: [Deployment Tutorial](https://www.lylinux.net/article/2019/8/5/58.html) (in Chinese). -- **Docker Deployment**: This project fully supports Docker. If you are familiar with containerization, please refer to the [Docker Deployment Guide](/docs/docker-en.md) for a quick start. -- **Kubernetes Deployment**: We also provide a complete [Kubernetes Deployment Guide](/docs/k8s-en.md) to help you go cloud-native easily. - -## 🧩 Plugin System - -The plugin system is a core feature of DjangoBlog. It allows you to add new functionalities to your blog without modifying the core codebase by writing standalone plugins. - -- **How it Works**: Plugins operate by registering callback functions to predefined "hooks". For instance, when an article is rendered, the `after_article_body_get` hook is triggered, and all functions registered to this hook are executed. -- **Existing Plugins**: Features like `view_count` and `seo_optimizer` are implemented through this plugin system. -- **Develop Your Own Plugin**: Simply create a new folder under the `plugins` directory and write your `plugin.py`. We welcome you to explore and contribute your creative ideas to the DjangoBlog community! - -## 🤝 Contributing - -We warmly welcome contributions of any kind! If you have great ideas or have found a bug, please feel free to open an issue or submit a pull request. - -## 📄 License - -This project is open-sourced under the [MIT License](LICENSE). - ---- - -## ❤️ Support & Sponsorship - -If you find this project helpful and wish to support its continued maintenance and development, please consider buying me a coffee! Your support is my greatest motivation. - -

- Alipay Sponsorship - WeChat Sponsorship -

-

- (Left) Alipay / (Right) WeChat -

- -## 🙏 Acknowledgements - -A special thanks to **JetBrains** for providing a free open-source license for this project. - -

- - JetBrains Logo - -

- ---- -> If this project has helped you, please leave your website URL [here](https://github.com/liangliangyy/DjangoBlog/issues/214) to let more people see it. Your feedback is the driving force for my continued updates and maintenance. diff --git a/src/DjangoBlog/docs/config-en.md b/src/DjangoBlog/docs/config-en.md deleted file mode 100644 index b877efb..0000000 --- a/src/DjangoBlog/docs/config-en.md +++ /dev/null @@ -1,64 +0,0 @@ -# Introduction to main features settings - -## Cache: -Cache using `memcache` for default. If you don't have `memcache` environment, you can remove the `default` setting in `CACHES` and change `locmemcache` to `default`. -```python -CACHES = { - 'default': { - 'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache', - 'LOCATION': '127.0.0.1:11211', - 'KEY_PREFIX': 'django_test' if TESTING else 'djangoblog', - 'TIMEOUT': 60 * 60 * 10 - }, - 'locmemcache': { - 'BACKEND': 'django.core.cache.backends.locmem.LocMemCache', - 'TIMEOUT': 10800, - 'LOCATION': 'unique-snowflake', - } -} -``` - -## OAuth Login: -QQ, Weibo, Google, GitHub and Facebook are now supported for OAuth login. Fetch OAuth login permissions from the corresponding open platform, and save them with `appkey`, `appsecret` and callback address in **Backend->OAuth** configuration. - -### Callback address examples: -QQ: http://your-domain-name/oauth/authorize?type=qq -Weibo: http://your-domain-name/oauth/authorize?type=weibo -type is in the type field of `oauthmanager`. - -## owntracks: -owntracks is a location tracking application. It will send your locaiton to the server by timing.Simple support owntracks features. Just install owntracks app and set api address as `your-domain-name/owntracks/logtracks`. Visit `your-domain-name/owntracks/show_dates` and you will see the date with latitude and langitude, click it and see the motion track. The map is drawn by AMap. - -## Email feature: -Same as before, Configure your own error msg recvie email information with`ADMINS = [('liangliang', 'liangliangyy@gmail.com')]` in `settings.py`. And modify: -```python -EMAIL_HOST = 'smtp.zoho.com' -EMAIL_PORT = 587 -EMAIL_HOST_USER = os.environ.get('DJANGO_EMAIL_USER') -EMAIL_HOST_PASSWORD = os.environ.get('DJANGO_EMAIL_PASSWORD') -DEFAULT_FROM_EMAIL = EMAIL_HOST_USER -SERVER_EMAIL = os.environ.get('DJANGO_EMAIL_USER') -``` -with your email account information. - -## WeChat Official Account -Simple wechat official account features integrated. Set token as `your-domain-name/robot` in wechat backend. Default token is `lylinux`, you can change it to your own in `servermanager/robot.py`. Add a new command in `Backend->Servermanager->command`, in this way, you can manage the system through wechat official account. - -## Introduction to website configuration -You can add website configuration in **Backend->BLOG->WebSiteConfiguration**. Such as: keywords, description, Google Ad, website stats code, case number, etc. -OAuth user avatar path is saved in *StaticFileSavedAddress*. Please input absolute path, code directory for default. - -## Source code highlighting -If the code block in your article didn't show hightlight, please write the code blocks as following: - -![](https://resource.lylinux.net/image/codelang.png) - -That is, you should add the corresponding language name before the code block. - -## Update -If you get errors as following while executing database migrations: -```python -django.db.migrations.exceptions.MigrationSchemaMissing: Unable to create the django_migrations table ((1064, "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '(6) NOT NULL)' at line 1")) -``` -This problem may cause by the mysql version under 5.6, a new version( >= 5.6 ) mysql is needed. - diff --git a/src/DjangoBlog/docs/config.md b/src/DjangoBlog/docs/config.md deleted file mode 100644 index 24673a3..0000000 --- a/src/DjangoBlog/docs/config.md +++ /dev/null @@ -1,58 +0,0 @@ -# 主要功能配置介绍: - -## 缓存: -缓存默认使用`localmem`缓存,如果你有`redis`环境,可以设置`DJANGO_REDIS_URL`环境变量,则会自动使用该redis来作为缓存,或者你也可以直接修改如下代码来使用。 -https://github.com/liangliangyy/DjangoBlog/blob/ffcb2c3711de805f2067dd3c1c57449cd24d84ee/djangoblog/settings.py#L185-L199 - - -## oauth登录: - -现在已经支持QQ,微博,Google,GitHub,Facebook登录,需要在其对应的开放平台申请oauth登录权限,然后在 -**后台->Oauth** 配置中新增配置,填写对应的`appkey`和`appsecret`以及回调地址。 -### 回调地址示例: -qq:http://你的域名/oauth/authorize?type=qq -微博:http://你的域名/oauth/authorize?type=weibo -type对应在`oauthmanager`中的type字段。 - -## owntracks: -owntracks是一个位置追踪软件,可以定时的将你的坐标提交到你的服务器上,现在简单的支持owntracks功能,需要安装owntracks的app,然后将api地址设置为: -`你的域名/owntracks/logtracks`就可以了。然后访问`你的域名/owntracks/show_dates`就可以看到有经纬度记录的日期,点击之后就可以看到运动轨迹了。地图是使用高德地图绘制。 - -## 邮件功能: -同样,将`settings.py`中的`ADMINS = [('liangliang', 'liangliangyy@gmail.com')]`配置为你自己的错误接收邮箱,另外修改: -```python -EMAIL_HOST = 'smtp.zoho.com' -EMAIL_PORT = 587 -EMAIL_HOST_USER = os.environ.get('DJANGO_EMAIL_USER') -EMAIL_HOST_PASSWORD = os.environ.get('DJANGO_EMAIL_PASSWORD') -DEFAULT_FROM_EMAIL = EMAIL_HOST_USER -SERVER_EMAIL = os.environ.get('DJANGO_EMAIL_USER') -``` -为你自己的邮箱配置。 - -## 微信公众号 -集成了简单的微信公众号功能,在微信后台将token地址设置为:`你的域名/robot` 即可,默认token为`lylinux`,当然你可以修改为你自己的,在`servermanager/robot.py`中。 -然后在**后台->Servermanager->命令**中新增命令,这样就可以使用微信公众号来管理了。 -## 网站配置介绍 -在**后台->BLOG->网站配置**中,可以新增网站配置,比如关键字,描述等,以及谷歌广告,网站统计代码及备案号等等。 -其中的*静态文件保存地址*是保存oauth用户登录的头像路径,填写绝对路径,默认是代码目录。 -## 代码高亮 -如果你发现你文章的代码没有高亮,请这样书写代码块: - -![](https://resource.lylinux.net/image/codelang.png) - - -也就是说,需要在代码块开始位置加入这段代码对应的语言。 - -## update -如果你发现执行数据库迁移的时候出现如下报错: -```python -django.db.migrations.exceptions.MigrationSchemaMissing: Unable to create the django_migrations table ((1064, "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '(6) NOT NULL)' at line 1")) -``` -可能是因为你的mysql版本低于5.6,需要升级mysql版本>=5.6即可。 - - -django 4.0登录可能会报错CSRF,需要配置下`settings.py`中的`CSRF_TRUSTED_ORIGINS` - -https://github.com/liangliangyy/DjangoBlog/blob/master/djangoblog/settings.py#L39 - diff --git a/src/DjangoBlog/docs/docker-en.md b/src/DjangoBlog/docs/docker-en.md deleted file mode 100644 index 8d5d59e..0000000 --- a/src/DjangoBlog/docs/docker-en.md +++ /dev/null @@ -1,114 +0,0 @@ -# Deploying DjangoBlog with Docker - -![Docker Pulls](https://img.shields.io/docker/pulls/liangliangyy/djangoblog) -![Docker Image Version (latest by date)](https://img.shields.io/docker/v/liangliangyy/djangoblog?sort=date) -![Docker Image Size (latest by date)](https://img.shields.io/docker/image-size/liangliangyy/djangoblog) - -This project fully supports containerized deployment using Docker, providing you with a fast, consistent, and isolated runtime environment. We recommend using `docker-compose` to launch the entire blog service stack with a single command. - -## 1. Prerequisites - -Before you begin, please ensure you have the following software installed on your system: -- [Docker Engine](https://docs.docker.com/engine/install/) -- [Docker Compose](https://docs.docker.com/compose/install/) (Included with Docker Desktop for Mac and Windows) - -## 2. Recommended Method: Using `docker-compose` (One-Click Deployment) - -This is the simplest and most recommended way to deploy. It automatically creates and manages the Django application, a MySQL database, and an optional Elasticsearch service for you. - -### Step 1: Start the Basic Services - -From the project's root directory, run the following command: - -```bash -# Build and start the containers in detached mode (includes Django app and MySQL) -docker-compose up -d --build -``` - -`docker-compose` will read the `docker-compose.yml` file, pull the necessary images, build the project image, and start all services. - -- **Access Your Blog**: Once the services are up, you can access the blog by navigating to `http://127.0.0.1` in your browser. -- **Data Persistence**: MySQL data files will be stored in the `data/mysql` directory within the project root, ensuring that your data persists across container restarts. - -### Step 2: (Optional) Enable Elasticsearch for Full-Text Search - -If you want to use Elasticsearch for more powerful full-text search capabilities, you can include the `docker-compose.es.yml` configuration file: - -```bash -# Build and start all services in detached mode (Django, MySQL, Elasticsearch) -docker-compose -f docker-compose.yml -f deploy/docker-compose/docker-compose.es.yml up -d --build -``` -- **Data Persistence**: Elasticsearch data will be stored in the `data/elasticsearch` directory. - -### Step 3: First-Time Initialization - -After the containers start for the first time, you'll need to execute some initialization commands inside the application container. - -```bash -# Get a shell inside the djangoblog application container (named 'web') -docker-compose exec web bash - -# Inside the container, run the following commands: -# Create a superuser account (follow the prompts to set username, email, and password) -python manage.py createsuperuser - -# (Optional) Create some test data -python manage.py create_testdata - -# (Optional, if ES is enabled) Create the search index -python manage.py rebuild_index - -# Exit the container -exit -``` - -## 3. Alternative Method: Using the Standalone Docker Image - -If you already have an external MySQL database running, you can run the DjangoBlog application image by itself. - -```bash -# Pull the latest image from Docker Hub -docker pull liangliangyy/djangoblog:latest - -# Run the container and connect it to your external database -docker run -d \ - -p 8000:8000 \ - -e DJANGO_SECRET_KEY='your-strong-secret-key' \ - -e DJANGO_MYSQL_HOST='your-mysql-host' \ - -e DJANGO_MYSQL_USER='your-mysql-user' \ - -e DJANGO_MYSQL_PASSWORD='your-mysql-password' \ - -e DJANGO_MYSQL_DATABASE='djangoblog' \ - --name djangoblog \ - liangliangyy/djangoblog:latest -``` - -- **Access Your Blog**: After startup, visit `http://127.0.0.1:8000`. -- **Create Superuser**: `docker exec -it djangoblog python manage.py createsuperuser` - -## 4. Configuration (Environment Variables) - -Most of the project's configuration is managed through environment variables. You can modify them in the `docker-compose.yml` file or pass them using the `-e` flag with the `docker run` command. - -| Environment Variable | Default/Example Value | Notes | -|---------------------------|--------------------------------------------------------------------------|---------------------------------------------------------------------| -| `DJANGO_SECRET_KEY` | `your-strong-secret-key` | **Must be changed to a random, complex string!** | -| `DJANGO_DEBUG` | `False` | Toggles Django's debug mode. | -| `DJANGO_MYSQL_HOST` | `mysql` | Database hostname. | -| `DJANGO_MYSQL_PORT` | `3306` | Database port. | -| `DJANGO_MYSQL_DATABASE` | `djangoblog` | Database name. | -| `DJANGO_MYSQL_USER` | `root` | Database username. | -| `DJANGO_MYSQL_PASSWORD` | `djangoblog_123` | Database password. | -| `DJANGO_REDIS_URL` | `redis:6379/0` | Redis connection URL (for caching). | -| `DJANGO_ELASTICSEARCH_HOST`| `elasticsearch:9200` | Elasticsearch host address. | -| `DJANGO_EMAIL_HOST` | `smtp.example.org` | Email server address. | -| `DJANGO_EMAIL_PORT` | `465` | Email server port. | -| `DJANGO_EMAIL_USER` | `user@example.org` | Email account username. | -| `DJANGO_EMAIL_PASSWORD` | `your-email-password` | Email account password. | -| `DJANGO_EMAIL_USE_SSL` | `True` | Whether to use SSL. | -| `DJANGO_EMAIL_USE_TLS` | `False` | Whether to use TLS. | -| `DJANGO_ADMIN_EMAIL` | `admin@example.org` | Admin email for receiving error reports. | -| `DJANGO_BAIDU_NOTIFY_URL` | `http://data.zz.baidu.com/...` | Push API from [Baidu Webmaster Tools](https://ziyuan.baidu.com/linksubmit/index). | - ---- - -After deployment, please review and adjust these environment variables according to your needs, especially `DJANGO_SECRET_KEY` and the database and email settings. \ No newline at end of file diff --git a/src/DjangoBlog/docs/docker.md b/src/DjangoBlog/docs/docker.md deleted file mode 100644 index e7c255a..0000000 --- a/src/DjangoBlog/docs/docker.md +++ /dev/null @@ -1,114 +0,0 @@ -# 使用 Docker 部署 DjangoBlog - -![Docker Pulls](https://img.shields.io/docker/pulls/liangliangyy/djangoblog) -![Docker Image Version (latest by date)](https://img.shields.io/docker/v/liangliangyy/djangoblog?sort=date) -![Docker Image Size (latest by date)](https://img.shields.io/docker/image-size/liangliangyy/djangoblog) - -本项目全面支持使用 Docker 进行容器化部署,为您提供了快速、一致且隔离的运行环境。我们推荐使用 `docker-compose` 来一键启动整个博客服务栈。 - -## 1. 环境准备 - -在开始之前,请确保您的系统中已经安装了以下软件: -- [Docker Engine](https://docs.docker.com/engine/install/) -- [Docker Compose](https://docs.docker.com/compose/install/) (对于 Docker Desktop 用户,它已内置) - -## 2. 推荐方式:使用 `docker-compose` (一键部署) - -这是最简单、最推荐的部署方式。它会自动为您创建并管理 Django 应用、MySQL 数据库,以及可选的 Elasticsearch 服务。 - -### 步骤 1: 启动基础服务 - -在项目根目录下,执行以下命令: - -```bash -# 构建并以后台模式启动容器 (包含 Django 应用和 MySQL) -docker-compose up -d --build -``` - -`docker-compose` 会读取 `docker-compose.yml` 文件,自动拉取所需镜像、构建项目镜像,并启动所有服务。 - -- **访问您的博客**: 服务启动后,在浏览器中访问 `http://127.0.0.1` 即可看到博客首页。 -- **数据持久化**: MySQL 的数据文件将存储在项目根目录下的 `data/mysql` 文件夹中,确保数据在容器重启后不丢失。 - -### 步骤 2: (可选) 启用 Elasticsearch 全文搜索 - -如果您希望使用 Elasticsearch 提供更强大的全文搜索功能,可以额外加载 `docker-compose.es.yml` 配置文件: - -```bash -# 构建并以后台模式启动所有服务 (Django, MySQL, Elasticsearch) -docker-compose -f docker-compose.yml -f deploy/docker-compose/docker-compose.es.yml up -d --build -``` -- **数据持久化**: Elasticsearch 的数据将存储在 `data/elasticsearch` 文件夹中。 - -### 步骤 3: 首次运行的初始化操作 - -当容器首次启动后,您需要进入容器来执行一些初始化命令。 - -```bash -# 进入 djangoblog 应用容器 -docker-compose exec web bash - -# 在容器内执行以下命令: -# 创建超级管理员账户 (请按照提示设置用户名、邮箱和密码) -python manage.py createsuperuser - -# (可选) 创建一些测试数据 -python manage.py create_testdata - -# (可选,如果启用了 ES) 创建索引 -python manage.py rebuild_index - -# 退出容器 -exit -``` - -## 3. 备选方式:使用独立的 Docker 镜像 - -如果您已经拥有一个正在运行的外部 MySQL 数据库,您也可以只运行 DjangoBlog 的应用镜像。 - -```bash -# 从 Docker Hub 拉取最新镜像 -docker pull liangliangyy/djangoblog:latest - -# 运行容器,并链接到您的外部数据库 -docker run -d \ - -p 8000:8000 \ - -e DJANGO_SECRET_KEY='your-strong-secret-key' \ - -e DJANGO_MYSQL_HOST='your-mysql-host' \ - -e DJANGO_MYSQL_USER='your-mysql-user' \ - -e DJANGO_MYSQL_PASSWORD='your-mysql-password' \ - -e DJANGO_MYSQL_DATABASE='djangoblog' \ - --name djangoblog \ - liangliangyy/djangoblog:latest -``` - -- **访问您的博客**: 启动完成后,访问 `http://127.0.0.1:8000`。 -- **创建管理员**: `docker exec -it djangoblog python manage.py createsuperuser` - -## 4. 配置说明 (环境变量) - -本项目的大部分配置都通过环境变量来管理。您可以在 `docker-compose.yml` 文件中修改它们,或者在使用 `docker run` 命令时通过 `-e` 参数传入。 - -| 环境变量名称 | 默认值/示例 | 备注 | -|-------------------------|--------------------------------------------------------------------------|---------------------------------------------------------------------| -| `DJANGO_SECRET_KEY` | `your-strong-secret-key` | **请务必修改为一个随机且复杂的字符串!** | -| `DJANGO_DEBUG` | `False` | 是否开启 Django 的调试模式 | -| `DJANGO_MYSQL_HOST` | `mysql` | 数据库主机名 | -| `DJANGO_MYSQL_PORT` | `3306` | 数据库端口 | -| `DJANGO_MYSQL_DATABASE` | `djangoblog` | 数据库名称 | -| `DJANGO_MYSQL_USER` | `root` | 数据库用户名 | -| `DJANGO_MYSQL_PASSWORD` | `djangoblog_123` | 数据库密码 | -| `DJANGO_REDIS_URL` | `redis:6379/0` | Redis 连接地址 (用于缓存) | -| `DJANGO_ELASTICSEARCH_HOST` | `elasticsearch:9200` | Elasticsearch 主机地址 | -| `DJANGO_EMAIL_HOST` | `smtp.example.org` | 邮件服务器地址 | -| `DJANGO_EMAIL_PORT` | `465` | 邮件服务器端口 | -| `DJANGO_EMAIL_USER` | `user@example.org` | 邮件账户 | -| `DJANGO_EMAIL_PASSWORD` | `your-email-password` | 邮件密码 | -| `DJANGO_EMAIL_USE_SSL` | `True` | 是否使用 SSL | -| `DJANGO_EMAIL_USE_TLS` | `False` | 是否使用 TLS | -| `DJANGO_ADMIN_EMAIL` | `admin@example.org` | 接收异常报告的管理员邮箱 | -| `DJANGO_BAIDU_NOTIFY_URL` | `http://data.zz.baidu.com/...` | [百度站长平台](https://ziyuan.baidu.com/linksubmit/index) 的推送接口 | - ---- - -部署完成后,请务必检查并根据您的实际需求调整这些环境变量,特别是 `DJANGO_SECRET_KEY` 和数据库、邮件相关的配置。 diff --git a/src/DjangoBlog/docs/es.md b/src/DjangoBlog/docs/es.md deleted file mode 100644 index 97226c5..0000000 --- a/src/DjangoBlog/docs/es.md +++ /dev/null @@ -1,28 +0,0 @@ -# 集成Elasticsearch -如果你已经有了`Elasticsearch`环境,那么可以将搜索从`Whoosh`换成`Elasticsearch`,集成方式也很简单, -首先需要注意如下几点: -1. 你的`Elasticsearch`支持`ik`中文分词 -2. 你的`Elasticsearch`版本>=7.3.0 - -接下来在`settings.py`做如下改动即可: -- 增加es链接,如下所示: -```python -ELASTICSEARCH_DSL = { - 'default': { - 'hosts': '127.0.0.1:9200' - }, -} -``` -- 修改`HAYSTACK`配置: -```python -HAYSTACK_CONNECTIONS = { - 'default': { - 'ENGINE': 'djangoblog.elasticsearch_backend.ElasticSearchEngine', - }, -} -``` -然后终端执行: -```shell script -./manage.py build_index -``` -这将会在你的es中创建两个索引,分别是`blog`和`performance`,其中`blog`索引就是搜索所使用的,而`performance`会记录每个请求的响应时间,以供将来优化使用。 \ No newline at end of file diff --git a/src/DjangoBlog/docs/imgs/alipay.jpg b/src/DjangoBlog/docs/imgs/alipay.jpg deleted file mode 100644 index 424d70a2ffbb629b481e0c27d72d6076727e8041..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17961 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⁡O0bI!3Bi@jSTgKn>Bg&Q53II7XEA`NhoOY$25L(eK?<1>~>hujoRs}yUHVX zQTt}~MN1Zw0!xe7-aUbnm3fxd*KjwLLobx-SSZdGT`vUtB-=hS^~#Rs9K<#Wao{Zp z{kmB)_tVwwglj-W2qla4$Dx zz53|611jp`Ro8}#TnY+1OdA}SN;lGY+!=)=QY;q0b}yA~i0O^|s1#r34{5DET&Qh` z+yAF+h#H($?p6{{X zz@F@jlhUjuyW%|!{Q!~$q>$)y1Hsl$FMYS;#r=c7U7SN-8Uv-lv<@mZOXKOlXLy4C z3v?;Yh1KbtsO!ynC%cyr-`4MR8{Y~e28GXK7yRZ9{3d5(xoP=XYdX*Uy?#pU$a5>& z`JUOV_ zRl}`OH8`y;U%XD+MFBD!HxL@B`JSH_G!;0V9-A+_4Hhf%=wJ%txE{qNaHkfkLsS+h zfe@JrYreKrFKhU2`1kD)K_#LCd!v$sI$is2ee^7Am=@kq2Z-`cU(l{<8*ON_J?@@& zOR+4E3%sN-vIK-%81R}RdPK$bCrBoGF zRu$>N^0s*R^!6R919|j@|cY|A}(o`$`Onha=;(7(EQNg;0 z^sK+j)DQ>i-wCKpkXH^lH{QNw|FWJ%bUle^xtPfLdv#(gNpA7lv59GyIOXp*E+vz_!y|AkM=lB7mYXSWGfxr6#WlV5UW{v7tVn1!e zwg=v}kG!o+0qXfY-FyUozk}%&PS$ZRL^NoDuz%nVw(p)FVMPG6Ph*mgs4z0~C)P`9 zWsg_X!-)T2FkH=VqaRBu8Zkq=AX6oLSWpg(yQ^NIftdmxjx diff --git a/src/DjangoBlog/docs/imgs/pycharm_logo.png b/src/DjangoBlog/docs/imgs/pycharm_logo.png deleted file mode 100644 index 7f2a4b0ea66469bd218774de8cb3027a9c18b84d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 132045 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 z z+`WHBI|y)G#76KRN|andv%%ujsmfpp;p07y_gAh{5LNg-QsIHdoXBT~9pc|$`1gRx zt?XW7MKpl<#5Sh*J_o`~OUQ^>-dvvt?IY+a$0rxCfU1mdIsi?en_^K^9M`P83uSR0QuotQ4xbvJASm#%5B5LEa&_fFk@>Y`hfZ;pK| z=Z(*TpJyOOxNo%B6)UCgPj?dU1d8_O&|bjrS)&W;`6TlP3@HfgYp}EXg)dy`y7}Q6 zObj4kVtgY7NzCJbVkW(rZQr)1LF#=VrYbF^9p}ErvwAjr_|@Ti|20F!7A#W(n>mK5 zWTO7uSFa>E<4H~S`suDZ68xZvI}Y2&n`-MfB*4_6vVGo})uc?sC^+-n7DjA!R`5gx^bs=f^oyHXb4*o;&X9a(=`501f=O?jUw*yYd}>7Ky^XC(|#d90* z|9jP;{od?SrJdRL+5cnffmGe0#)^U*-w9gWY7NABuEq7{u%@tZ^pRP3Zy-t9PLAs`*E@U_tGLysl7<90>1;BQziHK@MoZ2#UeWG* zG`ci>A8+vA@US8EKkj1YeP2)y{*M)|Y~E8Snty&q#3X0sFv93nyuwp4VKy{*+l4OFLaQa)Y4Uy3)<3oAQzU{mbn2KGsMh%2D zo*r-*46(WXW8)~m+vVA*K^J12CM9x~35%$mO!J$L!{LnT=Y3v28{&MOC#ugc+Gq@O zh|2cwLq%~b$n*Z4A#%k|OMM}`NV=MO579NX; zjx;qo-DnIsa{li%Y&y-|VGRgCKO3{rDFr92M2=BXc4;ar1-Sw?OK{~V+0!ui3YRSP z?;cUD{}LB|shNC{Am{7R(?%bBKhkq4h-doEDZe>N9E5AzLDFzygJeZ>AgyA0|J0t# zsbLzKH}hNQ2Ule?4!NEOyk9w3{8)^$(<0=SKmai(xc{4gKnS6VQ=7f{)Xr8p-x_J0 z?Yh_CEvmR=rma*q zy}AseA{r(OJIz(q-nds0Bo5K|OpSxCNA-)7skvpz&Yvx`gs+mNl7-yK8=QDR@k<7s;sPhSYXZ;WJZAi8Sy-M1+7-`}#|eYLU6 zzeVg>+yA9}?b~lY_M|xxxUd@$Qc`B4Le4fo*)laqU+{ z6C%SkFC@c|wbO4ZX2F3nYRJ`WGwI0if?68rxPvB92Srxt2&ISlI<9R!fgfKyGnB}M z-o&-l$6*ecQd$^Vp~ddO@y^ z%1ZXu+Yk~BWQ&Tj$sV`N%DR$0ZuZ_6xm^Cw_j2)f&U?;#-t*q??>nCF^L@tW`8+iE zWOWtHVaqGKPQ(W?pNucKZ+M$5NvtS$!S|3V^KNalTx8vL;ihje|GddEcB#lUNvdQR z*lnwJT@9Dq?m-Cnqpq}=`{(WW(aKdx==l#BmLS()qD2l^J2hyT%==pp@GJvDZ^C6w zoYId(HOi|k=iYu=KZCh?gSV4X%Ju6hvWB34DNVSGL>l7q(KYvQg|4nY#L}c)2@b+* zx}kYD_T*4>T$+WGS}$Jex`vVkU^SQ0*T+EhGiVH`Mlh(k3&sJw>~J23TOmj<8M?Nf z5&8jroh#RCAB6nA@1@(=g10T=AfY5YRQO2fJ-8S{e?EIj#h}0^gQ&tRAd;N;*5|>2 zjfsnv_C7IWfv{Y=G?o6K+6{X0Vdne=2g&*sb4sdVIoIq9J%Hj$|K(@~Xw+!VHnOte zJ`mNYptk%Bx+p8_sM%%!zCHvWx;_y&7g|ugX8$HSVIr1=^Pd<*X@&3n@P{hn@k7UZj}OBVPtwy+RN>di-{T*kiEsYthR+;DYu{c74+yE? zei6EN->7Iwl%7btsNIK|o_9czrX(z-p^^^ti<*ycO9N&icWEl? z=mcaW06-7_J$g+xP=W+TL15%dZS!rA33N>nOF=cS8-_@P2f*v7WxZv5r8c;H-v{gD z$XZty)t(^}2O`7~+0%|tJN@q#b0HLJ$wOjT%5P0Tbs_nDT}>t{+x@1hZNq6dql`g} z*TYp+k#p;t2PL1?IXh65Tw^ZMVE;-tJsJN_%ZcY%6ANoG(B1N`yEGg0U$MSQ{;kbL ziDbn*yT;KW3~)?T)VKA$V8vqUC)^Zg5`_L}SCn`xMI0mFb{kac z52hCDdtLF+Hm^*P19fH&&gY$I0rD0yl-?Z zPzw_nH|+?X-oh2;LZHTINMAclR;+tlLXr2g^XfVkFG`K(jf4j0*QWj&C03B(`}c_% z+g!sZZH_uzE=3^z}kL*>+Dq# z8igPmupc1fxv(FAkssZ-AFhfRFFmzol~6Z9@sl}#3qZ9L{%h6+{I&)>ya*uBkPELN z&bHQghWzyfpwHCwwA6-eb^ZLu_x?=*LuR2y?L$$VN7q);i~=!TTxNg(#W2}k;Lja6 z#CiWedk|Wujq6AYR=cj{9u;j`#SYeDKi%4?*a3n%JDUz60m9=13E)Z0Ut!J%=7jQ% zrxMg2U9>bqs&u+(8fg3ZI7VY_4W}`MQjQWJ(ag3NJh!oRomU<(u8G)p^ytxuQnFA& zFnrOSl{l7vRxNH!TaX5icc&rWun#SeKGbcYv3R2_tXRp$d;GW;LN{Gu&V{mv?;B^q zuDWbT9FjPm-|zvIUaW5;BrkG*eN_J2l3^P3POzoG*`D+6fA$c2cHXcDPThp)6!&7n ziDV&&ML9KYS=)o_y1E?tt}_7;De+|&;Zy6!1NnxkB9C@gWd@rlOJ??|ZXx%4e zpX(FirHm0?2Bt8F zEM)7oCm6=i!{yt5`l|WV{2moSaD4<+H_Lao$i7mb{GT;-;AH4&qf60Ce<;?)$izz4 zFWQ@Mw$xIY|JpNiI;dx}FBM(&caGe+_c6c#$_`?24*;&th2rBTgZ!PPJ*a1pV7+^d(6Vk=;|?a)6OgZ z+G3f>5TzhoT>H5Wc+yU_SnS_(eLqmnq9nW%m|aR~L%$(3V?^zSMcnM$HESt)PAW4$ zEo5q$xoh=mr>V7Onj2!H&hi=V7zM@srzu1~L3*Jy%cG?(#f8KhB z)q$~{v6KAVn8S8UK>$sF*!9 zf%+U-xHIR0J!+7t?=OTTUuUOFLeVV3^>oHRD*C}9Qs(#&|^Y-CPINZ8}yt91*u zYkLtIX7gJS(#CvV?#uZgT96qXC{}Jld83U}_<8EnjEg2=lPr7gi|0HpDJ= z^RH^#_KE-L1%4ht6<-_)b_Yf_mv3}Bwze7l8%Ox$HoEyw@&{Ry`Cpso+_cF<+`9)E zKY;FMzY{VI^fAJIOuI&>f7 zs^W+}YCC{ExZkmdk@c6GO%~*-qHC6+=GNs0T`Tg1nm6okPC}X+$;Ev;kg$DVka0~+ zl)$obH5h41<$FWyv4i_AhkFEwEv_`{qnb2w z;M=M~J`)QyuA)o-x=~#_pFgji=1p7mu5l!UE?Bx&!1;_hGLXGp`T-Y_XiQimU;u_} zSj59-sC1+U5oLeIW{<83TWJ=*ap)FNa+0u^(gSNRLu%TVL8Zmslt-uM18oO}FF z@P3fpye;G*lt+Uwi$;?0zav~B1cTC%=oPXl;8Qi_eF528`OU65K0*a1_&qe?!6c4$ActuT~A# z)Kzm2yBeNDN#vj;pLVJ_xZhTQaiQS*FLu^3ZM|>5cgQsW_Gi`#VW{5?JuBM z-)0`Km8`tB$#p=UW5~-&mxOZY08uDMGJt|lz9&L0sM(_Uos*|qIu@T+?u+H1k5C_R(hiaN1@VK?mMx<1M zXX#9}K^C={l{&uQGzzMpdqgZ<_gKB-T1;TqqtuNY6n;l1B~>F7F=7r0%h4nSUL`QG?Rfv#wv14sejNN%&wF!YrT&Xtf`#4VCU2?pa&V1LXv0m2gL7`HS6)Q~29)VE6 zmTn|fGdO@!?*3@~)U#^27h8&e`2fVf1XfyEXU2=x;bcsNwf%Kj)egW!jS;EW zCweB(D)D5j<$E)cx?lHyG3>;V?215p2FVFoo8bmuu34ymJl&x0P9zl?!A^Jsx#m6tfXD$OHcNdgHJ(T5*&ur9lrW**HK}tGubi-oG&cvs< z6D{jU`{)L^y)8)(sIhTy3X~IwLSd7Kg%$>>GSGvov3yqSy&jBL$Ah%ob`F%(}5M4&gx#93g2Kcn?U~Nc2di>q6vvndiO;TdK18&M(cM>|8yEgpaept~4)E3u#c0ncufB z{zVC18Qg}`sF)m`e&(}lv~S0NkmeXqK1qPlj6wbIk7M%l5oo8_{~P4YEUHB|OxNth zaBP2pxa}tSyc}x6->Jh-R<4s^dSDaaotVI0U*PBG7YCzH_Q(UMFnT_{!RX^@O}0!< z$kVN|cm*2g%>?OUgAlZ#WQ7?7ojP1`cL9iU{?)f|aIyaH%RGChz6^_hY35By0;G2l z`%3+smi0Io0uvnzFBcbGJP$p}gDUTE%k`JZWDw)pfmw>YWJjNv@G0MK?UP}lfH*$hCT%bc}Nb1)sNRN%bS|rT6A8+E#Mo{S71g?UMYf|*G9ZGRJY-M8f zF>X5)iyE-lop3<&8|PZm_IgOmG!A|)S=8c&kT=J3Dl?-rej*Q|T{qSsDj}Bx}qyk5bqRDM_G_LC%-n?Yh%C^_IR$9NgQ;_ zzIQYTLuFmK9_tK`yxxRa((4t!21)+$P&u-+e`*2HQJ-cO|5G5Q!@XDh3of77##PQA zr}sHA)OamPkSi)khA(&Zh6$B|AH{hx@#|~*)~ihrC*=sENy^M@*mx#x*RAA>AAhmk zoT#LndueTZyuq2(>o8UN4E#PjRH#HOJMvLQx8Mc~71$z+mbMSaH?YlY$KxN=k~KoA z{Y<^4b1d)U*RPp8x!*%c*i4w!x}f*d;-r(^ucuajAVmiR<;kloLs`(6loYIlIh%5% zbo;?ee|Lxv9QeO=Mieax3bP~%-i4xdtlk6iVOG`yAQY-*x?M9lfTgGBz|jXNTD0+Q z_AkdLxNE0Yr`RUW_dESZmLJ0;RNQP-F$g(BTYsi(z%F1nZckx-t^uLX+x8i-D9yiI z|Jf+GIFtKLX~1I5Dt`OT6=H)MrDr;0X@);%MNGq~;PgIM zW5E)}D3EtnCxW;%hnX9@e+L4<5sw3~DCPctAIx++VY@jwfs6S1@9J&NOjrOG)xLsy z8bHhMOL{T}LTg{PF6C05yD{}C@t4AzDT#-_uS$)X)-13Y$)VzY4Q9y8yf`2DttwJR z28#7I3Qvu40FX8Xh^JE%Xx4suPg6^at+ceXLrXahkS{y5&t<_=BEE5TK7_{6k5^14 z?8fZ1;vqnHX#K~CMi^a@Id$edh@S7ue1htstv61%(aqLbo=Aa{u9--b`sZC=B22RC z1k*n@qkIRVz*4XJ3;992zf8GMkN1mh4HmHp-=AGuaG7gJpSqxKbVab ztLfl;$HvvtpA`1+9j=3_F&IQcqi%sJb@ix5`h|f8PIMsZaek=w4~R)~6g?S3fuxl! zt9j?qL3}*dmHVo(^dFmNxvSwaLJU(m8M-axr*)n(5;vuCn%}-QB~=6$umYfq6Mse& zz)63ey-b3+ARyq%w0K#tn)@ak!-Vng9h`p+rrxS9#OkJOQ+j=T>$dZ%j8ZTsWtt zyI8tU;Op4C$QOOMnb_M5B-~VCK12j65aY+-2w^kf)Y^D?C?10F0(r;Io8|Nd?lAff zWO*=*wQl#fsiGf#%_7HSL&N;FwasRaPE4 z#HA9p2LYkyRG&G4R@(QQW*p)McGV<}q5sLFBgyId$jspI99p~<(DDmZ#oK>EH;@)U@U7(F0NPw#s zH6eH0l_SW_O21c zf)05uge*$e8OjW+zLbUTg3qy;7tbswbsV3u&P9DgsD!mvhn;Pw~O%J7q9s*9SiX{*gFEq?Oc zs?I&?&LI8o7Kvi-Xa%_PwYRGuA(EYH33z+CMWZZUUO`-ed76PHi$2w^+7t zuyhktS1?JJ$|OlA z8#vK!5^tp@_)jUzt-f?heG!ntMVX|0C8hxc%lu}IN=8Da(OGHj#kvbkJpQ*3BvKwU zBgM=J8}Ov1oCMlmW-Q%pyL=^*IfXByV2-7ERYV8ULxcF<9ru9Mb_I-GcCNRDJ z=7Z*QV%dZb=wM@UPjHmf3%9YTj7-<>Dw=nf5*@Q#!S*JzkpRw-Z+2o$oj4Dtt!O5# zhr)NUQBCMom0{wOk&!`F@!$Htp#oEr{UD`+l2MimYVvKT#rIt^UgArwUCb*xvnUN@ zpo~cJiFqf6oln-#Ax0+5bF-DFI`Bn1IK@zB)7Ad!FfzM6rD^TJ77{1z<|9hiM0*(@ zYiW##beP>$6}f57p`|6~m07x{x8w^Ns`rW=gtDGxCGruCbRaVhRa#d65P%S4QgI|T z0xNyB#B~INZo+TdGH^0qP;$p&f~BPRQrA17g>PZo`j>5IQx;Z4DtT#pZ;mmaah8r#)&o!PuC2dnt*| zWYRp{%~kI8R@STc-*KfT^1fPqRi0!~8i=FRX5e`f?1 zR3OTJ@2N8{6J5{fEf1M}UsSjpI-hq}UrL*#@V#?GclGyd!oNSXdWVb}EehxR?lvZc z+tW+}9Z}v+vD5CKDA7pLQCZH;4ra@fI#$E)rrw>Nwm&y-FoIWm3NqR6BpazY)sT=u z8qH~Kf`*ZvI)d>laS_`U|&KuT3ScGFY%1=Hv$qlFs}SQjj%xMgRKz!c4OJXd9Br z!<+ECJLV;K?8TpxlXz$7H^1NeWX%I)O%Rz_TyKR8oZNfrVtn1mH`UzS_7qO}k*INnr*&sNa zh&Pl4DbY(78DfugVl(ILsK`6n2Tsl|z!-y8%l4WkbfW1Ju5QK$ z(Ecf#Jip(|?alHL7m+lgjH^7Hi?u)$KhKw>;ZMTc4{n+|Evu|;K?@*ZqQMpf7|h9W ziolCN?s7AXLmQw6;m)8m_5bte7#poIEce4bZ!KRG{8S}*W5nW+re8K9HL&K3V%2EC zC7*wVmO`xpvFLCFA+qZ0Cf$m(oMhKSG^NBEN(m0GlHh7`ed399^(G( z7(wY^yZ^qmZ|jJ3@GwDUvSu`9UdG`r}7 zsEW7e7s_RpR#tBxJ->B)o6r8o5kB19x;xWNI1iYK#LQdI`Uuf(gS(CoqZEfg|593b|SvVe=2|83P3s=`3!n-qk#Bx)S?Rw1eUZV6_$Wni>pKZ}I>lvA5nAE$t;F+;6*@wP;X3uuOiqO#mf z`;50*PhlQOYmkTigah1g4}1Ta94NalH>yZQB)Zko6#fGqdb1s#ll`6cB_?%#tX~A% z_;CwzFwmR**vM-^Zwj+{FcAHbT^p!5THdD%LV>=}xxqQGjt9B!to-G|Ce>jmyf@82 zapXjly@Sc!MGLIpB>oAeB&>PCr%tP@=b#^$Bu>%PPQy#KI&_sNySl8arMr4H%OEY5 z-VN|7FJ#R0`_KRX<)T)zh{yDD@(7}Upv=Z4Wka&Io8Ywt>Mkaro_H+CxQ zv%S7+_ijhyx~?T)@W_2DmMzlZa2TF=2?~lk^0Jo8v)HDYH=5mJ;CAF{NtN`|G6gz{Cd6@&r{5p;z~JdnEt)JqkHlOV)Ww1z`b9WMo~xS+lpel-iYPHCRb%`3@nb~k zodBpUAqb6$5QU0=2n7@#A?V4QI#;>ke?V!+#ovsaCOITQP!1?3VGp+4gO{YBIxF zRHrAi_$`=0f!uMSE=aS`mlvC(a!Slzz3q&g?u%Bs&1cBAS>MJsnei_e968W=Ra zA2UdcqNJqbrD`!Kq?O$A&?Rpq%_on7g6Ep7{%E^u*Vo&wU8Bci>56zVhA-$Lvm0C( z`UMe=Xs&((+2oud5%QS75rv8a=(w&n>l$AmbVQjVlVf6uw!;mR5Vdm@?U_J00~E?% zfDbfBQaUXLG)>pBb{AR&fy0Q~`kg18;Zp<;e583VmbMq@d4J~Y!6I_r8!K9-Vixhl zBOWePsf3CdQO$WUoeY?!A`Ult{z0=f4SPz88;6oz98&%%#mtv_97G~(iyr8)xl0dU zCJq0^-y_dCGx7cVgNUjOX&D0mPx=1-eYNJ|jTcBcI@~}RyD@5tlp7h3?O5FIospuI zIgBR9g7xf?+PevjmLN< z$`Daf+M|r?Jz@Ko$C0g*uyvp`U`8SSM-B%R)@9MJ-qPSS#B}O^@O&5e*)IVTD1#D{ zH*P=OEx8=^3Q_p)Kf{8M)?n$`Q!$a)h0y&29(9prNeaqvmKn!((v4N7bag-_a)Z`upiT9IN*aSVZuFVhTC$c zvoN-IK&c-RKM+;d;#zaRS+7AvM=

*$hI3G#u%WdV|9<`IE_VBVx2~ei~?p& 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


AewDOjh!MMu(vjQJBsiX3ZCmAui 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 diff --git a/src/DjangoBlog/docs/k8s-en.md b/src/DjangoBlog/docs/k8s-en.md deleted file mode 100644 index 20e9527..0000000 --- a/src/DjangoBlog/docs/k8s-en.md +++ /dev/null @@ -1,141 +0,0 @@ -# Deploying DjangoBlog with Kubernetes - -This document guides you through deploying the DjangoBlog application on a Kubernetes (K8s) cluster. We provide a complete set of `.yaml` configuration files in the `deploy/k8s` directory to deploy a full service stack, including the DjangoBlog application, Nginx, MySQL, Redis, and Elasticsearch. - -## Architecture Overview - -This deployment utilizes a microservices-based, cloud-native architecture: - -- **Core Components**: Each core service (DjangoBlog, Nginx, MySQL, Redis, Elasticsearch) runs as a separate `Deployment`. -- **Configuration Management**: Nginx configurations and Django application environment variables are managed via `ConfigMap`. **Note: For sensitive information like passwords, using `Secret` is highly recommended.** -- **Service Discovery**: All services are exposed internally within the cluster as `ClusterIP` type `Service`, enabling communication via service names. -- **External Access**: An `Ingress` resource is used to route external HTTP traffic to the Nginx service, which acts as the single entry point for the entire blog application. -- **Data Persistence**: A `local-storage` solution based on node-local paths is used. This requires you to manually create storage directories on a specific K8s node and statically bind them using `PersistentVolume` (PV) and `PersistentVolumeClaim` (PVC). - -## 1. Prerequisites - -Before you begin, please ensure you have the following: - -- A running Kubernetes cluster. -- The `kubectl` command-line tool configured to connect to your cluster. -- An [Nginx Ingress Controller](https://kubernetes.github.io/ingress-nginx/deploy/) installed and configured in your cluster. -- Filesystem access to one of the nodes in your cluster (defaulted to `master` in the configs) to create local storage directories. - -## 2. Deployment Steps - -### Step 1: Create a Namespace - -We recommend deploying all DjangoBlog-related resources in a dedicated namespace for better management. - -```bash -# Create a namespace named 'djangoblog' -kubectl create namespace djangoblog -``` - -### Step 2: Configure Persistent Storage - -This setup uses Local Persistent Volumes. You need to create the data storage directories on a node within your cluster (the default is the `master` node in `pv.yaml`). - -```bash -# Log in to your master node -ssh user@master-node - -# Create the required storage directories -sudo mkdir -p /mnt/local-storage-db -sudo mkdir -p /mnt/local-storage-djangoblog -sudo mkdir -p /mnt/resource/ -sudo mkdir -p /mnt/local-storage-elasticsearch - -# Log out from the node -exit -``` -**Note**: If you wish to store data on a different node or use different paths, you must modify the `nodeAffinity` and `local.path` settings in the `deploy/k8s/pv.yaml` file. - -After creating the directories, apply the storage-related configurations: - -```bash -# Apply the StorageClass -kubectl apply -f deploy/k8s/storageclass.yaml - -# Apply the PersistentVolumes (PVs) -kubectl apply -f deploy/k8s/pv.yaml - -# Apply the PersistentVolumeClaims (PVCs) -kubectl apply -f deploy/k8s/pvc.yaml -``` - -### Step 3: Configure the Application - -Before deploying the application, you need to edit the `deploy/k8s/configmap.yaml` file to modify sensitive information and custom settings. - -**It is strongly recommended to change the following fields:** -- `DJANGO_SECRET_KEY`: Change to a random, complex string. -- `DJANGO_MYSQL_PASSWORD` and `MYSQL_ROOT_PASSWORD`: Change to your own secure database password. - -```bash -# Edit the ConfigMap file -vim deploy/k8s/configmap.yaml - -# Apply the configuration -kubectl apply -f deploy/k8s/configmap.yaml -``` - -### Step 4: Deploy the Application Stack - -Now, we can deploy all the core services. - -```bash -# Deploy the Deployments (DjangoBlog, MySQL, Redis, Nginx, ES) -kubectl apply -f deploy/k8s/deployment.yaml - -# Deploy the Services (to create internal endpoints for the Deployments) -kubectl apply -f deploy/k8s/service.yaml -``` - -The deployment may take some time. You can run the following command to check if all Pods are running successfully (STATUS should be `Running`): - -```bash -kubectl get pods -n djangoblog -w -``` - -### Step 5: Expose the Application Externally - -Finally, expose the Nginx service to external traffic by applying the `Ingress` rule. - -```bash -# Apply the Ingress rule -kubectl apply -f deploy/k8s/gateway.yaml -``` - -Once deployed, you can access your blog via the external IP address of your Ingress Controller. Use the following command to find the address: - -```bash -kubectl get ingress -n djangoblog -``` - -### Step 6: First-Time Initialization - -Similar to the Docker deployment, you need to get a shell into the DjangoBlog application Pod to perform database initialization and create a superuser on the first run. - -```bash -# First, get the name of a djangoblog pod -kubectl get pods -n djangoblog | grep djangoblog - -# Exec into one of the Pods (replace [pod-name] with the name from the previous step) -kubectl exec -it [pod-name] -n djangoblog -- bash - -# Inside the Pod, run the following commands: -# Create a superuser account (follow the prompts) -python manage.py createsuperuser - -# (Optional) Create some test data -python manage.py create_testdata - -# (Optional, if ES is enabled) Create the search index -python manage.py rebuild_index - -# Exit the Pod -exit -``` - -Congratulations! You have successfully deployed DjangoBlog on your Kubernetes cluster. \ No newline at end of file diff --git a/src/DjangoBlog/docs/k8s.md b/src/DjangoBlog/docs/k8s.md deleted file mode 100644 index 9da3c28..0000000 --- a/src/DjangoBlog/docs/k8s.md +++ /dev/null @@ -1,141 +0,0 @@ -# 使用 Kubernetes 部署 DjangoBlog - -本文档将指导您如何在 Kubernetes (K8s) 集群上部署 DjangoBlog 应用。我们提供了一套完整的 `.yaml` 配置文件,位于 `deploy/k8s` 目录下,用于部署一个包含 DjangoBlog 应用、Nginx、MySQL、Redis 和 Elasticsearch 的完整服务栈。 - -## 架构概览 - -本次部署采用的是微服务化的云原生架构: - -- **核心组件**: 每个核心服务 (DjangoBlog, Nginx, MySQL, Redis, Elasticsearch) 都将作为独立的 `Deployment` 运行。 -- **配置管理**: Nginx 的配置文件和 Django 应用的环境变量通过 `ConfigMap` 进行管理。**注意:敏感信息(如密码)建议使用 `Secret` 进行管理。** -- **服务发现**: 所有服务都通过 `ClusterIP` 类型的 `Service` 在集群内部暴露,并通过服务名相互通信。 -- **外部访问**: 使用 `Ingress` 资源将外部的 HTTP 流量路由到 Nginx 服务,作为整个博客应用的统一入口。 -- **数据持久化**: 采用基于节点本地路径的 `local-storage` 方案。这需要您在指定的 K8s 节点上手动创建存储目录,并通过 `PersistentVolume` (PV) 和 `PersistentVolumeClaim` (PVC) 进行静态绑定。 - -## 1. 环境准备 - -在开始之前,请确保您已具备以下环境: - -- 一个正在运行的 Kubernetes 集群。 -- `kubectl` 命令行工具已配置并能够连接到您的集群。 -- 集群中已安装并配置好 [Nginx Ingress Controller](https://kubernetes.github.io/ingress-nginx/deploy/)。 -- 对集群中的一个节点(默认为 `master`)拥有文件系统访问权限,用于创建本地存储目录。 - -## 2. 部署步骤 - -### 步骤 1: 创建命名空间 - -我们建议将 DjangoBlog 相关的所有资源都部署在一个独立的命名空间中,便于管理。 - -```bash -# 创建一个名为 djangoblog 的命名空间 -kubectl create namespace djangoblog -``` - -### 步骤 2: 配置持久化存储 - -此方案使用本地持久卷 (Local Persistent Volume)。您需要在集群的一个节点上(在 `pv.yaml` 文件中默认为 `master` 节点)创建用于数据存储的目录。 - -```bash -# 登录到您的 master 节点 -ssh user@master-node - -# 创建所需的存储目录 -sudo mkdir -p /mnt/local-storage-db -sudo mkdir -p /mnt/local-storage-djangoblog -sudo mkdir -p /mnt/resource/ -sudo mkdir -p /mnt/local-storage-elasticsearch - -# 退出节点 -exit -``` -**注意**: 如果您希望将数据存储在其他节点或使用不同的路径,请务必修改 `deploy/k8s/pv.yaml` 文件中 `nodeAffinity` 和 `local.path` 的配置。 - -创建目录后,应用存储相关的配置文件: - -```bash -# 应用 StorageClass -kubectl apply -f deploy/k8s/storageclass.yaml - -# 应用 PersistentVolume (PV) -kubectl apply -f deploy/k8s/pv.yaml - -# 应用 PersistentVolumeClaim (PVC) -kubectl apply -f deploy/k8s/pvc.yaml -``` - -### 步骤 3: 配置应用 - -在部署应用之前,您需要编辑 `deploy/k8s/configmap.yaml` 文件,修改其中的敏感信息和个性化配置。 - -**强烈建议修改以下字段:** -- `DJANGO_SECRET_KEY`: 修改为一个随机且复杂的字符串。 -- `DJANGO_MYSQL_PASSWORD` 和 `MYSQL_ROOT_PASSWORD`: 修改为您自己的数据库密码。 - -```bash -# 编辑 ConfigMap 文件 -vim deploy/k8s/configmap.yaml - -# 应用配置 -kubectl apply -f deploy/k8s/configmap.yaml -``` - -### 步骤 4: 部署应用服务栈 - -现在,我们可以部署所有的核心服务了。 - -```bash -# 部署 Deployments (DjangoBlog, MySQL, Redis, Nginx, ES) -kubectl apply -f deploy/k8s/deployment.yaml - -# 部署 Services (为 Deployments 创建内部访问端点) -kubectl apply -f deploy/k8s/service.yaml -``` - -部署需要一些时间,您可以运行以下命令检查所有 Pod 是否都已成功运行 (STATUS 为 `Running`): - -```bash -kubectl get pods -n djangoblog -w -``` - -### 步骤 5: 暴露应用到外部 - -最后,通过应用 `Ingress` 规则来将外部流量引导至我们的 Nginx 服务。 - -```bash -# 应用 Ingress 规则 -kubectl apply -f deploy/k8s/gateway.yaml -``` - -部署完成后,您可以通过 Ingress Controller 的外部 IP 地址来访问您的博客。执行以下命令获取地址: - -```bash -kubectl get ingress -n djangoblog -``` - -### 步骤 6: 首次运行的初始化操作 - -与 Docker 部署类似,首次运行时,您需要进入 DjangoBlog 应用的 Pod 来执行数据库初始化和创建管理员账户。 - -```bash -# 首先,获取 djangoblog pod 的名称 -kubectl get pods -n djangoblog | grep djangoblog - -# 进入其中一个 Pod (将 [pod-name] 替换为上一步获取到的名称) -kubectl exec -it [pod-name] -n djangoblog -- bash - -# 在 Pod 内部执行以下命令: -# 创建超级管理员账户 (请按照提示操作) -python manage.py createsuperuser - -# (可选) 创建测试数据 -python manage.py create_testdata - -# (可选,如果启用了 ES) 创建索引 -python manage.py rebuild_index - -# 退出 Pod -exit -``` - -至此,您已成功在 Kubernetes 集群上完成了 DjangoBlog 的部署! \ No newline at end of file diff --git a/src/DjangoBlog/locale/en/LC_MESSAGES/django.mo b/src/DjangoBlog/locale/en/LC_MESSAGES/django.mo deleted file mode 100644 index f63669f46b3283a84e04098a7338b55f204e7b9d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11097 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 diff --git a/src/DjangoBlog/locale/en/LC_MESSAGES/django.po b/src/DjangoBlog/locale/en/LC_MESSAGES/django.po deleted file mode 100644 index c80b30a..0000000 --- a/src/DjangoBlog/locale/en/LC_MESSAGES/django.po +++ /dev/null @@ -1,685 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# FIRST AUTHOR , YEAR. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: PACKAGE VERSION\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-09-13 16:02+0800\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME \n" -"Language-Team: LANGUAGE \n" -"Language: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#: .\accounts\admin.py:12 -msgid "password" -msgstr "password" - -#: .\accounts\admin.py:13 -msgid "Enter password again" -msgstr "Enter password again" - -#: .\accounts\admin.py:24 .\accounts\forms.py:89 -msgid "passwords do not match" -msgstr "passwords do not match" - -#: .\accounts\forms.py:36 -msgid "email already exists" -msgstr "email already exists" - -#: .\accounts\forms.py:46 .\accounts\forms.py:50 -msgid "New password" -msgstr "New password" - -#: .\accounts\forms.py:60 -msgid "Confirm password" -msgstr "Confirm password" - -#: .\accounts\forms.py:70 .\accounts\forms.py:116 -msgid "Email" -msgstr "Email" - -#: .\accounts\forms.py:76 .\accounts\forms.py:80 -msgid "Code" -msgstr "Code" - -#: .\accounts\forms.py:100 .\accounts\tests.py:194 -msgid "email does not exist" -msgstr "email does not exist" - -#: .\accounts\models.py:12 .\oauth\models.py:17 -msgid "nick name" -msgstr "nick name" - -#: .\accounts\models.py:13 .\blog\models.py:29 .\blog\models.py:266 -#: .\blog\models.py:284 .\comments\models.py:13 .\oauth\models.py:23 -#: .\oauth\models.py:53 -msgid "creation time" -msgstr "creation time" - -#: .\accounts\models.py:14 .\comments\models.py:14 .\oauth\models.py:24 -#: .\oauth\models.py:54 -msgid "last modify time" -msgstr "last modify time" - -#: .\accounts\models.py:15 -msgid "create source" -msgstr "create source" - -#: .\accounts\models.py:33 .\djangoblog\logentryadmin.py:81 -msgid "user" -msgstr "user" - -#: .\accounts\tests.py:216 .\accounts\utils.py:39 -msgid "Verification code error" -msgstr "Verification code error" - -#: .\accounts\utils.py:13 -msgid "Verify Email" -msgstr "Verify Email" - -#: .\accounts\utils.py:21 -#, python-format -msgid "" -"You are resetting the password, the verification code is:%(code)s, valid " -"within 5 minutes, please keep it properly" -msgstr "" -"You are resetting the password, the verification code is:%(code)s, valid " -"within 5 minutes, please keep it properly" - -#: .\blog\admin.py:13 .\blog\models.py:92 .\comments\models.py:17 -#: .\oauth\models.py:12 -msgid "author" -msgstr "author" - -#: .\blog\admin.py:53 -msgid "Publish selected articles" -msgstr "Publish selected articles" - -#: .\blog\admin.py:54 -msgid "Draft selected articles" -msgstr "Draft selected articles" - -#: .\blog\admin.py:55 -msgid "Close article comments" -msgstr "Close article comments" - -#: .\blog\admin.py:56 -msgid "Open article comments" -msgstr "Open article comments" - -#: .\blog\admin.py:89 .\blog\models.py:101 .\blog\models.py:183 -#: .\templates\blog\tags\sidebar.html:40 -msgid "category" -msgstr "category" - -#: .\blog\models.py:20 .\blog\models.py:179 .\templates\share_layout\nav.html:8 -msgid "index" -msgstr "index" - -#: .\blog\models.py:21 -msgid "list" -msgstr "list" - -#: .\blog\models.py:22 -msgid "post" -msgstr "post" - -#: .\blog\models.py:23 -msgid "all" -msgstr "all" - -#: .\blog\models.py:24 -msgid "slide" -msgstr "slide" - -#: .\blog\models.py:30 .\blog\models.py:267 .\blog\models.py:285 -msgid "modify time" -msgstr "modify time" - -#: .\blog\models.py:63 -msgid "Draft" -msgstr "Draft" - -#: .\blog\models.py:64 -msgid "Published" -msgstr "Published" - -#: .\blog\models.py:67 -msgid "Open" -msgstr "Open" - -#: .\blog\models.py:68 -msgid "Close" -msgstr "Close" - -#: .\blog\models.py:71 .\comments\admin.py:47 -msgid "Article" -msgstr "Article" - -#: .\blog\models.py:72 -msgid "Page" -msgstr "Page" - -#: .\blog\models.py:74 .\blog\models.py:280 -msgid "title" -msgstr "title" - -#: .\blog\models.py:75 -msgid "body" -msgstr "body" - -#: .\blog\models.py:77 -msgid "publish time" -msgstr "publish time" - -#: .\blog\models.py:79 -msgid "status" -msgstr "status" - -#: .\blog\models.py:84 -msgid "comment status" -msgstr "comment status" - -#: .\blog\models.py:88 .\oauth\models.py:43 -msgid "type" -msgstr "type" - -#: .\blog\models.py:89 -msgid "views" -msgstr "views" - -#: .\blog\models.py:97 .\blog\models.py:258 .\blog\models.py:282 -msgid "order" -msgstr "order" - -#: .\blog\models.py:98 -msgid "show toc" -msgstr "show toc" - -#: .\blog\models.py:105 .\blog\models.py:249 -msgid "tag" -msgstr "tag" - -#: .\blog\models.py:115 .\comments\models.py:21 -msgid "article" -msgstr "article" - -#: .\blog\models.py:171 -msgid "category name" -msgstr "category name" - -#: .\blog\models.py:174 -msgid "parent category" -msgstr "parent category" - -#: .\blog\models.py:234 -msgid "tag name" -msgstr "tag name" - -#: .\blog\models.py:256 -msgid "link name" -msgstr "link name" - -#: .\blog\models.py:257 .\blog\models.py:271 -msgid "link" -msgstr "link" - -#: .\blog\models.py:260 -msgid "is show" -msgstr "is show" - -#: .\blog\models.py:262 -msgid "show type" -msgstr "show type" - -#: .\blog\models.py:281 -msgid "content" -msgstr "content" - -#: .\blog\models.py:283 .\oauth\models.py:52 -msgid "is enable" -msgstr "is enable" - -#: .\blog\models.py:289 -msgid "sidebar" -msgstr "sidebar" - -#: .\blog\models.py:299 -msgid "site name" -msgstr "site name" - -#: .\blog\models.py:305 -msgid "site description" -msgstr "site description" - -#: .\blog\models.py:311 -msgid "site seo description" -msgstr "site seo description" - -#: .\blog\models.py:313 -msgid "site keywords" -msgstr "site keywords" - -#: .\blog\models.py:318 -msgid "article sub length" -msgstr "article sub length" - -#: .\blog\models.py:319 -msgid "sidebar article count" -msgstr "sidebar article count" - -#: .\blog\models.py:320 -msgid "sidebar comment count" -msgstr "sidebar comment count" - -#: .\blog\models.py:321 -msgid "article comment count" -msgstr "article comment count" - -#: .\blog\models.py:322 -msgid "show adsense" -msgstr "show adsense" - -#: .\blog\models.py:324 -msgid "adsense code" -msgstr "adsense code" - -#: .\blog\models.py:325 -msgid "open site comment" -msgstr "open site comment" - -#: .\blog\models.py:352 -msgid "Website configuration" -msgstr "Website configuration" - -#: .\blog\models.py:360 -msgid "There can only be one configuration" -msgstr "There can only be one configuration" - -#: .\blog\views.py:348 -msgid "" -"Sorry, the page you requested is not found, please click the home page to " -"see other?" -msgstr "" -"Sorry, the page you requested is not found, please click the home page to " -"see other?" - -#: .\blog\views.py:356 -msgid "Sorry, the server is busy, please click the home page to see other?" -msgstr "Sorry, the server is busy, please click the home page to see other?" - -#: .\blog\views.py:369 -msgid "Sorry, you do not have permission to access this page?" -msgstr "Sorry, you do not have permission to access this page?" - -#: .\comments\admin.py:15 -msgid "Disable comments" -msgstr "Disable comments" - -#: .\comments\admin.py:16 -msgid "Enable comments" -msgstr "Enable comments" - -#: .\comments\admin.py:46 -msgid "User" -msgstr "User" - -#: .\comments\models.py:25 -msgid "parent comment" -msgstr "parent comment" - -#: .\comments\models.py:29 -msgid "enable" -msgstr "enable" - -#: .\comments\models.py:34 .\templates\blog\tags\article_info.html:30 -msgid "comment" -msgstr "comment" - -#: .\comments\utils.py:13 -msgid "Thanks for your comment" -msgstr "Thanks for your comment" - -#: .\comments\utils.py:15 -#, python-format -msgid "" -"

Thank you very much for your comments on this site

\n" -" You can visit
%(article_title)s\n" -" to review your comments,\n" -" Thank you again!\n" -"
\n" -" If the link above cannot be opened, please copy this " -"link to your browser.\n" -" %(article_url)s" -msgstr "" -"

Thank you very much for your comments on this site

\n" -" You can visit %(article_title)s\n" -" to review your comments,\n" -" Thank you again!\n" -"
\n" -" If the link above cannot be opened, please copy this " -"link to your browser.\n" -" %(article_url)s" - -#: .\comments\utils.py:26 -#, python-format -msgid "" -"Your comment on " -"%(article_title)s
has \n" -" received a reply.
%(comment_body)s\n" -"
\n" -" go check it out!\n" -"
\n" -" If the link above cannot be opened, please copy this " -"link to your browser.\n" -" %(article_url)s\n" -" " -msgstr "" -"Your comment on " -"%(article_title)s
has \n" -" received a reply.
%(comment_body)s\n" -"
\n" -" go check it out!\n" -"
\n" -" If the link above cannot be opened, please copy this " -"link to your browser.\n" -" %(article_url)s\n" -" " - -#: .\djangoblog\logentryadmin.py:63 -msgid "object" -msgstr "object" - -#: .\djangoblog\settings.py:140 -msgid "English" -msgstr "English" - -#: .\djangoblog\settings.py:141 -msgid "Simplified Chinese" -msgstr "Simplified Chinese" - -#: .\djangoblog\settings.py:142 -msgid "Traditional Chinese" -msgstr "Traditional Chinese" - -#: .\oauth\models.py:30 -msgid "oauth user" -msgstr "oauth user" - -#: .\oauth\models.py:37 -msgid "weibo" -msgstr "weibo" - -#: .\oauth\models.py:38 -msgid "google" -msgstr "google" - -#: .\oauth\models.py:48 -msgid "callback url" -msgstr "callback url" - -#: .\oauth\models.py:59 -msgid "already exists" -msgstr "already exists" - -#: .\oauth\views.py:154 -#, python-format -msgid "" -"\n" -"

Congratulations, you have successfully bound your email address. You " -"can use\n" -" %(oauthuser_type)s to directly log in to this website without a " -"password.

\n" -" You are welcome to continue to follow this site, the address is\n" -" %(site)s\n" -" Thank you again!\n" -"
\n" -" If the link above cannot be opened, please copy this link to your " -"browser.\n" -" %(site)s\n" -" " -msgstr "" -"\n" -"

Congratulations, you have successfully bound your email address. You " -"can use\n" -" %(oauthuser_type)s to directly log in to this website without a " -"password.

\n" -" You are welcome to continue to follow this site, the address is\n" -" %(site)s\n" -" Thank you again!\n" -"
\n" -" If the link above cannot be opened, please copy this link to your " -"browser.\n" -" %(site)s\n" -" " - -#: .\oauth\views.py:165 -msgid "Congratulations on your successful binding!" -msgstr "Congratulations on your successful binding!" - -#: .\oauth\views.py:217 -#, python-format -msgid "" -"\n" -"

Please click the link below to bind your email

\n" -"\n" -" %(url)s\n" -"\n" -" Thank you again!\n" -"
\n" -" If the link above cannot be opened, please copy this link " -"to your browser.\n" -"
\n" -" %(url)s\n" -" " -msgstr "" -"\n" -"

Please click the link below to bind your email

\n" -"\n" -" %(url)s\n" -"\n" -" Thank you again!\n" -"
\n" -" If the link above cannot be opened, please copy this link " -"to your browser.\n" -"
\n" -" %(url)s\n" -" " - -#: .\oauth\views.py:228 .\oauth\views.py:240 -msgid "Bind your email" -msgstr "Bind your email" - -#: .\oauth\views.py:242 -msgid "" -"Congratulations, the binding is just one step away. Please log in to your " -"email to check the email to complete the binding. Thank you." -msgstr "" -"Congratulations, the binding is just one step away. Please log in to your " -"email to check the email to complete the binding. Thank you." - -#: .\oauth\views.py:245 -msgid "Binding successful" -msgstr "Binding successful" - -#: .\oauth\views.py:247 -#, python-format -msgid "" -"Congratulations, you have successfully bound your email address. You can use " -"%(oauthuser_type)s to directly log in to this website without a password. " -"You are welcome to continue to follow this site." -msgstr "" -"Congratulations, you have successfully bound your email address. You can use " -"%(oauthuser_type)s to directly log in to this website without a password. " -"You are welcome to continue to follow this site." - -#: .\templates\account\forget_password.html:7 -msgid "forget the password" -msgstr "forget the password" - -#: .\templates\account\forget_password.html:18 -msgid "get verification code" -msgstr "get verification code" - -#: .\templates\account\forget_password.html:19 -msgid "submit" -msgstr "submit" - -#: .\templates\account\login.html:36 -msgid "Create Account" -msgstr "Create Account" - -#: .\templates\account\login.html:42 -#, fuzzy -#| msgid "forget the password" -msgid "Forget Password" -msgstr "forget the password" - -#: .\templates\account\result.html:18 .\templates\blog\tags\sidebar.html:126 -msgid "login" -msgstr "login" - -#: .\templates\account\result.html:22 -msgid "back to the homepage" -msgstr "back to the homepage" - -#: .\templates\blog\article_archives.html:7 -#: .\templates\blog\article_archives.html:24 -msgid "article archive" -msgstr "article archive" - -#: .\templates\blog\article_archives.html:32 -msgid "year" -msgstr "year" - -#: .\templates\blog\article_archives.html:36 -msgid "month" -msgstr "month" - -#: .\templates\blog\tags\article_info.html:12 -msgid "pin to top" -msgstr "pin to top" - -#: .\templates\blog\tags\article_info.html:28 -msgid "comments" -msgstr "comments" - -#: .\templates\blog\tags\article_info.html:58 -msgid "toc" -msgstr "toc" - -#: .\templates\blog\tags\article_meta_info.html:6 -msgid "posted in" -msgstr "posted in" - -#: .\templates\blog\tags\article_meta_info.html:14 -msgid "and tagged" -msgstr "and tagged" - -#: .\templates\blog\tags\article_meta_info.html:25 -msgid "by " -msgstr "by" - -#: .\templates\blog\tags\article_meta_info.html:29 -#, python-format -msgid "" -"\n" -" title=\"View all articles published by " -"%(article.author.username)s\"\n" -" " -msgstr "" -"\n" -" title=\"View all articles published by " -"%(article.author.username)s\"\n" -" " - -#: .\templates\blog\tags\article_meta_info.html:44 -msgid "on" -msgstr "on" - -#: .\templates\blog\tags\article_meta_info.html:54 -msgid "edit" -msgstr "edit" - -#: .\templates\blog\tags\article_pagination.html:4 -msgid "article navigation" -msgstr "article navigation" - -#: .\templates\blog\tags\article_pagination.html:9 -msgid "earlier articles" -msgstr "earlier articles" - -#: .\templates\blog\tags\article_pagination.html:12 -msgid "newer articles" -msgstr "newer articles" - -#: .\templates\blog\tags\article_tag_list.html:5 -msgid "tags" -msgstr "tags" - -#: .\templates\blog\tags\sidebar.html:7 -msgid "search" -msgstr "search" - -#: .\templates\blog\tags\sidebar.html:50 -msgid "recent comments" -msgstr "recent comments" - -#: .\templates\blog\tags\sidebar.html:57 -msgid "published on" -msgstr "published on" - -#: .\templates\blog\tags\sidebar.html:65 -msgid "recent articles" -msgstr "recent articles" - -#: .\templates\blog\tags\sidebar.html:77 -msgid "bookmark" -msgstr "bookmark" - -#: .\templates\blog\tags\sidebar.html:96 -msgid "Tag Cloud" -msgstr "Tag Cloud" - -#: .\templates\blog\tags\sidebar.html:107 -msgid "Welcome to star or fork the source code of this site" -msgstr "Welcome to star or fork the source code of this site" - -#: .\templates\blog\tags\sidebar.html:118 -msgid "Function" -msgstr "Function" - -#: .\templates\blog\tags\sidebar.html:120 -msgid "management site" -msgstr "management site" - -#: .\templates\blog\tags\sidebar.html:122 -msgid "logout" -msgstr "logout" - -#: .\templates\blog\tags\sidebar.html:129 -msgid "Track record" -msgstr "Track record" - -#: .\templates\blog\tags\sidebar.html:135 -msgid "Click me to return to the top" -msgstr "Click me to return to the top" - -#: .\templates\oauth\oauth_applications.html:5 -#| msgid "login" -msgid "quick login" -msgstr "quick login" - -#: .\templates\share_layout\nav.html:26 -msgid "Article archive" -msgstr "Article archive" diff --git a/src/DjangoBlog/locale/zh_Hans/LC_MESSAGES/django.mo b/src/DjangoBlog/locale/zh_Hans/LC_MESSAGES/django.mo deleted file mode 100644 index a2d36e98a180a2d9f413841d0cfa0c5f85654f63..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10321 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, YEAR. -# -msgid "" -msgstr "" -"Project-Id-Version: PACKAGE VERSION\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-09-13 16:02+0800\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME \n" -"Language-Team: LANGUAGE \n" -"Language: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -#: .\accounts\admin.py:12 -msgid "password" -msgstr "密码" - -#: .\accounts\admin.py:13 -msgid "Enter password again" -msgstr "再次输入密码" - -#: .\accounts\admin.py:24 .\accounts\forms.py:89 -msgid "passwords do not match" -msgstr "密码不匹配" - -#: .\accounts\forms.py:36 -msgid "email already exists" -msgstr "邮箱已存在" - -#: .\accounts\forms.py:46 .\accounts\forms.py:50 -msgid "New password" -msgstr "新密码" - -#: .\accounts\forms.py:60 -msgid "Confirm password" -msgstr "确认密码" - -#: .\accounts\forms.py:70 .\accounts\forms.py:116 -msgid "Email" -msgstr "邮箱" - -#: .\accounts\forms.py:76 .\accounts\forms.py:80 -msgid "Code" -msgstr "验证码" - -#: .\accounts\forms.py:100 .\accounts\tests.py:194 -msgid "email does not exist" -msgstr "邮箱不存在" - -#: .\accounts\models.py:12 .\oauth\models.py:17 -msgid "nick name" -msgstr "昵称" - -#: .\accounts\models.py:13 .\blog\models.py:29 .\blog\models.py:266 -#: .\blog\models.py:284 .\comments\models.py:13 .\oauth\models.py:23 -#: .\oauth\models.py:53 -msgid "creation time" -msgstr "创建时间" - -#: .\accounts\models.py:14 .\comments\models.py:14 .\oauth\models.py:24 -#: .\oauth\models.py:54 -msgid "last modify time" -msgstr "最后修改时间" - -#: .\accounts\models.py:15 -msgid "create source" -msgstr "来源" - -#: .\accounts\models.py:33 .\djangoblog\logentryadmin.py:81 -msgid "user" -msgstr "用户" - -#: .\accounts\tests.py:216 .\accounts\utils.py:39 -msgid "Verification code error" -msgstr "验证码错误" - -#: .\accounts\utils.py:13 -msgid "Verify Email" -msgstr "验证邮箱" - -#: .\accounts\utils.py:21 -#, python-format -msgid "" -"You are resetting the password, the verification code is:%(code)s, valid " -"within 5 minutes, please keep it properly" -msgstr "您正在重置密码,验证码为:%(code)s,5分钟内有效 请妥善保管." - -#: .\blog\admin.py:13 .\blog\models.py:92 .\comments\models.py:17 -#: .\oauth\models.py:12 -msgid "author" -msgstr "作者" - -#: .\blog\admin.py:53 -msgid "Publish selected articles" -msgstr "发布选中的文章" - -#: .\blog\admin.py:54 -msgid "Draft selected articles" -msgstr "选中文章设为草稿" - -#: .\blog\admin.py:55 -msgid "Close article comments" -msgstr "关闭文章评论" - -#: .\blog\admin.py:56 -msgid "Open article comments" -msgstr "打开文章评论" - -#: .\blog\admin.py:89 .\blog\models.py:101 .\blog\models.py:183 -#: .\templates\blog\tags\sidebar.html:40 -msgid "category" -msgstr "分类目录" - -#: .\blog\models.py:20 .\blog\models.py:179 .\templates\share_layout\nav.html:8 -msgid "index" -msgstr "首页" - -#: .\blog\models.py:21 -msgid "list" -msgstr "列表" - -#: .\blog\models.py:22 -msgid "post" -msgstr "文章" - -#: .\blog\models.py:23 -msgid "all" -msgstr "所有" - -#: .\blog\models.py:24 -msgid "slide" -msgstr "侧边栏" - -#: .\blog\models.py:30 .\blog\models.py:267 .\blog\models.py:285 -msgid "modify time" -msgstr "修改时间" - -#: .\blog\models.py:63 -msgid "Draft" -msgstr "草稿" - -#: .\blog\models.py:64 -msgid "Published" -msgstr "发布" - -#: .\blog\models.py:67 -msgid "Open" -msgstr "打开" - -#: .\blog\models.py:68 -msgid "Close" -msgstr "关闭" - -#: .\blog\models.py:71 .\comments\admin.py:47 -msgid "Article" -msgstr "文章" - -#: .\blog\models.py:72 -msgid "Page" -msgstr "页面" - -#: .\blog\models.py:74 .\blog\models.py:280 -msgid "title" -msgstr "标题" - -#: .\blog\models.py:75 -msgid "body" -msgstr "内容" - -#: .\blog\models.py:77 -msgid "publish time" -msgstr "发布时间" - -#: .\blog\models.py:79 -msgid "status" -msgstr "状态" - -#: .\blog\models.py:84 -msgid "comment status" -msgstr "评论状态" - -#: .\blog\models.py:88 .\oauth\models.py:43 -msgid "type" -msgstr "类型" - -#: .\blog\models.py:89 -msgid "views" -msgstr "阅读量" - -#: .\blog\models.py:97 .\blog\models.py:258 .\blog\models.py:282 -msgid "order" -msgstr "排序" - -#: .\blog\models.py:98 -msgid "show toc" -msgstr "显示目录" - -#: .\blog\models.py:105 .\blog\models.py:249 -msgid "tag" -msgstr "标签" - -#: .\blog\models.py:115 .\comments\models.py:21 -msgid "article" -msgstr "文章" - -#: .\blog\models.py:171 -msgid "category name" -msgstr "分类名" - -#: .\blog\models.py:174 -msgid "parent category" -msgstr "上级分类" - -#: .\blog\models.py:234 -msgid "tag name" -msgstr "标签名" - -#: .\blog\models.py:256 -msgid "link name" -msgstr "链接名" - -#: .\blog\models.py:257 .\blog\models.py:271 -msgid "link" -msgstr "链接" - -#: .\blog\models.py:260 -msgid "is show" -msgstr "是否显示" - -#: .\blog\models.py:262 -msgid "show type" -msgstr "显示类型" - -#: .\blog\models.py:281 -msgid "content" -msgstr "内容" - -#: .\blog\models.py:283 .\oauth\models.py:52 -msgid "is enable" -msgstr "是否启用" - -#: .\blog\models.py:289 -msgid "sidebar" -msgstr "侧边栏" - -#: .\blog\models.py:299 -msgid "site name" -msgstr "站点名称" - -#: .\blog\models.py:305 -msgid "site description" -msgstr "站点描述" - -#: .\blog\models.py:311 -msgid "site seo description" -msgstr "站点SEO描述" - -#: .\blog\models.py:313 -msgid "site keywords" -msgstr "关键字" - -#: .\blog\models.py:318 -msgid "article sub length" -msgstr "文章摘要长度" - -#: .\blog\models.py:319 -msgid "sidebar article count" -msgstr "侧边栏文章数目" - -#: .\blog\models.py:320 -msgid "sidebar comment count" -msgstr "侧边栏评论数目" - -#: .\blog\models.py:321 -msgid "article comment count" -msgstr "文章页面默认显示评论数目" - -#: .\blog\models.py:322 -msgid "show adsense" -msgstr "是否显示广告" - -#: .\blog\models.py:324 -msgid "adsense code" -msgstr "广告内容" - -#: .\blog\models.py:325 -msgid "open site comment" -msgstr "公共头部" - -#: .\blog\models.py:352 -msgid "Website configuration" -msgstr "网站配置" - -#: .\blog\models.py:360 -msgid "There can only be one configuration" -msgstr "只能有一个配置" - -#: .\blog\views.py:348 -msgid "" -"Sorry, the page you requested is not found, please click the home page to " -"see other?" -msgstr "抱歉,你所访问的页面找不到,请点击首页看看别的?" - -#: .\blog\views.py:356 -msgid "Sorry, the server is busy, please click the home page to see other?" -msgstr "抱歉,服务出错了,请点击首页看看别的?" - -#: .\blog\views.py:369 -msgid "Sorry, you do not have permission to access this page?" -msgstr "抱歉,你没用权限访问此页面。" - -#: .\comments\admin.py:15 -msgid "Disable comments" -msgstr "禁用评论" - -#: .\comments\admin.py:16 -msgid "Enable comments" -msgstr "启用评论" - -#: .\comments\admin.py:46 -msgid "User" -msgstr "用户" - -#: .\comments\models.py:25 -msgid "parent comment" -msgstr "上级评论" - -#: .\comments\models.py:29 -msgid "enable" -msgstr "启用" - -#: .\comments\models.py:34 .\templates\blog\tags\article_info.html:30 -msgid "comment" -msgstr "评论" - -#: .\comments\utils.py:13 -msgid "Thanks for your comment" -msgstr "感谢你的评论" - -#: .\comments\utils.py:15 -#, python-format -msgid "" -"

Thank you very much for your comments on this site

\n" -" You can visit %(article_title)s\n" -" to review your comments,\n" -" Thank you again!\n" -"
\n" -" If the link above cannot be opened, please copy this " -"link to your browser.\n" -" %(article_url)s" -msgstr "" -"

非常感谢您对此网站的评论

\n" -" 您可以访问%(article_title)s\n" -"查看您的评论,\n" -"再次感谢您!\n" -"
\n" -" 如果上面的链接打不开,请复制此链接链接到您的浏览器。\n" -"%(article_url)s" - -#: .\comments\utils.py:26 -#, python-format -msgid "" -"Your comment on " -"%(article_title)s
has \n" -" received a reply.
%(comment_body)s\n" -"
\n" -" go check it out!\n" -"
\n" -" If the link above cannot be opened, please copy this " -"link to your browser.\n" -" %(article_url)s\n" -" " -msgstr "" -"您对 %(article_title)s
" -"的评论有\n" -" 收到回复。
%(comment_body)s\n" -"
\n" -"快去看看吧!\n" -"
\n" -" 如果上面的链接打不开,请复制此链接链接到您的浏览器。\n" -" %(article_url)s\n" -" " - -#: .\djangoblog\logentryadmin.py:63 -msgid "object" -msgstr "对象" - -#: .\djangoblog\settings.py:140 -msgid "English" -msgstr "英文" - -#: .\djangoblog\settings.py:141 -msgid "Simplified Chinese" -msgstr "简体中文" - -#: .\djangoblog\settings.py:142 -msgid "Traditional Chinese" -msgstr "繁体中文" - -#: .\oauth\models.py:30 -msgid "oauth user" -msgstr "第三方用户" - -#: .\oauth\models.py:37 -msgid "weibo" -msgstr "微博" - -#: .\oauth\models.py:38 -msgid "google" -msgstr "谷歌" - -#: .\oauth\models.py:48 -msgid "callback url" -msgstr "回调地址" - -#: .\oauth\models.py:59 -msgid "already exists" -msgstr "已经存在" - -#: .\oauth\views.py:154 -#, python-format -msgid "" -"\n" -"

Congratulations, you have successfully bound your email address. You " -"can use\n" -" %(oauthuser_type)s to directly log in to this website without a " -"password.

\n" -" You are welcome to continue to follow this site, the address is\n" -" %(site)s\n" -" Thank you again!\n" -"
\n" -" If the link above cannot be opened, please copy this link to your " -"browser.\n" -" %(site)s\n" -" " -msgstr "" -"\n" -"

恭喜你已经绑定成功 你可以使用\n" -" %(oauthuser_type)s 来免密登录本站

\n" -" 欢迎继续关注本站, 地址是\n" -" %(site)s\n" -" 再次感谢你\n" -"
\n" -" 如果上面链接无法打开,请复制此链接到你的浏览器 \n" -" %(site)s\n" -" " - -#: .\oauth\views.py:165 -msgid "Congratulations on your successful binding!" -msgstr "恭喜你绑定成功" - -#: .\oauth\views.py:217 -#, python-format -msgid "" -"\n" -"

Please click the link below to bind your email

\n" -"\n" -" %(url)s\n" -"\n" -" Thank you again!\n" -"
\n" -" If the link above cannot be opened, please copy this link " -"to your browser.\n" -"
\n" -" %(url)s\n" -" " -msgstr "" -"\n" -"

请点击下面的链接绑定您的邮箱

\n" -"\n" -" %(url)s\n" -"\n" -"再次感谢您!\n" -"
\n" -"如果上面的链接打不开,请复制此链接到您的浏览器。\n" -"%(url)s\n" -" " - -#: .\oauth\views.py:228 .\oauth\views.py:240 -msgid "Bind your email" -msgstr "绑定邮箱" - -#: .\oauth\views.py:242 -msgid "" -"Congratulations, the binding is just one step away. Please log in to your " -"email to check the email to complete the binding. Thank you." -msgstr "恭喜您,还差一步就绑定成功了,请登录您的邮箱查看邮件完成绑定,谢谢。" - -#: .\oauth\views.py:245 -msgid "Binding successful" -msgstr "绑定成功" - -#: .\oauth\views.py:247 -#, python-format -msgid "" -"Congratulations, you have successfully bound your email address. You can use " -"%(oauthuser_type)s to directly log in to this website without a password. " -"You are welcome to continue to follow this site." -msgstr "" -"恭喜您绑定成功,您以后可以使用%(oauthuser_type)s来直接免密码登录本站啦,感谢" -"您对本站对关注。" - -#: .\templates\account\forget_password.html:7 -msgid "forget the password" -msgstr "忘记密码" - -#: .\templates\account\forget_password.html:18 -msgid "get verification code" -msgstr "获取验证码" - -#: .\templates\account\forget_password.html:19 -msgid "submit" -msgstr "提交" - -#: .\templates\account\login.html:36 -msgid "Create Account" -msgstr "创建账号" - -#: .\templates\account\login.html:42 -#| msgid "forget the password" -msgid "Forget Password" -msgstr "忘记密码" - -#: .\templates\account\result.html:18 .\templates\blog\tags\sidebar.html:126 -msgid "login" -msgstr "登录" - -#: .\templates\account\result.html:22 -msgid "back to the homepage" -msgstr "返回首页吧" - -#: .\templates\blog\article_archives.html:7 -#: .\templates\blog\article_archives.html:24 -msgid "article archive" -msgstr "文章归档" - -#: .\templates\blog\article_archives.html:32 -msgid "year" -msgstr "年" - -#: .\templates\blog\article_archives.html:36 -msgid "month" -msgstr "月" - -#: .\templates\blog\tags\article_info.html:12 -msgid "pin to top" -msgstr "置顶" - -#: .\templates\blog\tags\article_info.html:28 -msgid "comments" -msgstr "评论" - -#: .\templates\blog\tags\article_info.html:58 -msgid "toc" -msgstr "目录" - -#: .\templates\blog\tags\article_meta_info.html:6 -msgid "posted in" -msgstr "发布于" - -#: .\templates\blog\tags\article_meta_info.html:14 -msgid "and tagged" -msgstr "并标记为" - -#: .\templates\blog\tags\article_meta_info.html:25 -msgid "by " -msgstr "由" - -#: .\templates\blog\tags\article_meta_info.html:29 -#, python-format -msgid "" -"\n" -" title=\"View all articles published by " -"%(article.author.username)s\"\n" -" " -msgstr "" -"\n" -" title=\"查看所有由 %(article.author.username)s\"发布的文章\n" -" " - -#: .\templates\blog\tags\article_meta_info.html:44 -msgid "on" -msgstr "在" - -#: .\templates\blog\tags\article_meta_info.html:54 -msgid "edit" -msgstr "编辑" - -#: .\templates\blog\tags\article_pagination.html:4 -msgid "article navigation" -msgstr "文章导航" - -#: .\templates\blog\tags\article_pagination.html:9 -msgid "earlier articles" -msgstr "早期文章" - -#: .\templates\blog\tags\article_pagination.html:12 -msgid "newer articles" -msgstr "较新文章" - -#: .\templates\blog\tags\article_tag_list.html:5 -msgid "tags" -msgstr "标签" - -#: .\templates\blog\tags\sidebar.html:7 -msgid "search" -msgstr "搜索" - -#: .\templates\blog\tags\sidebar.html:50 -msgid "recent comments" -msgstr "近期评论" - -#: .\templates\blog\tags\sidebar.html:57 -msgid "published on" -msgstr "发表于" - -#: .\templates\blog\tags\sidebar.html:65 -msgid "recent articles" -msgstr "近期文章" - -#: .\templates\blog\tags\sidebar.html:77 -msgid "bookmark" -msgstr "书签" - -#: .\templates\blog\tags\sidebar.html:96 -msgid "Tag Cloud" -msgstr "标签云" - -#: .\templates\blog\tags\sidebar.html:107 -msgid "Welcome to star or fork the source code of this site" -msgstr "欢迎您STAR或者FORK本站源代码" - -#: .\templates\blog\tags\sidebar.html:118 -msgid "Function" -msgstr "功能" - -#: .\templates\blog\tags\sidebar.html:120 -msgid "management site" -msgstr "管理站点" - -#: .\templates\blog\tags\sidebar.html:122 -msgid "logout" -msgstr "登出" - -#: .\templates\blog\tags\sidebar.html:129 -msgid "Track record" -msgstr "运动轨迹记录" - -#: .\templates\blog\tags\sidebar.html:135 -msgid "Click me to return to the top" -msgstr "点我返回顶部" - -#: .\templates\oauth\oauth_applications.html:5 -#| msgid "login" -msgid "quick login" -msgstr "快捷登录" - -#: .\templates\share_layout\nav.html:26 -msgid "Article archive" -msgstr "文章归档" diff --git a/src/DjangoBlog/locale/zh_Hant/LC_MESSAGES/django.mo b/src/DjangoBlog/locale/zh_Hant/LC_MESSAGES/django.mo deleted file mode 100644 index fe2ea17dc2636742b9c3b8d4eddb6293ee3b7290..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10268 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 diff --git a/src/DjangoBlog/locale/zh_Hant/LC_MESSAGES/django.po b/src/DjangoBlog/locale/zh_Hant/LC_MESSAGES/django.po deleted file mode 100644 index a2920ce..0000000 --- a/src/DjangoBlog/locale/zh_Hant/LC_MESSAGES/django.po +++ /dev/null @@ -1,668 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# FIRST AUTHOR , YEAR. -# -msgid "" -msgstr "" -"Project-Id-Version: PACKAGE VERSION\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-09-13 16:02+0800\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME \n" -"Language-Team: LANGUAGE \n" -"Language: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -#: .\accounts\admin.py:12 -msgid "password" -msgstr "密碼" - -#: .\accounts\admin.py:13 -msgid "Enter password again" -msgstr "再次輸入密碼" - -#: .\accounts\admin.py:24 .\accounts\forms.py:89 -msgid "passwords do not match" -msgstr "密碼不匹配" - -#: .\accounts\forms.py:36 -msgid "email already exists" -msgstr "郵箱已存在" - -#: .\accounts\forms.py:46 .\accounts\forms.py:50 -msgid "New password" -msgstr "新密碼" - -#: .\accounts\forms.py:60 -msgid "Confirm password" -msgstr "確認密碼" - -#: .\accounts\forms.py:70 .\accounts\forms.py:116 -msgid "Email" -msgstr "郵箱" - -#: .\accounts\forms.py:76 .\accounts\forms.py:80 -msgid "Code" -msgstr "驗證碼" - -#: .\accounts\forms.py:100 .\accounts\tests.py:194 -msgid "email does not exist" -msgstr "郵箱不存在" - -#: .\accounts\models.py:12 .\oauth\models.py:17 -msgid "nick name" -msgstr "昵稱" - -#: .\accounts\models.py:13 .\blog\models.py:29 .\blog\models.py:266 -#: .\blog\models.py:284 .\comments\models.py:13 .\oauth\models.py:23 -#: .\oauth\models.py:53 -msgid "creation time" -msgstr "創建時間" - -#: .\accounts\models.py:14 .\comments\models.py:14 .\oauth\models.py:24 -#: .\oauth\models.py:54 -msgid "last modify time" -msgstr "最後修改時間" - -#: .\accounts\models.py:15 -msgid "create source" -msgstr "來源" - -#: .\accounts\models.py:33 .\djangoblog\logentryadmin.py:81 -msgid "user" -msgstr "用戶" - -#: .\accounts\tests.py:216 .\accounts\utils.py:39 -msgid "Verification code error" -msgstr "驗證碼錯誤" - -#: .\accounts\utils.py:13 -msgid "Verify Email" -msgstr "驗證郵箱" - -#: .\accounts\utils.py:21 -#, python-format -msgid "" -"You are resetting the password, the verification code is:%(code)s, valid " -"within 5 minutes, please keep it properly" -msgstr "您正在重置密碼,驗證碼為:%(code)s,5分鐘內有效 請妥善保管." - -#: .\blog\admin.py:13 .\blog\models.py:92 .\comments\models.py:17 -#: .\oauth\models.py:12 -msgid "author" -msgstr "作者" - -#: .\blog\admin.py:53 -msgid "Publish selected articles" -msgstr "發布選中的文章" - -#: .\blog\admin.py:54 -msgid "Draft selected articles" -msgstr "選中文章設為草稿" - -#: .\blog\admin.py:55 -msgid "Close article comments" -msgstr "關閉文章評論" - -#: .\blog\admin.py:56 -msgid "Open article comments" -msgstr "打開文章評論" - -#: .\blog\admin.py:89 .\blog\models.py:101 .\blog\models.py:183 -#: .\templates\blog\tags\sidebar.html:40 -msgid "category" -msgstr "分類目錄" - -#: .\blog\models.py:20 .\blog\models.py:179 .\templates\share_layout\nav.html:8 -msgid "index" -msgstr "首頁" - -#: .\blog\models.py:21 -msgid "list" -msgstr "列表" - -#: .\blog\models.py:22 -msgid "post" -msgstr "文章" - -#: .\blog\models.py:23 -msgid "all" -msgstr "所有" - -#: .\blog\models.py:24 -msgid "slide" -msgstr "側邊欄" - -#: .\blog\models.py:30 .\blog\models.py:267 .\blog\models.py:285 -msgid "modify time" -msgstr "修改時間" - -#: .\blog\models.py:63 -msgid "Draft" -msgstr "草稿" - -#: .\blog\models.py:64 -msgid "Published" -msgstr "發布" - -#: .\blog\models.py:67 -msgid "Open" -msgstr "打開" - -#: .\blog\models.py:68 -msgid "Close" -msgstr "關閉" - -#: .\blog\models.py:71 .\comments\admin.py:47 -msgid "Article" -msgstr "文章" - -#: .\blog\models.py:72 -msgid "Page" -msgstr "頁面" - -#: .\blog\models.py:74 .\blog\models.py:280 -msgid "title" -msgstr "標題" - -#: .\blog\models.py:75 -msgid "body" -msgstr "內容" - -#: .\blog\models.py:77 -msgid "publish time" -msgstr "發布時間" - -#: .\blog\models.py:79 -msgid "status" -msgstr "狀態" - -#: .\blog\models.py:84 -msgid "comment status" -msgstr "評論狀態" - -#: .\blog\models.py:88 .\oauth\models.py:43 -msgid "type" -msgstr "類型" - -#: .\blog\models.py:89 -msgid "views" -msgstr "閱讀量" - -#: .\blog\models.py:97 .\blog\models.py:258 .\blog\models.py:282 -msgid "order" -msgstr "排序" - -#: .\blog\models.py:98 -msgid "show toc" -msgstr "顯示目錄" - -#: .\blog\models.py:105 .\blog\models.py:249 -msgid "tag" -msgstr "標簽" - -#: .\blog\models.py:115 .\comments\models.py:21 -msgid "article" -msgstr "文章" - -#: .\blog\models.py:171 -msgid "category name" -msgstr "分類名" - -#: .\blog\models.py:174 -msgid "parent category" -msgstr "上級分類" - -#: .\blog\models.py:234 -msgid "tag name" -msgstr "標簽名" - -#: .\blog\models.py:256 -msgid "link name" -msgstr "鏈接名" - -#: .\blog\models.py:257 .\blog\models.py:271 -msgid "link" -msgstr "鏈接" - -#: .\blog\models.py:260 -msgid "is show" -msgstr "是否顯示" - -#: .\blog\models.py:262 -msgid "show type" -msgstr "顯示類型" - -#: .\blog\models.py:281 -msgid "content" -msgstr "內容" - -#: .\blog\models.py:283 .\oauth\models.py:52 -msgid "is enable" -msgstr "是否啟用" - -#: .\blog\models.py:289 -msgid "sidebar" -msgstr "側邊欄" - -#: .\blog\models.py:299 -msgid "site name" -msgstr "站點名稱" - -#: .\blog\models.py:305 -msgid "site description" -msgstr "站點描述" - -#: .\blog\models.py:311 -msgid "site seo description" -msgstr "站點SEO描述" - -#: .\blog\models.py:313 -msgid "site keywords" -msgstr "關鍵字" - -#: .\blog\models.py:318 -msgid "article sub length" -msgstr "文章摘要長度" - -#: .\blog\models.py:319 -msgid "sidebar article count" -msgstr "側邊欄文章數目" - -#: .\blog\models.py:320 -msgid "sidebar comment count" -msgstr "側邊欄評論數目" - -#: .\blog\models.py:321 -msgid "article comment count" -msgstr "文章頁面默認顯示評論數目" - -#: .\blog\models.py:322 -msgid "show adsense" -msgstr "是否顯示廣告" - -#: .\blog\models.py:324 -msgid "adsense code" -msgstr "廣告內容" - -#: .\blog\models.py:325 -msgid "open site comment" -msgstr "公共頭部" - -#: .\blog\models.py:352 -msgid "Website configuration" -msgstr "網站配置" - -#: .\blog\models.py:360 -msgid "There can only be one configuration" -msgstr "只能有一個配置" - -#: .\blog\views.py:348 -msgid "" -"Sorry, the page you requested is not found, please click the home page to " -"see other?" -msgstr "抱歉,你所訪問的頁面找不到,請點擊首頁看看別的?" - -#: .\blog\views.py:356 -msgid "Sorry, the server is busy, please click the home page to see other?" -msgstr "抱歉,服務出錯了,請點擊首頁看看別的?" - -#: .\blog\views.py:369 -msgid "Sorry, you do not have permission to access this page?" -msgstr "抱歉,你沒用權限訪問此頁面。" - -#: .\comments\admin.py:15 -msgid "Disable comments" -msgstr "禁用評論" - -#: .\comments\admin.py:16 -msgid "Enable comments" -msgstr "啟用評論" - -#: .\comments\admin.py:46 -msgid "User" -msgstr "用戶" - -#: .\comments\models.py:25 -msgid "parent comment" -msgstr "上級評論" - -#: .\comments\models.py:29 -msgid "enable" -msgstr "啟用" - -#: .\comments\models.py:34 .\templates\blog\tags\article_info.html:30 -msgid "comment" -msgstr "評論" - -#: .\comments\utils.py:13 -msgid "Thanks for your comment" -msgstr "感謝你的評論" - -#: .\comments\utils.py:15 -#, python-format -msgid "" -"

Thank you very much for your comments on this site

\n" -" You can visit %(article_title)s\n" -" to review your comments,\n" -" Thank you again!\n" -"
\n" -" If the link above cannot be opened, please copy this " -"link to your browser.\n" -" %(article_url)s" -msgstr "" -"

非常感謝您對此網站的評論

\n" -" 您可以訪問%(article_title)s\n" -"查看您的評論,\n" -"再次感謝您!\n" -"
\n" -" 如果上面的鏈接打不開,請復製此鏈接鏈接到您的瀏覽器。\n" -"%(article_url)s" - -#: .\comments\utils.py:26 -#, python-format -msgid "" -"Your comment on " -"%(article_title)s
has \n" -" received a reply.
%(comment_body)s\n" -"
\n" -" go check it out!\n" -"
\n" -" If the link above cannot be opened, please copy this " -"link to your browser.\n" -" %(article_url)s\n" -" " -msgstr "" -"您對 %(article_title)s
" -"的評論有\n" -" 收到回復。
%(comment_body)s\n" -"
\n" -"快去看看吧!\n" -"
\n" -" 如果上面的鏈接打不開,請復製此鏈接鏈接到您的瀏覽器。\n" -" %(article_url)s\n" -" " - -#: .\djangoblog\logentryadmin.py:63 -msgid "object" -msgstr "對象" - -#: .\djangoblog\settings.py:140 -msgid "English" -msgstr "英文" - -#: .\djangoblog\settings.py:141 -msgid "Simplified Chinese" -msgstr "簡體中文" - -#: .\djangoblog\settings.py:142 -msgid "Traditional Chinese" -msgstr "繁體中文" - -#: .\oauth\models.py:30 -msgid "oauth user" -msgstr "第三方用戶" - -#: .\oauth\models.py:37 -msgid "weibo" -msgstr "微博" - -#: .\oauth\models.py:38 -msgid "google" -msgstr "谷歌" - -#: .\oauth\models.py:48 -msgid "callback url" -msgstr "回調地址" - -#: .\oauth\models.py:59 -msgid "already exists" -msgstr "已經存在" - -#: .\oauth\views.py:154 -#, python-format -msgid "" -"\n" -"

Congratulations, you have successfully bound your email address. You " -"can use\n" -" %(oauthuser_type)s to directly log in to this website without a " -"password.

\n" -" You are welcome to continue to follow this site, the address is\n" -" %(site)s\n" -" Thank you again!\n" -"
\n" -" If the link above cannot be opened, please copy this link to your " -"browser.\n" -" %(site)s\n" -" " -msgstr "" -"\n" -"

恭喜你已經綁定成功 你可以使用\n" -" %(oauthuser_type)s 來免密登錄本站

\n" -" 歡迎繼續關註本站, 地址是\n" -" %(site)s\n" -" 再次感謝你\n" -"
\n" -" 如果上面鏈接無法打開,請復製此鏈接到你的瀏覽器 \n" -" %(site)s\n" -" " - -#: .\oauth\views.py:165 -msgid "Congratulations on your successful binding!" -msgstr "恭喜你綁定成功" - -#: .\oauth\views.py:217 -#, python-format -msgid "" -"\n" -"

Please click the link below to bind your email

\n" -"\n" -" %(url)s\n" -"\n" -" Thank you again!\n" -"
\n" -" If the link above cannot be opened, please copy this link " -"to your browser.\n" -"
\n" -" %(url)s\n" -" " -msgstr "" -"\n" -"

請點擊下面的鏈接綁定您的郵箱

\n" -"\n" -" %(url)s\n" -"\n" -"再次感謝您!\n" -"
\n" -"如果上面的鏈接打不開,請復製此鏈接到您的瀏覽器。\n" -"%(url)s\n" -" " - -#: .\oauth\views.py:228 .\oauth\views.py:240 -msgid "Bind your email" -msgstr "綁定郵箱" - -#: .\oauth\views.py:242 -msgid "" -"Congratulations, the binding is just one step away. Please log in to your " -"email to check the email to complete the binding. Thank you." -msgstr "恭喜您,還差一步就綁定成功了,請登錄您的郵箱查看郵件完成綁定,謝謝。" - -#: .\oauth\views.py:245 -msgid "Binding successful" -msgstr "綁定成功" - -#: .\oauth\views.py:247 -#, python-format -msgid "" -"Congratulations, you have successfully bound your email address. You can use " -"%(oauthuser_type)s to directly log in to this website without a password. " -"You are welcome to continue to follow this site." -msgstr "" -"恭喜您綁定成功,您以後可以使用%(oauthuser_type)s來直接免密碼登錄本站啦,感謝" -"您對本站對關註。" - -#: .\templates\account\forget_password.html:7 -msgid "forget the password" -msgstr "忘記密碼" - -#: .\templates\account\forget_password.html:18 -msgid "get verification code" -msgstr "獲取驗證碼" - -#: .\templates\account\forget_password.html:19 -msgid "submit" -msgstr "提交" - -#: .\templates\account\login.html:36 -msgid "Create Account" -msgstr "創建賬號" - -#: .\templates\account\login.html:42 -#, fuzzy -#| msgid "forget the password" -msgid "Forget Password" -msgstr "忘記密碼" - -#: .\templates\account\result.html:18 .\templates\blog\tags\sidebar.html:126 -msgid "login" -msgstr "登錄" - -#: .\templates\account\result.html:22 -msgid "back to the homepage" -msgstr "返回首頁吧" - -#: .\templates\blog\article_archives.html:7 -#: .\templates\blog\article_archives.html:24 -msgid "article archive" -msgstr "文章歸檔" - -#: .\templates\blog\article_archives.html:32 -msgid "year" -msgstr "年" - -#: .\templates\blog\article_archives.html:36 -msgid "month" -msgstr "月" - -#: .\templates\blog\tags\article_info.html:12 -msgid "pin to top" -msgstr "置頂" - -#: .\templates\blog\tags\article_info.html:28 -msgid "comments" -msgstr "評論" - -#: .\templates\blog\tags\article_info.html:58 -msgid "toc" -msgstr "目錄" - -#: .\templates\blog\tags\article_meta_info.html:6 -msgid "posted in" -msgstr "發布於" - -#: .\templates\blog\tags\article_meta_info.html:14 -msgid "and tagged" -msgstr "並標記為" - -#: .\templates\blog\tags\article_meta_info.html:25 -msgid "by " -msgstr "由" - -#: .\templates\blog\tags\article_meta_info.html:29 -#, python-format -msgid "" -"\n" -" title=\"View all articles published by " -"%(article.author.username)s\"\n" -" " -msgstr "" -"\n" -" title=\"查看所有由 %(article.author.username)s\"發布的文章\n" -" " - -#: .\templates\blog\tags\article_meta_info.html:44 -msgid "on" -msgstr "在" - -#: .\templates\blog\tags\article_meta_info.html:54 -msgid "edit" -msgstr "編輯" - -#: .\templates\blog\tags\article_pagination.html:4 -msgid "article navigation" -msgstr "文章導航" - -#: .\templates\blog\tags\article_pagination.html:9 -msgid "earlier articles" -msgstr "早期文章" - -#: .\templates\blog\tags\article_pagination.html:12 -msgid "newer articles" -msgstr "較新文章" - -#: .\templates\blog\tags\article_tag_list.html:5 -msgid "tags" -msgstr "標簽" - -#: .\templates\blog\tags\sidebar.html:7 -msgid "search" -msgstr "搜索" - -#: .\templates\blog\tags\sidebar.html:50 -msgid "recent comments" -msgstr "近期評論" - -#: .\templates\blog\tags\sidebar.html:57 -msgid "published on" -msgstr "發表於" - -#: .\templates\blog\tags\sidebar.html:65 -msgid "recent articles" -msgstr "近期文章" - -#: .\templates\blog\tags\sidebar.html:77 -msgid "bookmark" -msgstr "書簽" - -#: .\templates\blog\tags\sidebar.html:96 -msgid "Tag Cloud" -msgstr "標簽雲" - -#: .\templates\blog\tags\sidebar.html:107 -msgid "Welcome to star or fork the source code of this site" -msgstr "歡迎您STAR或者FORK本站源代碼" - -#: .\templates\blog\tags\sidebar.html:118 -msgid "Function" -msgstr "功能" - -#: .\templates\blog\tags\sidebar.html:120 -msgid "management site" -msgstr "管理站點" - -#: .\templates\blog\tags\sidebar.html:122 -msgid "logout" -msgstr "登出" - -#: .\templates\blog\tags\sidebar.html:129 -msgid "Track record" -msgstr "運動軌跡記錄" - -#: .\templates\blog\tags\sidebar.html:135 -msgid "Click me to return to the top" -msgstr "點我返回頂部" - -#: .\templates\oauth\oauth_applications.html:5 -#| msgid "login" -msgid "quick login" -msgstr "快捷登錄" - -#: .\templates\share_layout\nav.html:26 -msgid "Article archive" -msgstr "文章歸檔" diff --git a/src/DjangoBlog/manage.py b/src/DjangoBlog/manage.py deleted file mode 100755 index 919ba74..0000000 --- a/src/DjangoBlog/manage.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python -import os -import sys - -if __name__ == "__main__": - os.environ.setdefault("DJANGO_SETTINGS_MODULE", "djangoblog.settings") - try: - from django.core.management import execute_from_command_line - except ImportError: - # The above import may fail for some other reason. Ensure that the - # issue is really that Django is missing to avoid masking other - # exceptions on Python 2. - try: - import django - except ImportError: - 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?" - ) - raise - execute_from_command_line(sys.argv) diff --git a/src/DjangoBlog/oauth/__init__.py b/src/DjangoBlog/oauth/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/src/DjangoBlog/oauth/admin.py b/src/DjangoBlog/oauth/admin.py deleted file mode 100644 index 57eab5f..0000000 --- a/src/DjangoBlog/oauth/admin.py +++ /dev/null @@ -1,54 +0,0 @@ -import logging - -from django.contrib import admin -# Register your models here. -from django.urls import reverse -from django.utils.html import format_html - -logger = logging.getLogger(__name__) - - -class OAuthUserAdmin(admin.ModelAdmin): - search_fields = ('nickname', 'email') - list_per_page = 20 - list_display = ( - 'id', - 'nickname', - 'link_to_usermodel', - 'show_user_image', - 'type', - 'email', - ) - list_display_links = ('id', 'nickname') - list_filter = ('author', 'type',) - readonly_fields = [] - - def get_readonly_fields(self, request, obj=None): - return list(self.readonly_fields) + \ - [field.name for field in obj._meta.fields] + \ - [field.name for field in obj._meta.many_to_many] - - def has_add_permission(self, request): - return False - - def link_to_usermodel(self, obj): - if obj.author: - info = (obj.author._meta.app_label, obj.author._meta.model_name) - link = reverse('admin:%s_%s_change' % info, args=(obj.author.id,)) - return format_html( - u'%s' % - (link, obj.author.nickname if obj.author.nickname else obj.author.email)) - - def show_user_image(self, obj): - img = obj.picture - return format_html( - u'' % - (img)) - - link_to_usermodel.short_description = '用户' - show_user_image.short_description = '用户头像' - - -class OAuthConfigAdmin(admin.ModelAdmin): - list_display = ('type', 'appkey', 'appsecret', 'is_enable') - list_filter = ('type',) diff --git a/src/DjangoBlog/oauth/apps.py b/src/DjangoBlog/oauth/apps.py deleted file mode 100644 index 17fcea2..0000000 --- a/src/DjangoBlog/oauth/apps.py +++ /dev/null @@ -1,5 +0,0 @@ -from django.apps import AppConfig - - -class OauthConfig(AppConfig): - name = 'oauth' diff --git a/src/DjangoBlog/oauth/forms.py b/src/DjangoBlog/oauth/forms.py deleted file mode 100644 index 0e4ede3..0000000 --- a/src/DjangoBlog/oauth/forms.py +++ /dev/null @@ -1,12 +0,0 @@ -from django.contrib.auth.forms import forms -from django.forms import widgets - - -class RequireEmailForm(forms.Form): - email = forms.EmailField(label='电子邮箱', required=True) - oauthid = forms.IntegerField(widget=forms.HiddenInput, required=False) - - def __init__(self, *args, **kwargs): - super(RequireEmailForm, self).__init__(*args, **kwargs) - self.fields['email'].widget = widgets.EmailInput( - attrs={'placeholder': "email", "class": "form-control"}) diff --git a/src/DjangoBlog/oauth/migrations/0001_initial.py b/src/DjangoBlog/oauth/migrations/0001_initial.py deleted file mode 100644 index 3aa3e03..0000000 --- a/src/DjangoBlog/oauth/migrations/0001_initial.py +++ /dev/null @@ -1,57 +0,0 @@ -# Generated by Django 4.1.7 on 2023-03-07 09:53 - -from django.conf import settings -from django.db import migrations, models -import django.db.models.deletion -import django.utils.timezone - - -class Migration(migrations.Migration): - - initial = True - - dependencies = [ - migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ] - - operations = [ - migrations.CreateModel( - name='OAuthConfig', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('type', models.CharField(choices=[('weibo', '微博'), ('google', '谷歌'), ('github', 'GitHub'), ('facebook', 'FaceBook'), ('qq', 'QQ')], default='a', max_length=10, verbose_name='类型')), - ('appkey', models.CharField(max_length=200, verbose_name='AppKey')), - ('appsecret', models.CharField(max_length=200, verbose_name='AppSecret')), - ('callback_url', models.CharField(default='http://www.baidu.com', max_length=200, verbose_name='回调地址')), - ('is_enable', models.BooleanField(default=True, verbose_name='是否显示')), - ('created_time', models.DateTimeField(default=django.utils.timezone.now, verbose_name='创建时间')), - ('last_mod_time', models.DateTimeField(default=django.utils.timezone.now, verbose_name='修改时间')), - ], - options={ - 'verbose_name': 'oauth配置', - 'verbose_name_plural': 'oauth配置', - 'ordering': ['-created_time'], - }, - ), - migrations.CreateModel( - name='OAuthUser', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('openid', models.CharField(max_length=50)), - ('nickname', models.CharField(max_length=50, verbose_name='昵称')), - ('token', models.CharField(blank=True, max_length=150, null=True)), - ('picture', models.CharField(blank=True, max_length=350, null=True)), - ('type', models.CharField(max_length=50)), - ('email', models.CharField(blank=True, max_length=50, null=True)), - ('metadata', models.TextField(blank=True, null=True)), - ('created_time', models.DateTimeField(default=django.utils.timezone.now, verbose_name='创建时间')), - ('last_mod_time', models.DateTimeField(default=django.utils.timezone.now, verbose_name='修改时间')), - ('author', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='用户')), - ], - options={ - 'verbose_name': 'oauth用户', - 'verbose_name_plural': 'oauth用户', - 'ordering': ['-created_time'], - }, - ), - ] diff --git a/src/DjangoBlog/oauth/migrations/0002_alter_oauthconfig_options_alter_oauthuser_options_and_more.py b/src/DjangoBlog/oauth/migrations/0002_alter_oauthconfig_options_alter_oauthuser_options_and_more.py deleted file mode 100644 index d5cc70e..0000000 --- a/src/DjangoBlog/oauth/migrations/0002_alter_oauthconfig_options_alter_oauthuser_options_and_more.py +++ /dev/null @@ -1,86 +0,0 @@ -# Generated by Django 4.2.5 on 2023-09-06 13:13 - -from django.conf import settings -from django.db import migrations, models -import django.db.models.deletion -import django.utils.timezone - - -class Migration(migrations.Migration): - - dependencies = [ - migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ('oauth', '0001_initial'), - ] - - operations = [ - migrations.AlterModelOptions( - name='oauthconfig', - options={'ordering': ['-creation_time'], 'verbose_name': 'oauth配置', 'verbose_name_plural': 'oauth配置'}, - ), - migrations.AlterModelOptions( - name='oauthuser', - options={'ordering': ['-creation_time'], 'verbose_name': 'oauth user', 'verbose_name_plural': 'oauth user'}, - ), - migrations.RemoveField( - model_name='oauthconfig', - name='created_time', - ), - migrations.RemoveField( - model_name='oauthconfig', - name='last_mod_time', - ), - migrations.RemoveField( - model_name='oauthuser', - name='created_time', - ), - migrations.RemoveField( - model_name='oauthuser', - name='last_mod_time', - ), - migrations.AddField( - model_name='oauthconfig', - name='creation_time', - field=models.DateTimeField(default=django.utils.timezone.now, verbose_name='creation time'), - ), - migrations.AddField( - model_name='oauthconfig', - name='last_modify_time', - field=models.DateTimeField(default=django.utils.timezone.now, verbose_name='last modify time'), - ), - migrations.AddField( - model_name='oauthuser', - name='creation_time', - field=models.DateTimeField(default=django.utils.timezone.now, verbose_name='creation time'), - ), - migrations.AddField( - model_name='oauthuser', - name='last_modify_time', - field=models.DateTimeField(default=django.utils.timezone.now, verbose_name='last modify time'), - ), - migrations.AlterField( - model_name='oauthconfig', - name='callback_url', - field=models.CharField(default='', max_length=200, verbose_name='callback url'), - ), - migrations.AlterField( - model_name='oauthconfig', - name='is_enable', - field=models.BooleanField(default=True, verbose_name='is enable'), - ), - migrations.AlterField( - model_name='oauthconfig', - name='type', - field=models.CharField(choices=[('weibo', 'weibo'), ('google', 'google'), ('github', 'GitHub'), ('facebook', 'FaceBook'), ('qq', 'QQ')], default='a', max_length=10, verbose_name='type'), - ), - migrations.AlterField( - model_name='oauthuser', - name='author', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='author'), - ), - migrations.AlterField( - model_name='oauthuser', - name='nickname', - field=models.CharField(max_length=50, verbose_name='nickname'), - ), - ] diff --git a/src/DjangoBlog/oauth/migrations/0003_alter_oauthuser_nickname.py b/src/DjangoBlog/oauth/migrations/0003_alter_oauthuser_nickname.py deleted file mode 100644 index 6af08eb..0000000 --- a/src/DjangoBlog/oauth/migrations/0003_alter_oauthuser_nickname.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 4.2.7 on 2024-01-26 02:41 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('oauth', '0002_alter_oauthconfig_options_alter_oauthuser_options_and_more'), - ] - - operations = [ - migrations.AlterField( - model_name='oauthuser', - name='nickname', - field=models.CharField(max_length=50, verbose_name='nick name'), - ), - ] diff --git a/src/DjangoBlog/oauth/migrations/__init__.py b/src/DjangoBlog/oauth/migrations/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/src/DjangoBlog/oauth/models.py b/src/DjangoBlog/oauth/models.py deleted file mode 100644 index be838ed..0000000 --- a/src/DjangoBlog/oauth/models.py +++ /dev/null @@ -1,67 +0,0 @@ -# Create your models here. -from django.conf import settings -from django.core.exceptions import ValidationError -from django.db import models -from django.utils.timezone import now -from django.utils.translation import gettext_lazy as _ - - -class OAuthUser(models.Model): - author = models.ForeignKey( - settings.AUTH_USER_MODEL, - verbose_name=_('author'), - blank=True, - null=True, - on_delete=models.CASCADE) - openid = models.CharField(max_length=50) - nickname = models.CharField(max_length=50, verbose_name=_('nick name')) - token = models.CharField(max_length=150, null=True, blank=True) - picture = models.CharField(max_length=350, blank=True, null=True) - type = models.CharField(blank=False, null=False, max_length=50) - email = models.CharField(max_length=50, null=True, blank=True) - metadata = models.TextField(null=True, blank=True) - creation_time = models.DateTimeField(_('creation time'), default=now) - last_modify_time = models.DateTimeField(_('last modify time'), default=now) - - def __str__(self): - return self.nickname - - class Meta: - verbose_name = _('oauth user') - verbose_name_plural = verbose_name - ordering = ['-creation_time'] - - -class OAuthConfig(models.Model): - TYPE = ( - ('weibo', _('weibo')), - ('google', _('google')), - ('github', 'GitHub'), - ('facebook', 'FaceBook'), - ('qq', 'QQ'), - ) - type = models.CharField(_('type'), max_length=10, choices=TYPE, default='a') - appkey = models.CharField(max_length=200, verbose_name='AppKey') - appsecret = models.CharField(max_length=200, verbose_name='AppSecret') - callback_url = models.CharField( - max_length=200, - verbose_name=_('callback url'), - blank=False, - default='') - is_enable = models.BooleanField( - _('is enable'), default=True, blank=False, null=False) - creation_time = models.DateTimeField(_('creation time'), default=now) - last_modify_time = models.DateTimeField(_('last modify time'), default=now) - - def clean(self): - if OAuthConfig.objects.filter( - type=self.type).exclude(id=self.id).count(): - raise ValidationError(_(self.type + _('already exists'))) - - def __str__(self): - return self.type - - class Meta: - verbose_name = 'oauth配置' - verbose_name_plural = verbose_name - ordering = ['-creation_time'] diff --git a/src/DjangoBlog/oauth/oauthmanager.py b/src/DjangoBlog/oauth/oauthmanager.py deleted file mode 100644 index 2e7ceef..0000000 --- a/src/DjangoBlog/oauth/oauthmanager.py +++ /dev/null @@ -1,504 +0,0 @@ -import json -import logging -import os -import urllib.parse -from abc import ABCMeta, abstractmethod - -import requests - -from djangoblog.utils import cache_decorator -from oauth.models import OAuthUser, OAuthConfig - -logger = logging.getLogger(__name__) - - -class OAuthAccessTokenException(Exception): - ''' - oauth授权失败异常 - ''' - - -class BaseOauthManager(metaclass=ABCMeta): - """获取用户授权""" - AUTH_URL = None - """获取token""" - TOKEN_URL = None - """获取用户信息""" - API_URL = None - '''icon图标名''' - ICON_NAME = None - - def __init__(self, access_token=None, openid=None): - self.access_token = access_token - self.openid = openid - - @property - def is_access_token_set(self): - return self.access_token is not None - - @property - def is_authorized(self): - return self.is_access_token_set and self.access_token is not None and self.openid is not None - - @abstractmethod - def get_authorization_url(self, nexturl='/'): - pass - - @abstractmethod - def get_access_token_by_code(self, code): - pass - - @abstractmethod - def get_oauth_userinfo(self): - pass - - @abstractmethod - def get_picture(self, metadata): - pass - - def do_get(self, url, params, headers=None): - rsp = requests.get(url=url, params=params, headers=headers) - logger.info(rsp.text) - return rsp.text - - def do_post(self, url, params, headers=None): - rsp = requests.post(url, params, headers=headers) - logger.info(rsp.text) - return rsp.text - - def get_config(self): - value = OAuthConfig.objects.filter(type=self.ICON_NAME) - return value[0] if value else None - - -class WBOauthManager(BaseOauthManager): - AUTH_URL = 'https://api.weibo.com/oauth2/authorize' - TOKEN_URL = 'https://api.weibo.com/oauth2/access_token' - API_URL = 'https://api.weibo.com/2/users/show.json' - ICON_NAME = 'weibo' - - def __init__(self, access_token=None, openid=None): - config = self.get_config() - self.client_id = config.appkey if config else '' - self.client_secret = config.appsecret if config else '' - self.callback_url = config.callback_url if config else '' - super( - WBOauthManager, - self).__init__( - access_token=access_token, - openid=openid) - - def get_authorization_url(self, nexturl='/'): - params = { - 'client_id': self.client_id, - 'response_type': 'code', - 'redirect_uri': self.callback_url + '&next_url=' + nexturl - } - url = self.AUTH_URL + "?" + urllib.parse.urlencode(params) - return url - - def get_access_token_by_code(self, code): - - params = { - 'client_id': self.client_id, - 'client_secret': self.client_secret, - 'grant_type': 'authorization_code', - 'code': code, - 'redirect_uri': self.callback_url - } - rsp = self.do_post(self.TOKEN_URL, params) - - obj = json.loads(rsp) - if 'access_token' in obj: - self.access_token = str(obj['access_token']) - self.openid = str(obj['uid']) - return self.get_oauth_userinfo() - else: - raise OAuthAccessTokenException(rsp) - - def get_oauth_userinfo(self): - if not self.is_authorized: - return None - params = { - 'uid': self.openid, - 'access_token': self.access_token - } - rsp = self.do_get(self.API_URL, params) - try: - datas = json.loads(rsp) - user = OAuthUser() - user.metadata = rsp - user.picture = datas['avatar_large'] - user.nickname = datas['screen_name'] - user.openid = datas['id'] - user.type = 'weibo' - user.token = self.access_token - if 'email' in datas and datas['email']: - user.email = datas['email'] - return user - except Exception as e: - logger.error(e) - logger.error('weibo oauth error.rsp:' + rsp) - return None - - def get_picture(self, metadata): - datas = json.loads(metadata) - return datas['avatar_large'] - - -class ProxyManagerMixin: - def __init__(self, *args, **kwargs): - if os.environ.get("HTTP_PROXY"): - self.proxies = { - "http": os.environ.get("HTTP_PROXY"), - "https": os.environ.get("HTTP_PROXY") - } - else: - self.proxies = None - - def do_get(self, url, params, headers=None): - rsp = requests.get(url=url, params=params, headers=headers, proxies=self.proxies) - logger.info(rsp.text) - return rsp.text - - def do_post(self, url, params, headers=None): - rsp = requests.post(url, params, headers=headers, proxies=self.proxies) - logger.info(rsp.text) - return rsp.text - - -class GoogleOauthManager(ProxyManagerMixin, BaseOauthManager): - AUTH_URL = 'https://accounts.google.com/o/oauth2/v2/auth' - TOKEN_URL = 'https://www.googleapis.com/oauth2/v4/token' - API_URL = 'https://www.googleapis.com/oauth2/v3/userinfo' - ICON_NAME = 'google' - - def __init__(self, access_token=None, openid=None): - config = self.get_config() - self.client_id = config.appkey if config else '' - self.client_secret = config.appsecret if config else '' - self.callback_url = config.callback_url if config else '' - super( - GoogleOauthManager, - self).__init__( - access_token=access_token, - openid=openid) - - def get_authorization_url(self, nexturl='/'): - params = { - 'client_id': self.client_id, - 'response_type': 'code', - 'redirect_uri': self.callback_url, - 'scope': 'openid email', - } - url = self.AUTH_URL + "?" + urllib.parse.urlencode(params) - return url - - def get_access_token_by_code(self, code): - params = { - 'client_id': self.client_id, - 'client_secret': self.client_secret, - 'grant_type': 'authorization_code', - 'code': code, - - 'redirect_uri': self.callback_url - } - rsp = self.do_post(self.TOKEN_URL, params) - - obj = json.loads(rsp) - - if 'access_token' in obj: - self.access_token = str(obj['access_token']) - self.openid = str(obj['id_token']) - logger.info(self.ICON_NAME + ' oauth ' + rsp) - return self.access_token - else: - raise OAuthAccessTokenException(rsp) - - def get_oauth_userinfo(self): - if not self.is_authorized: - return None - params = { - 'access_token': self.access_token - } - rsp = self.do_get(self.API_URL, params) - try: - - datas = json.loads(rsp) - user = OAuthUser() - user.metadata = rsp - user.picture = datas['picture'] - user.nickname = datas['name'] - user.openid = datas['sub'] - user.token = self.access_token - user.type = 'google' - if datas['email']: - user.email = datas['email'] - return user - except Exception as e: - logger.error(e) - logger.error('google oauth error.rsp:' + rsp) - return None - - def get_picture(self, metadata): - datas = json.loads(metadata) - return datas['picture'] - - -class GitHubOauthManager(ProxyManagerMixin, BaseOauthManager): - AUTH_URL = 'https://github.com/login/oauth/authorize' - TOKEN_URL = 'https://github.com/login/oauth/access_token' - API_URL = 'https://api.github.com/user' - ICON_NAME = 'github' - - def __init__(self, access_token=None, openid=None): - config = self.get_config() - self.client_id = config.appkey if config else '' - self.client_secret = config.appsecret if config else '' - self.callback_url = config.callback_url if config else '' - super( - GitHubOauthManager, - self).__init__( - access_token=access_token, - openid=openid) - - def get_authorization_url(self, next_url='/'): - params = { - 'client_id': self.client_id, - 'response_type': 'code', - 'redirect_uri': f'{self.callback_url}&next_url={next_url}', - 'scope': 'user' - } - url = self.AUTH_URL + "?" + urllib.parse.urlencode(params) - return url - - def get_access_token_by_code(self, code): - params = { - 'client_id': self.client_id, - 'client_secret': self.client_secret, - 'grant_type': 'authorization_code', - 'code': code, - - 'redirect_uri': self.callback_url - } - rsp = self.do_post(self.TOKEN_URL, params) - - from urllib import parse - r = parse.parse_qs(rsp) - if 'access_token' in r: - self.access_token = (r['access_token'][0]) - return self.access_token - else: - raise OAuthAccessTokenException(rsp) - - def get_oauth_userinfo(self): - - rsp = self.do_get(self.API_URL, params={}, headers={ - "Authorization": "token " + self.access_token - }) - try: - datas = json.loads(rsp) - user = OAuthUser() - user.picture = datas['avatar_url'] - user.nickname = datas['name'] - user.openid = datas['id'] - user.type = 'github' - user.token = self.access_token - user.metadata = rsp - if 'email' in datas and datas['email']: - user.email = datas['email'] - return user - except Exception as e: - logger.error(e) - logger.error('github oauth error.rsp:' + rsp) - return None - - def get_picture(self, metadata): - datas = json.loads(metadata) - return datas['avatar_url'] - - -class FaceBookOauthManager(ProxyManagerMixin, BaseOauthManager): - AUTH_URL = 'https://www.facebook.com/v16.0/dialog/oauth' - TOKEN_URL = 'https://graph.facebook.com/v16.0/oauth/access_token' - API_URL = 'https://graph.facebook.com/me' - ICON_NAME = 'facebook' - - def __init__(self, access_token=None, openid=None): - config = self.get_config() - self.client_id = config.appkey if config else '' - self.client_secret = config.appsecret if config else '' - self.callback_url = config.callback_url if config else '' - super( - FaceBookOauthManager, - self).__init__( - access_token=access_token, - openid=openid) - - def get_authorization_url(self, next_url='/'): - params = { - 'client_id': self.client_id, - 'response_type': 'code', - 'redirect_uri': self.callback_url, - 'scope': 'email,public_profile' - } - url = self.AUTH_URL + "?" + urllib.parse.urlencode(params) - return url - - def get_access_token_by_code(self, code): - params = { - 'client_id': self.client_id, - 'client_secret': self.client_secret, - # 'grant_type': 'authorization_code', - 'code': code, - - 'redirect_uri': self.callback_url - } - rsp = self.do_post(self.TOKEN_URL, params) - - obj = json.loads(rsp) - if 'access_token' in obj: - token = str(obj['access_token']) - self.access_token = token - return self.access_token - else: - raise OAuthAccessTokenException(rsp) - - def get_oauth_userinfo(self): - params = { - 'access_token': self.access_token, - 'fields': 'id,name,picture,email' - } - try: - rsp = self.do_get(self.API_URL, params) - datas = json.loads(rsp) - user = OAuthUser() - user.nickname = datas['name'] - user.openid = datas['id'] - user.type = 'facebook' - user.token = self.access_token - user.metadata = rsp - if 'email' in datas and datas['email']: - user.email = datas['email'] - if 'picture' in datas and datas['picture'] and datas['picture']['data'] and datas['picture']['data']['url']: - user.picture = str(datas['picture']['data']['url']) - return user - except Exception as e: - logger.error(e) - return None - - def get_picture(self, metadata): - datas = json.loads(metadata) - return str(datas['picture']['data']['url']) - - -class QQOauthManager(BaseOauthManager): - AUTH_URL = 'https://graph.qq.com/oauth2.0/authorize' - TOKEN_URL = 'https://graph.qq.com/oauth2.0/token' - API_URL = 'https://graph.qq.com/user/get_user_info' - OPEN_ID_URL = 'https://graph.qq.com/oauth2.0/me' - ICON_NAME = 'qq' - - def __init__(self, access_token=None, openid=None): - config = self.get_config() - self.client_id = config.appkey if config else '' - self.client_secret = config.appsecret if config else '' - self.callback_url = config.callback_url if config else '' - super( - QQOauthManager, - self).__init__( - access_token=access_token, - openid=openid) - - def get_authorization_url(self, next_url='/'): - params = { - 'response_type': 'code', - 'client_id': self.client_id, - 'redirect_uri': self.callback_url + '&next_url=' + next_url, - } - url = self.AUTH_URL + "?" + urllib.parse.urlencode(params) - return url - - def get_access_token_by_code(self, code): - params = { - 'grant_type': 'authorization_code', - 'client_id': self.client_id, - 'client_secret': self.client_secret, - 'code': code, - 'redirect_uri': self.callback_url - } - rsp = self.do_get(self.TOKEN_URL, params) - if rsp: - d = urllib.parse.parse_qs(rsp) - if 'access_token' in d: - token = d['access_token'] - self.access_token = token[0] - return token - else: - raise OAuthAccessTokenException(rsp) - - def get_open_id(self): - if self.is_access_token_set: - params = { - 'access_token': self.access_token - } - rsp = self.do_get(self.OPEN_ID_URL, params) - if rsp: - rsp = rsp.replace( - 'callback(', '').replace( - ')', '').replace( - ';', '') - obj = json.loads(rsp) - openid = str(obj['openid']) - self.openid = openid - return openid - - def get_oauth_userinfo(self): - openid = self.get_open_id() - if openid: - params = { - 'access_token': self.access_token, - 'oauth_consumer_key': self.client_id, - 'openid': self.openid - } - rsp = self.do_get(self.API_URL, params) - logger.info(rsp) - obj = json.loads(rsp) - user = OAuthUser() - user.nickname = obj['nickname'] - user.openid = openid - user.type = 'qq' - user.token = self.access_token - user.metadata = rsp - if 'email' in obj: - user.email = obj['email'] - if 'figureurl' in obj: - user.picture = str(obj['figureurl']) - return user - - def get_picture(self, metadata): - datas = json.loads(metadata) - return str(datas['figureurl']) - - -@cache_decorator(expiration=100 * 60) -def get_oauth_apps(): - configs = OAuthConfig.objects.filter(is_enable=True).all() - if not configs: - return [] - configtypes = [x.type for x in configs] - applications = BaseOauthManager.__subclasses__() - apps = [x() for x in applications if x().ICON_NAME.lower() in configtypes] - return apps - - -def get_manager_by_type(type): - applications = get_oauth_apps() - if applications: - finds = list( - filter( - lambda x: x.ICON_NAME.lower() == type.lower(), - applications)) - if finds: - return finds[0] - return None diff --git a/src/DjangoBlog/oauth/templatetags/__init__.py b/src/DjangoBlog/oauth/templatetags/__init__.py deleted file mode 100644 index 8b13789..0000000 --- a/src/DjangoBlog/oauth/templatetags/__init__.py +++ /dev/null @@ -1 +0,0 @@ - diff --git a/src/DjangoBlog/oauth/templatetags/oauth_tags.py b/src/DjangoBlog/oauth/templatetags/oauth_tags.py deleted file mode 100644 index 7b687d5..0000000 --- a/src/DjangoBlog/oauth/templatetags/oauth_tags.py +++ /dev/null @@ -1,22 +0,0 @@ -from django import template -from django.urls import reverse - -from oauth.oauthmanager import get_oauth_apps - -register = template.Library() - - -@register.inclusion_tag('oauth/oauth_applications.html') -def load_oauth_applications(request): - applications = get_oauth_apps() - if applications: - baseurl = reverse('oauth:oauthlogin') - path = request.get_full_path() - - apps = list(map(lambda x: (x.ICON_NAME, '{baseurl}?type={type}&next_url={next}'.format( - baseurl=baseurl, type=x.ICON_NAME, next=path)), applications)) - else: - apps = [] - return { - 'apps': apps - } diff --git a/src/DjangoBlog/oauth/tests.py b/src/DjangoBlog/oauth/tests.py deleted file mode 100644 index bb23b9b..0000000 --- a/src/DjangoBlog/oauth/tests.py +++ /dev/null @@ -1,249 +0,0 @@ -import json -from unittest.mock import patch - -from django.conf import settings -from django.contrib import auth -from django.test import Client, RequestFactory, TestCase -from django.urls import reverse - -from djangoblog.utils import get_sha256 -from oauth.models import OAuthConfig -from oauth.oauthmanager import BaseOauthManager - - -# Create your tests here. -class OAuthConfigTest(TestCase): - def setUp(self): - self.client = Client() - self.factory = RequestFactory() - - def test_oauth_login_test(self): - c = OAuthConfig() - c.type = 'weibo' - c.appkey = 'appkey' - c.appsecret = 'appsecret' - c.save() - - response = self.client.get('/oauth/oauthlogin?type=weibo') - self.assertEqual(response.status_code, 302) - self.assertTrue("api.weibo.com" in response.url) - - response = self.client.get('/oauth/authorize?type=weibo&code=code') - self.assertEqual(response.status_code, 302) - self.assertEqual(response.url, '/') - - -class OauthLoginTest(TestCase): - def setUp(self) -> None: - self.client = Client() - self.factory = RequestFactory() - self.apps = self.init_apps() - - def init_apps(self): - applications = [p() for p in BaseOauthManager.__subclasses__()] - for application in applications: - c = OAuthConfig() - c.type = application.ICON_NAME.lower() - c.appkey = 'appkey' - c.appsecret = 'appsecret' - c.save() - return applications - - def get_app_by_type(self, type): - for app in self.apps: - if app.ICON_NAME.lower() == type: - return app - - @patch("oauth.oauthmanager.WBOauthManager.do_post") - @patch("oauth.oauthmanager.WBOauthManager.do_get") - def test_weibo_login(self, mock_do_get, mock_do_post): - weibo_app = self.get_app_by_type('weibo') - assert weibo_app - url = weibo_app.get_authorization_url() - mock_do_post.return_value = json.dumps({"access_token": "access_token", - "uid": "uid" - }) - mock_do_get.return_value = json.dumps({ - "avatar_large": "avatar_large", - "screen_name": "screen_name", - "id": "id", - "email": "email", - }) - userinfo = weibo_app.get_access_token_by_code('code') - self.assertEqual(userinfo.token, 'access_token') - self.assertEqual(userinfo.openid, 'id') - - @patch("oauth.oauthmanager.GoogleOauthManager.do_post") - @patch("oauth.oauthmanager.GoogleOauthManager.do_get") - def test_google_login(self, mock_do_get, mock_do_post): - google_app = self.get_app_by_type('google') - assert google_app - url = google_app.get_authorization_url() - mock_do_post.return_value = json.dumps({ - "access_token": "access_token", - "id_token": "id_token", - }) - mock_do_get.return_value = json.dumps({ - "picture": "picture", - "name": "name", - "sub": "sub", - "email": "email", - }) - token = google_app.get_access_token_by_code('code') - userinfo = google_app.get_oauth_userinfo() - self.assertEqual(userinfo.token, 'access_token') - self.assertEqual(userinfo.openid, 'sub') - - @patch("oauth.oauthmanager.GitHubOauthManager.do_post") - @patch("oauth.oauthmanager.GitHubOauthManager.do_get") - def test_github_login(self, mock_do_get, mock_do_post): - github_app = self.get_app_by_type('github') - assert github_app - url = github_app.get_authorization_url() - self.assertTrue("github.com" in url) - self.assertTrue("client_id" in url) - mock_do_post.return_value = "access_token=gho_16C7e42F292c6912E7710c838347Ae178B4a&scope=repo%2Cgist&token_type=bearer" - mock_do_get.return_value = json.dumps({ - "avatar_url": "avatar_url", - "name": "name", - "id": "id", - "email": "email", - }) - token = github_app.get_access_token_by_code('code') - userinfo = github_app.get_oauth_userinfo() - self.assertEqual(userinfo.token, 'gho_16C7e42F292c6912E7710c838347Ae178B4a') - self.assertEqual(userinfo.openid, 'id') - - @patch("oauth.oauthmanager.FaceBookOauthManager.do_post") - @patch("oauth.oauthmanager.FaceBookOauthManager.do_get") - def test_facebook_login(self, mock_do_get, mock_do_post): - facebook_app = self.get_app_by_type('facebook') - assert facebook_app - url = facebook_app.get_authorization_url() - self.assertTrue("facebook.com" in url) - mock_do_post.return_value = json.dumps({ - "access_token": "access_token", - }) - mock_do_get.return_value = json.dumps({ - "name": "name", - "id": "id", - "email": "email", - "picture": { - "data": { - "url": "url" - } - } - }) - token = facebook_app.get_access_token_by_code('code') - userinfo = facebook_app.get_oauth_userinfo() - self.assertEqual(userinfo.token, 'access_token') - - @patch("oauth.oauthmanager.QQOauthManager.do_get", side_effect=[ - 'access_token=access_token&expires_in=3600', - 'callback({"client_id":"appid","openid":"openid"} );', - json.dumps({ - "nickname": "nickname", - "email": "email", - "figureurl": "figureurl", - "openid": "openid", - }) - ]) - def test_qq_login(self, mock_do_get): - qq_app = self.get_app_by_type('qq') - assert qq_app - url = qq_app.get_authorization_url() - self.assertTrue("qq.com" in url) - token = qq_app.get_access_token_by_code('code') - userinfo = qq_app.get_oauth_userinfo() - self.assertEqual(userinfo.token, 'access_token') - - @patch("oauth.oauthmanager.WBOauthManager.do_post") - @patch("oauth.oauthmanager.WBOauthManager.do_get") - def test_weibo_authoriz_login_with_email(self, mock_do_get, mock_do_post): - - mock_do_post.return_value = json.dumps({"access_token": "access_token", - "uid": "uid" - }) - mock_user_info = { - "avatar_large": "avatar_large", - "screen_name": "screen_name1", - "id": "id", - "email": "email", - } - mock_do_get.return_value = json.dumps(mock_user_info) - - response = self.client.get('/oauth/oauthlogin?type=weibo') - self.assertEqual(response.status_code, 302) - self.assertTrue("api.weibo.com" in response.url) - - response = self.client.get('/oauth/authorize?type=weibo&code=code') - self.assertEqual(response.status_code, 302) - self.assertEqual(response.url, '/') - - user = auth.get_user(self.client) - assert user.is_authenticated - self.assertTrue(user.is_authenticated) - self.assertEqual(user.username, mock_user_info['screen_name']) - self.assertEqual(user.email, mock_user_info['email']) - self.client.logout() - - response = self.client.get('/oauth/authorize?type=weibo&code=code') - self.assertEqual(response.status_code, 302) - self.assertEqual(response.url, '/') - - user = auth.get_user(self.client) - assert user.is_authenticated - self.assertTrue(user.is_authenticated) - self.assertEqual(user.username, mock_user_info['screen_name']) - self.assertEqual(user.email, mock_user_info['email']) - - @patch("oauth.oauthmanager.WBOauthManager.do_post") - @patch("oauth.oauthmanager.WBOauthManager.do_get") - def test_weibo_authoriz_login_without_email(self, mock_do_get, mock_do_post): - - mock_do_post.return_value = json.dumps({"access_token": "access_token", - "uid": "uid" - }) - mock_user_info = { - "avatar_large": "avatar_large", - "screen_name": "screen_name1", - "id": "id", - } - mock_do_get.return_value = json.dumps(mock_user_info) - - response = self.client.get('/oauth/oauthlogin?type=weibo') - self.assertEqual(response.status_code, 302) - self.assertTrue("api.weibo.com" in response.url) - - response = self.client.get('/oauth/authorize?type=weibo&code=code') - - self.assertEqual(response.status_code, 302) - - oauth_user_id = int(response.url.split('/')[-1].split('.')[0]) - self.assertEqual(response.url, f'/oauth/requireemail/{oauth_user_id}.html') - - response = self.client.post(response.url, {'email': 'test@gmail.com', 'oauthid': oauth_user_id}) - - self.assertEqual(response.status_code, 302) - sign = get_sha256(settings.SECRET_KEY + - str(oauth_user_id) + settings.SECRET_KEY) - - url = reverse('oauth:bindsuccess', kwargs={ - 'oauthid': oauth_user_id, - }) - self.assertEqual(response.url, f'{url}?type=email') - - path = reverse('oauth:email_confirm', kwargs={ - 'id': oauth_user_id, - 'sign': sign - }) - response = self.client.get(path) - self.assertEqual(response.status_code, 302) - self.assertEqual(response.url, f'/oauth/bindsuccess/{oauth_user_id}.html?type=success') - user = auth.get_user(self.client) - from oauth.models import OAuthUser - oauth_user = OAuthUser.objects.get(author=user) - self.assertTrue(user.is_authenticated) - self.assertEqual(user.username, mock_user_info['screen_name']) - self.assertEqual(user.email, 'test@gmail.com') - self.assertEqual(oauth_user.pk, oauth_user_id) diff --git a/src/DjangoBlog/oauth/urls.py b/src/DjangoBlog/oauth/urls.py deleted file mode 100644 index c4a12a0..0000000 --- a/src/DjangoBlog/oauth/urls.py +++ /dev/null @@ -1,25 +0,0 @@ -from django.urls import path - -from . import views - -app_name = "oauth" -urlpatterns = [ - path( - r'oauth/authorize', - views.authorize), - path( - r'oauth/requireemail/.html', - views.RequireEmailView.as_view(), - name='require_email'), - path( - r'oauth/emailconfirm//.html', - views.emailconfirm, - name='email_confirm'), - path( - r'oauth/bindsuccess/.html', - views.bindsuccess, - name='bindsuccess'), - path( - r'oauth/oauthlogin', - views.oauthlogin, - name='oauthlogin')] diff --git a/src/DjangoBlog/oauth/views.py b/src/DjangoBlog/oauth/views.py deleted file mode 100644 index 12e3a6e..0000000 --- a/src/DjangoBlog/oauth/views.py +++ /dev/null @@ -1,253 +0,0 @@ -import logging -# Create your views here. -from urllib.parse import urlparse - -from django.conf import settings -from django.contrib.auth import get_user_model -from django.contrib.auth import login -from django.core.exceptions import ObjectDoesNotExist -from django.db import transaction -from django.http import HttpResponseForbidden -from django.http import HttpResponseRedirect -from django.shortcuts import get_object_or_404 -from django.shortcuts import render -from django.urls import reverse -from django.utils import timezone -from django.utils.translation import gettext_lazy as _ -from django.views.generic import FormView - -from djangoblog.blog_signals import oauth_user_login_signal -from djangoblog.utils import get_current_site -from djangoblog.utils import send_email, get_sha256 -from oauth.forms import RequireEmailForm -from .models import OAuthUser -from .oauthmanager import get_manager_by_type, OAuthAccessTokenException - -logger = logging.getLogger(__name__) - - -def get_redirecturl(request): - nexturl = request.GET.get('next_url', None) - if not nexturl or nexturl == '/login/' or nexturl == '/login': - nexturl = '/' - return nexturl - p = urlparse(nexturl) - if p.netloc: - site = get_current_site().domain - if not p.netloc.replace('www.', '') == site.replace('www.', ''): - logger.info('非法url:' + nexturl) - return "/" - return nexturl - - -def oauthlogin(request): - type = request.GET.get('type', None) - if not type: - return HttpResponseRedirect('/') - manager = get_manager_by_type(type) - if not manager: - return HttpResponseRedirect('/') - nexturl = get_redirecturl(request) - authorizeurl = manager.get_authorization_url(nexturl) - return HttpResponseRedirect(authorizeurl) - - -def authorize(request): - type = request.GET.get('type', None) - if not type: - return HttpResponseRedirect('/') - manager = get_manager_by_type(type) - if not manager: - return HttpResponseRedirect('/') - code = request.GET.get('code', None) - try: - rsp = manager.get_access_token_by_code(code) - except OAuthAccessTokenException as e: - logger.warning("OAuthAccessTokenException:" + str(e)) - return HttpResponseRedirect('/') - except Exception as e: - logger.error(e) - rsp = None - nexturl = get_redirecturl(request) - if not rsp: - return HttpResponseRedirect(manager.get_authorization_url(nexturl)) - user = manager.get_oauth_userinfo() - if user: - if not user.nickname or not user.nickname.strip(): - user.nickname = "djangoblog" + timezone.now().strftime('%y%m%d%I%M%S') - try: - temp = OAuthUser.objects.get(type=type, openid=user.openid) - temp.picture = user.picture - temp.metadata = user.metadata - temp.nickname = user.nickname - user = temp - except ObjectDoesNotExist: - pass - # facebook的token过长 - if type == 'facebook': - user.token = '' - if user.email: - with transaction.atomic(): - author = None - try: - author = get_user_model().objects.get(id=user.author_id) - except ObjectDoesNotExist: - pass - if not author: - result = get_user_model().objects.get_or_create(email=user.email) - author = result[0] - if result[1]: - try: - get_user_model().objects.get(username=user.nickname) - except ObjectDoesNotExist: - author.username = user.nickname - else: - author.username = "djangoblog" + timezone.now().strftime('%y%m%d%I%M%S') - author.source = 'authorize' - author.save() - - user.author = author - user.save() - - oauth_user_login_signal.send( - sender=authorize.__class__, id=user.id) - login(request, author) - return HttpResponseRedirect(nexturl) - else: - user.save() - url = reverse('oauth:require_email', kwargs={ - 'oauthid': user.id - }) - - return HttpResponseRedirect(url) - else: - return HttpResponseRedirect(nexturl) - - -def emailconfirm(request, id, sign): - if not sign: - return HttpResponseForbidden() - if not get_sha256(settings.SECRET_KEY + - str(id) + - settings.SECRET_KEY).upper() == sign.upper(): - return HttpResponseForbidden() - oauthuser = get_object_or_404(OAuthUser, pk=id) - with transaction.atomic(): - if oauthuser.author: - author = get_user_model().objects.get(pk=oauthuser.author_id) - else: - result = get_user_model().objects.get_or_create(email=oauthuser.email) - author = result[0] - if result[1]: - author.source = 'emailconfirm' - author.username = oauthuser.nickname.strip() if oauthuser.nickname.strip( - ) else "djangoblog" + timezone.now().strftime('%y%m%d%I%M%S') - author.save() - oauthuser.author = author - oauthuser.save() - oauth_user_login_signal.send( - sender=emailconfirm.__class__, - id=oauthuser.id) - login(request, author) - - site = 'http://' + get_current_site().domain - content = _(''' -

Congratulations, you have successfully bound your email address. You can use - %(oauthuser_type)s to directly log in to this website without a password.

- You are welcome to continue to follow this site, the address is - %(site)s - Thank you again! -
- If the link above cannot be opened, please copy this link to your browser. - %(site)s - ''') % {'oauthuser_type': oauthuser.type, 'site': site} - - send_email(emailto=[oauthuser.email, ], title=_('Congratulations on your successful binding!'), content=content) - url = reverse('oauth:bindsuccess', kwargs={ - 'oauthid': id - }) - url = url + '?type=success' - return HttpResponseRedirect(url) - - -class RequireEmailView(FormView): - form_class = RequireEmailForm - template_name = 'oauth/require_email.html' - - def get(self, request, *args, **kwargs): - oauthid = self.kwargs['oauthid'] - oauthuser = get_object_or_404(OAuthUser, pk=oauthid) - if oauthuser.email: - pass - # return HttpResponseRedirect('/') - - return super(RequireEmailView, self).get(request, *args, **kwargs) - - def get_initial(self): - oauthid = self.kwargs['oauthid'] - return { - 'email': '', - 'oauthid': oauthid - } - - def get_context_data(self, **kwargs): - oauthid = self.kwargs['oauthid'] - oauthuser = get_object_or_404(OAuthUser, pk=oauthid) - if oauthuser.picture: - kwargs['picture'] = oauthuser.picture - return super(RequireEmailView, self).get_context_data(**kwargs) - - def form_valid(self, form): - email = form.cleaned_data['email'] - oauthid = form.cleaned_data['oauthid'] - oauthuser = get_object_or_404(OAuthUser, pk=oauthid) - oauthuser.email = email - oauthuser.save() - sign = get_sha256(settings.SECRET_KEY + - str(oauthuser.id) + settings.SECRET_KEY) - site = get_current_site().domain - if settings.DEBUG: - site = '127.0.0.1:8000' - path = reverse('oauth:email_confirm', kwargs={ - 'id': oauthid, - 'sign': sign - }) - url = "http://{site}{path}".format(site=site, path=path) - - content = _(""" -

Please click the link below to bind your email

- - %(url)s - - Thank you again! -
- If the link above cannot be opened, please copy this link to your browser. -
- %(url)s - """) % {'url': url} - send_email(emailto=[email, ], title=_('Bind your email'), content=content) - url = reverse('oauth:bindsuccess', kwargs={ - 'oauthid': oauthid - }) - url = url + '?type=email' - return HttpResponseRedirect(url) - - -def bindsuccess(request, oauthid): - type = request.GET.get('type', None) - oauthuser = get_object_or_404(OAuthUser, pk=oauthid) - if type == 'email': - title = _('Bind your email') - content = _( - 'Congratulations, the binding is just one step away. ' - 'Please log in to your email to check the email to complete the binding. Thank you.') - else: - title = _('Binding successful') - content = _( - "Congratulations, you have successfully bound your email address. You can use %(oauthuser_type)s" - " to directly log in to this website without a password. You are welcome to continue to follow this site." % { - 'oauthuser_type': oauthuser.type}) - return render(request, 'oauth/bindsuccess.html', { - 'title': title, - 'content': content - }) diff --git a/src/DjangoBlog/owntracks/__init__.py b/src/DjangoBlog/owntracks/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/src/DjangoBlog/owntracks/admin.py b/src/DjangoBlog/owntracks/admin.py deleted file mode 100644 index 655b535..0000000 --- a/src/DjangoBlog/owntracks/admin.py +++ /dev/null @@ -1,7 +0,0 @@ -from django.contrib import admin - -# Register your models here. - - -class OwnTrackLogsAdmin(admin.ModelAdmin): - pass diff --git a/src/DjangoBlog/owntracks/apps.py b/src/DjangoBlog/owntracks/apps.py deleted file mode 100644 index 1bc5f12..0000000 --- a/src/DjangoBlog/owntracks/apps.py +++ /dev/null @@ -1,5 +0,0 @@ -from django.apps import AppConfig - - -class OwntracksConfig(AppConfig): - name = 'owntracks' diff --git a/src/DjangoBlog/owntracks/migrations/0001_initial.py b/src/DjangoBlog/owntracks/migrations/0001_initial.py deleted file mode 100644 index 9eee55c..0000000 --- a/src/DjangoBlog/owntracks/migrations/0001_initial.py +++ /dev/null @@ -1,31 +0,0 @@ -# Generated by Django 4.1.7 on 2023-03-02 07:14 - -from django.db import migrations, models -import django.utils.timezone - - -class Migration(migrations.Migration): - - initial = True - - dependencies = [ - ] - - operations = [ - migrations.CreateModel( - name='OwnTrackLog', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('tid', models.CharField(max_length=100, verbose_name='用户')), - ('lat', models.FloatField(verbose_name='纬度')), - ('lon', models.FloatField(verbose_name='经度')), - ('created_time', models.DateTimeField(default=django.utils.timezone.now, verbose_name='创建时间')), - ], - options={ - 'verbose_name': 'OwnTrackLogs', - 'verbose_name_plural': 'OwnTrackLogs', - 'ordering': ['created_time'], - 'get_latest_by': 'created_time', - }, - ), - ] diff --git a/src/DjangoBlog/owntracks/migrations/0002_alter_owntracklog_options_and_more.py b/src/DjangoBlog/owntracks/migrations/0002_alter_owntracklog_options_and_more.py deleted file mode 100644 index b4f8dec..0000000 --- a/src/DjangoBlog/owntracks/migrations/0002_alter_owntracklog_options_and_more.py +++ /dev/null @@ -1,22 +0,0 @@ -# Generated by Django 4.2.5 on 2023-09-06 13:19 - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('owntracks', '0001_initial'), - ] - - operations = [ - migrations.AlterModelOptions( - name='owntracklog', - options={'get_latest_by': 'creation_time', 'ordering': ['creation_time'], 'verbose_name': 'OwnTrackLogs', 'verbose_name_plural': 'OwnTrackLogs'}, - ), - migrations.RenameField( - model_name='owntracklog', - old_name='created_time', - new_name='creation_time', - ), - ] diff --git a/src/DjangoBlog/owntracks/migrations/__init__.py b/src/DjangoBlog/owntracks/migrations/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/src/DjangoBlog/owntracks/models.py b/src/DjangoBlog/owntracks/models.py deleted file mode 100644 index 760942c..0000000 --- a/src/DjangoBlog/owntracks/models.py +++ /dev/null @@ -1,20 +0,0 @@ -from django.db import models -from django.utils.timezone import now - - -# Create your models here. - -class OwnTrackLog(models.Model): - tid = models.CharField(max_length=100, null=False, verbose_name='用户') - lat = models.FloatField(verbose_name='纬度') - lon = models.FloatField(verbose_name='经度') - creation_time = models.DateTimeField('创建时间', default=now) - - def __str__(self): - return self.tid - - class Meta: - ordering = ['creation_time'] - verbose_name = "OwnTrackLogs" - verbose_name_plural = verbose_name - get_latest_by = 'creation_time' diff --git a/src/DjangoBlog/owntracks/tests.py b/src/DjangoBlog/owntracks/tests.py deleted file mode 100644 index 3b4b9d8..0000000 --- a/src/DjangoBlog/owntracks/tests.py +++ /dev/null @@ -1,64 +0,0 @@ -import json - -from django.test import Client, RequestFactory, TestCase - -from accounts.models import BlogUser -from .models import OwnTrackLog - - -# Create your tests here. - -class OwnTrackLogTest(TestCase): - def setUp(self): - self.client = Client() - self.factory = RequestFactory() - - def test_own_track_log(self): - o = { - 'tid': 12, - 'lat': 123.123, - 'lon': 134.341 - } - - self.client.post( - '/owntracks/logtracks', - json.dumps(o), - content_type='application/json') - length = len(OwnTrackLog.objects.all()) - self.assertEqual(length, 1) - - o = { - 'tid': 12, - 'lat': 123.123 - } - - self.client.post( - '/owntracks/logtracks', - json.dumps(o), - content_type='application/json') - length = len(OwnTrackLog.objects.all()) - self.assertEqual(length, 1) - - rsp = self.client.get('/owntracks/show_maps') - self.assertEqual(rsp.status_code, 302) - - user = BlogUser.objects.create_superuser( - email="liangliangyy1@gmail.com", - username="liangliangyy1", - password="liangliangyy1") - - self.client.login(username='liangliangyy1', password='liangliangyy1') - s = OwnTrackLog() - s.tid = 12 - s.lon = 123.234 - s.lat = 34.234 - s.save() - - rsp = self.client.get('/owntracks/show_dates') - self.assertEqual(rsp.status_code, 200) - rsp = self.client.get('/owntracks/show_maps') - self.assertEqual(rsp.status_code, 200) - rsp = self.client.get('/owntracks/get_datas') - self.assertEqual(rsp.status_code, 200) - rsp = self.client.get('/owntracks/get_datas?date=2018-02-26') - self.assertEqual(rsp.status_code, 200) diff --git a/src/DjangoBlog/owntracks/urls.py b/src/DjangoBlog/owntracks/urls.py deleted file mode 100644 index c19ada8..0000000 --- a/src/DjangoBlog/owntracks/urls.py +++ /dev/null @@ -1,12 +0,0 @@ -from django.urls import path - -from . import views - -app_name = "owntracks" - -urlpatterns = [ - path('owntracks/logtracks', views.manage_owntrack_log, name='logtracks'), - path('owntracks/show_maps', views.show_maps, name='show_maps'), - path('owntracks/get_datas', views.get_datas, name='get_datas'), - path('owntracks/show_dates', views.show_log_dates, name='show_dates') -] diff --git a/src/DjangoBlog/owntracks/views.py b/src/DjangoBlog/owntracks/views.py deleted file mode 100644 index 4c72bdd..0000000 --- a/src/DjangoBlog/owntracks/views.py +++ /dev/null @@ -1,127 +0,0 @@ -# Create your views here. -import datetime -import itertools -import json -import logging -from datetime import timezone -from itertools import groupby - -import django -import requests -from django.contrib.auth.decorators import login_required -from django.http import HttpResponse -from django.http import JsonResponse -from django.shortcuts import render -from django.views.decorators.csrf import csrf_exempt - -from .models import OwnTrackLog - -logger = logging.getLogger(__name__) - - -@csrf_exempt -def manage_owntrack_log(request): - try: - s = json.loads(request.read().decode('utf-8')) - tid = s['tid'] - lat = s['lat'] - lon = s['lon'] - - logger.info( - 'tid:{tid}.lat:{lat}.lon:{lon}'.format( - tid=tid, lat=lat, lon=lon)) - if tid and lat and lon: - m = OwnTrackLog() - m.tid = tid - m.lat = lat - m.lon = lon - m.save() - return HttpResponse('ok') - else: - return HttpResponse('data error') - except Exception as e: - logger.error(e) - return HttpResponse('error') - - -@login_required -def show_maps(request): - if request.user.is_superuser: - defaultdate = str(datetime.datetime.now(timezone.utc).date()) - date = request.GET.get('date', defaultdate) - context = { - 'date': date - } - return render(request, 'owntracks/show_maps.html', context) - else: - from django.http import HttpResponseForbidden - return HttpResponseForbidden() - - -@login_required -def show_log_dates(request): - dates = OwnTrackLog.objects.values_list('creation_time', flat=True) - results = list(sorted(set(map(lambda x: x.strftime('%Y-%m-%d'), dates)))) - - context = { - 'results': results - } - return render(request, 'owntracks/show_log_dates.html', context) - - -def convert_to_amap(locations): - convert_result = [] - it = iter(locations) - - item = list(itertools.islice(it, 30)) - while item: - datas = ';'.join( - set(map(lambda x: str(x.lon) + ',' + str(x.lat), item))) - - key = '8440a376dfc9743d8924bf0ad141f28e' - api = 'http://restapi.amap.com/v3/assistant/coordinate/convert' - query = { - 'key': key, - 'locations': datas, - 'coordsys': 'gps' - } - rsp = requests.get(url=api, params=query) - result = json.loads(rsp.text) - if "locations" in result: - convert_result.append(result['locations']) - item = list(itertools.islice(it, 30)) - - return ";".join(convert_result) - - -@login_required -def get_datas(request): - now = django.utils.timezone.now().replace(tzinfo=timezone.utc) - querydate = django.utils.timezone.datetime( - now.year, now.month, now.day, 0, 0, 0) - if request.GET.get('date', None): - date = list(map(lambda x: int(x), request.GET.get('date').split('-'))) - querydate = django.utils.timezone.datetime( - date[0], date[1], date[2], 0, 0, 0) - nextdate = querydate + datetime.timedelta(days=1) - models = OwnTrackLog.objects.filter( - creation_time__range=(querydate, nextdate)) - result = list() - if models and len(models): - for tid, item in groupby( - sorted(models, key=lambda k: k.tid), key=lambda k: k.tid): - - d = dict() - d["name"] = tid - paths = list() - # 使用高德转换后的经纬度 - # locations = convert_to_amap( - # sorted(item, key=lambda x: x.creation_time)) - # for i in locations.split(';'): - # paths.append(i.split(',')) - # 使用GPS原始经纬度 - for location in sorted(item, key=lambda x: x.creation_time): - paths.append([str(location.lon), str(location.lat)]) - d["path"] = paths - result.append(d) - return JsonResponse(result, safe=False) diff --git a/src/DjangoBlog/plugins/__init__.py b/src/DjangoBlog/plugins/__init__.py deleted file mode 100644 index e88afca..0000000 --- a/src/DjangoBlog/plugins/__init__.py +++ /dev/null @@ -1 +0,0 @@ -# This file makes this a Python package diff --git a/src/DjangoBlog/plugins/article_copyright/__init__.py b/src/DjangoBlog/plugins/article_copyright/__init__.py deleted file mode 100644 index e88afca..0000000 --- a/src/DjangoBlog/plugins/article_copyright/__init__.py +++ /dev/null @@ -1 +0,0 @@ -# This file makes this a Python package diff --git a/src/DjangoBlog/plugins/article_copyright/plugin.py b/src/DjangoBlog/plugins/article_copyright/plugin.py deleted file mode 100644 index 5dba3b3..0000000 --- a/src/DjangoBlog/plugins/article_copyright/plugin.py +++ /dev/null @@ -1,37 +0,0 @@ -from djangoblog.plugin_manage.base_plugin import BasePlugin -from djangoblog.plugin_manage import hooks -from djangoblog.plugin_manage.hook_constants import ARTICLE_CONTENT_HOOK_NAME - - -class ArticleCopyrightPlugin(BasePlugin): - PLUGIN_NAME = '文章结尾版权声明' - PLUGIN_DESCRIPTION = '一个在文章正文末尾添加版权声明的插件。' - PLUGIN_VERSION = '0.2.0' - PLUGIN_AUTHOR = 'liangliangyy' - - # 2. 实现 register_hooks 方法,专门用于注册钩子 - def register_hooks(self): - # 在这里将插件的方法注册到指定的钩子上 - hooks.register(ARTICLE_CONTENT_HOOK_NAME, self.add_copyright_to_content) - - def add_copyright_to_content(self, content, *args, **kwargs): - """ - 这个方法会被注册到 'the_content' 过滤器钩子上。 - 它接收原始内容,并返回添加了版权信息的新内容。 - """ - article = kwargs.get('article') - if not article: - return content - - # 如果是摘要模式(首页),不添加版权声明 - is_summary = kwargs.get('is_summary', False) - if is_summary: - return content - - copyright_info = f"\n

本文由 {article.author.username} 原创,转载请注明出处。

" - return content + copyright_info - - -# 3. 实例化插件。 -# 这会自动调用 BasePlugin.__init__,然后 BasePlugin.__init__ 会调用我们上面定义的 register_hooks 方法。 -plugin = ArticleCopyrightPlugin() diff --git a/src/DjangoBlog/plugins/article_recommendation/__init__.py b/src/DjangoBlog/plugins/article_recommendation/__init__.py deleted file mode 100644 index 951f2ff..0000000 --- a/src/DjangoBlog/plugins/article_recommendation/__init__.py +++ /dev/null @@ -1 +0,0 @@ -# 文章推荐插件 diff --git a/src/DjangoBlog/plugins/article_recommendation/plugin.py b/src/DjangoBlog/plugins/article_recommendation/plugin.py deleted file mode 100644 index 6656a07..0000000 --- a/src/DjangoBlog/plugins/article_recommendation/plugin.py +++ /dev/null @@ -1,205 +0,0 @@ -import logging -from djangoblog.plugin_manage.base_plugin import BasePlugin -from djangoblog.plugin_manage import hooks -from djangoblog.plugin_manage.hook_constants import ARTICLE_DETAIL_LOAD -from blog.models import Article - -logger = logging.getLogger(__name__) - - -class ArticleRecommendationPlugin(BasePlugin): - PLUGIN_NAME = '文章推荐' - PLUGIN_DESCRIPTION = '智能文章推荐系统,支持多位置展示' - PLUGIN_VERSION = '1.0.0' - PLUGIN_AUTHOR = 'liangliangyy' - - # 支持的位置 - SUPPORTED_POSITIONS = ['article_bottom'] - - # 各位置优先级 - POSITION_PRIORITIES = { - 'article_bottom': 80, # 文章底部优先级 - } - - # 插件配置 - CONFIG = { - 'article_bottom_count': 8, # 文章底部推荐数量 - 'sidebar_count': 5, # 侧边栏推荐数量 - 'enable_category_fallback': True, # 启用分类回退 - 'enable_popular_fallback': True, # 启用热门文章回退 - } - - def register_hooks(self): - """注册钩子""" - hooks.register(ARTICLE_DETAIL_LOAD, self.on_article_detail_load) - - def on_article_detail_load(self, article, context, request, *args, **kwargs): - """文章详情页加载时的处理""" - # 可以在这里预加载推荐数据到context中 - recommendations = self.get_recommendations(article) - context['article_recommendations'] = recommendations - - def should_display(self, position, context, **kwargs): - """条件显示逻辑""" - # 只在文章详情页底部显示 - if position == 'article_bottom': - article = kwargs.get('article') or context.get('article') - # 检查是否有文章对象,以及是否不是索引页面 - is_index = context.get('isindex', False) if hasattr(context, 'get') else False - return article is not None and not is_index - - return False - - def render_article_bottom_widget(self, context, **kwargs): - """渲染文章底部推荐""" - article = kwargs.get('article') or context.get('article') - if not article: - return None - - # 使用配置的数量,也可以通过kwargs覆盖 - count = kwargs.get('count', self.CONFIG['article_bottom_count']) - recommendations = self.get_recommendations(article, count=count) - if not recommendations: - return None - - # 将RequestContext转换为普通字典 - context_dict = {} - if hasattr(context, 'flatten'): - context_dict = context.flatten() - elif hasattr(context, 'dicts'): - # 合并所有上下文字典 - for d in context.dicts: - context_dict.update(d) - - template_context = { - 'recommendations': recommendations, - 'article': article, - 'title': '相关推荐', - **context_dict - } - - return self.render_template('bottom_widget.html', template_context) - - def render_sidebar_widget(self, context, **kwargs): - """渲染侧边栏推荐""" - article = context.get('article') - - # 使用配置的数量,也可以通过kwargs覆盖 - count = kwargs.get('count', self.CONFIG['sidebar_count']) - - if article: - # 文章页面,显示相关文章 - recommendations = self.get_recommendations(article, count=count) - title = '相关文章' - else: - # 其他页面,显示热门文章 - recommendations = self.get_popular_articles(count=count) - title = '热门推荐' - - if not recommendations: - return None - - # 将RequestContext转换为普通字典 - context_dict = {} - if hasattr(context, 'flatten'): - context_dict = context.flatten() - elif hasattr(context, 'dicts'): - # 合并所有上下文字典 - for d in context.dicts: - context_dict.update(d) - - template_context = { - 'recommendations': recommendations, - 'title': title, - **context_dict - } - - return self.render_template('sidebar_widget.html', template_context) - - def get_css_files(self): - """返回CSS文件""" - return ['css/recommendation.css'] - - def get_js_files(self): - """返回JS文件""" - return ['js/recommendation.js'] - - def get_recommendations(self, article, count=5): - """获取推荐文章""" - if not article: - return [] - - recommendations = [] - - # 1. 基于标签的推荐 - if article.tags.exists(): - tag_ids = list(article.tags.values_list('id', flat=True)) - tag_based = list(Article.objects.filter( - status='p', - tags__id__in=tag_ids - ).exclude( - id=article.id - ).exclude( - title__isnull=True - ).exclude( - title__exact='' - ).distinct().order_by('-views')[:count]) - recommendations.extend(tag_based) - - # 2. 如果数量不够,基于分类推荐 - if len(recommendations) < count and self.CONFIG['enable_category_fallback']: - needed = count - len(recommendations) - existing_ids = [r.id for r in recommendations] + [article.id] - - category_based = list(Article.objects.filter( - status='p', - category=article.category - ).exclude( - id__in=existing_ids - ).exclude( - title__isnull=True - ).exclude( - title__exact='' - ).order_by('-views')[:needed]) - recommendations.extend(category_based) - - # 3. 如果还是不够,推荐热门文章 - if len(recommendations) < count and self.CONFIG['enable_popular_fallback']: - needed = count - len(recommendations) - existing_ids = [r.id for r in recommendations] + [article.id] - - popular_articles = list(Article.objects.filter( - status='p' - ).exclude( - id__in=existing_ids - ).exclude( - title__isnull=True - ).exclude( - title__exact='' - ).order_by('-views')[:needed]) - recommendations.extend(popular_articles) - - # 过滤掉无效的推荐 - valid_recommendations = [] - for rec in recommendations: - if rec.title and len(rec.title.strip()) > 0: - valid_recommendations.append(rec) - else: - logger.warning(f"过滤掉空标题文章: ID={rec.id}, 标题='{rec.title}'") - - # 调试:记录推荐结果 - logger.info(f"原始推荐数量: {len(recommendations)}, 有效推荐数量: {len(valid_recommendations)}") - for i, rec in enumerate(valid_recommendations): - logger.info(f"推荐 {i+1}: ID={rec.id}, 标题='{rec.title}', 长度={len(rec.title)}") - - return valid_recommendations[:count] - - def get_popular_articles(self, count=3): - """获取热门文章""" - return list(Article.objects.filter( - status='p' - ).order_by('-views')[:count]) - - -# 实例化插件 -plugin = ArticleRecommendationPlugin() diff --git a/src/DjangoBlog/plugins/article_recommendation/static/article_recommendation/css/recommendation.css b/src/DjangoBlog/plugins/article_recommendation/static/article_recommendation/css/recommendation.css deleted file mode 100644 index b223f41..0000000 --- a/src/DjangoBlog/plugins/article_recommendation/static/article_recommendation/css/recommendation.css +++ /dev/null @@ -1,166 +0,0 @@ -/* 文章推荐插件样式 - 与网站风格保持一致 */ - -/* 文章底部推荐样式 */ -.article-recommendations { - margin: 30px 0; - padding: 20px; - background: #fff; - border: 1px solid #e1e1e1; - border-radius: 3px; - box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); -} - -.recommendations-title { - margin: 0 0 15px 0; - font-size: 18px; - color: #444; - font-weight: bold; - padding-bottom: 8px; - border-bottom: 2px solid #21759b; - display: inline-block; -} - -.recommendations-icon { - margin-right: 5px; - font-size: 16px; -} - -.recommendations-grid { - display: grid; - gap: 15px; - grid-template-columns: 1fr; - margin-top: 15px; -} - -.recommendation-card { - background: #fff; - border: 1px solid #e1e1e1; - border-radius: 3px; - transition: all 0.2s ease; - overflow: hidden; -} - -.recommendation-card:hover { - border-color: #21759b; - box-shadow: 0 2px 5px rgba(33, 117, 155, 0.1); -} - -.recommendation-link { - display: block; - padding: 15px; - text-decoration: none; - color: inherit; -} - -.recommendation-title { - margin: 0 0 8px 0; - font-size: 15px; - font-weight: normal; - color: #444; - line-height: 1.4; - transition: color 0.2s ease; -} - -.recommendation-card:hover .recommendation-title { - color: #21759b; -} - -.recommendation-meta { - display: flex; - justify-content: space-between; - align-items: center; - font-size: 12px; - color: #757575; -} - -.recommendation-category { - background: #ebebeb; - color: #5e5e5e; - padding: 2px 6px; - border-radius: 2px; - font-size: 11px; - font-weight: normal; -} - -.recommendation-date { - font-weight: normal; - color: #757575; -} - -/* 侧边栏推荐样式 */ -.widget_recommendations { - margin-bottom: 20px; -} - -.widget_recommendations .widget-title { - font-size: 16px; - font-weight: bold; - margin-bottom: 15px; - color: #333; - border-bottom: 2px solid #007cba; - padding-bottom: 5px; -} - -.recommendations-list { - list-style: none; - padding: 0; - margin: 0; -} - -.recommendations-list .recommendation-item { - padding: 8px 0; - border-bottom: 1px solid #eee; - background: none; - border: none; - border-radius: 0; -} - -.recommendations-list .recommendation-item:last-child { - border-bottom: none; -} - -.recommendations-list .recommendation-item a { - color: #333; - text-decoration: none; - font-size: 14px; - line-height: 1.4; - display: block; - margin-bottom: 4px; - transition: color 0.3s ease; -} - -.recommendations-list .recommendation-item a:hover { - color: #007cba; -} - -.recommendations-list .recommendation-meta { - font-size: 11px; - color: #999; - margin: 0; -} - -.recommendations-list .recommendation-meta span { - margin-right: 10px; -} - -/* 响应式设计 - 分栏显示 */ -@media (min-width: 768px) { - .recommendations-grid { - grid-template-columns: repeat(2, 1fr); - gap: 15px; - } -} - -@media (min-width: 1024px) { - .recommendations-grid { - grid-template-columns: repeat(3, 1fr); - gap: 15px; - } -} - -@media (min-width: 1200px) { - .recommendations-grid { - grid-template-columns: repeat(4, 1fr); - gap: 15px; - } -} diff --git a/src/DjangoBlog/plugins/article_recommendation/static/article_recommendation/js/recommendation.js b/src/DjangoBlog/plugins/article_recommendation/static/article_recommendation/js/recommendation.js deleted file mode 100644 index eb19211..0000000 --- a/src/DjangoBlog/plugins/article_recommendation/static/article_recommendation/js/recommendation.js +++ /dev/null @@ -1,93 +0,0 @@ -/** - * 文章推荐插件JavaScript - */ - -(function() { - 'use strict'; - - // 等待DOM加载完成 - document.addEventListener('DOMContentLoaded', function() { - initRecommendations(); - }); - - function initRecommendations() { - // 添加点击统计 - trackRecommendationClicks(); - - // 懒加载优化(如果需要) - lazyLoadRecommendations(); - } - - function trackRecommendationClicks() { - const recommendationLinks = document.querySelectorAll('.recommendation-item a'); - - recommendationLinks.forEach(function(link) { - link.addEventListener('click', function(e) { - // 可以在这里添加点击统计逻辑 - const articleTitle = this.textContent.trim(); - const articleUrl = this.href; - - // 发送统计数据到后端(可选) - if (typeof gtag !== 'undefined') { - gtag('event', 'click', { - 'event_category': 'recommendation', - 'event_label': articleTitle, - 'value': 1 - }); - } - - console.log('Recommendation clicked:', articleTitle, articleUrl); - }); - }); - } - - function lazyLoadRecommendations() { - // 如果推荐内容很多,可以实现懒加载 - const recommendationContainer = document.querySelector('.article-recommendations'); - - if (!recommendationContainer) { - return; - } - - // 检查是否在视窗中 - const observer = new IntersectionObserver(function(entries) { - entries.forEach(function(entry) { - if (entry.isIntersecting) { - entry.target.classList.add('loaded'); - observer.unobserve(entry.target); - } - }); - }, { - threshold: 0.1 - }); - - const recommendationItems = document.querySelectorAll('.recommendation-item'); - recommendationItems.forEach(function(item) { - observer.observe(item); - }); - } - - // 添加一些动画效果 - function addAnimations() { - const recommendationItems = document.querySelectorAll('.recommendation-item'); - - recommendationItems.forEach(function(item, index) { - item.style.opacity = '0'; - item.style.transform = 'translateY(20px)'; - item.style.transition = 'opacity 0.5s ease, transform 0.5s ease'; - - setTimeout(function() { - item.style.opacity = '1'; - item.style.transform = 'translateY(0)'; - }, index * 100); - }); - } - - // 如果需要,可以在这里添加更多功能 - window.ArticleRecommendation = { - init: initRecommendations, - track: trackRecommendationClicks, - animate: addAnimations - }; - -})(); diff --git a/src/DjangoBlog/plugins/external_links/__init__.py b/src/DjangoBlog/plugins/external_links/__init__.py deleted file mode 100644 index e88afca..0000000 --- a/src/DjangoBlog/plugins/external_links/__init__.py +++ /dev/null @@ -1 +0,0 @@ -# This file makes this a Python package diff --git a/src/DjangoBlog/plugins/external_links/plugin.py b/src/DjangoBlog/plugins/external_links/plugin.py deleted file mode 100644 index 5b2ef14..0000000 --- a/src/DjangoBlog/plugins/external_links/plugin.py +++ /dev/null @@ -1,48 +0,0 @@ -import re -from urllib.parse import urlparse -from djangoblog.plugin_manage.base_plugin import BasePlugin -from djangoblog.plugin_manage import hooks -from djangoblog.plugin_manage.hook_constants import ARTICLE_CONTENT_HOOK_NAME - - -class ExternalLinksPlugin(BasePlugin): - PLUGIN_NAME = '外部链接处理器' - PLUGIN_DESCRIPTION = '自动为文章中的外部链接添加 target="_blank" 和 rel="noopener noreferrer" 属性。' - PLUGIN_VERSION = '0.1.0' - PLUGIN_AUTHOR = 'liangliangyy' - - def register_hooks(self): - hooks.register(ARTICLE_CONTENT_HOOK_NAME, self.process_external_links) - - def process_external_links(self, content, *args, **kwargs): - from djangoblog.utils import get_current_site - site_domain = get_current_site().domain - - # 正则表达式查找所有 标签 - link_pattern = re.compile(r'(]*?\s+)?href=")([^"]*)(".*?/a>)', re.IGNORECASE) - - def replacer(match): - # match.group(1) 是 ... - href = match.group(2) - - # 如果链接已经有 target 属性,则不处理 - if 'target=' in match.group(0).lower(): - return match.group(0) - - # 解析链接 - parsed_url = urlparse(href) - - # 如果链接是外部的 (有域名且域名不等于当前网站域名) - if parsed_url.netloc and parsed_url.netloc != site_domain: - # 添加 target 和 rel 属性 - return f'{match.group(1)}{href}" target="_blank" rel="noopener noreferrer"{match.group(3)}' - - # 否则返回原样 - return match.group(0) - - return link_pattern.sub(replacer, content) - - -plugin = ExternalLinksPlugin() diff --git a/src/DjangoBlog/plugins/image_lazy_loading/__init__.py b/src/DjangoBlog/plugins/image_lazy_loading/__init__.py deleted file mode 100644 index 2d27de0..0000000 --- a/src/DjangoBlog/plugins/image_lazy_loading/__init__.py +++ /dev/null @@ -1 +0,0 @@ -# Image Lazy Loading Plugin diff --git a/src/DjangoBlog/plugins/image_lazy_loading/plugin.py b/src/DjangoBlog/plugins/image_lazy_loading/plugin.py deleted file mode 100644 index b4b9e0a..0000000 --- a/src/DjangoBlog/plugins/image_lazy_loading/plugin.py +++ /dev/null @@ -1,182 +0,0 @@ -import re -import hashlib -from urllib.parse import urlparse -from djangoblog.plugin_manage.base_plugin import BasePlugin -from djangoblog.plugin_manage import hooks -from djangoblog.plugin_manage.hook_constants import ARTICLE_CONTENT_HOOK_NAME - - -class ImageOptimizationPlugin(BasePlugin): - PLUGIN_NAME = '图片性能优化插件' - PLUGIN_DESCRIPTION = '自动为文章中的图片添加懒加载、异步解码等性能优化属性,显著提升页面加载速度。' - PLUGIN_VERSION = '1.0.0' - PLUGIN_AUTHOR = 'liangliangyy' - - def __init__(self): - # 插件配置 - self.config = { - 'enable_lazy_loading': True, # 启用懒加载 - 'enable_async_decoding': True, # 启用异步解码 - 'add_loading_placeholder': True, # 添加加载占位符 - 'optimize_external_images': True, # 优化外部图片 - 'add_responsive_attributes': True, # 添加响应式属性 - 'skip_first_image': True, # 跳过第一张图片(LCP优化) - } - super().__init__() - - def register_hooks(self): - hooks.register(ARTICLE_CONTENT_HOOK_NAME, self.optimize_images) - - def optimize_images(self, content, *args, **kwargs): - """ - 优化文章中的图片标签 - """ - if not content: - return content - - # 正则表达式匹配 img 标签 - img_pattern = re.compile( - r']*?)(?:\s*/)?>', - re.IGNORECASE | re.DOTALL - ) - - image_count = 0 - - def replace_img_tag(match): - nonlocal image_count - image_count += 1 - - # 获取原始属性 - original_attrs = match.group(1) - - # 解析现有属性 - attrs = self._parse_img_attributes(original_attrs) - - # 应用优化 - optimized_attrs = self._apply_optimizations(attrs, image_count) - - # 重构 img 标签 - return self._build_img_tag(optimized_attrs) - - # 替换所有 img 标签 - optimized_content = img_pattern.sub(replace_img_tag, content) - - return optimized_content - - def _parse_img_attributes(self, attr_string): - """ - 解析 img 标签的属性 - """ - attrs = {} - - # 正则表达式匹配属性 - attr_pattern = re.compile(r'(\w+)=(["\'])(.*?)\2') - - for match in attr_pattern.finditer(attr_string): - attr_name = match.group(1).lower() - attr_value = match.group(3) - attrs[attr_name] = attr_value - - return attrs - - def _apply_optimizations(self, attrs, image_index): - """ - 应用各种图片优化 - """ - # 1. 懒加载优化(跳过第一张图片以优化LCP) - if self.config['enable_lazy_loading']: - if not (self.config['skip_first_image'] and image_index == 1): - if 'loading' not in attrs: - attrs['loading'] = 'lazy' - - # 2. 异步解码 - if self.config['enable_async_decoding']: - if 'decoding' not in attrs: - attrs['decoding'] = 'async' - - # 3. 添加样式优化 - current_style = attrs.get('style', '') - - # 确保图片不会超出容器 - if 'max-width' not in current_style: - if current_style and not current_style.endswith(';'): - current_style += ';' - current_style += 'max-width:100%;height:auto;' - attrs['style'] = current_style - - # 4. 添加 alt 属性(SEO和可访问性) - if 'alt' not in attrs: - # 尝试从图片URL生成有意义的alt文本 - src = attrs.get('src', '') - if src: - # 从文件名生成alt文本 - filename = src.split('/')[-1].split('.')[0] - # 移除常见的无意义字符 - clean_name = re.sub(r'[0-9a-f]{8,}', '', filename) # 移除长hash - clean_name = re.sub(r'[_-]+', ' ', clean_name).strip() - attrs['alt'] = clean_name if clean_name else '文章图片' - else: - attrs['alt'] = '文章图片' - - # 5. 外部图片优化 - if self.config['optimize_external_images'] and 'src' in attrs: - src = attrs['src'] - parsed_url = urlparse(src) - - # 如果是外部图片,添加 referrerpolicy - if parsed_url.netloc and parsed_url.netloc != self._get_current_domain(): - attrs['referrerpolicy'] = 'no-referrer-when-downgrade' - # 为外部图片添加crossorigin属性以支持性能监控 - if 'crossorigin' not in attrs: - attrs['crossorigin'] = 'anonymous' - - # 6. 响应式图片属性(如果配置启用) - if self.config['add_responsive_attributes']: - # 添加 sizes 属性(如果没有的话) - if 'sizes' not in attrs and 'srcset' not in attrs: - attrs['sizes'] = '(max-width: 768px) 100vw, (max-width: 1024px) 50vw, 33vw' - - # 7. 添加图片唯一标识符用于性能追踪 - if 'data-img-id' not in attrs and 'src' in attrs: - img_hash = hashlib.md5(attrs['src'].encode()).hexdigest()[:8] - attrs['data-img-id'] = f'img-{img_hash}' - - # 8. 为第一张图片添加高优先级提示(LCP优化) - if image_index == 1 and self.config['skip_first_image']: - attrs['fetchpriority'] = 'high' - # 移除懒加载以确保快速加载 - if 'loading' in attrs: - del attrs['loading'] - - return attrs - - def _build_img_tag(self, attrs): - """ - 重新构建 img 标签 - """ - attr_strings = [] - - # 确保 src 属性在最前面 - if 'src' in attrs: - attr_strings.append(f'src="{attrs["src"]}"') - - # 添加其他属性 - for key, value in attrs.items(): - if key != 'src': # src 已经添加过了 - attr_strings.append(f'{key}="{value}"') - - return f'' - - def _get_current_domain(self): - """ - 获取当前网站域名 - """ - try: - from djangoblog.utils import get_current_site - return get_current_site().domain - except: - return '' - - -# 实例化插件 -plugin = ImageOptimizationPlugin() diff --git a/src/DjangoBlog/plugins/reading_time/__init__.py b/src/DjangoBlog/plugins/reading_time/__init__.py deleted file mode 100644 index e88afca..0000000 --- a/src/DjangoBlog/plugins/reading_time/__init__.py +++ /dev/null @@ -1 +0,0 @@ -# This file makes this a Python package diff --git a/src/DjangoBlog/plugins/reading_time/plugin.py b/src/DjangoBlog/plugins/reading_time/plugin.py deleted file mode 100644 index 4b929d8..0000000 --- a/src/DjangoBlog/plugins/reading_time/plugin.py +++ /dev/null @@ -1,51 +0,0 @@ -import math -import re -from djangoblog.plugin_manage.base_plugin import BasePlugin -from djangoblog.plugin_manage import hooks -from djangoblog.plugin_manage.hook_constants import ARTICLE_CONTENT_HOOK_NAME - - -class ReadingTimePlugin(BasePlugin): - PLUGIN_NAME = '阅读时间预测' - PLUGIN_DESCRIPTION = '估算文章阅读时间并显示在文章开头。' - PLUGIN_VERSION = '0.1.0' - PLUGIN_AUTHOR = 'liangliangyy' - - def register_hooks(self): - hooks.register(ARTICLE_CONTENT_HOOK_NAME, self.add_reading_time) - - def add_reading_time(self, content, *args, **kwargs): - """ - 计算阅读时间并添加到内容开头。 - 只在文章详情页显示,首页(文章列表页)不显示。 - """ - # 检查是否为摘要模式(首页/文章列表页) - # 通过kwargs中的is_summary参数判断 - is_summary = kwargs.get('is_summary', False) - if is_summary: - # 如果是摘要模式(首页),直接返回原内容,不添加阅读时间 - return content - - # 移除HTML标签和空白字符,以获得纯文本 - clean_content = re.sub(r'<[^>]*>', '', content) - clean_content = clean_content.strip() - - # 中文和英文单词混合计数的一个简单方法 - # 匹配中文字符或连续的非中文字符(视为单词) - words = re.findall(r'[\u4e00-\u9fa5]|\w+', clean_content) - word_count = len(words) - - # 按平均每分钟200字的速度计算 - reading_speed = 200 - reading_minutes = math.ceil(word_count / reading_speed) - - # 如果阅读时间少于1分钟,则显示为1分钟 - if reading_minutes < 1: - reading_minutes = 1 - - reading_time_html = f'

预计阅读时间:{reading_minutes} 分钟

' - - return reading_time_html + content - - -plugin = ReadingTimePlugin() \ No newline at end of file diff --git a/src/DjangoBlog/plugins/seo_optimizer/__init__.py b/src/DjangoBlog/plugins/seo_optimizer/__init__.py deleted file mode 100644 index e88afca..0000000 --- a/src/DjangoBlog/plugins/seo_optimizer/__init__.py +++ /dev/null @@ -1 +0,0 @@ -# This file makes this a Python package diff --git a/src/DjangoBlog/plugins/seo_optimizer/plugin.py b/src/DjangoBlog/plugins/seo_optimizer/plugin.py deleted file mode 100644 index de12c15..0000000 --- a/src/DjangoBlog/plugins/seo_optimizer/plugin.py +++ /dev/null @@ -1,147 +0,0 @@ -import json -from django.utils.html import strip_tags -from django.template.defaultfilters import truncatewords -from djangoblog.plugin_manage.base_plugin import BasePlugin -from djangoblog.plugin_manage import hooks -from blog.models import Article, Category, Tag -from djangoblog.utils import get_blog_setting - - -class SeoOptimizerPlugin(BasePlugin): - PLUGIN_NAME = 'SEO 优化器' - PLUGIN_DESCRIPTION = '为文章、页面等提供 SEO 优化,动态生成 meta 标签和 JSON-LD 结构化数据。' - PLUGIN_VERSION = '0.2.0' - PLUGIN_AUTHOR = 'liuangliangyy' - - def register_hooks(self): - hooks.register('head_meta', self.dispatch_seo_generation) - - def _get_article_seo_data(self, context, request, blog_setting): - article = context.get('article') - if not isinstance(article, Article): - return None - - description = strip_tags(article.body)[:150] - keywords = ",".join([tag.name for tag in article.tags.all()]) or blog_setting.site_keywords - - meta_tags = f''' - - - - - - - - - ''' - for tag in article.tags.all(): - meta_tags += f'' - meta_tags += f'' - - structured_data = { - "@context": "https://schema.org", - "@type": "Article", - "mainEntityOfPage": {"@type": "WebPage", "@id": request.build_absolute_uri()}, - "headline": article.title, - "description": description, - "image": request.build_absolute_uri(article.get_first_image_url()), - "datePublished": article.pub_time.isoformat(), - "dateModified": article.last_modify_time.isoformat(), - "author": {"@type": "Person", "name": article.author.username}, - "publisher": {"@type": "Organization", "name": blog_setting.site_name} - } - if not structured_data.get("image"): - del structured_data["image"] - - return { - "title": f"{article.title} | {blog_setting.site_name}", - "description": description, - "keywords": keywords, - "meta_tags": meta_tags, - "json_ld": structured_data - } - - def _get_category_seo_data(self, context, request, blog_setting): - category_name = context.get('tag_name') - if not category_name: - return None - - category = Category.objects.filter(name=category_name).first() - if not category: - return None - - title = f"{category.name} | {blog_setting.site_name}" - description = strip_tags(category.name) or blog_setting.site_description - keywords = category.name - - # BreadcrumbList structured data for category page - breadcrumb_items = [{"@type": "ListItem", "position": 1, "name": "首页", "item": request.build_absolute_uri('/')}] - breadcrumb_items.append({"@type": "ListItem", "position": 2, "name": category.name, "item": request.build_absolute_uri()}) - - structured_data = { - "@context": "https://schema.org", - "@type": "BreadcrumbList", - "itemListElement": breadcrumb_items - } - - return { - "title": title, - "description": description, - "keywords": keywords, - "meta_tags": "", - "json_ld": structured_data - } - - def _get_default_seo_data(self, context, request, blog_setting): - # Homepage and other default pages - structured_data = { - "@context": "https://schema.org", - "@type": "WebSite", - "name": blog_setting.site_name, - "description": blog_setting.site_description, - "url": request.build_absolute_uri('/'), - "potentialAction": { - "@type": "SearchAction", - "target": f"{request.build_absolute_uri('/search/')}?q={{search_term_string}}", - "query-input": "required name=search_term_string" - } - } - return { - "title": f"{blog_setting.site_name} | {blog_setting.site_description}", - "description": blog_setting.site_description, - "keywords": blog_setting.site_keywords, - "meta_tags": "", - "json_ld": structured_data - } - - def dispatch_seo_generation(self, metas, context): - request = context.get('request') - if not request: - return metas - - view_name = request.resolver_match.view_name - blog_setting = get_blog_setting() - - seo_data = None - if view_name == 'blog:detailbyid': - seo_data = self._get_article_seo_data(context, request, blog_setting) - elif view_name == 'blog:category_detail': - seo_data = self._get_category_seo_data(context, request, blog_setting) - - if not seo_data: - seo_data = self._get_default_seo_data(context, request, blog_setting) - - json_ld_script = f'' - - seo_html = f""" - {seo_data.get("title", "")} - - - {seo_data.get("meta_tags", "")} - {json_ld_script} - """ - - # 将SEO内容追加到现有的metas内容上 - return metas + seo_html - -plugin = SeoOptimizerPlugin() diff --git a/src/DjangoBlog/plugins/view_count/__init__.py b/src/DjangoBlog/plugins/view_count/__init__.py deleted file mode 100644 index 8804fdf..0000000 --- a/src/DjangoBlog/plugins/view_count/__init__.py +++ /dev/null @@ -1 +0,0 @@ -# This file makes this a Python package \ No newline at end of file diff --git a/src/DjangoBlog/plugins/view_count/plugin.py b/src/DjangoBlog/plugins/view_count/plugin.py deleted file mode 100644 index 15e9d94..0000000 --- a/src/DjangoBlog/plugins/view_count/plugin.py +++ /dev/null @@ -1,18 +0,0 @@ -from djangoblog.plugin_manage.base_plugin import BasePlugin -from djangoblog.plugin_manage import hooks - - -class ViewCountPlugin(BasePlugin): - PLUGIN_NAME = '文章浏览次数统计' - PLUGIN_DESCRIPTION = '统计文章的浏览次数' - PLUGIN_VERSION = '0.1.0' - PLUGIN_AUTHOR = 'liangliangyy' - - def register_hooks(self): - hooks.register('after_article_body_get', self.record_view) - - def record_view(self, article, *args, **kwargs): - article.viewed() - - -plugin = ViewCountPlugin() \ No newline at end of file diff --git a/src/DjangoBlog/requirements.txt b/src/DjangoBlog/requirements.txt deleted file mode 100644 index e5878ab4aeeaa51d900303316547b76417f38ad0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1654 zcmZ{k%Wm6H3`Fm`KtCl#q&%E1x+%IU5Flt5Su3(4JFymJ0QNK7ui}_JG0*G z@6YW1{K$GCT(1Y8ZF)9zCN#&Roua`t!mkx~qo>n9;$I6-lx!kGWqA}r4!QyQQb=-| zim(u)op6JG%k*maD`7cP_@&tV6c$EN3H(nnY0_M%d0NVQFn28Vo$|g-TX9+GU7L4T zA(&LM6vlNat{eG=N2rD-ndRwR{*S&8C!z#@s_AUd7p+?{#+q9lJ|6O`EpO~}jAN)2 zJaf}xp|6dscxrX%nlXEH279$fzo<4K2)?o7RhJ9)uY2op?mn*e9p>-$O%Ot5Fh zbL=7S;6atx=@iPC`UM|X%@qJiv{ERPbrfCW*)x&7yp(#QK3(85;TpIKApV_$=%zcX z(1S3wwDO#NQb1&B)Ehs8STL=04O&*}&cX79KR3X`uosR=icF60p3hC_FomU#wRxi3 zeJA0cK6UP=ykcUOQh8@p_1(mcsMnBwnT5H_ZFhL3m>)Jvql~_NH)f9Mh2Lq>rk zOIOJ!>O5Pv3;n_#_6a@a4KLT@QK)Z<@>$2H+^aJ7;G=Z~db>W{WdnJ|gCldnR*h~) HLHG0*m_PM{ diff --git a/src/DjangoBlog/servermanager/MemcacheStorage.py b/src/DjangoBlog/servermanager/MemcacheStorage.py deleted file mode 100644 index 38a7990..0000000 --- a/src/DjangoBlog/servermanager/MemcacheStorage.py +++ /dev/null @@ -1,32 +0,0 @@ -from werobot.session import SessionStorage -from werobot.utils import json_loads, json_dumps - -from djangoblog.utils import cache - - -class MemcacheStorage(SessionStorage): - def __init__(self, prefix='ws_'): - self.prefix = prefix - self.cache = cache - - @property - def is_available(self): - value = "1" - self.set('checkavaliable', value=value) - return value == self.get('checkavaliable') - - def key_name(self, s): - return '{prefix}{s}'.format(prefix=self.prefix, s=s) - - def get(self, id): - id = self.key_name(id) - session_json = self.cache.get(id) or '{}' - return json_loads(session_json) - - def set(self, id, value): - id = self.key_name(id) - self.cache.set(id, json_dumps(value)) - - def delete(self, id): - id = self.key_name(id) - self.cache.delete(id) diff --git a/src/DjangoBlog/servermanager/__init__.py b/src/DjangoBlog/servermanager/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/src/DjangoBlog/servermanager/admin.py b/src/DjangoBlog/servermanager/admin.py deleted file mode 100644 index f26f4f6..0000000 --- a/src/DjangoBlog/servermanager/admin.py +++ /dev/null @@ -1,19 +0,0 @@ -from django.contrib import admin -# Register your models here. - - -class CommandsAdmin(admin.ModelAdmin): - list_display = ('title', 'command', 'describe') - - -class EmailSendLogAdmin(admin.ModelAdmin): - list_display = ('title', 'emailto', 'send_result', 'creation_time') - readonly_fields = ( - 'title', - 'emailto', - 'send_result', - 'creation_time', - 'content') - - def has_add_permission(self, request): - return False diff --git a/src/DjangoBlog/servermanager/api/__init__.py b/src/DjangoBlog/servermanager/api/__init__.py deleted file mode 100644 index 8b13789..0000000 --- a/src/DjangoBlog/servermanager/api/__init__.py +++ /dev/null @@ -1 +0,0 @@ - diff --git a/src/DjangoBlog/servermanager/api/blogapi.py b/src/DjangoBlog/servermanager/api/blogapi.py deleted file mode 100644 index 8a4d6ac..0000000 --- a/src/DjangoBlog/servermanager/api/blogapi.py +++ /dev/null @@ -1,27 +0,0 @@ -from haystack.query import SearchQuerySet - -from blog.models import Article, Category - - -class BlogApi: - def __init__(self): - self.searchqueryset = SearchQuerySet() - self.searchqueryset.auto_query('') - self.__max_takecount__ = 8 - - def search_articles(self, query): - sqs = self.searchqueryset.auto_query(query) - sqs = sqs.load_all() - return sqs[:self.__max_takecount__] - - def get_category_lists(self): - return Category.objects.all() - - def get_category_articles(self, categoryname): - articles = Article.objects.filter(category__name=categoryname) - if articles: - return articles[:self.__max_takecount__] - return None - - def get_recent_articles(self): - return Article.objects.all()[:self.__max_takecount__] diff --git a/src/DjangoBlog/servermanager/api/commonapi.py b/src/DjangoBlog/servermanager/api/commonapi.py deleted file mode 100644 index 83ad9ff..0000000 --- a/src/DjangoBlog/servermanager/api/commonapi.py +++ /dev/null @@ -1,64 +0,0 @@ -import logging -import os - -import openai - -from servermanager.models import commands - -logger = logging.getLogger(__name__) - -openai.api_key = os.environ.get('OPENAI_API_KEY') -if os.environ.get('HTTP_PROXY'): - openai.proxy = os.environ.get('HTTP_PROXY') - - -class ChatGPT: - - @staticmethod - def chat(prompt): - try: - completion = openai.ChatCompletion.create(model="gpt-3.5-turbo", - messages=[{"role": "user", "content": prompt}]) - return completion.choices[0].message.content - except Exception as e: - logger.error(e) - return "服务器出错了" - - -class CommandHandler: - def __init__(self): - self.commands = commands.objects.all() - - def run(self, title): - """ - 运行命令 - :param title: 命令 - :return: 返回命令执行结果 - """ - cmd = list( - filter( - lambda x: x.title.upper() == title.upper(), - self.commands)) - if cmd: - return self.__run_command__(cmd[0].command) - else: - return "未找到相关命令,请输入hepme获得帮助。" - - def __run_command__(self, cmd): - try: - res = os.popen(cmd).read() - return res - except BaseException: - return '命令执行出错!' - - def get_help(self): - rsp = '' - for cmd in self.commands: - rsp += '{c}:{d}\n'.format(c=cmd.title, d=cmd.describe) - return rsp - - -if __name__ == '__main__': - chatbot = ChatGPT() - prompt = "写一篇1000字关于AI的论文" - print(chatbot.chat(prompt)) diff --git a/src/DjangoBlog/servermanager/apps.py b/src/DjangoBlog/servermanager/apps.py deleted file mode 100644 index 03cc38d..0000000 --- a/src/DjangoBlog/servermanager/apps.py +++ /dev/null @@ -1,5 +0,0 @@ -from django.apps import AppConfig - - -class ServermanagerConfig(AppConfig): - name = 'servermanager' diff --git a/src/DjangoBlog/servermanager/migrations/0001_initial.py b/src/DjangoBlog/servermanager/migrations/0001_initial.py deleted file mode 100644 index bbdbf77..0000000 --- a/src/DjangoBlog/servermanager/migrations/0001_initial.py +++ /dev/null @@ -1,45 +0,0 @@ -# Generated by Django 4.1.7 on 2023-03-02 07:14 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - initial = True - - dependencies = [ - ] - - operations = [ - migrations.CreateModel( - name='commands', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('title', models.CharField(max_length=300, verbose_name='命令标题')), - ('command', models.CharField(max_length=2000, verbose_name='命令')), - ('describe', models.CharField(max_length=300, verbose_name='命令描述')), - ('created_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')), - ('last_mod_time', models.DateTimeField(auto_now=True, verbose_name='修改时间')), - ], - options={ - 'verbose_name': '命令', - 'verbose_name_plural': '命令', - }, - ), - migrations.CreateModel( - name='EmailSendLog', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('emailto', models.CharField(max_length=300, verbose_name='收件人')), - ('title', models.CharField(max_length=2000, verbose_name='邮件标题')), - ('content', models.TextField(verbose_name='邮件内容')), - ('send_result', models.BooleanField(default=False, verbose_name='结果')), - ('created_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')), - ], - options={ - 'verbose_name': '邮件发送log', - 'verbose_name_plural': '邮件发送log', - 'ordering': ['-created_time'], - }, - ), - ] diff --git a/src/DjangoBlog/servermanager/migrations/0002_alter_emailsendlog_options_and_more.py b/src/DjangoBlog/servermanager/migrations/0002_alter_emailsendlog_options_and_more.py deleted file mode 100644 index 4858857..0000000 --- a/src/DjangoBlog/servermanager/migrations/0002_alter_emailsendlog_options_and_more.py +++ /dev/null @@ -1,32 +0,0 @@ -# Generated by Django 4.2.5 on 2023-09-06 13:19 - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('servermanager', '0001_initial'), - ] - - operations = [ - migrations.AlterModelOptions( - name='emailsendlog', - options={'ordering': ['-creation_time'], 'verbose_name': '邮件发送log', 'verbose_name_plural': '邮件发送log'}, - ), - migrations.RenameField( - model_name='commands', - old_name='created_time', - new_name='creation_time', - ), - migrations.RenameField( - model_name='commands', - old_name='last_mod_time', - new_name='last_modify_time', - ), - migrations.RenameField( - model_name='emailsendlog', - old_name='created_time', - new_name='creation_time', - ), - ] diff --git a/src/DjangoBlog/servermanager/migrations/__init__.py b/src/DjangoBlog/servermanager/migrations/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/src/DjangoBlog/servermanager/models.py b/src/DjangoBlog/servermanager/models.py deleted file mode 100644 index 4326c65..0000000 --- a/src/DjangoBlog/servermanager/models.py +++ /dev/null @@ -1,33 +0,0 @@ -from django.db import models - - -# Create your models here. -class commands(models.Model): - title = models.CharField('命令标题', max_length=300) - command = models.CharField('命令', max_length=2000) - describe = models.CharField('命令描述', max_length=300) - creation_time = models.DateTimeField('创建时间', auto_now_add=True) - last_modify_time = models.DateTimeField('修改时间', auto_now=True) - - def __str__(self): - return self.title - - class Meta: - verbose_name = '命令' - verbose_name_plural = verbose_name - - -class EmailSendLog(models.Model): - emailto = models.CharField('收件人', max_length=300) - title = models.CharField('邮件标题', max_length=2000) - content = models.TextField('邮件内容') - send_result = models.BooleanField('结果', default=False) - creation_time = models.DateTimeField('创建时间', auto_now_add=True) - - def __str__(self): - return self.title - - class Meta: - verbose_name = '邮件发送log' - verbose_name_plural = verbose_name - ordering = ['-creation_time'] diff --git a/src/DjangoBlog/servermanager/robot.py b/src/DjangoBlog/servermanager/robot.py deleted file mode 100644 index 7b45736..0000000 --- a/src/DjangoBlog/servermanager/robot.py +++ /dev/null @@ -1,187 +0,0 @@ -import logging -import os -import re - -import jsonpickle -from django.conf import settings -from werobot import WeRoBot -from werobot.replies import ArticlesReply, Article -from werobot.session.filestorage import FileStorage - -from djangoblog.utils import get_sha256 -from servermanager.api.blogapi import BlogApi -from servermanager.api.commonapi import ChatGPT, CommandHandler -from .MemcacheStorage import MemcacheStorage - -robot = WeRoBot(token=os.environ.get('DJANGO_WEROBOT_TOKEN') - or 'lylinux', enable_session=True) -memstorage = MemcacheStorage() -if memstorage.is_available: - robot.config['SESSION_STORAGE'] = memstorage -else: - if os.path.exists(os.path.join(settings.BASE_DIR, 'werobot_session')): - os.remove(os.path.join(settings.BASE_DIR, 'werobot_session')) - robot.config['SESSION_STORAGE'] = FileStorage(filename='werobot_session') - -blogapi = BlogApi() -cmd_handler = CommandHandler() -logger = logging.getLogger(__name__) - - -def convert_to_article_reply(articles, message): - reply = ArticlesReply(message=message) - from blog.templatetags.blog_tags import truncatechars_content - for post in articles: - imgs = re.findall(r'(?:http\:|https\:)?\/\/.*\.(?:png|jpg)', post.body) - imgurl = '' - if imgs: - imgurl = imgs[0] - article = Article( - title=post.title, - description=truncatechars_content(post.body), - img=imgurl, - url=post.get_full_url() - ) - reply.add_article(article) - return reply - - -@robot.filter(re.compile(r"^\?.*")) -def search(message, session): - s = message.content - searchstr = str(s).replace('?', '') - result = blogapi.search_articles(searchstr) - if result: - articles = list(map(lambda x: x.object, result)) - reply = convert_to_article_reply(articles, message) - return reply - else: - return '没有找到相关文章。' - - -@robot.filter(re.compile(r'^category\s*$', re.I)) -def category(message, session): - categorys = blogapi.get_category_lists() - content = ','.join(map(lambda x: x.name, categorys)) - return '所有文章分类目录:' + content - - -@robot.filter(re.compile(r'^recent\s*$', re.I)) -def recents(message, session): - articles = blogapi.get_recent_articles() - if articles: - reply = convert_to_article_reply(articles, message) - return reply - else: - return "暂时还没有文章" - - -@robot.filter(re.compile('^help$', re.I)) -def help(message, session): - return '''欢迎关注! - 默认会与图灵机器人聊天~~ - 你可以通过下面这些命令来获得信息 - ?关键字搜索文章. - 如?python. - category获得文章分类目录及文章数. - category-***获得该分类目录文章 - 如category-python - recent获得最新文章 - help获得帮助. - weather:获得天气 - 如weather:西安 - idcard:获得身份证信息 - 如idcard:61048119xxxxxxxxxx - music:音乐搜索 - 如music:阴天快乐 - PS:以上标点符号都不支持中文标点~~ - ''' - - -@robot.filter(re.compile(r'^weather\:.*$', re.I)) -def weather(message, session): - return "建设中..." - - -@robot.filter(re.compile(r'^idcard\:.*$', re.I)) -def idcard(message, session): - return "建设中..." - - -@robot.handler -def echo(message, session): - handler = MessageHandler(message, session) - return handler.handler() - - -class MessageHandler: - def __init__(self, message, session): - userid = message.source - self.message = message - self.session = session - self.userid = userid - try: - info = session[userid] - self.userinfo = jsonpickle.decode(info) - except Exception as e: - userinfo = WxUserInfo() - self.userinfo = userinfo - - @property - def is_admin(self): - return self.userinfo.isAdmin - - @property - def is_password_set(self): - return self.userinfo.isPasswordSet - - def save_session(self): - info = jsonpickle.encode(self.userinfo) - self.session[self.userid] = info - - def handler(self): - info = self.message.content - - if self.userinfo.isAdmin and info.upper() == 'EXIT': - self.userinfo = WxUserInfo() - self.save_session() - return "退出成功" - if info.upper() == 'ADMIN': - self.userinfo.isAdmin = True - self.save_session() - return "输入管理员密码" - if self.userinfo.isAdmin and not self.userinfo.isPasswordSet: - passwd = settings.WXADMIN - if settings.TESTING: - passwd = '123' - if passwd.upper() == get_sha256(get_sha256(info)).upper(): - self.userinfo.isPasswordSet = True - self.save_session() - return "验证通过,请输入命令或者要执行的命令代码:输入helpme获得帮助" - else: - if self.userinfo.Count >= 3: - self.userinfo = WxUserInfo() - self.save_session() - return "超过验证次数" - self.userinfo.Count += 1 - self.save_session() - return "验证失败,请重新输入管理员密码:" - if self.userinfo.isAdmin and self.userinfo.isPasswordSet: - if self.userinfo.Command != '' and info.upper() == 'Y': - return cmd_handler.run(self.userinfo.Command) - else: - if info.upper() == 'HELPME': - return cmd_handler.get_help() - self.userinfo.Command = info - self.save_session() - return "确认执行: " + info + " 命令?" - - return ChatGPT.chat(info) - - -class WxUserInfo(): - def __init__(self): - self.isAdmin = False - self.isPasswordSet = False - self.Count = 0 - self.Command = '' diff --git a/src/DjangoBlog/servermanager/tests.py b/src/DjangoBlog/servermanager/tests.py deleted file mode 100644 index 22a6689..0000000 --- a/src/DjangoBlog/servermanager/tests.py +++ /dev/null @@ -1,79 +0,0 @@ -from django.test import Client, RequestFactory, TestCase -from django.utils import timezone -from werobot.messages.messages import TextMessage - -from accounts.models import BlogUser -from blog.models import Category, Article -from servermanager.api.commonapi import ChatGPT -from .models import commands -from .robot import MessageHandler, CommandHandler -from .robot import search, category, recents - - -# Create your tests here. -class ServerManagerTest(TestCase): - def setUp(self): - self.client = Client() - self.factory = RequestFactory() - - def test_chat_gpt(self): - content = ChatGPT.chat("你好") - self.assertIsNotNone(content) - - def test_validate_comment(self): - user = BlogUser.objects.create_superuser( - email="liangliangyy1@gmail.com", - username="liangliangyy1", - password="liangliangyy1") - - self.client.login(username='liangliangyy1', password='liangliangyy1') - - c = Category() - c.name = "categoryccc" - c.save() - - article = Article() - article.title = "nicetitleccc" - article.body = "nicecontentccc" - article.author = user - article.category = c - article.type = 'a' - article.status = 'p' - article.save() - s = TextMessage([]) - s.content = "nice" - rsp = search(s, None) - rsp = category(None, None) - self.assertIsNotNone(rsp) - rsp = recents(None, None) - self.assertTrue(rsp != '暂时还没有文章') - - cmd = commands() - cmd.title = "test" - cmd.command = "ls" - cmd.describe = "test" - cmd.save() - - cmdhandler = CommandHandler() - rsp = cmdhandler.run('test') - self.assertIsNotNone(rsp) - s.source = 'u' - s.content = 'test' - msghandler = MessageHandler(s, {}) - - # msghandler.userinfo.isPasswordSet = True - # msghandler.userinfo.isAdmin = True - msghandler.handler() - s.content = 'y' - msghandler.handler() - s.content = 'idcard:12321233' - msghandler.handler() - s.content = 'weather:上海' - msghandler.handler() - s.content = 'admin' - msghandler.handler() - s.content = '123' - msghandler.handler() - - s.content = 'exit' - msghandler.handler() diff --git a/src/DjangoBlog/servermanager/urls.py b/src/DjangoBlog/servermanager/urls.py deleted file mode 100644 index 8d134d2..0000000 --- a/src/DjangoBlog/servermanager/urls.py +++ /dev/null @@ -1,10 +0,0 @@ -from django.urls import path -from werobot.contrib.django import make_view - -from .robot import robot - -app_name = "servermanager" -urlpatterns = [ - path(r'robot', make_view(robot)), - -] diff --git a/src/DjangoBlog/servermanager/views.py b/src/DjangoBlog/servermanager/views.py deleted file mode 100644 index 60f00ef..0000000 --- a/src/DjangoBlog/servermanager/views.py +++ /dev/null @@ -1 +0,0 @@ -# Create your views here. diff --git a/src/DjangoBlog/templates/account/forget_password.html b/src/DjangoBlog/templates/account/forget_password.html deleted file mode 100644 index 3384531..0000000 --- a/src/DjangoBlog/templates/account/forget_password.html +++ /dev/null @@ -1,30 +0,0 @@ -{% extends 'share_layout/base_account.html' %} -{% load i18n %} -{% load static %} -{% block content %} -
- - - - - -

- Home Page - | - login page -

- -
-{% endblock %} \ No newline at end of file diff --git a/src/DjangoBlog/templates/account/login.html b/src/DjangoBlog/templates/account/login.html deleted file mode 100644 index cff8d33..0000000 --- a/src/DjangoBlog/templates/account/login.html +++ /dev/null @@ -1,46 +0,0 @@ -{% extends 'share_layout/base_account.html' %} -{% load static %} -{% load i18n %} -{% block content %} -
- - - - - -

- - {% trans 'Create Account' %} - - | - Home Page - | - - {% trans 'Forget Password' %} - -

- -
-{% endblock %} \ No newline at end of file diff --git a/src/DjangoBlog/templates/account/registration_form.html b/src/DjangoBlog/templates/account/registration_form.html deleted file mode 100644 index 65e7549..0000000 --- a/src/DjangoBlog/templates/account/registration_form.html +++ /dev/null @@ -1,29 +0,0 @@ -{% extends 'share_layout/base_account.html' %} -{% load static %} -{% block content %} -
- - - - - -

- Sign In -

- -
-{% endblock %} \ No newline at end of file diff --git a/src/DjangoBlog/templates/account/result.html b/src/DjangoBlog/templates/account/result.html deleted file mode 100644 index 23c9094..0000000 --- a/src/DjangoBlog/templates/account/result.html +++ /dev/null @@ -1,27 +0,0 @@ -{% extends 'share_layout/base.html' %} -{% load i18n %} -{% block header %} - {{ title }} -{% endblock %} -{% block content %} -
- -
-{% endblock %} \ No newline at end of file diff --git a/src/DjangoBlog/templates/blog/article_archives.html b/src/DjangoBlog/templates/blog/article_archives.html deleted file mode 100644 index 959319e..0000000 --- a/src/DjangoBlog/templates/blog/article_archives.html +++ /dev/null @@ -1,60 +0,0 @@ -{% extends 'share_layout/base.html' %} -{% load blog_tags %} -{% load cache %} -{% load i18n %} -{% block header %} - - {% trans 'article archive' %} | {{ SITE_DESCRIPTION }} - - - - - - - - - -{% endblock %} -{% block content %} -
-
- -
- -

{% trans 'article archive' %}

-
- -
- - {% regroup article_list by pub_time.year as year_post_group %} -
    - {% for year in year_post_group %} -
  • {{ year.grouper }} {% trans 'year' %} - {% regroup year.list by pub_time.month as month_post_group %} -
      - {% for month in month_post_group %} -
    • {{ month.grouper }} {% trans 'month' %} - -
    • - {% endfor %} -
    -
  • - {% endfor %} -
-
-
-
- -{% endblock %} - - -{% block sidebar %} - {% load_sidebar user 'i' %} -{% endblock %} - - diff --git a/src/DjangoBlog/templates/blog/article_detail.html b/src/DjangoBlog/templates/blog/article_detail.html deleted file mode 100755 index a74a0db..0000000 --- a/src/DjangoBlog/templates/blog/article_detail.html +++ /dev/null @@ -1,52 +0,0 @@ -{% extends 'share_layout/base.html' %} -{% load blog_tags %} - -{% block header %} -{% endblock %} -{% block content %} -
-
- {% load_article_detail article False user %} - - {% if article.type == 'a' %} - - {% endif %} - -
- {% if article.comment_status == "o" and OPEN_SITE_COMMENT %} - - - {% include 'comments/tags/comment_list.html' %} - {% if user.is_authenticated %} - {% include 'comments/tags/post_comment.html' %} - {% else %} -
-

您还没有登录,请您登录后发表评论。 -

- - {% load oauth_tags %} - {% load_oauth_applications request %} - -
- {% endif %} - {% endif %} -
- -{% endblock %} - -{% block sidebar %} - {% load_sidebar user "p" %} -{% endblock %} \ No newline at end of file diff --git a/src/DjangoBlog/templates/blog/article_index.html b/src/DjangoBlog/templates/blog/article_index.html deleted file mode 100644 index 0ee6150..0000000 --- a/src/DjangoBlog/templates/blog/article_index.html +++ /dev/null @@ -1,42 +0,0 @@ -{% extends 'share_layout/base.html' %} -{% load blog_tags %} -{% load cache %} -{% block header %} - {% if tag_name %} - {{ page_type }}:{{ tag_name }} | {{ SITE_DESCRIPTION }} - {% comment %}{% endcomment %} - {% else %} - {{ SITE_NAME }} | {{ SITE_DESCRIPTION }} - {% endif %} - - - - - - - -{% endblock %} -{% block content %} -
-
- {% if page_type and tag_name %} -
- -

{{ page_type }}:{{ tag_name }}

-
- {% endif %} - - {% for article in article_list %} - {% load_article_detail article True user %} - {% endfor %} - {% if is_paginated %} - {% load_pagination_info page_obj page_type tag_name %} - - {% endif %} -
-
- -{% endblock %} -{% block sidebar %} - {% load_sidebar user linktype %} -{% endblock %} \ No newline at end of file diff --git a/src/DjangoBlog/templates/blog/error_page.html b/src/DjangoBlog/templates/blog/error_page.html deleted file mode 100644 index d41cfb6..0000000 --- a/src/DjangoBlog/templates/blog/error_page.html +++ /dev/null @@ -1,45 +0,0 @@ -{% extends 'share_layout/base.html' %} -{% load blog_tags %} -{% load cache %} -{% block header %} - {% if tag_name %} - {% if statuscode == '404' %} - 404 NotFound - {% elif statuscode == '403' %} - Permission Denied - {% elif statuscode == '500' %} - 500 Error - {% else %} - - {% endif %} - {% comment %}{% endcomment %} - {% else %} - {{ SITE_NAME }} | {{ SITE_DESCRIPTION }} - {% endif %} - - - - - - - -{% endblock %} -{% block content %} -
-
- -
-

{{ message }}

-
- -
-
- -{% endblock %} - - -{% block sidebar %} - {% load_sidebar user 'i' %} -{% endblock %} - - diff --git a/src/DjangoBlog/templates/blog/links_list.html b/src/DjangoBlog/templates/blog/links_list.html deleted file mode 100644 index ccecbea..0000000 --- a/src/DjangoBlog/templates/blog/links_list.html +++ /dev/null @@ -1,44 +0,0 @@ -{% extends 'share_layout/base.html' %} -{% load blog_tags %} -{% load cache %} -{% block header %} - - 友情链接 | {{ SITE_DESCRIPTION }} - - - - - - - - - -{% endblock %} -{% block content %} -
-
- -
- -

友情链接

-
- -
- -
-
-
- -{% endblock %} - - -{% block sidebar %} - {% load_sidebar user 'i' %} -{% endblock %} - - diff --git a/src/DjangoBlog/templates/blog/tags/article_info.html b/src/DjangoBlog/templates/blog/tags/article_info.html deleted file mode 100644 index 65b45fa..0000000 --- a/src/DjangoBlog/templates/blog/tags/article_info.html +++ /dev/null @@ -1,79 +0,0 @@ -{% load blog_tags %} -{% load cache %} -{% load i18n %} -
-
- -

- {% if isindex %} - {% if article.article_order > 0 %} - 【{% trans 'pin to top' %}】{{ article.title }} - {% else %} - {{ article.title }} - {% endif %} - - {% else %} - {{ article.title }} - {% endif %} -

- -
- {% if article.type == 'a' %} - {% if not isindex %} - {% cache 36000 breadcrumb article.pk %} - {% load_breadcrumb article %} - {% endcache %} - {% endif %} - {% endif %} -
- -
- {% if isindex %} - {% render_article_content article True %} -

Read more

- {% else %} - - {% if article.show_toc %} - {% get_markdown_toc article.body as toc %} - {% trans 'toc' %}: - {{ toc|safe }} - -
- {% endif %} -
- - {% render_article_content article False %} - -
- {% endif %} - -
- - {% load_article_metas article user %} - -
- - -{% if not isindex %} - {% render_plugin_widgets 'article_bottom' article=article %} -{% endif %} \ No newline at end of file diff --git a/src/DjangoBlog/templates/blog/tags/article_meta_info.html b/src/DjangoBlog/templates/blog/tags/article_meta_info.html deleted file mode 100644 index ec8a0f9..0000000 --- a/src/DjangoBlog/templates/blog/tags/article_meta_info.html +++ /dev/null @@ -1,57 +0,0 @@ -{% load i18n %} -{% load blog_tags %} - - - - - diff --git a/src/DjangoBlog/templates/blog/tags/article_pagination.html b/src/DjangoBlog/templates/blog/tags/article_pagination.html deleted file mode 100644 index 95514ff..0000000 --- a/src/DjangoBlog/templates/blog/tags/article_pagination.html +++ /dev/null @@ -1,17 +0,0 @@ -{% load i18n %} - \ No newline at end of file diff --git a/src/DjangoBlog/templates/blog/tags/article_tag_list.html b/src/DjangoBlog/templates/blog/tags/article_tag_list.html deleted file mode 100644 index c8ba474..0000000 --- a/src/DjangoBlog/templates/blog/tags/article_tag_list.html +++ /dev/null @@ -1,19 +0,0 @@ -{% load i18n %} -{% if article_tags_list %} -
-
- {% trans 'tags' %} -
-
- - {% for url,count,tag,color in article_tags_list %} - - {{ tag.name }} - {{ count }} - - {% endfor %} - -
-
-{% endif %} diff --git a/src/DjangoBlog/templates/blog/tags/breadcrumb.html b/src/DjangoBlog/templates/blog/tags/breadcrumb.html deleted file mode 100644 index 67087d5..0000000 --- a/src/DjangoBlog/templates/blog/tags/breadcrumb.html +++ /dev/null @@ -1,19 +0,0 @@ - - diff --git a/src/DjangoBlog/templates/blog/tags/sidebar.html b/src/DjangoBlog/templates/blog/tags/sidebar.html deleted file mode 100755 index ecb6d20..0000000 --- a/src/DjangoBlog/templates/blog/tags/sidebar.html +++ /dev/null @@ -1,136 +0,0 @@ -{% load blog_tags %} -{% load i18n %} - diff --git a/src/DjangoBlog/templates/comments/tags/comment_item.html b/src/DjangoBlog/templates/comments/tags/comment_item.html deleted file mode 100644 index 0693649..0000000 --- a/src/DjangoBlog/templates/comments/tags/comment_item.html +++ /dev/null @@ -1,37 +0,0 @@ -{% load blog_tags %} -
  • -
    - - - -

    {{ comment_item.body|escape|comment_markdown }}

    - -
    - -
  • \ No newline at end of file diff --git a/src/DjangoBlog/templates/comments/tags/comment_item_tree.html b/src/DjangoBlog/templates/comments/tags/comment_item_tree.html deleted file mode 100644 index a407d76..0000000 --- a/src/DjangoBlog/templates/comments/tags/comment_item_tree.html +++ /dev/null @@ -1,57 +0,0 @@ -{% load blog_tags %} -
  • -
    - - - -

    - {% if comment_item.parent_comment %} -

    - {% endif %} -

    - -

    {{ comment_item.body|escape|comment_markdown }}

    - - -
    - -
  • -{% query article_comments parent_comment=comment_item as cc_comments %} -{% for cc in cc_comments %} - {% with comment_item=cc template_name="comments/tags/comment_item_tree.html" %} - {% if depth >= 1 %} - {% include template_name %} - {% else %} - {% with depth=depth|add:1 %} - {% include template_name %} - {% endwith %} - {% endif %} - {% endwith %} -{% endfor %} \ No newline at end of file diff --git a/src/DjangoBlog/templates/comments/tags/comment_list.html b/src/DjangoBlog/templates/comments/tags/comment_list.html deleted file mode 100644 index 4092161..0000000 --- a/src/DjangoBlog/templates/comments/tags/comment_list.html +++ /dev/null @@ -1,45 +0,0 @@ - -
    - {% load blog_tags %} - {% load comments_tags %} - {% load cache %} - - - {% if article_comments %} -
    -
      - {# {% query article_comments parent_comment=None as parent_comments %}#} - {% for comment_item in p_comments %} - - {% with 0 as depth %} - {% include "comments/tags/comment_item_tree.html" %} - {% endwith %} - {% endfor %} - -
    - -
    -
    - {% endif %} -
    - -
    \ No newline at end of file diff --git a/src/DjangoBlog/templates/comments/tags/post_comment.html b/src/DjangoBlog/templates/comments/tags/post_comment.html deleted file mode 100644 index 3ae5a27..0000000 --- a/src/DjangoBlog/templates/comments/tags/post_comment.html +++ /dev/null @@ -1,33 +0,0 @@ -
    - -
    -

    发表评论 - -

    -
    {% csrf_token %} -

    - {{ form.body.label_tag }} - - {{ form.body }} - {{ form.body.errors }} -

    - {{ form.parent_comment_id }} -
    - {% if COMMENT_NEED_REVIEW %} - 支持markdown,评论经审核后才会显示。 - {% else %} - 支持markdown。 - {% endif %} - - -
    -
    -
    - -
    - - diff --git a/src/DjangoBlog/templates/oauth/bindsuccess.html b/src/DjangoBlog/templates/oauth/bindsuccess.html deleted file mode 100644 index 4bee77c..0000000 --- a/src/DjangoBlog/templates/oauth/bindsuccess.html +++ /dev/null @@ -1,22 +0,0 @@ -{% extends 'share_layout/base.html' %} -{% block header %} - {{ title }} -{% endblock %} -{% block content %} -
    -
    - -
    - -

    {{ content }}

    -
    -
    -
    - - 登录 - | - 回到首页 -
    -
    -
    -{% endblock %} \ No newline at end of file diff --git a/src/DjangoBlog/templates/oauth/oauth_applications.html b/src/DjangoBlog/templates/oauth/oauth_applications.html deleted file mode 100644 index a841ad2..0000000 --- a/src/DjangoBlog/templates/oauth/oauth_applications.html +++ /dev/null @@ -1,13 +0,0 @@ -{% load i18n %} - diff --git a/src/DjangoBlog/templates/oauth/require_email.html b/src/DjangoBlog/templates/oauth/require_email.html deleted file mode 100644 index 3adef12..0000000 --- a/src/DjangoBlog/templates/oauth/require_email.html +++ /dev/null @@ -1,46 +0,0 @@ -{% extends 'share_layout/base_account.html' %} - -{% load static %} -{% block content %} -
    - - - - - -

    - 登录 -

    - -
    -{% endblock %} \ No newline at end of file diff --git a/src/DjangoBlog/templates/owntracks/show_log_dates.html b/src/DjangoBlog/templates/owntracks/show_log_dates.html deleted file mode 100644 index 7dbba21..0000000 --- a/src/DjangoBlog/templates/owntracks/show_log_dates.html +++ /dev/null @@ -1,17 +0,0 @@ - - - - - 记录日期 - - - -
      - {% for date in results %} -
    • - {{ date }} -
    • - {% endfor %} -
    - - \ No newline at end of file diff --git a/src/DjangoBlog/templates/owntracks/show_maps.html b/src/DjangoBlog/templates/owntracks/show_maps.html deleted file mode 100644 index 3aeda36..0000000 --- a/src/DjangoBlog/templates/owntracks/show_maps.html +++ /dev/null @@ -1,135 +0,0 @@ - - - - - - - 运动轨迹 - - - -
    - - - - - - - - \ No newline at end of file diff --git a/src/DjangoBlog/templates/plugins/article_recommendation/__init__.py b/src/DjangoBlog/templates/plugins/article_recommendation/__init__.py deleted file mode 100644 index 7d86a99..0000000 --- a/src/DjangoBlog/templates/plugins/article_recommendation/__init__.py +++ /dev/null @@ -1 +0,0 @@ -# 插件模板目录 diff --git a/src/DjangoBlog/templates/plugins/article_recommendation/bottom_widget.html b/src/DjangoBlog/templates/plugins/article_recommendation/bottom_widget.html deleted file mode 100644 index 829b7b4..0000000 --- a/src/DjangoBlog/templates/plugins/article_recommendation/bottom_widget.html +++ /dev/null @@ -1,23 +0,0 @@ -{% load i18n %} -
    -

    - 📖{{ title }} -

    -
    - {% for article in recommendations %} - {% if article.title and article.title|length > 0 %} - - {% endif %} - {% endfor %} -
    -
    diff --git a/src/DjangoBlog/templates/plugins/article_recommendation/sidebar_widget.html b/src/DjangoBlog/templates/plugins/article_recommendation/sidebar_widget.html deleted file mode 100644 index 5f1afbf..0000000 --- a/src/DjangoBlog/templates/plugins/article_recommendation/sidebar_widget.html +++ /dev/null @@ -1,17 +0,0 @@ -{% load i18n %} - diff --git a/src/DjangoBlog/templates/plugins/css_includes.html b/src/DjangoBlog/templates/plugins/css_includes.html deleted file mode 100644 index 37029ae..0000000 --- a/src/DjangoBlog/templates/plugins/css_includes.html +++ /dev/null @@ -1,4 +0,0 @@ -{% comment %}插件CSS文件包含模板 - 用于压缩{% endcomment %} -{% for css_file in css_files %} - -{% endfor %} diff --git a/src/DjangoBlog/templates/plugins/js_includes.html b/src/DjangoBlog/templates/plugins/js_includes.html deleted file mode 100644 index 2a315e3..0000000 --- a/src/DjangoBlog/templates/plugins/js_includes.html +++ /dev/null @@ -1,4 +0,0 @@ -{% comment %}插件JS文件包含模板 - 用于压缩{% endcomment %} -{% for js_file in js_files %} - -{% endfor %} diff --git a/src/DjangoBlog/templates/search/indexes/blog/article_text.txt b/src/DjangoBlog/templates/search/indexes/blog/article_text.txt deleted file mode 100644 index 4f9ca76..0000000 --- a/src/DjangoBlog/templates/search/indexes/blog/article_text.txt +++ /dev/null @@ -1,3 +0,0 @@ -{{ object.title }} -{{ object.author.username }} -{{ object.body }} \ No newline at end of file diff --git a/src/DjangoBlog/templates/search/search.html b/src/DjangoBlog/templates/search/search.html deleted file mode 100644 index 1404c60..0000000 --- a/src/DjangoBlog/templates/search/search.html +++ /dev/null @@ -1,66 +0,0 @@ -{% extends 'share_layout/base.html' %} -{% load blog_tags %} -{% block header %} - {{ SITE_NAME }} | {{ SITE_DESCRIPTION }} - - - - - - - -{% endblock %} -{% block content %} -
    -
    - {% if query %} -
    - {% if suggestion %} -

    - 已显示 “{{ suggestion }}” 的搜索结果。   - 仍然搜索:{{ query }}
    -

    - {% else %} -

    - 搜索:{{ query }}    -

    - {% endif %} -
    - {% endif %} - {% if query and page.object_list %} - {% for article in page.object_list %} - {% load_article_detail article.object True user %} - {% endfor %} - {% if page.has_previous or page.has_next %} - - - {% endif %} - {% else %} -
    - -

    哎呀,关键字:{{ query }}没有找到结果,要不换个词再试试?

    -
    - {% endif %} -
    -
    -{% endblock %} - - -{% block sidebar %} - {% load_sidebar request.user 'i' %} -{% endblock %} - - diff --git a/src/DjangoBlog/templates/share_layout/adsense.html b/src/DjangoBlog/templates/share_layout/adsense.html deleted file mode 100644 index 8f99c55..0000000 --- a/src/DjangoBlog/templates/share_layout/adsense.html +++ /dev/null @@ -1,6 +0,0 @@ - \ No newline at end of file diff --git a/src/DjangoBlog/templates/share_layout/base.html b/src/DjangoBlog/templates/share_layout/base.html deleted file mode 100644 index bb17933..0000000 --- a/src/DjangoBlog/templates/share_layout/base.html +++ /dev/null @@ -1,119 +0,0 @@ -{% load static %} -{% load cache %} -{% load i18n %} -{% load compress %} - - - - - - - - - - - - {% load blog_tags %} - {% head_meta %} - {% block header %} - - {% endblock %} - - - - - - - - - - - - - - - - - - - {% compress css %} - - - {% comment %}{% endcomment %} - - - - {% block compress_css %} - {% endblock %} - - {% plugin_compressed_css %} - {% endcompress %} - - {% if GLOBAL_HEADER %} - {{ GLOBAL_HEADER|safe }} - {% endif %} - - - {% plugin_head_resources %} - - - -
    - -
    - - {% block content %} - {% endblock %} - - - {% block sidebar %} - {% endblock %} - - -
    - {% include 'share_layout/footer.html' %} -
    - - -{% compress js %} - - - - - {% block compress_js %} - {% endblock %} - - {% plugin_compressed_js %} -{% endcompress %} - - - - -{% block footer %} -{% endblock %} - - -{% plugin_body_resources %} - - diff --git a/src/DjangoBlog/templates/share_layout/base_account.html b/src/DjangoBlog/templates/share_layout/base_account.html deleted file mode 100644 index c00d842..0000000 --- a/src/DjangoBlog/templates/share_layout/base_account.html +++ /dev/null @@ -1,47 +0,0 @@ - - - - {% load static %} - - - - - - - - - {{ SITE_NAME }} | {{ SITE_DESCRIPTION }} - - {% load compress %} - {% compress css %} - - - - - - - - - - {% endcompress %} - {% compress js %} - - - {% endcompress %} - - - - - -{% block content %} -{% endblock %} - - - - - - - \ No newline at end of file diff --git a/src/DjangoBlog/templates/share_layout/footer.html b/src/DjangoBlog/templates/share_layout/footer.html deleted file mode 100644 index cd86a29..0000000 --- a/src/DjangoBlog/templates/share_layout/footer.html +++ /dev/null @@ -1,56 +0,0 @@ - - - diff --git a/src/DjangoBlog/templates/share_layout/nav.html b/src/DjangoBlog/templates/share_layout/nav.html deleted file mode 100644 index 24d4da6..0000000 --- a/src/DjangoBlog/templates/share_layout/nav.html +++ /dev/null @@ -1,30 +0,0 @@ -{% load i18n %} - - \ No newline at end of file diff --git a/src/DjangoBlog/templates/share_layout/nav_node.html b/src/DjangoBlog/templates/share_layout/nav_node.html deleted file mode 100644 index c266880..0000000 --- a/src/DjangoBlog/templates/share_layout/nav_node.html +++ /dev/null @@ -1,19 +0,0 @@ - - -

    eH*5G@g1@?umwPUvk3fv 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 z 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 diff --git a/src/DjangoBlog/blog/static/blog/fonts/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSOmu1aB.woff2 b/src/DjangoBlog/blog/static/blog/fonts/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSOmu1aB.woff2 deleted file mode 100644 index 0b0b3a41dbba2b23a89e2b424bbec7b6f7b6b4b3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4504 zcmV;J5ohjqPew8T0RR9101=n~7XSbN03jFv01+nu0RR9100000000000000000000 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 diff --git a/src/DjangoBlog/blog/static/blog/fonts/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSumu1aB.woff2 b/src/DjangoBlog/blog/static/blog/fonts/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSumu1aB.woff2 deleted file mode 100644 index 4bce1d02963aa6eed7e1fa5a9e8702b30d0a435c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26588 zcmV(_K-9l?Pew8T0RR910B76)7XSbN0Iy^K0B2$V0RR9100000000000000000000 z0000QgFqXPJRE{pKS)+VQiNg#U_Vn-K~#YxCmsNSDk~ERfqV&{6fag05DM2Q$|nng zAOJ9drB(qp0we>3Is_mEhkgf%TnvRD8#JZ|aHmHNP~KqXwm!pG+NNN-xf8it$$3%= zp}}$9?SLww--6`-|E#1k#~(27KMw`2oj*ct&#Qu3|u=?^(T%q@#!LQBMFiQIQ|GJZ2uhR&=W7~s-T9mli$quxX7r03( zQB^d^fl5Sweu9fs^jDdYnk>qN7J+dKA60YSpXYV+&wVRzWvrJq$O|EX0AU6}UIHk% zL3fv9)je91(6#w{bZ)Eu`rX}H)H)X`J3t`sfVR~v3kd2(aj$>(%}3;-Uzr#68|ESw znMw+RL8JvnNLBT4Mf7N895bfo{HsrpOSuMUn_)~5V{C*`ShXSQ>&nOz zw6QTk%-|6NZ7?wqr_%;?ZD3$b#aOq_UMD>I%eB3^980a?vBaN|1S9_~FOiZwAIQ!6 z7uqpxN1VD*>JfsJpusJOrxclX#c$tEB62vbsgC&W!v7=p=y??{Rj8@71*|l)!Lnq; zg8}J){ykvRYLc|6tl61(@7`Q{lFggxinV)9OPmxM0|JBqK{R4Og#6!J`2$CYs&G_W zVNq3h%w%7cN1_AFZZewzf(L$XVVQ=1coVU>(7@AaqF)H{TAWgVH`w0FSow+a<@S%V{EoxEU1hRvuV=Dmgl8O*I6IKDlD%@@NSDRy&OtwP@E!V~zVt^64i&NPnaH z?g=nNrt>I!0iYYpOb=uQ2oxX%%QU4NpuTwq2aCO}XD~o;+Xv72bV0gWv}ks9IH3s2 zk)A8hTBYzmb(zrczGN-bZ2+)ai2NIS(m8V_AXIl10PMBQjFz+3QPNU#rD~Nf1j{*piUJ$qjpd!mUu0UFm z&!=kH4nT1a+H($)BiFeoQz%`uE-H6}KLcWB0FVPLs0V=53L+gqal=p>sY}$#fftj` zsSl|NiQ$mNUH_p+#*j5BRA6UW z&X73w zP4XUx_b7TE-k|a&_!s~j00j1*aj&PwtG|1`@I0G;u`~AKV$tyzG%u_2uN<+pXOZo+ zy8-tC67RcbJ`@K(v<{Bzmb}S0f@H`OC>F^j8<_LNV{50LpsH1 z3et^+ijZEgoP|^?peqO%c2N;%|J1e%d$At@j-8wVOzz9}?J`i0b!TH-0)7Dyzz_aS zE_IbW@#xn97;8p@4|G87(SNpoRWx{b27RBtpfAyf=uPx;dImj~?n@WYl%hN@!3Uqm zu`R+P1gFZv_Sf`wwYxI9G74su&jn0w5&loS4S%d9xh1T{qs1Bz<4#WaV=ayvVFNb@@s zK1CFVwn>ztqYEGL>^W0`aePrNtu~!wj%?7PD`Dj26knWk_Y-8ZMywU8)tBp*l-d|% zNPLW6eL;DQ?LMoZjaOmAR(J>K=4G#rBj;Dt2mC$$$@;QmR#@49-Wzo z2jv|t$Rj6zRxS_w=6=Pk7wi9T^ zi%Mr?;V;9O1xB~0@t&0f%j7(xd0M_B$o=a*fPgbj-oZsk{tRq?MRDrGuWS~6pT;dv zdM1ratrWO>GYbf46%Fl1sAW>S61C;(lYo)H1Tot<*v{XoCJ7S>YcvhrU2l1t=A*(q z6>}~2>d{#~Jflh%mm&$n38bMvs6=8I*8Ue0E-9GX* z6o%%(FskRUhb2mz7_wi?I=I$$<;APaP4-M40m#EmT z+*T_I)4nUYaL`H?>~^GHCap0Dx&*+oPl=Lzy#k;b%;`+yp)|?tCV48)w(kj=Z&a+~ z=lJt~%TY`jjcRP0p)67e@4k4vH>FYeJI=U0R~;;N8JJCZQ=;Pi}(*10kFNb z3Mp6*G}F=75QILp@R>YhA3$+pIFrZA9IW_q=qEpVRxX^z{o$Ru#K6K+jE~pjuv0!5 zK@m<^SP+fqQbgr%x2zsv1i|VxV!s6VtTb0kN5HSsA;u;)7$44mc!Plzl2tC-yZL{E zgN#jG&Q)f=wnT}QbKKhdI4rzSaxc}rf#bETsZkd~m!Mo-*~hg??0S&*fq5uP9dBYV z?Ckhr6Jo!zm{V!F&zSgcT(pPR8c*al=)s_vlwEuUaybT0EKLzGKTonMm!V02jEgT2`$$pJ0 zqswqLt{y$<588GsJA|HwL5;Zw8y!D}PLMo!0mpea=;UMB8oAGd zk@@F=qV)q1t~G@n+u!|g9p9h+NB`|3iT|%7zv3MruYNOuIPgDA*S!kV4ex^Jh7Uk| z(}y6fKRoo!@5JQIAA{xAkD}m?=c4$|H-NtHy+}O#dIVm27s_6F8}x7KA>a-q_)THi z`;2yP-RBeYEl>JO&ln5u&56HgtG+VPF?!F&*G8&N-!kF#ndoT&_vYNFGq0_jdAIV; zko1mh^gq7w{qClZx`dxeELZutH=f+^DP#I#aO&6la_>L0@Y{U;YGeHx(>=@>HFVXy z8#01#F=17v+C()Enta5W$7(nvW$h!lc`1GxZDgS(;AlMA-{(iRtgXzoj$so!)#z1MTpgijo|p7 zCP9U@d>z`h1peqJsOs#aaEtcm4Pv5?PYGwD=P zNW^2&NH`P>_e!BUv1t7t zcG1Uo5FgI181^f{m?P-1*x^L#d&XLC*h0hL`uzR4)PyR0hb%f1SaR-dIOXBE5vsM0 zTy$ne@T;^hvAt3TipLziZk(Ri`g~mLpF;Kk(1A>Vam`LA5X=p1vE8l{jXHL1 z8Z!_R1pC1ozD0y2--n(`_03?cf3&~X4-YFzc%^+rpH{8X>vdYT?CwzGapP~y$<9oT zLn=6RJ2+d$)fGPh!Tkkyf^3sv@FV-}Y_UTi7CPK=i>i+HdWMRbhBfCL!3hm6PZlTh z2PG@Wy=Zj@esqWVwo}C^+ah)kxCZ#ATyssW7n<;#2zn$Nv-S}(sSS=WqC3Y!8_;E~ zZZ>cg{L=#8eXkh_*d2hR2E~J<_n4mnY zDC~1ytdlddgoVKKn+VX0?yqr^$+dDYP^t48F*4qDcBxEG`;c_Kt5+M7lsKm+=+8 zU=pk@=}NOG(j-PGW%-}mv<4TF%#HOh)CXGXbrf98Z|rWk>f|D>ZpUe{AlAu1I!?hq zGB9L9Ta#O6LF?#Xh`r&cPsON_p65}g`V%OG(I)I^5oas52*~u}7C<*Eg9iZlB%meB zqAbTH=FUDrFcmD-PqEx_-Emw&)|(X4Lfn;x3J?@lre^C&cL1C)UOy8oT$G7M4ef=M z;9&BWuIQUMqVs!Dsft4{b|~6AqKY~++&UTrhERQ^{Z-4k9m7loJ6%rUic6KlO!QHD z&E0WWt8)o3DH!Jq?2MS=2Ab2_O9B`m!^vg}jKP8dOOyKnw4O}LC>RiEnkO>0s(*iE zh{Ra3lt0+E+2xw^Y7VSZEg&v&^i^l+TaQQCIyKdzjFxjTBBC2wU@FK(#I(&Q+$aoQ zZTTY+TEO~+j(j#uZpJQBC4mw3XoGTUgAkV==nPt8eeI4p!1PbHuljoIrUhOW*xd%3 z>vavL@jU>$xfuhG&-fC|b-~{P(+fRvhMW(Vg3+NQo)ax*ngruF4zVj8TDFH<2#d~) zgej*<|H5y;hJyqF&#cN`E_&JKRR(Jy7EynhmxatR#Gsa6+QGjF(1|WBh+8H?n^tQg zl2M%uvV@;BEFae6BLN(4x#nRI_bWYIGKBvj>00Rcw=JAi{Z!bFnB&G*9p$L2$MhmpLTA+VB^^4EkH1iwcw;a zzIi5}0apG$D7UaMl|3tCJ~YVuymQUH?5fWemM=bu!skkQ5n;q- zl+;7HkPQ-`GmCV&W(`8cYyK%CS|J%u-jMHO+6Y%v9xsl65Jmj0VFFfdN7d66|lF;sn5NnjYVRyvqSFd@rI9--QWf z%&sTTNS$?WuRvv6!4eP_YOoMMZ6H7m-s^b(Qvi4ipnnVy?%q4=O#tQ_0Q@z{>8-{5 zsmIMSp#~h^#5eH9E7zhh$yOlDU?E_4ZK5A)aT{I0ToZcu6F=xWXxy_u6yGo_WZ#41 ztDyBOW4F8)Wxq_pp3y!`-L$WTFMOE>dG4p)hh5SGW48B>*xJ@U+N{gdt(#7L?Q^u= z3UBxNIoaJ@8be8yXDZigywO-ZG7etQK+mmlUlic4GCoc>Nn4 zOmS!C4B?XJjEPUNKPEse86o~AY;$$r%&|Wru_hRd$!XBskcNR;v3%58xRN#Eo68vg zk7Z>!Ci*wTTHJ<01yPv5uq^{7)3!uRajGHm^15*Bu_dZ6n2eP;U$#(SQ7J=O^V@Pb z;EIx;5H5FZPk3F``>uC9q`RdT>aMFh9R|D%qgK~MFUQ4L{uN;Dj@7?QW8LsNNj1=d zS}p%xPcZ^^vMXE{J6qV@q3vDT;``j@OyGHER+c=R0SOa$p}NAlemyxsjTRF}@;D|B zjcwq5Q`0-Q#y+`pwIe>1h&f?_;xBMa9Z-X8N+SF-DMLPcl(%Aw9Tl)H9)e{hHZi9R z1mP`S1)3uFYrTtIRXWG4IXabqF&5Wxz6=3OJ4lj~%Cc}D6b^t|%^u7hErA%c*&KL;sdhiGbom`t$NuXq<*mr3^mK+!dgB2H1$E*~wou=_6ooE7pB)&}@|PK!0; z_2^%ZzcH8U0@k62J{{FCZQsHlo9Y=^Tk$BX@~*2BuaL^M&aVC>36~(}#QqEeSG={2 z9WJyfi=JJx%XNCGd#@HvAo6<;PN(?;t4n`U&vFOUBj zvcbC!e20?*;02iQEGOS4}ZJub@suMrXUhH~$*N#kR|a*p?sb z=iUKhZ7e1}+p_s&=_{uo|Jp~1_j`t8Gl3dDgLWGdTF`-#GwXULDa*$pKN6P6d z$}*+=_WiJ)ML*jzT0k%q60U0S^sP-P&z)EgYx@QII*&HkYTBpoxoYI2 z?@;Tc&Q&(7>AwlczlDF@I`P(@AA4@KG~WluAHn-8VEyflKm75lWe=A+Er zwmHiKbZD$= zvr>{%k`6CY(^C9fO`S9_d9FIM7B0uQ5?3U7S&3n3L1Fb1UENyIu*NlN-jA77$?sii zlMe?4Hf6$!)DNYzBeBz!rGTI=Dk-2+yP`3nOcknwCsZxd;+{3dd=X7dTpWn)(DBo* z_tEawNNImbFZ?m;%@%!7Syx_q;pRRT49 zWrmZRDBu05U+;?}{otM=+0+!{KZTym=mIVi<@n@P`ne67;dkbY_6f8IfXC<BW9S&N>*%$Uzisem+K=mX6~i>w?Y(M+ zvNhmG9ld-5@t#Lh6u#i%T~hP*BmCiliTsIaeKC)iv|_ABnSopJS$yERDsFEpBe%RT zr;cDfRHVdx+?wAi(6YJ9=Tw5I4TA9H#vj;u{Wgnw7e79rRu-2>w#D|JvxjNGW#n^^NcRPl=8=_K7V;1)TjqKZ3tPIxY?=K5(Ezd^sj` zESDN^W+_5L<`@co&|8Muw(BT$028Wrj2u>;L(OK#771hjQ3&_JLe3JRZx}cKz%0y7-^P-;sA6b%0c#FPr z&{yA)<*Gesq9{{@)N+s=sEw;eSp$)VZBRd1XU`2CaeX6r2QRtu#^<=W399g)Quu&K zREl(qRvb1bR`J6x9@|D{YW6}fPXc-w*%&kEXH6M;D1mg8F=-xP+FZ`fO z?t2$={RsL0kc6<$KUly0CMIHncIo}9{BPEQrCw$Y(KF+uY1K7F*JwV7+6b~I|9gH9 zG8J1;WKAa6hJ(94a6SdoYS0lj**bP<(@K8tjx0`_EeLysW((6tgkJB3b{m_$oAw(* zO}jhcO=G886eWih1;h1)^m&nleU$s!L53%u)*3Y;9ha_fDr;XC-MdwLxo+A%EC-*# zrIl5VI{R6AXS6gp4(rFZ-XZ zzA>c)S-sY=xfRoA2x}G=$`%zLz)De%WK&$9G`ciSLVXpPZu9x%SS?4{mSOsJVgry2 zTlaeN4xZ~eV0{x<$9{w-g0CvnK2}*EI2&4iI0~9LkWPS`yC)s+CF|g|9Bn6+#7y&% z3Pj1U8{a~a8J6-PbT+&v-`%`#8W5EH!a!K2!A&#z^(QmKj)TTjdQLrU-k4%=aX^)l z3R?CabQc7;MF<=`B~QN~ac?}d0$|}3;9PyO%B18d{n&q#-!1RPlP4*{Z(EX*tS@{g zvxexK(QitBr06xl%Owp&+rMssL3OQBM`fi?Iu~7V|JaM6yfbc7uDlt!^fo@;F0v(Q z%u?o$GCyF0GESKmh{&tpvoF;pEeEWe0rM0&g2K>pSJ(?gBo7pi9J<$rbJjD(%=>y7e`i|b!{mM zGPWaH#8A@1U|_PcF*_$LsCL%-_ygch_K0~5r93#Y-mgkARh3zXM>%<x#zHROdXo`AM zvy+CvED2w#>*4QW=Y(hK$2U|^t9hQ`K80S?V1~A*#^Dk_9f6KI{0?v)t|sP;*&1|+ zT~~nCPLv1{k6?8iI9soVmBZw393P{yyFw7Ess$2F$RsIK_h5qS%wN3U(_mghv z_f`3ycvkwy4^>W?Dd&7hPn^eSL4hZ~CoWG~>NXyqC)1taF`73sdQZo_i`GqJ06c+{ zfIHoy2p0#QjY*A6j2*D?|L+MG;JykueBL20{mXoc!Y)`M!Tz|>CfV6H@NKEqJv6p!0`qzaX3Qr^<3>C?KKQS|-dEaT7T zTt%X&?r{1)`(iI0S%)=|C80S%DfGauY8+fkLH~Ls@ z4$c7bzyA0xrRe+IO2wbI6pnA3dJDRutX$uv(d_ ziZX|_0U@NC?-a-&lLMP(ypNv{$nFJLhVM_F0C&ff8VIrX96`JWh{JI;sHPHpo`qY+Ea!b3z9GihFAp#+q@mtxDkFC ztRqn=&a`wu7fTe2?F%gTbUU8P>p5T7y^Y*Csr`LJ%#;vcN=Bwn8X?3lEi(g8(LJgw z4JNgecR1!1w%KFLCCGn-Bt7Dp7?I=)iPJ&ycK|zN3>#ynR$M+=^rYm;m|8}`5i}c3 z*0K2vD2)J$bmc^DqAFcksTVl?Dp4Z{(=204@3k#!(+Js&*6`y3T$zWj@AGo@o77;e zn+gXFyB%zerwZ)IrX{w5#;BRXmfQy~(vP#&5({p&(1NGWl;&wWYp3HJqFlTQsS6(F z=C=ld5S^i<-r|D{GJ#bixHp8!j2sV1%L`Bu#GPsq_*0p_%(wdb~a$(aF;gL z_kza{(u``CvQ*c z!pqe)n-5*!c|eNAU$0uiN|(w37|0;+1$D0mULLj1$)kSD!_+Gx@`&Xau@hm%{?Y5C zNyW3IhK|W&P&(o<=xJFWp=I$g@$hJD920Y(ySl0uPk9`@CKAp3dAp!28_>!S!(^9*Ce%br}LL8RL?5it7&Mi+OSB>HYdF&YWE)qpNB> zhDoWr5irdh@uCdWx$EWb01NL-HZ=E*>B$(BOxv@lcUA#vgXUa1`bL!cHna+`nAgs& zVO0T~UOd_|Ip3hr(Xy_WwHO*#y@s7h{JK^;F1^V`uN?OAyquvvadbdpZ_@L6FPI!- zX%y#Tts`bTB9l%Fv@NX*-sEB@;B}LP1gD=k{88VZ&9YR74!LPnfpeX(T@RFqnu8;Y z+ggLuZbw%u) z-`P=Tzo`cUwdhN@f1&1mdhl2tX@%GtsLlyDVFP>L1YDrj&UO-M5*F=AYl z2faS;cCFnGevOd&T}-!D@FT0)L530^IW~o zWN=W24%JIqy?&=imNq0hn$5!>);8v4uLokfr3gWk6lrYDj%r(>NW;}XVt=qyE`KAC)dq9t9n1+0udD(JRT6mT`p|+eavi8XD@7cAsar#fmJ? zsVp^2sV}n4qt;e*vu%6Kqoq_35gA#DQc}1Hw`ts{XKjo1S#23J_4AfZ9Y6&ST+Uf~ zBZ#KmN8xq(%+MDnl@LB9Ybwn(TlAeYr_M;p?1RVT6?FlP;jbf^&8?9UU5Nf33uh6b zZxz5+1%P$z-AilHeFg8K=&MeFo74*<8Y6bAMfg79VBe8&Q>3OcVq-M>c(hq^>xIMZ z#la_U`r~mknH<@T@yGzW+CGTX+$Xs?cziuX{ilNn%)4U6)V4MjX((153`Ls7(8XtA4(#0$Sz)%CuWEH zbrU!k6Yy>*;p)Zdk(_oz@n?RhXnr!U^GTq9(@)$VqG-kI8Cx4e>FtL>wFe{NkxHkf z^qeQgDC_Qhq76?$b^;_78Y2oxp{eooR&uuV(o5(1Ha4Yb_rGb;?Cp2}x}$dnk-@RT zcSXRv^%~$WTi=5hzrx=BN$Y7uW-*|*&wH$4Zm{XP0(zT>p?R(nyC*LQ& z?{6Bp(k+hZW&GoN7xwP#ZS%jKi|20adnNbWt*-?B8TdT#-K}p)65tWcXSwL@yg|3QXG;EAssFd1-^sylhWk*k7KZT`;h(+>2Ap!75U0_=TVYyOWaOpD!238 zP@Q-~yjBada$AYt-no4AVuP{o@*T$E3(kbCgE}a43Qc=lB0|B_ES1z1$y8iACDuDW zO428?bS4u`YrkurTcJHkp|ps0nNCgga=_eeP`&DPo zg{YIvo0Bk7h~RX*icXU85Qo~O&tK_c9sdKv{&{XkU;KZywFLDz0q01baKD7Cgp%Z% zBYR}x?nMj7T%g7Xl(FoE>WpPqBpNS1nf7q?{Jh< zg7|IG!JmQLxBYg&;x7!}9g%XX+aHHq_0*?pNNCy5-hXcU)H86cVUO8+cl__TcaQ5c zmK66J@;+7&>Uk6- zxH{yGHz+|HQW@thO_WyV)H_3gaNOi~ol{Uvh`z5L{rOG{rlK&l7azGkS4L3FsAWEd z=7(;bixOEwjNGOfGyS`uoHBP*BBRw#Jc7Mpoc4E98Wfc7R3eO{DMYJ%`l$XsPGmj( z*Z&n2@X7fW$7%n^FlV$Ix3ww*#^5-7q|*Duyref;vC@$kQtq=PekGjZ+m1bu^@u(x zvjRJfGcX)Wl6MqjKSLUlL}@mSMfbqDZH&mKw4qQz$fc#_%uuRuHDX~XhLR$Wu9j=> zG%5)vcUP<;M??j_lW=98lpz2QDYXoqg9@@N9dPX1F`l{TvZ|`u>VOvSu}sZuOp1$R z^Kpzvgd;Q`IFZ|Ipvz?AYbH~$&CaQC%SrjH4@691W#zLdqLFP?6w2YvnapQ5q(j{h z!3fq0^Xn5-s#_S_xrcu-tE<;8nXV&(ml?+$>0-Mcby?PYeF+D6Ify;oGjM|&%?CwO|gUQ9(~DG#;QD4Fz$j6Hgec zh<7J3OlfYw$TZ`IBPbhd?#g1vy^a1*A|rSRb!bmCHSoBy#n$7YvvU<=$(3kXT?3DN zTDOap>?lD{14ShJ3>pPX!~=)?3+DTv4Txs^%TpSIinr@9KJT%};J{!y{}U3Fe?w=E zpUXO5o^~&M0&WvUG9t^ zhgU>n*)f~Lab94JLdd;KnqeY=#SR>|gfjGZJ#eCkxy@t$_)#mtabcXG$Rx}fN0FTI zJcQ#3Ko=U6Bf~-su82-kjY~c@DXB5R*lI~4JC#9R7;7&lq(m-I;CTwdk|o{Q)}aiX zB)yUJ4Bd4CGw=a?R0N+N&6?;tq(*}c_P8yB&CHWotI?EQ87y?SZi~jHS(<@kMh9G+ zY~t*8n=)k`Fm+K@yZHgg!aO9Y8T>ZKN&YT?E zt+N%^c$1ry*s@T4^x7`?#=&M&B=LS|fozn~Qy9q0HC~7--?FiHD&IcT&hSKMvHxIC z6fLRI+C?pIzI(_tOsipAv`U#}-0o2k@y3;kU-ote-J(>HR(5{d0~T9Bb91q51n)J? zk-$0&YHQ=&yxj8(@;PIYG(_wiHGD}HK*GB8bO|h>*KtiFT*>s0N_nkj zn2IS8s)aJXhhte7a3Wi&8rBR~mQq8dVa|qSoZnd@k(gMmyRNyn+YsGSc?C7&yOaiX z@x!7Ti7eTD`O#?542||`8RxVnSseM#w|!hkJI^ydPKzXHS(sKx8{i0%}lIWVk0V^W!<~4e47GRIKWSjf@V#D z25i9Dq37e_D(jfo*+D~P1wm39YS&fLp`M)Ih+XQn&~U?x2i!2|6l=Or#U(SoNh)c2 z$gWYFiM&LpFZqNW0iViDg$8wHco?TLK8U>F2-(H=-EMRUb~@Qja27Z3$xWR8l!O)juQRKmKt(8f6atk)m7RM-ht^?wa^4c~!_d zksz6e8F!%5aK?PP*>rNOJ_T0hQI2M?2tyb?nqCvT<6PP1%8ae2Tesq-fe;CFEC|*$ z5r7!s&#Cwe{Q?owht0;-GZ!NMVvvv;_~yl_Jbm!$kcOqbao&1BE!JR5sCj4PP?#jp znf?FnDJH_XBWGV^lZouC|1yVp248i^N4^Wcy;n`9oHlE}ZFg}xXq)Ymvx*Bnb!Ah2 zvlZj6zzTO)Ju0M3MWTm=(uf(@bs{nYY==Nw(Tv)^*jeoYO+IHur4Z!&4xbEP4lJgF*X>BV{s6=mMaC#jE0|>IIM2isr|aO-=)dWG(Pi_3 zPR*pxgziZy?-u10O$^dsxk_W4(|zBP)8=!$*L(N!jU?JCyyT$giPjSGdYe~_iX6MX zd_4^XliT$&eb=!U**2|cn29s-NfCTzA4@66(fCFzVLxgo!qktcL@Y`6R*Ugx5~*v0 zLYFxOoHuJ=jev)wOX({q@#sm0NjtY=Io0h8nTHH-zJQ4+$W!kv6?~ARL@=Dgm#x(+ zjk;={>)I*StEKpn=;FG#_=05+J>I0IsN&_f$PLWYSMyA>Dh}UCQI6 zw)2XdDoffNV9uhb)A4vxJ*2rNH0|pSv7(|lPmDD;i1Irx9}vbeD8ZXaar?O82KK5) zpWp$Ui_7EkU)bAXlqaJ|khs{FoGLr71llNgn~n zuE#~nUV+1^SE6hvsFo@rXv}S5lD?tw4!Z+#LOCq4b+sdm+9b=Mc<<9_@?Ak|BwATf zl9%#4&dS9|e}Ls5Z{ zME%1#sGyN%^oldOHTR|%TJ4ik5zD6h^w*)&Rp`;U`y{4Lc90I z*_UGTaLnwiL*6=Mw{H6i`cblQRrWjT93wQ1+hYNQRrvZo?v(jVC7ByVJX#L#zEQJ7D`OGDTueMvLsl)kTWjXv+TbN9?egO{KlO0PUCKgCm1l z>&~)-89J=k*rwPHtKYCHaWPBMbgd6R8eiJks&qZglDm*`1qf)Q0wv&=xgUpt~KTZ8&THZj%fRm$Kr#Gkiv@{Ihv+5$cJ(u zIC>p3@q2k#?%I~MF98_E#+L>HAAR)VW6QUrC+9+St`d2n6g*2@ZX!Toi07QMJrodV zq|LF&o)4 zyLYz;!*}W51O$z95oU7IooY*)ghS3+H7%&tu?Ru=)+Kgy4bP%?9qYukxt#Kf6xv!< z0f(ks2qEOEV`(P@8|+0kW9hO+Xu4qI2iUDu+pvWzmx{>_PB-05uP-x}%_eQ`=JlkDCy&nSJKp~Z;x-jckMGppOKo2gUTY&tf8=dL2!uc($Yh97ZZEm93WYsj1 zVDTfqlf9I#+ihVm{#R;5q29#ek5L;`wO@F5C#aC^5@Ut)xXXDZpi=S!enfk!d z&TF4XJE}%E4w?=p7HNF1Jr0>yYWx^SaK_7{Q9pBw;|>aRN4Yy*Q6db>j+BWaN!2{B zo$)v4C{PqD9FC&|5%_ZRC$&nqMD{riJPh$oRIXAll^!?`P_ zdglSLCr;QEr93j`Olk&5^6=B2b;-yM8eaMsP>fv(!1veCd$e*SB(jW1!rOg*^1`p{uWve}!6F_jrCY2Vp7{?r3NBAF&7 zNO0b*clneRJ@Ndmj?#Add4Um?7Yw0DXE)O6lFNo*S!uiq`8{=V8Cqj-5jm?Mi+u;U zF8vz`BCi~9M8>CMoog_=d~QLtFLt1tS46c-aQq})6$FmG^RyR%E9611)wa)rAT7#H zo@7yoa;La@QD8JdbtplA9qJ%MG%Brfsu{me3rA#ChlOrmY)a#?8PsZ>lJ6GR&+;HS*|}DTyV1q zYFW+*nb^)`Jf7=HM%Digrf|V^;#-GnC$ZxRcf0W*p@h?YSI9(JWDh1U7}RVFw~A#) zB6+?)!e^7`_8x>QP9hyvWj_=zij|y$YXdFHtFOK-u)0)dj9|{vJ0lSox}EfALxxM{ z;$zPv#l=TRYWFa2=b%4*aP6gbHs}Yd-2$c;m%LIR+ z&!Ps=>b_~#WnvzwbJ(<|w#+yqfbkBo7@p04Fw3^?BW-$|^`Wo2L)y+GZCgLYnvpz+ zz?^>kT;q~+JK18E)Mvb5{B?^QHaz`jhwXpA@6nxln>roa1%6{(RBLs#cxqis0!pzo z-9Un+P-j^LX+M9qGr3$7>Ci$FdfvYWvnDywXosHelo=X$%qP*a+=7wfU9_q4#s+t! zXZhN`v(sW@lYMx2E&uCZKZPjqIn`YH)0aoviAh(mBWxCMrdSrvxTQWHJwa1&vK~gM z@S^7hIX_)Pd!hjY+n+G3YOS$0p*@6;Rk5o!rM=76YoJ%GvSG||duAS2GtymyN9&Gv z?=^zhu&U@;$QjrUq%lmcd8Pa>a&aLYa#0`5!O825p`Zz4 zS>N0(WeVc1_~MuV1)K`0LBe7jU6y?5rO487g7TcWJPz{j+4tYND9*ceah+-Q@;4S< zM}W{0P|h!d;n}QS&g9NtUsQm`#~dfbN^pfw!QT>^sgFxXFo^fIufe!3-;Z@3P*<%N z?VQGC$2DB{u%U3cp=g*uv8L*%ApFh{%&ClrTD;IZqt(S0AZ57xHMsOG^Z_m*U%_DG zt*d;MKDnTs*Izm(s)RfZgGB#d7>7>#R=k3sbgJ2;z7UCm@S?U$q|no#;GN;RO>^XJ)`v$WBq;!E&bL=Gxf}%Nk}{O383g1~d=ILX4TB9=h%_`>b5nll|tiX`s|k z$o?)eQgqcflwmba%$xGzuxC&V%Z-k_zPo9Xz;VJc7QAmFrv(}*daa+-*HbxS_$ZF^ zR2t3ggM06h8jVDw;nygXN4BxS9B(c7PMnoEgp#^kVN`R%N{C=DOIPR8y;smoyJTh?oXj)Y{bto z7%jHkvQa<5XRZvZRheY6Fz@)N-q8_lZz3*09rCzc6gO$;XkuU?mx>U6jN>cjKcrekl3?hQih8v9N z#d<~)i6->dR<|b=Oc9u>V&{}w^KYCXXizh!m4@lZwihlvKXt3X4?+s|v9IQRvmJ>p z!;ep7jl#7M=sL;VoK5SCxacw;6nXem6>NeF(HFj9{|zX`V8Vn|-6N>GYE zCKS~#ubOo#TnqQ&N!ZK9q_MLSh1cPQ^VyT-OF>;DAE+3cF)LM1NPO+Ln=8KlJfa?| z6y}ZUU0W|YUk_AF!D4>zmu<-x=m@*PQ`{5tn;fW6wZl{kDahm0pSsosn)H zVl>2pec7vZ$m^%@EINkGT865=Em@^5sjzpu*72_{UY89O0y4ur_A7PUdYz#(WmXP{9dzqxbb_y7; z@UE+m$91ms^1$T~T)Dj5=NnHb99zL>)X+#Kc|3>FWEs7q?j-PtCwE!{`P}1q6s(sT z`6_ioeH2}ERgBVPnS9&Gh2TUgGhYQL!lKjEiQ)-s4P0;tA>_`Byj-Ob@S0RrS6Re+ zp9KYTX=M5F-<3#mZ|5?&D_5+V-ZF?Hf3PgFawjEXK8ojj9g=M{$g2SX*LAsyT>D;lk>BC#Y%GQ{At9n)fP z!HZO{dYt&SBrCzJIg3+KM@ z+}1`@hx>@6=pm(}5TY~^@QHO9B{!e>#p}(oWHNu1P}w!*ql*=M=~QPhmQb=}#BS{u z#ZeP{y+0`gH8`s>JPU2I;d74efo9Kijmb3A>3P97m7&%tEt(`!X&OHE(BvmObZJxf z>Q5?e4GjM~R)Iqc&cOAH<=sEV3W_Y-jvz^~9u6!+<;Y|8u~B1O=FBGOG8z>-2IIyV zIEg25rOo9^;nx+@LE5Zegf6DVu@2CyM_*1*NSVsZE33*1iYv;)^s3fGw7McvGrByE z(5I{&nKy|a{F{%uEf|?cK|`p*U49bnrc$XWT2dmal3IjDE}j}|n7#P>@`~KEQSKx? zZ{rqgCz@3hHtU)tn{gHsOW9p|hEO@8;10zhcICBrf$WFU>icTrC}f}PyWnv@iQatH zVxiC$^P(wvX<>jkq3v=i%gT|Hq0QPQ+szPyRZ$HL{4*jxW3s z3^qi%NV;4=l6!%y4bJKm#o`zTqh6EYR_YR>rzRpH7e8WcuA`{fqmBpk z!2+AqDFyX+m>xpTph`>p_>f9spSUH%Qz^(G(`<_?D$=0pj$Ug^Dk-F6HZ`*l<4i63 z%o_Q=a-n<@QB#@+i>9VZrL1QjDsAU2fpFMKpr@ac=p5d_?(=eUJyt=nIRTr7OldL2 z%8YGTb2Fj0Bc}HAD`sbI4VT4*7T}!WN6d&(VSV~&0Dcbs^nlQk3T|s~Cr>5?%fLJ3tL#PQtb8rY zt{Ky%n$V?PPSNoyie?q&c|)hhZ(Xd>O8n1%kWn!Nm{m&p|N4%5@108qQ~iy1E+h0F zhD(v2Q8IWUmWdDc5$yA(|NIaCV}gg>k%DmIHC2Jg*TdaJxFZyTH26{Vb8}l}fJYt0 z1bPa};!D5>Uanr!HHuA5Fx}L-7QZy|AQ8m+x)H|NyT3|2>*v4$Gt;@;HZGy6POE0n zn$zhgJGl3;DC818So6}8%_c#(+^<)P1@8KBjI|yknhOEeRhUAH`HL?ii>uSB)QCg) z_~WjN^b9GViCl{OzeYhIQPG3$NBSpXK6Gt$@w8<;S5YoL58f^Y8V%v zeA0h^3>C<#Bc|=qp2UBl2y3t=QM^y#La0vvK|M+!a{{rSAR^KQSf3x1_B^;S-l7-k-X`)F*!0+kbYHPBAL|z!)noNOs;?rxQ(Nt{82_)zfkTKq(&sQ?LaBx5q0S;?_1&FCy9floT*tiLB3hO@|AT$jvlxv{RFUh|eL%t~Pe zH7m8Kd~O#}eu@=4>bSzyW{nv&I+Da0oAYkK#@r6GVO8vVLybGadBJqp06RP(iXl;J z=6F^^5qgw4jLF09Hk2So1>=$>mdgwT(|e)K?#}g}jVcvayXzeCF^)}v;U;V-hU38x zJ~$L_8O9Md1)rLe{^f72kskD$_J|Ed!&q?w&UA`xD3ww+doqT2333UuqqP!=%Fxx0 z**Hw#%@ML7bCPoJFK#UG z=Ll7#LKw&l(WQ8KiTY#6sAUHMq66?PD=3gbCSq4O41VY1$b{>1=U^PO^d>!F4(65c z_y3p_4JF<=H3Dce(hl|D!fdqg;f-nR6$Q7NmJ~Y2k-!)Jo#gda(4tC7ahx@Kl=o;1&7GllNe-CczVL#jTlbuE z*A2_&T3qyMj5j-V&Wjp$&^ zIYoU{DFpbAYqYYs&%2KJ5B8Rk)9AGE3;B#9(|e==PZ_nyX7K!ch& zjU5^EfnDG2IuJe{zTtq4T95kt1G)$5=c=hv0nWo?ED)Ys@%yXl)MHzNdSE}U*1Bs8 z+D-Tp@blnPY~qg}IKV#r3|atbhyx$1pNsY7`+x_!_!pP-Ui5n{UU|`GwL1{2Vpr{~ z_9AWu9<_65C9@x1kiW-fLJ;~XSVAW)6@wXj+5@qrK;oh-bc_HaHSrRZtqCFblp`g? zIcUKpxIGB`DRsL(sCKvBadhq)*?y3dFjN>w%}G8oC^|t3%*N9O##$*GjYKWOqX$pk zy;>B48+q9gtCYpB|GulzQRT%cU-(2T)69>Y)^A-YEuNpR>ao(W!@0)9e035K0! z$o#OGw?PgVoyIvliy=<0=jeo$R+&v4LGe7i|A*MFZG|)A@&BIsZ5iQ?|DSq!d&-Fs z)Lir;Ojk;LG^)Cz*bt|M{<>c{W+Hsts^w#KTS;&PVb~NuN0P8tY!-=K9HSOPTDQlj zNiZ5~o~Wf*qY9>{X#OuRfp^&9X+X|8NpqLLa7jbp2Ch!ZFeG4>tJL z13@8U;4RL0fp1G*Ls`SKfHYJ2+m69K0D8m^`UEduRRpp#y=)mVU}Mpj1gQu1wj^b zl?S+8>%^%{b3;ep8Tk6&{>QFMP5zhj?E>Up%;yt{Q{E>(Y^QyO{OL6cfi@v^-e;s` zBoyKFxqDq^EW?;=`Q!UXYN?e};(bCVbnttl{LGNSr{OJg(rr3u6Cx283Z<{`eJ|4X zvwSJbn*2_!IDD@Kr+6COOvB~0J-;sYX7Yd)eM z_~MllM<#|FUmVW&cnwsH?SI%Q6w1MykmiiFU+`eEqZI=Tw#w3R9%bEfr!=5j$8(B| ziaL66Rj5|SaFk0_Nr!Q+SipRO+nT0L+R1n@=`ltq#^Q9X45n+(u92ukp0mT>hu+R} z*+jzL$wRx-Zjr~{brsAlp&VVkU833O%z|;s{Ot@6H7MF%KiGrAeOBC_epV35;=ZaW zNnqsGZjU7iV^5Nz9z&qNxAf~vpBGVR_w(4`0tW}3c60h!QIy_&?e0T8*5l;0c@{NV zoKA;XohPYO&1Pdi#&Sx=eD%&i&P`lLA8MoHL zOogc#Vy=ru&LURQca~k(Vks-xYH`wH^o4EB6->nkTGrA3+1<@D71dSukQt&9WAdM>%Ei@i z_)9RVV`5E%Ms;g_1rlat7MLWicG&F+YuZ`TXxSCFs*lt>#)+Pg<)LUpCMs-MPuo|u zFHE4d-?@)m>RQm$rFXN9jVj!5C1HI9p93qomW*kel0 ztmkrDQXJpUbtV5jE!po=T&-oN6uTsHGxQ9W#5>Cf5?LgQvz^*$kqVzfU%iEfg3E)gOZq#WQXaYIKokPv zST9@tOX;!$jV)eDCg&6Fx(mudBwo z=9w{J?ca|n)?NSLgCL==PJ7Oa_tvENXI`w5FV*+8s%Rb4;ew9hefZLGgzvBn#^4y7 z5qjUZdTur-XTzw&3Ig4xiS_kG_J322yR;3x%bXS&CgT)1QL$@gIH*mL5 zB9)q0tzHAxX{bq-m!r$CKgH5S{@iNqQs2JK#006dMA{`6MGP}>32u>tcMi;F^jb#MyRKe;a*Q`x8;&-ww99HVYR`BoAM(2V zP)@jwaF~5}fyecBHjfCOVwWO3ehj6T2gzAwK#z`qTzaK@s-(rpTlCBj+0)f!4rRYm zW7t=0FPfYkSU*t)z_mL z;1bGxz(2I7)bj=xNgGIgjK$S-KXr7$vyiV1vI)AJt39aW2XH`>CS;cE=+ChVnPR_;odLb&1On2RDIJa|rZBs7KQe`e@jY#qFni^JM;mp^?i-*!?X$ z-VtjX-w~^!Fv9%!jxgR(^AT9QCfk%J0uD8&qm8(o2nTO4L`d7WY-~TLk1(bWfma}g zzr*6Q2uYYvt-v3F4q@DYuc;+1{jpZ9(HqltZsw-;ak7}V%_)ANyJ5_&IEgo8({8a6 zGt>ExuT6#HPO^6I4%?+-idCk2++xs(TB4Sko5%8^NO@GYANrrK*)7_oTB97Tx4^Wp{i4~=wHMEDfZoaH)Rm%_ z`q;RE?zxPV>Y@|zerX`<9Rb52rDL8pY$Ej&7`NAb4KQ<_3YvyY&wO}tiFQKqFn z`cO5^qNNfsQe=#i!4Sh_*ldU>r`bKH5F?p!v#_MBTkUaqQ&9mWaj2oH7`@5ohE**W z0!M@qX}8WD`?P`^*|)O4%eE!f%yHq`mGdfU#ubWj zm7t%aySjri?TLqY1dmlo)6!)65BNe==G*Zz_~DpV1OH?e4fMb&8%mE`UwNDax`_7= z>L7gfL>SR}C~n*{$qa}4`r3oInb`;D$@#5H9zsfv8^Vc^mQo-gQ~VnR@+m}Czn=LO z`L7`x@1`VGllc&qO!J3@uT!c)8cX@?k#G54R*31_|oCZ+B1gT)Mg;g z0pb{%9l3l!X3l`bP6OYuyy}^$5k;~02?k>7c^0Ih{0=|$o5wWQh6alKfA$$94cME@ z>GpaAfM2E%Mq0Z_z>hvGom*3? z_q!FIIkY?(-rYq}cyfheK8+SR&T2)<qZ7 z*Zte~k6Nzf=eVBD|55PI5R_(wS%~IpJ_LEoE_OxWEHbYyt#FkSQb%L`xI1~SrtE>3 zpTuymy7vU>cTv?Yc-3&Hn;}x1%{ulDwO!KWwrFUSRFSMAT`Q4TdW)f(bNX0wje=Kx zY;pWE)CpKz z&(TmXef9J$8xB0mrO&_l_e;C7dYV_f3~&nwSVzEjSrI2(aAbWSK;RKCrf;E%6kDP# zlarI{!{N-r&XnGY>nw-r$}c|{VTem~Ms7T8T7aKYES9Ig06SDd%XRbfco+Uo`SGr> z2mY$%m#?~`auYnU-T6a8LvF$Viy06A3P=+Pua5%{jD(Q^ z@I^lu4Z4Q>JXqV*t@yavp8 z9&$4h-i77lE!$vG9>2+*H7q0Y6*(cleiXuO(9fU4pP7+N=hYcdHO}^cCJgW9$8mEJ z$MUn4VGqPgcVDc+4ROd5@j7+~GWX60b>qBfpgx5~jRS~2fN>gZS1RCe+_Izf!-4c? zn8*!T!ISlT;Z^|N17Nvl=V|!)E&K_LRBmh^00H179)O?{0t^j>{2svmr%nL_1b|t7 zz(I)tfVV<^fzSmj3{~Lal&c+qS05p<>h~zz+SXK*YD|X!cvV5bswjB*HxV}h2^t9~ zprxV!9m7=Mr=1#tyhQ`~?4ku957I%HFe~tQV=Eyx;JECXY%lPVlM$4qQQmH8f-s$^ z2r{HNm-C(`?CMas+E#Sj1#3t*S)xV zGe@|mgmTv&y=eHfP1-vd37Mc370}#mHE-V7uq3QF7x{4eH;*dGbc-zWxUp?tC9cnl zk0EVaP_)aO$EBu>8b8`o=C-ta5$UwPTA*SGx4C``p}U#Af^tS~yirvgJ(rp^S}tW7 zTG2f_%#DicGC2#v#x6xn4yi!X?oTl)ExU1oDi?*U!sj6bx0ShVlol1s1}U$P$;C#c z#bAI${kCb`@9F-5C34{Q^yt-Z$gq*HCjTFnnYDnSprpppG2_{|d7>5GLo`UJP@_SM z4m}2pm@w1Q(K9d-n3!2u+1NQaxwv_Ftr>vAH5Zgb8I_ zNTrQub0vTX6Uw-dN*mAS$^a22lyM=IHlEE@03u8%<3cKJJe#W`!h|v|q|(ObnlSJ) z8KZp`{Nmr0dBUN87LZitboT3{ zGAEfd2vM9wG$$SviA5~YSUM7~8{ybMC|q%Zp$-J0{lS{!3k+`{1}SJt=cRuZGU|KlJ?@q z4<~l-Ro)D)YB!agEmy_ayeiju9Tt8i7h>htVx7cm#s3AKHsy?4*p*t)3ZD$CxVCFr z|Ag)n2J08YYvBg&6B*Df^olRoO0U^EvDdQyGdu&oLVfEX{>88Pv>Rr-IT?aGz6*Sp z^AxG{xPet35@woRNr;~dUp{?;wyuj~U#H}kfJeh8qIi75F@$mFWw8ymrF_|-|7XSbN0Emxp*pMHTW2qn1qUJTYV;c;oc#BXqRYZkQP)=qd44hZ^4M+cswiH+j3JMO6 z^QoXj00lMYfBiD*^tZu2l>gq2MmgsUa7Q)j^dWv*y*D#|h*Yt#*ht)Luxld%b0cvT zH=<9k+sjObf4BXgZHzYh%8jncjfk%o89SSuU?kEC>JSB)2!dI7LvK`0;AWKo2@qmN z2qXl81U#h+E!#rrs&q}9=0xPpeSdnUE8bPAFaX;WYa+u;FauOnbV?7K3Zp?W15Avb zqS(1sysko5<>%T(q~Ce?Z>`V!s;YZt{^uY{IzDQ4ISR=pF45d?LAY23REY&{9_puU z|E6?%I8@UN;SoN`6=4-~&j;+Re>pfS_>$aa5Dqrx@@^X^{{D3H2Wbx?eF9i3bW)s}wN! z0Ifj1!L|0b*Max%qK@0ncjCjmHBW_@xmWjkcNUpS6jGil6@c{O0C9oH1=28e8C}4A z`F?48y))rCm1h)K&6fIhjS1g3(&|Fe$4Sv~otaJ7JO$-4w78ZjU?Cap(fpY zOP4Ph4xS7LbsGTe$ZIv;NoP+wrcY2Jbpc%3R_LA5ywR+=&)6mS|G%Xso!NDnl-92_ z08=Wv031Sg{_JRXW+iL1wvsI_E6L7VTPZ8~ntV<2U5f8guGG{9P{Jf%DHY`aJC?A6 z;Q=^+@P>i|SguSh)9J-F9(=n5-;DgokNn;#NQ}>=C_gSp-C}{i+XLS$i8o8g4GwRH z;IV!|NFFlAWs1CS?7KPQ&5)Ei<8Y9%xeXOLQ@ITlB#Dg_q^bOBud~^EbF-l~9ad6= z#LC~3%hGC5tqO-T;IPDNwf29bTE};my6t-vTK@zq0TKWqbobz;0e@c4dU0#uA!7~2mozb6n#eG>l{_$GUH;Uth1%&Se|BFQadjoN4S>z9S z@{d0Et3mo#m%3jIvc4uUxi-n5c={f5Yk~jPxyi;- zeQ17Rl%-RA{>R-BG4aQ@2ms={Uj!;K)~40#uSWqPAM_vq=zrJzECN87tr#tbk&{AFzIYeyB=T$vzg5{Ey!9x^Oh=@7q)E9GW6T^7oCX(^>5 zT_gya2ogwP2v#8cn-A!Tt8qMLqc<9&m?`8ih)5cgND{!0#=Pi3chD-9EgB{!89yQf z0C)yK%6PpOSp@(onu6fr_>Srdt^8!Xm5l2#Eik5lg_^)wPfTMqwOXY#2%UL`jxE0c zuNrf&7);+IKL^+WAGp^6GSzg3Ve%}=&ncO104{Atbe)MU;`ek`2Oun`y_ya$?7)@br!jIa>Z%j6Q!h&08Fpvi56_Breg z0ESfoNpxgnXL)Yy`c6Iil6PclxhN)YehdmwED923wl9Bly!7t&pp zjj$WALW+uj3^DbCn_fqHqdyHl_X4wF#WanFDRK}%zy{s`M6jZw07=JJ9qxm*gLPPD z58ShWSQT2h3Z6=xkOzcn%QbX-_&PCct+2>Ki!Jfx!QRHoHjTq=%j5x;4JeLr1kW!owW`kbswi*B&Eo%N*7FdwSXh)>oV?g+ z;;QgCr>EM&jd#H1*_8$(hMZDjFvA-+*;SHL9!E00=IP!W~N zkE19wx~am<`F``@v-sN;UL1#45L#YofP7y$^_*tiUc^xEd@sHLLN0r?vv1#P82yCU z$cfk3|F#SA-Z9TT?_22jhnCs>nae`)2R%Uh@7Us(LjDBo+hP|SFh;0<0#4VGc+T+h%nO%K+Gb+; zCzR*&ILOzh&HpI@^Zz0a-~|9s1%?cOj{<|LEdh9Ndq5_!Zc+0x$^q*xSk_Dc_$zo% zk|q#XWu6K-#>(X5CLti02E0oM`d@95zUD<*bYEnMY11jZ15yYo9(+Nz8Oh8lMsM%M zqOGvUaL;umT5E|~Dh0VA_@XefUDm)Oagsj$u zYctv;5hQE90Is5zd0eMJ2@O>K=z=6FoRt%F9Yc!jf8U zZ?3N{iEWvNuBnPFiCEw{mZ2$hwrC_A3I_Z>ugC3jI&4{IK`istOuW1N zmL>&1?a%CK6%QxrMa}MMK2V7Q^6)U=2>w*;{+ZOzjJ4jdZ4|+5eSSIi^n8cy&7xRx zA%@u2{yFcTHbS*70#znlV4R*^qw$6ZDx!~e7wa>YLsg7KGzy$=EG&X(n8Uq&+4VaT3B2DE! z8>LrC(i|ONYGb;mh*_ITm(1wJx&cC{3bS+*EX>{>&2T^Er~Mq|RF|+#eDzKL zBY+#>M}|4JQK_Frf3f^#Et`x`MeH7zaMxba$K?d|1KCr_ocPA#hvCkvP%+Km6-k$q~;0b#&d;M6G-*~H#q&UYp!Yejh^QY5&Ve^&A>;k~4xl}5%~?8bDyXV$RQuFsm* zXP(2ZNmbq^f`QbY4JWu6w{fK2p!O8Z5@3Ws-KOD5UNoZF1wPcde5*%l^19LFvNt-_ zb$Ik_rB%LA@wV~9iN}(*yl=aM_qQ7Fd-7PV+B0G4$t~!OaBlUFu0Ie>^omXW0d|v>wt1NaM4ZNJi zHG>=8^_eW9Tqf14c!PhktMNA47W^Y9&&SMPIqa*8J^abqAhXD z4axS@Y8({{veQYR9Hii1BB*FcSyM0%Xb`;%_TBV}Il)OIM*C4mR$Z9dLIucCne_T> zDNJ8i1G1rPVngEH*V; z-=P6q36?8ng5{slc{NM6Bbf^h+%D;wpik)J4a`-=rn*<{(QK)rHqEt)rUEO-T~K}# z%$_8+jGvvBbGYf!+@vL#&~w}MzFfHl2{0@e?Bhs;xP4dgY2#WKChy^JvpH<0TtwY! zH>@G=TEkr;&?w5V2f2G~#t;x|6VjKOP3fzrT&g2ZdWK@8)GY`3jceUfPA4T2nlNgU z2Su5?6M)Dj%n(K6neZ%Nw*O$h9Kr-(;R7G}oG`h@&Rrthz+e!_mr4@jU_(2a!i3>& z^~x4Nu})elcc;+U?j%S`&49+IG=W>*a$cBgtm9b93!wBx_VcFX+YVhsSJFMM%)|li z6Lt5Hx~K0p)N@%bu$`=HVwyJ+Mx35EE&bW4>Ak}Nf-)}KxiAb;7anYY9GK2Bi3(jI zD-dSO#u)xefXb}pD2@`L?8yzgQKFj9!g+r6gx(8v<%s}}*KHA4L&gy-t$egMjT)8l zy0IyrF_iSbtB%C@XD8gKOuQy{htpEs~=+3)2Hw#Wc!n16jMR>|K@Qsw2 z-J}zv zNRNMr%Qpa(;?3m;!j!gnc;dzw zg4<93kDPTdYZ;BN0}-)*8S2=R$)TL$ZFlHW`<3yd>n`LIILiND*$T!0a`r5Z?LZj| z@%(M~Mpu4XT=Dkrpqf+Dn+R5v#$60eUoVlF?rfLyH7qq{yfiBe|$TT?@0<*GZ)?E@8bM2^eMs|Zs{2YR)`<}9hc_i_l*{a>VIsGn>=LxXrCig<#;WangC9eqOYe;E z#FxS6T%4&`&P*AV;dljRB(%j?K*56@K*UTbYzl@f^#2e|y+i~6m)QACUD7hj_e2N_~0E=p| zH1P72sXQ#yh28lOWZnl&L~n!hB@x2xSV(hdjk4t|FJjvdx0|o{^C5~l@%1j^#?)_m zqL;^B8nNyH^yM~JM(4#F<=jdX?Uq%6D8b9A))jR?#Y}Z=QP|x9zulqX@{1CDO*a_a zDKBU(S+H30;CXijpL4yiPLUH+5wyk$>NV$Nhq^$=o?j#^@P(7`wD!H9mg5;Wi@ z1Wi9Rf$1rkoR*2jX-PczsWgjd#C1s4^;#Gng_50M2cRLF6uo-1dljuHkMQj4c@!&X z!&hE!3!7(Lka-5O_^^E)nZ#I&gQ_?g^yPWIFs{7MDH;*lITh_Fy+C&ZZ7+_r4Eb5H zd!ZSTB6E$^Py>7qr|&2nUd*i~?Tuq&6$9%yYN5h)NF&aPI*2xnq9PM>(^Gpg%B^sE za^mb_DkgRF2G)F46ZqCDg~+kf5_k?8E!}0^bSxJ-aErhdr@Ol>NuR4ZdyygzfosWv zNQ6x;M7~(dW$WhMphS~vZpo+ujofkzvPGcmtP^PqE77MVB8wNA%fbu68(9qP)gIJx zWTZM`_E_8lZn#Xe7l|Qusr0_}-jM9e(JTF0plMlRHrDKoIA(O(882^n>jFZ(5?d|4 zqrdYI=N*Sn!;sa=WT5edZ=edTHRa0oS%_o07GE+mDO9LB!t=pIB(3sen*R4wuQV4> zWcYm*<~n+Kn9D`{s4RI~?+l&jTr5M|WLGtle4hRU@^_8d4gc&HhwEK?l)NskFC!CG z>3wO7$?i-hl1Z%5Z8TzY`r-sbaBMC!M#^P_tr|^pD2Lf&e|}Ix8Qk6^c-cvp21nRk zBbn+do9`(H(8XNYY<$pe%m0~}up=BiXpM-A^V&d#6s%Pi%QN@@3OtvT{eatNFQiad zU)PF+p|^jw8sqqfALV((*A84|#!^3kg*v!$Z=KUJ(fJntRguo%q$#Rw*95f7F ztG{fWZunuJjIkzIFZX(v+?Dr^kK+c`g4JNrFIG7_3O`s0BV%zKaJ#7yAG}Xk{NAz& z>b*XhyurN=q%Y~}^TQvS87|{1$NC&(e=hr#@jQ=!MZ(+|NjSANqgJ^5 zB&z=h=<`^EW9_0M(VnzpTUnNFr$)Lfsl>cd|2oKb7eF!>sdyv0BidAKNInkungL)? z18~`F20)uNToZsT27Z1{?N5D;zLYcA@J1DsBhj-rSMfzg!DfqUz@k!~y@A+2IIP_= z`SrN6KjHXqc~;ZYXoX6pTmuNv1)ESmfUShFv$rKY^%di{{(olg zwxxhItP*9$iuW!@`c2lB-Xjhl2+;9gZrZNXw4tUI-^iNG_T?7+`Z)j&y(mRX&ue#| zXsFs%wfOwk=|e|S3F(A|Q~wzG-4@?lGRrCRnsqg+s$J2?{~%!=gFm}h%VD@ddqaY} zO)dULRohBPe!46~+(x`nyHK=sNjxBZR4v?E^e>UT1Vu@%Uai1Aw+hCX?@~mC+bz`V_!}yj- zv;j{$fqhVKk5@gu)j$pQd_f24pAwiJPS*cru^f`#@@~_{84iQm*g#=$=O-yAgn!IqeT^H3z!Pw3?K};+y7$nb4t{mQY{IEYsvYM~(T=G&{|BJ3~Ab z){)b(W0*Eq7uwKCNoKAqJE*I@7-F3T;a?s!pWRnfPRx{W2Ku?MBIVSH=XX+ z)1|Fa@55+&I$s9;@IPA`#HLpn_nn$AbQ?h;nE-v={7rIjr(AeMYU}NJVc~@W)mrc= zhaYgNwf|$(KKae*%?0^SvCRX1ClWHyC)+zdFy`eKa1#n=?p=g-jk0G~}J4Fa5f z+_{R!5ZE`b%Wn&lUyQU6KFTkba_WMl1#E2l3HsmM^8ECfM z`O=`ea(3Sp!sqx=!HYX35HJ`)5CornFsFeX@K3YG^@e{B_I2LBdAr* z){3mcoU&v5^Fo@g>{^tubr+%v<{F|xTie2u1Rd1S;hdJ1{U(>n>e^G99PvyHE`(Zb zP0yTn$3i3z_u2_x++V0GZYhj621WYPiesZv$`4@*bEj-bRy)KPvliQ^vN9?ua+cH% zK?0VsLi%8+36M{;1=k7+Pq7zhRqE|aVaaN`qW@Dpez;MVvyUS$vSFZx&!TJl|LV7I zIv-)?l12SHGW2-bW&TK(v139+UyhS;L)Ej|^?E+OCHBJG{Mz%{gJQ3@aY4R!92OAh85bYqQJJlYF~% z1);BQ(=NQ_kf`s5hro9Rj;tLtp%_zjgSpC@81EiPuyRa*IR7etyF;-}UNx}vlmrq$ zIzPSSAYm|}#@729yE!kaZ~Qy)et zq@?v{{WDoUSGtG7X^l)~qz!qd>G5?-PzWZH8QkxL8U!PvAY5w*G}R$ZyGrjsB4@&S z=f_`6?mZX(z^c2ZW|o&-yLV*#$iv{y07B!&=|HY2{;~CP&VNG{Qs#i$yb8|V#CDuE zU(Wq9T-4coqattX{O1Ab)yuR4{qBtMj*VOEyKb7=evKgaLTlX{;)Q0orO{`1ijl3o zCCH2dA7y2-AG zqM}dw3oToqgFpGu2n?Sc`_TQPI3K&%#>?G3us*}F9SLbp#jamj)Avy%K0cpTB#7ra zM}dEeE(o-Jqx*a!+N;ZKLpuZXGqm@wRa0JeuqUaDk_*FAqwjw=L!X!xP3e$Ky41!K z{N$W9bUdhKtdRJ~2W`^mrEyjQFykjvM>~Z3YN9?DpX!wRCGG@njBfM--xb#UI6al8 z^{*C&om`QX2At!^pKh!4IhYt}zFl!{g^cj!n}l>0`$zAe{{MH^T3snWmw9h$RnU9w znHd3rg%Da#8*k`<$rHl9vnJsfhP$@)tt!H@g{M>t0Cg3s>`#h0DQPx;2Wgmq)IdJg zU1^u!5)A|Ij@}(m`jA`weHA)x)f=}sNln}afO^bn9z^>{&jW_bf)V;pbz^yUQ#6#L zV#aBS&J@nqvA!z=M$4Z2?W1M_TKyEqE|gqO!L#rV#o@>yB-6Q&6%Y`}i|~@wjQJ^| zp0wQE{tF5d%+u$>Mct&knvJcEVqJZ+5wvE_xhomX$<03W1gmm_k6Jnw7jmPU8$y3t zwm_rwJz_~blB;S8p4%0fSe+%DtfOgPHZairBX4Fl9xtK?*7b(x)J3u*C?uZf1@WjH zct?4Lm7C@3;(f`26tpLB3f<7Z&kr49?qRz0qx!&SHGh>AswlLBeVBdODjvGq)$~j4 ziZSmrvGJEh8GOQcn%>X2Ih$IZ)e;TmD4TOyqBB;`zWqdp&iYJPh3Evep|ItR+E9Y` zsKqS(RB=ygLVS0@+Q=Hyt&klMASmcRPB)r%9dQQZ|B0tL`^K7v-qkC)FEh*OG+(r& zz*!_~O{LD#JAq&uax|9M=9;^qW2O-KW2+ABtpp1uf{V~reqDC{u^HG?HfQ*ENyfyA zMRcY*a1+r?B{uO}s#e}`2VLLJf+n1F7DhzE(#5=`Q2g(=V`AUG_sD^1C$)4n1%`H|rMNs@rtC?$DjOOOL_surDkMhU5P)AQ{*ebH#WSXT=&xM*`tW zJGD*Y&+&Zy4N3q&#Ot)|jN zjeu_?Mny!wXS=eyPLYvQ5k=HQnj;K`ztlsbgK##p73tO&pxq(CM?RaY#3&l)LUA&} zlHvqa%9xq!gx*WA1Gt~K!8kM`iE&v+&%-e z=MN6;s?4`Jq)ZCUDLDHnAp2irx21s}+0@7(m$<-1CQB)p-RKiKCKH^yyJn}8b2s&_ zQat%?9{ck=p`--s)GHZq@O})laHRxL)}jkUV*&?>uf|vkU@IDj=u*iX^WMrm$c|04 z(}VYSF{mg1%%{x?T(bRr;b7WKyy0z{SJg6gS_&m7Qne~rc=-C4(gicMCt5R2CFM* z7lZfCJ(-Tlk142ij)!2xnUx^BZ5j(51`t38t}JamA5$%k;dNb3lqnHk;1os*-KY08=3RyXYf z6uh$S#s=4oWp3>Bxuv9PV=>CML>5KK7eA9yZB3Z++&F?*ZhpKGm0wmVbI9}}7|jh7 zX8eMgQL+Kh8sP!~01`mEmICtsU{`nlbEN{zk21bi0RZ6RAvSh-_rsxf0BJ zY3HVmn7Fyw<@2BCf0h4B!Q8`%hl>xNm@zQp%1j>Fgq(6D`p7Zi*_jt-y&(F!IE8*a z``qkimBY4U$17u$1tlJMXWp_hk^H+~R{2~0VHIES|7k!y;Q4^T#b*Ow1jSTe4z3D; z$2QmgbwWwK>ive~K*QsbFGzka`Jd$NBu)AG$!Dgd0{@uuXv(*%zCmD-6)*s1KptiU z08mk;6?WgyF{eA2Q{tf%$9I9tDS9vU2iz%l4SyDRy(dqU(sQU0$@VW;0!7j8xo~Zi z2K^1o>o;(3MI}KIZNo5F14UiyPQr!xfc=tX);_@r;aL55$8!2V{{yfm;YlBBmTOt2 zss9ITNg{6DNg-;W4PKw`yYBL4DPb#3z;jOhFTuxZ;r3GCZzR?A)Ih+RI~YmSkS$BOoT#7knGt#Li@Nt~yqlK_ zy_)wlmX6M1z!TC~gXab1I33g0secyk{QqoPspV~wYHV`39K;*ABQ}8Ytdd9^r_*h` z$^7}4I6%M@{7h35gMn#QE73oSIIympMk4?pNO3L>22n{lo(Afg6z{3DdLU!x z`wEtS6&~2FX}_C1S}7q=M|D?xI!{ByH>2z9!_f~z?sG~Pr>+9-kIo6qQ}H=3E&J0~ zKwh7H7~uU2Mh8C8VF|gLpdG+=A0vCH3xCi3ePn&~8!#1u>&gA~KYw35v-fcZG$&XA zLHKA3=5YX+%YC0e&w!EyM+U$}3FJE)H18~I9swY&f0zL7j2cKkhIbe6)lFkIh!9xc z0JDT0M*}u!<(dj056(XKYp}ZYk!YgJ8vOAoz$Qe>l!d+?TSfGgbv|ug+umGXC~SI| z(1WzUAmA9lSEeKRY!`%;BcnzXJPx+Y8NVQvnK=fiN1l#VPFZJor3zDI&k%AF5(%N- ziLK&?xH`Bkd+JUD!B}|JvsM zt1vTy5Ig(BYmzKVC$?1GbFhzLI)7dR_G-Y zbPVOMdY96|a;)+k$yDwya3x99Hmh;=O@Y6X`a%S9|kw_&J%B4h3 zR%oQ2NmLO())#lrQCFB8m1n-!F5;dTz-&l?_j}ip0Co}hv_SCq4#L?ET)4_maS`(C z=;$uTD0|fL=&cXxxvHuM!<3^g^UD9ft$1&h=_&J_Lqhrd$^p#XqAVrg$N*i{z8%pR ze5B~o4$N(8>x%nmX|DiBICiJv{Sl^H1x)Z&DU8SISm_2ry1;{kJdOmRyA;tcXm3AH zc*7y1-I_2-ucKw;EEcs2j~l0S$&J6V_!d~Rpk3A#2G1$J6+D}^nuyx|{UeR$&*wwz zk1cN}NTc`kGC;lZOiec_XJHm^f-Q^M6|NjVrm#VU9dz6>R41Tce<7~tjvc@VcIgFN znIl5evmX=4H&_YSX^L+yvstei#?OTf^U-?_Z>!?8qeEbHoX;CJNW+0{=1&A1cf{R? z|9Xe(KmYUV5$LlO3(~vPn|QNx?*1^XA#kYt{*xW)U_|w<;(n$f;LdDCS>i=npRVl8 z4oCEID1hSsfBCU~mS9pOsD|g^phIp-zu{5NwI#Y2kbr5JmRdjTk9R+&fV;2>+i`rQ z?{){~`yNC@i7Nm72MEW9fXKEKx-$eHzx2J~J@1uYe@*!n-e3=0!r3V_xG`=|iaGZn z_`{~u#{cE33b#zky9>u*)GI(`e)9V}#|F{CJKP1HMD2yR@`p;%Ri0c-ay!Zg{4$UF zRwT@+k8-KPPTYx$Db3^2s(#pM39Su^MWV~WFsjza*;~vaoKC@DJh4&DO=zgYyh_qE zQ|i^n!oM&{@C6hTG-b^w7R{JMBSqN4&?b~<6b~jNll0BRK{nacSb$Ap7Q{R{Qgr{8 zt*v;x-~{biIcrVg+db^dL-b9^Z*9zHo(K!zK7-z%7Rt_wQE>9kMRi%%jZ$e(=4$-z zrFjIL1K2Z^LAB;sIYT~8&$^JzwC|^ojrw%|40H2jqV;q22na-Ar|u2r?PWeK(JwL2 zFuywctjNPv z51)I59%KUFud0T6W7Ev79j5p3T?Z`BQ_vFG9S_X9fC~&^%z5%j<}UjRqdW>6^Ax}! z2A7$Y_V#gPX^4dQCz;M>l8JazpbrJtE=>GTz>NgYeM}U2gmSq^By5x>ofS5in8dIu z3u+jEsh`UGzwR5YBzpoo**vV^{ocA;ILFB=oh`C0xI zZXxC{*H|GuAWs&d%LYQUMSLVOCqsWz+F;Y1O%oK17`1M@F}{9%IPC=U>i54hn?lA4 z%DdI`6s-kjZ$moG@pk!fC@4m+;v|Bpt`~gxpACoJ?Twp~FoKd3fw@E)sE#CVoS-ji zDTxGuw-RQV3(qnzm;Pz8w@m2nOR)W2mjIDAhYI?lBbE8lP`IP~?U~ zVUOdDCbN7jmL~R~ zj9PGdbCMGwf;9}(B0#g{@3!n=zyEjkKgu%_(u{*yeLQV@hHZLqqo5@Ul$vfJTgUvR zE(cyDoIXAULCDZ_0+c3r`Eut&+Q*<8G|}zC<-bOn0N4ho07^lUz^e_QRf~0c1qnio z1}LL4I+ME2y;wyL`K=44}mL5@Giin^#kPn#Mp^Z?YpzRU_Ass zDq2th+C+ipfWA8f=DdjCz56LZJF^PRGJ%SC_Nfhc#O!s~%wlc`oAh{n&E9q8&P=yE z+P=@n1-+Z|PbLAkWAIkKVjAGbK(s1t+no}NL7m!-h(H%@aHP>YDm?gb>RVs~g)J`p_B^t8 zfFE8k$H2!#@o--g?9k2a_*6Q}4Sp4-kMhmWG5pY}GsRuo?}u*9zd{Z45(FC76s8h|@I$NOpZa?{A)J^9sw` zc@lKMy)%NneR^>0p?J$Ki7(1|n7yd3PK;zZYD3>hG`ZI^&H!^Tn zeQ_wp(XJGiOzr@98-~6LPU1RxvuJ4Xr6oeT5LyqcD9#mUHqHerT3?wfIcmLs_#;L~ z*j)QK^2*DOtV>U>Z=#~1xLa^OUfpd^&IM-;ZUH}za`SB9`E7K=@15TLf-^ThaLdOJ zUwbq%%mW`~Sgehm+oI2dC<0Ht?kw5$7+vM0BF&3aQFpdhxce<3;a@ zb98VpqDNX7+z>mh&IUXRO0Rlb+insfhz(T$A}|r_TGC=EEH-sgE-xKu?^}!Rcu4M! z;L6MYf)l!}o+nLe-^N7B9-cY@h{gi0aJDIxe{ieWk)4S|1A!1A)|xUnjU)LxF0|s# zw9tLaLXKvocV(>P$21Og_%rPY2=O>-o)#M7ZSGr19R0}i#69FyN-YKf#=PbyW0MwU z!hjFz6$@-}A$`A3nGY(1OZ6E(|Elu`NF1=6J^}d}vuH9$MpstlGBe_W0I(k+! z@7lkHSSIL{lRYDkER)LHr1Jd3+fhN{KyW4GIYd;XF)IW9csSn#FPOyjuqa$DZXWJA zqJvDqxGoCF+QG50)OSSO5!6CK@0iXx2MEA0Tp25cQt1h~4D({hQ$!T@nZIOrvsV}= zXHEiGlEj|y5{}1_(#(F!7UR}&0L7_7YjVjBkFSl)= zBO8yX_>1;0e@gV#n<2Iz5G8F$hL&}`CNYiueZMgQv{$!t=yDT0@%g1v#L+9oGH8_d z=L~`})q0omnrWNPBlpHA?;n{Y*_a+LS@YrjHzg$^vwr`@8-}D+kUAJ9p5p0IRb03} zvM1GCG5|!ayywyl7dmcfJAtH)ao48o(~So`l;>WWs(P1FJ*$uIw;d<4e~zZp2)R}V zJ?A4;e!!NwBJn=d#=810xAeT=>(IvE_;hw;XXkseA!kf-!>X-3YHAjZ4pvvZ_N(7w z65Xz5wi{q8`C=+}fJXFJaK?b8H1;a{I5&en^FT}X4CY{tsRja#nwfWp^1p*GUPFLj z{0hY@NS5Ck(0D;9lPsLsi=cBR?3cMh!cEY7q z&bAH$Ymk%(F9EKO)Hn3;GyJqUgohrbzc>Eq*h zAxHTN$k|DeWmz*XW^1e+ImnYj#llnCXZOLFvU_c|LH zzE+>6P=yA>;2Rh_k_&pKmxsN~^eWSon0U^jYR7723V?(nB5@s|@S0IPLNCvvC1yoI^A{)g~8po^@FRfAkL{OEPAgG7iRbs7{T!m~?m}c7X zK`6c2oG>XmswwHNrAX13&(Er*te~lm?vQKGD!;)ef3lz1kCCj^{dDNOwFPJUv8Qeo;`D>(jX zPrEf;x7BKTPs)r}Bj{Xyc}+VsW&d)E>>o86`}OqDkRjp8B4Y@T zXY%<1sRSA#LAC@Bh4Hk2W>r(RnT(TJ(3w7$&y`qv6#k1F60x47p+nseJ0Q`GTbV+D z9Nm=yt9cjP zc88SsWX~!2RjnElEo6D091U&G#%i{0cx+G=5G3&`V;em_Hk!>^=!rrOP%gq0+%)7^ z;fJ&0>ytWaeAjB7iU;GV#bn+p!V9)TLnsxRF!6h?aEQW ztEAm|ACI*?qf_1y-&kiMXV=CFr@0jLuNZM62CxwZPNgO_E!Cb5NSIk&ln9}J>`4ya z(G`P8V87dq`$AKv#xXN#KuHqC#vZ#NL_~2;dVT;K37aF5md7NCDbV+siBjl}f8|+)WWOakkje*b-?1QI|hhH`gA7svu);HEyaP}`D2s}+B|N5sQ z3F9c3@VxF#1O#h`OyQzbDeivg@&jWDEhF>wu<|p(5KI<>zXXokw2|- zxvIX<2)R$g3EfQVmPoJzci@7Ie_)`BkcXvf;uP4mqaDa~`}kTv$pVycRAM=kL_Y)vd07 zeq&p7w$Cf>f-i?UbWC|L(G1(RwWAO#w#r}EOsXKZufy}Vy1xU31Y3k*XG~j*>=eit z3?~KK2_!yXOF<+29lwP<5(baJI`#D8=H}t)(|wMam?ujmh*SdJ-@E3B?Q}It zF?cx0TYIpyW1STFa@q8v$v%2uRJ2lLU5)C!>pE!g=hwg%LAoDvuV~k;)Uco_*ij4k zSc1=5ojJC3H|ll-vSY}j=#Tg*U1#x;Jeocvgj7s#w1j^_%Dk$=?((%~U_FpwD|pCc z6EBwo{oD6sa@FVm+TPRb>Uy0yJeB{7JLspBz%IPLYxvOnG3 zy@EoA+}g2(%wC&^of4;$WNkKM?TD{#1akMM-6J|{Oi^*!oD~6d4Y51JrdK!Jx`)#d z@%fX>VR+T$)6#WpZtXgglGxr1##FCF^2WFzBNE59U^UuzIl$grYCw${lT4dORs=GOW+ql0f9sbSW-P zS6yqO#S*CuPAX~Ya#Jt;6{7^{1_7Jt@31VLKm~heIGjmam3?zlAfjF*?Xt+B%hY%{ zCy9ctvmSUS2^fdc^i*8~23xM)(M6q-Y3qdq@n2qE-PQi*xZ_>()A*R33ZKvu%}6pm zSf1^WOw|2VZ0-n3eghL7upIgmFiw;#SVzkp*Xndy+Y`;zysBC8Ej8?4r=~JTjCakj zF6fRIOo?UXL@pg9peQjK1f0J{pghkAD*b0-D41Jkac7Oh+9I~?)uGf4>G5s3$0NuO zFjJ+L4Qr`MlM?x;N30w;msU{RM^$cDdD#LdC$#f!Qx$wLQP{MrYdQ>$aJOw+=Q>&X zI^3mb+1(wsziu5pQtD4_vc&a+E)zMaX^BEg_L4BJj8Ik^b;g}pxCgv27#C5*W0@EX z$1uk7L%eN$*Yx?st0p5h3@{}AZyZH>f?~I(u6M2r=83Nnj$0STa42YL=c&|iXzFgi zNGUry$~3GF#P-3Y9SyNAv>RACsm$RSN}&{ZdrdFKwn7>paq@bIu~J0yajc_iWN?os`oKf?rnRtginaFJKQ;GRp1apd*7 zd|0msA~5$nLpf25?GGAjvpK9A)~sT&v&K3ig3lL)z1<`FIvFiG_pg+t2mNEOmV;m> zL=l@%e5BVfsd_YUY|IkyQ=X@Fx8^Pr){bNtnLR`!r%yA8l&OSX9Xo?+4HPfD=W|x) zW-9XOu@m%rx}xd2*>kyCj)6~xlBA2`x2H`Wv!bGr%+<;FQBNdZx)p~QS<3h|b!ypb ziLC`_$i!W(*o*dLfj1Gea7kGlLvUJ>lx0Q&-El%QPa-8U29NwXLtP10u1b3fWx^T! zAxO5(8+|F^Xf!}r)o~Z9GTFM91tN6JoY}{~m1C216MzS99Ga-EjycTuAjPKJ>{aL% z1fXz^AmCu^E+gOEes4x`#j@-%(nLGUs)g!&PUT2O5`br`LBT@(=@kSb+VlxFe2ndS z&ux_C5431HGjh+cFmkclXzdb>mOByP8^f#spp)IURsL0OIgebR5G_I6KKq>}YF5*d z?P*y=b-QBOBVkF_t?5F=RVxPuXvKBIpt7j^2D=N%sJ!U(##(U{UjCt>BT=|4s07xs zIWKhOCWG^29TqfuI^zo&hE2O?u*85&@H2x(oD(wBY$hYCeOD~8bMbC}|06g)^uubO zN^H)UB#Es2gCoT*b6$Y0ITqa)SuF&Cb2^kcU}y+DLyU00p;vgXOf8fZGyr^`CUxAPNnv0IhE4SlfEpji-S zI`fI7C^BSa;;;a?GpKQG;;vV8yfjoOajW@*^-=>u_H0u~x~A86@OFDFW}Q-akCE00 zmjQY!^dSCM4ZhPh70G>FJ&9w^_LYhT35+KUyy*sv z#XsYu&i{RJP4ScgZhL4Di8``RINy51A^mIJ^X7Qd3_x6n4VkstDBsflNJrezlEgL5 zL@2=9$g5*6J%UD3Yr@fw@|3cYfB6(nZtTXl<2y8GM9}r|hbUBlTAZf*>)wAv0Va;7 zrG6+V-k)MWAj$F)Okey%qkrg9oBMCeP1KIGQ~1l-`gpxg-J+@iLk5mqAdz-Ckw<4V zGqRGvBe;~l|J=4pHYW~mG7#%4L>cJVGQ;v}o&787vF*;jqXG#dWGYGIi$-cQr=cY+ zyMl8TDUgs(c5{g%RueQ)u7z8d`>BxBsK>s1V*e%{YpeN;O*nQi(+({h4GjyQde*E_>P{PzN2~Uf;;)7tP~o zm8N@lKXvBYjC6`=wML(T*m3-R(caFq={zrIdW2LN)Annr26zJtjOo$tPgFaQW*x8{vzk<87OXT+W)58+VdQ(fiaziJu?ai zxmbsbT0Ne6%Bt*{gsr0JrD`T|d-?tuuSYvUCyZfg7z}k;`}`L(XLvamW0uJ2l0)-F z4$ULSYc;mFily(QX-FE=tv7VPx;Pbj3=1t)$oooL2?XfTYS`vnoPV z0>6iN9%C%wO8JW|RhF3NTl!BVd|{i{qlDND3chfTsNci!s*YLCkT^1+ z;@r!5>%gHDzTh5kC%0P!yyl>iBUO^<*%9BEz2^-)Q+^yy(2~2|-dWw|WV{06vPM-D z{RzJl3IsqLq|Vh9S>h-c#Tdij`$e8nPLfq!Z{wn~^(cdN;eHeyYhy9&mH&wU@Drca zR<&b$^yyUY%UhX;%WK^hWGD*}CMOXCjFQ1M8-%?|DumK$H+lMdWg@Rz9c=si@n)$Dx8?i6l$7 zGsa@}q2;*W(RJLhg_*K-SQ3>c?L6I~8~O@8)qbr@D|&s0Ws-laHY@I`4LbVf!cHa+ zUMqQ=Q8Va8vX)PH=n{H8NgMmU89ijIx?#e`cF4qf*9k-qgnQ}Tlstn(?d2M4U5gwl zIvHmj6W?&yZjn36tzv%#a!5Y)Eo@7y#VYR~QL-v)z|EO3qCqeZPouR_$4uZ|Sa z;D;~B*mYKAXK2Ibz48TrZy)bxrS}S>9B0Cn8NX zR*EAt(n;p@6tfNe%s)o!9ec21RYwi$>3q|0Hp7#Q&dPK*#i?*AI=*{XN7|Copc~@T zcy4Rw&lclI5w61dT|zv1n91o;`h94_GWs;wAa^#bwSeFh=&rtX&W>3H2IH9?p>WVU*}i zUCsp0gM!^_Zeps~HE%U-K_u2WY+lrxe{9=1SaYqvyi~urO?c8CNh!}vZd~gv#~hs^ zjqa1DQT6f8R9bAvr)E_Tx7eYuShPx8^i*NokM`fosVwecI9j9gyBm$CZ2H63|s z2EKP-`HZA>-VgY8a_5hS{O^QcAfG{=X`WDo*jB@T;2C%TZaT*@J7w>UHC||abcq*F z!9@=t18&5ffDd{&MV}Qb+MZw?tm!o?9BQk}197WSzW#WE_RjU8L{mSe8iv~MQ{{&* zsW#EgPp-XjRaj1E2lPBeF`dz$Dg}kgM>lK-4Q+1}(t#kR7VD>Ruq&H{g&Dt%<*_m= z8Vb+rtqi%H`gwM$EgrN@!}SL(3G}7@?8WG-P}rQ{OE6t14){=8c`O~5f)MbVMn?qeZWPj&5&KlrL?*#{Dhmrh{P3{?NB^ig z)};P9WoBxd{vbL;O;yZtgfrQDCh>ghC_CeGnoL$Ezx`PRzTbq4#sbJhZuz)|_r2hh zh*q?=aovVVLR+5*vfNGH-FcM2hfB}C-(?!nUC;=kN42tTH>JGz?B?LOQjm_2g+N z?=A@{>0|@PsBuPZ4baSZ7r;Jv=TG-PjrIV-;w&`wZGCRO6F?XxX2-yLDCF!ecC4nq z8IJsaCbs1KkmTzd$a6hKeRhWG0<#cly;lW_1k~}$y@uvn5G)g>%hBJUd&doaOo+du2SJe%q@9Y%HpA=uTZhPx>t5!=-(RQ}u z?*mK;<<#stRpCSY;!yztka+AmXT@!ESN(pQE;57P_tsnX=Qxj#F8%PUQSw^XCroGn z8Ug@7;J=wE)9|-M^8-NOR7=|>56KJ9Wpgi%cj|!Q$CE7^(mf}|PqacN@LazQhJCQ5 zUDfu)M{N5vuG#>oqYgUR2o}*obp}G+LPhhyYX=K(D4+%*I@XOg+ZZ5ug|tbesaUQJ zAN@3qq*`GQ!Km5lK`iJ1DpPt4wi}=ei)1$KvhD`H8rIpZSM^aq&%<*4cA)1Y)CZuv z`02XnCmQQ@)7wiJQ}m&~y9IYz z^n7E4NAw8zJ{bsrr3y#{DG0a?aT*Z!uU0{+6-f~pp|Z%D>xz>Qu|*OAr?88}=ok=% zp78@Q;Eh*A!xzUIofsLDn-H*bybx9nC29NSm8uxTfIE26Fw-d}#QIm9=<9WHVW8{8 zjZ9&QL2t7p7K05IFYM?^DG9h#uvV8A-UF(HtTx{og_^@_t1P!rsl^t7YZ)z<32DR- zM#|NPu{EkW?ly6s93Bb4foX>Z^&?yg&Ie8JyChxU`=9G0XOPd~;46HQVTir61Y)HKmd z3$3)#P6wTI(M^gp8M5TaQ=mvMCHg4S&j1yw3{qo=Vd{)9${6D`m|&7ArkP=uIp%4y zjRm%I0*frMgPkmMBD>g)Gl3$S7-ESdo&@eBk%0_iFhdy1Fou&vGAX2zrow7VN_vy4 zyX7M)PNm3HU83?(`cu{U{~7BdG_W;Qvu5H%_8+tdm=pZFCbHZOpg+4kDYF>CzCN~P z&x$^O-$wbd*64=oe{{bIYr@^$c5u+c@(-6S;6_zC@H`z>9|eX;QIM8H+2d0O)#W@# zJ>do)>e|5WEkOg@m{%5ub`bGtJqBaPB{2mFN!@;)}zZZWId z8rCIE=C0Td)pe=Fb&Y+RdCF~)Nh#48U`-O+?F8$XM!E|$$FBwP{o{}f9Mp^^ka_FW zOl5gpx^B;Cg}d6tPPRR#=M8^4S>pd#`DXX#@UpZXCZ&JHE`2Cg;ZNCDki;k`y@*Q7 z!xU=vEUaXeoYRPuBVuL>e5tcMg`aJ*l+9L>vUnvi=aiINO{~v_D{&b+iOr~JnpAXp zg@n_IP#U4ENTCWOM}(71_>w$@m7oMOAyM3kTDc4)&bXq+?Zh6R!WJu6tTACJWFe~f zNG6=FSiPQt(NRiZn3zJ!s1Y$}O0TU>feT6$IyeQTTvDovB9sx)s)>1Zv$7)qO5=wq z)bc(BDKBzdo}+kGe%HRFJWP>*WfMv~7ItgL`MfKl#wjJDR}^bpdNv6g<&=^>WdhpRinNXu_|YGwkA9%NQ8lN5K-1?5kK> zwp0nX_Ze{2XJ;$6OL3d}&=g!zx6cN*_L<i+*r>;3xRR~ zFoCr^0X7081A|TkAO(kh2Zc%ug&!Mqqz9C3yBS1o8vrnR^?NB+6v4&;KoOobG7xMW zh=5sE^Z$QRQW<04seK#(QL_SuSSti7WmzFGTO>QJc59=8vRbn~ENw=MP^D>A5R!*6 zU`BX-4Va+ayt5r9Vyu`J7FTGU0oQGGNr&Zhwh830gfQ?Z{TSUOq$NC8bw_u5X|Ed_ zuz)O`_GMHMNUwQ*3!XGyZqivMhIi4CDZE7xt$v-3=Nv5r=aTnhvj?k0+-ZM@HX;kp z)a_|6`{QrS>B!wa-|=$~Z@FkPs4rd!eObTQ~2-<=YTH& z(8-1vQIjY^B?T2Q0|XUqB#fkIB~E){Y;7%ErJGwnDu$_z2)@gsBbv+r?~ zfvAXJVi7F{XrmbDLZ{2nMFjs!m+tPNz{v8*ccyoUs+*CKG!xmO_Xh|RAO*`b<)_P} zX;PIgQ$9p+nR5^F`eMymrP}FJD%Qpjf`|k|J3fzX_J3IyHe!koj3{miB9dg5>^pof zy5CtRT9j%E{2S9HKj~np>CkMUxq6IS7K!Zg7HN6#{QuhT_ZjYB+7eAPv$|9&RcG@E zk=4np4p~f^eoLnFhT5#EwD_#KoytqhUSet1)JNLVoj7R-5bz{GFo{B>LjqthxB8DX zty36Acb|z~zsX6|3A6ufE-Pxx8yG09r)`>q2WcaGrJt%Pn0VhCPnZyZc1^jw8z2~$fy&tM{d?`;xiB~Z{odJwXl&B6Ua2-t|Ncl zi+kk?youjyt5h#x@3AdI>6KZt7XuHVVaR(@k3kwd2n`%!IZM8by`d>(WdNO#NRTatqG36e7lQs)@s16CS;f;`WH)ZO4j2g)I&Hm1^5>(-^)-n~2j zrRrO|0LlO1m^x`}dT8gOOtEP^E;?7cZ{HHw1t2a#=^G#@Mh6B5P$4;qqJt>sa4A$N zRQQ<}L;G7-H`m=&c6ara)%Ep_s{@gmD%o7<#vLi_^xpN~z3x3=sRKG(NC=YKMNFS> zevJvPWvR&!kV(8{4G>%(-yZv|?_hDWOhj541Z!V?-8Rw@Fz)^KEOszc$n#^V`v?q! zToPg9+U&EFMEjkkz6C%*8*Xg%LSF;Cj%C#i2ig%n_<$$P@|_=YH&fz=UPw0ik>z%E zfEH_i*CcBc?SV(vDnQ@A0fnd|ujCR4Ir>3`g5R;rQFxrl@=la~V!p7Lp-#B@Y|af` zFFUsmYxTEc3Cze{xh`PM+OA?rP9$n|cCp_YR;%t+txBw9(1CKw+B^{liD9Ufa$CPW zB5!)2A^^vW?u~8Uc&c9Ja4rKD7@8#Hn-=0n6J+!k-(5yqFE-Q49u0?Pw4pIfa|z)0 zuu2riEDE`pcd=iiHf2%lM{T>9%d%#{Chr@J@#(=e z!(OkQxSY3K^!&v!5R{wcKk_|anPPHF!|!NFg*Ku-80=p%tS4A2(WOd3%Z*RC&A5wwX zf!Nf(*Xjg9wy+_484FqJwau&U{z>Z-?-+REYwItT)4uqZZ(mBJ=cRl)UVTf*UoS)n z>Z{ZGMg}k6;L`A}C*VIH787?i0HG@*S1tcMmwovK@IUvRr!T#G^UY-J>JMMOwKDh0 zm4(;Ou6%!0`K|psel(-|r!&QOKa;(F&52);7r&mj;@2xq|8{lm?*8K4?>zrOxc`&5 zX7-_6AAVEyd5wSRU!|4aR#CLOZ=U+9hm`b_>5z{e_jk&e+eiyC6=lV8#RP+s~z zm!~`fK+~)cG6ZF{<}QG1G%Llc`Xz-bf3DQD;ONviK&@}GjYCkZ11#}6tK)w&pgRrc z0&ycJnoY~9^jI8>_{{h(r}~(d2cL3aJFk$Pa!9_d0A&7WYz2iK*pX5ZA%)n=EY$HQ zQY;9>Zo0u`ojjGhxJ}PpT+*)H^T#icMT#aae^kcvb1a|Je9`&r80UuyK*y(8cHXzC zkmy2LCQ{vUr{?Fg^33}fF~!XPvBW?AJ$yVcw{66LP>_uC3#(1#Njk^do4nr*gHt;q{RFU&X44pM81-O6l#9 zMZ;ulWS6yAMI;YWvZy7i%kTTAF*Yu=Jh}*Tl#raNJl^0RjdE#nzuf7n3U!*P1FMn{ z|Fab@uW-+T9+w|m`AyVZQ-<$Q0ql%>E=xVG4vsHo%z zFTFp(UksT*{cc#X1UGP|H*}4$WXdL73mO^lnB$dY~PTX5n{}aAY+cBgE9eDr8u8}nMTLygzrCJB)?=>v7WJG z*|1xfHzf@RgX2(p?+Xu>Q45q%*{G)bBeO?bBHC0qL}BUM_70H2eZ{DR!~A8=2_3(F zMg(bi+IKPtJjc4^tf6CF)-pv)$@{XlNwfd1Y)&hQpqk?Br?up=PaB0R8&&JzKW(~S z2`LFxpN0yRNtAIW0fDR;&8mfLVQA{6*QM*uQ$*x@xu&^N#6!JcqCZr2@99rYwEl)pmiUj*eL{1##zDkRSg zlYcP(?Kyo304roQayaC2R!=6_F3Rx>wtZLHg~z9b`z?e+?0GSZs$PG>X{C{9*>Ygh zUkEZh!FKSP3kZ`G+i)Yt+zQ(GP5b&Z#8)agUTF5I^^)8k+|roWdXfx^XyYNaGL^S% zuo83-Y9Z&h;wCWDnQ=38wHVxNvcrb6GXiJF&Tf6mn=&02Dq;=ozZ7N?a+BRt_t0@k zhE+daR1w5g+PU}DeNz%u1GdBdJ2$vN*Pcj)r$lglx6(@=5zR<~BY0e`(>YX)@z=7` z3N;ce+j`yH8zlFh?N6LUaE7Fqr2dADv$$SWH=2!9esNr{dmg6|b=4VVuviVx1xn_- zQygjD+B^U^1lZtPP!wFrap5F9&#N9eMn4c+IE#88crDos@@D64qDspcUNG@`{SH<8h3j?{Wn)^w5b9~DP1hSP*ia~?3&IapcDd;Sx;F!Qq===8 zud-==HxYz|w4Dp=w%oQH7l?vJC-T6}Iz530r3AgmXuVsN;qX?GJIic(~kG0ay*)36sPHM)P+Fw26IwQk}-WE+afE zmA{&%XmKVGYF&BHgv29S-?W|%iW*9_s3;Y3U^a3Q=G|!nUpW+fqM5=E*(x`S6E29* z1~Q^Y5Sb)&SxXE!90W#z_Xa4f3V2YsD{E*o99~#E18DZ$3{ERB(Z|I4eZ?W0dyg@4?VZ%zL zbKZ}zdfoW};nWe{VhxA3n7nT~I4iMKQnsw%cmM~VFK zps4URALdK-aNhxr={qX8LwPIcUG;EsTDIvndp3N~P|17bRoA|tj!o2~Q8}leRGM0n z1YF6R6GZ%wxBR=_Z-11ToAYC3&1 zMx)T4G?EwKo10KO+6mw|&zk|PDp$G;x53!8#Sc7JHv5{)&F1sCE#bs@5 zIcG;V0EP>DiW-8S$0uOvlWIO>_^BomW69qir<38lZ!5rF-NUOcu{c=jeU^!NoiJ_~ zyN#Yr4}WfugPB`^w(LHXpyfo*Y08>{P+f}P0{~=j4&c<+%lCy$ibA}wonM6%x{kKz zPPu!Sh<^4DQ&=npMBh&kB;R1*bw4xZ~hQo*Cu)r!ILZw&V^hQ zMY6LepXMSd%Djph{2}99OF?h={rE_u!f{U79d$?lpb@_`5{|%)MR_CQ)1pB)OR4j~Ul>JTS>?OIE?4MX~ z`qy|3MH03G;}S0Omj;ZX63*~fMj2v6^nvTtfI77Ff|nv%Rs4Hu{>;6gnjqN+UrSz< z?{JX5NiHJcXOJqE%i3Es8_oM)8;>A8CkL8u{1OCRfZH#=t!TsCIR=PLVXV+TET?3P z4eJUw`GOYl5+Z=+V3Mic1R#uq(O@P-|8JhE2kR8CiO}PkiAj({cJ+PuS@;6zWD+;mj&MHLag^u9N*uVMo+PThfyzg}!KgbKZCU+)nlA%oo)A z-qN#w<}6+K&T?whObp&GiJ71JYw`qUknb!%U4u@XwI-mBr zO{HA$iRNm$te5ZYYNk<2u?v@4HMlE`0--c;T;x3G^A=+YK>&gYP8dNYXvd$`p9mMq z^XjP}L*TS!Mw!MEsoQj!9XO7cvs-4y07=@Z3qnwT;MO()%#&1aXeN;YLaQ;e@2yL^i=GbUnLkZq>8pS@HHL$F zvWSu_5zzK_NK+waglJzWBta1FG$DWL`k+D(E^0s+N=}HEl~&53X7H2UV2qRhgU(Rs z6)aS0%R217971Es92_KFHn$OQ6{2<@h9-fw|LB@Sl*gkOXFMVQuOkHm9C8U3W?Bs) zpb7{%5jcOqq6TW6mz&%D`d|YzDi1^e0l59G^CohC*XKG&N#F6V~_b zeKQ2%+(-&25tA~R9LClSxF1aQdX*et6c!uA=a>pP1$;0LEni>*r#=Xvh7Qb$++8j4 zSl=jKwhyYCo7r=z%>@VeSWR7w`zRhn3ksW73y<1YrGqMXcwT%=uTN^UQ&rb z6u1;|5N1S^aW%axROG!^(U7I-C(~6XF7{9gIF~)g`kITG2@7InpZH*>L%}u!+v`5k z0RVa7(ai84K@@{{wt%r-0te?dkq%fR-QsbKfkWaPG6WQnly;t;TZh#R&?o{?s!wz~ zipBS$g2g!MiYcNn%4kiH3ZAr8m+Y{0!@pN&@#8ERi@wNpwCrE5!6Q|8ko5@c2GA#^TN@OZiLZ4StEc6z` z7>afsR5%<&vX5!2QT6yPF5)Vb8i*wQA}T4NzMRRE?`b z3_>P+)$y0g3`RdlB>{j~rBrz`khRq6+&QpG%DD<;t1SH@Ct)*AjsR6KFo zwyeq&aXQ=Vxi;LyphKdjc`35(1;BKV z^r9c<1lex1mo^2tDn?ePw{hk#Id;MHG&&fvY*FClI=0;V{Pcv!#b69TVlQdzzcvFP zllo#kxGfy0v{w3D!I!RI?RtlV~{71uWg$Q0vZ3`Mou%lEbi6vt!EGXRs?|C z-+}lxTPCKI=jMCRK0PgmGZG<=rhw`Ls0&TobYIefG;ZN=Jp-p$)_RgxS{(5wlE3RC zwXqGVFO1?F>auD9ZExk-%vU=7j2vMsXG~;FGJebuIDzIRJg0ULeChR4pcQ{(Ewf?l z$=O`ucVDrIkC*2so-XAOeII;tC(^jJv81F`8fAQUC(@{;na@xEXN@p2xj$+c4%kG| z{P#?*R+_+V^JxV_uCz6_7Z#~zVzrqy3Qjr^h}phdguiZMq2Tqdpg&jIb;Y&mMiBLTvU<7GBB8z1DG>vv;q& zt3XGRjNpE_#AqIyTa?Ksm6=L1sTKxzYKrGqq8v^_rN`~N?+c-*Aah6Q?fR|w;@*-( zf}|lm&WYuwDWJ8wX(bGDFo)cW z3|wV|3?rY5Pls6+hh`1mrV?9xnDv)(a<8?Y=DoTv=qS{YB%|2xzokpZ=N9B0ld5bL ziC7D7#peZHCE9_dyC1W3e-?7>QV&FWNs~Q&hh$3v(ObJMi9n=a?heRMx;kiPK6Z^3 z-B?XeGBHRoDB~$zoTi%dAKCrC8;l{WuPSOQYv+ru{!;?+*&68cGl% za$`T{b=x_f(I?8;^jR>;S`}}&?^(nwyUs8Z}DHoWPAPu`lP zW?A_w{`)_joqmFT{*#cE5#kpgmq_Fb-&MWzV7Wvqi6=LGb9MhIWyj91l^Ol19?0mh z99pN@kk$d#1o$m!=`;s$%W88o&35*Ph6X}E{IMDNpEv{e5SDvz9t$9xGj5fdmL#2) zVffjO(e=KzaL&`e2#FR5!(h`-ZlEe{C9Is>(rtuyt{CZu94eEwV*3Y`+JEdO*Y)f( z*Z(4Cb>}Xh-=0q+(C*=!5lYSXL<$O00yZ-5gJmZ(jsp(y1j`0Q1H&K62ACc!9 znmA^yf)2jA$BNK4)xE+FFP$>DNs(-uI@Eq4oYlxxobMF=mufi;vcA*hNzeT`zWdn7 zF&*o+fd;NFf5qUhbd*whn^FiiGTHU4G@o=$(S?fVzF+9h$UD_b)%MY*Qju`=^OOOK z(wP1nemWL&{CPlm@#(O*;y64kvzsjTVuCy3QZjtRw6b#TBSuTvb$7C3fIJSo=+0&f zgAf_0*yyazxH31PmoAs3v1^$Dh}1h8nC6x_X<~J$uja=`(rs)D{cYZ+yRf~p-8h{} zp64%{5NNC5r>ir2v?XB177m;Inz_#o^ zfldYL-e?ue#4Dfuxqb0+A-Wj7ymihtVpsBN?KrUU~sz~CR%?vz_PsyQ85^q)qie9Xp|@0LaKs z5rQ^m#D%US_gh}B_H@5}@I>BkzAR`;C`}E$i<3(OkEsOFS z*N#7IeY@6k`m5WwG<#4emDzryI`54-=T~(7{LWPF5R~SqAUlqp;0%5xZ1{7SVVk41Uw1pN;{da<&>vs&(kIL|$+`(Bm zlYkA~6}4>DdBd!sc`1mIje&>5`IgixF-4wXiHJls^JvBafk42ouB;O9s_Lq^)dEjo zg2h9Z1H|f4o7_053tqBFVJx)Y8o%07)6`HUV@ByjkwARqK|m@NtHn}#T*pI#CtTg7 z!66b8x3B&2M(3Np{L7_A!Ds$yypwsVQ;Y}vPYaQ_GoAx;Alkyk>&BJGHqWdo?`}u2{=dw?5!Zq^sS60b z->C`pSS-IlC@)?mNaWbZP0N-4oR$n|-brizS;6Wgs111@pQp$}ZAiqZEApJunZfra z?vBj6Kig0jIsc9{w9>_%tk`c2o%D-*o09;!tOYot|6?*);uG1%Yo(u>-zNsQMOir*GXa0mx;arIfZM zL@(?UL7sHI)b*;r+SyURfx1~RPhbwOSoCONdiLl6bHmLTkUoQeD@ zJlsD7RvVh_lnqrAi9A~qzANq6RKuNYQ(t;V1XbS9+E40_hJBm)pHKvo=CHHu5fUu6 z*{bJ=bwO;S6G5~3pgzuYe~UCN5Q3cKKZKyAp8ak{w`Z)1@D)F_3H! zt6J}&|EN9nlPaD4lP{r}nd&ZLwl~H=Bc*I)d@4Ef93va-*mz z$nm&`9XxcikN{&DoHLvLnjV~+>Kz%G>K&YyKn>1M^(D-=p8l6Xzpko+K3(;|4apIP zWZPB|{$I$WYb}M}f6JiZBO{VXWSgm9qWv7AT_b1&M!s@DR1)e+!=8Eub4Dh{6^@tk zN`?xH3Dk^e2l9y&4z*;mS!@<sz#6}{KgvgK(3dYMf=-1W!pifu3Lh&NoyOjuV z%gLz1Y#N~@2L1KbWp~Nz(kYC*M|wmfdpAWet@44rNu-*@K0)wK#o+DWx=TuiW3*W6 z9gZW7Ma;LC!w*T*! z2JGqi zi-5i*oi_4o%)U_FaBR_a2s>x`$GcR}3n8}!8XW)0X-T9)Mph8s`12L;q=SJ!HTBOC zK7(xuF*dPGc+lPVq$#aA3|)kG%O#XgKpRW|vO*-=0^U31&>sM`VPy$H4)lHTc2E7) z*udcDZ(gduoe(f-<1^FyexNDEaQN><(GhSMt5 zonm%Oa|@2eQc!7g;vA<7sj?}GeB`g9$@^* z4Fvh47>d+{A8=1Yw9U>yJH}0 z=n9h)Jkg=q;g!u;{QT2l_TA4J0=K)fU>UHnrfIDlPyyLd2XS`;dNymqGVgod;{)oA zsg5{j!Te2Pjc_ZzsFw)!=QG{ZP_~9rlHCErmBr)m#jW&|j^O6uWpOd6(smg48SZ#F z9+{8NS8{5~)ZBamF1IGe3hu8GyQjxLNk0FGTh~K*GR!tVG{yW7{{scYt|*HxA45CG!K zT*MDZC**q2dP7QRAdnuLmZ0%WyNt(fm>TJ|gp`P}-;5bJnAx&DY6k?dSG!l9d)?yVWHu=nU0l+Fp z@|Y=(%UVeYGklVX(k~I~f)Glq7j9MnT;Kh)y(d_D%3LFr+#z4RT!J~{wS%!WqSEWQ zEo6cTnAyWtl?Hqz0^4m({22|~us1;|tiU6 zCL^)K;1?AIR2L^br|SvHmh##beUlP|P^YmRzAlxp+gn5Pnb?yoX8#ft7Pe~=PN&6b zIEcvD;xRLlBJHN@Qt(}Z0HIhUPO(W_P|6gPCGuc}h`zKWHXAc7OE6|;pmPgCo_8Ly zyjE(}K(2L8aFZhjbNZx&>sTpZAuFTvlBNX2af&I0scE zzf)}7@iCF$455}!&RUd-<_B{-y;<7*p5^!NpPs_dwjY<@`V9nlyls!@-yjaury3xK zUT4b6Qke}VFQc09jHRppP*YWd;XEM>PvtVrJ3b%INUoiWI%{ssOibvdpqzgJ@0H797AdH6OdDg`#_sTW?|FelC=o}+Ktco?wTx;9$`huDs-l4fT=}e>w^8+L_nlgr;Ut9IAyRjWvciH5(7_ z`DE-UbTMQLWHg{N{CfJxuW{eQLC2qAw|x`h2en*GCc{v#v2JdT{w zx|n9?x9puwZyf2@DozDL!pPgTjT}|#aX@06IY`(+d3eW-QHml&4na6>`(pM>{A4`t zd%}5X4|q!7C0Y84A;b^Feb``wJsv84#TMB=aW*Jf@zTN}@#Zk?>Y06hQ#fu8!Xxf> z|0$|^z3#d~9i}uDllOZ)_8$!MgQ>sn#%<%&&7HHeCZqZ} z>&3Zot9Dz({yB%$P_Dvx{oTjz_WLpVNA#cLU)%39f@}L5{Kt&P4mkAa`hiCu-#=*W z(``>*Jj7}FbmZ+rRdc_HHsPO&$r67*!cYG1$dc{5arch;V*<4Pg9(o%JeJ7PzfPPy zHt!smeI!kG<@`xu?tKemCsXdHP6_hQoVsVZKJ#lcADuaJ>M(!x^qdy-#60ab(H7YT ztF}}2^6)9~L&N{ixqH;m^@_3BvC8qJl1Y#cW`ljD)KY1wxzt};ENw5?oippK6K23% zHT!Ki0KfoXaw@b%4Cb~fWd!Z0}W+q=*Ezp~hm z?fGt725Aug@tezU9Ec+lCQbb=>tT5a3Bpi6e#fH?H8__T-RSwAF&woVjTKLVjvp`L zsFkk^q;Oo@nqr~2iKvbK5cNX^PS?%x@9ZqSl+c>TX>ePL=P>=V+}QWZc;is^Ajjp< zM1sw)Ie0d>@^Q^xb+r>rN)aLE2W{tflU9qi^LuS6q02h~9oUN73GSNj`XS(k8cJhp zP#59$cBKPCXU1qRY=_3=HVBHrf(wezGBnL-Sfh{bQZN$jPbjZQ(X_0e>TuA67EHX= z(dcc!iE$jR`4_>fD}_Y290oJrstqwoK|yf{N(e27NLQ~cA$b=i;T;X_I0}W9N`)kc zF6a`q`moKVO0Dp>gUhPt(a0?#qh}M6y$AGBDCaLg62ulHgeVtM&A2JS{N}+L015+TTe|G>yT+IUUi)zC!Gzck@i))A8@P<&0p`?_?(UGlCT*zjbh$*^wN)rrsM0$8pPi?6FDSSY@dj%zNlD~# zD5j?DCM-?UYX3cxf#O4VU6Ri4k-m7KAPOUVZFGIKP@!Z9*#5n~AQ#e5(07n_&sFy- zqYXJcSZPxBbX=xMy!!X+@-V*TD)VV;l^D7g%vhWHU00xcYhn2biMV;Eswkqz_brTZ z))&!FXYbCCk9tQfX-h|hxK~RpIz*wTd^dCtRm3RkI454%g;bb=xR?l`P>4*== z#ehdI^7}dJ%wfHfoEZU=Uy?kK6Axi-J&1L(19JYAwhtK%(ed1FCIFpR=NKGA12Ag4 z4xx##dh5G@AgBhj&CU_F3G!oggaWOBrJ^93j;yijU@R7IrHPi+##77kq|)Oe9T=>r zM$c7mcY|`ruEW+WtS9WSlX%B#U+$_Q335o2RtGTZX^u$|L_K3RrZEl5>89~JYxaRX zb!`29`u@yyHo-!Gs^c03u{3b2kxJdw^6{=^6AsC4;&f52-R#VZsrT@1w?NazJs>E; zaYN{{HyY>PG~%^2jxtp#ZFT=91fq#MqTj8*H}l`gL4Ihr!C(qHZJ&N4uL^NydZ*9! z?z4XP$cceA{6r8NDd53stLQKk!1h3d;UKypuH8(IE_BcOH^w&}GYZaG?@Qy&mk6Da zRBpPt_y0Saj+QGC52QOm$L_MR91A!}lpfHHo8aEli`8JxZ$B@xAu`)_twys3v$QKX zHCENd7e{C5stkO|~blEV3hBliAJ{3e@+c;d&wzUt$@lO{m2zcwEJI$&T zYb0H=V#IM(UEG)MS>E{~)Oi!!lx{C_Wv&$k>Qv?)BtfD=ss%#RN1CerkNT|O2@@~Rv4k=g|VcZ!CoR+tEVjr4p4Cz>cpQcxEh&R$G;}mJ44M$M|_(fo$7jz07 zWt7hNoS2-Vb9w$G4*h+z^4k6S%@?Pb!7Y}bbvc+3L#kS}G;Q>g#FBan$>)c_DhcDS z_a5d>;g=4>_-t{r?l<6i)D}15Cz~XS_`gUAsc@tN+7b*G@gjcHF9(OoxFnq~3Z|1V z-GHEyRm_EH)TDt2@K&k&2_Hx5&?-K@gCTM5sO#~!M*vANS7w?9(Fj(}P|$ghD#u92 zBSVkofWW%5DR_4-!Zc1b^3@3pEcw7}0qU1g+jkDrmY^ zK&Y$2K2mZKlm4_Q-Os+6E5GxIW?V)2xEQu61@9+sCZ$GRzBk&2(XI(De5JtQo)#4X=s&Z>wP?hzN0I*?jAj933^(0bS}Rp?c0<17s-uBO+VbzH5|BP zS8&{308Lvkq-)yYa3U2TR2b<+s4^r-IS!9y5Ve3%;;4@|N<}^>(RO44AfsqeYTp+2 z;VR#8EvyWVtL`O9t13OAs&`pRn534VhO;zeSzuWKFBR7skllU)BWRwGnhg*n3h=F4 z5J&QhA6K}hp0iy_Q_;6Hs1WsQPYQ9v6lxH(B&bfOZp=`jeXh{&9a?Q;OIwe#uNKlX z+POp9qM^tvL9lRny)qkFS>HVb6HG&S=v%$H_VGa)ZtPY2r{8%X-K<6q%Vm%R+4ra- z>&0AL7tf$)C}irMe?QUQ*41Z7fz?_KMdf;v68^O2{OO1FtuGd&SGQQRznuUtSbPZbD(R(D59-L@&a0v_6rTn)Pe}~;TZ8dqy>cp< z3Rwjbo=)ORVm%E#f@^&~L1dRKzTM$=*tm_@{T+v;*pCONMMhPeE{S6pU7=0bHa7Ej zKe{@ui#NvY_T`aP6Ac_v%$p+$EG29fU2yL=4ZjH=`h41O{*R=39oFfr&mKE6(1z^D zou8*TjVa-w$Nrsp^ON|6lP|=TZ@d+;KUfb^kj7@Jx}mtzHEo@SN8!rzd(_78pGkUB z;_`WjIda+72*p4#nf&~9pG}l7ddZO+@CN?4cK2dGA33WP-lJi9gmoil-jO3g4vO&` zqa+m+*Uso#CM8;P>iNhcSy3_i0jO3Br!DhSsrMUP1U2l#b&3lO%gL1t3|9RiS`^yo zLK(7EOf<+R?!3go6$QCmh*snDXcjs*flxw5kP;EaXAK{2)7G&&OSLKu*+t{8Tc*bi zZyL#lj@hgkBPM}mboEh=2O*IA+2Y!+GsDHcN^ZJMf(leY2^cnwP{VX;x}051qhnW} zV&Sq|u2A!(_b#{VaOmQ4q}s0JG?HLJd|=pMHWcYLq?p>h{p-)MaEb_i#sXJULXPU1 zONz`-FS-J@@sa`1`wn?p#`lpzm7Y-?S48p{nphB$No|q_S4R%R4O|Z%y)IqszwIkf zG|y8S7)40E#D7lH_9S>gKDhn}NQOCV>EzpL*taXI>Ku=UCb<#naNh4}9hutfdB1pR zHIVDBe4NzOf-s0;YP11^Ol$k+?c;`QAsu`tU|>XJCpp1nKy=%RuCtBZjbYWpb2pCv zH(*?MFJvQj5C7tlfBg<*|5D_D;MBULM;h|y-$`QcP5?dXJ1rv&Li0HwdbzQ`QHf)@ zw~q$Mb@TL{-@YIQu7GhzI3&U*BZuL-N}26eNt zMhh4^X#&owLo^gPueLlGdr#B_j9!!#JQT}h6b8kobA(_TKELx-tvV#z;hk$%*L0ca z=XOC+zntUsH+=Bu6RR3dsJonRD2fGo{oh z(x{&`NEDY?T#MF+zKg8q-V1|@`0Hly?x5uxvGn(uzaKfm{~x44a8Aab|Ngu1^K9`F z7!)jnK=Mr6=QGfjm%l1s0(AqtA^;bLCUuwQlt?mG2N8hDWJOjHAnZ|S{caz7)#ry%VnZ}TU>Cq#-^9lg5w2ZdEcU{TzoPZQ5dly6FX}G`I1e7vhcR zrLI8ffTVeI4t$es%Q|>zw?K{RPJI!_LTTZbVk_`l2sZZdPVg1@T9CgNZoPO#Vj8Z8 z3|4T3YI}@eXt7Y{8O4u}2?zY#c_Vu0*lrSd28Cs_#jO;I*xY)cL^v#PeKQmd#L!PpQ5 zRB>LB5;{hx8#tf!Sl%Y21!sOR1kx-^pP;LUowH8+p;|Is$qUh0NJw(!H8ZY7r}v5q zs~Wt}Nbq41I~G{I;m_b0D!;mZ&u?Y*nf?Xz3`kTdLr=0YB>vnJSg9_NlH_dv_~mgX zmEO0}=Gh7bv-zmC4*n7%56jYRk|INX$OOK&Qp-fA{QYT0s~>}6Y8nQNs!C!M9n`4m zK7rAK#5iE4x~NwqMULJflQACY7)J=u{ys8?JzblZo)i_+YZL-dVIMzq!r8A)5k-Zd|20!_u`-p7A zbcZ;`J6n7}USpXWFCjuJ6|Jm!L(y^usRFMHnN}2ntxFNZ>~wmRu%oU&U5{<&SjGjb z!;zNOv&~~3Osqud30T#m+^UNVnpZ5dKcikri169HYMQm&7GoljueZzOM2=A3eeSQj z?ptA$E`UwF%59F=`oL&WEZlCVd{du5j^0Tw`ga}%a5WzJbrMgCOlG(4;bNWn@?(w7 zu9=-40>N;y=ud!3qC5EMt;+W5uPB9K9zQ#TNHVkx{mr^yI={q^o}Pk=vP>M~}h&Mdm<#F1Y&J`;KJ#d8+R?b8nroq5=Sd$6vL z-E4(jya<>K-I5TwER`~cSqPIx3z{ZoK?~3E(K(SY8fA!**#ZwmC)0{XL5gqqax_7; z$fGF2sznO5+Gv*hNL6cF2?vr~sGClQ^_Swf4TVex<@t==H1tW7>n?S%XK5S~ z`-=kaw4imtU?^!@zzk*_Uz%}`y(F@af#v(Hqr7GsuDWwoadlhP`1s^z0ebz=dMl#} zvf2~EdWdFPmxfW;TWrU^v%C{Fp*mT%C?TJ?J>GU-Ug}fij`2AqJcPxm`gP;c*-R&C z%B36)I@EQV4ik9WhS2o#V6yOkEC)i7A3WT%UAJ;R3k*lw(~?z`d9@(*oIFaq1pQca ztQShidLJv;|Af@x^8p>WBSgkh3hpd0k&8K`qS#xGstH5Dp~=~&gne=z-BSRoA2sBd zp>8sFRLQT+TxM?;&LalAHhL31cu*ah9DPCL%d60WwU9zvmsJ!&Q$xsLpGljkqSzfR zaloJ#qqXRv!v5fi|6@V^95{x00=TAx^`T-zOIJ&cN-hE4_8=$T0VMLHrb-pF$z0ld z6MU-#e9!|pAG0}Z^+EV`LIT{4X8{=;`(uqtIdc;6T0RU&0!p6dI9J(6i}vSZE^61Nix$*MP%tnWQVSEY&2eRPuiz2U4-W<&Oe^Q#)VeXFLzTnYHC2RX-!7i99;WHJ%*1rrr0 zzP}*zQ;E37(Lm$Rg@8x&iDEG9n+5MEe%3WC*vPP+eB{)taWmquzMosT5~6%B zQ4)iNLhv_Zj|0F^KR$HSb5etJ8T#x zAyesW_(n#gpZ84UMNve!Z|G#PT(eOtBmf64i_1qDc_Q{6|1&7-`0$TUR)O<82jVBngOq$w)4z+r z(c}oJHUhmg3chN1?sb&XpAB=r9K&;Vbp*fEY(R0wq4|3 zE+F+XIJo@R$~`X_G!mR!a94rWL+v}_$D2O?cx+Q~)HdgWp9iB*3zP$sEC8!<4?N7v zp!J`l3Pp4=(njGbs}XUVo1~n0zS?WT`3KQ|p;2X8Wq~VVvt<_Dbu>-s`|-23DXV(h z^-4y3O{wSUY;flpMeZB*R9E>3@vPBjtgLxe5}#Jk4O-a&OcY_+!zQCqO`|oJg<4u#$@^pZO)5&0 zeB$epdPGN&hEg4k_TLn4Sb|INl;iQIDU(UA?UM~|1zE!LiFARTk|#qv39r<4E~Ay; zbt&Ez65iYt21Kc3OHWaY$1}_ig($d;&m!!rk7h&lSr_Cp`JxcFQY&zdaN_);mHgBA zLixbp%yUn^`Kk0VFdtGpig9tAgCvU4)geV^hQ>1g7p{?5z}#|>WqRY;_voi-!*Z+U zC#6E}bSNCP$rcBil6UuX4uy4*}w#zy_z{Nl10yZ$mSt6%Dax6?{h5K^K?= z59V@y5_Ab;nzEq|fzXm4IvS2oYha*@}r@RLjh{n(FNJrBFq z!i?Gk>!JvPs`oOtpPgbD%iMw;F2kz{TWHbyyu~Cgt)5W1T-6zMUkFwQo<8ZefOVc` z+oXU%v!0SIvxvjV^{$S#26993>Zc8j?E}Z%P9)*hk^QYD4$Oy;r}pd+%|3H5XfvJp?Jk7QYL^9n+MgphoS$x$+oWp2M>^&{fr6i*p7p~>(O8= zq$aU8Zs~#~DY~b(HKNv8v$B;qk+Z45bp^9!61LjtIE*fnkJPYJnf1i&-RM*G1cL=% zJ&hDwmMXV8)+I4l6}t}eycMiKjQ<3B?obuk|@^EB*71X zXCQ(w#CRsL$&)b|brJQg(V6yl>iZk#*-qPSiTy3JBX-K7sG&;LcaqA142vP- zyXj5pJ#Rpfx#?$Z)1Y`<3Fj?ANNV^7egpsLwcLtGakpi=+;6K45*I_?w{09>9YK&p z$1ns`D&Zu7A)?Z4OruPyLdHk4LfCa{FvDjpKB*_bm~ivr02*{tLsFBahvxD^hcVS9 zw^e0WuKRkLNTRV?*Y*cs;*xVBVzNWp^n8_2l=(@7v6yu*A3&QG*(#R}h39fzQb{j{ znta)4xjg7$kXFy#3+C3q+?U5BkM)D4K(PduGfx z1)2U7cvp&~_}IH7YOppFX*TwlPp`Qu-a+iv7t5E`_}X`G+{vwy1|+2eXZp>s;Obc$ z8C0worLHpIXDK1KsoHDWTs|hcSa1?U$WPQ$uJe>r*CGQWq%3up@bRwL$F_EV+<{cc zNRnbNqqo6`;GVph&<`y;k7HLaREVpA2qJCxtS$TFe@dP19a9tS^#@+D@woSnBspiq z0jSdPTB(=0FW>shUrw55-$?!Opn_(AnUE)}@X$}*C74tWYV|lCTCjx6ef0JaE93;I z2)5~XmXEV;?_@51tAg=Tw5OPsb1NY`BDTRau+3yWnX*s2Zad4vX0eZ}RrW6v>r(?$ zq30X}V7qke-a;v;bVi9M<0R0`iNn2`i9|aPx25fw%CuCaG7NpjAB`;2$?qLIwyQ;> z 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 diff --git a/src/DjangoBlog/blog/static/blog/fonts/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTVOmu1aB.woff2 b/src/DjangoBlog/blog/static/blog/fonts/memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTVOmu1aB.woff2 deleted file mode 100644 index a804b105cb20cf3a3e9499252aac27b893f4422a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 51912 zcmV($K;yr6Pew8T0RR910LsV!7XSbN0a54x0Lo1O0RR9100000000000000000000 z0000Qg=QO`N*snHKS)+VQi)9lU_Vn-K~#YxCmsNUEGrWTfqV&{6fag05DI~~NP(RZ z3xpy7FoNU^0X7081BgHbAO(kh2aOaAg&$jgKygCUv2F)2s%}Fd_`OrjT`T-#y3I#! z2SGup%^7ev+>WFkP;=ny|NqZTDl%r%Y0_>00|3;k-lx%}Nfv>UEUPTrAPbOStkRTo zT9fJ&)oP!H%%yp`&?v8m$5}-eKi=@=jJx|bcD~?9=P@WeIww)KnT*~J=iXt5k8=Q> z%ij6`9ePhWtM&EUh*2U~%jUG%`z#*6 z?Y(aB->>?>EWYUS9=hMGy^J7dgI_@w(_00&^NUH!IDej>+n;;idn?9(Il@s-7(GW? zF!>`z91%UDHjJXuNWNkaR^mr65UasT;)k95!9!VltCyLQ>bJc>#7*Ovy)xVYcmTjX z8v#hAA)H!`EtAL=l4Z$~j1aU#(5B@q&;d~$b@u@1iC_V{1lFk{m*yovD$%?C_DpK@ZiOzIDh7f2qjg;Tn`5hwK z_mbgp&i{f9FmGg4J4Zok6hbliW=T{Cs=fcep4mO|zVmYs z<_kww28pobotK0nMB#9b@)(1^KYeHYpHph315RhS5Yy=-m-;n-Rn=KJGiwZ)(G~p2 zt4lwvfFIzNj$gqt-p6ABr{o8Z7OHSkq>L`+=O3P9`1h^K%5Z2q0}4utw9X&R_%C(k zt_*mI1L*vWeiSJHqT-CTdf3C^x1qSDVY+#j4z*+M?auhFEm=o&RTdc4l^o-31_R02l!32@o$VAn^_$FMy;2c#+PO973pE z0-!FWP`jy4u0m0_ZtYjoSE_w)H0!g*qd$`E)DDAq7>Mtr-&XnSerXj2&sexd5J)GVQ|@~jhfHtIKKL(=22~& z-p;8Sfskne$EgA#5Qcl){`j-kK_9$qHuIK%Dwd@=i3kaTP(JT(*zEH{(V0!J{LAgV z+UBp>8Y4zTashb|#A6v-Ioe208yF>@$C%n6ESgk7{Sz2tzs92au^>u*QD$h+>uyZ%Y{bPwFOu-k?P z?3j>ukf}TP><3upLu-%6$A$3Fne`YR@f79#>|fk7KiV@y!mf_au94BMC4Sc~Yu6!m z*B!Cz6}syi{sQjt(n$H`Bs4MVOE(fue(6Dc4YYpkhj}TW#OB4ioM!eCs24X9ay{XyBW|7_wsvvz=*2tleS1sy?cLSO zTlvekRIiK%cemPCb}3i(K=a6?ZFFU0?fNvFyYldX)Aj1LjVKWM`UpDQRshyy|qhO-)3*Lq}-}+Z1pyFs~dOJH(O=%j=3)nHn$^a;&qGRstAnK zvpd!Bh6pret!J;X*KwYYzB%|lgkb;a838>cU~B>Z#$nQI-1`ROt6=>YwAH|7>ujkz z+LsvD7K~E=*`<#(0U?fXN;_=*Y1svr0YuL+RV31++02~hk<)P|+`6BT&8hKA|8!?;e@n zf?khaZXlm_LJfs8rKHp;!t~T70$$HH34mAL8nM1Oq_bNXX#Ou3-~Hs(RE{Go=)#|t z+TOl!B4U~JB5)i46#_SO^Q-ZMoHVkQ!vGI4(g6rSw>wM`CGlpb9WLkb(U7Dlrv!f? zkUI$znPhcrfw5S20_QrO8d%v9q#o?G;53L$bYz+Rs9oTlhsfm@M1aUfh=)f+Ep%F>6DT)?)!1~72& z|CIdnTm*2=AutVE>$TP+*2LV`b8pW*J+}tE3Y|lxU3M<7erff?tN+3L#C*kk%Dl_$ zc=PQypMG-L>s||WPWM=yWCmMEnUmjWzAB$6fB8L z;NreW7SSSHIE-Iwug37WF;0zxqh&OX1tVv~4*ww=wnM0&j6?m3UiC-)N}<^|$@!2{pCwrOF`^j!o#mW>yP6WyCH{MF07hg(n76n@Gg~I* zN)3qHOI0eK%mWbOSs{pBjD|fQKv!9kkRbP9e>&c+#k*mP1nEWIUS?~U^C^*Z(9bty z;)ZMW5C)#@dP0lw;$%_ec6{2+!aV?r3U(7Y>!&97m$_QqBK z?rvat*nFdwBvL4e-Agx{2AL`GMKlaCrtIZvsdR&LI^M3uNiZx7CpB3bHeLghNGX&# zM#3{oZ)6TVHqu)(9t-;3E{Q}+6aPG{06EvZpx8|EtfI`oys(VIDHL4@Vt3HH$y8Bw zC>`zv(P#k1Rq2yx0>t2N`KE6(X(vck_iny{WWox zg!Gi!8MlCtUI~dnO0N z*`vW??{u8>%(43_l&S_Ha=d)H<7Mch$jbhg(#?ib@&x!yjjVcNi`*(z(u<&#zU z*{xgB(|u6jfcm>W*yLc8b5W`zhSJvOFzD=L0a&gk9pZ;gr@6N3&?@g}MamIunsUdHS^gi+sAs zr$?#(AP6nODgzsYooibPyj-198kWf|K$t5)cYV$ReZy>bR;A9gDs@_brS1c!>Us)v z9$Y^yll3|9$C)v~v$+h`N*XwgAzV5EQ=E8tRRVgsmWwFV7U<+mB?Q(XJj$U861p4k zZhl?24RqF8LI%~f8CaNVtHTs#b-qV*onPQv*A&dH%bj(q!*oqOYTnBTOT0M6Qa!;M z9cHBdgt9I!>$M7nb*^B%t{`7)#PkV9jj0eQq>D+%QI^v&A=QJkFi-6J#9IcCKuo?S zPI5#3ZhkK3zF=7)jf~Lz#08Z*pnMD<`ZAfKw}cR#PRbn2%AkNOnBgSH3`Thb#l*8O zXvLRk-r_ADD?5H$fO+?aIR!-Dll0yN@B1GUUMP96hY&qjQ~EO>Li*2qgr?%xZMxZ+ z!obAFp@ADYcY(yRpLJ8#P01PwVz-94HTb4*wB|FPS#6+spIvg}<~Lvcte4cQD1A;V zrK99U#e50{FRJSmC>A}bFX>iWh<}-j5&0_U;1@8hi7YouWr-|Fd77w9vqQ=#W9?~# zJkrt%|ByN=Y+?8U!+o?)BWjDJk7e*Lj(W21rC2gyfDd^=q9EseBzLZ#p6L=I339Pf za>r0a@)l!?Vf^-U9{^(8m$(zu+-Is*TaNLaiSS(sw1)VMr=DS)8s+#|&Y2(K7e$+P zmMv*My)plIfh$QpDBV7ek+K%XLt2(DyRP5dzphfJNt@_+KV@nGbZR0XxhdjN5K34; z>3U#X_V?1if7A0eiTXj3JYi)756w!oO=%wI=(@X0$ zh#*UDaGf5?eJ+f|A2>D{z_k`K01bc^_$&Wurl^`FG7Sm~k3`Mzv?Z5Gz6u6(>(TV_ z$%rX81|XU+kJSVnI(C3p5COd0hL-4aDtl%lgt79ez%>o-7aN_*XrBLvQ^kz7k;ynT zdOO?I2XWNdT5>=UbRlQom0%LNgJbKxY-$fY=AQ7c$e)F3ONG0^rmp5qPuCh8()|ro z=?7Cyzd35f#*zQWQtf?d1i60%raS?vJva$|pd>0=Z8{Cg?K!)3@A%WZ&d&#EU(i1Q z%?|z+I)Z%9R9~N3_lciAAzyvNrmueP)c5At{=L7vJtD^XBXaZ}QR2o?DLRfXwDyE# zOHasg=)_VhPs+3ULD&AqYB@Pc0rom^zuso}PrmZIW}iKsd=*0D2_HJ_d4(xC$N zKNy4+KNh3mCs~?*li=8INeI>P8+`OOS?A9mzv%yr-@9CPlB>I4gMMSSrv+mN{kDg> zZtHrJopUod?KULyHZ$=yEApOu+&z5$wvp<#rNcHiZwG?karM~o;_aX^A9{E_q-Q=d zi+qgcKCy;9f%@*=e7<{RY6OJab!6^3CGJAM6wiQNtnj6omaFFV5)65Xw149r10VhW zncL4t0$Y1B7q36`{LW82fBl{p_q4C9cdmT!?R#T?2n+Pa|LWtITAkd=uNqw4d+zj_ zeIM*;T)*_4AM8E&nKkIZM!H1UNuzWw6VbsY_EkK8gZDD=S_kR2j8 zngZ-RnfPyIRs1#gv6p~U^0&(WvYplm`09G|BH1`Ky{l&5vRwzzGIR0!3p?d1kDsy} zoCWkAkY+qo;|-@GSe#V7^#5a(td%qY^bz3X{d%`_-4sWe7Ht=n2Ox%D`>amEfB@z` zx6m;Fpx|W#2BWZ8o@BwiO(jOt=AbDY#sDa!zq)fF=$HEp+ak8B2yD1fZ!@n;rJ*bl-P^ zAXo&ytg5|s)#bWb_pWx`s2W4Y2k8ZL8QnlP(#zwuD~0>BZyezl#;~>)c6} z#5^&VrgUcfpLDm}Wdx%mcGy0&@9e9=l3~@4a(@&80EYMer~+X44*zN$dN))vRQiKG zgF6S?23rSz4E}C#?O?-T{tqI55O%@Il!LUNho@mD57N^tgY@h39f?cGO6rsAP!kO| z$`QGd#szYe{ zU?AYwEw$_$Y-(TO)A*AGuLn>mYnIYOXnrrR&;H3%dQRQKQW_x@gK@~gUo&ju&NA{R zN~W~Wiq)(!EcH*FTzoKG${z3o1cM;VxB3SihwQkx*CD_A7n7vN{Q;r7nv|M-BwINh zvv?+1`a%2Re24F7Z)+_tE0vUpi;D^i^7C?Yva>QX($i8?l9NPjuYUL81F%Z}$p{BU`&tzC3n@8KP8`|;4+ zj9{5z$`Ry9>~JjgBV(;MY`;S2yxv|O7ux=%>y6o>q5$*H8x1Es95q6Gu2sgOV`&F&o-a!>BdBT^t?!k^h+82TRp9E2Y}77!y@d>s76 ztdlorawYxaJDR0`L)JB%OLmNuSCld4IwAOHX4lei{~Ger7bIO9l(_eH?Fy+)?01!j0p0%tj)?t(Dp5Hgw7redL8j6?$*Y2mFLLFWXhu*;1Mnua|+ZAAT3JbM#)diOLVoJXUVywP~B?Dkv~X_#$svV z%_V>$W_*Z>LV;J7+mr$e_TY? zBBcS};5WRGc1c$nN1U~zXHur!F^dkmNoK}+=;Gy!TARU`DH_?1E3Q2Br=3_83&Puy zLRO^U7a2UHF@U#r9sw9O=wg&t*Ca!ppuc`9^ zAgvb=D#cWejn6xM55W*HMSp|ciffMJ5;SSbrT}~_#ZkpTMNLz)^(YgdMgXmz3AEmx ztF2f{mA^@-zvOaN$?OkzDS#>Q>S#7bZ!_P|5u@lX?E<7eS zAueTR3^#m$Cz^LJn-We48(5j@$=%iuV=# z3jws*wJmWv6G1D-m7XY79s8=yOF1k?>Gq-k4u-dI075w{(5t%RmyW77x5KU2Tnxv# z+n-wOAy-g!*BxgpB`Q0+s40Mm7ZQ`0um|$kdmP^bW!FS(?Y$_6AQF8SV(-q`?44u) z{org=Y7ZbIz?}nCel1ROC(ar9;>?%60+(NhrBOmui~YzSK(StJ|H5rhl~%Z3pZWX{ zl~tbp%dFXxTEx_b0d`654rNA04ge(Z$Z9js4}|l}C%C;atXC zVx)wib3s;K_rN4~O$DoP*^;$bNzZ2fLHtwD9Mjx=MPatd-OuP z%houU0~3PTX0z=&tJ7>bpsH%}$YsIrgvU})m`w93fB@3&u>pUA=fPvuorajW}7PiHYgsivrdppjYd?G7#J!!1R=o zJSmT#HOqe@v>KmB1S&i_LJ@mTieQQ$i*v*V>m0tdsED)V&@TM733IScdKV#QgoK_b ztI#@r3(@rJ5IHP{xi=F6A~2Ks>N<<3j z@Vw5Ekf=4iYTyl4?*Xwf3Uk%c&39bJ&kK6^#=rdph-Ssdj@5AVZ8;P*Ets2A@kS zjO|a8M}xSi1DFFf`Wc9E{vU;mq?7H8D{5Q$sD?l7b&B7Ch1cmkNbDEeEM7ACg_CL> z+p;iMCin2%M#G(orr~-j%pqyr<8k>2HBZ|2h;%8MpADO7+*(W)nxa8jWGmD*FMa-L zVwnbbre$u0L`@)ZB83S;TqY_78fy{`MOv{!@j9wG2A8@2d z!Ct;e%FR5eGEE0lro$8It~~W3gzASOsi2`LD5PJSx5J!1fh4ANL~YNN(ezRhHiPC4 zvE}bl%X3rF8=s_Op4!UhKv&6e-VGkeNG>p=^{YqsYM`*dMak1CP2&yB@Wy{yT>|hd zA3Vp`^hupL(GIUkQQv08U1PQqa_cQO#ZJ(fw_{B@l4?BMRra)tw~Y+?D?DpBb+g8Q zJdW`p$Z0pNG`9|tn5w1ug_#h#d;k6Rh>fc}L@-5=1PM08N<$$mzMLGA1#8YXisexOlJ(=v3vQC8!N-Eptzdx?>$!~{NC8M0p zd0LD1(x5}W+I#x>w{TNg>cVWY8`GM-M81%N&s8A}8uVy5;Qo+%f9oTeLvHQ`0`ZJA z4t`a>CT+AB%A>VIp*Cs`N~2)7sbjGBG_6BGH)IOx5j*eg6w^JI+4kN`O!~k{h<}|d zR)Iq9p7fKOb3G*KcT=G1z{Rkeod{om06Fth@C>{jksH#G9NNY^gl#qy)48zJW!M}P zM5S-zO>A^hY~Z~k=}+OoszO!51WT;Rh7F=u9IIq*>@5+Fo&Hs62u}~hRoQ2t(Y1!CSky>68Xt0yH?|RiWouD*#eGI|NLMR8T?ft5~%L4)x+N zmoP~fG$^OriW#G;x$L-v=W1bh*qAatsAi5c>Hdp3Z6mbpclJZTJBdB_$n2JTfu*q_ zzp|F<)9NzGK+l^cfU-m{HS8TpFi?me_`iy*Y|s>jx#fxTQOK1 zMnaw#WMWjZJas#n$B#-t#Ux8`ZyaDn>%)^h+SI7&Jrt=;;&pXqN6Iu^{_3TAn~#8U z&z!Ak4eot@UN~gegE5fD8Qa9eQR@8Z_+t`kdEYV)O`4R41%iF+Th-CxFm0zX2~DXL zPCbJaNmC~rK2G?ssE}LM-V2UxYQuO*qUDuvbva&JO;+YGuQyOPZ&mQ=a2osr3-4j$@rri9pUQX^&s>Pq>-NoN$c9<6w z&Owb`vqSF9p67qskxmU9nml&sW{;$)?tC*dnZvMR>7pdwEDoEZSeF$^V~Vpd^8tsD z6;dl5=*ZB?-Y?dR7*kpb_eh2xsVL60)L5a~wi$M4_XhrS%&ZaH_*_GE`$N zA90kVLQFkysH|LTFZRD~iK{1U0RdaC7-)NiFdLX5+wR?m7MbzQ3C-lS-Lz57pT6>4 zG5r1R|^VD_z zFOk*m1BG-h%=!~LkHhL_mvp_;t6M{Fc zo*NQgUZG|PRE@*|JV1I+7Y~*ES-W|SZTwJ=+$jA==BC(8+w*eO;+a5xw;4l^u_Uf< z?M0DkpO&~0?{3|JVjJ5*WXM1kK6abL?$=Aaf1GVkk@SEh`uR5O0_=qLLBVJYa<5{*G|&**?XlVvyE?EJTlxkS4)y=JIeoaWoQA#I!)7b#u*Ya zYM=xJefU8y`nSuSId;e{wSd|**L`_YR!*SX#FE33my#a6k%KP;Xg`6s!k)hI&H8R@H~zO)QJ5+^!h3c5vAe2^tDntq`ReYRZb9VxS= zq}hXIrU;r=zAbgBvLenz@_q5pV#js5Bb?^waUkPX%AOnMaDzb<@Vj4KITq-qRWQ7#RG~JzFQ+tq@qnMRQa<}u3a|zbY zzFv;sA2rbl=j>%eiiBF|{JPrO`T4;E>G!S`?cev4X#CuoK_QHdj}s;-bjsxT73(cxv34}U8G%kbjQB3?fcGyhRD3Y9v4vusv{Hl~ z(+(d4mP9@#&_G7Ji*tW9MbA5=)?5uqI$9hb&{m%w;r4|6!RK=i%qTWite$>vGqSUOjIi8y*;Ojg^s{v#@IZK zK**f&)S($%%Hx)=Ev&UM7^J78Gujh_M*BKDB7GHXrOT!VmWNF>mlZt^J)U>fPF+71 zSv+*-Xe{~jdmj1r;>^h1`53a}jgMD+j#QN;Cs&pF9=UqiN4c^hHMO$BTUq7$ppqLP z9AiXZI7zZnW>U37m8RKBby>AMf}pSbN|6GV(g z@(>5Mc%uMl=3F3s7@4(N*;>5)BW)sO6M}&BVy&+`hl^wwPD5hTeDAt%v-;m*P`By( z?KseJR;G$sYLW!>chq*<&~r|oZH&BbJ&~vAaPrOoSL5K6;z$y?!ak&EB_{T4ZJX%f zwT$|N1&U+<_jNzJVrY7