From af54db6c136138c66cf5ca72419989525a0baa5c Mon Sep 17 00:00:00 2001 From: Gareth Coles Date: Tue, 7 Aug 2018 15:09:08 +0100 Subject: Initial project layout for django --- .gitlab-ci.yml | 108 +- Pipfile | 37 +- Pipfile.lock | 551 +-- app.py | 13 - gunicorn_config.py | 76 - manage.py | 15 + pydis_django/__init__.py | 0 pydis_django/hosts.py | 15 + pydis_django/settings.py | 140 + pydis_django/urls/__init__.py | 0 pydis_django/urls/admin.py | 6 + pydis_django/urls/api.py | 6 + pydis_django/urls/main.py | 21 + pydis_django/urls/staff.py | 6 + pydis_django/urls/wiki.py | 6 + pydis_django/urls/ws.py | 6 + pydis_django/wsgi.py | 16 + pysite/__init__.py | 61 - pysite/base_route.py | 328 -- pysite/constants.py | 151 - pysite/database.py | 562 --- pysite/decorators.py | 151 - pysite/migrations/__init__.py | 0 pysite/migrations/runner.py | 95 - pysite/migrations/tables/__init__.py | 0 .../tables/code_jam_participants/__init__.py | 0 .../migrations/tables/code_jam_participants/v1.py | 11 - .../migrations/tables/code_jam_participants/v2.py | 12 - .../migrations/tables/code_jam_teams/__init__.py | 0 pysite/migrations/tables/code_jam_teams/v1.py | 13 - pysite/migrations/tables/code_jam_teams/v2.py | 13 - pysite/migrations/tables/code_jams/__init__.py | 0 pysite/migrations/tables/code_jams/v1.py | 11 - pysite/migrations/tables/code_jams/v2.py | 10 - .../tables/hiphopify_namelist/__init__.py | 0 .../tables/hiphopify_namelist/initial_data.json | 5198 -------------------- pysite/migrations/tables/oauth_data/__init__.py | 0 pysite/migrations/tables/oauth_data/v1.py | 13 - pysite/migrations/tables/pydoc_links/__init__.py | 0 .../tables/pydoc_links/initial_data.json | 22 - pysite/migrations/tables/snake_facts/__init__.py | 0 .../tables/snake_facts/initial_data.json | 233 - pysite/migrations/tables/snake_idioms/__init__.py | 0 .../tables/snake_idioms/initial_data.json | 275 -- pysite/migrations/tables/snake_names/__init__.py | 0 .../tables/snake_names/initial_data.json | 2170 -------- pysite/migrations/tables/snake_quiz/__init__.py | 0 .../migrations/tables/snake_quiz/initial_data.json | 200 - .../migrations/tables/special_snakes/__init__.py | 0 .../tables/special_snakes/initial_data.json | 16 - pysite/migrations/tables/users/__init__.py | 0 pysite/migrations/tables/users/v1.py | 11 - pysite/migrations/tables/users/v2.py | 11 - pysite/migrations/tables/wiki/__init__.py | 0 pysite/migrations/tables/wiki/v1.py | 11 - pysite/mixins.py | 214 - pysite/oauth.py | 86 - pysite/queues.py | 5 - pysite/route_manager.py | 146 - pysite/rst/__init__.py | 108 - pysite/rst/directives/__init__.py | 65 - pysite/rst/roles.py | 125 - pysite/service_discovery.py | 26 - pysite/tables.py | 292 -- pysite/utils/time.py | 62 - pysite/utils/words.py | 73 - pysite/views/__init__.py | 0 pysite/views/api/__init__.py | 0 pysite/views/api/bot/__init__.py | 0 pysite/views/api/bot/bigbrother.py | 118 - pysite/views/api/bot/clean.py | 48 - pysite/views/api/bot/doc.py | 98 - pysite/views/api/bot/hiphopify.py | 170 - pysite/views/api/bot/infractions.py | 572 --- pysite/views/api/bot/off_topic_names.py | 108 - pysite/views/api/bot/settings.py | 56 - pysite/views/api/bot/snake_cog/__init__.py | 0 pysite/views/api/bot/snake_cog/snake_facts.py | 28 - pysite/views/api/bot/snake_cog/snake_idioms.py | 28 - pysite/views/api/bot/snake_cog/snake_names.py | 48 - pysite/views/api/bot/snake_cog/snake_quiz.py | 28 - pysite/views/api/bot/snake_cog/special_snakes.py | 28 - pysite/views/api/bot/tags.py | 107 - pysite/views/api/bot/user.py | 166 - pysite/views/api/bot/user_complete.py | 143 - pysite/views/api/error_view.py | 40 - pysite/views/api/healthcheck.py | 11 - pysite/views/api/index.py | 10 - pysite/views/api/robots_txt.py | 15 - pysite/views/api/sitemap_xml.py | 11 - pysite/views/error_handlers/http_4xx.py | 31 - pysite/views/error_handlers/http_5xx.py | 41 - pysite/views/main/__init__.py | 0 pysite/views/main/abort.py | 11 - pysite/views/main/about/__init__.py | 0 pysite/views/main/about/channels.py | 7 - pysite/views/main/about/index.py | 7 - pysite/views/main/about/partners.py | 19 - pysite/views/main/about/privacy.py | 7 - pysite/views/main/about/rules.py | 7 - pysite/views/main/auth/__init__.py | 0 pysite/views/main/auth/done.py | 18 - pysite/views/main/bot/cleanlog.py | 35 - pysite/views/main/error.py | 14 - pysite/views/main/index.py | 7 - pysite/views/main/info/__init__.py | 0 pysite/views/main/info/faq.py | 7 - pysite/views/main/info/help.py | 7 - pysite/views/main/info/index.py | 7 - pysite/views/main/info/jams.py | 7 - pysite/views/main/info/resources.py | 58 - pysite/views/main/jams/__init__.py | 0 pysite/views/main/jams/index.py | 52 - pysite/views/main/jams/info.py | 7 - pysite/views/main/jams/jam_team_list.py | 45 - pysite/views/main/jams/join.py | 247 - pysite/views/main/jams/profile.py | 71 - pysite/views/main/jams/retract.py | 83 - pysite/views/main/jams/team_edit_repo.py | 151 - pysite/views/main/jams/team_view.py | 53 - pysite/views/main/jams/user_team_list.py | 37 - pysite/views/main/logout.py | 16 - pysite/views/main/redirects/__init__.py | 0 pysite/views/main/redirects/github.py | 8 - pysite/views/main/redirects/gitlab.py | 8 - pysite/views/main/redirects/invite.py | 8 - pysite/views/main/redirects/stats.py | 8 - pysite/views/main/robots_txt.py | 15 - pysite/views/main/sitemap_xml.py | 69 - pysite/views/main/ws_test.py | 14 - pysite/views/main/ws_test_rst.py | 14 - pysite/views/staff/__init__.py | 0 pysite/views/staff/index.py | 31 - pysite/views/staff/jams/__init__.py | 0 pysite/views/staff/jams/actions.py | 597 --- pysite/views/staff/jams/create.py | 61 - pysite/views/staff/jams/edit_basics.py | 55 - pysite/views/staff/jams/edit_ending.py | 54 - pysite/views/staff/jams/edit_info.py | 55 - pysite/views/staff/jams/forms/__init__.py | 0 pysite/views/staff/jams/forms/preamble_edit.py | 45 - pysite/views/staff/jams/forms/questions_edit.py | 75 - pysite/views/staff/jams/forms/questions_view.py | 22 - pysite/views/staff/jams/forms/view.py | 46 - pysite/views/staff/jams/index.py | 15 - pysite/views/staff/jams/infractions/__init__.py | 0 pysite/views/staff/jams/infractions/view.py | 29 - pysite/views/staff/jams/participants.py | 56 - pysite/views/staff/jams/teams/__init__.py | 0 pysite/views/staff/jams/teams/view.py | 102 - pysite/views/staff/render.py | 62 - pysite/views/staff/robots_txt.py | 15 - pysite/views/staff/sitemap_xml.py | 11 - pysite/views/staff/tables/__init__.py | 0 pysite/views/staff/tables/edit.py | 110 - pysite/views/staff/tables/index.py | 13 - pysite/views/staff/tables/table.py | 63 - pysite/views/staff/tables/table_bare.py | 30 - pysite/views/tests/__init__.py | 1 - pysite/views/tests/index.py | 23 - pysite/views/wiki/__init__.py | 0 pysite/views/wiki/delete.py | 64 - pysite/views/wiki/edit.py | 149 - pysite/views/wiki/history/compare.py | 70 - pysite/views/wiki/history/show.py | 41 - pysite/views/wiki/index.py | 8 - pysite/views/wiki/move.py | 84 - pysite/views/wiki/page.py | 36 - pysite/views/wiki/render.py | 62 - pysite/views/wiki/robots_txt.py | 15 - pysite/views/wiki/search.py | 66 - pysite/views/wiki/sitemap_xml.py | 22 - pysite/views/wiki/source.py | 42 - pysite/views/wiki/special/__init__.py | 0 pysite/views/wiki/special/all_pages.py | 27 - pysite/views/wiki/special/index.py | 7 - pysite/views/ws/__init__.py | 0 pysite/views/ws/bot.py | 56 - pysite/views/ws/echo.py | 25 - pysite/views/ws/rst.py | 33 - pysite/websockets.py | 123 - scripts/deploy-ci.sh | 23 - scripts/deploy.sh | 33 - static/.gitkeep | 0 static/css/bundled/pygments-monokai.css | 143 - static/css/style.css | 3 - static/css/style.css.map | 36 - static/css/uikit_blurple.css | 3 - static/css/uikit_blurple.css.map | 154 - static/favicon.ico | Bin 28957 -> 0 bytes static/images/jams/jams_1.png | Bin 17396 -> 0 bytes static/images/jams/jams_10.png | Bin 48740 -> 0 bytes static/images/jams/jams_11.png | Bin 25995 -> 0 bytes static/images/jams/jams_12.png | Bin 67092 -> 0 bytes static/images/jams/jams_13.png | Bin 40235 -> 0 bytes static/images/jams/jams_14.png | Bin 47439 -> 0 bytes static/images/jams/jams_15.png | Bin 66230 -> 0 bytes static/images/jams/jams_16.png | Bin 73510 -> 0 bytes static/images/jams/jams_17.png | Bin 230287 -> 0 bytes static/images/jams/jams_2.png | Bin 16732 -> 0 bytes static/images/jams/jams_3.png | Bin 17449 -> 0 bytes static/images/jams/jams_4.png | Bin 21876 -> 0 bytes static/images/jams/jams_5.png | Bin 39191 -> 0 bytes static/images/jams/jams_6.png | Bin 15345 -> 0 bytes static/images/jams/jams_7.png | Bin 26922 -> 0 bytes static/images/jams/jams_8.png | Bin 27718 -> 0 bytes static/images/jams/jams_9.png | Bin 47229 -> 0 bytes static/images/jetbrains.png | Bin 167813 -> 0 bytes static/images/partners/code monkeys.png | Bin 57930 -> 0 bytes static/images/partners/functional programming.png | Bin 40270 -> 0 bytes static/images/partners/programming.png | Bin 90027 -> 0 bytes static/images/partners/stem.png | Bin 260063 -> 0 bytes static/images/payment_icons/green.svg | 1 - static/images/payment_icons/red.svg | 1 - static/images/payment_icons/yellow.svg | 1 - static/js/script.js | 2 - static/js/script.js.map | 1 - static/logos/logo_banner.png | Bin 34789 -> 0 bytes static/logos/logo_banner.svg | 55 - static/logos/logo_discord.png | Bin 63590 -> 0 bytes static/partners.json | 22 - static/resources.json | 427 -- templates/errors/error.html | 56 - templates/main/about/channels.html | 268 - templates/main/about/index.html | 40 - templates/main/about/partners.html | 46 - templates/main/about/privacy.html | 324 -- templates/main/about/rules.html | 124 - templates/main/base.html | 53 - templates/main/bot/clean_logs.html | 81 - templates/main/index.html | 38 - templates/main/info/faq.html | 324 -- templates/main/info/help.html | 461 -- templates/main/info/index.html | 43 - templates/main/info/resources.html | 103 - templates/main/jams/already.html | 26 - templates/main/jams/banned.html | 44 - templates/main/jams/index.html | 144 - templates/main/jams/info.html | 128 - templates/main/jams/join.html | 362 -- templates/main/jams/profile.html | 103 - templates/main/jams/retract.html | 61 - templates/main/jams/retracted.html | 31 - templates/main/jams/team_list.html | 106 - templates/main/jams/team_view.html | 291 -- templates/main/jams/thanks.html | 25 - templates/main/navigation.html | 165 - templates/main/ws_test.html | 26 - templates/main/ws_test_rst.html | 39 - templates/robots.txt | 14 - templates/sitemap.xml | 64 - templates/staff/index.html | 23 - templates/staff/jams/create.html | 78 - templates/staff/jams/edit_basics.html | 79 - templates/staff/jams/edit_ending.html | 152 - templates/staff/jams/edit_info.html | 309 -- templates/staff/jams/forms/preamble_edit.html | 150 - templates/staff/jams/forms/questions_edit.html | 354 -- templates/staff/jams/forms/questions_view.html | 593 --- templates/staff/jams/forms/view.html | 755 --- templates/staff/jams/index.html | 252 - templates/staff/jams/infractions/view.html | 328 -- templates/staff/jams/participants.html | 163 - templates/staff/jams/teams/view.html | 513 -- templates/staff/tables/edit.html | 50 - templates/staff/tables/index.html | 32 - templates/staff/tables/table.html | 165 - templates/wiki/base.html | 216 - templates/wiki/compare_revision.html | 13 - templates/wiki/page_delete.html | 25 - templates/wiki/page_edit.html | 137 - templates/wiki/page_in_use.html | 12 - templates/wiki/page_move.html | 26 - templates/wiki/page_source.html | 13 - templates/wiki/page_view.html | 18 - templates/wiki/revision_list.html | 36 - templates/wiki/search.html | 23 - templates/wiki/search_results.html | 39 - templates/wiki/special.html | 17 - templates/wiki/special_all.html | 26 - tests/__init__.py | 42 - tests/test_api.py | 25 - tests/test_api_bot_bigbrother.py | 152 - tests/test_api_bot_infractions.py | 134 - tests/test_api_bot_off_topic_names.py | 134 - tests/test_api_bot_snake.py | 64 - tests/test_api_bot_tags.py | 72 - tests/test_api_bot_users.py | 28 - tests/test_api_docs.py | 95 - tests/test_clean_logs.py | 74 - tests/test_database.py | 31 - tests/test_decorators.py | 48 - tests/test_jams.py | 11 - tests/test_mixins.py | 66 - tests/test_oauth_backend.py | 39 - tests/test_roots.py | 85 - tests/test_rst.py | 11 - tests/test_staff.py | 15 - tests/test_utilities.py | 25 - tests/test_utils.py | 73 - tests/test_websocket.py | 12 - tests/test_wiki.py | 34 - tox.ini | 4 +- 303 files changed, 348 insertions(+), 27350 deletions(-) delete mode 100644 app.py delete mode 100644 gunicorn_config.py create mode 100755 manage.py create mode 100644 pydis_django/__init__.py create mode 100644 pydis_django/hosts.py create mode 100644 pydis_django/settings.py create mode 100644 pydis_django/urls/__init__.py create mode 100644 pydis_django/urls/admin.py create mode 100644 pydis_django/urls/api.py create mode 100644 pydis_django/urls/main.py create mode 100644 pydis_django/urls/staff.py create mode 100644 pydis_django/urls/wiki.py create mode 100644 pydis_django/urls/ws.py create mode 100644 pydis_django/wsgi.py delete mode 100644 pysite/__init__.py delete mode 100644 pysite/base_route.py delete mode 100644 pysite/constants.py delete mode 100644 pysite/database.py delete mode 100644 pysite/decorators.py delete mode 100644 pysite/migrations/__init__.py delete mode 100644 pysite/migrations/runner.py delete mode 100644 pysite/migrations/tables/__init__.py delete mode 100644 pysite/migrations/tables/code_jam_participants/__init__.py delete mode 100644 pysite/migrations/tables/code_jam_participants/v1.py delete mode 100644 pysite/migrations/tables/code_jam_participants/v2.py delete mode 100644 pysite/migrations/tables/code_jam_teams/__init__.py delete mode 100644 pysite/migrations/tables/code_jam_teams/v1.py delete mode 100644 pysite/migrations/tables/code_jam_teams/v2.py delete mode 100644 pysite/migrations/tables/code_jams/__init__.py delete mode 100644 pysite/migrations/tables/code_jams/v1.py delete mode 100644 pysite/migrations/tables/code_jams/v2.py delete mode 100644 pysite/migrations/tables/hiphopify_namelist/__init__.py delete mode 100644 pysite/migrations/tables/hiphopify_namelist/initial_data.json delete mode 100644 pysite/migrations/tables/oauth_data/__init__.py delete mode 100644 pysite/migrations/tables/oauth_data/v1.py delete mode 100644 pysite/migrations/tables/pydoc_links/__init__.py delete mode 100644 pysite/migrations/tables/pydoc_links/initial_data.json delete mode 100644 pysite/migrations/tables/snake_facts/__init__.py delete mode 100644 pysite/migrations/tables/snake_facts/initial_data.json delete mode 100644 pysite/migrations/tables/snake_idioms/__init__.py delete mode 100644 pysite/migrations/tables/snake_idioms/initial_data.json delete mode 100644 pysite/migrations/tables/snake_names/__init__.py delete mode 100644 pysite/migrations/tables/snake_names/initial_data.json delete mode 100644 pysite/migrations/tables/snake_quiz/__init__.py delete mode 100644 pysite/migrations/tables/snake_quiz/initial_data.json delete mode 100644 pysite/migrations/tables/special_snakes/__init__.py delete mode 100644 pysite/migrations/tables/special_snakes/initial_data.json delete mode 100644 pysite/migrations/tables/users/__init__.py delete mode 100644 pysite/migrations/tables/users/v1.py delete mode 100644 pysite/migrations/tables/users/v2.py delete mode 100644 pysite/migrations/tables/wiki/__init__.py delete mode 100644 pysite/migrations/tables/wiki/v1.py delete mode 100644 pysite/mixins.py delete mode 100644 pysite/oauth.py delete mode 100644 pysite/queues.py delete mode 100644 pysite/route_manager.py delete mode 100644 pysite/rst/__init__.py delete mode 100644 pysite/rst/directives/__init__.py delete mode 100644 pysite/rst/roles.py delete mode 100644 pysite/service_discovery.py delete mode 100644 pysite/tables.py delete mode 100644 pysite/utils/time.py delete mode 100644 pysite/utils/words.py delete mode 100644 pysite/views/__init__.py delete mode 100644 pysite/views/api/__init__.py delete mode 100644 pysite/views/api/bot/__init__.py delete mode 100644 pysite/views/api/bot/bigbrother.py delete mode 100644 pysite/views/api/bot/clean.py delete mode 100644 pysite/views/api/bot/doc.py delete mode 100644 pysite/views/api/bot/hiphopify.py delete mode 100644 pysite/views/api/bot/infractions.py delete mode 100644 pysite/views/api/bot/off_topic_names.py delete mode 100644 pysite/views/api/bot/settings.py delete mode 100644 pysite/views/api/bot/snake_cog/__init__.py delete mode 100644 pysite/views/api/bot/snake_cog/snake_facts.py delete mode 100644 pysite/views/api/bot/snake_cog/snake_idioms.py delete mode 100644 pysite/views/api/bot/snake_cog/snake_names.py delete mode 100644 pysite/views/api/bot/snake_cog/snake_quiz.py delete mode 100644 pysite/views/api/bot/snake_cog/special_snakes.py delete mode 100644 pysite/views/api/bot/tags.py delete mode 100644 pysite/views/api/bot/user.py delete mode 100644 pysite/views/api/bot/user_complete.py delete mode 100644 pysite/views/api/error_view.py delete mode 100644 pysite/views/api/healthcheck.py delete mode 100644 pysite/views/api/index.py delete mode 100644 pysite/views/api/robots_txt.py delete mode 100644 pysite/views/api/sitemap_xml.py delete mode 100644 pysite/views/error_handlers/http_4xx.py delete mode 100644 pysite/views/error_handlers/http_5xx.py delete mode 100644 pysite/views/main/__init__.py delete mode 100644 pysite/views/main/abort.py delete mode 100644 pysite/views/main/about/__init__.py delete mode 100644 pysite/views/main/about/channels.py delete mode 100644 pysite/views/main/about/index.py delete mode 100644 pysite/views/main/about/partners.py delete mode 100644 pysite/views/main/about/privacy.py delete mode 100644 pysite/views/main/about/rules.py delete mode 100644 pysite/views/main/auth/__init__.py delete mode 100644 pysite/views/main/auth/done.py delete mode 100644 pysite/views/main/bot/cleanlog.py delete mode 100644 pysite/views/main/error.py delete mode 100644 pysite/views/main/index.py delete mode 100644 pysite/views/main/info/__init__.py delete mode 100644 pysite/views/main/info/faq.py delete mode 100644 pysite/views/main/info/help.py delete mode 100644 pysite/views/main/info/index.py delete mode 100644 pysite/views/main/info/jams.py delete mode 100644 pysite/views/main/info/resources.py delete mode 100644 pysite/views/main/jams/__init__.py delete mode 100644 pysite/views/main/jams/index.py delete mode 100644 pysite/views/main/jams/info.py delete mode 100644 pysite/views/main/jams/jam_team_list.py delete mode 100644 pysite/views/main/jams/join.py delete mode 100644 pysite/views/main/jams/profile.py delete mode 100644 pysite/views/main/jams/retract.py delete mode 100644 pysite/views/main/jams/team_edit_repo.py delete mode 100644 pysite/views/main/jams/team_view.py delete mode 100644 pysite/views/main/jams/user_team_list.py delete mode 100644 pysite/views/main/logout.py delete mode 100644 pysite/views/main/redirects/__init__.py delete mode 100644 pysite/views/main/redirects/github.py delete mode 100644 pysite/views/main/redirects/gitlab.py delete mode 100644 pysite/views/main/redirects/invite.py delete mode 100644 pysite/views/main/redirects/stats.py delete mode 100644 pysite/views/main/robots_txt.py delete mode 100644 pysite/views/main/sitemap_xml.py delete mode 100644 pysite/views/main/ws_test.py delete mode 100644 pysite/views/main/ws_test_rst.py delete mode 100644 pysite/views/staff/__init__.py delete mode 100644 pysite/views/staff/index.py delete mode 100644 pysite/views/staff/jams/__init__.py delete mode 100644 pysite/views/staff/jams/actions.py delete mode 100644 pysite/views/staff/jams/create.py delete mode 100644 pysite/views/staff/jams/edit_basics.py delete mode 100644 pysite/views/staff/jams/edit_ending.py delete mode 100644 pysite/views/staff/jams/edit_info.py delete mode 100644 pysite/views/staff/jams/forms/__init__.py delete mode 100644 pysite/views/staff/jams/forms/preamble_edit.py delete mode 100644 pysite/views/staff/jams/forms/questions_edit.py delete mode 100644 pysite/views/staff/jams/forms/questions_view.py delete mode 100644 pysite/views/staff/jams/forms/view.py delete mode 100644 pysite/views/staff/jams/index.py delete mode 100644 pysite/views/staff/jams/infractions/__init__.py delete mode 100644 pysite/views/staff/jams/infractions/view.py delete mode 100644 pysite/views/staff/jams/participants.py delete mode 100644 pysite/views/staff/jams/teams/__init__.py delete mode 100644 pysite/views/staff/jams/teams/view.py delete mode 100644 pysite/views/staff/render.py delete mode 100644 pysite/views/staff/robots_txt.py delete mode 100644 pysite/views/staff/sitemap_xml.py delete mode 100644 pysite/views/staff/tables/__init__.py delete mode 100644 pysite/views/staff/tables/edit.py delete mode 100644 pysite/views/staff/tables/index.py delete mode 100644 pysite/views/staff/tables/table.py delete mode 100644 pysite/views/staff/tables/table_bare.py delete mode 100644 pysite/views/tests/__init__.py delete mode 100644 pysite/views/tests/index.py delete mode 100644 pysite/views/wiki/__init__.py delete mode 100644 pysite/views/wiki/delete.py delete mode 100644 pysite/views/wiki/edit.py delete mode 100644 pysite/views/wiki/history/compare.py delete mode 100644 pysite/views/wiki/history/show.py delete mode 100644 pysite/views/wiki/index.py delete mode 100644 pysite/views/wiki/move.py delete mode 100644 pysite/views/wiki/page.py delete mode 100644 pysite/views/wiki/render.py delete mode 100644 pysite/views/wiki/robots_txt.py delete mode 100644 pysite/views/wiki/search.py delete mode 100644 pysite/views/wiki/sitemap_xml.py delete mode 100644 pysite/views/wiki/source.py delete mode 100644 pysite/views/wiki/special/__init__.py delete mode 100644 pysite/views/wiki/special/all_pages.py delete mode 100644 pysite/views/wiki/special/index.py delete mode 100644 pysite/views/ws/__init__.py delete mode 100644 pysite/views/ws/bot.py delete mode 100644 pysite/views/ws/echo.py delete mode 100644 pysite/views/ws/rst.py delete mode 100644 pysite/websockets.py delete mode 100644 scripts/deploy-ci.sh delete mode 100644 scripts/deploy.sh delete mode 100644 static/.gitkeep delete mode 100644 static/css/bundled/pygments-monokai.css delete mode 100644 static/css/style.css delete mode 100644 static/css/style.css.map delete mode 100644 static/css/uikit_blurple.css delete mode 100644 static/css/uikit_blurple.css.map delete mode 100644 static/favicon.ico delete mode 100644 static/images/jams/jams_1.png delete mode 100644 static/images/jams/jams_10.png delete mode 100644 static/images/jams/jams_11.png delete mode 100644 static/images/jams/jams_12.png delete mode 100644 static/images/jams/jams_13.png delete mode 100644 static/images/jams/jams_14.png delete mode 100644 static/images/jams/jams_15.png delete mode 100644 static/images/jams/jams_16.png delete mode 100644 static/images/jams/jams_17.png delete mode 100644 static/images/jams/jams_2.png delete mode 100644 static/images/jams/jams_3.png delete mode 100644 static/images/jams/jams_4.png delete mode 100644 static/images/jams/jams_5.png delete mode 100644 static/images/jams/jams_6.png delete mode 100644 static/images/jams/jams_7.png delete mode 100644 static/images/jams/jams_8.png delete mode 100644 static/images/jams/jams_9.png delete mode 100644 static/images/jetbrains.png delete mode 100644 static/images/partners/code monkeys.png delete mode 100644 static/images/partners/functional programming.png delete mode 100644 static/images/partners/programming.png delete mode 100644 static/images/partners/stem.png delete mode 100644 static/images/payment_icons/green.svg delete mode 100644 static/images/payment_icons/red.svg delete mode 100644 static/images/payment_icons/yellow.svg delete mode 100644 static/js/script.js delete mode 100644 static/js/script.js.map delete mode 100644 static/logos/logo_banner.png delete mode 100644 static/logos/logo_banner.svg delete mode 100644 static/logos/logo_discord.png delete mode 100644 static/partners.json delete mode 100644 static/resources.json delete mode 100644 templates/errors/error.html delete mode 100644 templates/main/about/channels.html delete mode 100644 templates/main/about/index.html delete mode 100644 templates/main/about/partners.html delete mode 100644 templates/main/about/privacy.html delete mode 100644 templates/main/about/rules.html delete mode 100644 templates/main/base.html delete mode 100644 templates/main/bot/clean_logs.html delete mode 100644 templates/main/index.html delete mode 100644 templates/main/info/faq.html delete mode 100644 templates/main/info/help.html delete mode 100644 templates/main/info/index.html delete mode 100644 templates/main/info/resources.html delete mode 100644 templates/main/jams/already.html delete mode 100644 templates/main/jams/banned.html delete mode 100644 templates/main/jams/index.html delete mode 100644 templates/main/jams/info.html delete mode 100644 templates/main/jams/join.html delete mode 100644 templates/main/jams/profile.html delete mode 100644 templates/main/jams/retract.html delete mode 100644 templates/main/jams/retracted.html delete mode 100644 templates/main/jams/team_list.html delete mode 100644 templates/main/jams/team_view.html delete mode 100644 templates/main/jams/thanks.html delete mode 100644 templates/main/navigation.html delete mode 100644 templates/main/ws_test.html delete mode 100644 templates/main/ws_test_rst.html delete mode 100644 templates/robots.txt delete mode 100644 templates/sitemap.xml delete mode 100644 templates/staff/index.html delete mode 100644 templates/staff/jams/create.html delete mode 100644 templates/staff/jams/edit_basics.html delete mode 100644 templates/staff/jams/edit_ending.html delete mode 100644 templates/staff/jams/edit_info.html delete mode 100644 templates/staff/jams/forms/preamble_edit.html delete mode 100644 templates/staff/jams/forms/questions_edit.html delete mode 100644 templates/staff/jams/forms/questions_view.html delete mode 100644 templates/staff/jams/forms/view.html delete mode 100644 templates/staff/jams/index.html delete mode 100644 templates/staff/jams/infractions/view.html delete mode 100644 templates/staff/jams/participants.html delete mode 100644 templates/staff/jams/teams/view.html delete mode 100644 templates/staff/tables/edit.html delete mode 100644 templates/staff/tables/index.html delete mode 100644 templates/staff/tables/table.html delete mode 100644 templates/wiki/base.html delete mode 100644 templates/wiki/compare_revision.html delete mode 100644 templates/wiki/page_delete.html delete mode 100644 templates/wiki/page_edit.html delete mode 100644 templates/wiki/page_in_use.html delete mode 100644 templates/wiki/page_move.html delete mode 100644 templates/wiki/page_source.html delete mode 100644 templates/wiki/page_view.html delete mode 100644 templates/wiki/revision_list.html delete mode 100644 templates/wiki/search.html delete mode 100644 templates/wiki/search_results.html delete mode 100644 templates/wiki/special.html delete mode 100644 templates/wiki/special_all.html delete mode 100644 tests/__init__.py delete mode 100644 tests/test_api.py delete mode 100644 tests/test_api_bot_bigbrother.py delete mode 100644 tests/test_api_bot_infractions.py delete mode 100644 tests/test_api_bot_off_topic_names.py delete mode 100644 tests/test_api_bot_snake.py delete mode 100644 tests/test_api_bot_tags.py delete mode 100644 tests/test_api_bot_users.py delete mode 100644 tests/test_api_docs.py delete mode 100644 tests/test_clean_logs.py delete mode 100644 tests/test_database.py delete mode 100644 tests/test_decorators.py delete mode 100644 tests/test_jams.py delete mode 100644 tests/test_mixins.py delete mode 100644 tests/test_oauth_backend.py delete mode 100644 tests/test_roots.py delete mode 100644 tests/test_rst.py delete mode 100644 tests/test_staff.py delete mode 100644 tests/test_utilities.py delete mode 100644 tests/test_utils.py delete mode 100644 tests/test_websocket.py delete mode 100644 tests/test_wiki.py diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 2ea2b632..144260ff 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -5,44 +5,44 @@ variables: RETHINKDB_HOST: rethinkdb stages: - - build +# - build - test - - deploy - -build: - before_script: - - docker info - - image: docker:stable-git - - only: - - master - - services: - - docker:dind - - stage: build - - script: - - sh scripts/deploy-ci.sh - - tags: - - docker - - variables: - DOCKER_DRIVER: overlay2 +# - deploy +# +#build: +# before_script: +# - docker info +# +# image: docker:stable-git +# +# only: +# - master +# +# services: +# - docker:dind +# +# stage: build +# +# script: +# - sh scripts/deploy-ci.sh +# +# tags: +# - docker +# +# variables: +# DOCKER_DRIVER: overlay2 test: tags: - docker stage: test - services: - - name: rabbitmq:3.7.5-alpine - alias: rabbit - - - name: rethinkdb:2.3.6 - alias: rethinkdb +# services: +# - name: rabbitmq:3.7.5-alpine +# alias: rabbit +# +# - name: rethinkdb:2.3.6 +# alias: rethinkdb cache: paths: @@ -53,26 +53,26 @@ test: - pipenv sync --dev - pipenv run lint - - pipenv run lintjs - - pipenv run lintscss - - - pipenv run python gunicorn_config.py - - pipenv run test - -deploy: - tags: - - docker - - only: - - master - - services: - - docker:dind - - stage: deploy - script: - - sh scripts/deploy.sh - - environment: - name: Production - url: https://pythondiscord.com +# - pipenv run lintjs +# - pipenv run lintscss +# +# - pipenv run python gunicorn_config.py +# - pipenv run test +# +#deploy: +# tags: +# - docker +# +# only: +# - master +# +# services: +# - docker:dind +# +# stage: deploy +# script: +# - sh scripts/deploy.sh +# +# environment: +# name: Production +# url: https://pythondiscord.com diff --git a/Pipfile b/Pipfile index b74b26bd..08a51954 100644 --- a/Pipfile +++ b/Pipfile @@ -1,26 +1,11 @@ [[source]] -url = "https://pypi.python.org/simple" +url = "https://pypi.org/simple" verify_ssl = true name = "pypi" [packages] -flask = "==0.12.2" -rethinkdb = "*" -requests = "*" -gevent = "==1.2.2" -gevent-websocket = "*" -wsaccel = "*" -ujson = "*" -schema = "*" -flask-sockets = "*" -flask-dance = "*" -logmatic-python = "*" -flask-wtf = "*" -docutils = "*" -pygments = "*" -gunicorn = "*" -kombu = "*" -librabbitmq = "*" +django = "*" +django-hosts = "*" [dev-packages] "flake8" = "*" @@ -29,15 +14,10 @@ librabbitmq = "*" "flake8-import-order" = "*" "flake8-tidy-imports" = "*" "flake8-string-format" = "*" -requests = "*" -flask-testing = "*" -pytest = "*" -pytest-cov = "*" -python-coveralls = "*" libsass = "*" [requires] -python_version = "3.6" +python_version = "3.7" [scripts] build = "docker build -t pythondiscord/site:latest -f docker/Dockerfile ." @@ -45,11 +25,11 @@ buildci = "docker build -t pythondiscord/site-ci:latest -f docker/ci.Dockerfile buildbase = "docker build -t pythondiscord/site-base:latest -f docker/Dockerfile.base ." buildjs = "gulp" -buildscss = "python scss.py scss/pysite:scss/pysite/style.scss:static/css/style.css scss/uikit:scss/uikit/uikit_blurple.scss:static/css/uikit_blurple.css" +#buildscss = "python scss.py scss/pysite:scss/pysite/style.scss:static/css/style.css scss/uikit:scss/uikit/uikit_blurple.scss:static/css/uikit_blurple.css" clean = "rm -rf __pycache__ htmlcov .coverage .pytest_cache" fixjs = "eslint static/js --fix" -start = "gunicorn -w 12 -b 0.0.0.0:10012 -c gunicorn_config.py --log-level info -k geventwebsocket.gunicorn.workers.GeventWebSocketWorker app:app" +#start = "gunicorn -w 12 -b 0.0.0.0:10012 -c gunicorn_config.py --log-level info -k geventwebsocket.gunicorn.workers.GeventWebSocketWorker app:app" lint = "python -m flake8" lintjs = "eslint js/src" @@ -59,5 +39,6 @@ push = "docker push pythondiscord/site:latest" pushbase = "docker push pythondiscord/site-base:latest" pushci = "docker push pythondiscord/site-ci:latest" -rundev = "python app.py" -test = "py.test tests --cov pysite --cov-report term-missing -v" +#rundev = "python app.py" +#test = "py.test tests --cov pysite --cov-report term-missing -v" + diff --git a/Pipfile.lock b/Pipfile.lock index bdd6121c..6567ef95 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,340 +1,46 @@ { "_meta": { "hash": { - "sha256": "0555e89a9c14fd589e6a844f4f8a19926ab8e1747134623f4b71ecdfa7a25ebf" + "sha256": "d002ebbb384d9d2782cb4843616ec47687d188787612e8f4dab3e700ce25571e" }, "pipfile-spec": 6, "requires": { - "python_version": "3.6" + "python_version": "3.7" }, "sources": [ { "name": "pypi", - "url": "https://pypi.python.org/simple", + "url": "https://pypi.org/simple", "verify_ssl": true } ] }, "default": { - "amqp": { + "django": { "hashes": [ - "sha256:073dd02fdd73041bffc913b767866015147b61f2a9bc104daef172fc1a0066eb", - "sha256:eed41946890cd43e8dee44a316b85cf6fee5a1a34bb4a562b660a358eb529e1b" - ], - "version": "==2.3.2" - }, - "certifi": { - "hashes": [ - "sha256:13e698f54293db9f89122b0581843a782ad0934a4fe0172d2a980ba77fc61bb7", - "sha256:9fa520c1bacfb634fa7af20a76bcbd3d5fb390481724c597da32c719a7dca4b0" - ], - "version": "==2018.4.16" - }, - "chardet": { - "hashes": [ - "sha256:84ab92ed1c4d4f16916e05906b6b75a6c0fb5db821cc65e70cbd64a3e2a5eaae", - "sha256:fc323ffcaeaed0e0a02bf4d117757b98aed530d9ed4531e3e15460124c106691" - ], - "version": "==3.0.4" - }, - "click": { - "hashes": [ - "sha256:29f99fc6125fbc931b758dc053b3114e55c77a6e4c6c3a2674a2dc986016381d", - "sha256:f15516df478d5a56180fbf80e68f206010e6d160fc39fa508b65e035fd75130b" - ], - "version": "==6.7" - }, - "docutils": { - "hashes": [ - "sha256:02aec4bd92ab067f6ff27a38a38a41173bf01bed8f89157768c1573f53e474a6", - "sha256:51e64ef2ebfb29cae1faa133b3710143496eca21c530f3f71424d77687764274", - "sha256:7a4bd47eaf6596e1295ecb11361139febe29b084a87bf005bf899f9a42edc3c6" - ], - "index": "pypi", - "version": "==0.14" - }, - "flask": { - "hashes": [ - "sha256:0749df235e3ff61ac108f69ac178c9770caeaccad2509cb762ce1f65570a8856", - "sha256:49f44461237b69ecd901cc7ce66feea0319b9158743dd27a2899962ab214dac1" - ], - "index": "pypi", - "version": "==0.12.2" - }, - "flask-dance": { - "hashes": [ - "sha256:02bae709a0ad975cd6d5fba18a4d78b710602b29b2774338559405911ab758ec", - "sha256:043e3381087589e2ba5b7d1eacaf8a8b5b13cb7f8fab3303547795e0cdc3a011", - "sha256:877037105d1b66556dbfcc0c3711a3969bc71ee98235a46f4650beca53208b48" - ], - "index": "pypi", - "version": "==1.0.0" - }, - "flask-sockets": { - "hashes": [ - "sha256:072927da8edca0e81e024f5787e643c87d80b351b714de95d723becb30e0643b", - "sha256:350a76d55f5889f64afd2ca9b32f262680b7960965f0830365576307d30cfe1e" - ], - "index": "pypi", - "version": "==0.2.1" - }, - "flask-wtf": { - "hashes": [ - "sha256:5d14d55cfd35f613d99ee7cba0fc3fbbe63ba02f544d349158c14ca15561cc36", - "sha256:d9a9e366b32dcbb98ef17228e76be15702cd2600675668bca23f63a7947fd5ac" - ], - "index": "pypi", - "version": "==0.14.2" - }, - "gevent": { - "hashes": [ - "sha256:0901975628790e8a57fc92bb7062e5b856edea48c8de9caf36cfda14eae07329", - "sha256:1af93825db5753550fa8ff5ab2f2132e8733170b3f8d38347b34fa4a984cb624", - "sha256:2ff045a91509c35664c27a849c8cbf742a227f587b7cdbc88301e9c85dcaedff", - "sha256:33fa6759eabc9176ddbe0d29b66867a82e19a61f06eb7cfabbac35343c0ecf24", - "sha256:35790f1a3c8e431ada3471b70bb2105050009ea4beb15cbe41b86bc716a7ffa9", - "sha256:4791c8ae9c57d6f153354736e1ccab1e2baf6c8d9ae5a77a9ac90f41e2966b2d", - "sha256:4f098002126ebef7f2907188b6c8b09e5193161ce968847d9e6a8bc832b0db9a", - "sha256:552719cec4721673b8c7d2f9de666e3f7591b9b182f801ecaef1c76e638052aa", - "sha256:59e9237af027f8db85e5d78a9da2e328ae96f01d67a0d62abcecad3db7876908", - "sha256:60109741377367eef8ded9283a1bf629621b73acaf3e1e8aac9d1a0f50fa0f05", - "sha256:6892fabc9051e8c0a171d543b6536859aabeb6d169db79b2f45d64dc2a15808c", - "sha256:70558dd45c7a1f8046ba45792e489dd0f409bd8a3b7a0635ca9d3055223b3dff", - "sha256:74bce0c30bb2240e3d5d515ba8cb3eadf840c2bde7109a1979c7a26c9d0f5a6a", - "sha256:7f93b67b680f4a921f517294048d05f8f6f0ed5962b78d6685a6cf0fcd7d8202", - "sha256:81cb24e0f7bd9888596364e8d8ed0d65c2547c84884c67bb46d956faeed67396", - "sha256:833bebdc36bfeeedefc200ca9aee9b8eddd80f56b63ca1e886e18b97b1240edd", - "sha256:8a710eddb3e9e5f22bdbd458b5f211b94f59409ecd6896f15b9fee2cba266a59", - "sha256:9b492bb1a043540abb6e54fdb5537531e24962ca49c09f3b47dc4f9c37f6297c", - "sha256:a0ed8ba787b9c0c1c565c2675d71652e6c1e2d4e91f53530860d0303e867fe85", - "sha256:a16db4f56699ef07f0249b953ff949aae641e50b2bdc4710f11c0d8d9089b296", - "sha256:a66cf99f08da65c501826a19e30f5a6e7ba942fdd79baba5ce2d51eebaa13444", - "sha256:b67a10799923f9fed546ca5f8b93a2819c71a60132d7a97b4a13fbdab66b278a", - "sha256:b7e0e6400c2f3ce78a9ae1cdd55b53166feedd003d60c033863881227129a4d3", - "sha256:c35b29de49211014ec66d056fd4f9ba7a04795e2a654697f72879c0cf365d6d4", - "sha256:c9dd6534c46ed782e2d7236767cd07115cb29ce8670c2fc0794f264de9024fe0", - "sha256:de13a8e378103af84a8bf6015ad1d2761d46f29b8393e8dd6d9bb7cb51bbb713", - "sha256:deafd70d04ab62428d4e291e8e2c0fb22f38690e6a9f23a67ee6c304087634da", - "sha256:df52e06a2754c2d905aad75a7dc06a732c804d9edbc87f06f47c8f483ba98bca", - "sha256:fce894a64db3911897cdad6c37fbb23dfb18b7bf8b9cb8c00a8ea0a7253651c9" - ], - "index": "pypi", - "version": "==1.2.2" - }, - "gevent-websocket": { - "hashes": [ - "sha256:17b67d91282f8f4c973eba0551183fc84f56f1c90c8f6b6b30256f31f66f5242", - "sha256:7eaef32968290c9121f7c35b973e2cc302ffb076d018c9068d2f5ca8b2d85fb0" - ], - "index": "pypi", - "version": "==0.10.1" - }, - "greenlet": { - "hashes": [ - "sha256:09ef2636ea35782364c830f07127d6c7a70542b178268714a9a9ba16318e7e8b", - "sha256:0fef83d43bf87a5196c91e73cb9772f945a4caaff91242766c5916d1dd1381e4", - "sha256:1b7df09c6598f5cfb40f843ade14ed1eb40596e75cd79b6fa2efc750ba01bb01", - "sha256:1fff21a2da5f9e03ddc5bd99131a6b8edf3d7f9d6bc29ba21784323d17806ed7", - "sha256:42118bf608e0288e35304b449a2d87e2ba77d1e373e8aa221ccdea073de026fa", - "sha256:50643fd6d54fd919f9a0a577c5f7b71f5d21f0959ab48767bd4bb73ae0839500", - "sha256:58798b5d30054bb4f6cf0f712f08e6092df23a718b69000786634a265e8911a9", - "sha256:5b49b3049697aeae17ef7bf21267e69972d9e04917658b4e788986ea5cc518e8", - "sha256:75c413551a436b462d5929255b6dc9c0c3c2b25cbeaee5271a56c7fda8ca49c0", - "sha256:769b740aeebd584cd59232be84fdcaf6270b8adc356596cdea5b2152c82caaac", - "sha256:ad2383d39f13534f3ca5c48fe1fc0975676846dc39c2cece78c0f1f9891418e0", - "sha256:b417bb7ff680d43e7bd7a13e2e08956fa6acb11fd432f74c97b7664f8bdb6ec1", - "sha256:b6ef0cabaf5a6ecb5ac122e689d25ba12433a90c7b067b12e5f28bdb7fb78254", - "sha256:c2de19c88bdb0366c976cc125dca1002ec1b346989d59524178adfd395e62421", - "sha256:c7b04a6dc74087b1598de8d713198de4718fa30ec6cbb84959b26426c198e041", - "sha256:f8f2a0ae8de0b49c7b5b2daca4f150fdd9c1173e854df2cce3b04123244f9f45", - "sha256:fcfadaf4bf68a27e5dc2f42cbb2f4b4ceea9f05d1d0b8f7787e640bed2801634" - ], - "version": "==0.4.13" - }, - "gunicorn": { - "hashes": [ - "sha256:7ef2b828b335ed58e3b64ffa84caceb0a7dd7c5ca12f217241350dec36a1d5dc", - "sha256:bc59005979efb6d2dd7d5ba72d99f8a8422862ad17ff3a16e900684630dd2a10" - ], - "index": "pypi", - "version": "==19.8.1" - }, - "idna": { - "hashes": [ - "sha256:2c6a5de3089009e3da7c5dde64a141dbc8551d5b7f6cf4ed7c2568d0cc520a8f", - "sha256:8c7309c718f94b3a625cb648ace320157ad16ff131ae0af362c9f21b80ef6ec4" - ], - "version": "==2.6" - }, - "itsdangerous": { - "hashes": [ - "sha256:cbb3fcf8d3e33df861709ecaf89d9e6629cff0a217bc2848f1b41cd30d360519" - ], - "version": "==0.24" - }, - "jinja2": { - "hashes": [ - "sha256:74c935a1b8bb9a3947c50a54766a969d4846290e1e788ea44c1392163723c3bd", - "sha256:f84be1bb0040caca4cea721fcbbbbd61f9be9464ca236387158b0feea01914a4" - ], - "version": "==2.10" - }, - "kombu": { - "hashes": [ - "sha256:86adec6c60f63124e2082ea8481bbe4ebe04fde8ebed32c177c7f0cd2c1c9082", - "sha256:b274db3a4eacc4789aeb24e1de3e460586db7c4fc8610f7adcc7a3a1709a60af" - ], - "index": "pypi", - "version": "==4.2.1" - }, - "lazy": { - "hashes": [ - "sha256:c80a77bf7106ba7b27378759900cfefef38271088dc63b014bcfe610c8e68e3d" - ], - "version": "==1.3" - }, - "librabbitmq": { - "hashes": [ - "sha256:3116e40c02d4285b8dd69834e4cbcb1a89ea534ca9147e865f11d44e7cc56eea", - "sha256:5cdfb473573396d43d54cef9e9b4c74fa3d1516da51d04a7b261f6ef4e0bd8be", - "sha256:98e355f486964dadae7e8b51c9a60e9aa0653bbe27f6b14542687f305c4c3652", - "sha256:c2a8113d3c831808d1d940fdf43e4882636a1efe2864df7ab3bb709a45016b37", - "sha256:cd9cc09343b193d7cf2cff6c6a578061863bd986a4bdf38f922e9dc32e15d944", - "sha256:ffa2363a860ab5dcc3ce3703247e05e940c73d776c03a3f3f9deaf3cf43bb96c" - ], - "index": "pypi", - "version": "==2.0.0" - }, - "logmatic-python": { - "hashes": [ - "sha256:0c15ac9f5faa6a60059b28910db642c3dc7722948c3cc940923f8c9039604342" - ], - "index": "pypi", - "version": "==0.1.7" - }, - "markupsafe": { - "hashes": [ - "sha256:a6be69091dac236ea9c6bc7d012beab42010fa914c459791d627dad4910eb665" - ], - "version": "==1.0" - }, - "oauthlib": { - "hashes": [ - "sha256:ac35665a61c1685c56336bda97d5eefa246f1202618a1d6f34fccb1bdd404162", - "sha256:d883b36b21a6ad813953803edfa563b1b579d79ca758fe950d1bc9e8b326025b" - ], - "version": "==2.1.0" - }, - "pygments": { - "hashes": [ - "sha256:78f3f434bcc5d6ee09020f92ba487f95ba50f1e3ef83ae96b9d5ffa1bab25c5d", - "sha256:dbae1046def0efb574852fab9e90209b23f556367b5a320c0bcb871c77c3e8cc" - ], - "index": "pypi", - "version": "==2.2.0" - }, - "python-json-logger": { - "hashes": [ - "sha256:30999d1d742ecf6645991a2ce9273188505e98b713ad63be06aabff47dd1b3c4", - "sha256:8205cfe7061715de5cd1b37e3565d5b97d0ac13b30ff3ee612554abb6093d640" - ], - "version": "==0.1.8" - }, - "requests": { - "hashes": [ - "sha256:6a1b267aa90cac58ac3a765d067950e7dbbf75b1da07e895d1f594193a40a38b", - "sha256:9c443e7324ba5b85070c4a818ade28bfabedf16ea10206da1132edaa6dda237e" - ], - "index": "pypi", - "version": "==2.18.4" - }, - "requests-oauthlib": { - "hashes": [ - "sha256:8886bfec5ad7afb391ed5443b1f697c6f4ae98d0e5620839d8b4499c032ada3f", - "sha256:e21232e2465808c0e892e0e4dbb8c2faafec16ac6dc067dd546e9b466f3deac8", - "sha256:fe3282f48fb134ee0035712159f5429215459407f6d5484013343031ff1a400d" - ], - "version": "==1.0.0" - }, - "rethinkdb": { - "hashes": [ - "sha256:b5354ecd896b59065693e4139c067f401c9f57970268e9b93f83d869709d1c17" - ], - "index": "pypi", - "version": "==2.3.0.post6" - }, - "schema": { - "hashes": [ - "sha256:410f44cb025384959d20deef00b4e1595397fa30959947a4f0d92e9c84616f35", - "sha256:a058daf5d926e4ece9f13c4c2366a836143ca7913ef053c5023c569e00175b2a" + "sha256:7f246078d5a546f63c28fc03ce71f4d7a23677ce42109219c24c9ffb28416137", + "sha256:ea50d85709708621d956187c6b61d9f9ce155007b496dd914fdb35db8d790aec" ], "index": "pypi", - "version": "==0.6.7" - }, - "six": { - "hashes": [ - "sha256:70e8a77beed4562e7f14fe23a786b54f6296e34344c23bc42f07b15018ff98e9", - "sha256:832dc0e10feb1aa2c68dcc57dbb658f1c7e65b9b61af69048abc87a2db00a0eb" - ], - "version": "==1.11.0" + "version": "==2.1" }, - "ujson": { + "django-hosts": { "hashes": [ - "sha256:f66073e5506e91d204ab0c614a148d5aa938bdbf104751be66f8ad7a222f5f86" + "sha256:3599645f37b4c51df6140d659bef356e05ae7ff7748f8fef14c2c84083dd8089", + "sha256:8e83232dbd7ff0d9de5c814f16bdf4cd1971bd00c54fa1f3e507aed4f93215a8" ], "index": "pypi", - "version": "==1.35" - }, - "urllib3": { - "hashes": [ - "sha256:06330f386d6e4b195fbfc736b297f58c5a892e4440e54d294d7004e3a9bbea1b", - "sha256:cc44da8e1145637334317feebd728bd869a35285b93cbb4cca2577da7e62db4f" - ], - "version": "==1.22" + "version": "==3.0" }, - "urlobject": { + "pytz": { "hashes": [ - "sha256:47b2e20e6ab9c8366b2f4a3566b6ff4053025dad311c4bb71279bbcfa2430caa" + "sha256:a061aa0a9e06881eb8b3b2b43f05b9439d6583c206d0a6c340ff72a7b6669053", + "sha256:ffb9ef1de172603304d9d2819af6f5ece76f2e85ec10692a524dd876e72bf277" ], - "version": "==2.4.3" - }, - "vine": { - "hashes": [ - "sha256:52116d59bc45392af9fdd3b75ed98ae48a93e822cee21e5fda249105c59a7a72", - "sha256:6849544be74ec3638e84d90bc1cf2e1e9224cc10d96cd4383ec3f69e9bce077b" - ], - "version": "==1.1.4" - }, - "werkzeug": { - "hashes": [ - "sha256:c3fd7a7d41976d9f44db327260e263132466836cef6f91512889ed60ad26557c", - "sha256:d5da73735293558eb1651ee2fddc4d0dedcfa06538b8813a2e20011583c9e49b" - ], - "version": "==0.14.1" - }, - "wsaccel": { - "hashes": [ - "sha256:425706acf0724d2f6bfa391ec37b4ef121d3432c956029de3cea4e101c218e0c" - ], - "index": "pypi", - "version": "==0.6.2" - }, - "wtforms": { - "hashes": [ - "sha256:0cdbac3e7f6878086c334aa25dc5a33869a3954e9d1e015130d65a69309b3b61", - "sha256:e3ee092c827582c50877cdbd49e9ce6d2c5c1f6561f849b3b068c1b8029626f1" - ], - "version": "==2.2.1" + "version": "==2018.5" } }, "develop": { - "atomicwrites": { - "hashes": [ - "sha256:240831ea22da9ab882b551b31d4225591e5e447a68c5e188db5b89ca1d487585", - "sha256:a24da68318b08ac9c9c45029f4a10371ab5b20e4226738e150e6e7c571630ae6" - ], - "version": "==1.1.5" - }, "attrs": { "hashes": [ "sha256:4b90b09eeeb9b88c35bc642cbac057e45a5fd85367b985bd2809c62b7b939265", @@ -349,59 +55,6 @@ ], "version": "==1.4.0" }, - "certifi": { - "hashes": [ - "sha256:13e698f54293db9f89122b0581843a782ad0934a4fe0172d2a980ba77fc61bb7", - "sha256:9fa520c1bacfb634fa7af20a76bcbd3d5fb390481724c597da32c719a7dca4b0" - ], - "version": "==2018.4.16" - }, - "chardet": { - "hashes": [ - "sha256:84ab92ed1c4d4f16916e05906b6b75a6c0fb5db821cc65e70cbd64a3e2a5eaae", - "sha256:fc323ffcaeaed0e0a02bf4d117757b98aed530d9ed4531e3e15460124c106691" - ], - "version": "==3.0.4" - }, - "click": { - "hashes": [ - "sha256:29f99fc6125fbc931b758dc053b3114e55c77a6e4c6c3a2674a2dc986016381d", - "sha256:f15516df478d5a56180fbf80e68f206010e6d160fc39fa508b65e035fd75130b" - ], - "version": "==6.7" - }, - "coverage": { - "hashes": [ - "sha256:00d464797a236f654337181af72b4baea3d35d056ca480e45e9163bb5df496b8", - "sha256:0a90afa6f5ea08889da9066dca3ce2ef85d47587e3f66ca06a4fa8d3a0053acc", - "sha256:0ba6c4345e3c197f6a3ba924d155c402ad28c080ac0d79529493eb17582fbc41", - "sha256:2be3748f45d2eb0259c3c93abccc15c10725ef715bf0817a4c0a1a1dad2abc6a", - "sha256:50727512afe77e044c7d7f2fd4cd0fe62b06527f965b335a810d956748e0514d", - "sha256:6c2fd127cd4e2decb0ab41fe3ac2948b87ad2ea0470e24b4be5f7e7fdfef8df3", - "sha256:6ed521ed3800d8f8911642b9b3c3891780a929db5e572c88c4713c1032530f82", - "sha256:76a73a48a308fb87a4417d630b0345d36166f489ef17ea5aa8e4596fb50a2296", - "sha256:7eaa0a33423476ed63317ee0a53cc07c0e36b5a390e3e95b95152e7eb6b3a6f6", - "sha256:845d0f8a1765074b3256f07ddbce2969e5a5316dfd0eb3289137010d7677326a", - "sha256:85b1275b6d7a61ccc8024a4e9a4c9e896394776edce1a5d075ec116f91925462", - "sha256:8e60e720cad3ee6b0a32f475ae4040552c5623870a9ca0d3d4263faa89a8d96b", - "sha256:93c50475f189cd226e9688b9897a0cd3c4c5d9c90b1733fa8f6445cfc0182c51", - "sha256:94c1e66610807a7917d967ed6415b9d5fde7487ab2a07bb5e054567865ef6ef0", - "sha256:964f86394cb4d0fd2bb40ffcddca321acf4323b48d1aa5a93db8b743c8a00f79", - "sha256:99043494b28d6460035dd9410269cdb437ee460edc7f96f07ab45c57ba95e651", - "sha256:addf63b5e39d573c459c3930b25176146395c1dc1afce4710067bb5e6dc4ea58", - "sha256:af2f59ce312523c384a7826821cae0b95f320fee1751387abba4f00eed737166", - "sha256:af6ed80340e5e1b89fa794f730ce7597651fbda3312e500002688b679c184ef9", - "sha256:beb96d32ce8cfa47ec6433d95a33e4afaa97c19ac1b4a47ea40a424fedfee7c2", - "sha256:c00bac0f6b35b82ace069a6a0d88e8fd4cd18d964fc5e47329cd02b212397fbe", - "sha256:d079e36baceea9707fd50b268305654151011274494a33c608c075808920eda8", - "sha256:d3188345f1c7161d701fd2ea9150f9bb6e2df890f3ddd6c0aea1f525e21d1544", - "sha256:e65c78bde155a734f0d624647c4d6e0f47fb4875355a0b95c37d537788737f4f", - "sha256:e813cba9ff0e3d37ad31dc127fac85d23f9a26d0461ef8042ac4539b2045e781", - "sha256:e96c13a40df389ce8cbb5ec108e5fb834989d1bedff5d8846e5aa3d270a5f3b6", - "sha256:ee2338539157cfc35fb1d6757dd799126804df39393c4a6c5fe88b402c8c0ab4" - ], - "version": "==4.0.3" - }, "flake8": { "hashes": [ "sha256:7253265f7abd8b313e3892944044a365e3f4ac3fcdcfb4298f55ee9ddf188ba0", @@ -428,11 +81,11 @@ }, "flake8-import-order": { "hashes": [ - "sha256:40d2a39ed91e080f3285f4c16256b252d7c31070e7f11b7854415bb9f924ea81", - "sha256:68d430781a9ef15c85a0121500cf8462f1a4bc7672acb2a32bfdbcab044ae0b7" + "sha256:9be5ca10d791d458eaa833dd6890ab2db37be80384707b0f76286ddd13c16cbf", + "sha256:feca2fd0a17611b33b7fa84449939196c2c82764e262486d5c3e143ed77d387b" ], "index": "pypi", - "version": "==0.17.1" + "version": "==0.18" }, "flake8-polyfill": { "hashes": [ @@ -457,54 +110,19 @@ "index": "pypi", "version": "==1.1.0" }, - "flask": { - "hashes": [ - "sha256:0749df235e3ff61ac108f69ac178c9770caeaccad2509cb762ce1f65570a8856", - "sha256:49f44461237b69ecd901cc7ce66feea0319b9158743dd27a2899962ab214dac1" - ], - "index": "pypi", - "version": "==0.12.2" - }, - "flask-testing": { - "hashes": [ - "sha256:dc076623d7d850653a018cb64f500948334c8aeb6b10a5a842bf1bcfb98122bc" - ], - "index": "pypi", - "version": "==0.7.1" - }, "gitdb2": { "hashes": [ - "sha256:b60e29d4533e5e25bb50b7678bbc187c8f6bcff1344b4f293b2ba55c85795f09", - "sha256:cf9a4b68e8c4da8d42e48728c944ff7af2d8c9db303ac1ab32eac37aa4194b0e" + "sha256:87783b7f4a8f6b71c7fe81d32179b3c8781c1a7d6fa0c69bff2f315b00aff4f8", + "sha256:bb4c85b8a58531c51373c89f92163b92f30f81369605a67cd52d1fc21246c044" ], - "version": "==2.0.3" + "version": "==2.0.4" }, "gitpython": { "hashes": [ - "sha256:1ec4c44846cf76a1e55769560673a97731849c9d05401e035e607495f10db959", - "sha256:b60b045cf64a321e5b620debb49890099fa6c7be6dfb7fb249027e5d34227301" - ], - "version": "==2.1.10" - }, - "idna": { - "hashes": [ - "sha256:2c6a5de3089009e3da7c5dde64a141dbc8551d5b7f6cf4ed7c2568d0cc520a8f", - "sha256:8c7309c718f94b3a625cb648ace320157ad16ff131ae0af362c9f21b80ef6ec4" - ], - "version": "==2.6" - }, - "itsdangerous": { - "hashes": [ - "sha256:cbb3fcf8d3e33df861709ecaf89d9e6629cff0a217bc2848f1b41cd30d360519" - ], - "version": "==0.24" - }, - "jinja2": { - "hashes": [ - "sha256:74c935a1b8bb9a3947c50a54766a969d4846290e1e788ea44c1392163723c3bd", - "sha256:f84be1bb0040caca4cea721fcbbbbd61f9be9464ca236387158b0feea01914a4" + "sha256:563221e5a44369c6b79172f455584c9ebbb122a13368cc82cb4b5addff788f82", + "sha256:8237dc5bfd6f1366abeee5624111b9d6879393d84745a507de0fda86043b65a8" ], - "version": "==2.10" + "version": "==2.1.11" }, "libsass": { "hashes": [ @@ -519,6 +137,7 @@ "sha256:727fb84326ffa930bc09fad8b706e77ada4d13b3adf35cce134962a434d7eccb", "sha256:7b9e7179b5f4fc32bc716f86e9ccaeb48ab90e7eb6648b339440346733af8828", "sha256:a0ffca466b35fb57f2afe1f1c5fd39b4c51a4107596d28ef8c0d3bb0962244b5", + "sha256:bb9735066391189b3c0383254d20d59aaafb438d632d7de551c264f16486e773", "sha256:cbd5ee83d3603a2b2c2937d8f06acc07b30fd22642ea2460c966d4fd6217f1d0", "sha256:de1eae502764b3dde294d6652a0046489cf31008de190c4dd8d05e7f4b5e0d71", "sha256:e00b6c6d75a6e912990cbc23d48ddfdbfefc3e400c20be6593988839292248c5", @@ -527,12 +146,6 @@ "index": "pypi", "version": "==0.14.5" }, - "markupsafe": { - "hashes": [ - "sha256:a6be69091dac236ea9c6bc7d012beab42010fa914c459791d627dad4910eb665" - ], - "version": "==1.0" - }, "mccabe": { "hashes": [ "sha256:ab8a6258860da4b6677da4bd2fe5dc2c659cff31b3ee4f7f5d64e79735b80d42", @@ -540,35 +153,12 @@ ], "version": "==0.6.1" }, - "more-itertools": { - "hashes": [ - "sha256:2b6b9893337bfd9166bee6a62c2b0c9fe7735dcf85948b387ec8cba30e85d8e8", - "sha256:6703844a52d3588f951883005efcf555e49566a48afd4db4e965d69b883980d3", - "sha256:a18d870ef2ffca2b8463c0070ad17b5978056f403fb64e3f15fe62a52db21cc0" - ], - "version": "==4.2.0" - }, "pbr": { "hashes": [ - "sha256:3747c6f017f2dc099986c325239661948f9f5176f6880d9fdef164cb664cd665", - "sha256:a9c27eb8f0e24e786e544b2dbaedb729c9d8546342b5a6818d8eda098ad4340d" - ], - "version": "==4.0.4" - }, - "pluggy": { - "hashes": [ - "sha256:7f8ae7f5bdf75671a718d2daf0a64b7885f74510bcd98b1a0bb420eb9a9d0cff", - "sha256:d345c8fe681115900d6da8d048ba67c25df42973bda370783cd58826442dcd7c", - "sha256:e160a7fcf25762bb60efc7e171d4497ff1d8d2d75a3d0df7a21b76821ecbf5c5" - ], - "version": "==0.6.0" - }, - "py": { - "hashes": [ - "sha256:29c9fab495d7528e80ba1e343b958684f4ace687327e6f789a94bf3d1915f881", - "sha256:983f77f3331356039fdd792e9220b7b8ee1aa6bd2b25f567a963ff1de5a64f6a" + "sha256:1b8be50d938c9bb75d0eaf7eda111eec1bf6dc88a62a6412e33bf077457e0f45", + "sha256:b486975c0cafb6beeb50ca0e17ba047647f229087bd74e37f4a7e2cac17d2caa" ], - "version": "==1.5.3" + "version": "==4.2.0" }, "pycodestyle": { "hashes": [ @@ -584,56 +174,21 @@ ], "version": "==1.6.0" }, - "pytest": { - "hashes": [ - "sha256:26838b2bc58620e01675485491504c3aa7ee0faf335c37fcd5f8731ca4319591", - "sha256:32c49a69566aa7c333188149ad48b58ac11a426d5352ea3d8f6ce843f88199cb" - ], - "index": "pypi", - "version": "==3.6.1" - }, - "pytest-cov": { - "hashes": [ - "sha256:03aa752cf11db41d281ea1d807d954c4eda35cfa1b21d6971966cc041bbf6e2d", - "sha256:890fe5565400902b0c78b5357004aab1c814115894f4f21370e2433256a3eeec" - ], - "index": "pypi", - "version": "==2.5.1" - }, - "python-coveralls": { - "hashes": [ - "sha256:1748272081e0fc21e2c20c12e5bd18cb13272db1b130758df0d473da0cb31087", - "sha256:736dda01f64beda240e1500d5f264b969495b05fcb325c7c0eb7ebbfd1210b70" - ], - "index": "pypi", - "version": "==2.9.1" - }, "pyyaml": { "hashes": [ - "sha256:0c507b7f74b3d2dd4d1322ec8a94794927305ab4cebbe89cc47fe5e81541e6e8", - "sha256:16b20e970597e051997d90dc2cddc713a2876c47e3d92d59ee198700c5427736", - "sha256:3262c96a1ca437e7e4763e2843746588a965426550f3797a79fca9c6199c431f", - "sha256:326420cbb492172dec84b0f65c80942de6cedb5233c413dd824483989c000608", - "sha256:4474f8ea030b5127225b8894d626bb66c01cda098d47a2b0d3429b6700af9fd8", - "sha256:592766c6303207a20efc445587778322d7f73b161bd994f227adaa341ba212ab", - "sha256:5ac82e411044fb129bae5cfbeb3ba626acb2af31a8d17d175004b70862a741a7", - "sha256:5f84523c076ad14ff5e6c037fe1c89a7f73a3e04cf0377cb4d017014976433f3", - "sha256:827dc04b8fa7d07c44de11fabbc888e627fa8293b695e0f99cb544fdfa1bf0d1", - "sha256:b4c423ab23291d3945ac61346feeb9a0dc4184999ede5e7c43e1ffb975130ae6", - "sha256:bc6bced57f826ca7cb5125a10b23fd0f2fff3b7c4701d64c439a300ce665fff8", - "sha256:c01b880ec30b5a6e6aa67b09a2fe3fb30473008c85cd6a67359a1b15ed6d83a4", - "sha256:ca233c64c6e40eaa6c66ef97058cdc80e8d0157a443655baa1b2966e812807ca", - "sha256:e863072cdf4c72eebf179342c94e6989c67185842d9997960b3e69290b2fa269" - ], - "version": "==3.12" - }, - "requests": { - "hashes": [ - "sha256:6a1b267aa90cac58ac3a765d067950e7dbbf75b1da07e895d1f594193a40a38b", - "sha256:9c443e7324ba5b85070c4a818ade28bfabedf16ea10206da1132edaa6dda237e" + "sha256:3d7da3009c0f3e783b2c873687652d83b1bbfd5c88e9813fb7e5b03c0dd3108b", + "sha256:3ef3092145e9b70e3ddd2c7ad59bdd0252a94dfe3949721633e41344de00a6bf", + "sha256:40c71b8e076d0550b2e6380bada1f1cd1017b882f7e16f09a65be98e017f211a", + "sha256:558dd60b890ba8fd982e05941927a3911dc409a63dcb8b634feaa0cda69330d3", + "sha256:a7c28b45d9f99102fa092bb213aa12e0aaf9a6a1f5e395d36166639c1f96c3a1", + "sha256:aa7dd4a6a427aed7df6fb7f08a580d68d9b118d90310374716ae90b710280af1", + "sha256:bc558586e6045763782014934bfaf39d48b8ae85a2713117d16c39864085c613", + "sha256:d46d7982b62e0729ad0175a9bc7e10a566fc07b224d2c79fafb5e032727eaa04", + "sha256:d5eef459e30b09f5a098b9cea68bebfeb268697f78d647bd255a085371ac7f3f", + "sha256:e01d3203230e1786cd91ccfdc8f8454c8069c91bee3962ad93b87a4b2860f537", + "sha256:e170a9e6fcfd19021dd29845af83bb79236068bf5fd4df3327c1be18182b2531" ], - "index": "pypi", - "version": "==2.18.4" + "version": "==3.13" }, "six": { "hashes": [ @@ -644,31 +199,17 @@ }, "smmap2": { "hashes": [ - "sha256:b78ee0f1f5772d69ff50b1cbdb01b8c6647a8354f02f23b488cf4b2cfc923956", - "sha256:c7530db63f15f09f8251094b22091298e82bf6c699a6b8344aaaef3f2e1276c3" + "sha256:0dd53d991af487f9b22774fa89451358da3607c02b9b886a54736c6a313ece0b", + "sha256:dc216005e529d57007ace27048eb336dcecb7fc413cfb3b2f402bb25972b69c6" ], - "version": "==2.0.3" + "version": "==2.0.4" }, "stevedore": { "hashes": [ - "sha256:e3d96b2c4e882ec0c1ff95eaebf7b575a779fd0ccb4c741b9832bed410d58b3d", - "sha256:f1c7518e7b160336040fee272174f1f7b29a46febb3632502a8f2055f973d60b" - ], - "version": "==1.28.0" - }, - "urllib3": { - "hashes": [ - "sha256:06330f386d6e4b195fbfc736b297f58c5a892e4440e54d294d7004e3a9bbea1b", - "sha256:cc44da8e1145637334317feebd728bd869a35285b93cbb4cca2577da7e62db4f" - ], - "version": "==1.22" - }, - "werkzeug": { - "hashes": [ - "sha256:c3fd7a7d41976d9f44db327260e263132466836cef6f91512889ed60ad26557c", - "sha256:d5da73735293558eb1651ee2fddc4d0dedcfa06538b8813a2e20011583c9e49b" + "sha256:1e153545aca7a6a49d8337acca4f41c212fbfa60bf864ecd056df0cafb9627e8", + "sha256:c7eac1c0d95824c88b655273da5c17cdde6482b2739f47c30bf851dcc9d3c2c0" ], - "version": "==0.14.1" + "version": "==1.29.0" } } } diff --git a/app.py b/app.py deleted file mode 100644 index 5e55bc07..00000000 --- a/app.py +++ /dev/null @@ -1,13 +0,0 @@ -from os import environ - -from pysite.route_manager import RouteManager - -manager = RouteManager() -app = manager.app - -debug = environ.get('TEMPLATES_AUTO_RELOAD', "no") -if debug == "yes": - app.jinja_env.auto_reload = True - -if __name__ == '__main__': - manager.run() diff --git a/gunicorn_config.py b/gunicorn_config.py deleted file mode 100644 index 4814f5bf..00000000 --- a/gunicorn_config.py +++ /dev/null @@ -1,76 +0,0 @@ -import re - -from kombu import Connection - -from pysite.constants import ( - BOT_EVENT_QUEUE, BotEventTypes, CHANNEL_DEV_LOGS, DEBUG_MODE, - RMQ_HOST, RMQ_PASSWORD, RMQ_PORT, RMQ_USERNAME -) -from pysite.migrations.runner import run_migrations -from pysite.queues import QUEUES -from pysite.service_discovery import wait_for_rmq - -STRIP_REGEX = re.compile(r"<[^<]+?>") -WIKI_TABLE = "wiki" - - -def when_ready(server=None): - _when_ready(server=server) - - -def _when_ready(server=None, output_func=None): - """ server hook that only runs when the gunicorn master process loads """ - - if server: - output = server.log.info - elif output_func: - output = output_func - else: - output = print - - output("Creating tables...") - - from pysite.database import RethinkDB - - db = RethinkDB(loop_type=None) - db.conn = db.get_connection() - - # Create any table that doesn't exist - created = db.create_tables() - if created: - tables = ", ".join([f"{table}" for table in created]) - output(f"Created the following tables: {tables}") - - run_migrations(db, output=output) - - output("Waiting for RabbitMQ...") - - has_rmq = wait_for_rmq() - - if not has_rmq: - output("Timed out while waiting for RabbitMQ") - else: - output("RabbitMQ found, declaring RabbitMQ queues...") - - try: - with Connection(hostname=RMQ_HOST, userid=RMQ_USERNAME, password=RMQ_PASSWORD, port=RMQ_PORT) as c: - with c.channel() as channel: - for name, queue in QUEUES.items(): - queue.declare(channel=channel) - output(f"Queue declared: {name}") - - if not DEBUG_MODE: - producer = c.Producer() - producer.publish( - { - "event": BotEventTypes.send_embed.value, - "data": { - "target": CHANNEL_DEV_LOGS, - "title": "Site Deployment", - "description": "The site has been deployed!" - } - }, - routing_key=BOT_EVENT_QUEUE - ) - except Exception as e: - output(f"Failed to declare RabbitMQ Queues: {e}") diff --git a/manage.py b/manage.py new file mode 100755 index 00000000..4688df77 --- /dev/null +++ b/manage.py @@ -0,0 +1,15 @@ +#!/usr/bin/env python +import os +import sys + +if __name__ == '__main__': + os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'pydis_django.settings') + try: + from django.core.management import execute_from_command_line + except ImportError as exc: + raise ImportError( + "Couldn't import Django. Are you sure it's installed and " + "available on your PYTHONPATH environment variable? Did you " + "forget to activate a virtual environment?" + ) from exc + execute_from_command_line(sys.argv) diff --git a/pydis_django/__init__.py b/pydis_django/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/pydis_django/hosts.py b/pydis_django/hosts.py new file mode 100644 index 00000000..898902dc --- /dev/null +++ b/pydis_django/hosts.py @@ -0,0 +1,15 @@ +from django.conf import settings +from django_hosts import host, patterns + +host_patterns = patterns( + "pydis_django.urls", + + # > | Subdomain | URL Module | Host entry name | + host(r"admin", "admin", name="admin"), + host(r"api", "api", name="api"), + host(r"staff", "staff", name="staff"), + host(r"wiki", "wiki", name="wiki"), + host(r"ws", "ws", name="ws"), + + host(r".*", "main", name=settings.DEFAULT_HOST) +) diff --git a/pydis_django/settings.py b/pydis_django/settings.py new file mode 100644 index 00000000..657fef3b --- /dev/null +++ b/pydis_django/settings.py @@ -0,0 +1,140 @@ +""" +Django settings for pydis_django project. + +Generated by 'django-admin startproject' using Django 2.1. + +For more information on this file, see +https://docs.djangoproject.com/en/2.1/topics/settings/ + +For the full list of settings and their values, see +https://docs.djangoproject.com/en/2.1/ref/settings/ +""" + +import os + +# Build paths inside the project like this: os.path.join(BASE_DIR, ...) +BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) + + +# Quick-start development settings - unsuitable for production +# See https://docs.djangoproject.com/en/2.1/howto/deployment/checklist/ + +# SECURITY WARNING: keep the secret key used in production secret! +SECRET_KEY = os.getenv("SECRET_KEY", "+_x00w3e94##2-qm-v(5&-x_@*l3t9zlir1etu+7$@4%!it2##") + +ALLOWED_HOSTS = ["pythondiscord.com"] + + +# Application definition + +INSTALLED_APPS = [ + "django.contrib.admin", + "django.contrib.auth", + "django.contrib.contenttypes", + "django.contrib.sessions", + "django.contrib.messages", + "django.contrib.staticfiles", + + "django_hosts", +] + +MIDDLEWARE = [ + "django_hosts.middleware.HostsRequestMiddleware", + + "django.middleware.security.SecurityMiddleware", + "django.contrib.sessions.middleware.SessionMiddleware", + "django.middleware.common.CommonMiddleware", + "django.middleware.csrf.CsrfViewMiddleware", + "django.contrib.auth.middleware.AuthenticationMiddleware", + "django.contrib.messages.middleware.MessageMiddleware", + "django.middleware.clickjacking.XFrameOptionsMiddleware", + + "django_hosts.middleware.HostsResponseMiddleware", +] +ROOT_URLCONF = "pydis_django.urls.main" + +TEMPLATES = [ + { + "APP_DIRS": True, + "BACKEND": "django.template.backends.jinja2.Jinja2", + "DIRS": [os.path.join(BASE_DIR, "templates")], + + "OPTIONS": { + "builtins": [ + "django_hosts.templatetags.hosts_override", + ], + + "context_processors": [ + "django.template.context_processors.debug", + "django.template.context_processors.request", + "django.contrib.auth.context_processors.auth", + "django.contrib.messages.context_processors.messages", + ], + }, + }, +] + +WSGI_APPLICATION = "pydis_django.wsgi.application" + + +# Database +# https://docs.djangoproject.com/en/2.1/ref/settings/#databases + +DATABASES = { + "default": { + "ENGINE": "django.db.backends.sqlite3", + "NAME": os.path.join(BASE_DIR, "db.sqlite3"), + } +} + + +# Password validation +# https://docs.djangoproject.com/en/2.1/ref/settings/#auth-password-validators + +AUTH_PASSWORD_VALIDATORS = [ + { + "NAME": "django.contrib.auth.password_validation.UserAttributeSimilarityValidator", + }, + { + "NAME": "django.contrib.auth.password_validation.MinimumLengthValidator", + }, + { + "NAME": "django.contrib.auth.password_validation.CommonPasswordValidator", + }, + { + "NAME": "django.contrib.auth.password_validation.NumericPasswordValidator", + }, +] + + +# Internationalization +# https://docs.djangoproject.com/en/2.1/topics/i18n/ + +LANGUAGE_CODE = "en-us" + +TIME_ZONE = "UTC" + +USE_I18N = True + +USE_L10N = True + +USE_TZ = True + + +# Static files (CSS, JavaScript, Images) +# https://docs.djangoproject.com/en/2.1/howto/static-files/ + +STATIC_URL = "/static/" + +# Custom settings + +DEBUG = False +DEFAULT_HOST = "main" +PARENT_HOST = "pythondiscord.com" + +if os.getenv("DEBUG") is not None: # Debug mode + ALLOWED_HOSTS = ["pythondiscord.local"] + DEBUG = True + PARENT_HOST = "pythondiscord.local:8000" + +ROOT_HOSTCONF = "pydis_django.hosts" diff --git a/pydis_django/urls/__init__.py b/pydis_django/urls/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/pydis_django/urls/admin.py b/pydis_django/urls/admin.py new file mode 100644 index 00000000..dfc73621 --- /dev/null +++ b/pydis_django/urls/admin.py @@ -0,0 +1,6 @@ +from django.contrib import admin +from django.urls import path + +urlpatterns = [ + path('admin/', admin.site.urls), +] diff --git a/pydis_django/urls/api.py b/pydis_django/urls/api.py new file mode 100644 index 00000000..dfc73621 --- /dev/null +++ b/pydis_django/urls/api.py @@ -0,0 +1,6 @@ +from django.contrib import admin +from django.urls import path + +urlpatterns = [ + path('admin/', admin.site.urls), +] diff --git a/pydis_django/urls/main.py b/pydis_django/urls/main.py new file mode 100644 index 00000000..90453f65 --- /dev/null +++ b/pydis_django/urls/main.py @@ -0,0 +1,21 @@ +"""pydis_django URL Configuration + +The `urlpatterns` list routes URLs to views. For more information please see: + https://docs.djangoproject.com/en/2.1/topics/http/urls/ +Examples: +Function views + 1. Add an import: from my_app import views + 2. Add a URL to urlpatterns: path('', views.home, name='home') +Class-based views + 1. Add an import: from other_app.views import Home + 2. Add a URL to urlpatterns: path('', Home.as_view(), name='home') +Including another URLconf + 1. Import the include() function: from django.urls import include, path + 2. Add a URL to urlpatterns: path('blog/', include('blog.urls')) +""" +from django.contrib import admin +from django.urls import path + +urlpatterns = [ + path('admin/', admin.site.urls), +] diff --git a/pydis_django/urls/staff.py b/pydis_django/urls/staff.py new file mode 100644 index 00000000..dfc73621 --- /dev/null +++ b/pydis_django/urls/staff.py @@ -0,0 +1,6 @@ +from django.contrib import admin +from django.urls import path + +urlpatterns = [ + path('admin/', admin.site.urls), +] diff --git a/pydis_django/urls/wiki.py b/pydis_django/urls/wiki.py new file mode 100644 index 00000000..dfc73621 --- /dev/null +++ b/pydis_django/urls/wiki.py @@ -0,0 +1,6 @@ +from django.contrib import admin +from django.urls import path + +urlpatterns = [ + path('admin/', admin.site.urls), +] diff --git a/pydis_django/urls/ws.py b/pydis_django/urls/ws.py new file mode 100644 index 00000000..dfc73621 --- /dev/null +++ b/pydis_django/urls/ws.py @@ -0,0 +1,6 @@ +from django.contrib import admin +from django.urls import path + +urlpatterns = [ + path('admin/', admin.site.urls), +] diff --git a/pydis_django/wsgi.py b/pydis_django/wsgi.py new file mode 100644 index 00000000..17fb615f --- /dev/null +++ b/pydis_django/wsgi.py @@ -0,0 +1,16 @@ +""" +WSGI config for pydis_django 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/2.1/howto/deployment/wsgi/ +""" + +import os + +from django.core.wsgi import get_wsgi_application + +os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'pydis_django.settings') + +application = get_wsgi_application() diff --git a/pysite/__init__.py b/pysite/__init__.py deleted file mode 100644 index c02afd0d..00000000 --- a/pysite/__init__.py +++ /dev/null @@ -1,61 +0,0 @@ -import logging -import os -import sys -from logging import Logger, StreamHandler, handlers - -from logmatic import JsonFormatter - -from pysite.constants import DEBUG_MODE - -# region Logging -# Get the log level from environment - -logging.TRACE = 5 -logging.addLevelName(logging.TRACE, "TRACE") - - -def monkeypatch_trace(self, msg, *args, **kwargs): - """ - Log 'msg % args' with severity 'TRACE'. - - To pass exception information, use the keyword argument exc_info with - a true value, e.g. - - logger.trace("Houston, we have an %s", "interesting problem", exc_info=1) - """ - if self.isEnabledFor(logging.TRACE): - self._log(logging.TRACE, msg, args, **kwargs) - - -Logger.trace = monkeypatch_trace -log_level = logging.TRACE if DEBUG_MODE else logging.INFO -logging_handlers = [] - -if DEBUG_MODE: - logging_handlers.append(StreamHandler(stream=sys.stdout)) - - json_handler = logging.FileHandler(filename="log.json", mode="w") - json_handler.formatter = JsonFormatter() - logging_handlers.append(json_handler) -else: - logdir = "log" - logfile = logdir+os.sep+"site.log" - megabyte = 1048576 - - if not os.path.exists(logdir): - os.makedirs(logdir) - - filehandler = handlers.RotatingFileHandler(logfile, maxBytes=(megabyte*5), backupCount=7) - logging_handlers.append(filehandler) - - json_handler = logging.StreamHandler(stream=sys.stdout) - json_handler.formatter = JsonFormatter() - logging_handlers.append(json_handler) - -logging.basicConfig( - format="%(asctime)s pd.beardfist.com Site: | %(name)35s | %(levelname)8s | %(message)s", - datefmt="%b %d %H:%M:%S", - level=log_level, - handlers=logging_handlers -) -# endregion diff --git a/pysite/base_route.py b/pysite/base_route.py deleted file mode 100644 index 8178b142..00000000 --- a/pysite/base_route.py +++ /dev/null @@ -1,328 +0,0 @@ -from collections import Iterable -from datetime import datetime -from typing import Any - -from flask import Blueprint, Response, jsonify, redirect, render_template, session, url_for -from flask.views import MethodView -from werkzeug.exceptions import default_exceptions - -from pysite.constants import ALL_STAFF_ROLES, DEBUG_MODE, ErrorCodes -from pysite.mixins import OAuthMixin - - -class BaseView(MethodView, OAuthMixin): - """ - Base view class with functions and attributes that should be common to all view classes. - - This class should be subclassed, and is not intended to be used directly. - """ - - name = None # type: str - blueprint = None # type: str - - def render(self, *template_names: str, **context: Any) -> str: - """ - Render some templates and get them back in a form that you can simply return from your view function. - - Here's what's inserted: - * "current_page" - the "name" attribute from the view class - * "view" - the view class instance - * "logged_in" - a boolean, True if the user is logged in - * "static_file(filename)", a function used to get the URL for a given static file - * "csrf_token()", a function returning the CSRF token stored in the current session - - For XSS protection, a CSRF token must be used. The "csrf_token()" function returns the correct token - to be used in the current rendering context - if your view methods are to be protected from XSS - exploits, the following steps must be taken: - - 1. Apply the "csrf" decorator to the view method - 2. For forms, a hidden input must be declared in the template, with the name "csrf_token", and the value set to - the CSRF token. - 3. For any AJAX work, the CSRF token should be stored in a variable, and sent as part of the request headers. - You can set the "X-CSRFToken" header to the CSRF token for this. - - Any API call or form submission not protected by an API key must not be vulnerable to XSS, unless the API - call is intended to be a completely public feature. Public API methods must not be account-bound, and they - must never return information on a current user or perform any action. Only data retrieval is permissible. - - :param template_names: Names of the templates to render - :param context: Extra data to pass into the template - :return: String representing the rendered templates - """ - - context["current_page"] = self.name - context["view"] = self - context["logged_in"] = self.logged_in - context["user"] = self.user_data - context["static_file"] = self._static_file - context["debug"] = DEBUG_MODE - context["format_datetime"] = lambda dt: dt.strftime("%b %d %Y, %H:%M") if isinstance(dt, datetime) else dt - context["blueprint"] = self.blueprint - - def is_staff(): - if DEBUG_MODE: - return True - - if not self.logged_in: - return False - - for role in ALL_STAFF_ROLES: - if role in self.user_data.get("roles", []): - return True - - return False - - context["is_staff"] = is_staff - - return render_template(template_names, **context) - - def _static_file(self, filename): - return url_for("static", filename=filename) - - -class RouteView(BaseView): - """ - Standard route-based page view. For a standard page, this is what you want. - - This class is intended to be subclassed - use it as a base class for your own views, and set the class-level - attributes as appropriate. For example: - - >>> class MyView(RouteView): - ... name = "my_view" # Flask internal name for this route - ... path = "/my_view" # Actual URL path to reach this route - ... - ... def get(self): # Name your function after the relevant HTTP method - ... return self.render("index.html") - - For more complicated routing, see http://exploreflask.com/en/latest/views.html#built-in-converters - """ - - path = None # type: str - - @classmethod - def setup(cls: "RouteView", manager: "pysite.route_manager.RouteManager", blueprint: Blueprint): - """ - Set up the view by adding it to the blueprint passed in - this will also deal with multiple inheritance by - calling `super().setup()` as appropriate. - - This is for a standard route view. Nothing special here. - - :param manager: Instance of the current RouteManager - :param blueprint: Current Flask blueprint to register this route to - """ - - if hasattr(super(), "setup"): - super().setup(manager, blueprint) - - if not cls.path or not cls.name: - raise RuntimeError("Route views must have both `path` and `name` defined") - - blueprint.add_url_rule(cls.path, view_func=cls.as_view(cls.name)) - - cls.blueprint = blueprint.name - cls.name = f"{blueprint.name}.{cls.name}" # Add blueprint to page name - - def redirect_login(self, **kwargs): - session["redirect_target"] = { - "url": self.name, - "kwargs": kwargs - } - - response = redirect(url_for("discord.login")) - response.headers.add("X-Robots-Tag", "noindex") - - return response - - -class APIView(RouteView): - """ - API route view, with extra methods to help you add routes to the JSON API with ease. - - This class is intended to be subclassed - use it as a base class for your own views, and set the class-level - attributes as appropriate. For example: - - >>> class MyView(APIView): - ... name = "my_view" # Flask internal name for this route - ... path = "/my_view" # Actual URL path to reach this route - ... - ... def get(self): # Name your function after the relevant HTTP method - ... return self.error(ErrorCodes.unknown_route) - """ - - def error(self, error_code: ErrorCodes, error_info: str = "") -> Response: - """ - Generate a JSON response for you to return from your handler, for a specific type of API error - - :param error_code: The type of error to generate a response for - see `constants.ErrorCodes` for more - :param error_info: An optional message with more information about the error. - :return: A Flask Response object that you can return from your handler - """ - - data = { - "error_code": error_code.value, - "error_message": error_info or "Unknown error" - } - - http_code = 200 - - if error_code is ErrorCodes.unknown_route: - data["error_message"] = error_info or "Unknown API route" - http_code = 404 - elif error_code is ErrorCodes.unauthorized: - data["error_message"] = error_info or "Unauthorized" - http_code = 401 - elif error_code is ErrorCodes.invalid_api_key: - data["error_message"] = error_info or "Invalid API-key" - http_code = 401 - elif error_code is ErrorCodes.bad_data_format: - data["error_message"] = error_info or "Input data in incorrect format" - http_code = 400 - elif error_code is ErrorCodes.incorrect_parameters: - data["error_message"] = error_info or "Incorrect parameters provided" - http_code = 400 - - response = jsonify(data) - response.status_code = http_code - return response - - -class ErrorView(BaseView): - """ - Error view, shown for a specific HTTP status code, as defined in the class attributes. - - This class is intended to be subclassed - use it as a base class for your own views, and set the class-level - attributes as appropriate. For example: - - >>> class MyView(ErrorView): - ... name = "my_view" # Flask internal name for this route - ... path = "/my_view" # Actual URL path to reach this route - ... error_code = 404 # Error code - ... - ... def get(self, error: HTTPException): # Name your function after the relevant HTTP method - ... return "Replace me with a template, 404 not found", 404 - - If you'd like to catch multiple HTTP error codes, feel free to supply an iterable for `error_code`. For example... - - >>> error_code = [401, 403] # Handle two specific errors - >>> error_code = range(500, 600) # Handle all 5xx errors - """ - - error_code = None # type: Union[int, Iterable] - register_on_app = True - blueprint = "error" # Because it doesn't truly have its own - - @classmethod - def setup(cls: "ErrorView", manager: "pysite.route_manager.RouteManager", blueprint: Blueprint): - """ - Set up the view by registering it as the error handler for the HTTP status codes specified in the class - attributes - this will also deal with multiple inheritance by calling `super().setup()` as appropriate. - - :param manager: Instance of the current RouteManager - :param blueprint: Current Flask blueprint to register the error handler for - """ - - if hasattr(super(), "setup"): - super().setup(manager, blueprint) # pragma: no cover - - if not cls.name or not cls.error_code: - raise RuntimeError("Error views must have both `name` and `error_code` defined") - - if isinstance(cls.error_code, int): - cls.error_code = [cls.error_code] - - if isinstance(cls.error_code, Iterable): - for code in cls.error_code: - if isinstance(code, int) and code not in default_exceptions: - continue # Otherwise we'll possibly get an exception thrown during blueprint registration - - if cls.register_on_app: - manager.app.errorhandler(code)(cls.as_view(cls.name)) - else: - blueprint.errorhandler(code)(cls.as_view(cls.name)) - else: - raise RuntimeError( - "Error views must have an `error_code` that is either an `int` or an iterable") # pragma: no cover # noqa: E501 - - -class TemplateView(RouteView): - """ - An easy view for routes that simply render a template with no extra information. - - This class is intended to be subclassed - use it as a base class for your own views, and set the class-level - attributes as appropriate. For example: - - >>> class MyView(TemplateView): - ... name = "my_view" # Flask internal name for this route - ... path = "/my_view" # Actual URL path to reach this route - ... template = "my_view.html" # Template to use - - Note that this view only handles GET requests. If you need any other verbs, you can implement them yourself - or just use one of the more customizable base view classes. - """ - - template = None # type: str - - @classmethod - def setup(cls: "TemplateView", manager: "pysite.route_manager.RouteManager", blueprint: Blueprint): - """ - Set up the view, deferring most setup to the superclasses but checking for the template attribute. - - :param manager: Instance of the current RouteManager - :param blueprint: Current Flask blueprint to register the error handler for - """ - - if hasattr(super(), "setup"): - super().setup(manager, blueprint) # pragma: no cover - - if not cls.template: - raise RuntimeError("Template views must have `template` defined") - - def get(self, *_): - return self.render(self.template) - - -class RedirectView(RouteView): - """ - An easy view for routes that simply redirect to another page or view. - - This class is intended to be subclassed - use it as a base class for your own views, and set the class-level - attributes as appropriate. For example: - - >>> class MyView(RedirectView): - ... name = "my_view" # Flask internal name for this route - ... path = "/my_view" # Actual URL path to reach this route - ... code = 303 # HTTP status code to use for the redirect; 303 by default - ... page = "staff.index" # Page to redirect to - ... kwargs = {} # Any extra keyword args to pass to the url_for call, if redirecting to another view - - You can specify a full URL, including the protocol, eg "http://google.com" or a Flask internal route name, - eg "main.index". Nothing else is supported. - - Note that this view only handles GET requests. If you need any other verbs, you can implement them yourself - or just use one of the more customizable base view classes. - """ - - code = 303 # type: int - page = None # type: str - kwargs = {} # type: Optional[dict] - - @classmethod - def setup(cls: "RedirectView", manager: "pysite.route_manager.RouteManager", blueprint: Blueprint): - """ - Set up the view, deferring most setup to the superclasses but checking for the template attribute. - - :param manager: Instance of the current RouteManager - :param blueprint: Current Flask blueprint to register the error handler for - """ - - if hasattr(super(), "setup"): - super().setup(manager, blueprint) # pragma: no cover - - if not cls.page or not cls.code: - raise RuntimeError("Redirect views must have both `code` and `page` defined") - - def get(self, *_): - if "://" in self.page: - return redirect(self.page, code=self.code) - - return redirect(url_for(self.page, **self.kwargs), code=self.code) diff --git a/pysite/constants.py b/pysite/constants.py deleted file mode 100644 index 7d8dbf6e..00000000 --- a/pysite/constants.py +++ /dev/null @@ -1,151 +0,0 @@ -from enum import Enum, IntEnum -from os import environ - -from flask_wtf import CSRFProtect - - -class ErrorCodes(IntEnum): - unknown_route = 0 - unauthorized = 1 - invalid_api_key = 2 - incorrect_parameters = 3 - bad_data_format = 4 - - -class ValidationTypes(Enum): - json = "json" - none = "none" - params = "params" - - -class BotEventTypes(Enum): - mod_log = "mod_log" - - send_message = "send_message" - send_embed = "send_embed" - - add_role = "add_role" - remove_role = "remove_role" - - -DEBUG_MODE = "FLASK_DEBUG" in environ - -# All snowflakes should be strings as RethinkDB rounds them as ints -ADMIN_BOTS_ROLE = "270988689419665409" -ADMINS_ROLE = "267628507062992896" -ANNOUNCEMENTS_ROLE = "463658397560995840" -BOTS_ROLE = "277546923144249364" -CODE_JAM_CHAMPIONS_ROLE = "430492892331769857" -CONTRIBS_ROLE = "295488872404484098" -DEVOPS_ROLE = "409416496733880320" -DEVELOPERS_ROLE = "352427296948486144" -HELPERS_ROLE = "267630620367257601" -JAMMERS_ROLE = "423054537079783434" -MODERATORS_ROLE = "267629731250176001" -MUTED_ROLE = "277914926603829249" -OWNERS_ROLE = "267627879762755584" -PARTNERS_ROLE = "323426753857191936" -PYTHON_ROLE = "458226699344019457" -STREAMERS_ROLE = "462650825978806274" -SUBREDDIT_MOD_ROLE = "458226413825294336" - -ALL_STAFF_ROLES = (OWNERS_ROLE, ADMINS_ROLE, MODERATORS_ROLE, DEVOPS_ROLE) -TABLE_MANAGER_ROLES = (OWNERS_ROLE, ADMINS_ROLE, DEVOPS_ROLE) -EDITOR_ROLES = ALL_STAFF_ROLES + (HELPERS_ROLE, CONTRIBS_ROLE) - -SERVER_ID = 267624335836053506 - -DISCORD_API_ENDPOINT = "https://discordapp.com/api" - -DISCORD_OAUTH_REDIRECT = "/auth/discord" -DISCORD_OAUTH_AUTHORIZED = "/auth/discord/authorized" -DISCORD_OAUTH_ID = environ.get('DISCORD_OAUTH_ID', '') -DISCORD_OAUTH_SECRET = environ.get('DISCORD_OAUTH_SECRET', '') -DISCORD_OAUTH_SCOPE = 'identify' -OAUTH_DATABASE = "oauth_data" - -GITLAB_ACCESS_TOKEN = environ.get("GITLAB_ACCESS_TOKEN", '') - -PREFERRED_URL_SCHEME = environ.get("PREFERRED_URL_SCHEME", "http") - -ERROR_DESCRIPTIONS = { - # 5XX - 500: "The server encountered an unexpected error ._.", - 501: "Woah! You seem to have found something we haven't even implemented yet!", - 502: "This is weird, one of our upstream servers seems to have experienced an error.", - 503: "Looks like one of our services is down for maintenance and couldn't respond to your request.", - 504: "Looks like an upstream server experienced a timeout while we tried to talk to it!", - 505: "You're using an old HTTP version. It might be time to upgrade your browser.", - # 4XX - 400: "You sent us a request that we don't know what to do with.", - 401: "Nope! You'll need to authenticate before we let you do that.", - 403: "No way! You're not allowed to do that.", - 404: "We looked, but we couldn't seem to find that page.", - 405: "That's a real page, but you can't use that method.", - 408: "We waited a really long time, but never got your request.", - 410: "This used to be here, but it's gone now.", - 411: "You forgot to tell us the length of the content.", - 413: "No way! That payload is, like, way too big!", - 415: "The thing you sent has the wrong format.", - 418: "I'm a teapot, I can't make coffee. (._.)", - 429: "Please don't send us that many requests." -} - -JAM_STATES = [ - "planning", - "announced", - "preparing", - "running", - "judging", - "finished" -] - -JAM_QUESTION_TYPES = [ - "checkbox", - "email", - "number", - "radio", - "range", - "text", - "textarea", - "slider" -] - -# Server role colors -ROLE_COLORS = { - ADMIN_BOTS_ROLE: "#6f9fed", - ADMINS_ROLE: "#e76e6c", - BOTS_ROLE: "#6f9fed", - CODE_JAM_CHAMPIONS_ROLE: "#b108b4", - CONTRIBS_ROLE: "#55cc6c", - DEVOPS_ROLE: "#a1d1ff", - DEVELOPERS_ROLE: "#fcfcfc", - HELPERS_ROLE: "#e0b000", - JAMMERS_ROLE: "#258639", - MODERATORS_ROLE: "#ce3c42", - MUTED_ROLE: "#fcfcfc", - OWNERS_ROLE: "#ffa3a1", - PARTNERS_ROLE: "#b66fed", - PYTHON_ROLE: "#6f9fed", - STREAMERS_ROLE: "#833cba", - SUBREDDIT_MOD_ROLE: "#d897ed", -} - -# CSRF -CSRF = CSRFProtect() - -# Bot key -BOT_API_KEY = environ.get("BOT_API_KEY") - -# RabbitMQ settings -BOT_EVENT_QUEUE = "bot_events" - -RMQ_USERNAME = environ.get("RABBITMQ_DEFAULT_USER") or "guest" -RMQ_PASSWORD = environ.get("RABBITMQ_DEFAULT_PASS") or "guest" -RMQ_HOST = "localhost" if DEBUG_MODE else environ.get("RABBITMQ_HOST") or "pdrmq" -RMQ_PORT = 5672 - -# Channels -CHANNEL_MOD_LOG = 282638479504965634 -CHANNEL_DEV_LOGS = 409308876241108992 -CHANNEL_JAM_LOGS = 452486310121439262 diff --git a/pysite/database.py b/pysite/database.py deleted file mode 100644 index ddf79a31..00000000 --- a/pysite/database.py +++ /dev/null @@ -1,562 +0,0 @@ -import logging -import os -from typing import Any, Callable, Dict, Iterator, List, Optional, Union -import re - -import rethinkdb -from rethinkdb.ast import RqlMethodQuery, Table, UserError -from rethinkdb.net import DefaultConnection -from werkzeug.exceptions import ServiceUnavailable - -from pysite.tables import TABLES - -STRIP_REGEX = re.compile(r"<[^<]+?>") -WIKI_TABLE = "wiki" - - -class RethinkDB: - - def __init__(self, loop_type: Optional[str] = "gevent"): - self.host = os.environ.get("RETHINKDB_HOST", "127.0.0.1") - self.port = os.environ.get("RETHINKDB_PORT", "28015") - self.database = os.environ.get("RETHINKDB_DATABASE", "pythondiscord") - self.log = logging.getLogger(__name__) - self.conn = None - - if loop_type: - rethinkdb.set_loop_type(loop_type) - - with self.get_connection() as self.conn: - try: - rethinkdb.db_create(self.database).run(self.conn) - self.log.debug(f"Database created: '{self.database}'") - except rethinkdb.RqlRuntimeError: - self.log.debug(f"Database found: '{self.database}'") - - def create_tables(self) -> List[str]: - """ - Creates whichever tables exist in the TABLES - constant if they don't already exist in the database. - - :return: a list of the tables that were created. - """ - created = [] - - for table, obj in TABLES.items(): - if self.create_table(table, obj.primary_key): - created.append(table) - - return created - - def get_connection(self, connect_database: bool = True) -> DefaultConnection: - """ - Grab a connection to the RethinkDB server, optionally without selecting a database - - :param connect_database: Whether to immediately connect to the database or not - """ - - if connect_database: - return rethinkdb.connect(host=self.host, port=self.port, db=self.database) - else: - return rethinkdb.connect(host=self.host, port=self.port) - - def before_request(self): - """ - Flask pre-request callback to set up a connection for the duration of the request - """ - - try: - self.conn = self.get_connection() - except rethinkdb.RqlDriverError: - raise ServiceUnavailable("Database connection could not be established.") - - def teardown_request(self, _): - """ - Flask post-request callback to close a previously set-up connection - - :param _: Exception object, not used here - """ - - try: - self.conn.close() - except AttributeError: - pass - - # region: Convenience wrappers - - def create_table(self, table_name: str, primary_key: str = "id", durability: str = "hard", shards: int = 1, - replicas: Union[int, Dict[str, int]] = 1, primary_replica_tag: Optional[str] = None) -> bool: - """ - Attempt to create a new table on the current database - - :param table_name: The name of the table to create - :param primary_key: The name of the primary key - defaults to "id" - :param durability: "hard" (the default) to write the change immediately, "soft" otherwise - :param shards: The number of shards to span the table over - defaults to 1 - :param replicas: See the RethinkDB documentation relating to replicas - :param primary_replica_tag: See the RethinkDB documentation relating to replicas - - :return: True if the table was created, False if it already exists - """ - - with self.get_connection() as conn: - all_tables = rethinkdb.db(self.database).table_list().run(conn) - self.log.debug(f"Call to table_list returned the following list of tables: {all_tables}") - - if table_name in all_tables: - self.log.debug(f"Table found: '{table_name}' ({len(all_tables)} tables in total)") - return False - - # Use a kwargs dict because the driver doesn't check the value - # of `primary_replica_tag` properly; None is not handled - kwargs = { - "primary_key": primary_key, - "durability": durability, - "shards": shards, - "replicas": replicas - } - - if primary_replica_tag is not None: - kwargs["primary_replica_tag"] = primary_replica_tag - - rethinkdb.db(self.database).table_create(table_name, **kwargs).run(conn) - - self.log.debug(f"Table created: '{table_name}'") - return True - - def delete(self, - table_name: str, - primary_key: Union[str, None] = None, - durability: str = "hard", - return_changes: Union[bool, str] = False) -> dict: - """ - Delete one or all documents from a table. This can only delete - either the contents of an entire table, or a single document. - For more complex delete operations, please use self.query. - - :param table_name: The name of the table to delete from. This must be provided. - :param primary_key: The primary_key to delete from that table. This is optional. - :param durability: "hard" (the default) to write the change immediately, "soft" otherwise - :param return_changes: Whether to return a list of changed values or not - defaults to False - :return: if return_changes is True, returns a dict containing all changes. Else, returns None. - """ - - if primary_key: - query = self.query(table_name).get(primary_key).delete( - durability=durability, return_changes=return_changes - ) - else: - query = self.query(table_name).delete( - durability=durability, return_changes=return_changes - ) - - if return_changes: - return self.run(query, coerce=dict) - self.run(query) - - def drop_table(self, table_name: str): - """ - Attempt to drop a table from the database, along with its data - - :param table_name: The name of the table to drop - :return: True if the table was dropped, False if the table doesn't exist - """ - - with self.get_connection() as conn: - all_tables = rethinkdb.db(self.database).table_list().run(conn) - - if table_name not in all_tables: - return False - - rethinkdb.db(self.database).table_drop(table_name).run(conn) - return True - - def query(self, table_name: str) -> Table: - """ - Get a RethinkDB table object that you can run queries against - - >>> db = RethinkDB() - >>> query = db.query("my_table") - >>> db.run(query.insert({"key": "value"}), coerce=dict) - { - "deleted": 0, - "errors": 0, - "inserted": 1, - "replaced": 0, - "skipped": 0, - "unchanged": 0 - } - - :param table_name: Name of the table to query against - :return: The RethinkDB table object for the table - """ - - if table_name not in TABLES: - self.log.warning(f"Table not declared in tables.py: {table_name}") - - return rethinkdb.table(table_name) - - def run(self, query: Union[RqlMethodQuery, Table], *, new_connection: bool = False, - connect_database: bool = True, coerce: type = None) -> Union[rethinkdb.Cursor, List, Dict, object]: - """ - Run a query using a table object obtained from a call to `query()` - - >>> db = RethinkDB() - >>> query = db.query("my_table") - >>> db.run(query.insert({"key": "value"}), coerce=dict) - { - "deleted": 0, - "errors": 0, - "inserted": 1, - "replaced": 0, - "skipped": 0, - "unchanged": 0 - } - - Note that result coercion is very basic, and doesn't really do any magic. If you want to be able to work - directly with the result of your query, then don't specify the `coerce` argument - the object that you'd - usually get from the RethinkDB API will be returned instead. - - :param query: The full query to run - :param new_connection: Whether to create a new connection or use the current request-bound one - :param connect_database: If creating a new connection, whether to connect to the database immediately - :param coerce: Optionally, an object type to attempt to coerce the result to - - :return: The result of the operation - """ - - if not new_connection: - try: - result = query.run(self.conn) - except rethinkdb.ReqlDriverError as e: - if e.message == "Connection is closed.": - self.log.warning("Connection was closed, attempting with a new connection...") - result = query.run(self.get_connection(connect_database)) - else: - raise - else: - result = query.run(self.get_connection(connect_database)) - - if coerce: - return coerce(result) if result else coerce() - return result - - # endregion - - # region: RethinkDB wrapper functions - - def between(self, table_name: str, *, lower: Any = rethinkdb.minval, upper: Any = rethinkdb.maxval, - index: Optional[str] = None, left_bound: str = "closed", right_bound: str = "open") -> List[ - Dict[str, Any]]: - """ - Get all documents between two keys - - >>> db = RethinkDB() - >>> db.between("users", upper=10, index="conquests") - [ - {"username": "gdude", "conquests": 2}, - {"username": "joseph", "conquests": 5} - ] - >>> db.between("users", lower=10, index="conquests") - [ - {"username": "lemon", "conquests": 15} - ] - >>> db.between("users", lower=2, upper=10, index="conquests" left_bound="open") - [ - {"username": "gdude", "conquests": 2}, - {"username": "joseph", "conquests": 5} - ] - - :param table_name: The table to get documents from - :param lower: The lower-bounded value, leave blank to ignore - :param upper: The upper-bounded value, leave blank to ignore - :param index: The key or index to check on each document - :param left_bound: "open" to include documents that exactly match the lower bound, "closed" otherwise - :param right_bound: "open" to include documents that exactly match the upper bound, "closed" otherwise - - :return: A list of matched documents; may be empty - """ - return self.run( # pragma: no cover - self.query(table_name).between(lower, upper, index=index, left_bound=left_bound, right_bound=right_bound), - coerce=list - ) - - def changes(self, table_name: str, squash: Union[bool, int] = False, changefeed_queue_size: int = 100_000, - include_initial: Optional[bool] = None, include_states: bool = False, - include_types: bool = False) -> Iterator[Dict[str, Any]]: - """ - A complicated function allowing you to follow a changefeed for a specific table - - This function will not allow you to specify a set of conditions for your changefeed, so you'll - have to write your own query and run it with `run()` if you need that. If not, you'll just get every - change for the specified table. - - >>> db = RethinkDB() - >>> for document in db.changes("my_table", squash=True): - ... print(document.get("new_val", {})) - - Documents take the form of a dict with `old_val` and `new_val` fields by default. These are set to a copy of - the document before and after the change being represented was made, respectively. The format of these dicts - can change depending on the arguments you pass to the function, however. - - If a changefeed must be aborted (for example, if the table was deleted), a ReqlRuntimeError will be - raised. - - Note: This function always creates a new connection. This is to prevent you from losing your changefeed - when the connection used for a request context is closed. - - :param table_name: The name of the table to watch for changes on - - :param squash: How to deal with batches of changes to a single document - False (the default) to send changes - as they happen, True to squash changes for single objects together and send them as a single change, - or an int to specify how many seconds to wait for an object to change before batching it - - :param changefeed_queue_size: The number of changes the server will buffer between client reads before it - starts to drop changes and issues errors - defaults to 100,000 - - :param include_initial: If True, the changefeed will start with the initial values of all the documents in - the table; the results will have `new_val` fields ONLY to start with if this is the case. Note that - the old values may be intermixed with new changes if you're still iterating through the old values, but - only as long as the old value for that field has already been sent. If the order of a document you've - already seen moves it to a part of the group you haven't yet seen, an "unitial" notification is sent, which - is simply a dict with an `old_val` field set, and not a `new_val` field set. This option defaults to - False. - - :param include_states: Whether to send special state documents to the changefeed as its state changes. This - comprises of special documents with only a `state` field, set to a string - the state of the feed. There - are currently two states - "initializing" and "ready". This option defaults to False. - - :param include_types: If True, each document generated will include a `type` field which states what type - of change the document represents. This may be "add", "remove", "change", "initial", "uninitial" or - "state". This option defaults to False. - - :return: A special iterator that will iterate over documents in the changefeed as they're sent. If there is - no document waiting, this will block the function until there is. - """ - return self.run( # pragma: no cover - self.query(table_name).changes( - squash=squash, changefeed_queue_size=changefeed_queue_size, include_initial=include_initial, - include_states=include_states, include_offsets=False, include_types=include_types - ), - new_connection=True - ) - - def filter(self, table_name: str, predicate: Callable[[Dict[str, Any]], bool], - default: Union[bool, UserError] = False) -> List[Dict[str, Any]]: - """ - Return all documents in a table for which `predicate` returns true. - - The `predicate` argument should be a function that takes a single argument - a single document to check - and - it should return True or False depending on whether the document should be included. - - >>> def many_conquests(doc): - ... '''Return documents with at least 10 conquests''' - ... return doc["conquests"] >= 10 - ... - >>> db = RethinkDB() - >>> db.filter("users", many_conquests) - [ - {"username": "lemon", "conquests": 15} - ] - - :param table_name: The name of the table to get documents for - :param predicate: The callable to use to filter the documents - :param default: What to do if a document is missing fields; True to include them, `rethink.error()` to raise - aa ReqlRuntimeError, or False to skip over the document (the default) - :return: A list of documents that match the predicate; may be empty - """ - - return self.run( # pragma: no cover - self.query(table_name).filter(predicate, default=default), - coerce=list - ) - - def get(self, table_name: str, key: Any) -> Optional[Dict[str, Any]]: - """ - Get a single document from a table by primary key - - :param table_name: The name of the table to get the document from - :param key: The value of the primary key belonging to the document you want - - :return: The document, or None if it wasn't found - """ - - result = self.run( # pragma: no cover - self.query(table_name).get(key) - ) - - return dict(result) if result else None # pragma: no cover - - def get_all(self, table_name: str, *keys: str, index: str = "id") -> List[Any]: - """ - Get a list of documents matching a set of keys, on a specific index - - :param table_name: The name of the table to get documents from - :param keys: The key values to match against - :param index: The name of the key or index to match on - - :return: A list of matching documents; may be empty if no matches were made - """ - - if keys: - return self.run( # pragma: no cover - self.query(table_name).get_all(*keys, index=index), - coerce=list - ) - else: - return self.run( - self.query(table_name), - coerce=list - ) - - def insert(self, table_name: str, *objects: Dict[str, Any], - durability: str = "hard", - return_changes: Union[bool, str] = False, - conflict: Union[ # Any of... - str, Callable[ # ...str, or a callable that... - [Dict[str, Any], Dict[str, Any]], # ...takes two dicts with string keys and any values... - Dict[str, Any] # ...and returns a dict with string keys and any values - ] - ] = "error") -> Dict[str, Any]: # flake8: noqa - """ - Insert an object or a set of objects into a table - - :param table_name: The name of the table to insert into - :param objects: The objects to be inserted into the table - :param durability: "hard" (the default) to write the change immediately, "soft" otherwise - :param return_changes: Whether to return a list of changed values or not - defaults to False - :param conflict: What to do in the event of a conflict - "error", "replace" and "update" are included, but - you can also provide your own function in order to handle conflicts yourself. If you do this, the function - should take two arguments (the old document and the new one), and return a single document to replace both. - - :return: A dict detailing the operations run - """ - - query = self.query(table_name).insert( - objects, durability=durability, return_changes=return_changes, conflict=conflict - ) - - return self.run(query, coerce=dict) - - def map(self, table_name: str, func: Callable): - """ - Map a function over every document in a table, with the possibility of modifying it - - As an example, you could do the following to rename the "id" field to "user_id" for all documents - in the "users" table. - - >>> db = RethinkDB() - >>> db.map( - ... "users", - ... lambda doc: doc.merge({"user_id": doc["id"]}).without("id") - ... ) - - :param table_name: The name of the table to map the function over - :param func: A callable that takes a single argument - - :return: Unknown, needs more testing - """ - - return self.run( # pragma: no cover - self.query(table_name).map(func), - coerce=list - ) - - def pluck(self, table_name: str, *selectors: Union[str, Dict[str, Union[List, Dict]]]) -> List[Dict[str, Any]]: - """ - Get a list of values for a specific set of keys for every document in the table; this can include - nested values - - >>> db = RethinkDB() - >>> db.pluck("users", "username", "password") # Select a flat document - [ - {"username": "lemon", "password": "hunter2"} - ] - >>> db.pluck("users", {"posts": ["title"]}) # Select from nested documents - [ - { - "posts": [ - {"title": "New website!"} - ] - } - ] - - :param table_name: The table to get values from - :param selectors: The set of keys to get values for - :return: A list containing the requested documents, with only the keys requested - """ - - return self.run( # pragma: no cover - self.query(table_name).pluck(*selectors), - coerce=list - ) - - def sample(self, table_name: str, sample_size: int) -> List[Dict[str, Any]]: - """ - Select a given number of elements from a table at random. - - :param table_name: The name of the table to select from. - :param sample_size: The number of elements to select. - If this number is higher than the total amount of items in - the table, this will return the entire table in random order. - - :return: A list of items from the table. - """ - return self.run( # pragma: no cover - self.query(table_name).sample(sample_size), - coerce=list - ) - - def sync(self, table_name: str) -> bool: - """ - Following a set of edits with durability set to "soft", this must be called to save those edits - - :param table_name: The name of the table to sync - - :return: True if the sync was successful; False otherwise - """ - result = self.run( # pragma: no cover - self.query(table_name).sync(), - coerce=dict - ) - - return result.get("synced", 0) > 0 # pragma: no cover - - def wait(self, table_name: str, wait_for: str = "all_replicas_ready", timeout: int = 0) -> bool: - """ - Wait until an operation has happened on a specific table; will block the current function - - :param table_name: The name of the table to wait against - :param wait_for: The operation to wait for; may be "ready_for_outdated_reads", - "ready_for_reads", "ready_for_writes" or "all_replicas_ready", which is the default - :param timeout: How long to wait before returning; defaults to 0 (forever) - - :return: True; but may return False if the timeout was reached - """ - - result = self.run( # pragma: no cover - self.query(table_name).wait(wait_for=wait_for, timeout=timeout), - coerce=dict - ) - - return result.get("ready", 0) > 0 - - def without(self, table_name: str, *selectors: Union[str, Dict[str, Union[List, Dict]]]): - """ - The functional opposite of `pluck()`, returning full documents without the specified selectors - - >>> db = RethinkDB() - >>> db.without("users", "posts") - [ - {"username": "lemon", "password": "hunter2"} - ] - - :param table_name: The table to get values from - :param selectors: The set of keys to exclude - :return: A list containing the requested documents, without the keys requested - """ - - return self.run( # pragma: no cover - self.query(table_name).without(*selectors) - ) - # endregion diff --git a/pysite/decorators.py b/pysite/decorators.py deleted file mode 100644 index fbfb90f8..00000000 --- a/pysite/decorators.py +++ /dev/null @@ -1,151 +0,0 @@ -from functools import wraps -from json import JSONDecodeError - -from flask import request -from schema import Schema, SchemaError -from werkzeug.exceptions import BadRequest, Forbidden - -from pysite.base_route import APIView, RouteView -from pysite.constants import BOT_API_KEY, CSRF, DEBUG_MODE, ErrorCodes, ValidationTypes - - -def csrf(f): - """ - Apply CSRF protection to a specific view function. - """ - - @wraps(f) - def inner_decorator(*args, **kwargs): - CSRF.protect() - - return f(*args, **kwargs) - - return inner_decorator - - -def require_roles(*roles: int): - def inner_decorator(f): - - @wraps(f) - def inner(self: RouteView, *args, **kwargs): - data = self.user_data - - if DEBUG_MODE: - return f(self, *args, **kwargs) - elif data: - for role in roles: - if role in data.get("roles", []): - return f(self, *args, **kwargs) - - if isinstance(self, APIView): - return self.error(ErrorCodes.unauthorized) - - raise Forbidden() - return self.redirect_login(**kwargs) - - return inner - - return inner_decorator - - -def api_key(f): - """ - Decorator to check if X-API-Key is valid. - - Should only be applied to functions on APIView routes. - """ - - @wraps(f) - def inner_decorator(self: APIView, *args, **kwargs): - if not request.headers.get("X-API-Key") == BOT_API_KEY: - return self.error(ErrorCodes.invalid_api_key) - return f(self, *args, **kwargs) - - return inner_decorator - - -def api_params( - schema: Schema = None, - validation_type: ValidationTypes = ValidationTypes.json, - allow_duplicate_params: bool = False): - """ - Validate parameters of data passed to the decorated view. - - Should only be applied to functions on APIView routes. - - This will pass the validated data in as the first parameter to the decorated function. - This data will always be a list, and view functions are expected to be able to handle that - in the case of multiple sets of data being provided by the api. - - If `allow_duplicate_params` is set to False (only effects dictionary schemata - and parameter validation), then the view will return a 400 Bad Request - response if the client submits multiple parameters with the same name. - """ - - def inner_decorator(f): - - @wraps(f) - def inner(self: APIView, *args, **kwargs): - if validation_type == ValidationTypes.json: - try: - if not request.is_json: - return self.error(ErrorCodes.bad_data_format) - - data = request.get_json() - - if not isinstance(data, list) and isinstance(schema._schema, list): - data = [data] - - except JSONDecodeError: - return self.error(ErrorCodes.bad_data_format) # pragma: no cover - - elif validation_type == ValidationTypes.params and isinstance(schema._schema, list): - # I really don't like this section here, but I can't think of a better way to do it - multi = request.args # This is a MultiDict, which should be flattened to a list of dicts - - # We'll assume that there's always an equal number of values for each param - # Anything else doesn't really make sense anyway - data = [] - longest = None - - for _key, items in multi.lists(): - # Make sure every key has the same number of values - if longest is None: - # First iteration, store it - longest = len(items) - - elif len(items) != longest: # pragma: no cover - # At least one key has a different number of values - return self.error(ErrorCodes.bad_data_format) # pragma: no cover - - if longest is not None: - for i in range(longest): # Now we know all keys have the same number of values... - obj = {} # New dict to store this set of values - - for key, items in multi.lists(): - obj[key] = items[i] # Store the item at that specific index - - data.append(obj) - - elif validation_type == ValidationTypes.params and isinstance(schema._schema, dict): - if not allow_duplicate_params: - for _arg, value in request.args.to_dict(flat=False).items(): - if len(value) > 1: - raise BadRequest("This view does not allow duplicate query arguments") - data = request.args.to_dict() - elif validation_type == ValidationTypes.none: - return f(self, None, *args, **kwargs) - - else: - raise ValueError(f"Unknown validation type: {validation_type}") # pragma: no cover - - try: - schema.validate(data) - except SchemaError as e: - return self.error(ErrorCodes.incorrect_parameters, str(e)) - - return f(self, data, *args, **kwargs) - - return inner - - return inner_decorator diff --git a/pysite/migrations/__init__.py b/pysite/migrations/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/pysite/migrations/runner.py b/pysite/migrations/runner.py deleted file mode 100644 index d498832f..00000000 --- a/pysite/migrations/runner.py +++ /dev/null @@ -1,95 +0,0 @@ -import importlib -import json -import os -from typing import Callable - -from pysite.database import RethinkDB -from pysite.tables import TABLES - -TABLES_DIR = os.path.abspath("./pysite/migrations/tables") -VERSIONS_TABLE = "_versions" - - -def get_migrations(table_path, table): - """ - Take a table name and the path to its migration files, and return a dict containing versions and modules - corresponding with each migration. - - And, yes, migrations start at 1. - """ - migrations = {} - final_version = 0 - - for filename in sorted(os.listdir(table_path)): - if filename.startswith("v") and filename.endswith(".py"): - final_version = int(filename[1:-3]) - migrations[final_version] = f"pysite.migrations.tables.{table}.v{final_version}" - - return migrations, final_version - - -def run_migrations(db: RethinkDB, output: Callable[[str], None]=None): - for table, obj in TABLES.items(): # All _defined_ tables - table_path = os.path.join(TABLES_DIR, table) - - if not os.path.exists(table_path): # Check whether we actually have any migration data for this table at all - output(f"No migration data found for table: {table}") - continue - - with db.get_connection() as conn: # Make sure we have an active connection - try: - if not db.query(table).count().run(conn): # If there are no documents in the table... - # Table's empty, so we'll have to run migrations again anyway - db.delete(VERSIONS_TABLE, table) - - json_path = os.path.join(table_path, "initial_data.json") - - if os.path.exists(json_path): # We have initial data to insert, so let's do that - with open(json_path, "r", encoding="utf-8") as json_file: - data = json.load(json_file) - db.insert(table, *data) # Table's empty, so... just do the thing - - output(f"Inserted initial data for table: {table}") - else: # There's no json data file for this table - output(f"No initial_data.json file for table: {table}") - output(json_path) - - # Translate migration files into modules and versions - migrations, final_version = get_migrations(table_path, table) - - if not migrations: # No migration files found - output(f"No structural migrations for table: {table}") - continue - - current_version = 0 - doc = db.get(VERSIONS_TABLE, table) - - if doc: # We've done a migration before, so continue from where we left off - current_version = doc["version"] - - if current_version == final_version: # Nothing to do, we're up to date - output(f"Table is already up to date: {table}") - continue - output(f"Table has never been migrated: {table}") - - while current_version < final_version: - current_version += 1 - - module = importlib.import_module(migrations[current_version]) - module.run(db, table, obj) - output(f"Table upgraded to version {current_version}/{final_version}: {table}") - - # Make sure the versions table is kept up to date, so we don't ever migrate twice - # We do this in the loop to save our progress, in case we fail during a migration - - db.insert( - VERSIONS_TABLE, - {"table": table, "version": current_version}, - conflict="replace", - durability="soft" - ) - except Exception: - output(f"Failed to migrate table: {table}") - raise - finally: - db.sync(VERSIONS_TABLE) diff --git a/pysite/migrations/tables/__init__.py b/pysite/migrations/tables/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/pysite/migrations/tables/code_jam_participants/__init__.py b/pysite/migrations/tables/code_jam_participants/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/pysite/migrations/tables/code_jam_participants/v1.py b/pysite/migrations/tables/code_jam_participants/v1.py deleted file mode 100644 index c6e7bff6..00000000 --- a/pysite/migrations/tables/code_jam_participants/v1.py +++ /dev/null @@ -1,11 +0,0 @@ -def run(db, table, table_obj): - """ - Remove stored dates of birth from code jam participants - """ - - for document in db.get_all(table): - if "dob" in document: - del document["dob"] - - db.insert(table, document, conflict="replace", durability="soft") - db.sync(table) diff --git a/pysite/migrations/tables/code_jam_participants/v2.py b/pysite/migrations/tables/code_jam_participants/v2.py deleted file mode 100644 index 858da279..00000000 --- a/pysite/migrations/tables/code_jam_participants/v2.py +++ /dev/null @@ -1,12 +0,0 @@ -def run(db, table, table_obj): - """ - GitHub usernames -> Store as GitLab username, this will be correct for most jammers - """ - - for document in db.get_all(table): - if "github_username" in document: - document["gitlab_username"] = document["github_username"] - del document["github_username"] - - db.insert(table, document, conflict="replace", durability="soft") - db.sync(table) diff --git a/pysite/migrations/tables/code_jam_teams/__init__.py b/pysite/migrations/tables/code_jam_teams/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/pysite/migrations/tables/code_jam_teams/v1.py b/pysite/migrations/tables/code_jam_teams/v1.py deleted file mode 100644 index 165d3100..00000000 --- a/pysite/migrations/tables/code_jam_teams/v1.py +++ /dev/null @@ -1,13 +0,0 @@ -def run(db, table, table_obj): - """ - Associate the ID of each team's code jam (team -> jam) - """ - - for document in db.get_all(table): - if "jam" not in document: - # find the code jam containing this team - for jam in db.get_all("code_jams"): - if document["id"] in jam["teams"]: - document["jam"] = jam["number"] - db.insert(table, document, conflict="update", durability="soft") - db.sync(table) diff --git a/pysite/migrations/tables/code_jam_teams/v2.py b/pysite/migrations/tables/code_jam_teams/v2.py deleted file mode 100644 index c6d7c972..00000000 --- a/pysite/migrations/tables/code_jam_teams/v2.py +++ /dev/null @@ -1,13 +0,0 @@ -def run(db, table, table_obj): - """ - Associate the ID of each team's code jam (team -> jam) - again - """ - - for document in db.get_all(table): - if "jam" not in document: - # find the code jam containing this team - for jam in db.get_all("code_jams"): - if document["id"] in jam["teams"]: - document["jam"] = jam["number"] - db.insert(table, document, conflict="update", durability="soft") - db.sync(table) diff --git a/pysite/migrations/tables/code_jams/__init__.py b/pysite/migrations/tables/code_jams/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/pysite/migrations/tables/code_jams/v1.py b/pysite/migrations/tables/code_jams/v1.py deleted file mode 100644 index cce3b112..00000000 --- a/pysite/migrations/tables/code_jams/v1.py +++ /dev/null @@ -1,11 +0,0 @@ -def run(db, table, table_obj): - """ - Add "teams" list to jams without it - """ - - for document in db.get_all(table): - if "teams" not in document: - document["teams"] = [] - - db.insert(table, document, conflict="replace", durability="soft") - db.sync(table) diff --git a/pysite/migrations/tables/code_jams/v2.py b/pysite/migrations/tables/code_jams/v2.py deleted file mode 100644 index df4752c8..00000000 --- a/pysite/migrations/tables/code_jams/v2.py +++ /dev/null @@ -1,10 +0,0 @@ -def run(db, table, table_obj): - """ - Clean list of teams from teams that do not exist anymore. - """ - for document in db.get_all(table): - for team_id in document["teams"]: - if db.get("code_jam_teams", team_id) is None: - document["teams"].remove(team_id) - db.insert(table, document, conflict="update", durability="soft") - db.sync(table) diff --git a/pysite/migrations/tables/hiphopify_namelist/__init__.py b/pysite/migrations/tables/hiphopify_namelist/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/pysite/migrations/tables/hiphopify_namelist/initial_data.json b/pysite/migrations/tables/hiphopify_namelist/initial_data.json deleted file mode 100644 index f0b15f63..00000000 --- a/pysite/migrations/tables/hiphopify_namelist/initial_data.json +++ /dev/null @@ -1,5198 +0,0 @@ -[ - { - "name": "100 Kila", - "image_url": "http://hotnews.bg/uploads/tinymce/w09/100-%D0%BA%D0%B8%D0%BB%D0%B0.jpg" - }, - { - "name": "100s", - "image_url": "http://images.complex.com/complex/image/upload/t_article_image/nzwte8lxj3p1orqf5yrm.jpg" - }, - { - "name": "12 Gauge", - "image_url": "http://cps-static.rovicorp.com/3/JPG_250/MI0001/358/MI0001358517.jpg" - }, - { - "name": "2 Chainz", - "image_url": "http://thesource.com/wp-content/uploads/2016/01/2-Chainz-rapper.jpg" - }, - { - "name": "2 Pistols", - "image_url": "http://images3.wikia.nocookie.net/__cb20130521104737/rap/images/0/0c/2p.jpg" - }, - { - "name": "2$ Fabo", - "image_url": "http://assets.audiomack.com/2-fabo/355f3587905bb4e2bc936f76cd64cef3.jpeg" - }, - { - "name": "21 Savage", - "image_url": "https://nyppagesix.files.wordpress.com/2018/04/21-savage-amber-rose.jpg" - }, - { - "name": "2Mex", - "image_url": "https://www.ballerstatus.com/wp-content/uploads/2016/05/2mex.jpg" - }, - { - "name": "360", - "image_url": "http://resources1.news.com.au/images/2012/07/19/1226428/465937-rapper-360-hit.jpg" - }, - { - "name": "40 Glocc", - "image_url": "http://www.ballerstatus.com/wp-content/uploads/2014/06/40glocc.jpg" - }, - { - "name": "50 Cent", - "image_url": "http://www.michellehenry.fr/rapper_50_cent.jpg" - }, - { - "name": "6lack", - "image_url": "http://electriccircus.co/home/wp-content/uploads/2017/01/black.jpg" - }, - { - "name": "6ix9ine", - "image_url": "http://thesource.com/wp-content/uploads/2018/04/Screen-Shot-2018-04-11-at-8.51.56-AM.png" - }, - { - "name": "The 6th Letter", - "image_url": "http://hw-img.datpiff.com/m5dadf91/The_6th_Letter_What_The_F_the_Mixtape-front-large.jpg" - }, - { - "name": "9th Wonder", - "image_url": "http://www.hiphopvideoworld.com/wp-content/uploads/2016/06/Talib-Kweli-ft.-9th-Wonder-Rapsody-Life-Ahead-Of-Me.jpg" - }, - { - "name": "Andre 3000", - "image_url": "http://1.bp.blogspot.com/-1TAyMhARS8s/UaWDLXzZzdI/AAAAAAAACDg/NOToaM0g_as/s1600/80999804-e1369795094594.jpg" - }, - { - "name": "Big Boi", - "image_url": "http://redalertpolitics.com/files/2013/01/BigBoi.jpg" - }, - { - "name": "A.CHAL", - "image_url": "http://images.thissongissick.com/c_fill-f_auto-g_faces-h_630-w_1200-v1496443961-this-song-is-sick-media-image-a-chal-press-shot-1496443960836-png.jpg" - }, - { - "name": "A+", - "image_url": "https://upload.wikimedia.org/wikipedia/commons/7/72/Guru_(rapper).jpg" - }, - { - "name": "A-Q", - "image_url": "http://www.eurweb.com/wp-content/uploads/2011/05/qtip.jpg" - }, - { - "name": "Arabian Prince", - "image_url": "https://68.media.tumblr.com/3938a8b6b11d462ba95807666e47f778/tumblr_mvjf8kRjCx1qzx6s2o1_500.jpg" - }, - { - "name": "Ab-Soul", - "image_url": "http://16762-presscdn-0-89.pagely.netdna-cdn.com/wp-content/uploads/2014/05/ab-soul.jpg" - }, - { - "name": "A Boogie wit da Hoodie", - "image_url": "https://vergecampus.com/wp-content/uploads/2018/04/Screen-Shot-2018-04-09-at-9.47.46-PM-1024x594.png" - }, - { - "name": "Abstract Rude", - "image_url": "http://media1.fdncms.com/orlando/imager/u/original/2554165/20170112_abstract_rude_5.jpg" - }, - { - "name": "Ace Hood", - "image_url": "http://www.aceshowbiz.com/images/news/00024363.jpg" - }, - { - "name": "Aceyalone", - "image_url": "http://images.rapgenius.com/4f38e699f6f80a3255420adf5e98a0a8.600x600x1.jpg" - }, - { - "name": "Action Bronson", - "image_url": "http://alloveralbany.com/images/rapper_Action_Bronson.jpg" - }, - { - "name": "Adam Saleh", - "image_url": "http://naibuzz.com/wp-content/uploads/2016/05/adam-saleh.jpg" - }, - { - "name": "Aesop Rock", - "image_url": "https://static-secure.guim.co.uk/sys-images/Guardian/Pix/pictures/2014/5/5/1399294322119/Rapper-Aesop-Rock-014.jpg" - }, - { - "name": "Afrika Bambaataa", - "image_url": "http://imageslogotv-a.akamaihd.net/uri/mgid:uma:image:logotv.com:11564172" - }, - { - "name": "Afroman", - "image_url": "http://www.irishnews.com/picturesarchive/irishnews/irishnews/2017/01/10/130012018-8220bff2-983c-48f3-ae57-276cab82f911.png" - }, - { - "name": "Afu-Ra", - "image_url": "https://upload.wikimedia.org/wikipedia/commons/thumb/2/2f/20120504_-_Afu-Ra.jpg/220px-20120504_-_Afu-Ra.jpg" - }, - { - "name": "Agallah", - "image_url": "http://1.bp.blogspot.com/-jJBR6f4cBwI/ThQ-NxjTffI/AAAAAAAABF4/Oe2n71hDmtM/s320/8%2Boff%2Bagallah.jpg" - }, - { - "name": "Ahmad", - "image_url": "http://images.rapgenius.com/38af31ae445f8c6ac6ce2a3b21a4605b.1000x684x1.jpg" - }, - { - "name": "Ajs Nigrutin", - "image_url": "http://vignette2.wikia.nocookie.net/rap/images/0/0f/Medium_ajs-nigrutin.jpg/revision/latest" - }, - { - "name": "Akala", - "image_url": "http://assets.londonist.com/uploads/2015/11/akala.jpg" - }, - { - "name": "Akinyele", - "image_url": "http://www.hiphopfind.com/upload/bukmtqhhlj.jpg" - }, - { - "name": "Akir", - "image_url": "http://www.iamhiphopmagazine.com/wp-content/uploads/2013/05/Akir.jpg" - }, - { - "name": "Akon", - "image_url": "http://img.mi9.com/male-celebrities/5077/akon-rapper-2012_1920x1200_96228.jpg" - }, - { - "name": "The Alchemist", - "image_url": "http://4.bp.blogspot.com/_nF-S6ZVuhd4/SuESHfU70_I/AAAAAAAAABs/s0txyMZP-Ps/s400/alc.jpg" - }, - { - "name": "Ali Vegas", - "image_url": "https://s3-us-west-2.amazonaws.com/maven-user-photos/f0f13b1e-f33a-4136-bc5a-6a0f09dd591f" - }, - { - "name": "Alpha", - "image_url": "https://images.rapgenius.com/9f2ba7bd713179faa8fe8968969f82eb.1000x667x1.jpg" - }, - { - "name": "AMG", - "image_url": "http://en.academic.ru/pictures/enwiki/65/Amg_rapper.jpg" - }, - { - "name": "Amil", - "image_url": "http://3.bp.blogspot.com/_RaOrchOImw8/SxSVt5z1auI/AAAAAAAAbeQ/sZ7xLZjOmco/s1600/Amil.jpg" - }, - { - "name": "Aminé", - "image_url": "https://upload.wikimedia.org/wikipedia/commons/thumb/1/17/Amine_performing_on_Jimmy_Fallon_in_2017_%28crop%29.png/1200px-Amine_performing_on_Jimmy_Fallon_in_2017_%28crop%29.png" - }, - { - "name": "Amir Obè", - "image_url": "http://www.brooklynvegan.com/files/2016/03/Amir-Obe-Press-2015-billboard-650-e1457450170547.jpg" - }, - { - "name": "Ampichino", - "image_url": "http://ecx.images-amazon.com/images/I/51rPUuz7FTL._SL500_AA280_.jpg" - }, - { - "name": "Anderson .Paak", - "image_url": "http://okp-cdn.okayplayer.com/wp-content/uploads/2017/01/Chance-The-Rapper-Anderson-.Paak_.jpg" - }, - { - "name": "André 3000", - "image_url": "http://1.bp.blogspot.com/-1TAyMhARS8s/UaWDLXzZzdI/AAAAAAAACDg/NOToaM0g_as/s1600/80999804-e1369795094594.jpg" - }, - { - "name": "Andre Nickatina", - "image_url": "http://favimages.com/wp-content/uploads/2012/08/rapper-andre-nickatina-singer-man-star.jpg" - }, - { - "name": "Andy Mineo", - "image_url": "http://media-cache-ec0.pinimg.com/736x/8c/fa/7a/8cfa7aebe58f9bc08a140cc571d62723.jpg" - }, - { - "name": "Angel Haze", - "image_url": "http://www.trbimg.com/img-508ac7c2/turbine/la-et-ms-fall-in-love-with-angel-haze-20121025-003/600" - }, - { - "name": "Angie Martinez", - "image_url": "http://www.missinfo.tv/wp-content/uploads/2014/03/yg-angie-martinez.png" - }, - { - "name": "Ant", - "image_url": "http://static.vibe.com/files/article_images/yg-addie.jpg" - }, - { - "name": "Ant Banks", - "image_url": "http://www.rapmusicguide.com/amass/images/inventory/2415/Ant%20Banks%20-%20Big%20Thangs.jpg" - }, - { - "name": "Antoinette", - "image_url": "http://static.squarespace.com/static/520ed800e4b0229123208764/521febeae4b011f034449849/521febebe4b0b42980e39d2d/1377823723826/whostheboss.jpg" - }, - { - "name": "Anybody Killa", - "image_url": "http://cdn.ticketfly.com/i/00/01/38/13/01-atxl1.png" - }, - { - "name": "Apache", - "image_url": "http://mtv.mtvnimages.com/uri/mgid:uma:image:mtv.com:4554653" - }, - { - "name": "Apathy", - "image_url": "https://upload.wikimedia.org/wikipedia/commons/1/1f/Apathy_rapper.jpg" - }, - { - "name": "Arin Hanson", - "image_url": "https://i.redditmedia.com/WE_gR0aOODE9WLF-83188AYG9Rd2QknnezyMyKVv_q0.jpg" - }, - { - "name": "A$AP Ferg", - "image_url": "http://media.gettyimages.com/photos/rapper-aap-ferg-performs-in-concert-at-austin-music-hall-on-february-picture-id508118894" - }, - { - "name": "A$AP Nast", - "image_url": "https://i1.wp.com/hypebeast.com/image/2017/02/asap-nast-calabasas-collection-video-0-1.jpg" - }, - { - "name": "A$AP Rocky", - "image_url": "http://3.bp.blogspot.com/-4ks0l9W_v9w/T_H3jtPbI-I/AAAAAAACePQ/9fbnSjU60zE/s1600/Rapper+A$AP+Rocky.jpg" - }, - { - "name": "A$AP Yams", - "image_url": "http://cdn.chartattack.com/wp-content/uploads/2015/01/asap-yams.jpg" - }, - { - "name": "A$ton Matthews", - "image_url": "http://hivesociety.com/wp-content/uploads/2014/07/Aston004.jpg" - }, - { - "name": "Asher Roth", - "image_url": "http://www.streetgangs.com/wp-content/uploads/2010/08/asher-roth.jpg" - }, - { - "name": "Astronautalis", - "image_url": "http://jacksonville.com/sites/default/files/imagecache/superphoto/photos/blogs/141/13358_203735570707_32280295707_4512309_5261114_n.jpg" - }, - { - "name": "Awol One", - "image_url": "http://images.complex.com/complex/image/upload/c_limit,w_680/fl_lossy,pg_1,q_auto/lqiqtknfvukvwx4ki4te.jpg" - }, - { - "name": "Awkwafina", - "image_url": "http://media3.s-nbcnews.com/i/newscms/2014_35/635111/awkwafina_06_00cd08f4bbc01bf20145954bf5e97fc0.jpg" - }, - { - "name": "AZ", - "image_url": "https://upload.wikimedia.org/wikipedia/commons/7/76/Az-03.jpg" - }, - { - "name": "Azealia Banks", - "image_url": "http://i.huffpost.com/gen/920953/images/o-RAPPER-AZEALIA-BANKS-facebook.jpg" - }, - { - "name": "Big Daddy Kane", - "image_url": "http://images.rapgenius.com/30a5d7f5135fdf9124beff6834884ff8.640x773x1.jpg" - }, - { - "name": "Busta Rhymes", - "image_url": "http://newsbite.it/public/images/articles/busta-drake.jpg" - }, - { - "name": "B-Legit", - "image_url": "http://cps-static.rovicorp.com/3/JPG_500/MI0003/729/MI0003729154.jpg" - }, - { - "name": "B-Real", - "image_url": "http://www3.pictures.zimbio.com/pc/Rapper+B+Real+Cypress+Hill+outside+Beso+Hollywood+sklqv7IPKMfl.jpg" - }, - { - "name": "B.G.", - "image_url": "http://1.bp.blogspot.com/-L8lASsCAFzo/Ve46XOQJynI/AAAAAAAAJOw/zJ6vIxtAbrs/s400/BG-In-Prison-2015.jpg" - }, - { - "name": "B.G. Knocc Out", - "image_url": "https://escobar300.files.wordpress.com/2013/08/b-g-knocc-out.png" - }, - { - "name": "B.o.B", - "image_url": "http://www4.pictures.zimbio.com/gi/B+o+B+rapper+BET+Hip+Hop+Awards+2010+Arrivals+bQ93QLw6t05l.jpg" - }, - { - "name": "Baby Bash", - "image_url": "http://ww2.hdnux.com/photos/24/26/14/5333761/5/960x540.jpg" - }, - { - "name": "Baby Boy da Prince", - "image_url": "http://www.rapartists.com/_files/pictures/full/1924_baby_boy_da_prince_u03.jpg" - }, - { - "name": "Baby D", - "image_url": "http://cdn.straightfromthea.com/wp-content/uploads/2008/03/babyd2.jpg" - }, - { - "name": "Bad Azz", - "image_url": "https://s3.amazonaws.com/hiphopdx-production/2015/10/Bad-Azz_10-08-2015.jpg" - }, - { - "name": "Badshah", - "image_url": "http://freehdwallpapersz.com/wp-content/uploads/2016/06/badshah-rapper-wallpaper.jpg" - }, - { - "name": "Baeza", - "image_url": "https://40.media.tumblr.com/bcb78b58c6c7a906342772115424c983/tumblr_mhpekhIOKd1rily04o1_500.jpg" - }, - { - "name": "Bahamadia", - "image_url": "http://hiphopgoldenage.com/wp-content/uploads/2015/08/CS1700455-02A-BIG.jpg" - }, - { - "name": "Baka Not Nice", - "image_url": "http://rapradar.com/wp-content/uploads/2015/05/baka.jpg" - }, - { - "name": "Bang Yong-guk", - "image_url": "http://favimages.com/wp-content/uploads/2012/08/rapper-bang-yong-guk-dance-song-hip-hop.jpg" - }, - { - "name": "Bangladesh", - "image_url": "http://www.nodfactor.com/wp-content/uploads/2010/04/bangladesh_0.jpg" - }, - { - "name": "Bas", - "image_url": "http://cps-static.rovicorp.com/3/JPG_400/MI0004/032/MI0004032446.jpg" - }, - { - "name": "Battlecat", - "image_url": "https://mediaanarchist.files.wordpress.com/2013/07/7995104660_aeda73b31f_z.jpg" - }, - { - "name": "Beanie Sigel", - "image_url": "http://hustlebunny.com/content/2012/07/beanie-sigel-rapper.jpg" - }, - { - "name": "Becky G", - "image_url": "https://40.media.tumblr.com/da84f75189bb52c8d66f64dc5ea20bf1/tumblr_mo8inbcBAK1qfyjoto1_500.jpg" - }, - { - "name": "Benny Blanco", - "image_url": "http://cache2.asset-cache.net/gc/473115600-rapper-benny-blanco-attends-the-63rd-annual-gettyimages.jpg" - }, - { - "name": "Beenzino", - "image_url": "http://www.kpopmusic.com/wp-content/uploads/2015/10/beenzino-3.jpg" - }, - { - "name": "Benzino", - "image_url": "http://missxpose.com/wp-content/uploads/2014/03/benzino.png" - }, - { - "name": "Big Boi", - "image_url": "http://redalertpolitics.com/files/2013/01/BigBoi.jpg" - }, - { - "name": "Big Daddy Kane", - "image_url": "http://images.rapgenius.com/30a5d7f5135fdf9124beff6834884ff8.640x773x1.jpg" - }, - { - "name": "Big Ed", - "image_url": "http://upload.wikimedia.org/wikipedia/en/8/8d/Big_Ed.jpg" - }, - { - "name": "Big Gipp", - "image_url": "http://www.stacksmag.net/wp-content/uploads/2014/09/stacksmag007atllive.png" - }, - { - "name": "Big Hawk", - "image_url": "http://favimages.com/wp-content/uploads/2012/08/rapper-big-hawk-celebrity-star-style.jpg" - }, - { - "name": "Big K.R.I.T.", - "image_url": "http://www.thissongslaps.com/wp-content/uploads/2014/09/big_krit-news-article921121.png" - }, - { - "name": "Big Kuntry King", - "image_url": "http://s4.evcdn.com/images/block250/I0-001/000/989/283-8.jpeg_/big-kuntry-king-83.jpeg" - }, - { - "name": "Big L", - "image_url": "http://outlookaub.com/wp-content/uploads/2015/03/big-l.jpg" - }, - { - "name": "Big Lurch", - "image_url": "https://thoughtcatalog.files.wordpress.com/2015/09/big_lurch.jpg" - }, - { - "name": "Big Mello", - "image_url": "http://hivesociety.com/wp-content/uploads/2015/10/big-mello.jpg" - }, - { - "name": "Big Mike", - "image_url": "http://fakehustle.files.wordpress.com/2009/02/big-mike.jpg" - }, - { - "name": "Big Moe", - "image_url": "http://s3.amazonaws.com/rapgenius/big-moe_480x480.jpg" - }, - { - "name": "Big Noyd", - "image_url": "http://singersroom.com/upload/2013/03/Big-Noyd-Light-Up-The-Night.jpg" - }, - { - "name": "Big Pokey", - "image_url": "http://purple-drank.com/wp-content/uploads/2013/06/Big-Pokey.png" - }, - { - "name": "Big Pooh", - "image_url": "http://ambrosiaforheads.com/wp-content/uploads/2012/07/Rapper+Big+Pooh+Big+p00h.jpg" - }, - { - "name": "Big Pun", - "image_url": "http://assets.nydailynews.com/polopoly_fs/1.1620420.1392857208!/img/httpImage/image.jpg_gen/derivatives/article_750/big-pun-legacy.jpg" - }, - { - "name": "Big Reese", - "image_url": "https://dpjsgvx0fhwmn.cloudfront.net/albums/34235/large/bb2c7032b95187e95b92.jpg" - }, - { - "name": "Big Scoob", - "image_url": "http://www.funmissouri.com/uploads/files/2013/06/big-scoob-rapper-missouri.png" - }, - { - "name": "Big Smo", - "image_url": "https://i.ytimg.com/vi/igZweLr604Y/maxresdefault.jpg" - }, - { - "name": "Big Sean", - "image_url": "http://images5.fanpop.com/image/photos/27200000/Big-Sean-big-sean-rapper-27232010-500-610.jpg" - }, - { - "name": "Big Shaq", - "image_url": "https://hypebeast.imgix.net/http%3A%2F%2Fhypebeast.com%2Fimage%2F2017%2F10%2Frapper-halloween-costumes-lil-pump-roadman-shaq-lil-peep-lil-b-lil-uzi-vert-00.jpg" - }, - { - "name": "Big Shug", - "image_url": "https://s-media-cache-ak0.pinimg.com/736x/d1/2a/db/d12adb999028c2db003aa5e736e585a2.jpg" - }, - { - "name": "Big Syke", - "image_url": "https://pmchollywoodlife.files.wordpress.com/2016/12/big-syke-rapper-died-ftr.jpg" - }, - { - "name": "Bigg D", - "image_url": "http://www.4umf.com/wp-content/uploads/2014/11/Rapper-Big-Paybacc-Killed.jpg" - }, - { - "name": "Billy Woods", - "image_url": "http://backwoodzstudioz.com/wp-content/uploads/2013/06/BillyWoods_AlexanderRichter_WebReady_Press_DourCandy_2C.jpg" - }, - { - "name": "Birdman", - "image_url": "http://www.ablogtowatch.com/wp-content/uploads/2010/12/clip_image008.jpg" - }, - { - "name": "Bishop Nehru", - "image_url": "http://cdn2.pitchfork.com/news/53665/e5bac495.jpg" - }, - { - "name": "Biz Markie", - "image_url": "http://assets.nydailynews.com/polopoly_fs/1.1451937.1378902764!/img/httpImage/image.jpg_gen/derivatives/article_1200/biz-markie.jpg" - }, - { - "name": "Bizarre", - "image_url": "https://upload.wikimedia.org/wikipedia/commons/thumb/b/b7/Bizarre.jpg/1200px-Bizarre.jpg" - }, - { - "name": "Bugz", - "image_url": "http://1.bp.blogspot.com/-zqDNlEcJS9Q/U3JTKpcl7hI/AAAAAAAAAcw/sQJSzSDVIq4/s1600/bugz+image.jpg" - }, - { - "name": "Bizzy", - "image_url": "http://wprapradar.s3.amazonaws.com/wp-content/uploads/2010/05/bizzy-bone1.jpg" - }, - { - "name": "Bizzy Bone", - "image_url": "https://nowtoronto.com/downloads/68186/download/BizzyBone.jpg" - }, - { - "name": "BJ the Chicago Kid", - "image_url": "https://consequenceofsound.files.wordpress.com/2015/08/chance-the-rapper-bj-the-chicago-kid.jpg" - }, - { - "name": "Black Milk", - "image_url": "http://hiphop-n-more.com/wp-content/uploads/2010/09/black-milk-9.jpg" - }, - { - "name": "Black Rob", - "image_url": "http://mtv.mtvnimages.com/uri/mgid:uma:image:mtv.com:1676761" - }, - { - "name": "Black Thought", - "image_url": "http://vibesource.files.wordpress.com/2008/06/black-thought-mcsforlifevibesourcemag.jpg" - }, - { - "name": "Blade Icewood", - "image_url": "http://www.officialpsds.com/images/thumbs/Blade-Icewood-psd61214.png" - }, - { - "name": "Blaq Poet", - "image_url": "http://www.audibletreats.com/wp-content/gallery/blaqpoet/blaq_poet-street.jpg" - }, - { - "name": "Blaze Ya Dead Homie", - "image_url": "http://img3.wikia.nocookie.net/__cb20130520210459/rap/images/b/bb/Blaze_ya_dead_homie.jpg" - }, - { - "name": "BlocBoy JB", - "image_url": "https://rapdose.com/wp-content/uploads/fly-images/146583/asap-forever-378x250-c.jpg" - }, - { - "name": "Blood Raw", - "image_url": "http://www.rapartists.com/_files/pictures/full/2313_blood_raw.jpg" - }, - { - "name": "Blu", - "image_url": "http://thecomeupshow.com/wp-content/uploads/2012/08/blu-rapper.jpg" - }, - { - "name": "Bob Doe", - "image_url": "http://media-cache-ak0.pinimg.com/736x/84/e0/35/84e0355d2eaac3e990892bad26267ff2.jpg" - }, - { - "name": "Bobby Brackins", - "image_url": "http://www1.pictures.zimbio.com/gi/Bobby+Brackins+Puma+Presents+Riddim+Run+Benefiting+1v-Ki1nD2Owl.jpg" - }, - { - "name": "Bobby Creekwater", - "image_url": "http://static.djbooth.net/pics-artist/bobbycreekwater2.jpg" - }, - { - "name": "Bobby Shmurda", - "image_url": "https://static.pulse.ng/img/incoming/origs3920830/3240485024-w980-h640/bobby-shmurda-and-rihanna.jpg" - }, - { - "name": "Bohemia", - "image_url": "http://1.bp.blogspot.com/-vnAVLnSXj1k/UskN6icYkBI/AAAAAAAAAUM/6jbrIjj-GS0/s1600/From+the+set+of+Dada+in+Bahrain.jpg" - }, - { - "name": "Boi-1da", - "image_url": "http://www.beatmakingvideos.com/sites/default/files/producer_foto/boi_1da.jpg" - }, - { - "name": "Boldy James", - "image_url": "http://thoughtontracks.files.wordpress.com/2012/06/boldy-james.jpg" - }, - { - "name": "Bone Crusher", - "image_url": "http://images2.mtv.com/uri/mgid:uma:artist:mtv.com:1235147" - }, - { - "name": "Bones", - "image_url": "https://s-media-cache-ak0.pinimg.com/736x/e7/3a/2e/e73a2e853bd074c32d1abe08900ba2a7.jpg" - }, - { - "name": "Booba", - "image_url": "https://underneathestarz.files.wordpress.com/2015/06/boo23.jpg" - }, - { - "name": "Boondox", - "image_url": "http://static.tvtropes.org/pmwiki/pub/images/boondox01_7971.jpg" - }, - { - "name": "Boosie Badazz", - "image_url": "http://www.rap-up.com/app/uploads/2015/11/boosie-hat.jpg" - }, - { - "name": "Boss", - "image_url": "http://3.bp.blogspot.com/-2Tn1dMXQIzE/TtW53Kcvo4I/AAAAAAAADcQ/LNWNkwDCwIY/s1600/Boss.jpg" - }, - { - "name": "Bow Wow", - "image_url": "https://thedrinksbusiness.com/wordpress/wp-content/uploads/2015/03/lil-bow-wow-net-worth-424x640.jpg" - }, - { - "name": "Braille", - "image_url": "http://media1.fdncms.com/bend/imager/braille-read-him-with-your-ears/u/original/2148215/braille.jpg" - }, - { - "name": "Brandun DeShay", - "image_url": "https://s-media-cache-ak0.pinimg.com/736x/4b/28/bb/4b28bbbd4f6d7223e07d312b7cacc2ac--rapper-artists.jpg" - }, - { - "name": "Brianna Perry", - "image_url": "http://4.bp.blogspot.com/-IXYep2nCIwI/T0F0AX6zRZI/AAAAAAAACRg/4agQBS5a50Y/s1600/rapper-brianna.jpg" - }, - { - "name": "Brisco", - "image_url": "http://www.yorapper.com/Photos/brisco-rap.jpg" - }, - { - "name": "Brotha Lynch Hung", - "image_url": "http://favimages.com/wp-content/uploads/2012/08/rapper-brotha-lynch-hung-song-recitation-fame.jpg" - }, - { - "name": "Bruno Mars", - "image_url": "http://www2.pictures.zimbio.com/gi/Bruno+Mars+B+o+B+rapper+2010+MTV+Video+Music+TeX5_EMP-jDl.jpg" - }, - { - "name": "Brother Ali", - "image_url": "http://www.killerhiphop.com/wp-content/uploads/2012/02/Brother-Ali.jpg" - }, - { - "name": "Bryson Tiller", - "image_url": "https://i.pinimg.com/736x/00/2d/f7/002df7c879422acb3a18c00c224300f3--bryson-tiller-rapper.jpg" - }, - { - "name": "Bubba Sparxxx", - "image_url": "http://www.contactmusic.com/pics/l/ludacris_benefit_250408/rapper_bubba_sparxxx_5124692.jpg" - }, - { - "name": "Buckshot", - "image_url": "https://i.ytimg.com/vi/JU81txDlbx8/maxresdefault.jpg" - }, - { - "name": "Buckwild", - "image_url": "http://www.blackouthiphop.com/blog/wp-content/uploads/2011/04/buckwild-producer1.jpg" - }, - { - "name": "Bumpy Knuckles", - "image_url": "http://streetknowledge.files.wordpress.com/2008/07/bumpy_knuckles.jpg" - }, - { - "name": "Bun B", - "image_url": "http://ww4.hdnux.com/photos/23/53/75/5160803/3/rawImage.jpg" - }, - { - "name": "Busdriver", - "image_url": "http://images2.laweekly.com/imager/busdriver/u/original/5177944/busdriver_photo-l_dianadalsasso2014.jpg" - }, - { - "name": "Bushwick Bill", - "image_url": "http://www.collegebaseballtoday.com/files/2013/05/BushwickBill_Stitches1.jpg" - }, - { - "name": "Busta Rhymes", - "image_url": "http://newsbite.it/public/images/articles/busta-drake.jpg" - }, - { - "name": "Busy Bee Starski", - "image_url": "https://s3.amazonaws.com/battlerap-production/2014/09/Busy-Bee610.jpg" - }, - { - "name": "Butch Cassidy", - "image_url": "https://pbs.twimg.com/profile_images/378800000221503061/5d6802b25f28f80c390d48fd1aca20d1.jpeg" - }, - { - "name": "Common", - "image_url": "http://i.huffpost.com/gen/1352726/thumbs/o-RAPPER-COMMON-facebook.jpg" - }, - { - "name": "C-Bo", - "image_url": "http://unitedgangs.files.wordpress.com/2010/04/c-bo.jpg" - }, - { - "name": "C-Murder", - "image_url": "http://media.nola.com/crime_impact/photo/cmurder-horizontal-cropjpg-77be374eafb600e4.jpg" - }, - { - "name": "C-Note", - "image_url": "https://i.ytimg.com/vi/F40M4icrNMQ/maxresdefault.jpg" - }, - { - "name": "C-Rayz Walz", - "image_url": "https://s3.amazonaws.com/hiphopdx-production/2017/04/C-Rayz-WalzInstagram-e1491328882399-827x620.png" - }, - { - "name": "Cage", - "image_url": "http://1.bp.blogspot.com/_4ZiWxZWnbZE/TVEuUjybxkI/AAAAAAAAAWQ/SjyC6aacpXc/s1600/cagecrazy.jpg" - }, - { - "name": "Cam'ron", - "image_url": "http://www.yorapper.com/Photos/camron-ringtones.jpg" - }, - { - "name": "Canibus", - "image_url": "http://upload.wikimedia.org/wikipedia/commons/d/d9/Canibus_at_Amager_Bio_4.jpg" - }, - { - "name": "Capital Steez", - "image_url": "http://images.complex.com/complex/image/upload/c_fill,g_center,h_640,w_640/fl_lossy,pg_1,q_auto/gjpwujnfpj1afsu4uawy.jpg" - }, - { - "name": "Capone", - "image_url": "https://consequenceofsound.files.wordpress.com/2018/04/the-meadows-2017-ben-kaye-run-the-jewels-7.jpg" - }, - { - "name": "Cappadonna", - "image_url": "http://favimages.com/wp-content/uploads/2012/08/rapper-cappadonna-star-celebrity-best-photo.jpg" - }, - { - "name": "Cardi B", - "image_url": "https://rapdose.com/wp-content/uploads/2018/03/cardi-b-be-careful.jpg" - }, - { - "name": "Casey Veggies", - "image_url": "http://wac.450f.edgecastcdn.net/80450F/theboombox.com/files/2015/02/caseyveggies-630x420.jpg" - }, - { - "name": "Cash Out", - "image_url": "http://jojocrews.com/wp-content/uploads/2015/01/cash1.jpg" - }, - { - "name": "Cashis", - "image_url": "http://mediastarr.files.wordpress.com/2008/10/cashismusiccom1.jpg" - }, - { - "name": "Caskey", - "image_url": "http://social.rollins.edu/wpsites/mousetrap/files/2016/06/Caskey.jpg" - }, - { - "name": "Casper Nyovest", - "image_url": "http://www.destinyman.com/wp-content/uploads/2015/04/Casper-Nyovest--690x450.jpg" - }, - { - "name": "Cassidy", - "image_url": "http://www.missxpose.com/wp-content/uploads/2010/03/BET+Rip+Runway+2010+Arrivals+MPN9FSqiQxql2.jpg" - }, - { - "name": "Cazwell", - "image_url": "http://1.bp.blogspot.com/-yxVYPS6GT4Q/TdLjbiV2bYI/AAAAAAAAESs/ecXi9lrdkKM/s1600/cazwell.jpg" - }, - { - "name": "CeeLo Green", - "image_url": "https://www.festivalsherpa.com/wp-content/uploads/2014/09/ceelo.jpg" - }, - { - "name": "Cellski", - "image_url": "http://images.rapgenius.com/56c23a073295a1baa7c88f22411a8a9a.500x500x1.jpg" - }, - { - "name": "Celly Cel", - "image_url": "http://cps-static.rovicorp.com/3/JPG_400/MI0003/729/MI0003729697.jpg" - }, - { - "name": "Celph Titled", - "image_url": "http://s3.amazonaws.com/rapgenius/1362723298_l.jpg" - }, - { - "name": "Cesar Comanche", - "image_url": "http://d2jos65913uaef.cloudfront.net/wp-content/uploads/2013/07/Cesar_comanche_interview-200x130.jpg" - }, - { - "name": "Ceza", - "image_url": "https://musicinculture.files.wordpress.com/2011/04/ceza40ke9_1_.jpg" - }, - { - "name": "Chamillionaire", - "image_url": "http://i.dailymail.co.uk/i/pix/2016/02/19/09/01BC5195000004B0-3454235-image-m-26_1455874575624.jpg" - }, - { - "name": "Chance the Rapper", - "image_url": "http://rukkus.com/blog/wp-content/uploads/2014/01/chance-the-rapper.png" - }, - { - "name": "Chanel West Coast", - "image_url": "http://images1.laweekly.com/imager/rapper-reality-tv-star-chanel-west-coast/u/original/5002632/law_chanel_west_coast-3280-edit.jpg" - }, - { - "name": "Channel 7", - "image_url": "http://media.gettyimages.com/photos/south-korean-rapper-psy-performs-live-on-channel-7s-sunrise-at-martin-picture-id154251648" - }, - { - "name": "Charizma", - "image_url": "http://4ca03fhcpiv4bsn7vbg2ef11td.wpengine.netdna-cdn.com/wp-content/uploads/2014/09/1b820b3864413e7b3fba3958b433d733-1024x690.jpg" - }, - { - "name": "Charles Hamilton", - "image_url": "http://www.billboard.com/files/styles/promo_650/public/media/charles-hamilton-brigitte-sire-bb7-2015-billboard-650.jpg" - }, - { - "name": "Charli Baltimore", - "image_url": "http://djpinkietuscadero.files.wordpress.com/2013/08/charli-baltimore.jpg" - }, - { - "name": "Chevy Woods", - "image_url": "http://www.post-gazette.com/image/2015/08/04/ca11,5,1918,1913/chevy0806b0553-1.jpg" - }, - { - "name": "Chi Ali", - "image_url": "http://www.vladtv.com/images/size_fs/video_image-133965.jpg" - }, - { - "name": "Chali 2na", - "image_url": "https://upload.wikimedia.org/wikipedia/commons/2/2a/Chali2na.jpg" - }, - { - "name": "Chiddy Bang", - "image_url": "http://campuseventsblog.com/wp-content/uploads/2012/09/CHIDDYPHOTO1.jpg" - }, - { - "name": "Chief Keef", - "image_url": "http://wallpapersqq.net/wp-content/uploads/2016/01/Chief-Keef-6.jpg" - }, - { - "name": "Childish Gambino", - "image_url": "http://diymag.com/media/img/Artists/C/Childish-Gambino/_1500x1000_crop_center-center_75/Childish-Gambino-Press-Photo-copy.jpg" - }, - { - "name": "Chill Rob G", - "image_url": "https://img.youtube.com/vi/Hd0aNVDOo3U/0.jpg" - }, - { - "name": "Chingy", - "image_url": "http://tattletailzz.com/wp-content/uploads/2013/03/SGG-008258.jpg" - }, - { - "name": "Chingo Bling", - "image_url": "https://atlantalatinos.com/wp-content/uploads/2018/03/chingo-bling-atlanta-georgia-atlantalatinos-2-1068x1067.jpg" - }, - { - "name": "Chino XL", - "image_url": "http://iv1.lisimg.com/image/436161/600full-chino-xl.jpg" - }, - { - "name": "Chinx", - "image_url": "http://images.complex.com/complex/image/upload/t_article_image/chinx-rapper-2_jyerea.jpg" - }, - { - "name": "Chip", - "image_url": "http://www.voice-online.co.uk/sites/default/files/imagecache/455/chip-rapper-RIP.jpg" - }, - { - "name": "Choice", - "image_url": "http://2.bp.blogspot.com/-TjL6ZSCN8kA/UTimdEyVUSI/AAAAAAAABYI/fUlPXSKfg7o/s320/choiceback.jpg" - }, - { - "name": "Choppa", - "image_url": "http://fanpagepress.net/m/C/choppa-rapper-1.jpg" - }, - { - "name": "Chris Brown", - "image_url": "http://www.hdwallpaper4u.com/wp-content/uploads/2015/07/chris-brown_rapper_look.jpg" - }, - { - "name": "Chris Webby", - "image_url": "http://thissongissick.com/blog/wp-content/uploads/2011/11/Chris-Webby-Rapper.jpg" - }, - { - "name": "Christopher Martin", - "image_url": "http://www2.pictures.zimbio.com/gi/Heavy+D+Funeral+Service+Qy4IEAGabbUx.jpg" - }, - { - "name": "Christopher Reid", - "image_url": "http://static.atlantablackstar.com/wp-content/uploads/2014/09/Christopher-Kid-Reid.jpg" - }, - { - "name": "Chubb Rock", - "image_url": "http://www.largeup.com/wp-content/uploads/2012/07/chubb-rock.jpg" - }, - { - "name": "CJ Fly", - "image_url": "https://images.rapgenius.com/02df360b384c97322368321affc6603c.600x338x73.gif" - }, - { - "name": "CL", - "image_url": "http://koogle.tv/static/media/uploads/news/010915_2ne1-cl_01.jpg" - }, - { - "name": "CL Smooth", - "image_url": "http://i2.cdn.turner.com/cnnnext/dam/assets/130502100438-08-90s-rappers-horizontal-large-gallery.jpg" - }, - { - "name": "Classified", - "image_url": "https://upload.wikimedia.org/wikipedia/commons/c/c5/2011_MuchMusic_Video_Awards_-_Classified.jpg" - }, - { - "name": "Clinton Sparks", - "image_url": "http://www.themusicgroupagency.com/Artist%20Bio_Pixs/DJ%20CLINTON%20SPARKS.jpg" - }, - { - "name": "Clyde Carson", - "image_url": "http://www2.pictures.zimbio.com/gi/Clyde+Carson+2012+BET+Awards+Celebrity+Gifting+h3makmUgLDQl.jpg" - }, - { - "name": "Cold 187um", - "image_url": "http://cps-static.rovicorp.com/3/JPG_400/MI0003/471/MI0003471422.jpg" - }, - { - "name": "Common", - "image_url": "http://i.huffpost.com/gen/1352726/thumbs/o-RAPPER-COMMON-facebook.jpg" - }, - { - "name": "Consequence", - "image_url": "http://cdn.cnwimg.com/wp-content/uploads/2013/01/consequence.jpg" - }, - { - "name": "Cool Breeze", - "image_url": "http://www4.pictures.zimbio.com/gi/2010+Vh1+Hip+Hop+Honors+Arrivals+6Kw4hn4nNHJl.jpg" - }, - { - "name": "Cool C", - "image_url": "http://bloximages.chicago2.vip.townnews.com/phillytrib.com/content/tncms/assets/v3/editorial/e/a3/ea3f0f99-c7b3-5a16-a498-43e00ef30007/5473f146bc971.image.jpg" - }, - { - "name": "Coolio", - "image_url": "http://1.bp.blogspot.com/_B1LlYh6iKqs/TEpHopMKndI/AAAAAAAACVQ/w5typW_-Cqo/s1600/coolio.jpg" - }, - { - "name": "Copywrite", - "image_url": "http://ifelicious.com/wp-content/uploads/2010/06/RapperCopywrite_614cap.jpg" - }, - { - "name": "Cormega", - "image_url": "http://www.iamhiphopmagazine.com/wp-content/uploads/2013/02/cormega_by_G_M_D_THREE_02.jpg" - }, - { - "name": "Cory Gunz", - "image_url": "http://www.aceshowbiz.com/images/wennpic/cory-gunz-set-music-video-fred-the-godson-01.jpg" - }, - { - "name": "Cordaro Stewart", - "image_url": "http://www.famousbirthdays.com/thumbnails/stewart-cordaro-large.jpg" - }, - { - "name": "Count Bass D", - "image_url": "https://massappeal.com/wp-content/uploads/2012/10/count-bass-d.jpg" - }, - { - "name": "The Coup", - "image_url": "http://media.philly.com/images/600*450/20121207_inq_wkpfea07-a.JPG" - }, - { - "name": "Craig Mack", - "image_url": "https://escobar300.files.wordpress.com/2011/08/craig-mack.jpg" - }, - { - "name": "Crime Boss", - "image_url": "http://www.angelfire.com/ok/midsouthhiphop/images/CRIME.jpg" - }, - { - "name": "Criminal Manne", - "image_url": "http://www.hip-hopvibe.com/wp-content/uploads/2013/02/Criminal-Manne.jpg" - }, - { - "name": "Crooked I", - "image_url": "http://zmldajoker.com/wp-content/uploads/2012/08/Crooked-I.jpg" - }, - { - "name": "Crucial Star", - "image_url": "http://www.allkpop.com/upload/2017/02/af_org/crucial-star_1486480774_af_org.jpg" - }, - { - "name": "Cupcakke", - "image_url": "https://lastfm-img2.akamaized.net/i/u/770x0/fd2ee4b462b471a02f1d47c6908aa414.jpg#fd2ee4b462b471a02f1d47c6908aa414" - }, - { - "name": "Currensy", - "image_url": "http://www.rapbasement.com/wp-content/uploads/2013/09/currensy.jpg" - }, - { - "name": "Curtiss King", - "image_url": "http://images.genius.com/d117bf90749090895c48b26d53585f3f.640x640x1.jpg" - }, - { - "name": "Cyhi the Prynce", - "image_url": "http://hiphop-n-more.com/wp-content/uploads/2016/02/cyhi-the-prynce-montreality-680x462.jpg" - }, - { - "name": "Del Tha Funkee Homosapien", - "image_url": "http://www.fagostore.com/shared/d/de988c79be500dce37c77c306ca4c1c7_hw600_width.jpg" - }, - { - "name": "Dr. Dre", - "image_url": "https://pennylibertygbow.files.wordpress.com/2012/02/drdre.gif" - }, - { - "name": "D'Angelo", - "image_url": "http://1.bp.blogspot.com/-eWbI_zHem7w/T05dilWoEqI/AAAAAAADZjw/w-bTjY7Ro1Q/s400/dangelo-1.jpg" - }, - { - "name": "D'banj", - "image_url": "http://cache2.asset-cache.net/gc/150994476-rapper-d-banj-is-photographed-for-the-gettyimages.jpg" - }, - { - "name": "D-Loc", - "image_url": "http://s3.amazonaws.com/rapgenius/YJsUar79REWtkxvOpCVw_d-loc.jpg" - }, - { - "name": "D-Nice", - "image_url": "http://img.wax.fm/releases/2386762/d-nice-call-me-d-nice-1523902.jpeg" - }, - { - "name": "D-Pryde", - "image_url": "https://upload.wikimedia.org/wikipedia/commons/b/ba/Plan_A_Merchandise_Promotion.png" - }, - { - "name": "The D.O.C.", - "image_url": "http://www.blackouthiphop.com/blog/wp-content/uploads/2011/01/The+DOC.jpg" - }, - { - "name": "Da Brat", - "image_url": "http://3.bp.blogspot.com/-2ptC5bvDzrc/Ti2nZQfRhKI/AAAAAAAARhA/Zq7JHQZPftU/s1600/Da-Brat-vibe1.jpg" - }, - { - "name": "Da$h", - "image_url": "http://s3.amazonaws.com/rapgenius/1362086799_Dah%20dashtweet.jpg" - }, - { - "name": "Da'unda'dogg", - "image_url": "https://images-na.ssl-images-amazon.com/images/I/61Scu%2BIkLYL._SL500_AA280_.jpg" - }, - { - "name": "Daddy-O", - "image_url": "http://m.i.uol.com.br/musica/2010/02/26/o-rapper-puffy-daddy-em-evento-em-nova-york-23012010-1267194075418_956x500.jpg" - }, - { - "name": "Dae Dae", - "image_url": "http://cdn.baeblemusic.com/bandcontent/dae_dae/dae_dae_bio-498.jpg" - }, - { - "name": "Damu the Fudgemunk", - "image_url": "http://berlin030.de/wp-content/uploads/2016/07/Damu-The-Fudgemunk.jpg" - }, - { - "name": "Dan Bull", - "image_url": "http://www.tubefilter.com/wp-content/uploads/2016/03/dan-bull.jpg" - }, - { - "name": "Dana Dane", - "image_url": "http://media-cache-ak0.pinimg.com/736x/14/57/5c/14575c78fb7f3e2e844ec15621acea74.jpg" - }, - { - "name": "Danny Boy", - "image_url": "https://upload.wikimedia.org/wikipedia/commons/thumb/1/1b/House_of_Pain-IMG_6536.jpg/1200px-House_of_Pain-IMG_6536.jpg" - }, - { - "name": "Danny Brown", - "image_url": "http://media.npr.org/assets/img/2012/08/27/rap-stream-db2_wide-2f0e39013c78f49f93129e2eef4c93e72b9c0eb1-s6-c30.jpg" - }, - { - "name": "Dappy", - "image_url": "http://madnews.files.wordpress.com/2010/05/dappy.jpg" - }, - { - "name": "Dave East", - "image_url": "http://www.rehabonlinemag.com/wp-content/uploads/2014/09/dave-east-cropped.jpg" - }, - { - "name": "Daveed Diggs", - "image_url": "http://theawesomer.com/photos/2016/05/Daveed-Diggs_fastest_rapper_on_broadway_t.jpg" - }, - { - "name": "David Banner", - "image_url": "http://www3.pictures.zimbio.com/gi/David+Banner+33rd+Annual+UNCF+Evening+Stars+ZUzQpuO0gb0l.jpg" - }, - { - "name": "David Dallas", - "image_url": "http://static.djbooth.net/pics-artist/daviddallas2.jpg" - }, - { - "name": "David Rush", - "image_url": "http://www.vegasnews.com/wp-content/uploads/davidrush_redcarpet-588.jpg" - }, - { - "name": "David Stones", - "image_url": "https://media.licdn.com/mpr/mpr/AAEAAQAAAAAAAAfNAAAAJGY2M2Q3MDY5LWE4MTYtNDgyMS1hMWZmLWEzOTMzOTFmYTQ4Mw.jpg" - }, - { - "name": "Daz Dillinger", - "image_url": "https://s3.amazonaws.com/rapgenius/filepicker%2FXvubZbsJQue813tNktYE_Daz_Dillinger.jpg" - }, - { - "name": "Dazzie Dee", - "image_url": "https://lh6.googleusercontent.com/-2BfKUpLN9OU/TX9xEi7kAUI/AAAAAAAACDY/tcA_AynfDM8/s400/1.jpg" - }, - { - "name": "Dee Barnes", - "image_url": "http://i.dailymail.co.uk/i/pix/2015/08/19/01/2B7A5D7E00000578-0-image-a-2_1439945563429.jpg" - }, - { - "name": "Dee Dee King", - "image_url": "http://4.bp.blogspot.com/_svH18z9S5bU/SnSk-Vq8-SI/AAAAAAAAAsc/dr_YK0SSeV0/s320/FRONT.jpg" - }, - { - "name": "Dej Loaf", - "image_url": "http://i1.wp.com/inyaearhiphop.com/wp-content/uploads/2016/03/rapper-says-dej-loaf-is-lying-about-her-sexuality.png" - }, - { - "name": "Delyric Oracle", - "image_url": "http://thebaybridged.com/wp-content/uploads/2017/04/Chance-The-Rapper-at-Oracle-Arena-by-Joshua-Huver-14.jpg" - }, - { - "name": "Del the Funky Homosapien", - "image_url": "http://s3.amazonaws.com/rapgenius/del_the_funky_homosapien-130.jpg" - }, - { - "name": "Demrick", - "image_url": "http://theindustrywest.com/wp-content/uploads/2013/03/demrick.jpg" - }, - { - "name": "Deniro Farrar", - "image_url": "https://assets.audiomack.com/deniro-farrar/5a30d8d7a0f778a2e84ec2ebb5992768.jpeg" - }, - { - "name": "Denzel Curry", - "image_url": "https://media2.fdncms.com/orlando/imager/u/blog/2488240/denzel_-_photo-jmp_web.jpg" - }, - { - "name": "Derek Minor", - "image_url": "http://thegospelguru.com/wp-content/uploads/2014/10/derek-minor-03.jpg" - }, - { - "name": "Desiigner", - "image_url": "https://i.ytimg.com/vi/nmCYm7NOWME/maxresdefault.jpg" - }, - { - "name": "Detail", - "image_url": "https://s3.amazonaws.com/hiphopdx-production/2011/03/detail_03-21-11-300x300.jpg" - }, - { - "name": "Deuce", - "image_url": "https://upload.wikimedia.org/wikipedia/commons/3/34/Deuce.jpg" - }, - { - "name": "Dev", - "image_url": "http://4.bp.blogspot.com/-DTmssduDnJk/TWfNLurcS1I/AAAAAAAAAjY/yNyTtcEEuM0/s1600/Dev-Bass_Down_Low-single_cover.jpg" - }, - { - "name": "Devin the Dude", - "image_url": "http://lahiphopevents.com/wp-content/uploads/2015/11/DEVIN-THE-DUDE.jpg" - }, - { - "name": "Devlin", - "image_url": "http://musiqexpo.files.wordpress.com/2012/08/devlin-rapper-freestyle-2012-e1343833573673.jpg" - }, - { - "name": "Diabolic", - "image_url": "http://upload.wikimedia.org/wikipedia/commons/a/a3/DIABOLIC.jpg" - }, - { - "name": "Diamond", - "image_url": "http://2.bp.blogspot.com/-Zk504yF-lDo/Tbo7Vy75dfI/AAAAAAAAuEQ/FtRTLC65dJ8/s1600/diamond-rapper-3.jpg" - }, - { - "name": "Diamond D", - "image_url": "http://nahright.com/wp-content/uploads/2013/12/DIAMOND-450x304.jpg" - }, - { - "name": "Diggy Simmons", - "image_url": "http://www4.pictures.zimbio.com/gi/Diggy+Simmons+2012+BET+Awards+Celebrity+Gifting+f_6FuVhNcnSl.jpg" - }, - { - "name": "Dillon Cooper", - "image_url": "http://s3.amazonaws.com/rapgenius/1352155921_Dillon-Cooper-1.jpg" - }, - { - "name": "Disco D", - "image_url": "https://i.ytimg.com/vi/-pzjJ0Gnwg0/maxresdefault.jpg" - }, - { - "name": "Disco King Mario", - "image_url": "http://hiphopandpolitics.files.wordpress.com/2013/01/disco-king-mario.jpg" - }, - { - "name": "Dizzee Rascal", - "image_url": "https://juelzone.files.wordpress.com/2012/01/dizzee_rascal_2.jpg" - }, - { - "name": "Dizzy Wright", - "image_url": "http://thedailyloud.com/wp-content/uploads/2013/07/dizzy-wright.jpeg" - }, - { - "name": "DJ Cash Money", - "image_url": "https://i.ytimg.com/vi/YjQi0oLbfT4/maxresdefault.jpg" - }, - { - "name": "DJ Casper", - "image_url": "http://assets.libsyn.com/content/1652870" - }, - { - "name": "DJ Clay", - "image_url": "http://cps-static.rovicorp.com/3/JPG_400/MI0003/162/MI0003162471.jpg" - }, - { - "name": "DJ Clue?", - "image_url": "https://hhvibe.files.wordpress.com/2010/01/dj-clue.jpg" - }, - { - "name": "DJ Drama", - "image_url": "http://upload.wikimedia.org/wikipedia/commons/thumb/2/28/DJ_Drama.jpg/1280px-DJ_Drama.jpg" - }, - { - "name": "DJ Felli Fel", - "image_url": "http://images.complex.com/complex/image/upload/c_limit,w_680/f_auto,fl_lossy,pg_1,q_auto/vdonhefsu1vbqzkokfvl.jpg" - }, - { - "name": "DJ Fuze", - "image_url": "http://api.ning.com/files/twryudDDeJeBWWFC5lWwmMNonB3Ue79CfQIrNYzlFuV2rTlpK65jKYOrbTFCSI3uKyKLXfsXo-QtftbzfM98VkeRbvf10eQZ/fuze.jpg" - }, - { - "name": "DJ Green Lantern", - "image_url": "http://hw-img.datpiff.com/m76a31fd/Various_Artists_Green_Lantern_Instrumentals-front-large.jpg" - }, - { - "name": "DJ Head", - "image_url": "http://www.eminem.pro/wp-content/uploads/2013/09/DJ-Head.jpg" - }, - { - "name": "DJ Hurricane", - "image_url": "http://www.vanndigital.com/wp-content/uploads/djhurricanecominoffcentralcoastvibemusicvideoclip.jpg" - }, - { - "name": "DJ Kay Slay", - "image_url": "http://assets.audiomack.com/paperchaserdotcom/1d35c76ce398acf2bba0bc11508f0fba.jpeg" - }, - { - "name": "DJ Khaled", - "image_url": "https://www.bestvideorap.com/wp-content/uploads/bscap0008(3).jpg" - }, - { - "name": "DJ Krush", - "image_url": "https://image.redbull.com/rbcom/010/2016-11-16/1331829659822_2/0010/1/1600/1067/1/dj-krush.jpg" - }, - { - "name": "DJ Mustard", - "image_url": "http://the5thelementmag.files.wordpress.com/2014/08/rapper-yg-and-dj-mustard.jpg" - }, - { - "name": "DJ Paul", - "image_url": "http://hiphoprapscene.com/wp-content/uploads/2016/08/dj-paul.jpg" - }, - { - "name": "DJ Pooh", - "image_url": "https://img.discogs.com/KHTPZVL6Pa1dtmD3PhfQvKz-eQg=/fit-in/300x300/filters:strip_icc():format(jpeg):mode_rgb():quality(40)/discogs-images/A-131630-1487348732-7573.jpeg.jpg" - }, - { - "name": "DJ Premier", - "image_url": "http://hiphopgoldenage.com/wp-content/uploads/2016/05/dj-premier-producer.jpg" - }, - { - "name": "DJ Quik", - "image_url": "http://dieenormousla.files.wordpress.com/2013/05/dj-quik.jpg" - }, - { - "name": "DJ Run", - "image_url": "https://c2.staticflickr.com/6/5022/5615202725_2e4e019896_b.jpg" - }, - { - "name": "DJ Screw", - "image_url": "http://screweduprecords.com/wp-content/uploads/2010/11/djSCREW5.jpg" - }, - { - "name": "DJ Shadow", - "image_url": "http://static.djbooth.net/pics-artist/dj-shadow.jpg" - }, - { - "name": "DJ Yella", - "image_url": "https://i.ytimg.com/vi/qaRqdspVNdo/maxresdefault.jpg" - }, - { - "name": "DMC", - "image_url": "http://i.huffpost.com/gen/1235615/images/o-RAPPER-DMC-facebook.jpg" - }, - { - "name": "DMX", - "image_url": "http://4hdwallpapers.com/wp-content/uploads/2013/04/Dmx-Rapper.jpg" - }, - { - "name": "Doap Nixon", - "image_url": "http://imagecache.blastro.com/timthumb.php/src=http%3A%2F%2Fimages.blastro.com%2Fimages%2Fartist_images%2Ffull%2Ffull_vinniepazvinniepazondoapnixon.jpg&w=610&h=457&zc=2&a=T" - }, - { - "name": "Doe B", - "image_url": "http://assets.noisey.com/content-images/contentimage/22592/Doe%20B%20featured%20image.jpg" - }, - { - "name": "Dok2", - "image_url": "http://static.askkpop.com/images/upload/18/ifrit1112/2016/05/12/Dok2-says-female-rappers-dontwrite-their-own-lyrics.jpg" - }, - { - "name": "Dolla", - "image_url": "http://www.streetgangs.com/wp-content/uploads/2009/05/20090529-dolla3.jpg" - }, - { - "name": "Dom Kennedy", - "image_url": "http://cdn.ambrosiaforheads.com/wp-content/uploads/2015/05/Rapper-Dom-Kennedy-Reveals-Album-Release-Date-MusicSnake-1024x576.jpg" - }, - { - "name": "Dominique Young Unique", - "image_url": "http://images.dailystar.co.uk/dynamic/45/photos/984000/620x/5327940d40cfe_18f12domm.jpg" - }, - { - "name": "Domino", - "image_url": "https://unitedgangs.files.wordpress.com/2013/09/domino.png" - }, - { - "name": "Domo Genesis", - "image_url": "http://media.gettyimages.com/photos/rapper-domo-genesis-of-mellowhigh-and-the-odd-future-collective-at-picture-id538084320" - }, - { - "name": "Don Cannon", - "image_url": "http://freddyo.com/wp-content/uploads/2013/07/don-cannon.jpg" - }, - { - "name": "Donnis", - "image_url": "http://www3.pictures.zimbio.com/gi/Donnis+Nokia+Lumia+900+Launches+Times+Square+ZmfXDpow5Jkl.jpg" - }, - { - "name": "Dorrough", - "image_url": "http://theboombox.com/files/2011/02/dorrough-200-020811.jpg" - }, - { - "name": "Doseone", - "image_url": "http://l7.alamy.com/zooms/d51db8efa60f4be5890e618183a22976/doseone-rapper-producer-poet-and-artist-performing-at-all-tomorrows-d7wtt5.jpg" - }, - { - "name": "Doug E. Fresh", - "image_url": "https://s-media-cache-ak0.pinimg.com/564x/d3/e9/47/d3e94702d1d9ad80b155eca525e91ce9.jpg" - }, - { - "name": "Doughbeezy", - "image_url": "http://www.brooklynvegan.com/img/indie/doughbeezy.jpg" - }, - { - "name": "Dr. Dre", - "image_url": "https://pennylibertygbow.files.wordpress.com/2012/02/drdre.gif" - }, - { - "name": "Drag-On", - "image_url": "https://ioneglobalgrind.files.wordpress.com/2016/03/14573801941016.png" - }, - { - "name": "Drake", - "image_url": "http://2.bp.blogspot.com/-PF-iHgXDePo/TrjTRk8SsfI/AAAAAAAAAvk/8j_OnnCRbLc/s1600/Drake_ThankMe_Publici_5000DPI300RGB550255.jpg" - }, - { - "name": "Dres", - "image_url": "http://images.complex.com/complex/image/upload/c_fill,g_center,w_1200/fl_lossy,pg_1,q_auto/cxinsw78yglijdcx7xfh.jpg" - }, - { - "name": "Dresta", - "image_url": "http://www.prlog.org/11403708-dresta.jpg" - }, - { - "name": "Drew Deezy", - "image_url": "https://upload.wikimedia.org/wikipedia/commons/thumb/f/f7/Photo-of-Drew-Deezy.jpg/220px-Photo-of-Drew-Deezy.jpg" - }, - { - "name": "Driicky Graham", - "image_url": "http://www3.pictures.zimbio.com/gi/2012+BET+Awards+Celebrity+Gifting+Suite+Day+s6iambQit8Kx.jpg" - }, - { - "name": "Droop-E", - "image_url": "http://images.complex.com/complex/image/upload/c_limit,w_680/f_auto,fl_lossy,pg_1,q_auto/yumgqwihf7wyqgrhbsjh.jpg" - }, - { - "name": "Dru Down", - "image_url": "http://s3.amazonaws.com/rapgenius/252244_106167516141612_7339951_n.jpg" - }, - { - "name": "Drumma Boy", - "image_url": "http://www.azquotes.com/public/pictures/authors/b2/29/b229ecbe96e3bf6858a880ad34c9dc21/55ee91fea5d8b_drumma_boy.jpg" - }, - { - "name": "Dumbfoundead", - "image_url": "http://onwardstate.com/wp-content/uploads/2013/12/DFD_15.jpg" - }, - { - "name": "Duncan Mighty", - "image_url": "http://howng.com/wp-content/uploads/2016/09/Duncan-Mighty.png" - }, - { - "name": "Eve", - "image_url": "https://upload.wikimedia.org/wikipedia/commons/5/53/Eve_2011_cropped.jpg" - }, - { - "name": "E-40", - "image_url": "http://www.diablomag.com/March-2016/Rapper-E-40-Malt-Liquor-Sluricane-Hurricane/DM1603_116_DIG800.jpg" - }, - { - "name": "E.D.I. Mean", - "image_url": "https://www.ballerstatus.com/wp-content/uploads/2015/07/edi.jpg" - }, - { - "name": "E-Sens", - "image_url": "https://images.rapgenius.com/9b9cf127a072d14eda839946d33e8b06.500x500x1.jpg" - }, - { - "name": "E.S.G.", - "image_url": "https://vignette4.wikia.nocookie.net/hip-hop-music/images/9/90/E.S.G..jpg/revision/latest" - }, - { - "name": "Earl Sweatshirt", - "image_url": "https://s3.amazonaws.com/rapgenius/1348551787_Earl-Sweatshirt.jpg" - }, - { - "name": "Easy Mo Bee", - "image_url": "https://bomboclap.files.wordpress.com/2012/01/easy-mo-bee2.jpg" - }, - { - "name": "Eazy-E", - "image_url": "http://3.bp.blogspot.com/-OCsagfqI7hc/Ui9BHy4S6xI/AAAAAAAAATk/H1DL94luEHg/s1600/Eazy+E+rapper.jpg" - }, - { - "name": "Ed O.G.", - "image_url": "http://2.bp.blogspot.com/_Wm5H75m6zhE/TL4201QyKgI/AAAAAAAAAm0/UnMY54i171c/s1600/ed.jpg" - }, - { - "name": "Edo Maajka", - "image_url": "http://www.ravnododna.com/wp-content/uploads/2013/06/edo-maajka01.jpg" - }, - { - "name": "El Da Sensei", - "image_url": "http://cdn.ticketfly.com/i/00/02/15/04/45-exl.jpg" - }, - { - "name": "El-P", - "image_url": "https://consequenceofsound.files.wordpress.com/2018/04/the-meadows-2017-ben-kaye-run-the-jewels-7.jpg" - }, - { - "name": "Elephant Man", - "image_url": "http://www.farfrommoscow.com/wp-content/uploads/2009/02/elephant-man.jpg" - }, - { - "name": "Elzhi", - "image_url": "https://images.rapgenius.com/727e2b38afd6daf878861a026a9b748f.1000x667x1.jpg" - }, - { - "name": "Emcee N.I.C.E.", - "image_url": "https://upload.wikimedia.org/wikipedia/commons/9/94/Emcee_N.I.C.E..JPG" - }, - { - "name": "Eminem", - "image_url": "http://www.dopeshxtdaily.com/wp-content/uploads/2018/04/Eminem-Framed-3.jpg" - }, - { - "name": "Eric Biddines", - "image_url": "http://images1.miaminewtimes.com/imager/u/745xauto/9106282/eric-biddines-elliot-liss.jpg" - }, - { - "name": "Erick Arc Elliott", - "image_url": "http://www4.pictures.zimbio.com/gi/Erick+Elliott+Coachella+Valley+Music+Arts+DCw4bFEm-O4l.jpg" - }, - { - "name": "Erick Sermon", - "image_url": "https://s-media-cache-ak0.pinimg.com/736x/5a/12/e1/5a12e16dbad591b63da7eef19e59a11d.jpg" - }, - { - "name": "Eric Stanley", - "image_url": "https://i.scdn.co/image/0b3f8ab808d49b6c4b8a7d70a5bedf399a105377" - }, - { - "name": "Esham", - "image_url": "https://media2.fdncms.com/metrotimes/imager/mayor-esham-what/u/slideshow/2229545/esham_press3jpg" - }, - { - "name": "Esoteric", - "image_url": "https://i.ytimg.com/vi/Ekzu8upcHo0/maxresdefault.jpg" - }, - { - "name": "Eve", - "image_url": "https://upload.wikimedia.org/wikipedia/commons/5/53/Eve_2011_cropped.jpg" - }, - { - "name": "Everlast", - "image_url": "http://www.latimes.com/resizer/ON_hgfI8nrImP_htAnzUnEpLUBE=/1400x0/arc-anglerfish-arc2-prod-tronc.s3.amazonaws.com/public/OUCVGT32CRHGVA3VJGMJB2PSC4.jpg" - }, - { - "name": "Evidence", - "image_url": "http://www.brutalmusic.org/wp-content/uploads/2012/02/evidence-rapper.jpg" - }, - { - "name": "Eyedea", - "image_url": "http://www.rapgrid.com/sites/default/files/rapper-photo/eyedea.jpg" - }, - { - "name": "Ghostface Killah", - "image_url": "https://fanart.tv/fanart/music/3b39abeb-0064-4eed-9ddd-ee47a45c54cb/artistbackground/ghostface-killah-5053b6c4a440f.jpg" - }, - { - "name": "Fabolous", - "image_url": "http://www.maybachmedia.com/wp-content/uploads/2018/03/emily-b-and-fabolous.jpg" - }, - { - "name": "Fabri Fibra", - "image_url": "http://static.nanopress.it/nanopress/fotogallery/843X0/80541/fabri-fibra-tatuaggi.jpg" - }, - { - "name": "Fam-Lay", - "image_url": "http://s3.amazonaws.com/rapgenius/1369303498_FamLay.jpg" - }, - { - "name": "Famous Dex", - "image_url": "http://16762-presscdn-0-89.pagely.netdna-cdn.com/wp-content/uploads/2016/09/IMG_6195.jpg" - }, - { - "name": "Fashawn", - "image_url": "http://portlandmetrolive.com/wp-content/uploads/2015/02/Rapper-Fashawn-comes-to-Peter%E2%80%99s-Room.jpg" - }, - { - "name": "Fat Joe", - "image_url": "http://assets.nydailynews.com/polopoly_fs/1.1437632.1377553895!/img/httpImage/image.jpg_gen/derivatives/article_970/83094393.jpg" - }, - { - "name": "Fat Pat", - "image_url": "http://s3.amazonaws.com/rapgenius/1363587723_Fat%20Pat%20fatpat.jpg" - }, - { - "name": "Fat Trel", - "image_url": "https://ioneglobalgrind.files.wordpress.com/2013/11/screen-shot-2013-11-07-at-3-48-54-pm.png" - }, - { - "name": "Fatboi", - "image_url": "https://www.sohh.com/wp-content/uploads/Fatboy-SSE.jpg" - }, - { - "name": "Father MC", - "image_url": "http://www.rapartists.com/_files/pictures/full/618_fathermc.jpg" - }, - { - "name": "Fatman Scoop", - "image_url": "http://d.ibtimes.co.uk/en/full/1577170/fatman-scoop.jpg" - }, - { - "name": "Fergie", - "image_url": "http://4everstatic.com/pictures/674xX/people/musicians/fergie,-singer,-music-134929.jpg" - }, - { - "name": "Fetty Wap", - "image_url": "http://image1.redbull.com/rbcom/010/2015-05-07/1331721730967_2/0010/1/1500/1000/2/fetty-wap.jpg" - }, - { - "name": "Fiend", - "image_url": "http://i1169.photobucket.com/albums/r502/ThaFixxDotCom/fiend.jpg" - }, - { - "name": "FLAME", - "image_url": "http://thefrontrowreport.com/wp-content/uploads/2012/08/flame2.jpg" - }, - { - "name": "Flavor Flav", - "image_url": "http://assets.nydailynews.com/polopoly_fs/1.1185779.1350499171!/img/httpImage/image.jpg_gen/derivatives/landscape_635/flavor-flav.jpg" - }, - { - "name": "Flavour N'abania", - "image_url": "http://www.naijaolofofo.com/wp-content/uploads/2016/05/flavour.jpg" - }, - { - "name": "Flo Rida", - "image_url": "https://bossip.files.wordpress.com/2014/07/flo-rida.jpg" - }, - { - "name": "Flying Lotus", - "image_url": "http://exclaim.ca/images/flylo10.jpg" - }, - { - "name": "Focus...", - "image_url": "http://cdn5.hiphoplead.com/static/2011/07/focus.jpg" - }, - { - "name": "Fonzworth Bentley", - "image_url": "https://i.ytimg.com/vi/PKT8_mXk1-g/maxresdefault.jpg" - }, - { - "name": "Fort Minor", - "image_url": "http://4.bp.blogspot.com/_VVVnguvXP6s/S8tfaGjCefI/AAAAAAAAA0c/SfnVfFFEgjs/s1600/Fort%2BMinor.jpg" - }, - { - "name": "Foxx", - "image_url": "https://hiphollywood.com/wp-content/uploads/2018/04/946479462.jpg" - }, - { - "name": "Foxy Brown", - "image_url": "http://static.vibe.com/files/2017/03/foxy-brown-endorses-donald-trump-640x476-1488571302-640x476.jpg" - }, - { - "name": "Frank Ocean", - "image_url": "http://static.vibe.com/files/2017/03/frank-ocean-rapper-vibe-1489602237.jpg" - }, - { - "name": "Frankie J", - "image_url": "http://static.djbooth.net/pics-artist/frankiej.jpg" - }, - { - "name": "Frayser Boy", - "image_url": "http://trapsntrunks.com/wp-content/uploads/2017/07/motives-672x672.jpg" - }, - { - "name": "Freak Nasty", - "image_url": "http://cps-static.rovicorp.com/3/JPG_400/MI0003/827/MI0003827380.jpg" - }, - { - "name": "Freaky Tah", - "image_url": "http://upload.wikimedia.org/wikipedia/en/9/9b/Freaky_Tah.jpg" - }, - { - "name": "Fred Durst", - "image_url": "http://trendliest.files.wordpress.com/2008/07/durst-fred-photo-xl-fred-durst-6209268.jpg" - }, - { - "name": "Freddie Foxxx", - "image_url": "http://grandgood.com/wordpress/wp-content/uploads/2008/06/freddie-foxxx.jpg" - }, - { - "name": "Freddie Gibbs", - "image_url": "http://www.networth2013.com/wp-content/uploads/2013/07/Frddie+Gibbs+VIP+Area+Governors+Ball+Day+3+p6VBOlpeThel.jpg" - }, - { - "name": "Fredo Santana", - "image_url": "http://www.rapbasement.com/wp-content/uploads/2014/11/fredosantana.jpg" - }, - { - "name": "Fredro Starr", - "image_url": "http://ambrosiaforheads.com/wp-content/uploads/2014/02/Fredro-Starr-Sticky-Fingaz-610x400.jpg" - }, - { - "name": "Fredwreck", - "image_url": "http://www.beatmakingvideos.com/sites/default/files/producer_foto/fredwreck.jpg" - }, - { - "name": "Free", - "image_url": "http://www.whosampled.com/static/artist_images_200/lr2929_2010525_114148297125.jpg" - }, - { - "name": "Freekey Zekey", - "image_url": "https://1.bp.blogspot.com/-TSFhXxYHSZI/V8kVNFnN7TI/AAAAAAAAmJ8/GiIVH63gXwsxVIbWGZlYeVep9JhsPYgHQCK4B/w1200-h630-p-k-nu/freekey-zekey-net-worth.jpg" - }, - { - "name": "Freeway", - "image_url": "http://www.5pillarz.com/wp-content/uploads/2014/10/freeway1.jpg" - }, - { - "name": "French Montana", - "image_url": "https://lasentinel.net/wp-content/uploads/sites/5/2016/06/ENT-its-a-rap-french-montana2.jpg" - }, - { - "name": "Frenkie", - "image_url": "http://cps-static.rovicorp.com/3/JPG_500/MI0003/596/MI0003596298.jpg" - }, - { - "name": "Fresh Kid Ice", - "image_url": "https://zayzay.com/wp-content/uploads/2017/07/Rapper-Fresh-Kid-Ice-Of-%E2%80%982-Live-Crew%E2%80%99-Dead-At-53.jpg" - }, - { - "name": "Froggy Fresh", - "image_url": "http://i.ytimg.com/vi/4feIwig2AtA/0.jpg" - }, - { - "name": "Frost", - "image_url": "http://askkissy.com/wp-content/uploads/2015/09/EAZY-E-RAPPER-FROST.jpeg" - }, - { - "name": "Full Blooded", - "image_url": "https://i.skyrock.net/5301/5285301/pics/235349117_small.jpg" - }, - { - "name": "Funkmaster Flex", - "image_url": "http://www.rapbasement.com/wp-content/uploads/2014/04/6a00d8341c4fe353ef01156ff9e8f1970c-800wi.jpg" - }, - { - "name": "Future", - "image_url": "http://www.thefamouspeople.com/profiles/images/future-1.jpg" - }, - { - "name": "Grandmaster Caz", - "image_url": "https://upload.wikimedia.org/wikipedia/commons/thumb/f/fc/Grandmastercaz.jpg/1200px-Grandmastercaz.jpg" - }, - { - "name": "Grandmaster Flash", - "image_url": "https://s-media-cache-ak0.pinimg.com/736x/34/60/41/346041acd20fbe40c44b97a91c9a2a80.jpg" - }, - { - "name": "G-Dragon", - "image_url": "http://www.soompi.com/wp-content/uploads/a/t/7m/356158/356158.jpg" - }, - { - "name": "G-Eazy", - "image_url": "http://i.dailymail.co.uk/i/newpix/2018/04/14/16/4B18913E00000578-5615765-Cute_couple_The_New_Jersey_native_is_dating_rapper_G_Eazy_with_t-a-5_1523718500475.jpg" - }, - { - "name": "G. Dep", - "image_url": "http://assets.nydailynews.com/polopoly_fs/1.473448.1314633586!/img/httpImage/image.jpg_gen/derivatives/article_970/alg-g-dep-portrait-jpg.jpg" - }, - { - "name": "G Herbo", - "image_url": "http://www.datwav.com/wp-content/uploads/2017/04/G_Herbo_In_Studio-1024x683.jpg" - }, - { - "name": "Gaeko", - "image_url": "http://www.weekendnotes.co.uk/im/002/07/geko-rapper-tour-birmingham-academy-21.jpg" - }, - { - "name": "The Game", - "image_url": "http://images2.fanpop.com/images/photos/3600000/The-Game-the-game-rapper-3618562-1024-768.jpg" - }, - { - "name": "Gang Starr", - "image_url": "http://www.billboard.com/files/styles/promo_650/public/stylus/106631-Gangstarr-guru-617_409.jpg" - }, - { - "name": "Gangsta Blac", - "image_url": "http://purple-drank.com/wp-content/uploads/2011/06/Gangsta-Blac-Return-Of-The-Gangsta.jpg" - }, - { - "name": "Gangsta Boo", - "image_url": "http://live.drjays.com/wp-content/uploads/2009/12/43439_lg.jpg" - }, - { - "name": "Ganksta N-I-P", - "image_url": "http://www.ugs4life.com/wp-content/uploads/2014/06/ganxsta-nip.png" - }, - { - "name": "Gary", - "image_url": "http://media-cache-ec0.pinimg.com/736x/1e/52/6c/1e526ce56e4e7a0d8ce5b588faa49102.jpg" - }, - { - "name": "Gee Money", - "image_url": "https://amonpointtv.com/wp-content/uploads/2017/09/ABCD1505228816.jpg" - }, - { - "name": "General Woo", - "image_url": "https://natasavajagic.files.wordpress.com/2008/11/dsc044672.jpg" - }, - { - "name": "Ghostface Killah", - "image_url": "https://fanart.tv/fanart/music/3b39abeb-0064-4eed-9ddd-ee47a45c54cb/artistbackground/ghostface-killah-5053b6c4a440f.jpg" - }, - { - "name": "Giggs", - "image_url": "http://4.bp.blogspot.com/-NLMOcLtTIgs/Tbidhpi_LpI/AAAAAAAAANY/4gL5Wzj4f1s/s1600/mytypeofhype_giggs_rapper-thumb.jpg" - }, - { - "name": "Gilbere Forte", - "image_url": "http://famousfamilybirthdaysbiofacts.com/BirthDayPersonality/Gilbere-Forte-Rapper-birhday-image.jpg" - }, - { - "name": "Glasses Malone", - "image_url": "http://siccness.net/wp/wp-content/uploads/2012/11/glasses-malone.jpg" - }, - { - "name": "GLC", - "image_url": "https://d.ibtimes.co.uk/en/full/1396199/mike-glc.jpg" - }, - { - "name": "Goldie Loc", - "image_url": "https://s-media-cache-ak0.pinimg.com/736x/88/03/67/8803675d722cc75dd4eb071ea1b9809d.jpg" - }, - { - "name": "GoldLink", - "image_url": "http://unbiasedwriter.com/wp-content/uploads/2014/10/GoldLink-rapper.jpg" - }, - { - "name": "Gorilla Zoe", - "image_url": "https://upload.wikimedia.org/wikipedia/commons/thumb/a/a6/Gorilla_zoe_picture.jpg/1200px-Gorilla_zoe_picture.jpg" - }, - { - "name": "Grafh", - "image_url": "http://static.djbooth.net/pics-artist/grafh.jpg" - }, - { - "name": "Grand Puba", - "image_url": "http://images.complex.com/complex/image/upload/t_article_image/akb1hkm8uzgscqwucuan.jpg" - }, - { - "name": "Grandmaster Caz", - "image_url": "https://upload.wikimedia.org/wikipedia/commons/thumb/f/fc/Grandmastercaz.jpg/1200px-Grandmastercaz.jpg" - }, - { - "name": "Grandmaster Flash", - "image_url": "https://s-media-cache-ak0.pinimg.com/736x/34/60/41/346041acd20fbe40c44b97a91c9a2a80.jpg" - }, - { - "name": "Greydon Square", - "image_url": "https://upload.wikimedia.org/wikipedia/commons/2/2e/TAM_6_-_Greydon_Square.jpg" - }, - { - "name": "Grieves", - "image_url": "http://thissongissick.com/blog/wp-content/uploads/2011/05/Grieves-Rapper-Bloody-Poetry.jpg" - }, - { - "name": "Gucci Mane", - "image_url": "https://www.amlu.com/wp-content/uploads/2018/04/rapper-gucci-mane-skips-three-year-waiting-list-and-gets-the-first-ferrari-812-superfast1.jpg" - }, - { - "name": "Gudda Gudda", - "image_url": "http://favimages.com/wp-content/uploads/2012/08/rapper-gudda-gudda-singer-celebrity-rap.jpg" - }, - { - "name": "Guerilla Black", - "image_url": "http://i1-news.softpedia-static.com/images/news2/Rapper-Guerilla-Black-Arrested-for-Buying-and-Using-Stolen-Payment-Card-Details-2.jpg" - }, - { - "name": "Guilty Simpson", - "image_url": "http://favimages.com/wp-content/uploads/2012/08/rapper-guilty-simpson-star-celebrity-rap.jpg" - }, - { - "name": "Gunplay", - "image_url": "http://www.passionweiss.com/wp-content/uploads/2015/07/gunplay-press2.jpg" - }, - { - "name": "Guru", - "image_url": "http://upload.wikimedia.org/wikipedia/commons/7/72/Guru_%28rapper%29.jpg" - }, - { - "name": "GZA", - "image_url": "http://api.ning.com/files/Cr*mNN-mhgZVTnMO1Ax5ew2lFizHAFllT8mDVu1iYmXBixU5MNOvS6DzmIs82Yuhin8A2u0Hpk48uLC2goXSr74xqMAwQK5C/GZAMetro.jpg" - }, - { - "name": "Half a Mill", - "image_url": "http://www.kingsizemagazine.se/wp-content/uploads/2013/10/half-a-mill-S.jpg" - }, - { - "name": "Hard Kaur", - "image_url": "http://www.prokerala.com/news/photos/imgs/800/singer-rapper-hard-kaur-during-an-interview-at-440863.jpg" - }, - { - "name": "Hasan Salaam", - "image_url": "http://api.ning.com/files/2VGrzzXedu3*LX5VRoIFBZeWe8qqGJjpAxzb0ZR9giaHZEvLo8d8B7mpIcLrLmH5gmcJt8aUpyPHr2aVLVFxrlylSJByg*eO/HasanSalaam.jpg" - }, - { - "name": "Havoc", - "image_url": "http://www.hip-hopvibe.com/wp-content/uploads/2012/01/Prodigy.jpg" - }, - { - "name": "Heavy D", - "image_url": "http://www.guttaworld.com/wp-content/uploads/2011/12/obit-heavy-d.jpg" - }, - { - "name": "Hefe Heetroc", - "image_url": "https://1.bp.blogspot.com/-nmJ_Z8xC9Wg/V_GjdMvY_fI/AAAAAAAAAyQ/9hfGLMDGemgyOsjY5mM3XW9ul-3WCpGnQCLcB/s640/20160223_1125571.jpg" - }, - { - "name": "Heize", - "image_url": "http://cdn.koreaboo.com/wp-content/uploads/2016/12/heize.jpg" - }, - { - "name": "Hemlock Ernst", - "image_url": "http://static.stereogum.com/uploads/2015/09/rappingfutureislands1.png" - }, - { - "name": "Hi-C", - "image_url": "http://unitedgangs.files.wordpress.com/2013/11/hic_feb2005a.jpg" - }, - { - "name": "Hi-Tek", - "image_url": "http://thamidwest.com/wp-content/uploads/Hi-Tek.jpg" - }, - { - "name": "Hit-Boy", - "image_url": "http://3.bp.blogspot.com/-pzifRQd37EQ/TwaMSQmoOfI/AAAAAAAAA7s/YUaDMqmATM4/s1600/whiterapper.jpg" - }, - { - "name": "Hittman", - "image_url": "http://s3.amazonaws.com/hiphopdx-production/2014/11/Hittman_11-13-2014.jpg" - }, - { - "name": "Hodgy Beats", - "image_url": "http://www.rapburger.com/wp-content/uploads/2013/07/hodgy-beats-Godsss-free-download-1024x682.jpg" - }, - { - "name": "Honey Cocaine", - "image_url": "http://swaggarightentertainment.com/wp-content/uploads/2014/10/rapper-honey-cocaine.jpeg" - }, - { - "name": "Hoodie Allen", - "image_url": "http://conversationsabouther.net/wp-content/uploads/2014/10/Hoodie-Allen.jpg" - }, - { - "name": "Hopsin", - "image_url": "http://www.stasheverything.com/wp-content/uploads/2012/10/Hopsin-banner.jpg" - }, - { - "name": "Hot Dollar", - "image_url": "http://www.aceshowbiz.com/images/news/00010456.jpg" - }, - { - "name": "Huey", - "image_url": "http://images5.fanpop.com/image/photos/30200000/Huey-huey-rapper-30242374-1024-768.jpg" - }, - { - "name": "Hurricane Chris", - "image_url": "https://upload.wikimedia.org/wikipedia/commons/c/c8/Hurricane_Chris.jpg" - }, - { - "name": "Hurricane G", - "image_url": "https://i.ytimg.com/vi/3pTO0lsjzco/maxresdefault.jpg" - }, - { - "name": "Hush", - "image_url": "https://www.gannett-cdn.com/-mm-/a691de1d2241d7baf1c60d5d31346451d4cd3669/c=0-236-1360-1004&r=x633&c=1200x630/local/-/media/2015/06/22/DetroitFreePress/DetroitFreePress/635705966302572023-Hush.jpg" - }, - { - "name": "Hussein Fatal", - "image_url": "https://pmchollywoodlife.files.wordpress.com/2015/07/hussein-fatal-rapper-dies-at-38-car-accident-lead.jpg" - }, - { - "name": "Ice Cube", - "image_url": "http://www.ultimatemovierankings.com/wp-content/uploads/2016/04/ice-cube-11111.jpg" - }, - { - "name": "I-20", - "image_url": "http://1.bp.blogspot.com/_IXe2z8hItAg/TBxH_T19eQI/AAAAAAAABX0/dFXw4HYqdqI/s1600/i20_self.jpg" - }, - { - "name": "Iamsu!", - "image_url": "http://media.gettyimages.com/photos/rapper-iamsu-arrives-at-ditch-fridays-at-palms-pool-dayclub-on-may-13-picture-id531300532" - }, - { - "name": "Ice Cube", - "image_url": "http://www.ultimatemovierankings.com/wp-content/uploads/2016/04/ice-cube-11111.jpg" - }, - { - "name": "Ice-T", - "image_url": "http://www.ireport.cz/images/ireport/clanky/Ice_T/ice-t.jpg" - }, - { - "name": "IDK", - "image_url": "https://static.highsnobiety.com/wp-content/uploads/2017/07/27163702/jay-idk-idk-interview-01-480x320.jpg" - }, - { - "name": "Iggy Azalea", - "image_url": "http://www.maybachmedia.com/wp-content/uploads/2018/04/Iggy-Azalea-Tyga.jpg" - }, - { - "name": "IHeartMemphis", - "image_url": "https://memphisrap.com/mr-uploads/2015/12/iLoveMemphis-rapper.jpg" - }, - { - "name": "Ill Bill", - "image_url": "https://upload.wikimedia.org/wikipedia/commons/thumb/c/c3/Ill_Bill.jpg/1200px-Ill_Bill.jpg" - }, - { - "name": "Illmind", - "image_url": "http://media.charged.fm/media/file_5429de95c0e71.jpg" - }, - { - "name": "ILoveMakonnen", - "image_url": "http://s3-ak.buzzfeed.com/static/2014-08/13/14/enhanced/webdr11/enhanced-8028-1407955933-1.jpg" - }, - { - "name": "Immortal Technique", - "image_url": "http://www.digitaljournal.com/img/7/5/0/1/1/0/i/1/5/5/o/3534639765_39c888714b_b.jpg" - }, - { - "name": "Imran Khan", - "image_url": "http://bollyspice.com/wp-content/uploads/2014/12/14dec_Imran-Khan-singer.jpg" - }, - { - "name": "Indo G", - "image_url": "http://purple-drank.com/wp-content/uploads/2013/03/Indo-G-New.jpg" - }, - { - "name": "Inspectah Deck", - "image_url": "http://favimages.com/wp-content/uploads/2012/08/rapper-inspectah-deck-celebrity-jacket-photo.jpg" - }, - { - "name": "Isaiah Rashad", - "image_url": "http://okp-cdn.okayplayer.com/wp-content/uploads/2014/06/xxl-freshman-2014-cypher-drama-cannon-lead.jpg" - }, - { - "name": "Iyanya", - "image_url": "https://4.bp.blogspot.com/-GeL-JX7MH2o/V4NryaxgfEI/AAAAAAAAIuw/KrtCr4Tp3cskgDG7QHHJ6M-Gvaz7a5AogCLcB/w1200-h630-p-k-no-nu/Iyanya.JPG" - }, - { - "name": "Iyaz", - "image_url": "http://muzicjunkies.com/wp-content/uploads/2014/10/slim2.jpg" - }, - { - "name": "Jay-Z", - "image_url": "http://th07.deviantart.net/fs70/PRE/f/2011/042/6/d/rapper___jay_z_by_rwpike-d39aevp.jpg" - }, - { - "name": "Kanye West", - "image_url": "http://assets.nydailynews.com/polopoly_fs/1.3936461.1523887222!/img/httpImage/image.jpg_gen/derivatives/article_750/604289829cc00020-kanye-west.jpg" - }, - { - "name": "Kendrick Lamar", - "image_url": "https://stupiddope.com/wp-content/uploads/2018/04/kendrick-lamar-damn-2018-pulitzer-prize-first-rapper-music.jpg" - }, - { - "name": "KRS-One", - "image_url": "http://ifihavent.files.wordpress.com/2007/07/krs_blaze02991.jpg" - }, - { - "name": "J Dilla", - "image_url": "http://www.stonesthrow.com/images/2012/DILLA_2.jpg" - }, - { - "name": "J-Diggs", - "image_url": "http://www.sierrasun.com/wp-content/uploads/2016/09/JDiggs-SSU-011415-1-244x325.jpg" - }, - { - "name": "J-Kwon", - "image_url": "http://hiphop-n-more.com/wp-content/uploads/2010/03/j-kwon-s02.jpg" - }, - { - "name": "J-Son", - "image_url": "https://i.ytimg.com/vi/SjV2lPTUB2o/maxresdefault.jpg" - }, - { - "name": "J. Cole", - "image_url": "http://www.rap-up.com/app/uploads/2018/04/j-cole-kod-cover.jpg" - }, - { - "name": "J. Stalin", - "image_url": "http://siccness.net/wp/wp-content/uploads/2015/10/stalin.jpg" - }, - { - "name": "J. Valentine", - "image_url": "http://cache2.asset-cache.net/gc/56850135-rapper-ll-cool-j-delivers-valentines-day-gettyimages.jpg" - }, - { - "name": "J.I.D", - "image_url": "http://www.musicfesttv.com/wp-content/uploads/2017/02/J.-Cole-Sign039s-Atlanta-Rapper-J.I.D.-To-Dreamville-1200x600.png" - }, - { - "name": "J.R. Rotem", - "image_url": "http://m2.paperblog.com/i/56/567622/j-r-rotem-beluga-heights-artist-of-the-week-L-9apUCg.jpeg" - }, - { - "name": "J.R. Writer", - "image_url": "http://static.djbooth.net/pics-artist/jrwriter.jpg" - }, - { - "name": "Ja Rule", - "image_url": "http://fanart.tv/fanart/music/b504f625-4ef6-4a5a-81e8-870a61e8dc9c/artistbackground/ja-rule-503dd1b16fcfa.jpg" - }, - { - "name": "Jack Parow", - "image_url": "http://sunelia89.files.wordpress.com/2012/11/parow_duck-manfred-werner-hr.jpg" - }, - { - "name": "The Jacka", - "image_url": "http://static.stereogum.com/uploads/2015/02/The-Jacka.jpg" - }, - { - "name": "Jackie Hill-Perry", - "image_url": "http://media.washtimes.com.s3.amazonaws.com/media/image/2014/10/27/10272014_jackie-3-color8201.jpg" - }, - { - "name": "Jadakiss", - "image_url": "https://hhvibe.files.wordpress.com/2010/02/jadakiss.jpg" - }, - { - "name": "Jaden Smith", - "image_url": "http://i.dailymail.co.uk/i/pix/2013/02/28/article-2285761-1856EF78000005DC-756_634x493.jpg" - }, - { - "name": "Jae Millz", - "image_url": "http://theboombox.com/files/2010/05/jae-millz-200ak051910.jpg" - }, - { - "name": "Jahlil Beats", - "image_url": "http://www3.pictures.zimbio.com/gi/Jahlil+Beats+BET+Hip+Hop+Awards+2012+Red+Carpet+8GcDsHs2IfRl.jpg" - }, - { - "name": "Jamie Madrox", - "image_url": "https://upload.wikimedia.org/wikipedia/commons/thumb/3/39/Jamie_Madrox_at_the_Abominationz_Tour.JPG/1200px-Jamie_Madrox_at_the_Abominationz_Tour.JPG" - }, - { - "name": "Jahred", - "image_url": "http://www.sportsgraphs.com/1314rampage4.jpg" - }, - { - "name": "Jake Miller", - "image_url": "http://thetriangle.org/wp-content/uploads/2013/11/Jake-Miller_Edgar-Estevez_WEB.jpg" - }, - { - "name": "Jake One", - "image_url": "http://www.nodfactor.com/wp-content/uploads/2013/11/Jake-One-Acid-Rain.png" - }, - { - "name": "Jam Master Jay", - "image_url": "http://ww3.hdnux.com/photos/10/27/41/2193534/5/920x920.jpg" - }, - { - "name": "Jamal", - "image_url": "http://assets.nydailynews.com/polopoly_fs/1.421164.1314528333!/img/httpImage/image.jpg_gen/derivatives/article_970/amd-jamal-woolard-jpg.jpg" - }, - { - "name": "Jamal Woolard", - "image_url": "http://assets.nydailynews.com/polopoly_fs/1.421164.1314528333!/img/httpImage/image.jpg_gen/derivatives/article_970/amd-jamal-woolard-jpg.jpg" - }, - { - "name": "Jamie Foxx", - "image_url": "https://hiphollywood.com/wp-content/uploads/2018/04/946479462.jpg" - }, - { - "name": "Jarren Benton", - "image_url": "https://ioneglobalgrind.files.wordpress.com/2015/02/photo-credit-funk-volume-extralarge_1408660385558.jpg" - }, - { - "name": "Jay Burna", - "image_url": "http://jamsphere.com/wp-content/uploads/2014/12/jay-burna-300.jpg" - }, - { - "name": "Jay Critch", - "image_url": "https://cdn.spinrilla.com/users/11645663/original/46d961baf0.jpg" - }, - { - "name": "Jay Electronica", - "image_url": "http://i.dailymail.co.uk/i/pix/2012/06/09/article-2156691-13845E1F000005DC-865_634x809.jpg" - }, - { - "name": "Jay Park", - "image_url": "https://s-media-cache-ak0.pinimg.com/736x/76/2a/65/762a65ec5adc664e7e7edc3c7f3ce526.jpg" - }, - { - "name": "Jay Rock", - "image_url": "http://rapsandhustles.com/wp-content/uploads/2012/04/jayrock.jpeg" - }, - { - "name": "Jay Z", - "image_url": "http://www.streetgangs.com/wp-content/uploads/2010/06/jay-z.jpg" - }, - { - "name": "Jayo Felony", - "image_url": "http://unitedgangs.files.wordpress.com/2013/12/jayo_felony.jpg" - }, - { - "name": "Jaz-O", - "image_url": "https://upload.wikimedia.org/wikipedia/commons/1/1c/Jaz-O--mika.jpg" - }, - { - "name": "Jazz Cartier", - "image_url": "http://respect-mag.com/wp-content/uploads/2018/04/1C6378F4-D2A9-4F48-93E8-AA47A154E54E.jpeg" - }, - { - "name": "Jazze Pha", - "image_url": "http://media.gettyimages.com/photos/music-producer-jazze-pha-rapper-heavy-d-and-dj-toomp-attend-tis-akoo-picture-id127898169" - }, - { - "name": "Jean Grae", - "image_url": "http://www.jayforce.com/wp-content/uploads/2011/03/jeangreen.jpg" - }, - { - "name": "Jeremiah Jae", - "image_url": "http://www.brooklynvegan.com/img/as/jeremiah-jae.jpg" - }, - { - "name": "Jeremih", - "image_url": "http://i2.wp.com/therighthairstyles.com/wp-content/uploads/2013/12/jeremih.jpg" - }, - { - "name": "Jermaine Dupri", - "image_url": "http://media.gettyimages.com/photos/rapper-jermaine-dupri-poses-for-photos-at-the-swissotel-in-chicago-picture-id145014316" - }, - { - "name": "Jeru the Damaja", - "image_url": "https://upload.wikimedia.org/wikipedia/commons/thumb/c/c9/Out4Fame-Festival_2016_-_Jeru_the_Damaja.JPG/1200px-Out4Fame-Festival_2016_-_Jeru_the_Damaja.JPG" - }, - { - "name": "Jewell", - "image_url": "http://www.celebpronto.com/wp-content/uploads/2010/08/jewel11.jpg" - }, - { - "name": "Jibbs", - "image_url": "http://rapdirt.com/images/misc/Jibbs_0306f.jpg" - }, - { - "name": "Jim Jones", - "image_url": "http://www.networth2013.com/wp-content/uploads/2013/08/Jim-Jones-Rapper.jpg" - }, - { - "name": "Jim Jonsin", - "image_url": "http://www.networth2013.com/wp-content/uploads/2013/08/Jim-Jones-Rapper.jpg" - }, - { - "name": "Jipsta", - "image_url": "http://getoutmag.com/wp-content/uploads/2011/10/jipsta.jpg" - }, - { - "name": "Jme", - "image_url": "http://conversationsabouther.net/wp-content/uploads/2015/09/Jme.jpg" - }, - { - "name": "Joe Budden", - "image_url": "http://dailyentertainmentnews.com/wpgo/wp-content/uploads/2014/08/rapper-joe-budden-girlfriend-Audely-Robles.jpg" - }, - { - "name": "Joell Ortiz", - "image_url": "https://movesmusic.files.wordpress.com/2015/01/joell.jpg" - }, - { - "name": "Joey Badass", - "image_url": "https://www.thestar.com/content/dam/thestar/news/gta/2017/08/24/rapper-joey-bada-cancels-toronto-show-after-staring-at-eclipse/joey-badass.jpg.size.custom.crop.1086x724.jpg" - }, - { - "name": "John Cena", - "image_url": "http://www.picshunger.com/wp-content/uploads/2014/04/Rap.jpg" - }, - { - "name": "Johnny J", - "image_url": "http://media.rapnews.net/ArtistPics/JohnnyJ_rnn.jpg" - }, - { - "name": "Johntá Austin", - "image_url": "http://www.rap-up.com/app/uploads/2010/05/johnta-austin.jpg" - }, - { - "name": "Joji Miller", - "image_url": "http://pre11.deviantart.net/2640/th/pre/i/2016/122/1/8/joji_miller__filthy_frank__by_shuploc-da122fv.jpg" - }, - { - "name": "Jon Connor", - "image_url": "http://s3.amazonaws.com/rapgenius/jonconnor.png" - }, - { - "name": "Joyner Lucas", - "image_url": "https://www.sohh.com/wp-content/uploads/Joyner-Lucas-1.png" - }, - { - "name": "JT Money", - "image_url": "http://purple-drank.com/wp-content/uploads/2013/06/JT-Money-New.jpg" - }, - { - "name": "JT the Bigga Figga", - "image_url": "http://a1yola.com/wp-content/uploads/2010/10/JT-The-Bigga-Figga-Dwellin-In-Tha-Labb1-e1299005670778.jpg" - }, - { - "name": "Juelz Santana", - "image_url": "http://ll-media.tmz.com/2016/12/12/1212-juelz-santana-instagram-3.jpg" - }, - { - "name": "Juice (Đus)", - "image_url": "http://images.genius.com/37b135c1e081633b01d3b09bf4e785ed.600x600x1.png" - }, - { - "name": "Juicy J", - "image_url": "http://www.beyondblackwhite.com/wp-content/uploads/2014/01/Juicy-j-cup-1.png" - }, - { - "name": "Junhyung", - "image_url": "http://stuffpoint.com/kpopshineecnbluesujubapexoetc/image/378408-kpopshineecnbluesujub-a-pexoetc-rapper-junhyung.jpg" - }, - { - "name": "Jus Allah", - "image_url": "http://farm5.staticflickr.com/4014/5169574228_84ff1a04f4_z.jpg" - }, - { - "name": "Just Ice", - "image_url": "https://images.genius.com/608c268dba94e441e3f19c1e46207413.879x876x1.jpg" - }, - { - "name": "Juvenile", - "image_url": "http://wac.450f.edgecastcdn.net/80450F/club937.com/files/2012/08/56688577-630x418.jpg" - }, - { - "name": "Kurtis Blow", - "image_url": "http://is4.mzstatic.com/image/thumb/Music/v4/69/fd/9f/69fd9f31-d152-c8ba-57be-80308d6b5d0c/source/1200x1200sr.jpg" - }, - { - "name": "Lauryn Hill", - "image_url": "http://images.musictimes.com/data/images/full/75871/lauryn-hill-tour.jpg" - }, - { - "name": "K Camp", - "image_url": "http://www2.pictures.zimbio.com/gi/K+Camp+American+Authors+Visit+Music+Choice+Furxjl-IhJ7l.jpg" - }, - { - "name": "K'naan", - "image_url": "http://images2.fanpop.com/image/photos/13600000/Stock-Knaan-on-twitter-knaan-club-13681875-483-570.jpg" - }, - { - "name": "K-Dee", - "image_url": "https://i.ytimg.com/vi/ovfrEfeqjf0/hqdefault.jpg" - }, - { - "name": "K-OS", - "image_url": "http://torontorappers.com/newsite/wp-content/uploads/2016/08/k-os-rapper.jpg" - }, - { - "name": "K-Solo", - "image_url": "http://freshnewsbysteph.com/wp-content/uploads/2011/07/k-solo.jpg" - }, - { - "name": "K.E. on the Track", - "image_url": "https://akpopworld.files.wordpress.com/2015/08/sik-k.jpg" - }, - { - "name": "K7", - "image_url": "http://cps-static.rovicorp.com/3/JPG_400/MI0001/792/MI0001792148.jpg" - }, - { - "name": "Kafani", - "image_url": "http://gossip-grind.com/wp-content/uploads/2014/09/image18.jpg" - }, - { - "name": "Kam", - "image_url": "http://3.bp.blogspot.com/_qqc1V4I4JkY/RiKG8DfqsLI/AAAAAAAABmU/e7zmHRlRL9M/kam2.jpg" - }, - { - "name": "Kangol Kid", - "image_url": "http://cache4.asset-cache.net/gc/141797166-rapper-kangol-kid-attends-the-back-to-the-gettyimages.jpg" - }, - { - "name": "Kanye West", - "image_url": "http://assets.nydailynews.com/polopoly_fs/1.3936461.1523887222!/img/httpImage/image.jpg_gen/derivatives/article_750/604289829cc00020-kanye-west.jpg" - }, - { - "name": "Kap G", - "image_url": "http://remezcla.com/wp-content/uploads/2016/04/kap-g-2016-e1466531632221.jpg" - }, - { - "name": "Kardinal Offishall", - "image_url": "http://favimages.com/wp-content/uploads/2012/08/rapper-kardinal-offishall-fame-rap-singer.jpg" - }, - { - "name": "Kastro", - "image_url": "https://i.ytimg.com/vi/tV66DD_rxNU/maxresdefault.jpg" - }, - { - "name": "Kat Dahlia", - "image_url": "http://static.djbooth.net/pics-artist/katdahlia.jpg" - }, - { - "name": "Katie Got Bandz", - "image_url": "http://moodswingmgmt.com/wp-content/uploads/2013/10/Katie_Main.jpg" - }, - { - "name": "KB", - "image_url": "http://www.rapzilla.com/rz/images/kbillboard.jpg" - }, - { - "name": "Keak da Sneak", - "image_url": "http://theboombox.com/files/2017/01/Keak-Da-Sneak-Shot.jpg" - }, - { - "name": "Keith Ape", - "image_url": "http://conversationsabouther.net/wp-content/uploads/2016/08/Keith-Ape.jpg" - }, - { - "name": "Keith Murray", - "image_url": "http://mrdaveyd.files.wordpress.com/2010/10/keith-murray.jpg" - }, - { - "name": "Malcolm David Kelley", - "image_url": "http://cdn.cnwimg.com/searchThumb/wp-content/uploads/2014/09/Malcolm-David-Kelley.jpg" - }, - { - "name": "Kendrick Lamar", - "image_url": "https://stupiddope.com/wp-content/uploads/2018/04/kendrick-lamar-damn-2018-pulitzer-prize-first-rapper-music.jpg" - }, - { - "name": "Kent Jones", - "image_url": "http://static.vibe.com/files/2015/12/kent-jones-binishPR.jpg" - }, - { - "name": "Kerser", - "image_url": "http://dailyurbanculture.com/wp-content/uploads/2014/07/3.13.jpg" - }, - { - "name": "Kevin Abstract", - "image_url": "http://images.greenlabel.com/assets/2015/09/kevin-abstract-2.jpg" - }, - { - "name": "Kevin Gates", - "image_url": "https://s-media-cache-ak0.pinimg.com/736x/73/db/e4/73dbe4857b26434fdfaab15b98a622de.jpg" - }, - { - "name": "Kevin McCall", - "image_url": "http://resources3.news.com.au/images/2013/04/29/1226631/457575-kevin-mccall.jpg" - }, - { - "name": "Khia", - "image_url": "http://planetill.com/wp-content/uploads/2012/01/Khia.jpg" - }, - { - "name": "Khleo", - "image_url": "https://s-media-cache-ak0.pinimg.com/736x/2b/fb/f7/2bfbf784203a8fbd7a032c6eb77cbaef.jpg" - }, - { - "name": "Kia Shine", - "image_url": "http://i1.ytimg.com/vi/8OZx1vK4PNE/maxresdefault.jpg" - }, - { - "name": "Kid Capri", - "image_url": "https://s3.amazonaws.com/battlerap-production/2014/08/rsz_caprirsz.jpg" - }, - { - "name": "Kid Cudi", - "image_url": "http://www.stasheverything.com/wp-content/uploads/2013/04/Kid-Cudi-pic.jpg" - }, - { - "name": "Kid Frost", - "image_url": "http://media-cache-ak0.pinimg.com/736x/8f/36/61/8f3661da395898b46c6c3c84ce4ecef1.jpg" - }, - { - "name": "Kid Ink", - "image_url": "http://chekadigital.co.za/wp-content/uploads/2013/03/kid-ink.jpg" - }, - { - "name": "Kid Rock", - "image_url": "http://www.feelnumb.com/wp-content/uploads/2011/02/gallery0219.jpg" - }, - { - "name": "Kid Sister", - "image_url": "http://s3.amazonaws.com/rapgenius/jpg_Kid_Sister__MG_2600copy2.jpg" - }, - { - "name": "Kidd Kidd", - "image_url": "http://assets.nydailynews.com/polopoly_fs/1.2284876.1436323996!/img/httpImage/image.jpg_gen/derivatives/article_750/webconfitems78f-1-web.jpg" - }, - { - "name": "Killah Priest", - "image_url": "http://media-cache-ak0.pinimg.com/736x/ce/9a/5c/ce9a5c2abde75b828adae9b87dc8e020.jpg" - }, - { - "name": "Killer Mike", - "image_url": "http://www.findnews.co.uk/wp-content/uploads/2018/03/killer-mike-rapper-defends-gun-ownership-in-nra-video.jpg" - }, - { - "name": "Kilo Ali", - "image_url": "http://straightfromthea.com/wp-content/uploads/2014/09/KiloAli.jpg" - }, - { - "name": "King Chip", - "image_url": "http://jasperdowney.files.wordpress.com/2013/09/king-chip.jpg" - }, - { - "name": "King Gordy", - "image_url": "https://s3.amazonaws.com/rapgenius/King%20Gordy%2051.jpg" - }, - { - "name": "King L", - "image_url": "http://wac.450f.edgecastcdn.net/80450F/theboombox.com/files/2012/11/king-l-456-11212.jpg" - }, - { - "name": "King Tee", - "image_url": "http://siccness.net/wp/wp-content/uploads/2015/03/king-t.jpeg" - }, - { - "name": "Kirk Knight", - "image_url": "https://s3.amazonaws.com/rapgenius/dsc_0086.jpg" - }, - { - "name": "Kirko Bangz", - "image_url": "http://api.ning.com/files/SVfVaVsl8W2HxUovnHG5eBzdyEzEx0OOHA5U4cWbuT8ShSldd7ZKPKOi2RnF*LScvMps4AXVqwGVzjyDRdPbhW**MOzSt8V3/151263619.jpg" - }, - { - "name": "Kitty", - "image_url": "http://www.mxdwn.com/wp-content/uploads/2014/06/kitty-pryde2-580x386.jpg" - }, - { - "name": "KJ-52", - "image_url": "http://www.vegasnews.com/wp-content/uploads/KJ-52-570.jpg" - }, - { - "name": "Knero", - "image_url": "https://upload.wikimedia.org/wikipedia/en/a/a8/Knero_performing_during_the_Liberian_Independent_Celebration.jpg" - }, - { - "name": "Knoc-turn'al", - "image_url": "http://images.artistdirect.com/Images/artd/amg/music/bio/1640940_knocturnal_200x200.jpg" - }, - { - "name": "KO", - "image_url": "http://hbr.co.ke/wp-content/uploads/2015/09/K.O-CARACARA-RAPPER-HIP-HOP-MUSIC.jpg" - }, - { - "name": "KOHH", - "image_url": "https://s-media-cache-ak0.pinimg.com/736x/6a/1a/12/6a1a128849b04dfde612195054e9568d.jpg" - }, - { - "name": "Kodak Black", - "image_url": "https://media.nbcnewyork.com/images/1200*675/kodakblackout1.jpg" - }, - { - "name": "Kokane", - "image_url": "http://images1.laweekly.com/imager/kokane/u/original/5095855/kokane.jpg" - }, - { - "name": "Kool A.D", - "image_url": "http://s3.amazonaws.com/rapgenius/1362185468_Kool-AD-Okayplayer-interview2.jpg" - }, - { - "name": "Kool G Rap", - "image_url": "http://www.howtorapbook.com/wp-content/uploads/2015/07/040511-music-kool-g-rap.png" - }, - { - "name": "Kool Keith", - "image_url": "http://favimages.com/wp-content/uploads/2012/08/rapper-kool-keith-hip-hop-celebrity-star.jpg" - }, - { - "name": "Kool Moe Dee", - "image_url": "https://s3.amazonaws.com/rapgenius/kool_moe_dee.jpg" - }, - { - "name": "Koolade", - "image_url": "http://media-cache-ak0.pinimg.com/736x/48/d5/96/48d596e5d2914e055459440cd92cd802.jpg" - }, - { - "name": "Krayzie Bone", - "image_url": "http://articlebio.com/uploads/bio/2016/03/23/krayzie-bone.jpg" - }, - { - "name": "Kreayshawn", - "image_url": "http://thesuperslice.com/wp-content/uploads/2011/05/Kreayshawn-03.jpg" - }, - { - "name": "Krizz Kaliko", - "image_url": "http://favimages.com/wp-content/uploads/2012/08/rapper-krizz-kaliko-hip-hop-star-celebrity.jpg" - }, - { - "name": "KRS-One", - "image_url": "http://ifihavent.files.wordpress.com/2007/07/krs_blaze02991.jpg" - }, - { - "name": "Kung Fu Vampire", - "image_url": "https://kungfuvampire.com/wp-content/uploads/2015/03/KFV-Love-Bites_cover1200x1200.jpeg" - }, - { - "name": "Kurious", - "image_url": "http://theciphershow.com/image/uploads/kurious.jpg" - }, - { - "name": "Kurtis Blow", - "image_url": "http://is4.mzstatic.com/image/thumb/Music/v4/69/fd/9f/69fd9f31-d152-c8ba-57be-80308d6b5d0c/source/1200x1200sr.jpg" - }, - { - "name": "Kurupt", - "image_url": "http://upload.wikimedia.org/wikipedia/commons/1/19/Kurupt_Young_Gotti_in_Abu_Dhabi.jpg" - }, - { - "name": "Kutt Calhoun", - "image_url": "http://cdn.ticketfly.com/i/00/02/01/08/95-atxl.jpg" - }, - { - "name": "Kwamé", - "image_url": "http://3.bp.blogspot.com/-jgNTkFb4SrQ/UD5DgQgbdPI/AAAAAAAAAJI/13r9_kMiDkY/s1600/kwame_classic1.jpg" - }, - { - "name": "Kyle", - "image_url": "http://www.dailypublic.com/sites/default/files/2015/Apr/kyle.jpg" - }, - { - "name": "Lil' Kim", - "image_url": "http://4.bp.blogspot.com/-EngYxv2jBPA/UTknA4a939I/AAAAAAAAzBU/nb9YucfMRzs/s1600/41.jpg" - }, - { - "name": "Lil Wayne", - "image_url": "http://matchmusik.files.wordpress.com/2012/01/lil-wayne.jpg" - }, - { - "name": "L.T. Hutton", - "image_url": "http://www1.pictures.zimbio.com/gi/L+T+Hutton+Tupac+Production+Celebration+Santa+0yDUOUDKzhxl.jpg" - }, - { - "name": "La Chat", - "image_url": "http://uptwnxs.com/wp-content/uploads/2013/09/lachat.png" - }, - { - "name": "La the Darkman", - "image_url": "http://cdn5.hiphoplead.com/static/2010/02/la-the-darkman2.jpg" - }, - { - "name": "Lady Luck", - "image_url": "http://www.rapgrid.com/sites/default/files/rapper-photo/lady-luck.jpg" - }, - { - "name": "The Lady of Rage", - "image_url": "https://static1.squarespace.com/static/520ed800e4b0229123208764/526f4c76e4b0096d44b292ac/526f4c78e4b0096d44b292ad/1383025791721/1.jpg" - }, - { - "name": "Lakey The Kid", - "image_url": "http://nahright.com/wp-content/uploads/2014/10/Lakey.jpg" - }, - { - "name": "Lakim Shabazz", - "image_url": "http://uniqueheat.files.wordpress.com/2011/09/lakim-shabazz-11.jpg" - }, - { - "name": "Lakutis", - "image_url": "http://first-avenue.com/sites/default/files/styles/medium/public/images/performers/lakutis11.jpg" - }, - { - "name": "Large Professor", - "image_url": "http://www.hiphopnometry.org/wp-content/uploads/2015/03/download.jpg" - }, - { - "name": "Lauryn Hill", - "image_url": "http://images.musictimes.com/data/images/full/75871/lauryn-hill-tour.jpg" - }, - { - "name": "Lazarus", - "image_url": "https://upload.wikimedia.org/wikipedia/commons/d/dc/Lazarus_%28rapper%29.jpeg" - }, - { - "name": "LE", - "image_url": "http://hiphopenquirer.com/wp-content/uploads/2013/01/le.jpg" - }, - { - "name": "Lecrae", - "image_url": "http://blog.beliefnet.com/wholenotes/files/2012/06/Lecrae1.jpg" - }, - { - "name": "Left Brain", - "image_url": "http://s3.amazonaws.com/rapgenius/tumblr_m81jhwwa8m1qa42jro1_1280.jpg" - }, - { - "name": "Lex Luger", - "image_url": "http://static01.nyt.com/images/2011/11/06/magazine/06luger/06luger-popup-v2.jpg" - }, - { - "name": "Lil' B", - "image_url": "http://celebrityinsider.org/wp-content/uploads/2018/04/Cardi-B-Nicki-Minaj-Lil-Scrappy.jpg" - }, - { - "name": "Lil' Bibby", - "image_url": "http://www.billboard.com/files/styles/article_main_image/public/media/462817929-rapper-lil-bibby-enters-the-sirius-xm-650.jpg" - }, - { - "name": "Lil' Debbie", - "image_url": "https://upload.wikimedia.org/wikipedia/commons/4/42/Lil_Debbie_on_March_14%2C_2013.jpg" - }, - { - "name": "Lil' Dicky", - "image_url": "http://b-sides.tv/wp-content/uploads/2015/10/lil-dicky.jpg" - }, - { - "name": "Lil' Durk", - "image_url": "http://www.trbimg.com/img-5693fc6e/turbine/ct-chicago-rapper-lil-durk-announces-tour-drops-new-video-20160111" - }, - { - "name": "Lil' Eazy-E", - "image_url": "http://s3.amazonaws.com/hiphopdx-production/2014/09/Lil-Eazy-E_09-05-2014.jpg" - }, - { - "name": "Lil' Flip", - "image_url": "http://cdn.cnwimg.com/wp-content/uploads/2010/12/083011-lil-flip-lil-flip.png" - }, - { - "name": "Lil' Herb", - "image_url": "https://urbanstylzclothing.files.wordpress.com/2015/09/herb.jpg" - }, - { - "name": "Lil' Jon", - "image_url": "http://s3.amazonaws.com/rapgenius/lil-jon-w.jpg" - }, - { - "name": "Lil' Joseph", - "image_url": "http://beardfist.com/images/lil_joseph.png" - }, - { - "name": "Lil' Mama", - "image_url": "http://images2.fanpop.com/image/photos/11900000/Lil-Mama-3-female-rappers-11934192-440-348.jpg" - }, - { - "name": "Lil' Peep", - "image_url": "http://www.sobrietyresources.org/wp-content/uploads/2017/11/Lil-Peep-920x584.jpg" - }, - { - "name": "Lil' Phat", - "image_url": "http://api.ning.com/files/pQ8PE*Dabum6BY5-C2af3tLPWvIZgBdgFHHT*JOkvQAU8VjVm9v*Tl*M5TmfXHOqV4ji67tMnQY9zl7p-2QdcmKmsJPGcl6Y/WTFRussianMobsterChargedInTheMurderOfRapperLilPhatAtAtlantaHospitalInAOrderedShootingVideoInside.jpg" - }, - { - "name": "Lil' Pump", - "image_url": "https://s3.amazonaws.com/hiphopdx-production/2017/05/170530-Lil-Pump-800x600.jpg" - }, - { - "name": "Lil' Reese", - "image_url": "https://assets.dnainfo.com/generated/chicago_photo/2013/06/tavares-taylor-1372019233.jpg/extralarge.jpg" - }, - { - "name": "Lil' Ric", - "image_url": "http://a1yola.com/wp-content/uploads/2010/10/Lil-Ric.jpg" - }, - { - "name": "Lil' Ru", - "image_url": "http://authenticcore.files.wordpress.com/2009/06/lil-ru.jpg" - }, - { - "name": "Lil' Scrappy", - "image_url": "http://www.memphisrap.com/mr-uploads/2014/04/Lil-Scrappy-rapper-photo.jpg" - }, - { - "name": "Lil' Skies", - "image_url": "http://dailychiefers.com/wp-content/media/2017/08/Screen-Shot-2017-08-14-at-1.47.54-PM-1160x1088.png" - }, - { - "name": "Lil' Twist", - "image_url": "http://static.vibe.com/files/2015/03/Lil-Twist.jpg" - }, - { - "name": "Lil' Uzi Vert", - "image_url": "https://static.vibe.com/files/2017/05/Lil-Uzi-Vert-photo-1494953208-640x635.jpg" - }, - { - "name": "Lil' Wayne", - "image_url": "http://matchmusik.files.wordpress.com/2012/01/lil-wayne.jpg" - }, - { - "name": "Lil' Wyte", - "image_url": "https://bloximages.chicago2.vip.townnews.com/siouxcityjournal.com/content/tncms/assets/v3/editorial/f/16/f16599f8-8e54-5711-bb60-dae0d43f7a57/4f20871f57f10.image.jpg" - }, - { - "name": "Lil' Xan", - "image_url": "http://dailychiefers.com/wp-content/media/2017/05/lil-xan-1160x1119.png" - }, - { - "name": "Lil' Yachty", - "image_url": "http://i.dailymail.co.uk/i/newpix/2018/04/16/09/4B34F62B00000578-5620125-To_celebrate_her_15th_birthday_rapper_Danielle_Bregoli_released_-a-23_1523865744678.jpg" - }, - { - "name": "Lil' Zane", - "image_url": "http://eotm.files.wordpress.com/2010/07/lil_zane_677x600.jpg" - }, - { - "name": "Lil' Cease", - "image_url": "http://www1.pictures.zimbio.com/gi/Lil+Cease+Celebs+BET+Networks+New+York+Upfront+MTLFBnBGM_Gl.jpg" - }, - { - "name": "Lil' Fizz", - "image_url": "http://img.spokeo.com/public/900-600/lil_fizz_2007_07_10.jpg" - }, - { - "name": "Lil' Flip", - "image_url": "http://cdn.cnwimg.com/wp-content/uploads/2010/12/083011-lil-flip-lil-flip.png" - }, - { - "name": "Lil' Keke", - "image_url": "http://rapdose.com/wp-content/uploads/2014/04/Lil-Keke.jpg" - }, - { - "name": "Lil' Kim", - "image_url": "http://4.bp.blogspot.com/-EngYxv2jBPA/UTknA4a939I/AAAAAAAAzBU/nb9YucfMRzs/s1600/41.jpg" - }, - { - "name": "Lil' O", - "image_url": "http://purple-drank.com/wp-content/uploads/2011/06/Lil-O-Grind-Hard-Pray-Harder.jpg" - }, - { - "name": "Lil' Ronnie", - "image_url": "http://s3.amazonaws.com/hiphopdx-production/2016/10/Lil-Ronny-Instagram-e1477254471301-824x620.jpg" - }, - { - "name": "Lil' Troy", - "image_url": "http://photos1.blogger.com/x/blogger/2167/1769/1600/398335/liltroy.jpg" - }, - { - "name": "Lil' Wil", - "image_url": "http://www.rap-up.com/app/uploads/2018/04/lil-uzi-vert-japan.jpg" - }, - { - "name": "Lin Que", - "image_url": "https://upload.wikimedia.org/wikipedia/commons/thumb/3/3b/LinQue_5287-theOne.jpg/220px-LinQue_5287-theOne.jpg" - }, - { - "name": "Lisa Lopes", - "image_url": "http://images.rapgenius.com/3c8e978c534d938aa60f47229515ee66.527x600x1.jpg" - }, - { - "name": "LL Cool J", - "image_url": "http://media.npr.org/assets/img/2012/08/23/ll-cool-j_sq-ad8a68251f21a82c02dec641aad124d6b4de1ca0-s6-c30.jpg" - }, - { - "name": "Lloyd Banks", - "image_url": "https://www.bet.com/music/2018/03/17/lloyd-banks/_jcr_content/image.large2x1image.dimg/__1521337827454__1521335807971/031718-music-lloyd-banks.jpg" - }, - { - "name": "Locksmith", - "image_url": "http://api.ning.com/files/J*jFKCPdofWd1tPJxEdhL67p02O8suSNVExOVE0sZ0Gr*i9CA1T6aus8mXwgRx-xZODjLxtX5Am03SCXd8YZS1dm-MQZU*rN/locksmith.PNG" - }, - { - "name": "Logic", - "image_url": "http://hiphopnewssource.com/wp-content/uploads/2015/01/Logic-rapper.jpg" - }, - { - "name": "LoLa Monroe", - "image_url": "http://talkingpretty.com/wp-content/uploads/2011/12/Lola_Monroe.jpg" - }, - { - "name": "London On Da Track", - "image_url": "http://image1.redbull.com/rbcom/010/2017-02-27/1331846909916_2/0010/1/1500/1000/2/rapper-pell-and-producer-london-on-da-track.jpg" - }, - { - "name": "Loon", - "image_url": "http://rollingout.com/wp-content/uploads/2013/07/loon.jpg" - }, - { - "name": "Lord Finesse", - "image_url": "http://www.ballerstatus.com/wp-content/uploads/2012/07/lordfinesse.jpg" - }, - { - "name": "Lord Have Mercy", - "image_url": "http://4.bp.blogspot.com/-e0M8qmkHdr4/T-OOzru_EbI/AAAAAAAAB4c/b2Xzs3Uhx2M/s1600/lord-have-mercy-black-n-white.jpg" - }, - { - "name": "Lord Infamous", - "image_url": "http://www.aceshowbiz.com/images/news/lord-infamous-of-three-6-mafia-died-at-40.jpg" - }, - { - "name": "Lord Jamar", - "image_url": "http://insidejamarifox.com/wp-content/uploads/2013/09/LORDJAMAR.jpg" - }, - { - "name": "Los", - "image_url": "http://cdn.ambrosiaforheads.com/wp-content/uploads/2014/03/los-rapper.jpeg" - }, - { - "name": "Louis Logic", - "image_url": "http://www.mvremix.com/urban/interviews/images/l_l.jpg" - }, - { - "name": "Lovebug Starski", - "image_url": "https://upload.wikimedia.org/wikipedia/commons/1/12/Starski.jpg" - }, - { - "name": "LoveRance", - "image_url": "http://www.famousbirthdays.com/thumbnails/loverance-medium.jpg" - }, - { - "name": "Lowkey", - "image_url": "https://www.thecanary.co/wp-content/uploads/2018/04/Rapper-Lowkey-on-Going-Underground-770x403.jpg" - }, - { - "name": "LRoc", - "image_url": "https://i1.wp.com/www.respectmyregion.com/wp-content/uploads/2015/07/unnamed1-e1438370960295.jpg" - }, - { - "name": "Ludacris", - "image_url": "https://pennylibertygbow.files.wordpress.com/2012/02/ludacris.jpg" - }, - { - "name": "Luis Resto", - "image_url": "http://images.genius.com/1555dd4015e93a37e901dd6bbcf8fd94.502x502x1.jpg" - }, - { - "name": "Luni Coleone", - "image_url": "http://hw-static.worldstarhiphop.com/pics/images/tp/2lieagk.jpg" - }, - { - "name": "Lupe Fiasco", - "image_url": "http://2.bp.blogspot.com/-sB8Ufk5JalU/TnVCVMu-QaI/AAAAAAAAGZk/ih8up0ox8AA/s1600/lupe_fiasco.jpg" - }, - { - "name": "Luther Campbell", - "image_url": "https://s-media-cache-ak0.pinimg.com/736x/55/bf/a2/55bfa20740ef48b87c79db4bf83045e6.jpg" - }, - { - "name": "MC Lyte", - "image_url": "http://www2.pictures.zimbio.com/gi/MC+Lyte+Soul+Train+Awards+2012+Glade+Suite+pwqWuYKKQkwl.jpg" - }, - { - "name": "Melle Mel", - "image_url": "http://www4.pictures.zimbio.com/gi/Melle+Mel+GRAMMY+Nominations+Concert+Live+uqqOc_pgcOKl.jpg" - }, - { - "name": "MF Doom", - "image_url": "http://1.bp.blogspot.com/-sV6R16-qWxo/Tm6ZhYV7_aI/AAAAAAAAACI/Hh6dPl1H2L0/s1600/MF%2BDOOM.jpg" - }, - { - "name": "M Trill", - "image_url": "http://www.iwantairplay.com/artist/img/201011041288886539_mtrill%202.jpg" - }, - { - "name": "M-1", - "image_url": "http://i.huffpost.com/gen/2559626/images/o-M1-RAPPER-facebook.jpg" - }, - { - "name": "M.I.A.", - "image_url": "http://media.santabanta.com/newsite/cinemascope/feed/mia20.jpg" - }, - { - "name": "Mac", - "image_url": "http://s3.amazonaws.com/rapgenius/Earlly.jpg" - }, - { - "name": "Mac Dre", - "image_url": "http://s3.amazonaws.com/rapgenius/10683a596c9b82548291.jpg" - }, - { - "name": "Mac Lethal", - "image_url": "http://i.ytimg.com/vi/UV-q4q66SAQ/maxresdefault.jpg" - }, - { - "name": "Mac Mall", - "image_url": "http://s3.amazonaws.com/rapgenius/DSC_2267a.jpg" - }, - { - "name": "Mac Miller", - "image_url": "http://s3.amazonaws.com/rapgenius/1357230347_MacMiller.jpg" - }, - { - "name": "Mac Minister", - "image_url": "http://mtv.mtvnimages.com/uri/mgid:uma:image:mtv.com:3088181" - }, - { - "name": "Machine Gun Kelly", - "image_url": "https://upload.wikimedia.org/wikipedia/commons/thumb/a/a7/Machine_Gun_Kelly.jpg/1200px-Machine_Gun_Kelly.jpg" - }, - { - "name": "Mack 10", - "image_url": "http://s3.amazonaws.com/rapgenius/1368457732_77476E77A10496D1F7CAD8DC2CBA9F72.jpg" - }, - { - "name": "Mack Maine", - "image_url": "http://www1.pictures.zimbio.com/gi/Cash+Money+Records+Lil+Wayne+Album+Release+4Y_9ed0dAwal.jpg" - }, - { - "name": "Macklemore", - "image_url": "http://cdn1.bostonmagazine.com/wp-content/uploads/2013/10/macklemore-boston-rappers.jpg" - }, - { - "name": "Mad Lion", - "image_url": "http://ring.cdandlp.com/oldiers/photo_grande/114795296.jpg" - }, - { - "name": "Madchild", - "image_url": "http://i1.wp.com/www.ballerstatus.com/wp-content/uploads/2013/07/madchild.jpg" - }, - { - "name": "Madlib", - "image_url": "http://www.stasheverything.com/wp-content/uploads/2012/08/madlib.jpg" - }, - { - "name": "Maejor Ali", - "image_url": "http://www.rap-up.com/app/uploads/2014/10/maejor-ali-team.jpg" - }, - { - "name": "Magic", - "image_url": "http://www.ballerstatus.com/wp-content/uploads/2013/03/mrmagic.jpg" - }, - { - "name": "Magneto Dayo", - "image_url": "http://images1.laweekly.com/imager/magneto-dayo/u/original/4246159/dayophoto.jpg" - }, - { - "name": "Magnolia Shorty", - "image_url": "http://img.wennermedia.com/social/rs-896-rectangle.jpg" - }, - { - "name": "Maino", - "image_url": "https://fanart.tv/fanart/music/2c2cc2fe-0dcf-4995-8199-91fd5f159323/artistbackground/maino-50a1d2727401b.jpg" - }, - { - "name": "Manafest", - "image_url": "http://favimages.com/wp-content/uploads/2012/08/rapper-manafest-celebrity-rap-singer.jpg" - }, - { - "name": "Mann", - "image_url": "https://ipeoplewatch.files.wordpress.com/2010/11/mann.png" - }, - { - "name": "Mannie Fresh", - "image_url": "http://www.hip-hopvibe.com/wp-content/uploads/2012/08/Mannie-Fresh-3.jpg" - }, - { - "name": "Marčelo", - "image_url": "http://upload.wikimedia.org/wikipedia/commons/thumb/4/4c/Mar%C4%8Delo_2008.jpg/600px-Mar%C4%8Delo_2008.jpg" - }, - { - "name": "Mariah Carey", - "image_url": "http://37.media.tumblr.com/ddcd2842cfaa27ad749eb1c8f0fa87d3/tumblr_mrvw1psZ391szbfero1_500.jpg" - }, - { - "name": "Mark Battles", - "image_url": "http://www.gannett-cdn.com/-mm-/ea1e306e18ab38d38fd0c7bad5df798dc9e6bf2a/c=1-0-1142-858&r=x404&c=534x401/local/-/media/2016/09/12/INGroup/Indianapolis/636092765862586531-MARKBATTLES-1-.jpg" - }, - { - "name": "Marky Mark", - "image_url": "http://i.dailymail.co.uk/i/pix/2014/12/15/23C0FCDA00000578-2874607-Back_in_the_day_Marky_Mark_Mark_Wahlberg_rapper_and_actor_circa_-m-4_1418665581123.jpg" - }, - { - "name": "Marley Marl", - "image_url": "http://www.waxpoetics.com/wp-content/uploads/2014/06/Kool-G-Rap_Promo2_suekwon-1.jpg" - }, - { - "name": "Marvaless", - "image_url": "http://a1yola.com/wp-content/uploads/2011/01/Marvaless-Ghetto-Blues.jpg" - }, - { - "name": "Marz", - "image_url": "http://wadeoradio.com/wp-content/uploads/2013/05/marz_with_hoodie.jpg" - }, - { - "name": "Mase", - "image_url": "http://richglare.com/wp-content/uploads/2014/03/mase.jpg" - }, - { - "name": "Masspike Miles", - "image_url": "http://api.ning.com/files/mWq-Pv8RWzQj-MamUWH9TNTYNoW0BlcruPGRV8J5nMMxDR76Wm0*Jgimy-pJMwxDTY5CcBFnbIJEj2GQDyirFkBKOdLYcw7C/masspikemiles20120105300x300.jpg" - }, - { - "name": "Masta Ace", - "image_url": "http://www.okayplayer.com/wp-content/uploads/2012/04/Masta_Ace_x_DOOM.jpg" - }, - { - "name": "Masta Killa", - "image_url": "http://favimages.com/wp-content/uploads/2012/08/rapper-masta-killa-singer-rap-hip-hop.jpg" - }, - { - "name": "Master P", - "image_url": "http://cdn2.hiphopsince1987.com/wp-content/uploads/2014/04/MasterP.jpg" - }, - { - "name": "Master Shortie", - "image_url": "http://cache4.asset-cache.net/gc/98003447-british-rapper-master-shortie-performs-at-the-gettyimages.jpg" - }, - { - "name": "Matt Toka", - "image_url": "http://cdn.baeblemusic.com/bandcontent/matt_toka/matt_toka-498.jpg" - }, - { - "name": "Max B", - "image_url": "http://www.therapscene.com/wp-content/uploads/2016/09/max-b.png" - }, - { - "name": "Maxo Kream", - "image_url": "http://images.livemixtapes.com/artists/nodj/maxo_kream-maxo_187/cover.jpg" - }, - { - "name": "MC Breed", - "image_url": "http://cdn.ambrosiaforheads.com/wp-content/uploads/2015/10/MCBreed_Tupac.jpg" - }, - { - "name": "MC Davo", - "image_url": "https://i.scdn.co/image/8ca10c2e0345c064fd77e23dffd044e095cd09d9" - }, - { - "name": "MC Eiht", - "image_url": "http://happybday.to/sites/pics/mc-eiht-2013-3.jpg" - }, - { - "name": "MC Frontalot", - "image_url": "http://s3.amazonaws.com/media.wbur.org/wordpress/9/files/2011/11/1102_frontalot.jpg" - }, - { - "name": "MC Hammer", - "image_url": "http://i2.cdn.turner.com/cnnnext/dam/assets/111020033101-mc-hammer-story-top.jpg" - }, - { - "name": "MC Jin", - "image_url": "http://blog.asianinny.com/wp-content/uploads/2014/08/Edit-2.jpg" - }, - { - "name": "MC Lyte", - "image_url": "http://www2.pictures.zimbio.com/gi/MC+Lyte+Soul+Train+Awards+2012+Glade+Suite+pwqWuYKKQkwl.jpg" - }, - { - "name": "MC Mong", - "image_url": "http://www.christianitydaily.com/data/images/full/292/mc-mong.jpg" - }, - { - "name": "MC Pressure", - "image_url": "http://resources1.news.com.au/images/2013/09/13/1226718/911813-6111b67a-1b93-11e3-885a-29191a963f6e.jpg" - }, - { - "name": "MC Ren", - "image_url": "http://favimages.com/wp-content/uploads/2012/08/rapper-mc-ren-celebrity-rap-star.jpg" - }, - { - "name": "MC Ride", - "image_url": "https://upload.wikimedia.org/wikipedia/commons/7/72/MC_Ride_of_Death_Grips_in_2012.jpg" - }, - { - "name": "MC Serch", - "image_url": "http://www.eurweb.com/wp-content/uploads/2013/09/MC-Serch1.jpg" - }, - { - "name": "MC Shan", - "image_url": "http://cps-static.rovicorp.com/3/JPG_400/MI0001/369/MI0001369927.jpg" - }, - { - "name": "MC Solaar", - "image_url": "http://www.potoclips.com/wp-content/uploads/2014/12/MC-Solaar-Zoom-90-11-2014-10.png" - }, - { - "name": "MC Trouble", - "image_url": "http://urbanbridgez.com/ubgblog/wp-content/uploads/2012/06/MCTrouble.jpg" - }, - { - "name": "MC Tunes", - "image_url": "http://i4.manchestereveningnews.co.uk/incoming/article4024647.ece/ALTERNATES/s615/nicky-lockett.jpg" - }, - { - "name": "Meechy Darko", - "image_url": "http://www4.pictures.zimbio.com/gi/Meechy+Darko+Coachella+Valley+Music+Arts+Festival+TkYgAgZECOrl.jpg" - }, - { - "name": "Meek Mill", - "image_url": "https://mk0slamonlinensgt39k.kinstacdn.com/wp-content/uploads/2018/04/meek.jpg" - }, - { - "name": "Melle Mel", - "image_url": "http://www4.pictures.zimbio.com/gi/Melle+Mel+GRAMMY+Nominations+Concert+Live+uqqOc_pgcOKl.jpg" - }, - { - "name": "Mellow Man Ace", - "image_url": "http://www.thecubanhistory.com/wp-content/uploads/2014/09/mellow-man-ace-posing-for-pic-picture.jpg" - }, - { - "name": "Memphis Bleek", - "image_url": "http://www4.pictures.gi.zimbio.com/Jay+Z+Celebrates+Grand+Opening+40+40+Club+BLwPtvgRe4Sl.jpg" - }, - { - "name": "Messy Marv", - "image_url": "http://gossip-grind.com/wp-content/uploads/2013/09/image3.jpg" - }, - { - "name": "Method Man", - "image_url": "http://assets.nydailynews.com/polopoly_fs/1.384069!/img/httpImage/image.jpg_gen/derivatives/landscape_1200/alg-rapper-method-man-jpg.jpg" - }, - { - "name": "Metro Boomin", - "image_url": "http://static.stereogum.com/uploads/2017/05/Metro-Boomin-1496168461-compressed.jpg" - }, - { - "name": "MF Doom", - "image_url": "http://1.bp.blogspot.com/-sV6R16-qWxo/Tm6ZhYV7_aI/AAAAAAAAACI/Hh6dPl1H2L0/s1600/MF%2BDOOM.jpg" - }, - { - "name": "MF Grimm", - "image_url": "http://favimages.com/wp-content/uploads/2012/08/rapper-mf-grimm-fame-hip-hop-star.jpg" - }, - { - "name": "Mia X", - "image_url": "http://www.blackvibes.com/images/bvc/81/16306-mia-x.jpg" - }, - { - "name": "Mic Geronimo", - "image_url": "http://img.spokeo.com/public/900-600/mic_geronimo_2003_06_04.jpg" - }, - { - "name": "Mick Jenkins", - "image_url": "http://thekoalition.com/images/2015/10/Mick-Jenkins.jpg" - }, - { - "name": "Mickey Factz", - "image_url": "http://www.thefader.com/ys_assets/0005/4038/mfactz_main.jpg" - }, - { - "name": "Mike Dean", - "image_url": "https://vice-images.vice.com/images/content-images-crops/2015/10/23/smoking-weed-and-talking-rap-urban-legends-with-the-biggest-stoner-in-hip-hop-420-body-image-1445632224-size_1000.jpg" - }, - { - "name": "Mike G", - "image_url": "http://assets.nydailynews.com/polopoly_fs/1.2687217.1466809127!/img/httpImage/image.jpg_gen/derivatives/article_750/brown25f-2-web.jpg" - }, - { - "name": "Mike Jones", - "image_url": "http://content6.flixster.com/photo/12/68/69/12686960_ori.jpg" - }, - { - "name": "Mike Posner", - "image_url": "http://i.ytimg.com/vi/_z1aJvUTXUY/maxresdefault.jpg" - }, - { - "name": "Mike Shinoda", - "image_url": "http://www.canada.com/entertainment/cms/binary/7181890.jpg" - }, - { - "name": "Mike Stud", - "image_url": "https://cab.blog.gustavus.edu/files/2014/01/STUDITUNES2.jpg" - }, - { - "name": "Mike Will Made It", - "image_url": "http://generations.fr/media/son/_src/mike-will-made-it.jpg" - }, - { - "name": "Mike Zombie", - "image_url": "http://www.lifeistremendez.com/wp-content/uploads/2016/06/MIKE-ZOMBIE.jpg" - }, - { - "name": "Milo", - "image_url": "http://images1.laweekly.com/imager/milo/u/original/4244882/milo2final.jpg" - }, - { - "name": "Mims", - "image_url": "https://upload.wikimedia.org/wikipedia/commons/f/f5/Shawn-Mims_2009-04-10_by-Adam-Bielawski.jpg" - }, - { - "name": "Mino", - "image_url": "https://s-media-cache-ak0.pinimg.com/736x/9c/ab/e8/9cabe8d370440fada55bc1e8f338b332.jpg" - }, - { - "name": "Miryo", - "image_url": "http://i1.wp.com/www.koreaboo.com/wp-content/uploads/2015/11/80059600.jpg" - }, - { - "name": "Missy Elliott", - "image_url": "http://thatgrapejuice.net/wp-content/uploads/2011/06/Missy%2BElliott1.jpg" - }, - { - "name": "Mista Grimm", - "image_url": "http://steadydippin.com/wp-content/uploads/Mista-Grimm.jpg" - }, - { - "name": "Mistah F.A.B.", - "image_url": "https://upload.wikimedia.org/wikipedia/commons/5/5f/Mistah_F.A.B._%28cropped%29.jpg" - }, - { - "name": "Mister Cee", - "image_url": "http://ocdn.hiphopdx.com/mister-cee-gq-magazine-january-2014-hip-hop-dj-atlanta-music-01.jpg" - }, - { - "name": "Mitchy Slick", - "image_url": "http://celebnmusic247.com/wp-content/uploads/2013/12/San-Diego-rapper-Lil-Mitchy-Slick-Killed-news-1216-1.jpg" - }, - { - "name": "Mo B. Dick", - "image_url": "http://purple-drank.com/wp-content/uploads/2011/06/Mo-B.-Dick.jpg" - }, - { - "name": "Mod Sun", - "image_url": "https://i.ytimg.com/vi/077gBsOpfLY/maxresdefault.jpg" - }, - { - "name": "Money-B", - "image_url": "https://static1.squarespace.com/static/537f7de4e4b07cc20962a0fe/57d9ce70d482e972e8422601/57d9ced41b631b43099ada2e/1486258009597/money+b+icicles.jpg" - }, - { - "name": "Monie Love", - "image_url": "https://68.media.tumblr.com/34e9804dcd3a4307e744fc0b343318bf/tumblr_mvftdi4xlG1szbfero1_500.jpg" - }, - { - "name": "Monoxide Child", - "image_url": "https://upload.wikimedia.org/wikipedia/commons/thumb/0/01/Monoxide_Child_at_the_Abominationz_tour_in_Chesterfield%2C_MI_on_April_27th%2C_2013.jpg/220px-Monoxide_Child_at_the_Abominationz_tour_in_Chesterfield%2C_MI_on_April_27th%2C_2013.jpg" - }, - { - "name": "Mopreme Shakur", - "image_url": "https://media.gettyimages.com/photos/rapper-mopreme-shakur-attends-the-2012-estrella-de-moet-program-at-picture-id143587959" - }, - { - "name": "Mos Def", - "image_url": "http://1.bp.blogspot.com/-OfuE_iF9YT4/TarRyZ1raYI/AAAAAAAABJA/JZ6p4D2dMjw/s1600/mos_def1.jpg" - }, - { - "name": "Mr. Capone-E", - "image_url": "http://media-cache-ak0.pinimg.com/736x/06/58/dd/0658ddcf276465f97bee8e59ac5937ef.jpg" - }, - { - "name": "Mr. Cheeks", - "image_url": "http://www.twincities.com/wp-content/uploads/2016/03/08-RapperMrCheeks.jpg" - }, - { - "name": "Mr. Collipark", - "image_url": "http://urltv.tv/wp-content/uploads/2015/02/mr-collipark.png" - }, - { - "name": "Mr. Criminal", - "image_url": "https://nueonline.files.wordpress.com/2010/05/mr-cr.jpg" - }, - { - "name": "Mr. Lif", - "image_url": "https://media2.wnyc.org/i/800/0/c/80/nprproxy/477517970" - }, - { - "name": "Mr. Porter", - "image_url": "https://s3.amazonaws.com/rapgenius/1364090355_l.jpg" - }, - { - "name": "Mr. Serv-On", - "image_url": "http://purple-drank.com/wp-content/uploads/2013/09/Mr.-Serv-On-Gangsta-1-More-Time.jpg" - }, - { - "name": "Mr. Short Khop", - "image_url": "https://www.rapmusicguide.com/amass/images/inventory/4474/Mr.%20Short%20Khop%20-%20Da%20Khop%20Shop.jpg" - }, - { - "name": "Ms. Jade", - "image_url": "http://www.billboard.com/files/media/ms-jade-press-2002-650a.jpg" - }, - { - "name": "Murphy Lee", - "image_url": "http://1.bp.blogspot.com/_72Fq2ASEDsQ/SylcE_hqPzI/AAAAAAAAJSQ/VlycqZcZFQE/s320/murphy_lee_mo-174781.jpg" - }, - { - "name": "Murs", - "image_url": "http://planetill.com/wp-content/uploads/2011/01/murs1a.jpg" - }, - { - "name": "Mystikal", - "image_url": "http://theboombox.com/files/2015/09/mystikal-630x420.jpg" - }, - { - "name": "Myzery", - "image_url": "http://faygoluvers.net/v5/wp-content/uploads/2013/03/MYZERY-INT-2013th.jpg" - }, - { - "name": "Montana of 300", - "image_url": "http://www.rapswag.com/wp-content/uploads/2016/05/montana-of-300.jpg" - }, - { - "name": "Nas", - "image_url": "http://www.howtorapbook.com/wp-content/uploads/2016/04/nas_rapper_reuters_1200.jpg" - }, - { - "name": "Nicki Minaj", - "image_url": "http://www.rap-up.com/app/uploads/2018/04/nicki-minaj-chun-li.jpg" - }, - { - "name": "NBA YoungBoy", - "image_url": "http://feedbox.com/wp-content/uploads/2017/07/rapper-nba-youngboy.jpg" - }, - { - "name": "N.O. Joe", - "image_url": "https://images.genius.com/e6d317c1fc41f258cab262a651d1032d.220x222x1.jpg" - }, - { - "name": "N.O.R.E.", - "image_url": "http://rapradar.com/wp-content/uploads/2016/03/nore-rapradar-2.jpg" - }, - { - "name": "Napoleon", - "image_url": "http://2paclegacy.net/wp-content/uploads/2015/12/Napoleon-Outlawz.jpg" - }, - { - "name": "Nas", - "image_url": "http://www.howtorapbook.com/wp-content/uploads/2016/04/nas_rapper_reuters_1200.jpg" - }, - { - "name": "Nate Dogg", - "image_url": "http://www.evilbeetgossip.com/wp-content/uploads/2011/03/Nate-Dogg-AKA-Nathaniel-Hale.jpg" - }, - { - "name": "Nature", - "image_url": "http://blogordiepgh.com/wp-content/uploads/2016/02/nature2-590x738.jpg" - }, - { - "name": "Nav", - "image_url": "https://www.desiblitz.com/wp-content/uploads/2017/02/Nav-Rapper-Watch-2017-Featued-1.jpg" - }, - { - "name": "Nebu Kiniza", - "image_url": "https://www.famousbirthdays.com/faces/kiniza-nebu-image.jpg" - }, - { - "name": "Necro", - "image_url": "https://m3event.files.wordpress.com/2012/05/necro.png" - }, - { - "name": "Needlz", - "image_url": "http://www.mvremix.com/urban/interviews/images/choppa.jpg" - }, - { - "name": "Nelly", - "image_url": "http://www.rapbasement.com/wp-content/uploads/2015/04/nelly-4ee7ec5a1b162.jpg" - }, - { - "name": "NF", - "image_url": "http://nfrealmusic.umg-wp.com/wp-content/blogs.dir/390/files_mf/1427238717nfbg2.jpg" - }, - { - "name": "Nick Cannon", - "image_url": "http://4.bp.blogspot.com/-WlJB4GcpcJI/TrIsDVJpnCI/AAAAAAAAAQs/KvUN9_OEwRg/s1600/Nick-Cannon-biography.jpg" - }, - { - "name": "Nicki Minaj", - "image_url": "http://www.rap-up.com/app/uploads/2018/04/nicki-minaj-chun-li.jpg" - }, - { - "name": "Nicky da B", - "image_url": "http://www.out.com/sites/out.com/files/2014/09/04/nicky-1%20main.jpg" - }, - { - "name": "Nicole Wray", - "image_url": "http://static.djbooth.net/pics-artist-rec/Nicole_Wray_1.jpg" - }, - { - "name": "Nikki D", - "image_url": "http://4.bp.blogspot.com/-Qc-EvZbPM1Q/UZhHG-wvkUI/AAAAAAAASYY/FRdaUwO8KJg/s1600/nikkid.jpg" - }, - { - "name": "Ninja", - "image_url": "http://www.dieantwoord.com/wp-content/uploads/2016/06/13355485_1803315693234477_1383954422_n.jpg" - }, - { - "name": "Nipsey Hussle", - "image_url": "https://badgerherald.com/media/2013/10/nipsey_headshot.jpg" - }, - { - "name": "Nitty", - "image_url": "http://versetracker.com/sites/default/files/rapper-pictures/r/rum-nitty.jpg" - }, - { - "name": "Nitty Scott MC", - "image_url": "http://www.thesocialmediasamurai.com/wp-content/uploads/2015/06/TMT_6971-Edit_HighResEdit.jpg" - }, - { - "name": "NoClue", - "image_url": "https://upload.wikimedia.org/wikipedia/commons/9/94/RickyBrown2.jpg" - }, - { - "name": "No Malice", - "image_url": "http://www.xxlmag.com/files/2015/08/no-malice-interview.jpg" - }, - { - "name": "Noah 40 Shebib", - "image_url": "http://www.rap-up.com/app/uploads/2018/04/drake-floral.jpg" - }, - { - "name": "Noname", - "image_url": "https://upload.wikimedia.org/wikipedia/commons/thumb/b/b8/Noname_%28rapper%29_2017.jpg/1200px-Noname_%28rapper%29_2017.jpg" - }, - { - "name": "Nonchalant", - "image_url": "http://bandwidth.wamu.org/wp-content/uploads/2014/05/nonchalant-900x503.png" - }, - { - "name": "The Notorious B.I.G.", - "image_url": "http://www.neontommy.com/sites/default/files/NotoriousBIG.jpg" - }, - { - "name": "Nottz", - "image_url": "http://brandnew-hiphop.com/wp-content/uploads/2015/11/rapper-big-pooh-nottz-300z.jpg" - }, - { - "name": "Nujabes", - "image_url": "http://www.posterinvation.com/wp-content/uploads/2017/11/Nujabes-Japanese-Rapper.jpg" - }, - { - "name": "Nump", - "image_url": "https://upload.wikimedia.org/wikipedia/commons/0/08/NUMP_Photo_By_Linda_Poeng.jpg" - }, - { - "name": "Numskull", - "image_url": "http://a1yola.com/wp-content/uploads/2010/10/knumskull.jpeg" - }, - { - "name": "Nyck Caution", - "image_url": "https://s3.amazonaws.com/rapgenius/1370913624_Nyck-Caution.jpeg" - }, - { - "name": "Nyzzy Nyce", - "image_url": "http://cache.vevo.com/Content/VevoImages/artist/F77096AEAB227EDC7749E54A60AD84FD20133151332767.jpg" - }, - { - "name": "O.T. Genasis", - "image_url": "http://www.atlanticrecords.com/sites/g/files/g2000003466/f/styles/post_thumbnail_home/public/201407/O.T.Genasis_NewArtist_StoryImage.jpg" - }, - { - "name": "Obie Trice", - "image_url": "https://i.ytimg.com/vi/k0CukaaPmpk/hqdefault.jpg" - }, - { - "name": "Oddisee", - "image_url": "http://image2.redbull.com/rbcom/010/2015-04-21/1331718387121_2/0012/0/905/0/2616/2573/1500/2/oddisee.jpg" - }, - { - "name": "Offset", - "image_url": "http://celebrityinsider.org/wp-content/uploads/2018/04/Offset.jpg" - }, - { - "name": "OG Maco", - "image_url": "http://rack.0.mshcdn.com/media/ZgkyMDE0LzA5LzE5LzY2L29nbWFjb3VndWVzLjI3ZTY4LmpwZwpwCXRodW1iCTk1MHg1MzQjCmUJanBn/e9db9255/336/og-maco-uguessedit.jpg" - }, - { - "name": "Oh No", - "image_url": "https://s3.amazonaws.com/hiphopdx-production/2015/07/Screen-Shot-2015-07-17-at-6.45.39-PM-300x300.png" - }, - { - "name": "OJ da Juiceman", - "image_url": "http://www.stacksmag.net/wp-content/uploads/2013/03/Oj+Da+Juiceman.jpg" - }, - { - "name": "Ol' Dirty Bastard", - "image_url": "http://25.media.tumblr.com/tumblr_llopqgJSCs1qcnjjco1_500.jpg" - }, - { - "name": "Olamide", - "image_url": "http://i0.wp.com/www.currentnewsnow.com/wp-content/uploads/2017/02/olamide-rapper.jpg" - }, - { - "name": "Olivia", - "image_url": "http://4.bp.blogspot.com/-zjgq7UuGNO8/TtdcuvdVFoI/AAAAAAAAEtA/5zoyt9VRv3E/s1600/olivia+longott.jpg" - }, - { - "name": "Omarion", - "image_url": "https://i0.wp.com/favimages.com/wp-content/uploads/2012/08/rapper-omarion-rap-celebrity-singer.jpg" - }, - { - "name": "Omega Red", - "image_url": "https://www.rap-n-blues.com/wp-content/uploads/2010/10/Exclusive-Interview-with-Omega-Red-pt-1-11.jpg" - }, - { - "name": "Omillio Sparks", - "image_url": "https://i.ytimg.com/vi/bgjehnnP7vE/maxresdefault.jpg" - }, - { - "name": "One Be Lo", - "image_url": "https://grownuprap.files.wordpress.com/2015/06/one-be-lo.jpg" - }, - { - "name": "Oneya", - "image_url": "http://4.bp.blogspot.com/_rc6elIZnb9w/StfvPh8AExI/AAAAAAAAAPI/_RXYXzPY8PI/s320/grillz%5B1%5D.png" - }, - { - "name": "Open Mike Eagle", - "image_url": "http://normalimage.cdn.ucbt.net/person_69295.png" - }, - { - "name": "Psy", - "image_url": "http://www.soompi.com/wp-content/uploads/2013/05/psy-yahoo.jpg" - }, - { - "name": "Q-Tip", - "image_url": "http://amarudontv.com/wp-content/uploads/2011/06/q-tip.jpg" - }, - { - "name": "P. Reign", - "image_url": "http://www.thisisyourconscience.com/wp-content/uploads/2011/03/P-Reign.jpg" - }, - { - "name": "P.C.T", - "image_url": "http://media-cache-ec0.pinimg.com/736x/d8/6e/c4/d86ec4828778e4997a77313619d0d370.jpg" - }, - { - "name": "Papa Reu", - "image_url": "http://thesource.com/wp-content/uploads/2015/07/papa-reu-1.jpg" - }, - { - "name": "Papoose", - "image_url": "http://assets.nydailynews.com/polopoly_fs/1.281729.1314351515!/img/httpImage/image.jpg_gen/derivatives/article_970/amd-papoose-jpg.jpg" - }, - { - "name": "Paris", - "image_url": "http://cps-static.rovicorp.com/3/JPG_1080/MI0001/400/MI0001400360.jpg" - }, - { - "name": "PARTYNEXTDOOR", - "image_url": "http://wac.450f.edgecastcdn.net/80450F/theboombox.com/files/2013/10/PARTYNEXTDOOR.jpg" - }, - { - "name": "Pastor Troy", - "image_url": "http://veganrapnerd.com/wp-content/uploads/2013/08/pastortroy.jpg" - }, - { - "name": "Paul Wall", - "image_url": "http://aaenglish.files.wordpress.com/2010/07/paul_wall.jpg" - }, - { - "name": "Peedi Peedi", - "image_url": "http://www.yorapper.com/Photos/peedi-peedi-ringtone.jpg" - }, - { - "name": "Peewee Longway", - "image_url": "http://thedailyloud.com/wp-content/uploads/2014/07/PeeWee+Longway.jpg" - }, - { - "name": "Pacewon", - "image_url": "http://s3.amazonaws.com/rapgenius/1362133040_pacewon1.jpg" - }, - { - "name": "Percee P", - "image_url": "https://images.genius.com/5043bb54deda4ff352e7a413107e40fd.455x489x1.jpg" - }, - { - "name": "Petey Pablo", - "image_url": "http://i.perezhilton.com/wp-content/uploads/2012/02/rapper-petey-pablo-goes-to-prison__oPt.jpg" - }, - { - "name": "Pharoahe Monch", - "image_url": "http://thecorner.co.nz/wp-content/uploads/2010/10/monch.jpg" - }, - { - "name": "Pharrell Williams", - "image_url": "http://www.alux.com/wp-content/uploads/2016/05/pharrell-williams8.jpg" - }, - { - "name": "Phat Kat", - "image_url": "http://factmag-images.s3.amazonaws.com/wp-content/uploads/2015/09/Phat-Kat-FACT-Freestyles-Episode-1200x630.png" - }, - { - "name": "Phife Dawg", - "image_url": "http://static.celebuzz.com/uploads/2016/03/phife-dawg-32316.jpg" - }, - { - "name": "Philthy Rich", - "image_url": "http://i2.wp.com/allhiphop.com/wp-content/uploads/2012/02/20120214-133154-1.jpg" - }, - { - "name": "Phyno", - "image_url": "https://i.onthe.io/vllkyt2uq4dmo3ouf.bf39c0a9.jpg" - }, - { - "name": "Pill", - "image_url": "http://missdimplez.com/wp-content/uploads/2011/12/pill-rapper.jpg" - }, - { - "name": "Pimp C", - "image_url": "http://media-cache-ak0.pinimg.com/736x/4a/5d/da/4a5dda5cf63497a7a7323d64036ea588.jpg" - }, - { - "name": "Pinkie Pie", - "image_url": "http://fc09.deviantart.net/fs71/i/2014/106/a/e/rap_pinkie_pie_by_racoonkun-d7eqdf7.png" - }, - { - "name": "Pitbull", - "image_url": "http://images5.fanpop.com/image/photos/25000000/Pitbull-wallpaper-pitbull-rapper-25094094-1024-768.jpg" - }, - { - "name": "Planet Asia", - "image_url": "http://2.bp.blogspot.com/_3i6Ja3TzR3U/TUsqDLt5_eI/AAAAAAAAA5E/o5cNPWjIOUc/s1600/Planet+Asia.jpg" - }, - { - "name": "Planetary", - "image_url": "https://www.universetoday.com/wp-content/uploads/2013/06/star_cluster_planet.jpg" - }, - { - "name": "Plies", - "image_url": "http://siccness.net/wp/wp-content/uploads/2013/01/Plies.png" - }, - { - "name": "Playboi Carti", - "image_url": "http://images.complex.com/complex/image/upload/t_article_image/playboi-carti_hylalw.jpg" - }, - { - "name": "PnB Rock", - "image_url": "http://www.trbimg.com/img-593a8ea1/turbine/mc-rapper-pnb-rocks-show-to-open-easton-s-new-one-centre-square-is-rescheduled-20170609" - }, - { - "name": "PNC", - "image_url": "https://resources.stuff.co.nz/content/dam/images/1/d/s/t/f/0/image.related.StuffLandscapeSixteenByNine.620x349.1gbkoq.png/1483310043452.jpg" - }, - { - "name": "Porta", - "image_url": "https://upload.wikimedia.org/wikipedia/commons/9/93/Christian_Jim%C3%A9nez_Porta.jpg" - }, - { - "name": "Positive K", - "image_url": "https://i.ytimg.com/vi/rKSu3MMqjNA/maxresdefault.jpg" - }, - { - "name": "Post Malone", - "image_url": "http://s3.amazonaws.com/factmag-images/wp-content/uploads/2016/06/Post-Malone-6-15-16-616x440.jpg" - }, - { - "name": "Pras", - "image_url": "http://okp-cdn.okayplayer.com/wp-content/uploads/2015/11/pras-grey.jpg" - }, - { - "name": "Prince Ital Joe", - "image_url": "http://api.ning.com/files/HX2HJ5zFz1VXk6nnlv3UuQYepy3Zaqp7FB99CwchCVK9qZAdUGnd2wgm8KBTPBQ5TPA7viKN70LkASDddCvpMRV*qbrLbSTS/2pacPrinceItalJoe.jpg" - }, - { - "name": "Prince Paul", - "image_url": "http://s3.amazonaws.com/hiphopdx-production/2017/06/DJ-Prince-Paul-789x591.jpg" - }, - { - "name": "Prince Po", - "image_url": "http://s3.amazonaws.com/rapgenius/1354768383_tumblr_m4e3h3JIu51rrnvtco1_500.png" - }, - { - "name": "Problem", - "image_url": "http://media-cache-ec0.pinimg.com/736x/91/12/c5/9112c5e71840687c066eb9bf199a6c8b.jpg" - }, - { - "name": "Prodigy", - "image_url": "http://www.genycis.com/blog/php/prodigy.jpg" - }, - { - "name": "Professor Green", - "image_url": "http://www.thedrum.com/uploads/drum_basic_article/154317/main_images/ProfessorGreen.jpg" - }, - { - "name": "Project Pat", - "image_url": "http://purple-drank.com/wp-content/uploads/2013/04/Project-Pat-New.jpg" - }, - { - "name": "Proof", - "image_url": "http://api.ning.com/files/id8pBTnWr70l7rcG7ybqV4HsnNh-BPxmwnyZ9v0VIyOITru56VjRVTRg9zdpsZMShSK3pPDKlmcbXnYrswx9fJCRZh8Y5ooC/proof.jpg" - }, - { - "name": "Prozak", - "image_url": "http://favimages.com/wp-content/uploads/2012/08/rapper-prozak-celebrity-rap-photo.jpg" - }, - { - "name": "Psy", - "image_url": "http://www.soompi.com/wp-content/uploads/2013/05/psy-yahoo.jpg" - }, - { - "name": "Pusha T", - "image_url": "https://images.vice.com/noisey/content-images/article/pusha-t-interview-my-name-is-my-name/Pusha%20T%20Close.jpg" - }, - { - "name": "Queen Latifah", - "image_url": "http://media-cache-ec0.pinimg.com/736x/98/eb/23/98eb236df993bb4d0a7b2bbb6f8887d6.jpg" - }, - { - "name": "Q-Tip", - "image_url": "http://amarudontv.com/wp-content/uploads/2011/06/q-tip.jpg" - }, - { - "name": "Quan", - "image_url": "http://www.collegedj.net/wp-content/uploads/2011/09/Quan-rapper.jpg" - }, - { - "name": "Quavo", - "image_url": "http://www.globallnews.com/wp-content/uploads/2018/04/725393107_quavo_hunchoday_1522628161372_11247409_ver1.0_640_360.jpg" - }, - { - "name": "Quazedelic", - "image_url": "https://ilovemssugar.files.wordpress.com/2009/08/quazedelic.jpg" - }, - { - "name": "Queen Latifah", - "image_url": "http://media-cache-ec0.pinimg.com/736x/98/eb/23/98eb236df993bb4d0a7b2bbb6f8887d6.jpg" - }, - { - "name": "Queen Pen", - "image_url": "https://s-media-cache-ak0.pinimg.com/736x/48/19/d1/4819d1636cf36c92194437765638240b.jpg" - }, - { - "name": "The Quiett", - "image_url": "http://korcan50years.files.wordpress.com/2013/06/the-quiett-798x1024.jpg" - }, - { - "name": "Quincy Jones III", - "image_url": "http://theboombox.com/files/2010/05/david-banner-200ak050410.jpg" - }, - { - "name": "Qwazaar", - "image_url": "http://cdn.ticketfly.com/i/00/01/88/84/11-atxl1.jpg" - }, - { - "name": "Qwel", - "image_url": "http://img.karaoke-lyrics.net/img/artists/4536/qwel-247381.jpg" - }, - { - "name": "Rakim", - "image_url": "http://cps-static.rovicorp.com/3/JPG_400/MI0003/162/MI0003162077.jpg" - }, - { - "name": "RZA", - "image_url": "https://static01.nyt.com/images/2012/10/21/arts/21RZA1_SPAN/21RZA1_SPAN-jumbo.jpg" - }, - { - "name": "R. Kelly", - "image_url": "http://i.dailymail.co.uk/i/newpix/2018/04/16/21/4B25AB0C00000578-5622755-image-a-24_1523909544359.jpg" - }, - { - "name": "R.A. the Rugged Man", - "image_url": "http://www.kapu.or.at/sites/default/files/event/image/ruggednew1.jpg" - }, - { - "name": "Raekwon", - "image_url": "http://www.bkhiphopfestival.com/wp-content/uploads/2014/06/Raekwon.jpg" - }, - { - "name": "Rah Digga", - "image_url": "http://hiphopgoldenage.com/wp-content/uploads/2015/08/2012-music-topic-rah-digga.png" - }, - { - "name": "Rahzel", - "image_url": "http://www.blackouthiphop.com/blog/wp-content/uploads/2011/04/rahzel.jpg" - }, - { - "name": "Rakim", - "image_url": "http://cps-static.rovicorp.com/3/JPG_400/MI0003/162/MI0003162077.jpg" - }, - { - "name": "Rampage", - "image_url": "http://www.blackouthiphop.com/blog/wp-content/uploads/2012/01/rampage.jpg" - }, - { - "name": "Rap Monster", - "image_url": "http://xinspirit.files.wordpress.com/2013/06/rap-monster.jpg" - }, - { - "name": "Rappin' 4-Tay", - "image_url": "https://s3.amazonaws.com/hiphopdx-production/2016/10/Rappin-4-Tay_10-13-2016-596x447.jpg" - }, - { - "name": "Rapsody", - "image_url": "http://rollingout.com/wp-content/uploads/2014/05/rapsody.jpg" - }, - { - "name": "Ramey Dawoud", - "image_url": "https://upload.wikimedia.org/wikipedia/commons/7/70/Kashta_Live.jpg" - }, - { - "name": "Ras Kass", - "image_url": "http://cdn4.hiphoplead.com/static/2012/03/Ras-Kass.jpg" - }, - { - "name": "Rasheeda", - "image_url": "http://media-cache-ak0.pinimg.com/736x/df/01/4f/df014fca71f89f5efc4d58f27b1beb2a.jpg" - }, - { - "name": "Ravi", - "image_url": "https://upload.wikimedia.org/wikipedia/commons/thumb/7/7d/Ravi_-_2016_Gaon_Chart_K-pop_Awards_red_carpet.jpg/1200px-Ravi_-_2016_Gaon_Chart_K-pop_Awards_red_carpet.jpg" - }, - { - "name": "Ray Cash", - "image_url": "http://www.hipstrumentals.com/wp-content/uploads/2012/12/Ray-Cash-Bumpin-My-Music.jpg" - }, - { - "name": "Ray J", - "image_url": "http://www3.pictures.zimbio.com/pc/Rapper+Ray+J+spotted+Tru+night+club+Hollywood+0orxsqqyQ49x.jpg" - }, - { - "name": "Ray Luv", - "image_url": "https://upload.wikimedia.org/wikipedia/commons/thumb/9/91/Ray_Luv_performing_at_5th_Annual_AHSC_1.JPG/1200px-Ray_Luv_performing_at_5th_Annual_AHSC_1.JPG" - }, - { - "name": "Raz Fresco", - "image_url": "http://exclaim.ca/images/razfresco2.jpg" - }, - { - "name": "RBX", - "image_url": "http://www.longbeachindependent.com/wp-content/uploads/2015/03/rbx-rapper-long-beach1.jpg" - }, - { - "name": "The Real Roxanne", - "image_url": "https://s-media-cache-ak0.pinimg.com/736x/dd/e9/61/dde961ccc373460deb2bab6b8df479b8.jpg" - }, - { - "name": "Really Doe", - "image_url": "http://cdn.smosh.com/sites/default/files/ftpuploads/bloguploads/1113/least-badass-name-really-doe.jpg" - }, - { - "name": "Red Café", - "image_url": "http://www1.pictures.zimbio.com/gi/Red+Cafe+Interscope+Geffen+Promotions+Department+MlqC_HJwxQMl.jpg" - }, - { - "name": "Red Spyda", - "image_url": "http://16762-presscdn-0-89.pagely.netdna-cdn.com/wp-content/uploads/2012/08/red-spyda.png" - }, - { - "name": "Redfoo", - "image_url": "http://media.gettyimages.com/photos/rapper-redfoo-of-lmfao-arrives-for-party-rock-mondays-at-marquee-in-picture-id131805210" - }, - { - "name": "Redman", - "image_url": "http://djstorm.files.wordpress.com/2011/02/redman1.jpg" - }, - { - "name": "Reef the Lost Cauze", - "image_url": "http://thekey.xpn.org/aatk/files/2016/02/ReefCaliph-9726-620x413.jpg" - }, - { - "name": "Reema Major", - "image_url": "http://www.bet.com/topics/r/reema-major/_jcr_content/image.heroimage.dimg/__1411088698102/080312-topic-music-reema-major-rapper.jpg" - }, - { - "name": "Reks", - "image_url": "http://hypeverse.files.wordpress.com/2012/10/reks.jpg" - }, - { - "name": "Remy Ma", - "image_url": "https://s-media-cache-ak0.pinimg.com/736x/d9/79/0e/d9790e372e4df2baf687770b711968bf.jpg" - }, - { - "name": "Rhymefest", - "image_url": "http://i.huffpost.com/gen/2824474/images/h-CHE-RHYMEFEST-SMITH-348x516.jpg" - }, - { - "name": "Rich Boy", - "image_url": "http://wac.450f.edgecastcdn.net/80450F/theboombox.com/files/2009/01/rich-boy_011509_200.jpg" - }, - { - "name": "Rich Brian", - "image_url": "https://www.tinymixtapes.com/sites/default/files/imagecache/Article_Width/1801/rich-chigga-amen-cover-low-res.jpg" - }, - { - "name": "Rich Homie Quan", - "image_url": "http://www.judiciaryreport.com/images_4/rich-homie-quan-4-10-15-1.png" - }, - { - "name": "Rich The Kid", - "image_url": "https://gazettereview.com/wp-content/uploads/2017/05/rich4.jpg" - }, - { - "name": "Richie Rich", - "image_url": "http://www.rule4080.com/wp-content/uploads/2011/08/Richie_Rich_rapper.jpeg" - }, - { - "name": "Rick Rock", - "image_url": "http://s3.amazonaws.com/rapgenius/rick_rock.jpg" - }, - { - "name": "Rick Ross", - "image_url": "http://www.thefamouspeople.com/profiles/images/rick-ross-2.jpg" - }, - { - "name": "Rico Love", - "image_url": "http://media.gettyimages.com/photos/record-producer-singer-songwriter-and-rapper-rico-love-is-interviewed-picture-id177991029" - }, - { - "name": "Riff Raff", - "image_url": "http://images1.laweekly.com/imager/riff-raff/u/original/4248950/rrone.jpg" - }, - { - "name": "Rittz", - "image_url": "http://theciphershow.com/image/uploads/rittz.jpg" - }, - { - "name": "RJ", - "image_url": "http://images1.laweekly.com/imager/u/original/6044341/rj-kenneth-wynn.jpg" - }, - { - "name": "Rob Sonic", - "image_url": "http://cdn.ticketfly.com/i/00/01/30/07/57-exl.jpeg" - }, - { - "name": "Rob Stone", - "image_url": "https://i1.wp.com/hypebeast.com/image/ht/2016/08/rob-stone-chill-bill-remix1.png" - }, - { - "name": "Roc Marciano", - "image_url": "https://s3.amazonaws.com/hiphopdx-production/2010/09/marciano_304.jpg" - }, - { - "name": "Rockie Fresh", - "image_url": "http://www.missinfo.tv/wp-content/uploads/2014/03/rockie-fresh.jpg.jpg" - }, - { - "name": "Rocko", - "image_url": "http://www.bet.com/content/dam/betcom/images/2013/06/Shows/Music-News/mn13_rockoadon_final.jpg" - }, - { - "name": "Roger Troutman", - "image_url": "https://www.thefamousbirthdays.com/photo/en/c/c6/wk_60128_40208_large.jpg" - }, - { - "name": "Romeo Miller", - "image_url": "http://www1.pictures.zimbio.com/gi/BET+Awards+11+Arrivals+XFI1wmisCnBx.jpg" - }, - { - "name": "Ronnie Radke", - "image_url": "http://www.altpress.com/images/uploads/feature_header_images/ronnie_radke_list_2015.jpg" - }, - { - "name": "Roots Manuva", - "image_url": "http://dis.resized.images.s3.amazonaws.com/940x535/27742.jpeg" - }, - { - "name": "Roscoe", - "image_url": "http://www4.pictures.stylebistro.com/gi/Roscoe%2BDash%2BScarves%2BPatterned%2BScarf%2B8lklV6z5LqUl.jpg" - }, - { - "name": "Roscoe Dash", - "image_url": "http://www.africamusiclaw.com/wp-content/uploads/2012/09/Rapper-Roscoe-Dash-Says-Wale-and-Kanye-Did-not-Give-Credits.jpg" - }, - { - "name": "Rowdy Rebel", - "image_url": "https://images.vice.com/noisey/content-images/article/rowdy-rebel-interview/Screen-Shot-2014-09-19-at-1-26-44-PM.jpg" - }, - { - "name": "Roxanne Shanté", - "image_url": "https://s-media-cache-ak0.pinimg.com/564x/aa/0a/11/aa0a117dbca70d9867e8ec57cda0209f.jpg" - }, - { - "name": "Royce da 5'9", - "image_url": "http://www.ihiphop.com/wp-content/uploads/2011/08/royce.jpg" - }, - { - "name": "Russ", - "image_url": "http://dailychiefers.com/wp-content/media/2016/04/russ.jpg" - }, - { - "name": "Rucka Rucka Ali", - "image_url": "https://www.thefamouspeople.com/profiles/images/rucka-rucka-ali-1.jpg" - }, - { - "name": "Rydah J. Klyde", - "image_url": "http://siccness.net/wp/wp-content/uploads/2016/08/dj-fresh-rydah-j-klyde.jpg" - }, - { - "name": "Rye Rye", - "image_url": "http://www.bet.com/topics/r/rye-rye/_jcr_content/image.heroimage.dimg/__1411951278058/051512-shows-106-park-rye-rye-9.jpg" - }, - { - "name": "RZA", - "image_url": "http://www.sosoactive.com/wp-content/uploads/2014/04/rza-2.jpg" - }, - { - "name": "Roy Woods", - "image_url": "http://bendxl.com/wp-content/uploads/2015/07/ROYWoodsOVO.jpg" - }, - { - "name": "Slick Rick", - "image_url": "http://jobbiecrew.com/wp-content/uploads/2015/04/0slickrick2.jpg" - }, - { - "name": "Snoop Dogg", - "image_url": "https://media.nbcnewyork.com/images/1200*675/Snoop+Dogg3.jpg" - }, - { - "name": "Skabo", - "image_url": "https://upload.wikimedia.org/wikipedia/commons/8/83/Bosko.jpg" - }, - { - "name": "Saafir", - "image_url": "http://www.okayplayer.com/wp-content/uploads/2013/02/saafir.jpg" - }, - { - "name": "Sabac Red", - "image_url": "http://wildstylemag.com/wp-content/uploads/Sabac-Red.gif" - }, - { - "name": "Sacario", - "image_url": "http://www.hellhoundmusic.com/wp-content/uploads/2013/11/sacario-1.jpg" - }, - { - "name": "Sadat X", - "image_url": "http://factmag-images.s3.amazonaws.com/wp-content/uploads/2012/10/sadat-x-10.25.2012.j.jpeg" - }, - { - "name": "Sadistik", - "image_url": "http://potholesinmyblog.com/wp-content/uploads/2013/01/sadistik-mic.jpg" - }, - { - "name": "Sage Francis", - "image_url": "https://consequenceofsound.files.wordpress.com/2014/03/sage-francis_1276598819.jpg" - }, - { - "name": "Sage the Gemini", - "image_url": "https://images.vice.com/noisey/content-images/article/sage-the-gemini-doesnt-listen-to-rap/E9FA1B25DC26BCB317C236E1CD46175920132510124230269.jpg" - }, - { - "name": "Saigon", - "image_url": "http://thekoalition.com/images/2011/01/Saigon.jpg" - }, - { - "name": "Sam Sneed", - "image_url": "http://www.post-gazette.com/image/2013/10/17/Sam-Sneed.jpg" - }, - { - "name": "Sammy Adams", - "image_url": "https://s3.amazonaws.com/rapgenius/1374121236_Sam_Adams-Bostons_Boy_Album.jpg" - }, - { - "name": "San E", - "image_url": "http://www.soompi.com/wp-content/uploads/2014/10/1013-san-e.jpg" - }, - { - "name": "San Quinn", - "image_url": "http://www.therealspill.com/uploads/2/0/6/4/2064107/5641474.jpg" - }, - { - "name": "Sarkodie", - "image_url": "http://www.thecable.ng/wp-content/uploads/2015/06/sak1.jpg" - }, - { - "name": "Sauce Money", - "image_url": "http://images.rapgenius.com/709f4d670c0505627849b8664f8276de.422x530x1.jpg" - }, - { - "name": "Savage", - "image_url": "https://i1.wp.com/hypebeast.com/image/2016/08/off-white-2016-fw-collection-21-savage-lookbook-2.jpg" - }, - { - "name": "Scarface", - "image_url": "http://www.rapbasement.com/wp-content/uploads/2015/10/SCARFACE.jpg" - }, - { - "name": "Schoolboy Q", - "image_url": "http://www.rapbasement.com/wp-content/uploads/2014/02/Schoolboy_Q_Speaks_on_best_tde_rapper.jpg" - }, - { - "name": "Schoolly D", - "image_url": "http://www.rapmusicguide.com/blog/wp-content/uploads/2013/12/Schoolly-D-arms.jpg" - }, - { - "name": "Scott Storch", - "image_url": "https://s3.amazonaws.com/hiphopdx-production/2014/02/Scott-Storch_02-17-2014-300x300.jpg" - }, - { - "name": "Scotty", - "image_url": "https://upload.wikimedia.org/wikipedia/commons/1/1b/Scotty_%28Scotty_ATL%29.jpg" - }, - { - "name": "Scram Jones", - "image_url": "http://i1.wp.com/allhiphop.com/wp-content/uploads/2013/10/scram-jones.jpg" - }, - { - "name": "Scribe", - "image_url": "http://static2.stuff.co.nz/1296207390/967/4595967.jpg" - }, - { - "name": "Scrilla", - "image_url": "http://media.nbcmiami.com/images/1200*675/Young-Scrilla.jpg" - }, - { - "name": "Scrufizzer", - "image_url": "http://jumpoff.tv/assets/images/made/assets/images/posts/12dec11_scrufizzer_war_MAIN_580_352.jpg" - }, - { - "name": "Sean Combs", - "image_url": "http://s1.ibtimes.com/sites/www.ibtimes.com/files/styles/lg/public/2012/04/20/265198-rapper-sean-diddy-combs.jpg" - }, - { - "name": "Sean Paul", - "image_url": "http://wac.450f.edgecastcdn.net/80450F/theboombox.com/files/2009/12/seanp_bbx_200_122309.jpg" - }, - { - "name": "Sean Price", - "image_url": "http://img2.timeinc.net/people/i/2015/news/150824/sean-price-435.jpg" - }, - { - "name": "Sean T", - "image_url": "http://www.talentedprofiles.com/wp-content/uploads/2016/02/Rapper-Big-Sean-600x600_t.jpg" - }, - { - "name": "Serengeti", - "image_url": "http://www.anticon.com/sites/default/files/imagecache/artist/White%20Collar%209.jpg" - }, - { - "name": "Serius Jones", - "image_url": "http://www2.pictures.zimbio.com/gi/Serius+Jones+Sean+Diddy+Combs+Hosts+Pool+Party+3ntNwfoXEMil.jpg" - }, - { - "name": "Sev Statik", - "image_url": "http://i.ytimg.com/vi/vbQhHs2_10s/maxresdefault.jpg" - }, - { - "name": "Sha Money XL", - "image_url": "http://favimages.com/wp-content/uploads/2012/08/rapper-sha-money-xl-celebrity-singer-photos.jpg" - }, - { - "name": "Shabazz the Disciple", - "image_url": "http://i1.ytimg.com/vi/UzKEnCSozmA/maxresdefault.jpg" - }, - { - "name": "Shad", - "image_url": "http://www.chartattack.com/wp-content/uploads/2014/04/shad.jpg" - }, - { - "name": "Shade Sheist", - "image_url": "http://beatsandrhymesfc.com/wp-content/uploads/2012/04/ss-bb.jpg" - }, - { - "name": "Shady Nate", - "image_url": "http://bloximages.newyork1.vip.townnews.com/montereycountyweekly.com/content/tncms/assets/v3/editorial/e/b5/eb5a2b49-dc95-557a-9967-09f87b6818a1/519523d286802.image.jpg" - }, - { - "name": "Shaggy", - "image_url": "http://img.karaoke-lyrics.net/img/artists/10440/shaggy-132443.jpg" - }, - { - "name": "Shaggy 2 Dope", - "image_url": "http://www.faygoluvers.net/v5/wp-content/uploads/2013/05/Shaggy-2-Dope1.jpg" - }, - { - "name": "Shaquille O'Neal", - "image_url": "https://nextshark-vxdsockgvw3ki.stackpathdns.com/wp-content/uploads/2018/04/maxresdefault.jpg" - }, - { - "name": "Shawnna", - "image_url": "http://www.hip-hopvibe.com/wp-content/uploads/2012/05/Shawnna.jpg" - }, - { - "name": "Shawty Lo", - "image_url": "http://jusflippin.com/wp-content/uploads/2011/07/Shawty-Lo.jpg" - }, - { - "name": "Sheek Louch", - "image_url": "http://highlineballroom.com/assets/Sheek-Louch.jpg" - }, - { - "name": "Shing02", - "image_url": "http://media-cache-ec0.pinimg.com/736x/78/23/8e/78238e9ab30512cfb4d52af6ccb40292.jpg" - }, - { - "name": "Sho Baraka", - "image_url": "https://i0.wp.com/allhiphop.com/wp-content/uploads/2017/02/rapper-sho-baraka-banned-from-ch.jpg" - }, - { - "name": "Shock G", - "image_url": "https://upload.wikimedia.org/wikipedia/commons/c/ca/ShkWiki9.jpg" - }, - { - "name": "Shorty", - "image_url": "http://starcasm.net/wp-content/uploads/2010/12/Magnolia-Shorty-490x445.jpg" - }, - { - "name": "Shorty Mack", - "image_url": "https://i0.wp.com/www.hip-hopvibe.com/wp-content/uploads/2013/01/Shorty-Mack.jpg" - }, - { - "name": "Shwayze", - "image_url": "http://www.aceshowbiz.com/images/wennpic/wenn5188509.jpg" - }, - { - "name": "Shy Glizzy", - "image_url": "http://www.trbimg.com/img-57a2315f/turbine/bal-shy-glizzy-young-jefe-2-cut-it-royal-farms-arena" - }, - { - "name": "Shyheim", - "image_url": "http://www.eurweb.com/wp-content/uploads/2014/07/Shyheim_04-24-2013-300x300.jpg" - }, - { - "name": "Shyne", - "image_url": "http://www.hip-hopvibe.com/wp-content/uploads/2012/01/Shyne-2.jpg" - }, - { - "name": "Silentó", - "image_url": "https://cmgajcmusic.files.wordpress.com/2015/06/silento-2.jpg" - }, - { - "name": "Silkk the Shocker", - "image_url": "http://2.bp.blogspot.com/_B1LlYh6iKqs/TK0gNRXZJ_I/AAAAAAAAC7g/vT3VW7tT8C4/s1600/silkk-the-shocker.jpg" - }, - { - "name": "Silla", - "image_url": "http://rap.de/wp-content/uploads/silla-rapde.png" - }, - { - "name": "Simon D", - "image_url": "http://3.bp.blogspot.com/-o789bRAl2C8/UaSCreHk8lI/AAAAAAAAD6A/671amIdPmxA/s1600/simon+d.jpg" - }, - { - "name": "Sir Jinx", - "image_url": "http://www.dubcnn.com/wp-content/uploads/2012/12/jinx-pic1000001.png" - }, - { - "name": "Sir Mix-a-Lot", - "image_url": "https://usatftw.files.wordpress.com/2018/03/pjimage-23-e1520876763340.jpg" - }, - { - "name": "Sirah", - "image_url": "http://www3.pictures.zimbio.com/gi/Sirah+55th+Annual+GRAMMY+Awards+Press+Room+AQYNmS4HQPUl.jpg" - }, - { - "name": "Skee-Lo", - "image_url": "http://whatisplayinginmyitunes.files.wordpress.com/2012/12/skee-lo.jpg" - }, - { - "name": "Skeme", - "image_url": "http://rapdose.com/wp-content/uploads/2014/05/Skeme-Believe.jpg" - }, - { - "name": "Skepta", - "image_url": "http://runthetrap.com/wp-content/uploads/2015/03/skepta-50bb835c0adb7.jpg" - }, - { - "name": "Skinnyman", - "image_url": "http://eslhiphop.com/wp-content/uploads/2013/06/skinnyman.png" - }, - { - "name": "Skooly", - "image_url": "https://i.ytimg.com/vi/6mZHPf-ZvFA/maxresdefault.jpg" - }, - { - "name": "Skyzoo", - "image_url": "http://www.ballerstatus.com/wp-content/uploads/2009/05/skyzoo.jpg" - }, - { - "name": "SL Jones", - "image_url": "http://www.audibletreats.com/Media/newspics/SL_Jones-08.jpg" - }, - { - "name": "Sleepy Brown", - "image_url": "http://s3.amazonaws.com/rapgenius/sleepy-brown-129.jpg" - }, - { - "name": "Slick Rick", - "image_url": "http://jobbiecrew.com/wp-content/uploads/2015/04/0slickrick2.jpg" - }, - { - "name": "Slim Jxmmi", - "image_url": "https://images.genius.com/7e898276f657a3d38d0febfee65a7280.640x640x1.jpg" - }, - { - "name": "Slim Thug", - "image_url": "http://1.bp.blogspot.com/-qfh469KzybM/TkT0T9dTN9I/AAAAAAAAAY8/uB-uoTiwCv4/s1600/Slim-Thug-Rapper-Gun.jpg" - }, - { - "name": "Slug", - "image_url": "http://unspokenstyle.files.wordpress.com/2011/01/slug.jpg" - }, - { - "name": "Smitty", - "image_url": "https://upload.wikimedia.org/wikipedia/commons/thumb/3/32/Smitty-rapper.jpg/1200px-Smitty-rapper.jpg" - }, - { - "name": "Smoke DZA", - "image_url": "http://massappeal.com/wp-content/uploads/2014/03/smoke-dza-.png" - }, - { - "name": "Smooth", - "image_url": "https://i.ytimg.com/vi/KmtRq-iucII/maxresdefault.jpg" - }, - { - "name": "Smoothe da Hustler", - "image_url": "https://i.ytimg.com/vi/e_zc1qBlu-c/maxresdefault.jpg" - }, - { - "name": "Sniper J", - "image_url": "http://medias.2kmusic.com/uploads/2010/03/19/img-1269021506-cb5ef53ef55ea9e90358d91d4e4b25f7.jpg" - }, - { - "name": "Snoop Dogg", - "image_url": "https://media.nbcnewyork.com/images/1200*675/Snoop+Dogg3.jpg" - }, - { - "name": "Snootie Wild", - "image_url": "https://images.genius.com/e0d17ec7650545545dabdf923613065c.600x600x1.jpg" - }, - { - "name": "Snow Tha Product", - "image_url": "http://blog.krizzkaliko.com/wp-content/uploads/2012/11/SNow-On-Kaliko.jpg" - }, - { - "name": "Soce the elemental wizard", - "image_url": "https://upload.wikimedia.org/wikipedia/commons/thumb/b/b7/Soce.jpg/1200px-Soce.jpg" - }, - { - "name": "Sole", - "image_url": "http://lobermanhiphop.files.wordpress.com/2013/02/sole.jpg" - }, - { - "name": "Solzilla", - "image_url": "https://upload.wikimedia.org/wikipedia/commons/thumb/6/6a/Sol_%28Seattle_rapper%29_03.jpg/1200px-Sol_%28Seattle_rapper%29_03.jpg" - }, - { - "name": "Sonny Digital", - "image_url": "https://nationofbillions.com/wp-content/uploads/2016/07/SONNYDIGITAL_1_Wireless.jpg" - }, - { - "name": "SonReal", - "image_url": "http://www.digitaljournal.com/img/2/7/4/3/7/7/i/1/7/0/o/BWsuit_15.JPG" - }, - { - "name": "Sonsee", - "image_url": "http://img2-ak.lst.fm/i/u/avatar170s/ed38054f95d64ddf9b5e6a53f9702497.jpg" - }, - { - "name": "Soopafly", - "image_url": "http://cache1.asset-cache.net/xc/136582867-rapper-soopafly-visits-the-late-show-with-filmmagic.jpg" - }, - { - "name": "Soulja Boy", - "image_url": "http://www.wallpaperup.com/uploads/wallpapers/2014/03/04/284914/a82261adb443e8646b88831a16649ffe.jpg" - }, - { - "name": "Soulja Slim", - "image_url": "http://listofdeadrappers.files.wordpress.com/2011/09/soulja_slim.jpg" - }, - { - "name": "South Park Mexican", - "image_url": "http://ww3.hdnux.com/photos/04/30/72/1150654/0/960x540.jpg" - }, - { - "name": "Southside", - "image_url": "https://i.ytimg.com/vi/L95z8KjFPZo/maxresdefault.jpg" - }, - { - "name": "SpaceGhostPurrp", - "image_url": "http://images1.miaminewtimes.com/imager/spaceghostpurrp-will-not-abide-the-fakes/u/original/6387038/7915708.0.jpg" - }, - { - "name": "Special Ed", - "image_url": "http://i1.ytimg.com/vi/XXOHX9HBeXk/maxresdefault.jpg" - }, - { - "name": "Spice 1", - "image_url": "http://s3.amazonaws.com/rapgenius/1378684361_tumblr_mi7aw9N3cj1qzx6s2o1_500.jpg" - }, - { - "name": "Spider Loc", - "image_url": "http://www.datwav.com/wp-content/uploads/2017/06/G-Unit-Rapper-Spider-Loc.jpg" - }, - { - "name": "Spoonie Gee", - "image_url": "http://www.boogitybeat.com/images/BB13068.jpg" - }, - { - "name": "Spose", - "image_url": "http://img3.wikia.nocookie.net/__cb20111103180051/rap/images/d/d7/Spose.png" - }, - { - "name": "Spot", - "image_url": "https://upload.wikimedia.org/wikipedia/commons/6/6c/SPOT_January_2012_Photoshoot.jpg" - }, - { - "name": "Stalley", - "image_url": "http://blahblahblahscience.com/wp-content/uploads/2014/09/stalley.jpg" - }, - { - "name": "Starlito", - "image_url": "http://factmag-images.s3.amazonaws.com/wp-content/uploads/2010/02/starlito-sq-39399222.jpg" - }, - { - "name": "Stat Quo", - "image_url": "http://hiphopscholar.files.wordpress.com/2008/09/stat_quo.jpg" - }, - { - "name": "Static Major", - "image_url": "http://3.bp.blogspot.com/_DuzxFBl8bfQ/TKdHgLphHHI/AAAAAAAAAlA/e4rL00OHn-I/s1600/static+major+1.jpg" - }, - { - "name": "Statik Selektah", - "image_url": "http://www.tunecore.com/blog/wp-content/uploads/2015/05/statik.selektah-actual_wide-970ed5943d6d8b812a0e74a38aac7f8a2d1ae196-s6-c30.jpg" - }, - { - "name": "Steady B", - "image_url": "http://ring.cdandlp.com/lower/photo_grande/115261787.jpg" - }, - { - "name": "Stevie Joe", - "image_url": "http://siccness.net/wp/wp-content/uploads/2016/02/Stevie_Joe.jpg" - }, - { - "name": "Stevie Stone", - "image_url": "http://faygoluvers.net/v5/wp-content/uploads/2012/09/steviestone101912.jpg" - }, - { - "name": "Stezo", - "image_url": "http://phaseonemusic.com/wp-content/uploads/2012/02/STEZO+FREAK+THE+FUNK+COVER+1.jpg" - }, - { - "name": "Stitches", - "image_url": "https://pmchollywoodlife.files.wordpress.com/2015/12/stitches-the-game-insta-ftr.jpg" - }, - { - "name": "Sticky Fingaz", - "image_url": "http://interestingcelebrities.com/pictures/sticky_fingaz.jpg" - }, - { - "name": "Stoka", - "image_url": "https://www.hhunity.org/wp-content/uploads/2014/11/Stoka-Agram-Audio.png" - }, - { - "name": "Stoupe the Enemy of Mankind", - "image_url": "http://images.rapgenius.com/8ed6eb4ea61413e34c0a67f5e04f3b3c.600x340x1.jpg" - }, - { - "name": "Stormzy", - "image_url": "https://d.ibtimes.co.uk/en/full/1475476/stormzy.jpg" - }, - { - "name": "Stretch", - "image_url": "http://img2.wikia.nocookie.net/__cb20130717123821/hip-hop-music/images/6/69/Stretch.jpg" - }, - { - "name": "Styles P", - "image_url": "http://favimages.com/wp-content/uploads/2012/08/rapper-styles-p-singer-celebrity-hip-hop.jpg" - }, - { - "name": "Substantial", - "image_url": "http://www.hiphopsite.com/wp-content/uploads/2010/06/Substantial.jpg" - }, - { - "name": "Suga Free", - "image_url": "http://s3.amazonaws.com/rapgenius/1361309346_l.jpg" - }, - { - "name": "Suffa", - "image_url": "http://i.dailymail.co.uk/i/pix/2015/02/28/262B331400000578-2973396-In_the_zone_The_Suffa_MC_from_the_Hilltop_Hoods_also_took_to_the-a-13_1425134138732.jpg" - }, - { - "name": "Swagg Man", - "image_url": "http://www.famousbirthdays.com/headshots/swagg-man-7.jpg" - }, - { - "name": "Sweet Tee", - "image_url": "http://www.rapindustry.com/sweet_tee_in.jpg" - }, - { - "name": "Swings", - "image_url": "http://cdn.koreaboo.com/wp-content/uploads/2014/11/htm_20141106171738c010c0111.jpg" - }, - { - "name": "Swizz Beatz", - "image_url": "http://www1.pictures.zimbio.com/gi/Swizz+Beatz+40th+American+Music+Awards+Arrivals+cTuFcCa4A2sl.jpg" - }, - { - "name": "SwizZz", - "image_url": "http://favimages.com/wp-content/uploads/2012/08/rapper-swizzz-star-rap-hip-hop.jpg" - }, - { - "name": "Syd Tha Kyd", - "image_url": "https://i1.wp.com/hypebeast.com/image/2012/03/syd-tha-kyd-by-lance-bangs-edit-0.jpg" - }, - { - "name": "SZA", - "image_url": "http://www.billboard.com/files/styles/promo_650/public/media/sza-650.jpg" - }, - { - "name": "T.I.", - "image_url": "http://media-cache-ec0.pinimg.com/736x/d8/6e/c4/d86ec4828778e4997a77313619d0d370.jpg" - }, - { - "name": "Tyler the Creator", - "image_url": "https://s-media-cache-ak0.pinimg.com/736x/fa/52/a6/fa52a6dd8c76a533092056f173900e80.jpg" - }, - { - "name": "T La Rock", - "image_url": "http://okp-cdn.okayplayer.com/wp-content/uploads/2017/10/Screen-Shot-2017-10-20-at-9.55.59-PM-715x719.png" - }, - { - "name": "T-Bone", - "image_url": "http://www.christianmusic.com/PHOTOS/t_bone-2.jpg" - }, - { - "name": "T-Nutty", - "image_url": "http://siccness.net/wp/wp-content/uploads/2016/02/nutty.png" - }, - { - "name": "T-Pain", - "image_url": "http://www.rapbasement.com/wp-content/uploads/2014/02/grammy-award-winning-rapper-t-pain-Talks-Chance-The-Rapper.jpg" - }, - { - "name": "T-Wayne", - "image_url": "https://images.rapgenius.com/822e2be4f84c2ecdada82f017f75b7fb.960x960x1.jpg" - }, - { - "name": "T. Mills", - "image_url": "http://www2.pictures.zimbio.com/gi/T+Mills+Arrivals+Young+Hollywood+Awards+Part+NJl90h8MOpal.jpg" - }, - { - "name": "T.I.", - "image_url": "http://media-cache-ec0.pinimg.com/736x/d8/6e/c4/d86ec4828778e4997a77313619d0d370.jpg" - }, - { - "name": "T.O.P", - "image_url": "http://i2.asntown.net/h2/Korea/7/kpop-bigbang/TOP-bigbang-fashion06.jpg" - }, - { - "name": "Tabi Bonney", - "image_url": "https://thisguysworld.files.wordpress.com/2010/07/tabi.jpg" - }, - { - "name": "Tablo", - "image_url": "http://images5.fanpop.com/image/photos/30500000/Tablo-tablo-30511618-333-500.jpg" - }, - { - "name": "Taio Cruz", - "image_url": "http://colunas.multishowfm.globoradio.globo.com/platb/files/806/2010/11/Taio-Cruz-.jpg" - }, - { - "name": "Talib Kweli", - "image_url": "http://media2.fdncms.com/orlando/imager/u/original/2404812/talib_kweli.jpg" - }, - { - "name": "Target", - "image_url": "http://static5.businessinsider.com/image/4e9876896bb3f74864000017/rapper-rick-ross-was-the-target-of-a-drive-by-shooting-in-florida.jpg" - }, - { - "name": "Tay Dizm", - "image_url": "http://static.djbooth.net/pics-artist-rec/Tay_Dizm_1.jpg" - }, - { - "name": "Tay-K", - "image_url": "https://hypb.imgix.net/image/2017/10/ybn-nahmir-tay-k-the-race-remix-0.jpg" - }, - { - "name": "TD Cruze", - "image_url": "http://www.berliner-kurier.de/image/26201312/max/600/450/49d662a34b7203e4183c320bf0785416/UF/ted-cruz.jpg" - }, - { - "name": "Teairra Marí", - "image_url": "http://hw-img.datpiff.com/mb740e75/Teairra_Marie_Unfinished_Business-front-large.jpg" - }, - { - "name": "Tech N9ne", - "image_url": "http://vegasimpulse.files.wordpress.com/2012/04/tech-n9ne-2.jpg" - }, - { - "name": "Tedashii", - "image_url": "http://images.christianpost.com/full/75663/tedashii.jpg" - }, - { - "name": "TeeFlii", - "image_url": "http://www3.pictures.zimbio.com/gi/TeeFlii+BET+AWARDS+14+Day+1+Kp7kNUhHFvyl.jpg" - }, - { - "name": "Tee Grizzley", - "image_url": "https://i1.wp.com/hypebeast.com/image/2016/11/detroit-rapper-tee-grizzley-first-day-out-video-0.jpg" - }, - { - "name": "Tekitha", - "image_url": "http://rollingout.com/wp-content/uploads/2015/12/Anthony-Hamilton-380x280.jpg" - }, - { - "name": "Tela", - "image_url": "http://nebula.wsimg.com/88482f2967eb7b323b8df1fd1eff4d3a" - }, - { - "name": "Termanology", - "image_url": "http://static.djbooth.net/pics-artist/termanology.jpg" - }, - { - "name": "Terrace Martin", - "image_url": "https://lastfm-img2.akamaized.net/i/u/57e7f81f5b8f4d2daea075100bf0473a.png" - }, - { - "name": "Teyana Taylor", - "image_url": "http://worldofblackheroes.files.wordpress.com/2012/03/teyana-taylor-17.jpg" - }, - { - "name": "Tha Chill", - "image_url": "http://steadydippin.com/wp-content/uploads/Tha-Chill.jpg" - }, - { - "name": "Tha City Paper", - "image_url": "http://hw-img.datpiff.com/ma42439e/Tha_City_Paper_Paper_Aka_Tha_City_Paper_paper_Vie-front-large.jpg" - }, - { - "name": "Tha Trademarc", - "image_url": "http://s3.amazonaws.com/rapgenius/1363145335_John%20Cena%20%20Tha%20Trademarc%20JOHN_CENA___THA_TRADEMARCcolti.jpg" - }, - { - "name": "The-Dream", - "image_url": "http://thatgrapejuice.net/wp-content/uploads/2010/06/the-dream1.jpg" - }, - { - "name": "Theophilus London", - "image_url": "http://www2.pictures.zimbio.com/gi/Theophilus+London+Carlos+Campos+Presentation+NeU7Y7HGrqwl.jpg" - }, - { - "name": "Tiffany Foxx", - "image_url": "http://bloximages.newyork1.vip.townnews.com/stltoday.com/content/tncms/assets/v3/editorial/b/2c/b2cd2408-9233-5bff-9a8b-5d39bafa4029/50928305bb4ba.preview-620.jpg" - }, - { - "name": "Tim Dog", - "image_url": "http://assets.rollingstone.com/assets/2014/article/tim-dog-rapper-accused-of-faking-death-confirmed-dead-20140916/168425/large_rect/1401x788-retna2059832.jpg" - }, - { - "name": "Timaya", - "image_url": "http://www.360nobs.com/wp-content/uploads/2015/01/Jahbless1.jpg" - }, - { - "name": "Timbaland", - "image_url": "http://live.drjays.com/wp-content/uploads/2009/12/timbaland.jpg" - }, - { - "name": "Timbe", - "image_url": "http://live.drjays.com/wp-content/uploads/2009/12/timbaland.jpg" - }, - { - "name": "Tinie Tempah", - "image_url": "http://dollyumez.files.wordpress.com/2013/01/tinie-tempah.jpg" - }, - { - "name": "Tink (musician)", - "image_url": "https://cocoocd.files.wordpress.com/2013/04/228090_507024229347791_1052484062_n.jpg" - }, - { - "name": "TobyMac", - "image_url": "https://s-media-cache-ak0.pinimg.com/564x/e7/a8/9e/e7a89ea48cbf5822fb909ec267b79499.jpg" - }, - { - "name": "Tone Lōc", - "image_url": "http://media-cache-ak0.pinimg.com/736x/68/72/60/6872607c9c8e2dacc6a52a776d4b843a.jpg" - }, - { - "name": "Tone Trump", - "image_url": "http://www.ballerstatus.com/wp-content/uploads/2012/06/tonetrump.jpg" - }, - { - "name": "Tonedeff", - "image_url": "https://upload.wikimedia.org/wikipedia/commons/5/51/Tonedefflive.png" - }, - { - "name": "Toni Blackman", - "image_url": "http://www.womex.com/virtual/image/artist/toni_blackman_big_29989.jpg" - }, - { - "name": "Tony Yayo", - "image_url": "http://zmldajoker.com/wp-content/uploads/2012/08/Tony-Yayo.jpg" - }, - { - "name": "Too Short", - "image_url": "https://escobar300.files.wordpress.com/2011/08/tooshort.jpg" - }, - { - "name": "Torch (American)", - "image_url": "http://1.bp.blogspot.com/-XU66PTiuIIA/T36hTMQCXJI/AAAAAAAAAcU/5rfwuQ6TWAU/s1600/Torch_(US_rapper).jpg" - }, - { - "name": "Torch (German)", - "image_url": "http://leaveyournineathome.files.wordpress.com/2007/10/torch-blauer_samt.jpg" - }, - { - "name": "Tory Lanez", - "image_url": "http://cdn.ratedrnb.com/2016/10/tory-lanez.jpg" - }, - { - "name": "Tracey Lee", - "image_url": "http://madrapper.com/wp-content/uploads/2010/12/Lee1.jpg" - }, - { - "name": "Trae tha Truth", - "image_url": "https://media.thehypemagazine.com/wp-content/uploads/2018/04/trae-tha-truth-paras-griffin-1024x683.jpg" - }, - { - "name": "Tragedy Khadafi", - "image_url": "http://assets2.vice.com/images/content-images/2014/12/29/tragedy-khadafi-is-still-queensbridges-realest-456-body-image-1419881556.jpg" - }, - { - "name": "Travis Scott", - "image_url": "http://www1.pictures.zimbio.com/gi/Travis+Scott+Arrivals+BET+Awards+54GWNTvi2gDl.jpg" - }, - { - "name": "Traxamillion", - "image_url": "https://cbarap.files.wordpress.com/2014/05/traxamillion.jpg" - }, - { - "name": "Tray Deee", - "image_url": "https://unitedgangs.files.wordpress.com/2013/07/ta36tw1.jpg" - }, - { - "name": "Treach", - "image_url": "https://ionehellobeautiful.files.wordpress.com/2016/01/14520871976376.jpg" - }, - { - "name": "Trey Songz", - "image_url": "http://www.creativefan.com/important/cf/2012/08/trey-songz-tattoo/trey-songz-body-tattoo.jpg" - }, - { - "name": "Trick Daddy", - "image_url": "https://i1.wp.com/celebritybio.org/wp-content/uploads/2014/08/Trick-Daddy-Net-Worth.jpg" - }, - { - "name": "Trick-Trick", - "image_url": "http://ctt.marketwire.com/" - }, - { - "name": "Trina", - "image_url": "http://www.missxpose.com/wp-content/uploads/2011/11/trina-bet-photo-shoot-4.jpg" - }, - { - "name": "Trinidad James", - "image_url": "https://cbshot937.files.wordpress.com/2012/12/trinidad_james10.jpg" - }, - { - "name": "Trip Lee", - "image_url": "http://www.eewmagazine.com/images/Trip-Lee-Good-life.jpg" - }, - { - "name": "Trippie Redd", - "image_url": "http://hiphopheads.net/wp-content/uploads/2017/08/Trippie-Redd-1.jpg" - }, - { - "name": "Tristan Wilds", - "image_url": "https://s-media-cache-ak0.pinimg.com/736x/8c/a2/44/8ca24487846ce97afbae1ff967fb78c5--tristan-wilds-rapper.jpg" - }, - { - "name": "Troy Ave", - "image_url": "http://www.ballerstatus.com/wp-content/uploads/2016/05/tave.jpg" - }, - { - "name": "Tupac Shakur", - "image_url": "http://sahiphopmag.co.za/wp-content/uploads/2016/05/Rap-artist-Tupac-Shakur.jpg" - }, - { - "name": "Turf Talk", - "image_url": "http://www.wallpaperup.com/uploads/wallpapers/2013/12/01/181203/19ce36a2c8ceed416ad66fa6d96db889.jpg" - }, - { - "name": "Turk", - "image_url": "http://www.brothersonsports.com/wp-content/uploads/2014/12/turkandwayne.jpg" - }, - { - "name": "Tweedy Bird Loc", - "image_url": "http://steadydippin.com/wp-content/uploads/Tweedy-Bird-Loc.jpg" - }, - { - "name": "Twista", - "image_url": "http://www.trbimg.com/img-53503146/turbine/ct-twista-chicago-rap-durty-nellies-20140417-001/2048/1365x2048" - }, - { - "name": "Twisted Insane", - "image_url": "http://assets.audiomack.com/rap-ebashit/f6e96e7ed6b0e965062aaed0ab4a9983.jpeg" - }, - { - "name": "Ty Dolla Sign", - "image_url": "http://www.rapbasement.com/wp-content/uploads/2015/01/tydolla.jpg" - }, - { - "name": "Tyga", - "image_url": "http://www.eurweb.com/wp-content/uploads/2015/07/tyga.jpg" - }, - { - "name": "Tyler Joseph", - "image_url": "https://s-media-cache-ak0.pinimg.com/564x/02/1c/b9/021cb958f946bfa08f64aea9d90b1a5b.jpg" - }, - { - "name": "Tyler The Creator", - "image_url": "https://s-media-cache-ak0.pinimg.com/736x/fa/52/a6/fa52a6dd8c76a533092056f173900e80.jpg" - }, - { - "name": "Tyra Bolling", - "image_url": "http://www.famousbirthdays.com/faces/bolling-tyra-image.jpg" - }, - { - "name": "Verbal Jint", - "image_url": "https://www.allkpop.com/upload/2017/09/af_org/22120146/verbal-jint.jpg" - }, - { - "name": "U-God", - "image_url": "http://assets.rollingstone.com/assets/2014/albumreview/wu-tang-clan-a-better-tomorrow-20141218/178198/large_rect/1418859659/1401x788-Wu_Tang_Clan_JW_WBR_107(2).JPG" - }, - { - "name": "Ugly God", - "image_url": "http://dailychiefers.com/wp-content/media/2016/03/ugly-god.jpg" - }, - { - "name": "Uncle Murda", - "image_url": "http://hiphop-n-more.com/wp-content/uploads/2015/01/uncle-murda-2014-rap-up.jpg" - }, - { - "name": "Unk", - "image_url": "http://antoniofam.files.wordpress.com/2011/05/dj_unk.jpg" - }, - { - "name": "U$O", - "image_url": "http://images.stiften.dk/22/63622_1200_0_0_35_1921_1200_2.jpg" - }, - { - "name": "Wyclef Jean", - "image_url": "http://media.gettyimages.com/photos/rapper-wyclef-jean-performs-in-concert-at-brooklyn-bowl-on-march-29-picture-id518080012" - }, - { - "name": "V-Nasty", - "image_url": "http://images.complex.com/complex/image/upload/c_limit,w_680/fl_lossy,pg_1,q_auto/daxoo4uvasmysgziontg.jpg" - }, - { - "name": "V.I.C.", - "image_url": "http://www.bigbloc.com/proto/images/hiphop/V.I.C._.jpg" - }, - { - "name": "Vado", - "image_url": "http://messymandella.files.wordpress.com/2012/10/vado_.jpg" - }, - { - "name": "Vakill", - "image_url": "http://thamidwest.com/wp-content/uploads/Vakill.png" - }, - { - "name": "Val Young", - "image_url": "https://i.ytimg.com/vi/uxy12OgQL54/maxresdefault.jpg" - }, - { - "name": "Valete", - "image_url": "https://upload.wikimedia.org/wikipedia/commons/0/04/ValeteRapper.jpg" - }, - { - "name": "Vanilla Ice", - "image_url": "http://i.dailymail.co.uk/i/pix/2008/04_02/iceLFI1104_468x762.jpg" - }, - { - "name": "Vast Aire", - "image_url": "http://exclaim.ca/images/vast1.jpg" - }, - { - "name": "Verbal Jint", - "image_url": "https://www.allkpop.com/upload/2017/09/af_org/22120146/verbal-jint.jpg" - }, - { - "name": "Verse Simmonds", - "image_url": "https://i0.wp.com/allhiphop.com/wp-content/uploads/2012/02/verse-simmonds-1.png" - }, - { - "name": "Vic Mensa", - "image_url": "http://media-cache-ak0.pinimg.com/736x/91/aa/c1/91aac1b95e805342d2225913359ebd2b.jpg" - }, - { - "name": "Vince Staples", - "image_url": "http://i.dailymail.co.uk/i/newpix/2018/04/16/21/4B25AB0C00000578-5622755-image-a-24_1523909544359.jpg" - }, - { - "name": "Vinnie Paz", - "image_url": "http://favimages.com/wp-content/uploads/2012/08/rapper-vinnie-paz-celebrity-song-rap.jpg" - }, - { - "name": "Violent J", - "image_url": "http://www.celebdirtylaundry.com/wp-content/uploads/violent-j-stereo-stolen.jpg" - }, - { - "name": "Viper", - "image_url": "http://static.qobuz.com/images/covers/14/83/3610154048314_600.jpg" - }, - { - "name": "VL Mike", - "image_url": "http://themusicsover.com/wp-content/uploads/2008/04/vlmike2.jpg" - }, - { - "name": "Xzibit", - "image_url": "http://assets.nydailynews.com/polopoly_fs/1.330091.1314424298!/img/httpImage/image.jpg_gen/derivatives/article_1200/amd-xzibit-jpg.jpg" - }, - { - "name": "Waka Flocka Flame", - "image_url": "http://2.bp.blogspot.com/-32xuBz8T-dk/T8oPlIH1PjI/AAAAAAAAqb0/pVwsKQXbigU/s1600/99_waka-flocka.jpg" - }, - { - "name": "Wale", - "image_url": "http://upbjmu.files.wordpress.com/2010/04/wale.jpg" - }, - { - "name": "Warren G", - "image_url": "http://images.huffingtonpost.com/2014-06-23-WarrenG.jpg" - }, - { - "name": "Warryn Campbell", - "image_url": "http://www.famousbirthdays.com/thumbnails/campbell-warryn-medium.jpg" - }, - { - "name": "Watsky", - "image_url": "http://www.gannett-cdn.com/-mm-/ac1394dbdcca6a36cbf486633b129cd813095ac3/r=x404&c=534x401/local/-/media/USATODAY/USATODAY/2013/05/23/1369356877000-image-1305232056_4_3.jpg" - }, - { - "name": "Wax (rapper)", - "image_url": "http://s3.amazonaws.com/rapgenius/Big_Wax_in_Front_of_a_Fence.jpg" - }, - { - "name": "WC", - "image_url": "http://www3.pictures.zimbio.com/fp/Wc+WC+Performing+In+Vancouver+RlfP1TE81Vzl.jpg" - }, - { - "name": "Webbie", - "image_url": "https://messymandella.files.wordpress.com/2012/08/16.jpg" - }, - { - "name": "The Weeknd", - "image_url": "http://factmag-images.s3.amazonaws.com/wp-content/uploads/2013/02/the_weeknd_0205131.jpg" - }, - { - "name": "Westside Gunn", - "image_url": "http://247hiphopnews.com/wp-content/uploads/2017/06/WestSide-Gunn-JAYFORCE.COM_.png" - }, - { - "name": "Wikluh Sky", - "image_url": "https://a4-images.myspacecdn.com/images01/12/691bb215a8b471aa86fc0f11a46ddfdb/full.jpg" - }, - { - "name": "Will Smith", - "image_url": "http://www.clashmusic.com/sites/default/files/styles/article_feature/public/legacy/files/willsmith-freshprince.jpg" - }, - { - "name": "will.i.am", - "image_url": "http://i1.tribune.com.pk/wp-content/uploads/2013/04/538192-image-1366470972-209-640x480.JPG" - }, - { - "name": "Willie D", - "image_url": "http://siccness.net/wp/wp-content/uploads/2013/02/Willie-D-blackchair1.jpg" - }, - { - "name": "Willie the Kid", - "image_url": "http://static.djbooth.net/pics-artist/williethekid.jpg" - }, - { - "name": "Willow Smith", - "image_url": "http://i.dailymail.co.uk/i/pix/2010/12/26/article-1341770-0C9599D1000005DC-328_468x531.jpg" - }, - { - "name": "Willy Northpole", - "image_url": "http://www.bet.com/topics/w/willy-northpole/_jcr_content/image.heroimage.dimg/__1378865366064/081012-topic-music-willy-northpole.jpg" - }, - { - "name": "Wish Bone", - "image_url": "http://djrushmusic.files.wordpress.com/2011/05/wish.jpg" - }, - { - "name": "Witchdoctor", - "image_url": "http://www.cocaineblunts.com/blunts/wp-content/uploads/2007/11/witch3.jpg" - }, - { - "name": "Wiz Khalifa", - "image_url": "http://farm8.staticflickr.com/7154/6622364753_1b2ab906b4.jpg" - }, - { - "name": "Wizkid", - "image_url": "http://www.thenet.ng/wp-content/uploads/2012/07/wale_wizkid-1.jpg" - }, - { - "name": "Wrekonize", - "image_url": "https://s-media-cache-ak0.pinimg.com/736x/a6/03/8d/a6038dcfe1d2068294fd3991603bedcf.jpg" - }, - { - "name": "Wyclef Jean", - "image_url": "http://media.gettyimages.com/photos/rapper-wyclef-jean-performs-in-concert-at-brooklyn-bowl-on-march-29-picture-id518080012" - }, - { - "name": "X-Raided", - "image_url": "http://siccness.net/wp/wp-content/uploads/2016/03/xraided.jpg" - }, - { - "name": "XV", - "image_url": "https://upload.wikimedia.org/wikipedia/commons/thumb/4/4e/XV_performance_Dancefestopia_2013_2014-01-28_00-39.jpg/1200px-XV_performance_Dancefestopia_2013_2014-01-28_00-39.jpg" - }, - { - "name": "Xzibit", - "image_url": "http://assets.nydailynews.com/polopoly_fs/1.330091.1314424298!/img/httpImage/image.jpg_gen/derivatives/article_1200/amd-xzibit-jpg.jpg" - }, - { - "name": "XXXTentacion", - "image_url": "https://dancehallhiphop.com/wp-content/uploads/2017/12/XXXTentacion-rapper-800x565.jpg" - }, - { - "name": "X Clan", - "image_url": "http://www.xxlmag.com/files/2015/03/x-clan-feat2.jpg" - }, - { - "name": "Yolandi Visser", - "image_url": "https://i.pinimg.com/originals/d0/fd/b2/d0fdb22ac606edd8f1bd15abd8d67faa.jpg" - }, - { - "name": "Young Jeezy", - "image_url": "http://pennylibertygbow.files.wordpress.com/2012/02/youngjeezy3.jpg" - }, - { - "name": "Ya Boy", - "image_url": "http://www.yorapper.com/Photos/ya-boy-rapper.jpg" - }, - { - "name": "Yaki Kadafi", - "image_url": "https://40.media.tumblr.com/d340fd47b49c53270809188a633dd53b/tumblr_nnhcxjUrQ41tm7i3uo1_500.jpg" - }, - { - "name": "Yazz The Greatest", - "image_url": "http://l7.alamy.com/zooms/ed94feec8a1b4ca9a29552f71c0625ac/philadelphia-pa-usa-15th-may-2016-american-rapper-yazz-the-greatest-g1ppkr.jpg" - }, - { - "name": "YBN Nahmir", - "image_url": "https://upload.wikimedia.org/wikipedia/commons/thumb/6/6e/YBN-Nahmir-2018.png/1200px-YBN-Nahmir-2018.png" - }, - { - "name": "YC", - "image_url": "http://www2.pictures.zimbio.com/gi/YC+BET+Awards+11+Press+Room+RRqra9BH48Ql.jpg" - }, - { - "name": "YDG", - "image_url": "http://www.bntnews.co.uk/images/news/2014/z7rqhmv4d3wjw5nffyob82va89tuo6me.jpg" - }, - { - "name": "Yelawolf", - "image_url": "http://3.bp.blogspot.com/-tOoHr9RZwUA/TjvmXyGFLWI/AAAAAAAAALg/tNy7P4_BWy4/s1600/Yelawolf-994x1024.jpg" - }, - { - "name": "YFN Lucci", - "image_url": "https://www.trapworldhiphop.com/wp-content/uploads/YFN-Lucci.jpg" - }, - { - "name": "YG", - "image_url": "https://s-media-cache-ak0.pinimg.com/736x/39/40/81/3940811a323f82520ca394aa7cec923f.jpg" - }, - { - "name": "Yo Gotti", - "image_url": "https://s-media-cache-ak0.pinimg.com/736x/b8/25/70/b82570e97603b42d3ff6f8dc26d2d0c5.jpg" - }, - { - "name": "Yo Yo Honey Singh", - "image_url": "http://media2.intoday.in/indiatoday/images/stories/honey-4_650_090214091121.jpg" - }, - { - "name": "Yoon Mi-rae", - "image_url": "http://media.tumblr.com/tumblr_m5sq6s8kb41r84myb.jpg" - }, - { - "name": "Young Bleed", - "image_url": "http://udgsounds.com/wp-content/uploads/2016/01/young-bleed-pic-for-interview-1.jpg" - }, - { - "name": "Young Buck", - "image_url": "http://favimages.com/wp-content/uploads/2012/08/rapper-young-buck-hip-hop-fame-rap.jpg" - }, - { - "name": "Young Chop", - "image_url": "http://rollingout.com/wp-content/uploads/2014/11/young_chop.jpg" - }, - { - "name": "Young Chris", - "image_url": "http://hustlebunny.com/content/2012/08/young-chris-rapper.jpg" - }, - { - "name": "Young Dolph", - "image_url": "http://img.wennermedia.com/social/rs-young-dolph-v1-d999645e-11e4-4549-b0f6-61af8728931a.jpg" - }, - { - "name": "Young Dre the Truth", - "image_url": "https://www.rapmusicguide.com/amass/images/inventory/9868/young%20dre-rev-4.jpg" - }, - { - "name": "Young Dro", - "image_url": "http://www.sohh.com/wp-content/uploads/2014/06/young-dro-2012-11-10-300x3001.jpg" - }, - { - "name": "Young Greatness", - "image_url": "http://hw-static.hiphopearly.com/images/tracks/3/Trappin-t32631-large.jpg" - }, - { - "name": "Young Jeezy", - "image_url": "http://pennylibertygbow.files.wordpress.com/2012/02/youngjeezy3.jpg" - }, - { - "name": "Young M.A", - "image_url": "https://cmga360music.files.wordpress.com/2017/03/youngma_img_9284_mike-marquez.jpg" - }, - { - "name": "Young Maylay", - "image_url": "http://www.hip-hopvibe.com/wp-content/uploads/2013/03/Young-Maylay-3.jpg" - }, - { - "name": "Young MC", - "image_url": "http://www1.pictures.zimbio.com/gi/Young+MC+Screening+Lionsgate+Films+Expendables+A6aEODh_pRRl.jpg" - }, - { - "name": "Young Noble", - "image_url": "https://www.strangemusicinc.com/wp-content/uploads/2011/09/Noble.jpg" - }, - { - "name": "Young Scooter", - "image_url": "http://www.4umf.com/wp-content/uploads/2013/04/Rapper-Young-Scooter-Arrested.jpg" - }, - { - "name": "Young Thug", - "image_url": "https://djbooth.net/.image/t_share/MTU0NzgzMTA4OTEzMTc3NzI3/chance-the-rapper-project-with-young-thug.jpg" - }, - { - "name": "YoungBoy Never Broke Again", - "image_url": "http://image.nola.com/home/nola-media/width600/img/crime_impact/photo/youngboy-never-broke-again-499fcd968041c808.jpg" - }, - { - "name": "Your Old Droog", - "image_url": "https://2.bp.blogspot.com/-LBeysv-KSHw/V1oDq2dOglI/AAAAAAAAIZc/NiQPZ0DOaBgHnZiILbvwTUJfSHT7vNMTQCLcB/s1600/Your%2BOld%2BDroog.jpg" - }, - { - "name": "Yubin", - "image_url": "http://favimages.com/wp-content/uploads/2012/08/rapper-yubin-celebrity-hip-hop-singer-style.jpg" - }, - { - "name": "Yukmouth", - "image_url": "http://content9.flixster.com/photo/13/58/04/13580447_ori.jpg" - }, - { - "name": "Yung Berg", - "image_url": "http://4.bp.blogspot.com/_sBPAPP8w_cA/TLgdFYjm7FI/AAAAAAAAAtU/blx-d1WJmMQ/s1600/yung%20berg.jpg" - }, - { - "name": "Yung Joc", - "image_url": "http://www.judiciaryreport.com/images_4/yung-joc-5-12-15-3.jpg" - }, - { - "name": "Yung L.A.", - "image_url": "http://2.bp.blogspot.com/_WcsRR3fKzyU/TPZx4zZP_9I/AAAAAAAAAXY/z7SrxMG6ehs/s1600/yung_la_1.jpg" - }, - { - "name": "Yung Lean", - "image_url": "http://content.acclaimmag.com/content/uploads/2016/04/yung-lean3-600x400.jpg" - }, - { - "name": "Yung Ro", - "image_url": "http://c3.cduniverse.ws/resized/250x500/music/135/7350135.jpg" - }, - { - "name": "Yung Wun", - "image_url": "http://independentmusicpromotions.com/wp-content/uploads/2011/12/16279_Yung-Wun-pr04.jpg" - }, - { - "name": "Yung6ix", - "image_url": "https://mojidelano.com/wp-content/uploads/2017/03/Yung6ix-1.jpg" - }, - { - "name": "YZ", - "image_url": "http://www.cocaineblunts.com/blunts/wp-content/uploads/2009/06/yz.jpg" - }, - { - "name": "Z-Ro", - "image_url": "http://hiphop-n-more.com/wp-content/uploads/2013/04/z-ro-4.jpg" - }, - { - "name": "Zack de la Rocha", - "image_url": "http://favimages.com/wp-content/uploads/2012/08/rapper-zack-de-la-rocha-singer-rap-photoshoot-young.jpg" - }, - { - "name": "Zaytoven", - "image_url": "https://s3.amazonaws.com/hiphopdx-production/2016/03/Zaytoven-Bankroll-Fresh-e1457227555254-824x620.png" - }, - { - "name": "Zebra Katz", - "image_url": "http://thencrowd14.com/wp-content/uploads/2016/11/04-371x500.jpg" - }, - { - "name": "Zelooperz", - "image_url": "https://i-d-images.vice.com/images/articles/meta/2016/01/26/untitled-article-1453817283.jpg" - }, - { - "name": "Zico", - "image_url": "https://i.pinimg.com/736x/05/4a/2e/054a2eb016aa2d165fb3d933c0b47207.jpg" - } -] \ No newline at end of file diff --git a/pysite/migrations/tables/oauth_data/__init__.py b/pysite/migrations/tables/oauth_data/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/pysite/migrations/tables/oauth_data/v1.py b/pysite/migrations/tables/oauth_data/v1.py deleted file mode 100644 index 9ace6bf9..00000000 --- a/pysite/migrations/tables/oauth_data/v1.py +++ /dev/null @@ -1,13 +0,0 @@ -from rethinkdb import ReqlOpFailedError - - -def run(db, table, table_obj): - """ - Create a secondary index on the "snowflake" key, so we can easily get documents by matching that key - """ - - try: - db.run(db.query(table).index_create("snowflake")) - db.run(db.query(table).index_wait("snowflake")) - except ReqlOpFailedError: - print("Index already exists.") diff --git a/pysite/migrations/tables/pydoc_links/__init__.py b/pysite/migrations/tables/pydoc_links/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/pysite/migrations/tables/pydoc_links/initial_data.json b/pysite/migrations/tables/pydoc_links/initial_data.json deleted file mode 100644 index e5b21357..00000000 --- a/pysite/migrations/tables/pydoc_links/initial_data.json +++ /dev/null @@ -1,22 +0,0 @@ -[ - { - "package": "aiohttp", - "base_url": "https://aiohttp.readthedocs.io/en/stable/", - "inventory_url": "https://aiohttp.readthedocs.io/en/stable/objects.inv" - }, - { - "package": "discord", - "base_url": "https://discordpy.readthedocs.io/en/rewrite/", - "inventory_url": "https://discordpy.readthedocs.io/en/rewrite/objects.inv" - }, - { - "package": "django", - "base_url": "https://docs.djangoproject.com/en/dev/", - "inventory_url": "https://docs.djangoproject.com/en/dev/_objects/" - }, - { - "package": "stdlib", - "base_url": "https://docs.python.org/3.7/", - "inventory_url": "https://docs.python.org/3.7/objects.inv" - } -] diff --git a/pysite/migrations/tables/snake_facts/__init__.py b/pysite/migrations/tables/snake_facts/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/pysite/migrations/tables/snake_facts/initial_data.json b/pysite/migrations/tables/snake_facts/initial_data.json deleted file mode 100644 index 49b5a80e..00000000 --- a/pysite/migrations/tables/snake_facts/initial_data.json +++ /dev/null @@ -1,233 +0,0 @@ -[ - { - "fact": "The decapitated head of a dead snake can still bite, even hours after death. These types of bites usually contain huge amounts of venom." - }, - { - "fact": "What is considered the most “dangerous” snake depends on both a specific country’s health care and the availability of antivenom following a bite. Based on these criteria, the most dangerous snake in the world is the saw-scaled viper, which bites and kills more people each year than any other snake." - }, - { - "fact": "Snakes live on everywhere on Earth except Ireland, Iceland, New Zealand, and the North and South Poles.a" - }, - { - "fact": "Of the approximately 725 species of venomous snakes worldwide, 250 can kill a human with one bite." - }, - { - "fact": "Snakes evolved from a four-legged reptilian ancestor—most likely a small, burrowing, land-bound lizard—about 100 million years ago. Some snakes, such as pythons and boas, still have traces of back legs." - }, - { - "fact": "The fear of snakes (ophiophobia or herpetophobia) is one of the most common phobias worldwide. Approximately 1/3 of all adult humans areophidiophobic , which suggests that humans have an innate, evolutionary fear of snakes." - }, - { - "fact": "The top 5 most venomous snakes in the world are the inland taipan, the eastern brown snake, the coastal taipan, the tiger snake, and the black tiger snake." - }, - { - "fact": "The warmer a snake’s body, the more quickly it can digest its prey. Typically, it takes 3–5 days for a snake to digest its meal. For very large snakes, such as the anaconda, digestion can take weeks." - }, - { - "fact": "Some animals, such as the Mongoose, are immune to snake venom." - }, - { - "fact": "To avoid predators, some snakes can poop whenever they want. They make themselves so dirty and smelly that predators will run away." - }, - { - "fact": "The heaviest snake in the world is the anaconda. It weighs over 595 pounds (270 kg) and can grow to over 30 feet (9m) long. It has been known to eat caimans, capybaras, and jaguars." - }, - { - "fact": "The Brahminy Blind Snake, or flowerpot snake, is the only snake species made up of solely females and, as such, does not need a mate to reproduce. It is also the most widespread terrestrial snake in the world." - }, - { - "fact": "If a person suddenly turned into a snake, they would be about 4 times longer than they are now and only a few inches thick. While humans have 24 ribs, some snakes can have more than 400." - }, - { - "fact": "The most advanced snake species in the world is believed to be the black mamba. It has the most highly evolved venom delivery system of any snake on Earth. It can strike up to 12 times in a row, though just one bite is enough to kill a grown man.o" - }, - { - "fact": "The inland taipan is the world’s most toxic snake, meaning it has both the most toxic venom and it injects the most venom when it bites. Its venom sacs hold enough poison to kill up to 80 people." - }, - { - "fact": "The death adder has the fastest strike of any snake in the world. It can attack, inject venom, and go back to striking position in under 0.15 seconds." - }, - { - "fact": "While snakes do not have external ears or eardrums, their skin, muscles, and bones carry sound vibrations to their inner ears." - }, - { - "fact": "Some snakes have been known to explode after eating a large meal. For example, a 13-foot python blew up after it tried to eat a 6-foot alligator. The python was found with the alligator’s tail protruding from its midsection. Its head was missing." - }, - { - "fact": "The word “snake” is from the Proto-Indo-European root *sneg -, meaning “to crawl, creeping thing.” The word “serpent” is from the Proto-Indo-European root *serp -, meaning “to crawl, creep.”" - }, - { - "fact": "Rattlesnake rattles are made of rings of keratin, which is the same material as human hair and fingernails. A rattler will add a new ring each time it sheds its skin." - }, - { - "fact": "Some snakes have over 200 teeth. The teeth aren’t used for chewing but they point backward to prevent prey from escaping the snake’s throat." - }, - { - "fact": "There are about 500 genera and 3,000 different species of snakes. All of them are predators." - }, - { - "fact": "Naturalist Paul Rosolie attempted to be the first person to survive being swallowed by an anaconda in 2014. Though he was wearing a specially designed carbon fiber suit equipped with a breathing system, cameras, and a communication system, he ultimately called off his stunt when he felt like the anaconda was breaking his arm as it tightened its grip around his body." - }, - { - "fact": "There are five recognized species of flying snakes. Growing up to 4 feet, some types can glide up to 330 feet through the air." - }, - { - "fact": "Scales cover every inch of a snake’s body, even its eyes. Scales are thick, tough pieces of skin made from keratin, which is the same material human nails and hair are made from." - }, - { - "fact": "The most common snake in North America is the garter (gardener) snake. This snake is also Massachusetts’s state reptile. While previously thought to be nonvenomous, garter snakes do, in fact, produce a mild neurotoxic venom that is harmless to humans." - }, - { - "fact": "Snakes do not lap up water like mammals do. Instead, they dunk their snouts underwater and use their throats to pump water into their stomachs." - }, - { - "fact": "A snake’s fangs usually last about 6–10 weeks. When a fang wears out, a new one grows in its place." - }, - { - "fact": "Because the end of a snake’s tongue is forked, the two tips taste different amounts of chemicals. Essentially, a snake “smells in stereo” and can even tell which direction a smell is coming from. It identifies scents on its tongue using pits in the roof of its mouth called the Jacobson’s organ." - }, - { - "fact": "The amount of food a snake eats determines how many offspring it will have. The Arafura file snake eats the least and lays just one egg every decade." - }, - { - "fact": "While smaller snakes, such a tree- or- ground-dwelling snakes, use their tongues to follow the scent trails of prey (such as spiders, birds, and other snakes). Larger snakes, such as boas, have heat-sensing organs called labial (lip) pits in their snouts." - }, - { - "fact": "Snakes typically need to eat only 6–30 meals each year to be healthy." - }, - { - "fact": "Snakes like to lie on roads and rocky areas because stones and rocks absorb heat from the sun, which warms them. Basking on these surfaces warms a snake quickly so it can move. If the temperature reaches below 50° Fahrenheit, a snake’s body does not work properly." - }, - { - "fact": "The Mozambique spitting cobra can spit venom over 8 feet away. It can spit from any position, including lying on the ground or raised up. It prefers to aim for its victim’s eyes." - }, - { - "fact": "Snakes cannot chew, so they must swallow their food whole. They are able to stretch their mouths very wide because they have a very flexible lower jaw. Snakes can eat other animals that are 75%–100% bigger than their own bodies." - }, - { - "fact": "To keep from choking on large prey, a snake will push the end of its trachea, or windpipe, out of its mouth, similar to the way a snorkel works." - }, - { - "fact": "The Gaboon viper has the longest fangs of any snake, reaching about 2 inches (5 cm) long." - }, - { - "fact": "Anacondas can hold their breath for up to 10 minutes under water. Additionally, similar to crocodiles, anacondas have eyes and nostrils that can poke above the water’s surface to increase their stealth and hunting prowess." - }, - { - "fact": "The longest snake ever recorded is the reticulated python. It can reach over 33 feet long, which is big enough to swallow a pig, a deer, or even a person." - }, - { - "fact": "Sea snakes with their paddle-shaped tails can dive over 300 feet into the ocean." - }, - { - "fact": "If a snake is threatened soon after a meal, it will often regurgitate its food so it can quickly escape the perceived threat. A snake’s digestive system can dissolve everything but a prey’s hair, feathers, and claws." - }, - { - "fact": "Snakes do not have eyelids; rather, a single transparent scale called a brille protects their eyes. Most snakes see very well, especially if the object is moving." - }, - { - "fact": "The world’s longest venomous snake is the king cobra from Asia. It can grow up to 18 feet, rear almost as high as a person, growl loudly, and inject enough venom to kill an elephant." - }, - { - "fact": "The king cobra is thought to be one of the most intelligent of all snakes. Additionally, unlike most snakes, who do not care for their young, king cobras are careful parents who defend and protect their eggs from enemies." - }, - { - "fact": "Not all snakes have fangs—only those that kill their prey with venom have them. When their fangs are not in use, they fold them back into the roof of the mouth (except for the coral snake, whose fangs do not fold back)." - }, - { - "fact": "Some venomous snakes have died after biting and poisoning themselves by mistake." - }, - { - "fact": "Elephant trunk snakes are almost completely aquatic. They cannot slither because they lack the broad scales in the belly that help other snakes move on land. Rather, elephant trunk snakes have large knobby scales to hold onto slippery fish and constrict them underwater." - }, - { - "fact": "The shortest known snake is the thread snake. It is about 4 inches long and lives on the island of Barbados in the Caribbean. It is said to be as “thin as spaghetti” and it feeds primarily on termites and larvae." - }, - { - "fact": "In 2009, a farm worker in East Africa survived an epic 3-hour battle with a 12-foot python after accidentally stepping on the large snake. It coiled around the man and carried him into a tree. The man wrapped his shirt over the snake’s mouth to prevent it from swallowing him, and he was finally rescued by police after calling for help on his cell phone." - }, - { - "fact": "The venom from a Brazilian pit viper is used in a drug to treat high blood pressure." - }, - { - "fact": "The word “cobra” means “hooded.” Some cobras have large spots on the back of their hood that look like eyes to make them appear intimating even from behind." - }, - { - "fact": "Some desert snakes, such as the African rock python, sleep during the hottest parts of the desert summer. This summer sleep is similar to hibernation and is called “aestivation.”" - }, - { - "fact": "The black mamba is the world’s fastest snake and the world’s second-longest venomous snake in the world, after the king cobra. Found in East Africa, it can reach speeds of up to 12 mph (19kph). It’s named not from the color of its scales, which is olive green, but from the inside of its mouth, which is inky black. Its venom is highly toxic, and without anti-venom, death in humans usually occurs within 7–15 hours." - }, - { - "fact": "Although a snake’s growth rate slows as it gets older, a snake never stops growing." - }, - { - "fact": "While a snake cannot hear the music of a snake charmer, the snake responds to the vibrations of the charmer’s tapping foot or to the movement of the flute." - }, - { - "fact": "Most snakes are not harmful to humans and they help balance the ecosystem by keeping the population of rats, mice, and birds under control." - }, - { - "fact": "The largest snake fossil ever found is the Titanoboa. It lived over 60 million years ago and reached over 50 feet (15 meters) long. It weighed more than 20 people and ate crocodiles and giant tortoises." - }, - { - "fact": "Two-headed snakes are similar to conjoined twins: an embryo begins to split to create identical twins, but the process does not finish. Such snakes rarely survive in the wild because the two heads have duplicate senses, they fight over food, and one head may try to eat the other head." - }, - { - "fact": "Snakes can be grouped into two sections: primitive snakes and true (typical) snakes. Primitive snakes—such as blind snakes, worm snakes, and thread snakes—represent the earliest forms of snakes. True snakes, such as rat snakes and king snakes, are more evolved and more active." - }, - { - "fact": "The oldest written record that describes snakes is in the Brooklyn Papyrus, which is a medical papyrus dating from ancient Egypt (450 B.C.)." - }, - { - "fact": "Approximately 70% of snakes lay eggs. Those that lay eggs are called oviparous. The other 30% of snakes live in colder climates and give birth to live young because it is too cold for eggs outside the body to develop and hatch." - }, - { - "fact": "Most snakes have an elongated right lung, many have a smaller left lung, and a few even have a third lung. They do not have a sense of taste, and most of their organs are organized linearly." - }, - { - "fact": "The most rare and endangered snake is the St. Lucia racer. There are only 18 to 100 of these snakes left." - }, - { - "fact": "Snakes kill over 40,000 people a year—though, with unreported incidents, the total may be over 100,000. About half of these deaths are in India." - }, - { - "fact": "In some cultures, eating snakes is considered a delicacy. For example, snake soup has been a popular Cantonese delicacy for over 2,000 years." - }, - { - "fact": "In some Asian countries, it is believed that drinking the blood of snakes, particularly the cobra, will increase sexual virility. The blood is usually drained from a live snake and then mixed with liquor." - }, - { - "fact": "In the United States, fewer than 1 in 37,500 people are bitten by venomous snakes each year (7,000–8,000 bites per year), and only 1 in 50 million people will die from snake bite (5–6 fatalities per year). In the U.S., a person is 9 times more likely to die from being struck by lightening than to die from a venomous snakebite." - }, - { - "fact": "Some members of the U.S. Army Special Forces are taught to kill and eat snakes during their survival training, which has earned them the nickname “Snake Eaters.”" - }, - { - "fact": "One of the great feats of the legendary Greek hero Perseus was to kill Medusa, a female monster whose hair consisted of writhing, venomous snakes." - }, - { - "fact": "The symbol of the snake is one of the most widespread and oldest cultural symbols in history. Snakes often represent the duality of good and evil and of life and death." - }, - { - "fact": "Because snakes shed their skin, they are often symbols of rebirth, transformation, and healing. For example, Asclepius, the god of medicine, carries a staff encircled by a snake." - }, - { - "fact": "The snake has held various meanings throughout history. For example, The Egyptians viewed the snake as representing royalty and deity. In the Jewish rabbinical tradition and in Hinduism, it represents sexual passion and desire. And the Romans interpreted the snake as a symbol of eternal love." - }, - { - "fact": "Anacondas mate in a huge “breeding ball.” The ball consists of 1 female and nearly 12 males. They stay in a “mating ball” for up to a month." - }, - { - "fact": "Depending on the species, snakes can live from 4 to over 25 years." - }, - { - "fact": "Snakes that are poisonous have pupils that are shaped like a diamond. Nonpoisonous snakes have round pupils." - }, - { - "fact": "Endangered snakes include the San Francisco garter snake, eastern indigo snake, the king cobra, and Dumeril’s boa." - }, - { - "fact": "A mysterious, new “mad snake disease” causes captive pythons and boas to tie themselves in knots. Other symptoms include “stargazing,” which is when snakes stare upwards for long periods of time. Snake experts believe a rodent virus causes the fatal disease." - } -] \ No newline at end of file diff --git a/pysite/migrations/tables/snake_idioms/__init__.py b/pysite/migrations/tables/snake_idioms/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/pysite/migrations/tables/snake_idioms/initial_data.json b/pysite/migrations/tables/snake_idioms/initial_data.json deleted file mode 100644 index 37148c42..00000000 --- a/pysite/migrations/tables/snake_idioms/initial_data.json +++ /dev/null @@ -1,275 +0,0 @@ -[ - { - "idiom": "snek it up" - }, - { - "idiom": "get ur snek on" - }, - { - "idiom": "snek ur heart out" - }, - { - "idiom": "snek 4 ever" - }, - { - "idiom": "i luve snek" - }, - { - "idiom": "snek bff" - }, - { - "idiom": "boyfriend snek" - }, - { - "idiom": "dont snek ur homies" - }, - { - "idiom": "garden snek" - }, - { - "idiom": "snektie" - }, - { - "idiom": "snek keks" - }, - { - "idiom": "birthday snek!" - }, - { - "idiom": "snek tonight?" - }, - { - "idiom": "snek hott lips" - }, - { - "idiom": "snek u latr" - }, - { - "idiom": "netflx and snek" - }, - { - "idiom": "holy snek prey4u" - }, - { - "idiom": "ghowst snek hauntt u" - }, - { - "idiom": "ipekek snek syrop" - }, - { - "idiom": "2 snek 2 furius" - }, - { - "idiom": "the shawsnek redumpton" - }, - { - "idiom": "snekler's list" - }, - { - "idiom": "snekablanca" - }, - { - "idiom": "romeo n snekulet" - }, - { - "idiom": "citizn snek" - }, - { - "idiom": "gon wit the snek" - }, - { - "idiom": "dont step on snek" - }, - { - "idiom": "the wizrd uf snek" - }, - { - "idiom": "forrest snek" - }, - { - "idiom": "snek of musik" - }, - { - "idiom": "west snek story" - }, - { - "idiom": "snek wars eposide XI" - }, - { - "idiom": "2001: a snek odyssuuy" - }, - { - "idiom": "E.T. the snekstra terrastriul" - }, - { - "idiom": "snekkin' inth rain" - }, - { - "idiom": "dr sneklove" - }, - { - "idiom": "snekley kubrik" - }, - { - "idiom": "willium snekspeare" - }, - { - "idiom": "snek on tutanic" - }, - { - "idiom": "a snekwork orunge" - }, - { - "idiom": "the snek the bad n the ogly" - }, - { - "idiom": "the sneksorcist" - }, - { - "idiom": "gudd snek huntin" - }, - { - "idiom": "leonurdo disnekrio" - }, - { - "idiom": "denzal snekington" - }, - { - "idiom": "snekuel l jocksons" - }, - { - "idiom": "kevn snek" - }, - { - "idiom": "snekthony hopkuns" - }, - { - "idiom": "hugh snekman" - }, - { - "idiom": "snek but it glow in durk" - }, - { - "idiom": "snek but u cn ride it" - }, - { - "idiom": "snek but slep in ur bed" - }, - { - "idiom": "snek but mad frum plastk" - }, - { - "idiom": "snek but bulong 2 ur frnd" - }, - { - "idiom": "sneks on plene" - }, - { - "idiom": "baby snek" - }, - { - "idiom": "trouser snek" - }, - { - "idiom": "momo snek" - }, - { - "idiom": "fast snek" - }, - { - "idiom": "super slow snek" - }, - { - "idiom": "old snek" - }, - { - "idiom": "slimy snek" - }, - { - "idiom": "snek attekk" - }, - { - "idiom": "snek get wrekk" - }, - { - "idiom": "snek you long time" - }, - { - "idiom": "carpenter snek" - }, - { - "idiom": "drain snek" - }, - { - "idiom": "eat ur face snek" - }, - { - "idiom": "kawaii snek" - }, - { - "idiom": "dis snek is soft" - }, - { - "idiom": "snek is 4 yers uld" - }, - { - "idiom": "pls feed snek, is hingry" - }, - { - "idiom": "snek? snek? sneeeeek!!" - }, - { - "idiom": "solid snek" - }, - { - "idiom": "big bos snek" - }, - { - "idiom": "snek republic" - }, - { - "idiom": "snekoslovakia" - }, - { - "idiom": "snek please!" - }, - { - "idiom": "i brok my snek :(" - }, - { - "idiom": "star snek the nxt generatin" - }, - { - "idiom": "azsnek tempul" - }, - { - "idiom": "discosnek" - }, - { - "idiom": "bottlsnek" - }, - { - "idiom": "turtlsnek" - }, - { - "idiom": "cashiers snek" - }, - { - "idiom": "mega snek!!" - }, - { - "idiom": "one tim i saw snek neked" - }, - { - "idiom": "snek cnt clim trees" - }, - { - "idiom": "snek in muth is jus tongue" - }, - { - "idiom": "juan snek" - }, - { - "idiom": "photosnek" - } -] \ No newline at end of file diff --git a/pysite/migrations/tables/snake_names/__init__.py b/pysite/migrations/tables/snake_names/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/pysite/migrations/tables/snake_names/initial_data.json b/pysite/migrations/tables/snake_names/initial_data.json deleted file mode 100644 index 8ba9dbd7..00000000 --- a/pysite/migrations/tables/snake_names/initial_data.json +++ /dev/null @@ -1,2170 +0,0 @@ -[ - { - "name": "Acanthophis", - "scientific": "Acanthophis" - }, - { - "name": "Aesculapian snake", - "scientific": "Aesculapian snake" - }, - { - "name": "African beaked snake", - "scientific": "Rufous beaked snake" - }, - { - "name": "African puff adder", - "scientific": "Bitis arietans" - }, - { - "name": "African rock python", - "scientific": "African rock python" - }, - { - "name": "African twig snake", - "scientific": "Twig snake" - }, - { - "name": "Agkistrodon piscivorus", - "scientific": "Agkistrodon piscivorus" - }, - { - "name": "Ahaetulla", - "scientific": "Ahaetulla" - }, - { - "name": "Amazonian palm viper", - "scientific": "Bothriopsis bilineata" - }, - { - "name": "American copperhead", - "scientific": "Agkistrodon contortrix" - }, - { - "name": "Amethystine python", - "scientific": "Amethystine python" - }, - { - "name": "Anaconda", - "scientific": "Anaconda" - }, - { - "name": "Andaman cat snake", - "scientific": "Boiga andamanensis" - }, - { - "name": "Andrea's keelback", - "scientific": "Amphiesma andreae" - }, - { - "name": "Annulated sea snake", - "scientific": "Hydrophis cyanocinctus" - }, - { - "name": "Arafura file snake", - "scientific": "Acrochordus arafurae" - }, - { - "name": "Arizona black rattlesnake", - "scientific": "Crotalus oreganus cerberus" - }, - { - "name": "Arizona coral snake", - "scientific": "Coral snake" - }, - { - "name": "Aruba rattlesnake", - "scientific": "Crotalus durissus unicolor" - }, - { - "name": "Asian cobra", - "scientific": "Indian cobra" - }, - { - "name": "Asian keelback", - "scientific": "Amphiesma vibakari" - }, - { - "name": "Asp (reptile)", - "scientific": "Asp (reptile)" - }, - { - "name": "Assam keelback", - "scientific": "Amphiesma pealii" - }, - { - "name": "Australian copperhead", - "scientific": "Austrelaps" - }, - { - "name": "Australian scrub python", - "scientific": "Amethystine python" - }, - { - "name": "Baird's rat snake", - "scientific": "Pantherophis bairdi" - }, - { - "name": "Banded Flying Snake", - "scientific": "Banded flying snake" - }, - { - "name": "Banded cat-eyed snake", - "scientific": "Banded cat-eyed snake" - }, - { - "name": "Banded krait", - "scientific": "Banded krait" - }, - { - "name": "Barred wolf snake", - "scientific": "Lycodon striatus" - }, - { - "name": "Beaked sea snake", - "scientific": "Enhydrina schistosa" - }, - { - "name": "Beauty rat snake", - "scientific": "Beauty rat snake" - }, - { - "name": "Beddome's cat snake", - "scientific": "Boiga beddomei" - }, - { - "name": "Beddome's coral snake", - "scientific": "Beddome's coral snake" - }, - { - "name": "Bird snake", - "scientific": "Twig snake" - }, - { - "name": "Black-banded trinket snake", - "scientific": "Oreocryptophis porphyraceus" - }, - { - "name": "Black-headed snake", - "scientific": "Western black-headed snake" - }, - { - "name": "Black-necked cobra", - "scientific": "Black-necked spitting cobra" - }, - { - "name": "Black-necked spitting cobra", - "scientific": "Black-necked spitting cobra" - }, - { - "name": "Black-striped keelback", - "scientific": "Buff striped keelback" - }, - { - "name": "Black-tailed horned pit viper", - "scientific": "Mixcoatlus melanurus" - }, - { - "name": "Black headed python", - "scientific": "Black-headed python" - }, - { - "name": "Black krait", - "scientific": "Greater black krait" - }, - { - "name": "Black mamba", - "scientific": "Black mamba" - }, - { - "name": "Black rat snake", - "scientific": "Rat snake" - }, - { - "name": "Black tree cobra", - "scientific": "Cobra" - }, - { - "name": "Blind snake", - "scientific": "Scolecophidia" - }, - { - "name": "Blonde hognose snake", - "scientific": "Hognose" - }, - { - "name": "Blood python", - "scientific": "Python brongersmai" - }, - { - "name": "Blue krait", - "scientific": "Bungarus candidus" - }, - { - "name": "Blunt-headed tree snake", - "scientific": "Imantodes cenchoa" - }, - { - "name": "Boa constrictor", - "scientific": "Boa constrictor" - }, - { - "name": "Bocourt's water snake", - "scientific": "Subsessor" - }, - { - "name": "Boelen python", - "scientific": "Morelia boeleni" - }, - { - "name": "Boidae", - "scientific": "Boidae" - }, - { - "name": "Boiga", - "scientific": "Boiga" - }, - { - "name": "Boomslang", - "scientific": "Boomslang" - }, - { - "name": "Brahminy blind snake", - "scientific": "Indotyphlops braminus" - }, - { - "name": "Brazilian coral snake", - "scientific": "Coral snake" - }, - { - "name": "Brazilian smooth snake", - "scientific": "Hydrodynastes gigas" - }, - { - "name": "Brown snake (disambiguation)", - "scientific": "Brown snake" - }, - { - "name": "Brown tree snake", - "scientific": "Brown tree snake" - }, - { - "name": "Brown white-lipped python", - "scientific": "Leiopython" - }, - { - "name": "Buff striped keelback", - "scientific": "Buff striped keelback" - }, - { - "name": "Bull snake", - "scientific": "Bull snake" - }, - { - "name": "Burmese keelback", - "scientific": "Burmese keelback water snake" - }, - { - "name": "Burmese krait", - "scientific": "Burmese krait" - }, - { - "name": "Burmese python", - "scientific": "Burmese python" - }, - { - "name": "Burrowing viper", - "scientific": "Atractaspidinae" - }, - { - "name": "Buttermilk racer", - "scientific": "Coluber constrictor anthicus" - }, - { - "name": "California kingsnake", - "scientific": "California kingsnake" - }, - { - "name": "Cantor's pitviper", - "scientific": "Trimeresurus cantori" - }, - { - "name": "Cape cobra", - "scientific": "Cape cobra" - }, - { - "name": "Cape coral snake", - "scientific": "Aspidelaps lubricus" - }, - { - "name": "Cape gopher snake", - "scientific": "Cape gopher snake" - }, - { - "name": "Carpet viper", - "scientific": "Echis" - }, - { - "name": "Cat-eyed night snake", - "scientific": "Banded cat-eyed snake" - }, - { - "name": "Cat-eyed snake", - "scientific": "Banded cat-eyed snake" - }, - { - "name": "Cat snake", - "scientific": "Boiga" - }, - { - "name": "Central American lyre snake", - "scientific": "Trimorphodon biscutatus" - }, - { - "name": "Central ranges taipan", - "scientific": "Taipan" - }, - { - "name": "Chappell Island tiger snake", - "scientific": "Tiger snake" - }, - { - "name": "Checkered garter snake", - "scientific": "Checkered garter snake" - }, - { - "name": "Checkered keelback", - "scientific": "Checkered keelback" - }, - { - "name": "Children's python", - "scientific": "Children's python" - }, - { - "name": "Chinese cobra", - "scientific": "Chinese cobra" - }, - { - "name": "Coachwhip snake", - "scientific": "Masticophis flagellum" - }, - { - "name": "Coastal taipan", - "scientific": "Coastal taipan" - }, - { - "name": "Cobra", - "scientific": "Cobra" - }, - { - "name": "Collett's snake", - "scientific": "Collett's snake" - }, - { - "name": "Common adder", - "scientific": "Vipera berus" - }, - { - "name": "Common cobra", - "scientific": "Chinese cobra" - }, - { - "name": "Common garter snake", - "scientific": "Common garter snake" - }, - { - "name": "Common ground snake", - "scientific": "Western ground snake" - }, - { - "name": "Common keelback (disambiguation)", - "scientific": "Common keelback" - }, - { - "name": "Common tiger snake", - "scientific": "Tiger snake" - }, - { - "name": "Common worm snake", - "scientific": "Indotyphlops braminus" - }, - { - "name": "Congo snake", - "scientific": "Amphiuma" - }, - { - "name": "Congo water cobra", - "scientific": "Naja christyi" - }, - { - "name": "Coral snake", - "scientific": "Coral snake" - }, - { - "name": "Corn snake", - "scientific": "Corn snake" - }, - { - "name": "Coronado Island rattlesnake", - "scientific": "Crotalus oreganus caliginis" - }, - { - "name": "Crossed viper", - "scientific": "Vipera berus" - }, - { - "name": "Crotalus cerastes", - "scientific": "Crotalus cerastes" - }, - { - "name": "Crotalus durissus", - "scientific": "Crotalus durissus" - }, - { - "name": "Crotalus horridus", - "scientific": "Timber rattlesnake" - }, - { - "name": "Crowned snake", - "scientific": "Tantilla" - }, - { - "name": "Cuban boa", - "scientific": "Chilabothrus angulifer" - }, - { - "name": "Cuban wood snake", - "scientific": "Tropidophis melanurus" - }, - { - "name": "Dasypeltis", - "scientific": "Dasypeltis" - }, - { - "name": "Desert death adder", - "scientific": "Desert death adder" - }, - { - "name": "Desert kingsnake", - "scientific": "Desert kingsnake" - }, - { - "name": "Desert woma python", - "scientific": "Woma python" - }, - { - "name": "Diamond python", - "scientific": "Morelia spilota spilota" - }, - { - "name": "Dog-toothed cat snake", - "scientific": "Boiga cynodon" - }, - { - "name": "Down's tiger snake", - "scientific": "Tiger snake" - }, - { - "name": "Dubois's sea snake", - "scientific": "Aipysurus duboisii" - }, - { - "name": "Durango rock rattlesnake", - "scientific": "Crotalus lepidus klauberi" - }, - { - "name": "Dusty hognose snake", - "scientific": "Hognose" - }, - { - "name": "Dwarf beaked snake", - "scientific": "Dwarf beaked snake" - }, - { - "name": "Dwarf boa", - "scientific": "Boa constrictor" - }, - { - "name": "Dwarf pipe snake", - "scientific": "Anomochilus" - }, - { - "name": "Eastern brown snake", - "scientific": "Eastern brown snake" - }, - { - "name": "Eastern coral snake", - "scientific": "Micrurus fulvius" - }, - { - "name": "Eastern diamondback rattlesnake", - "scientific": "Eastern diamondback rattlesnake" - }, - { - "name": "Eastern green mamba", - "scientific": "Eastern green mamba" - }, - { - "name": "Eastern hognose snake", - "scientific": "Eastern hognose snake" - }, - { - "name": "Eastern mud snake", - "scientific": "Mud snake" - }, - { - "name": "Eastern racer", - "scientific": "Coluber constrictor" - }, - { - "name": "Eastern tiger snake", - "scientific": "Tiger snake" - }, - { - "name": "Eastern water cobra", - "scientific": "Cobra" - }, - { - "name": "Elaps harlequin snake", - "scientific": "Micrurus fulvius" - }, - { - "name": "Eunectes", - "scientific": "Eunectes" - }, - { - "name": "European Smooth Snake", - "scientific": "Smooth snake" - }, - { - "name": "False cobra", - "scientific": "False cobra" - }, - { - "name": "False coral snake", - "scientific": "Coral snake" - }, - { - "name": "False water cobra", - "scientific": "Hydrodynastes gigas" - }, - { - "name": "Fierce snake", - "scientific": "Inland taipan" - }, - { - "name": "Flying snake", - "scientific": "Chrysopelea" - }, - { - "name": "Forest cobra", - "scientific": "Forest cobra" - }, - { - "name": "Forsten's cat snake", - "scientific": "Boiga forsteni" - }, - { - "name": "Fox snake", - "scientific": "Fox snake" - }, - { - "name": "Gaboon viper", - "scientific": "Gaboon viper" - }, - { - "name": "Garter snake", - "scientific": "Garter snake" - }, - { - "name": "Giant Malagasy hognose snake", - "scientific": "Hognose" - }, - { - "name": "Glossy snake", - "scientific": "Glossy snake" - }, - { - "name": "Gold-ringed cat snake", - "scientific": "Boiga dendrophila" - }, - { - "name": "Gold tree cobra", - "scientific": "Pseudohaje goldii" - }, - { - "name": "Golden tree snake", - "scientific": "Chrysopelea ornata" - }, - { - "name": "Gopher snake", - "scientific": "Pituophis catenifer" - }, - { - "name": "Grand Canyon rattlesnake", - "scientific": "Crotalus oreganus abyssus" - }, - { - "name": "Grass snake", - "scientific": "Grass snake" - }, - { - "name": "Gray cat snake", - "scientific": "Boiga ocellata" - }, - { - "name": "Great Plains rat snake", - "scientific": "Pantherophis emoryi" - }, - { - "name": "Green anaconda", - "scientific": "Green anaconda" - }, - { - "name": "Green rat snake", - "scientific": "Rat snake" - }, - { - "name": "Green tree python", - "scientific": "Green tree python" - }, - { - "name": "Grey-banded kingsnake", - "scientific": "Gray-banded kingsnake" - }, - { - "name": "Grey Lora", - "scientific": "Leptophis stimsoni" - }, - { - "name": "Halmahera python", - "scientific": "Morelia tracyae" - }, - { - "name": "Harlequin coral snake", - "scientific": "Micrurus fulvius" - }, - { - "name": "Herald snake", - "scientific": "Caduceus" - }, - { - "name": "High Woods coral snake", - "scientific": "Coral snake" - }, - { - "name": "Hill keelback", - "scientific": "Amphiesma monticola" - }, - { - "name": "Himalayan keelback", - "scientific": "Amphiesma platyceps" - }, - { - "name": "Hognose snake", - "scientific": "Hognose" - }, - { - "name": "Hognosed viper", - "scientific": "Porthidium" - }, - { - "name": "Hook Nosed Sea Snake", - "scientific": "Enhydrina schistosa" - }, - { - "name": "Hoop snake", - "scientific": "Hoop snake" - }, - { - "name": "Hopi rattlesnake", - "scientific": "Crotalus viridis nuntius" - }, - { - "name": "Indian cobra", - "scientific": "Indian cobra" - }, - { - "name": "Indian egg-eater", - "scientific": "Indian egg-eating snake" - }, - { - "name": "Indian flying snake", - "scientific": "Chrysopelea ornata" - }, - { - "name": "Indian krait", - "scientific": "Bungarus" - }, - { - "name": "Indigo snake", - "scientific": "Drymarchon" - }, - { - "name": "Inland carpet python", - "scientific": "Morelia spilota metcalfei" - }, - { - "name": "Inland taipan", - "scientific": "Inland taipan" - }, - { - "name": "Jamaican boa", - "scientific": "Jamaican boa" - }, - { - "name": "Jan's hognose snake", - "scientific": "Hognose" - }, - { - "name": "Japanese forest rat snake", - "scientific": "Euprepiophis conspicillatus" - }, - { - "name": "Japanese rat snake", - "scientific": "Japanese rat snake" - }, - { - "name": "Japanese striped snake", - "scientific": "Japanese striped snake" - }, - { - "name": "Kayaudi dwarf reticulated python", - "scientific": "Reticulated python" - }, - { - "name": "Keelback", - "scientific": "Natricinae" - }, - { - "name": "Khasi Hills keelback", - "scientific": "Amphiesma khasiense" - }, - { - "name": "King Island tiger snake", - "scientific": "Tiger snake" - }, - { - "name": "King brown", - "scientific": "Mulga snake" - }, - { - "name": "King cobra", - "scientific": "King cobra" - }, - { - "name": "King rat snake", - "scientific": "Rat snake" - }, - { - "name": "King snake", - "scientific": "Kingsnake" - }, - { - "name": "Krait", - "scientific": "Bungarus" - }, - { - "name": "Krefft's tiger snake", - "scientific": "Tiger snake" - }, - { - "name": "Lance-headed rattlesnake", - "scientific": "Crotalus polystictus" - }, - { - "name": "Lancehead", - "scientific": "Bothrops" - }, - { - "name": "Large shield snake", - "scientific": "Pseudotyphlops" - }, - { - "name": "Leptophis ahaetulla", - "scientific": "Leptophis ahaetulla" - }, - { - "name": "Lesser black krait", - "scientific": "Lesser black krait" - }, - { - "name": "Long-nosed adder", - "scientific": "Eastern hognose snake" - }, - { - "name": "Long-nosed tree snake", - "scientific": "Western hognose snake" - }, - { - "name": "Long-nosed whip snake", - "scientific": "Ahaetulla nasuta" - }, - { - "name": "Long-tailed rattlesnake", - "scientific": "Rattlesnake" - }, - { - "name": "Longnosed worm snake", - "scientific": "Leptotyphlops macrorhynchus" - }, - { - "name": "Lyre snake", - "scientific": "Trimorphodon" - }, - { - "name": "Madagascar ground boa", - "scientific": "Acrantophis madagascariensis" - }, - { - "name": "Malayan krait", - "scientific": "Bungarus candidus" - }, - { - "name": "Malayan long-glanded coral snake", - "scientific": "Calliophis bivirgata" - }, - { - "name": "Malayan pit viper", - "scientific": "Pit viper" - }, - { - "name": "Mamba", - "scientific": "Mamba" - }, - { - "name": "Mamushi", - "scientific": "Mamushi" - }, - { - "name": "Manchurian Black Water Snake", - "scientific": "Elaphe schrenckii" - }, - { - "name": "Mandarin rat snake", - "scientific": "Mandarin rat snake" - }, - { - "name": "Mangrove snake (disambiguation)", - "scientific": "Mangrove snake" - }, - { - "name": "Many-banded krait", - "scientific": "Many-banded krait" - }, - { - "name": "Many-banded tree snake", - "scientific": "Many-banded tree snake" - }, - { - "name": "Many-spotted cat snake", - "scientific": "Boiga multomaculata" - }, - { - "name": "Massasauga rattlesnake", - "scientific": "Massasauga" - }, - { - "name": "Mexican black kingsnake", - "scientific": "Mexican black kingsnake" - }, - { - "name": "Mexican green rattlesnake", - "scientific": "Crotalus basiliscus" - }, - { - "name": "Mexican hognose snake", - "scientific": "Hognose" - }, - { - "name": "Mexican parrot snake", - "scientific": "Leptophis mexicanus" - }, - { - "name": "Mexican racer", - "scientific": "Coluber constrictor oaxaca" - }, - { - "name": "Mexican vine snake", - "scientific": "Oxybelis aeneus" - }, - { - "name": "Mexican west coast rattlesnake", - "scientific": "Crotalus basiliscus" - }, - { - "name": "Micropechis ikaheka", - "scientific": "Micropechis ikaheka" - }, - { - "name": "Midget faded rattlesnake", - "scientific": "Crotalus oreganus concolor" - }, - { - "name": "Milk snake", - "scientific": "Milk snake" - }, - { - "name": "Moccasin snake", - "scientific": "Agkistrodon piscivorus" - }, - { - "name": "Modest keelback", - "scientific": "Amphiesma modestum" - }, - { - "name": "Mojave desert sidewinder", - "scientific": "Crotalus cerastes" - }, - { - "name": "Mojave rattlesnake", - "scientific": "Crotalus scutulatus" - }, - { - "name": "Mole viper", - "scientific": "Atractaspidinae" - }, - { - "name": "Moluccan flying snake", - "scientific": "Chrysopelea" - }, - { - "name": "Montpellier snake", - "scientific": "Malpolon monspessulanus" - }, - { - "name": "Mud adder", - "scientific": "Mud adder" - }, - { - "name": "Mud snake", - "scientific": "Mud snake" - }, - { - "name": "Mussurana", - "scientific": "Mussurana" - }, - { - "name": "Narrowhead Garter Snake", - "scientific": "Garter snake" - }, - { - "name": "Nicobar Island keelback", - "scientific": "Amphiesma nicobariense" - }, - { - "name": "Nicobar cat snake", - "scientific": "Boiga wallachi" - }, - { - "name": "Night snake", - "scientific": "Night snake" - }, - { - "name": "Nilgiri keelback", - "scientific": "Nilgiri keelback" - }, - { - "name": "North eastern king snake", - "scientific": "Eastern hognose snake" - }, - { - "name": "Northeastern hill krait", - "scientific": "Northeastern hill krait" - }, - { - "name": "Northern black-tailed rattlesnake", - "scientific": "Crotalus molossus" - }, - { - "name": "Northern tree snake", - "scientific": "Dendrelaphis calligastra" - }, - { - "name": "Northern water snake", - "scientific": "Northern water snake" - }, - { - "name": "Northern white-lipped python", - "scientific": "Leiopython" - }, - { - "name": "Oaxacan small-headed rattlesnake", - "scientific": "Crotalus intermedius gloydi" - }, - { - "name": "Okinawan habu", - "scientific": "Okinawan habu" - }, - { - "name": "Olive sea snake", - "scientific": "Aipysurus laevis" - }, - { - "name": "Opheodrys", - "scientific": "Opheodrys" - }, - { - "name": "Orange-collared keelback", - "scientific": "Rhabdophis himalayanus" - }, - { - "name": "Ornate flying snake", - "scientific": "Chrysopelea ornata" - }, - { - "name": "Oxybelis", - "scientific": "Oxybelis" - }, - { - "name": "Palestine viper", - "scientific": "Vipera palaestinae" - }, - { - "name": "Paradise flying snake", - "scientific": "Chrysopelea paradisi" - }, - { - "name": "Parrot snake", - "scientific": "Leptophis ahaetulla" - }, - { - "name": "Patchnose snake", - "scientific": "Salvadora (snake)" - }, - { - "name": "Pelagic sea snake", - "scientific": "Yellow-bellied sea snake" - }, - { - "name": "Peninsula tiger snake", - "scientific": "Tiger snake" - }, - { - "name": "Perrotet's shieldtail snake", - "scientific": "Plectrurus perrotetii" - }, - { - "name": "Persian rat snake", - "scientific": "Rat snake" - }, - { - "name": "Pine snake", - "scientific": "Pine snake" - }, - { - "name": "Pit viper", - "scientific": "Pit viper" - }, - { - "name": "Plains hognose snake", - "scientific": "Western hognose snake" - }, - { - "name": "Prairie kingsnake", - "scientific": "Lampropeltis calligaster" - }, - { - "name": "Pygmy python", - "scientific": "Pygmy python" - }, - { - "name": "Pythonidae", - "scientific": "Pythonidae" - }, - { - "name": "Queen snake", - "scientific": "Queen snake" - }, - { - "name": "Rat snake", - "scientific": "Rat snake" - }, - { - "name": "Rattler", - "scientific": "Rattlesnake" - }, - { - "name": "Rattlesnake", - "scientific": "Rattlesnake" - }, - { - "name": "Red-bellied black snake", - "scientific": "Red-bellied black snake" - }, - { - "name": "Red-headed krait", - "scientific": "Red-headed krait" - }, - { - "name": "Red-necked keelback", - "scientific": "Rhabdophis subminiatus" - }, - { - "name": "Red-tailed bamboo pitviper", - "scientific": "Trimeresurus erythrurus" - }, - { - "name": "Red-tailed boa", - "scientific": "Boa constrictor" - }, - { - "name": "Red-tailed pipe snake", - "scientific": "Cylindrophis ruffus" - }, - { - "name": "Red blood python", - "scientific": "Python brongersmai" - }, - { - "name": "Red diamond rattlesnake", - "scientific": "Crotalus ruber" - }, - { - "name": "Reticulated python", - "scientific": "Reticulated python" - }, - { - "name": "Ribbon snake", - "scientific": "Ribbon snake" - }, - { - "name": "Ringed hognose snake", - "scientific": "Hognose" - }, - { - "name": "Rosy boa", - "scientific": "Rosy boa" - }, - { - "name": "Rough green snake", - "scientific": "Opheodrys aestivus" - }, - { - "name": "Rubber boa", - "scientific": "Rubber boa" - }, - { - "name": "Rufous beaked snake", - "scientific": "Rufous beaked snake" - }, - { - "name": "Russell's viper", - "scientific": "Russell's viper" - }, - { - "name": "San Francisco garter snake", - "scientific": "San Francisco garter snake" - }, - { - "name": "Sand boa", - "scientific": "Erycinae" - }, - { - "name": "Sand viper", - "scientific": "Sand viper" - }, - { - "name": "Saw-scaled viper", - "scientific": "Echis" - }, - { - "name": "Scarlet kingsnake", - "scientific": "Scarlet kingsnake" - }, - { - "name": "Sea snake", - "scientific": "Hydrophiinae" - }, - { - "name": "Selayer reticulated python", - "scientific": "Reticulated python" - }, - { - "name": "Shield-nosed cobra", - "scientific": "Shield-nosed cobra" - }, - { - "name": "Shield-tailed snake", - "scientific": "Uropeltidae" - }, - { - "name": "Sikkim keelback", - "scientific": "Sikkim keelback" - }, - { - "name": "Sind krait", - "scientific": "Sind krait" - }, - { - "name": "Smooth green snake", - "scientific": "Smooth green snake" - }, - { - "name": "South American hognose snake", - "scientific": "Hognose" - }, - { - "name": "South Andaman krait", - "scientific": "South Andaman krait" - }, - { - "name": "South eastern corn snake", - "scientific": "Corn snake" - }, - { - "name": "Southern Pacific rattlesnake", - "scientific": "Crotalus oreganus helleri" - }, - { - "name": "Southern black racer", - "scientific": "Southern black racer" - }, - { - "name": "Southern hognose snake", - "scientific": "Southern hognose snake" - }, - { - "name": "Southern white-lipped python", - "scientific": "Leiopython" - }, - { - "name": "Southwestern blackhead snake", - "scientific": "Tantilla hobartsmithi" - }, - { - "name": "Southwestern carpet python", - "scientific": "Morelia spilota imbricata" - }, - { - "name": "Southwestern speckled rattlesnake", - "scientific": "Crotalus mitchellii pyrrhus" - }, - { - "name": "Speckled hognose snake", - "scientific": "Hognose" - }, - { - "name": "Speckled kingsnake", - "scientific": "Lampropeltis getula holbrooki" - }, - { - "name": "Spectacled cobra", - "scientific": "Indian cobra" - }, - { - "name": "Sri Lanka cat snake", - "scientific": "Boiga ceylonensis" - }, - { - "name": "Stiletto snake", - "scientific": "Atractaspidinae" - }, - { - "name": "Stimson's python", - "scientific": "Stimson's python" - }, - { - "name": "Striped snake", - "scientific": "Japanese striped snake" - }, - { - "name": "Sumatran short-tailed python", - "scientific": "Python curtus" - }, - { - "name": "Sunbeam snake", - "scientific": "Xenopeltis" - }, - { - "name": "Taipan", - "scientific": "Taipan" - }, - { - "name": "Tan racer", - "scientific": "Coluber constrictor etheridgei" - }, - { - "name": "Tancitaran dusky rattlesnake", - "scientific": "Crotalus pusillus" - }, - { - "name": "Tanimbar python", - "scientific": "Reticulated python" - }, - { - "name": "Tasmanian tiger snake", - "scientific": "Tiger snake" - }, - { - "name": "Tawny cat snake", - "scientific": "Boiga ochracea" - }, - { - "name": "Temple pit viper", - "scientific": "Pit viper" - }, - { - "name": "Tentacled snake", - "scientific": "Erpeton tentaculatum" - }, - { - "name": "Texas Coral Snake", - "scientific": "Coral snake" - }, - { - "name": "Texas blind snake", - "scientific": "Leptotyphlops dulcis" - }, - { - "name": "Texas garter snake", - "scientific": "Texas garter snake" - }, - { - "name": "Texas lyre snake", - "scientific": "Trimorphodon biscutatus vilkinsonii" - }, - { - "name": "Texas night snake", - "scientific": "Hypsiglena jani" - }, - { - "name": "Thai cobra", - "scientific": "King cobra" - }, - { - "name": "Three-lined ground snake", - "scientific": "Atractus trilineatus" - }, - { - "name": "Tic polonga", - "scientific": "Russell's viper" - }, - { - "name": "Tiger rattlesnake", - "scientific": "Crotalus tigris" - }, - { - "name": "Tiger snake", - "scientific": "Tiger snake" - }, - { - "name": "Tigre snake", - "scientific": "Spilotes pullatus" - }, - { - "name": "Timber rattlesnake", - "scientific": "Timber rattlesnake" - }, - { - "name": "Tree snake", - "scientific": "Brown tree snake" - }, - { - "name": "Tri-color hognose snake", - "scientific": "Hognose" - }, - { - "name": "Trinket snake", - "scientific": "Trinket snake" - }, - { - "name": "Tropical rattlesnake", - "scientific": "Crotalus durissus" - }, - { - "name": "Twig snake", - "scientific": "Twig snake" - }, - { - "name": "Twin-Barred tree snake", - "scientific": "Banded flying snake" - }, - { - "name": "Twin-spotted rat snake", - "scientific": "Rat snake" - }, - { - "name": "Twin-spotted rattlesnake", - "scientific": "Crotalus pricei" - }, - { - "name": "Uracoan rattlesnake", - "scientific": "Crotalus durissus vegrandis" - }, - { - "name": "Viperidae", - "scientific": "Viperidae" - }, - { - "name": "Wall's keelback", - "scientific": "Amphiesma xenura" - }, - { - "name": "Wart snake", - "scientific": "Acrochordidae" - }, - { - "name": "Water adder", - "scientific": "Agkistrodon piscivorus" - }, - { - "name": "Water moccasin", - "scientific": "Agkistrodon piscivorus" - }, - { - "name": "West Indian racer", - "scientific": "Antiguan racer" - }, - { - "name": "Western blind snake", - "scientific": "Leptotyphlops humilis" - }, - { - "name": "Western carpet python", - "scientific": "Morelia spilota" - }, - { - "name": "Western coral snake", - "scientific": "Coral snake" - }, - { - "name": "Western diamondback rattlesnake", - "scientific": "Western diamondback rattlesnake" - }, - { - "name": "Western green mamba", - "scientific": "Western green mamba" - }, - { - "name": "Western ground snake", - "scientific": "Western ground snake" - }, - { - "name": "Western hognose snake", - "scientific": "Western hognose snake" - }, - { - "name": "Western mud snake", - "scientific": "Mud snake" - }, - { - "name": "Western tiger snake", - "scientific": "Tiger snake" - }, - { - "name": "Western woma python", - "scientific": "Woma python" - }, - { - "name": "White-lipped keelback", - "scientific": "Amphiesma leucomystax" - }, - { - "name": "Wolf snake", - "scientific": "Lycodon capucinus" - }, - { - "name": "Woma python", - "scientific": "Woma python" - }, - { - "name": "Wutu", - "scientific": "Bothrops alternatus" - }, - { - "name": "Wynaad keelback", - "scientific": "Amphiesma monticola" - }, - { - "name": "Yellow-banded sea snake", - "scientific": "Yellow-bellied sea snake" - }, - { - "name": "Yellow-bellied sea snake", - "scientific": "Yellow-bellied sea snake" - }, - { - "name": "Yellow-lipped sea snake", - "scientific": "Yellow-lipped sea krait" - }, - { - "name": "Yellow-striped rat snake", - "scientific": "Rat snake" - }, - { - "name": "Yellow anaconda", - "scientific": "Yellow anaconda" - }, - { - "name": "Yellow cobra", - "scientific": "Cape cobra" - }, - { - "name": "Yunnan keelback", - "scientific": "Amphiesma parallelum" - }, - { - "name": "Abaco Island boa", - "scientific": "Epicrates exsul" - }, - { - "name": "Agkistrodon bilineatus", - "scientific": "Agkistrodon bilineatus" - }, - { - "name": "Amazon tree boa", - "scientific": "Corallus hortulanus" - }, - { - "name": "Andaman cobra", - "scientific": "Andaman cobra" - }, - { - "name": "Angolan python", - "scientific": "Python anchietae" - }, - { - "name": "Arabian cobra", - "scientific": "Arabian cobra" - }, - { - "name": "Asp viper", - "scientific": "Vipera aspis" - }, - { - "name": "Ball Python", - "scientific": "Ball python" - }, - { - "name": "Ball python", - "scientific": "Ball python" - }, - { - "name": "Bamboo pitviper", - "scientific": "Trimeresurus gramineus" - }, - { - "name": "Banded pitviper", - "scientific": "Trimeresurus fasciatus" - }, - { - "name": "Banded water cobra", - "scientific": "Naja annulata" - }, - { - "name": "Barbour's pit viper", - "scientific": "Mixcoatlus barbouri" - }, - { - "name": "Bismarck ringed python", - "scientific": "Bothrochilus" - }, - { - "name": "Black-speckled palm-pitviper", - "scientific": "Bothriechis nigroviridis" - }, - { - "name": "Bluntnose viper", - "scientific": "Macrovipera lebetina" - }, - { - "name": "Bornean pitviper", - "scientific": "Trimeresurus borneensis" - }, - { - "name": "Borneo short-tailed python", - "scientific": "Borneo python" - }, - { - "name": "Bothrops jararacussu", - "scientific": "Bothrops jararacussu" - }, - { - "name": "Bredl's python", - "scientific": "Morelia bredli" - }, - { - "name": "Brongersma's pitviper", - "scientific": "Trimeresurus brongersmai" - }, - { - "name": "Brown spotted pitviper", - "scientific": "Trimeresurus mucrosquamatus" - }, - { - "name": "Brown water python", - "scientific": "Liasis fuscus" - }, - { - "name": "Burrowing cobra", - "scientific": "Egyptian cobra" - }, - { - "name": "Bush viper", - "scientific": "Atheris" - }, - { - "name": "Calabar python", - "scientific": "Calabar python" - }, - { - "name": "Caspian cobra", - "scientific": "Caspian cobra" - }, - { - "name": "Centralian carpet python", - "scientific": "Morelia bredli" - }, - { - "name": "Chinese tree viper", - "scientific": "Trimeresurus stejnegeri" - }, - { - "name": "Coastal carpet python", - "scientific": "Morelia spilota mcdowelli" - }, - { - "name": "Colorado desert sidewinder", - "scientific": "Crotalus cerastes laterorepens" - }, - { - "name": "Common lancehead", - "scientific": "Bothrops atrox" - }, - { - "name": "Cyclades blunt-nosed viper", - "scientific": "Macrovipera schweizeri" - }, - { - "name": "Dauan Island water python", - "scientific": "Liasis fuscus" - }, - { - "name": "De Schauensee's anaconda", - "scientific": "Eunectes deschauenseei" - }, - { - "name": "Dumeril's boa", - "scientific": "Acrantophis dumerili" - }, - { - "name": "Dusky pigmy rattlesnake", - "scientific": "Sistrurus miliarius barbouri" - }, - { - "name": "Dwarf sand adder", - "scientific": "Bitis peringueyi" - }, - { - "name": "Egyptian cobra", - "scientific": "Egyptian cobra" - }, - { - "name": "Elegant pitviper", - "scientific": "Trimeresurus elegans" - }, - { - "name": "Emerald tree boa", - "scientific": "Emerald tree boa" - }, - { - "name": "Equatorial spitting cobra", - "scientific": "Equatorial spitting cobra" - }, - { - "name": "European asp", - "scientific": "Vipera aspis" - }, - { - "name": "Eyelash palm-pitviper", - "scientific": "Bothriechis schlegelii" - }, - { - "name": "Eyelash pit viper", - "scientific": "Bothriechis schlegelii" - }, - { - "name": "Eyelash viper", - "scientific": "Bothriechis schlegelii" - }, - { - "name": "False horned viper", - "scientific": "Pseudocerastes" - }, - { - "name": "Fan-Si-Pan horned pitviper", - "scientific": "Trimeresurus cornutus" - }, - { - "name": "Fea's viper", - "scientific": "Azemiops" - }, - { - "name": "Fifty pacer", - "scientific": "Deinagkistrodon" - }, - { - "name": "Flat-nosed pitviper", - "scientific": "Trimeresurus puniceus" - }, - { - "name": "Godman's pit viper", - "scientific": "Cerrophidion godmani" - }, - { - "name": "Great Lakes bush viper", - "scientific": "Atheris nitschei" - }, - { - "name": "Green palm viper", - "scientific": "Bothriechis lateralis" - }, - { - "name": "Green tree pit viper", - "scientific": "Trimeresurus gramineus" - }, - { - "name": "Guatemalan palm viper", - "scientific": "Bothriechis aurifer" - }, - { - "name": "Guatemalan tree viper", - "scientific": "Bothriechis bicolor" - }, - { - "name": "Hagen's pitviper", - "scientific": "Trimeresurus hageni" - }, - { - "name": "Hairy bush viper", - "scientific": "Atheris hispida" - }, - { - "name": "Himehabu", - "scientific": "Ovophis okinavensis" - }, - { - "name": "Hogg Island boa", - "scientific": "Boa constrictor imperator" - }, - { - "name": "Honduran palm viper", - "scientific": "Bothriechis marchi" - }, - { - "name": "Horned desert viper", - "scientific": "Cerastes cerastes" - }, - { - "name": "Horseshoe pitviper", - "scientific": "Trimeresurus strigatus" - }, - { - "name": "Hundred pacer", - "scientific": "Deinagkistrodon" - }, - { - "name": "Hutton's tree viper", - "scientific": "Tropidolaemus huttoni" - }, - { - "name": "Indian python", - "scientific": "Python molurus" - }, - { - "name": "Indian tree viper", - "scientific": "Trimeresurus gramineus" - }, - { - "name": "Indochinese spitting cobra", - "scientific": "Indochinese spitting cobra" - }, - { - "name": "Indonesian water python", - "scientific": "Liasis mackloti" - }, - { - "name": "Javan spitting cobra", - "scientific": "Javan spitting cobra" - }, - { - "name": "Jerdon's pitviper", - "scientific": "Trimeresurus jerdonii" - }, - { - "name": "Jumping viper", - "scientific": "Atropoides" - }, - { - "name": "Jungle carpet python", - "scientific": "Morelia spilota cheynei" - }, - { - "name": "Kanburian pit viper", - "scientific": "Trimeresurus kanburiensis" - }, - { - "name": "Kaulback's lance-headed pitviper", - "scientific": "Trimeresurus kaulbacki" - }, - { - "name": "Kaznakov's viper", - "scientific": "Vipera kaznakovi" - }, - { - "name": "Kham Plateau pitviper", - "scientific": "Protobothrops xiangchengensis" - }, - { - "name": "Lachesis (genus)", - "scientific": "Lachesis (genus)" - }, - { - "name": "Large-eyed pitviper", - "scientific": "Trimeresurus macrops" - }, - { - "name": "Large-scaled tree viper", - "scientific": "Trimeresurus macrolepis" - }, - { - "name": "Leaf-nosed viper", - "scientific": "Eristicophis" - }, - { - "name": "Leaf viper", - "scientific": "Atheris squamigera" - }, - { - "name": "Levant viper", - "scientific": "Macrovipera lebetina" - }, - { - "name": "Long-nosed viper", - "scientific": "Vipera ammodytes" - }, - { - "name": "Macklot's python", - "scientific": "Liasis mackloti" - }, - { - "name": "Madagascar tree boa", - "scientific": "Sanzinia" - }, - { - "name": "Malabar rock pitviper", - "scientific": "Trimeresurus malabaricus" - }, - { - "name": "Malcolm's tree viper", - "scientific": "Trimeresurus sumatranus malcolmi" - }, - { - "name": "Mandalay cobra", - "scientific": "Mandalay spitting cobra" - }, - { - "name": "Mangrove pit viper", - "scientific": "Trimeresurus purpureomaculatus" - }, - { - "name": "Mangshan pitviper", - "scientific": "Trimeresurus mangshanensis" - }, - { - "name": "McMahon's viper", - "scientific": "Eristicophis" - }, - { - "name": "Mexican palm-pitviper", - "scientific": "Bothriechis rowleyi" - }, - { - "name": "Monocled cobra", - "scientific": "Monocled cobra" - }, - { - "name": "Motuo bamboo pitviper", - "scientific": "Trimeresurus medoensis" - }, - { - "name": "Mozambique spitting cobra", - "scientific": "Mozambique spitting cobra" - }, - { - "name": "Namaqua dwarf adder", - "scientific": "Bitis schneideri" - }, - { - "name": "Namib dwarf sand adder", - "scientific": "Bitis peringueyi" - }, - { - "name": "New Guinea carpet python", - "scientific": "Morelia spilota variegata" - }, - { - "name": "Nicobar bamboo pitviper", - "scientific": "Trimeresurus labialis" - }, - { - "name": "Nitsche's bush viper", - "scientific": "Atheris nitschei" - }, - { - "name": "Nitsche's tree viper", - "scientific": "Atheris nitschei" - }, - { - "name": "Northwestern carpet python", - "scientific": "Morelia spilota variegata" - }, - { - "name": "Nubian spitting cobra", - "scientific": "Nubian spitting cobra" - }, - { - "name": "Oenpelli python", - "scientific": "Oenpelli python" - }, - { - "name": "Olive python", - "scientific": "Liasis olivaceus" - }, - { - "name": "Pallas' viper", - "scientific": "Gloydius halys" - }, - { - "name": "Palm viper", - "scientific": "Bothriechis lateralis" - }, - { - "name": "Papuan python", - "scientific": "Apodora" - }, - { - "name": "Peringuey's adder", - "scientific": "Bitis peringueyi" - }, - { - "name": "Philippine cobra", - "scientific": "Philippine cobra" - }, - { - "name": "Philippine pitviper", - "scientific": "Trimeresurus flavomaculatus" - }, - { - "name": "Pope's tree viper", - "scientific": "Trimeresurus popeorum" - }, - { - "name": "Portuguese viper", - "scientific": "Vipera seoanei" - }, - { - "name": "Puerto Rican boa", - "scientific": "Puerto Rican boa" - }, - { - "name": "Rainbow boa", - "scientific": "Rainbow boa" - }, - { - "name": "Red spitting cobra", - "scientific": "Red spitting cobra" - }, - { - "name": "Rhinoceros viper", - "scientific": "Bitis nasicornis" - }, - { - "name": "Rhombic night adder", - "scientific": "Causus maculatus" - }, - { - "name": "Rinkhals", - "scientific": "Rinkhals" - }, - { - "name": "Rinkhals cobra", - "scientific": "Rinkhals" - }, - { - "name": "River jack", - "scientific": "Bitis nasicornis" - }, - { - "name": "Rough-scaled bush viper", - "scientific": "Atheris hispida" - }, - { - "name": "Rough-scaled python", - "scientific": "Rough-scaled python" - }, - { - "name": "Rough-scaled tree viper", - "scientific": "Atheris hispida" - }, - { - "name": "Royal python", - "scientific": "Ball python" - }, - { - "name": "Rungwe tree viper", - "scientific": "Atheris nitschei rungweensis" - }, - { - "name": "Sakishima habu", - "scientific": "Trimeresurus elegans" - }, - { - "name": "Savu python", - "scientific": "Liasis mackloti savuensis" - }, - { - "name": "Schlegel's viper", - "scientific": "Bothriechis schlegelii" - }, - { - "name": "Schultze's pitviper", - "scientific": "Trimeresurus schultzei" - }, - { - "name": "Sedge viper", - "scientific": "Atheris nitschei" - }, - { - "name": "Sharp-nosed viper", - "scientific": "Deinagkistrodon" - }, - { - "name": "Siamese palm viper", - "scientific": "Trimeresurus puniceus" - }, - { - "name": "Side-striped palm-pitviper", - "scientific": "Bothriechis lateralis" - }, - { - "name": "Snorkel viper", - "scientific": "Deinagkistrodon" - }, - { - "name": "Snouted cobra", - "scientific": "Snouted cobra" - }, - { - "name": "Sonoran sidewinder", - "scientific": "Crotalus cerastes cercobombus" - }, - { - "name": "Southern Indonesian spitting cobra", - "scientific": "Javan spitting cobra" - }, - { - "name": "Southern Philippine cobra", - "scientific": "Samar cobra" - }, - { - "name": "Spiny bush viper", - "scientific": "Atheris hispida" - }, - { - "name": "Spitting cobra", - "scientific": "Spitting cobra" - }, - { - "name": "Spotted python", - "scientific": "Spotted python" - }, - { - "name": "Sri Lankan pit viper", - "scientific": "Trimeresurus trigonocephalus" - }, - { - "name": "Stejneger's bamboo pitviper", - "scientific": "Trimeresurus stejnegeri" - }, - { - "name": "Storm water cobra", - "scientific": "Naja annulata" - }, - { - "name": "Sumatran tree viper", - "scientific": "Trimeresurus sumatranus" - }, - { - "name": "Temple viper", - "scientific": "Tropidolaemus wagleri" - }, - { - "name": "Tibetan bamboo pitviper", - "scientific": "Trimeresurus tibetanus" - }, - { - "name": "Tiger pit viper", - "scientific": "Trimeresurus kanburiensis" - }, - { - "name": "Timor python", - "scientific": "Python timoriensis" - }, - { - "name": "Tokara habu", - "scientific": "Trimeresurus tokarensis" - }, - { - "name": "Tree boa", - "scientific": "Emerald tree boa" - }, - { - "name": "Undulated pit viper", - "scientific": "Ophryacus undulatus" - }, - { - "name": "Ursini's viper", - "scientific": "Vipera ursinii" - }, - { - "name": "Wagler's pit viper", - "scientific": "Tropidolaemus wagleri" - }, - { - "name": "West African brown spitting cobra", - "scientific": "Mozambique spitting cobra" - }, - { - "name": "White-lipped tree viper", - "scientific": "Trimeresurus albolabris" - }, - { - "name": "Wirot's pit viper", - "scientific": "Trimeresurus puniceus" - }, - { - "name": "Yellow-lined palm viper", - "scientific": "Bothriechis lateralis" - }, - { - "name": "Zebra spitting cobra", - "scientific": "Naja nigricincta" - }, - { - "name": "Yarara", - "scientific": "Bothrops jararaca" - }, - { - "name": "Wetar Island python", - "scientific": "Liasis macklot" - }, - { - "name": "Urutus", - "scientific": "Bothrops alternatus" - }, - { - "name": "Titanboa", - "scientific": "Titanoboa" - } -] \ No newline at end of file diff --git a/pysite/migrations/tables/snake_quiz/__init__.py b/pysite/migrations/tables/snake_quiz/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/pysite/migrations/tables/snake_quiz/initial_data.json b/pysite/migrations/tables/snake_quiz/initial_data.json deleted file mode 100644 index 8c426b22..00000000 --- a/pysite/migrations/tables/snake_quiz/initial_data.json +++ /dev/null @@ -1,200 +0,0 @@ -[ - { - "id": 0, - "question": "How long have snakes been roaming the Earth for?", - "options": { - "a": "3 million years", - "b": "30 million years", - "c": "130 million years", - "d": "200 million years" - }, - "answerkey": "c" - }, - { - "id": 1, - "question": "What characteristics do all snakes share?", - "options": { - "a": "They are carnivoes", - "b": "They are all programming languages", - "c": "They're all cold-blooded", - "d": "They are both carnivores and cold-blooded" - }, - "answerkey": "c" - }, - { - "id": 2, - "question": "How do snakes hear?", - "options": { - "a": "With small ears", - "b": "Through their skin", - "c": "Through their tail", - "d": "They don't use their ears at all" - }, - "answerkey": "b" - }, - { - "id": 3, - "question": "What can't snakes see?", - "options": { - "a": "Colour", - "b": "Light", - "c": "Both of the above", - "d": "Other snakes" - }, - "answerkey": "a" - }, - { - "id": 4, - "question": "What unique vision ability do boas and pythons possess?", - "options": { - "a": "Night vision", - "b": "Infrared vision", - "c": "See through walls", - "d": "They don't have vision" - }, - "answerkey": "b" - }, - { - "id": 5, - "question": "How does a snake smell?", - "options": { - "a": "Quite pleasant", - "b": "Through its nose", - "c": "Through its tongues", - "d": "Both through its nose and its tongues" - }, - "answerkey": "d" - }, - { - "id": 6, - "question": "Where are Jacobson's organs located in snakes?", - "options": { - "a": "Mouth", - "b": "Tail", - "c": "Stomach", - "d": "Liver" - }, - "answerkey": "a" - }, - { - "id": 7, - "question": "Snakes have very similar internal organs compared to humans. Snakes, however; lack the following:", - "options": { - "a": "A diaphragm", - "b": "Intestines", - "c": "Lungs", - "d": "Kidney" - }, - "answerkey": "a" - }, - { - "id": 8, - "question": "Snakes have different shaped lungs than humans. What do snakes have?", - "options": { - "a": "An elongated right lung", - "b": "A small left lung", - "c": "Both of the above", - "d": "None of the above" - }, - "answerkey": "c" - }, - { - "id": 9, - "question": "What's true about two-headed snakes?", - "options": { - "a": "They're a myth!", - "b": "They rarely survive in the wild", - "c": "They're very dangerous", - "d": "They can kiss each other" - }, - "answerkey": "b" - }, - { - "id": 10, - "question": "What substance covers a snake's skin?", - "options": { - "a": "Calcium", - "b": "Keratin", - "c": "Copper", - "d": "Iron" - }, - "answerkey": "b" - }, - { - "id": 11, - "question": "What snake doesn't have to have a mate to lay eggs?", - "options": { - "a": "Copperhead", - "b": "Cornsnake", - "c": "Kingsnake", - "d": "Flower pot snake" - }, - "answerkey": "d" - }, - { - "id": 12, - "question": "What snake is the longest?", - "options": { - "a": "Green anaconda", - "b": "Reticulated python", - "c": "King cobra", - "d": "Kingsnake" - }, - "answerkey": "b" - }, - { - "id": 13, - "question": "Though invasive species can now be found in the Everglades, in which three continents are pythons (members of the family Pythonidae) found in the wild?", - "options": { - "a": "Africa, Asia and Australia", - "b": "Africa, Australia and Europe", - "c": "Africa, Australia and South America", - "d": "Africa, Asia and South America" - }, - "answerkey": "a" - }, - { - "id": 14, - "question": "Pythons are held as some of the most dangerous snakes on earth, but are often confused with anacondas. Which of these is *not* a difference between pythons and anacondas?", - "options": { - "a": "Pythons suffocate their prey, anacondas crush them", - "b": "Pythons lay eggs, anacondas give birth to live young", - "c": "Pythons grow longer, anacondas grow heavier", - "d": "Pythons generally spend less time in water than anacondas do" - }, - "answerkey": "a" - }, - { - "id": 15, - "question": "Pythons are unable to chew their food, and so swallow prey whole. Which of these methods is most commonly demonstrated to help a python to swallow large prey?", - "options": { - "a": "The python's stomach pressure is reduced, so prey is sucked in", - "b": "An extra set of upper teeth 'walk' along the prey", - "c": "The python holds its head up, so prey falls into its stomach", - "d": "Prey is pushed against a barrier and is forced down the python's throat" - }, - "answerkey": "b" - }, - { - "id": 16, - "question": "Pythons, like many large constrictors, possess vestigial hind limbs. Whilst these 'spurs' serve no purpose in locomotion, how are they put to use by some male pythons? ", - "options": { - "a": "To store sperm", - "b": "To release pheromones", - "c": "To grip females during mating", - "d": "To fight off rival males" - }, - "answerkey": "c" - }, - { - "id": 17, - "question": "Pythons tend to travel by the rectilinear method (in straight lines) when on land, as opposed to the concertina method (s-shaped movement). Why do large pythons tend not to use the concertina method? ", - "options": { - "a": "Their spine is too inflexible", - "b": "They move too slowly", - "c": "The scales on their backs are too rigid", - "d": "They are too heavy" - }, - "answerkey": "d" - } -] diff --git a/pysite/migrations/tables/special_snakes/__init__.py b/pysite/migrations/tables/special_snakes/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/pysite/migrations/tables/special_snakes/initial_data.json b/pysite/migrations/tables/special_snakes/initial_data.json deleted file mode 100644 index 8159f914..00000000 --- a/pysite/migrations/tables/special_snakes/initial_data.json +++ /dev/null @@ -1,16 +0,0 @@ -[ - { - "name": "Bob Ross", - "info": "Robert Norman Ross (October 29, 1942 – July 4, 1995) was an American painter, art instructor, and television host. He was the creator and host of The Joy of Painting, an instructional television program that aired from 1983 to 1994 on PBS in the United States, and also aired in Canada, Latin America, and Europe.", - "image_list": [ - "https://d3atagt0rnqk7k.cloudfront.net/wp-content/uploads/2016/09/23115633/bob-ross-1-1280x800.jpg" - ] - }, - { - "name": "Mystery Snake", - "info": "The Mystery Snake is rumored to be a thin, serpentine creature that hides in spaghetti dinners. It has yellow, pasta-like scales with a completely smooth texture, and is quite glossy. ", - "image_list": [ - "https://img.thrfun.com/img/080/349/spaghetti_dinner_l1.jpg" - ] - } -] \ No newline at end of file diff --git a/pysite/migrations/tables/users/__init__.py b/pysite/migrations/tables/users/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/pysite/migrations/tables/users/v1.py b/pysite/migrations/tables/users/v1.py deleted file mode 100644 index 9ba70142..00000000 --- a/pysite/migrations/tables/users/v1.py +++ /dev/null @@ -1,11 +0,0 @@ -def run(db, table, table_obj): - """ - Remove stored email addresses from every user document - """ - - for document in db.get_all(table): - if "email" in document: - del document["email"] - - db.insert(table, document, conflict="update", durability="soft") - db.sync(table) diff --git a/pysite/migrations/tables/users/v2.py b/pysite/migrations/tables/users/v2.py deleted file mode 100644 index 820d0d6d..00000000 --- a/pysite/migrations/tables/users/v2.py +++ /dev/null @@ -1,11 +0,0 @@ -def run(db, table, table_obj): - """ - Remove stored email addresses from every user document - "apparently `update` doesn't update" update - """ - - for document in db.get_all(table): - if "email" in document: - del document["email"] - - db.insert(table, document, conflict="replace", durability="soft") - db.sync(table) diff --git a/pysite/migrations/tables/wiki/__init__.py b/pysite/migrations/tables/wiki/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/pysite/migrations/tables/wiki/v1.py b/pysite/migrations/tables/wiki/v1.py deleted file mode 100644 index 22670342..00000000 --- a/pysite/migrations/tables/wiki/v1.py +++ /dev/null @@ -1,11 +0,0 @@ -def run(db, table, table_obj): - """ - Ensure that there are no wiki articles that don't have titles - """ - - for document in db.pluck(table, table_obj.primary_key, "title"): - if not document.get("title"): - document["title"] = "No Title" - - db.insert(table, document, conflict="update", durability="soft") - db.sync(table) diff --git a/pysite/mixins.py b/pysite/mixins.py deleted file mode 100644 index 98528891..00000000 --- a/pysite/mixins.py +++ /dev/null @@ -1,214 +0,0 @@ -from typing import Any, Dict -from weakref import ref - -from flask import Blueprint -from kombu import Connection -from rethinkdb.ast import Table - -from pysite.constants import ( - BOT_EVENT_QUEUE, BotEventTypes, - RMQ_HOST, RMQ_PASSWORD, RMQ_PORT, RMQ_USERNAME -) -from pysite.database import RethinkDB -from pysite.oauth import OAuthBackend - - -BOT_EVENT_REQUIRED_PARAMS = { - "mod_log": ("level", "title", "message"), - "send_message": ("target", "message"), - "send_embed": ("target",), - "add_role": ("target", "role_id", "reason"), - "remove_role": ("target", "role_id", "reason") -} - - -class DBMixin: - """ - Mixin for classes that make use of RethinkDB. It can automatically create a table with the specified primary - key using the attributes set at class-level. - - This class is intended to be mixed in alongside one of the other view classes. For example: - - >>> class MyView(APIView, DBMixin): - ... name = "my_view" # Flask internal name for this route - ... path = "/my_view" # Actual URL path to reach this route - ... table_name = "my_table" # Name of the table to create - ... table_primary_key = "username" # Primary key to set for this table - - This class will also work with Websockets: - - >>> class MyWebsocket(WS, DBMixin): - ... name = "my_websocket" - ... path = "/my_websocket" - ... table_name = "my_table" - ... table_primary_key = "username" - - You may omit `table_primary_key` and it will be defaulted to RethinkDB's default column - "id". - """ - - table_name = "" # type: str - table_primary_key = "id" # type: str - - @classmethod - def setup(cls: "DBMixin", manager: "pysite.route_manager.RouteManager", blueprint: Blueprint): - """ - Set up the view by creating the table specified by the class attributes - this will also deal with multiple - inheritance by calling `super().setup()` as appropriate. - - :param manager: Instance of the current RouteManager (used to get a handle for the database object) - :param blueprint: Current Flask blueprint - """ - - if hasattr(super(), "setup"): - super().setup(manager, blueprint) # pragma: no cover - - cls._db = ref(manager.db) - - @property - def table(self) -> Table: - return self.db.query(self.table_name) - - @property - def db(self) -> RethinkDB: - return self._db() - - -class RMQMixin: - """ - Mixin for classes that make use of RabbitMQ. It allows routes to send JSON-encoded messages to specific RabbitMQ - queues. - - This class is intended to be mixed in alongside one of the other view classes. For example: - - >>> class MyView(APIView, RMQMixin): - ... name = "my_view" # Flask internal name for this route - ... path = "/my_view" # Actual URL path to reach this route - ... queue_name = "my_queue" # Name of the RabbitMQ queue to send on - - Note that the queue name is optional if all you want to do is send bot events. - - This class will also work with Websockets: - - >>> class MyWebsocket(WS, RMQMixin): - ... name = "my_websocket" - ... path = "/my_websocket" - ... queue_name = "my_queue" - """ - - queue_name = "" - - @classmethod - def setup(cls: "RMQMixin", manager: "pysite.route_manager.RouteManager", blueprint: Blueprint): - """ - Set up the view by calling `super().setup()` as appropriate. - - :param manager: Instance of the current RouteManager (used to get a handle for the database object) - :param blueprint: Current Flask blueprint - """ - - if hasattr(super(), "setup"): - super().setup(manager, blueprint) # pragma: no cover - - @property - def rmq_connection(self) -> Connection: - """ - Get a Kombu AMQP connection object - use this in a context manager so that it gets closed after you're done - - If you're just trying to send a message, check out `rmq_send` and `rmq_bot_event` instead. - """ - - return Connection(hostname=RMQ_HOST, userid=RMQ_USERNAME, password=RMQ_PASSWORD, port=RMQ_PORT) - - def rmq_send(self, data: Dict[str, Any], routing_key: str = None): - """ - Send some data to the RabbitMQ queue - - >>> self.rmq_send({ - ... "text": "My hovercraft is full of eels!", - ... "source": "Dirty Hungarian Phrasebook" - ... }) - ... - - This will be delivered to the queue immediately. - """ - - if routing_key is None: - routing_key = self.queue_name - - with self.rmq_connection as c: - producer = c.Producer() - producer.publish(data, routing_key=routing_key) - - def rmq_bot_event(self, event_type: BotEventTypes, data: Dict[str, Any]): - """ - Send an event to the queue responsible for delivering events to the bot - - >>> self.rmq_bot_event(BotEventTypes.send_message, { - ... "channel": CHANNEL_MOD_LOG, - ... "message": "This is a plain-text message for @everyone, from the site!" - ... }) - ... - - This will be delivered to the bot and actioned immediately, or when the bot comes online if it isn't already - connected. - """ - - if not isinstance(event_type, BotEventTypes): - raise ValueError("`event_type` must be a member of the the `pysite.constants.BotEventTypes` enum") - - event_type = event_type.value - required_params = BOT_EVENT_REQUIRED_PARAMS[event_type] - - for param in required_params: - if param not in data: - raise KeyError(f"Event is missing required parameter: {param}") - - return self.rmq_send( - {"event": event_type, "data": data}, - routing_key=BOT_EVENT_QUEUE, - ) - - -class OAuthMixin: - """ - Mixin for the classes that need access to a logged in user's information. This class should be used - to grant route's access to user information, such as name, email, id, ect. - - There will almost never be a need for someone to inherit this, as BaseView does that for you. - - This class will add 3 properties to your route: - - * logged_in (bool): True if user is registered with the site, False else wise. - - * user_data (dict): A dict that looks like this: - - { - "user_id": Their discord ID, - "username": Their discord username (without discriminator), - "discriminator": Their discord discriminator, - "email": Their email, in which is connected to discord - } - - user_data returns None, if the user isn't logged in. - - * oauth (OAuthBackend): The instance of pysite.oauth.OAuthBackend, connected to the RouteManager. - """ - - @classmethod - def setup(cls: "OAuthMixin", manager: "pysite.route_manager.RouteManager", blueprint: Blueprint): - if hasattr(super(), "setup"): - super().setup(manager, blueprint) # pragma: no cover - - cls._oauth = ref(manager.oauth_backend) - - @property - def logged_in(self) -> bool: - return self.user_data is not None - - @property - def user_data(self) -> dict: - return self.oauth.user_data() - - @property - def oauth(self) -> OAuthBackend: - return self._oauth() diff --git a/pysite/oauth.py b/pysite/oauth.py deleted file mode 100644 index 86e7cdde..00000000 --- a/pysite/oauth.py +++ /dev/null @@ -1,86 +0,0 @@ -import logging -from uuid import uuid4, uuid5 - -from flask import session -from flask_dance.consumer.backend import BaseBackend -from flask_dance.contrib.discord import discord - -from pysite.constants import DISCORD_API_ENDPOINT, OAUTH_DATABASE - - -class OAuthBackend(BaseBackend): - """ - This is the backend for the oauth - - This is used to manage users that have completed - an oauth dance. It contains 3 functions, get, set, - and delete, however we only use set. - - Inherits: - flake_dance.consumer.backend.BaseBackend - pysite.mixins.DBmixin - - Properties: - key: The app's secret, we use it too make session IDs - """ - - def __init__(self, manager): - super().__init__() - self.db = manager.db - self.key = manager.app.secret_key - self.db.create_table(OAUTH_DATABASE, primary_key="id") - - def get(self, *args, **kwargs): # Not used - pass - - def set(self, blueprint, token): - user = self.get_user() - sess_id = str(uuid5(uuid4(), self.key)) - self.add_user(token, user, sess_id) - - def delete(self, blueprint): # Not used - pass - - def add_user(self, token_data: dict, user_data: dict, session_id: str): - session["session_id"] = session_id - - self.db.insert( - OAUTH_DATABASE, - { - "id": session_id, - "access_token": token_data["access_token"], - "refresh_token": token_data["refresh_token"], - "expires_at": token_data["expires_at"], - "snowflake": user_data["id"] - }, - conflict="replace" - ) - - self.db.insert( - "users", - { - "user_id": user_data["id"], - "username": user_data["username"], - "discriminator": user_data["discriminator"] - }, - conflict="update" - ) - - def get_user(self) -> dict: - resp = discord.get(DISCORD_API_ENDPOINT + "/users/@me") # 'discord' is a request.Session with oauth information - if resp.status_code != 200: - logging.warning("Unable to get user information: " + str(resp.json())) - return resp.json() - - def user_data(self): - user_id = session.get("session_id") - if user_id: # If the user is logged in, get user info. - creds = self.db.get(OAUTH_DATABASE, user_id) - if creds: - return self.db.get("users", creds["snowflake"]) - - def logout(self): - sess_id = session.get("session_id") - if sess_id and self.db.get(OAUTH_DATABASE, sess_id): # If user exists in db, - self.db.delete(OAUTH_DATABASE, sess_id) # remove them (at least, their session) - session.clear() diff --git a/pysite/queues.py b/pysite/queues.py deleted file mode 100644 index 7a200208..00000000 --- a/pysite/queues.py +++ /dev/null @@ -1,5 +0,0 @@ -from kombu import Queue - -QUEUES = { # RabbitMQ Queue definitions, they'll be declared at gunicorn start time - "bot_events": Queue("bot_events", durable=True) -} diff --git a/pysite/route_manager.py b/pysite/route_manager.py deleted file mode 100644 index 79fb67ac..00000000 --- a/pysite/route_manager.py +++ /dev/null @@ -1,146 +0,0 @@ -import importlib -import inspect -import logging -import os - -from flask import Blueprint, Flask, _request_ctx_stack -from flask_dance.contrib.discord import make_discord_blueprint -from flask_sockets import Sockets -from gunicorn_config import _when_ready as when_ready - -from pysite.base_route import APIView, BaseView, ErrorView, RedirectView, RouteView, TemplateView -from pysite.constants import ( - CSRF, DEBUG_MODE, DISCORD_OAUTH_AUTHORIZED, DISCORD_OAUTH_ID, DISCORD_OAUTH_REDIRECT, - DISCORD_OAUTH_SCOPE, DISCORD_OAUTH_SECRET, PREFERRED_URL_SCHEME) -from pysite.database import RethinkDB -from pysite.oauth import OAuthBackend -from pysite.websockets import WS - -TEMPLATES_PATH = "../templates" -STATIC_PATH = "../static" - - -class RouteManager: - def __init__(self): - - # Set up the app and the database - self.app = Flask( - __name__, template_folder=TEMPLATES_PATH, static_folder=STATIC_PATH, static_url_path="/static", - ) - self.sockets = Sockets(self.app) - - self.db = RethinkDB() - self.log = logging.getLogger(__name__) - self.app.secret_key = os.environ.get("WEBPAGE_SECRET_KEY", "super_secret") - self.app.config["SERVER_NAME"] = os.environ.get("SERVER_NAME", "pythondiscord.local:8080") - self.app.config["PREFERRED_URL_SCHEME"] = PREFERRED_URL_SCHEME - self.app.config["WTF_CSRF_CHECK_DEFAULT"] = False # We only want to protect specific routes - - # Trim blocks so that {% block %} statements in templates don't generate blank lines - self.app.jinja_env.trim_blocks = True - self.app.jinja_env.lstrip_blocks = True - - # We make the token valid for the lifetime of the session because of the wiki - you might spend some - # time editing an article, and it seems that session lifetime is a good analogue for how long you have - # to edit - self.app.config["WTF_CSRF_TIME_LIMIT"] = None - - if DEBUG_MODE: - # Migrate the database, as we would in prod - when_ready(output_func=self.db.log.info) - - self.app.before_request(self.db.before_request) - self.app.teardown_request(self.db.teardown_request) - - CSRF.init_app(self.app) # Set up CSRF protection - - # Load the oauth blueprint - self.oauth_backend = OAuthBackend(self) - self.oauth_blueprint = make_discord_blueprint( - DISCORD_OAUTH_ID, - DISCORD_OAUTH_SECRET, - DISCORD_OAUTH_SCOPE, - login_url=DISCORD_OAUTH_REDIRECT, - authorized_url=DISCORD_OAUTH_AUTHORIZED, - redirect_to="main.auth.done", - backend=self.oauth_backend - ) - self.log.debug(f"Loading Blueprint: {self.oauth_blueprint.name}") - self.app.register_blueprint(self.oauth_blueprint) - self.log.debug("") - - # Load the main blueprint - self.main_blueprint = Blueprint("main", __name__) - self.log.debug(f"Loading Blueprint: {self.main_blueprint.name}") - self.load_views(self.main_blueprint, "pysite/views/main") - self.load_views(self.main_blueprint, "pysite/views/error_handlers") - self.app.register_blueprint(self.main_blueprint) - self.log.debug("") - - # Load the subdomains - self.subdomains = ["api", "staff", "wiki"] - - for sub in self.subdomains: - try: - sub_blueprint = Blueprint(sub, __name__, subdomain=sub) - self.log.debug(f"Loading Blueprint: {sub_blueprint.name}") - self.load_views(sub_blueprint, f"pysite/views/{sub}") - self.app.register_blueprint(sub_blueprint) - except Exception: - logging.getLogger(__name__).exception(f"Failed to register blueprint for subdomain: {sub}") - - # Load the websockets - self.ws_blueprint = Blueprint("ws", __name__) - - self.log.debug("Loading websocket routes...") - self.load_views(self.ws_blueprint, "pysite/views/ws") - self.sockets.register_blueprint(self.ws_blueprint, url_prefix="/ws") - - self.app.before_request(self.https_fixing_hook) # Try to fix HTTPS issues - - def https_fixing_hook(self): - """ - Attempt to fix HTTPS issues by modifying the request context stack - """ - - if _request_ctx_stack is not None: - reqctx = _request_ctx_stack.top - reqctx.url_adapter.url_scheme = PREFERRED_URL_SCHEME - - def run(self): - from gevent.pywsgi import WSGIServer - from geventwebsocket.handler import WebSocketHandler - - server = WSGIServer( - ("0.0.0.0", int(os.environ.get("WEBPAGE_PORT", 8080))), # noqa: B104, S104 - self.app, handler_class=WebSocketHandler - ) - server.serve_forever() - - def load_views(self, blueprint, location="pysite/views"): - for filename in os.listdir(location): - if os.path.isdir(f"{location}/{filename}"): - # Recurse if it's a directory; load ALL the views! - self.load_views(blueprint, location=f"{location}/{filename}") - continue - - if filename.endswith(".py") and not filename.startswith("__init__"): - module = importlib.import_module(f"{location}/{filename}".replace("/", ".")[:-3]) - - for cls_name, cls in inspect.getmembers(module): - if ( - inspect.isclass(cls) and - cls is not BaseView and - cls is not ErrorView and - cls is not RouteView and - cls is not APIView and - cls is not WS and - cls is not TemplateView and - cls is not RedirectView and - ( - BaseView in cls.__mro__ or - WS in cls.__mro__ - ) - ): - cls.setup(self, blueprint) - self.log.debug(f">> View loaded: {cls.name: <15} ({module.__name__}.{cls_name})") diff --git a/pysite/rst/__init__.py b/pysite/rst/__init__.py deleted file mode 100644 index e58fbe8c..00000000 --- a/pysite/rst/__init__.py +++ /dev/null @@ -1,108 +0,0 @@ -import re - -from docutils.core import publish_parts -from docutils.parsers.rst.directives import register_directive -from docutils.parsers.rst.roles import register_canonical_role - -from pysite.rst.directives import ButtonDirective -from pysite.rst.roles import fira_code_role, icon_role, page_role, url_for_role - -RST_TEMPLATE = """.. contents:: - -{0}""" - -CONTENTS_REGEX = re.compile(r"""
(.*?)
""", re.DOTALL) -HREF_REGEX = re.compile(r"""(.*?)""") - -TABLE_FRAGMENT = """""" - - -def render(rst: str, link_headers=True): - if link_headers: - rst = RST_TEMPLATE.format(rst) - - html = publish_parts( - source=rst, writer_name="html5", settings_overrides={ - "halt_level": 2, "syntax_highlight": "short", "initial_header_level": 3 - } - )["html_body"] - - data = { - "html": html, - "headers": [] - } - - if link_headers: - match = CONTENTS_REGEX.search(html) # Find the contents HTML - - if match: - data["html"] = html.replace(match.group(0), "") # Remove the contents from the document HTML - depth = 0 - headers = [] - current_header = {} - - group = match.group(1) - - # Sanitize the output so we can more easily parse it - group = group.replace("
  • ", "
  • \n") - group = group.replace("
  • ", "\n") - group = group.replace("

    ", "

    \n") - group = group.replace("

    ", "\n

    ") - - for line in group.split("\n"): - line = line.strip() # Remove excess whitespace - - if not line: # Nothing to process - continue - - if line.startswith("
  • ") and depth <= 2: - # We've found a header, or the start of a header group - depth += 1 - elif line.startswith("
  • ") and depth >= 0: - # That's the end of a header or header group - - if depth == 1: - # We just dealt with an entire header group, so store it - headers.append(current_header.copy()) # Store a copy, since we're clearing the dict - current_header.clear() - - depth -= 1 - elif line.startswith(" ", "  ") - - current_header["title"] = title - else: # Second-level (or deeper) header, should be stored in a list of sub-headers - sub_headers = current_header.get("sub_headers", []) - title = match.group(2) - - if title.startswith(" ", "  ") - - sub_headers.append({ - "id": match.group(1), - "title": title - }) - current_header["sub_headers"] = sub_headers - - data["headers"] = headers - - data["html"] = data["html"].replace("
    ", TABLE_FRAGMENT) # Style the tables properly - - return data - - -register_canonical_role("fira_code", fira_code_role) -register_canonical_role("icon", icon_role) -register_canonical_role("page", page_role) -register_canonical_role("url_for", url_for_role) - -register_directive("button", ButtonDirective) diff --git a/pysite/rst/directives/__init__.py b/pysite/rst/directives/__init__.py deleted file mode 100644 index b4359200..00000000 --- a/pysite/rst/directives/__init__.py +++ /dev/null @@ -1,65 +0,0 @@ -from docutils import nodes -from docutils.parsers.rst import Directive -from docutils.parsers.rst.directives import unchanged, unchanged_required -from flask import url_for -from jinja2 import escape - -BUTTON_TYPES = ("default", "primary", "secondary", "danger", "darkish", "darker") - -ICON_WEIGHT_TABLE = { - "light": "fal", - "regular": "far", - "solid": "fas", - "branding": "fab" -} -ICON_WEIGHTS = tuple(ICON_WEIGHT_TABLE.values()) - - -class ButtonDirective(Directive): - has_content = True - - option_spec = { - "icon": unchanged_required, - "text": unchanged_required, - "type": unchanged, - "url": unchanged, - } - - def run(self): - icon = self.options.get("icon", "") - button_type = self.options.get("type", "primary") - - text = self.options["text"] - url = self.options["url"] - - if icon: - parts = [escape(x) for x in icon.split("/")] - - if len(parts) != 2: - raise self.error("Icon specification must be in the form /") - elif parts: - weight = parts[0] - - if weight not in ICON_WEIGHTS: - weight = ICON_WEIGHT_TABLE.get(weight) - - if not weight: - raise self.error( - "Icon type must be one of light, regular, solid or " - "branding, or a font-awesome weight class" - ) - - icon_html = f"""""" - else: - icon_html = "" - - if button_type not in BUTTON_TYPES: - self.error(f"Button type must be one of {', '.join(BUTTON_TYPES[:-1])} or {[-1]}") - - if url.startswith("flask://"): - url = url_for(url.split("://", 1)[1]) - elif url.startswith("wiki://"): - url = url_for("wiki.page", page=url.split("://", 1)[1]) - html = f"""{icon_html}  {text}""" - - return [nodes.raw(html, html, format="html", **{})] diff --git a/pysite/rst/roles.py b/pysite/rst/roles.py deleted file mode 100644 index d83f07f9..00000000 --- a/pysite/rst/roles.py +++ /dev/null @@ -1,125 +0,0 @@ -from docutils import nodes -from docutils.parsers.rst.roles import set_classes -from docutils.parsers.rst.states import Inliner -from flask import url_for -from jinja2 import escape - - -def icon_role(_role: str, rawtext: str, text: str, lineno: int, inliner: Inliner, - options: dict = None, _content: dict = None): - if options is None: - options = {} - - set_classes(options) - - if "/" in text: - parts = [escape(x) for x in text.split("/")] - else: - msg = inliner.reporter.error("Icon specification must be in the form /", line=lineno) - prb = inliner.problematic(text, rawtext, msg) - - return [prb], [msg] - - if len(parts) != 2: - msg = inliner.reporter.error("Icon specification must be in the form /", line=lineno) - prb = inliner.problematic(text, rawtext, msg) - - return [prb], [msg] - else: - if parts[0] == "light": - weight = "fal" - elif parts[0] == "regular": - weight = "far" - elif parts[0] == "solid": - weight = "fas" - elif parts[0] == "branding": - weight = "fab" - else: - msg = inliner.reporter.error("Icon type must be one of light, regular, solid or branding", line=lineno) - prb = inliner.problematic(text, rawtext, msg) - - return [prb], [msg] - - html = f"""""" - - node = nodes.raw(html, html, format="html", **options) - return [node], [] - - -def url_for_role(_role: str, rawtext: str, text: str, lineno: int, inliner: Inliner, - options: dict = None, _content: dict = None): - if options is None: - options = {} - - set_classes(options) - - if "/" in text: - parts = [escape(x) for x in text.split("/")] - else: - msg = inliner.reporter.error("URL specification must be in the form /", line=lineno) - prb = inliner.problematic(text, rawtext, msg) - - return [prb], [msg] - - if len(parts) != 2: - msg = inliner.reporter.error("URL specification must be in the form /", line=lineno) - prb = inliner.problematic(text, rawtext, msg) - - return [prb], [msg] - else: - try: - url = url_for(parts[0]) - name = parts[1] - - html = f"""{name}""" - - node = nodes.raw(html, html, format="html", **options) - return [node], [] - except Exception as e: - msg = inliner.reporter.error(str(e), line=lineno) - prb = inliner.problematic(text, rawtext, msg) - - return [prb], [msg] - - -def page_role(_role: str, rawtext: str, text: str, lineno: int, inliner: Inliner, - options: dict = None, _content: dict = None): - if options is None: - options = {} - - set_classes(options) - - if "/" in text: - parts = [escape(x) for x in text.rsplit("/", 1)] - else: - msg = inliner.reporter.error("Page specification must be in the form /", line=lineno) - prb = inliner.problematic(text, rawtext, msg) - - return [prb], [msg] - - try: - url = url_for("wiki.page", page=parts[0]) - name = parts[1] - - html = f"""{name}""" - - node = nodes.raw(html, html, format="html", **options) - return [node], [] - except Exception as e: - msg = inliner.reporter.error(str(e), line=lineno) - prb = inliner.problematic(text, rawtext, msg) - - return [prb], [msg] - - -def fira_code_role(_role: str, rawtext: str, text: str, lineno: int, inliner: Inliner, - options: dict = None, _content: dict = None): - if options is None: - options = {} - - set_classes(options) - - html = f"""{text}""" - node = nodes.raw(html, html, format="html", **options) - - return [node], [] diff --git a/pysite/service_discovery.py b/pysite/service_discovery.py deleted file mode 100644 index a03341c4..00000000 --- a/pysite/service_discovery.py +++ /dev/null @@ -1,26 +0,0 @@ -import datetime -import socket -import time -from contextlib import closing - -from pysite.constants import RMQ_HOST, RMQ_PORT - -THIRTY_SECONDS = datetime.timedelta(seconds=30) - - -def wait_for_rmq(): - start = datetime.datetime.now() - - while True: - if datetime.datetime.now() - start > THIRTY_SECONDS: - return False - - with closing(socket.socket(socket.AF_INET, socket.SOCK_STREAM)) as sock: - try: - state = sock.connect_ex((RMQ_HOST, RMQ_PORT)) - if state == 0: - return True - except socket.gaierror: - pass - - time.sleep(0.5) diff --git a/pysite/tables.py b/pysite/tables.py deleted file mode 100644 index 65a4db16..00000000 --- a/pysite/tables.py +++ /dev/null @@ -1,292 +0,0 @@ -from typing import List, NamedTuple - - -class Table(NamedTuple): - primary_key: str - keys: List[str] - locked: bool = True - - -TABLES = { - "bot_events": Table( # Events to be sent to the bot via websocket - primary_key="id", - keys=sorted([ - "id", - "data" - ]) - ), - - "clean_logs": Table( # Logs of cleanups done by the clean bot commands - primary_key="id", - keys=sorted([ - "id", - "log_data" - ]) - ), - - "hiphopify": Table( # Users in hiphop prison - primary_key="user_id", - keys=sorted([ - "user_id", - "end_timestamp", - "forced_nick" - ]) - ), - - "hiphopify_namelist": Table( # Names and images of hiphop artists - primary_key="name", - keys=sorted([ - "name", - "image_url" - ]), - locked=False - ), - - "code_jams": Table( # Information about each code jam - primary_key="number", - keys=sorted([ - "date_end", # datetime - "date_start", # datetime - "end_html", # str - "end_rst", # str - "info_rst", # str - "info_html", # str - "number", # int - "participants", # list[str] - "repo", # str - "state", # str - "task_html", # str - "task_rst", # str - "teams", # list[str] - "theme", # str - "title", # str - "winning_team" # str - ]) - ), - - "code_jam_forms": Table( # Application forms for each jam - primary_key="number", - keys=sorted([ - "number", # int - "preamble_rst", # str - "preamble_html", # str - "questions" # list[dict[str, str]] {title, type, input_type, options?} - ]) - ), - - "code_jam_questions": Table( # Application form questions - primary_key="id", - keys=sorted([ - "data", # dict - "id", # uuid - "optional", # bool - "title", # str - "type", # str - ]) - ), - - "code_jam_responses": Table( # Application form responses - primary_key="id", - keys=sorted([ - "id", # uuid - "snowflake", # str - "jam", # int - "answers", # list [{question, answer, metadata}] - "approved" # bool - ]) - ), - - "code_jam_teams": Table( # Teams for each jam - primary_key="id", - keys=sorted([ - "id", # uuid - "name", # str - "members", # list[str] - "repo", # str - "jam" # int - ]) - ), - - "code_jam_infractions": Table( # Individual infractions for each user - primary_key="id", - keys=sorted([ - "id", # uuid - "participant", # str - "reason", # str - "number", # int (optionally -1 for permanent) - "decremented_for" # list[int] - ]) - ), - - "code_jam_participants": Table( # Info for each participant - primary_key="id", - keys=sorted([ - "id", # str - "gitlab_username", # str - "timezone" # str - ]) - ), - - "member_chunks": Table( - primary_key="id", - keys=sorted([ - "id", # str - "chunk", # list - ]) - ), - - "oauth_data": Table( # OAuth login information - primary_key="id", - keys=sorted([ - "id", - "access_token", - "expires_at", - "refresh_token", - "snowflake" - ]) - ), - - "off_topic_names": Table( # Names for the off-topic category channels - primary_key="name", - keys=("name",), - locked=False - ), - - "snake_facts": Table( # Snake facts - primary_key="fact", - keys=sorted([ - "fact" - ]), - locked=False - ), - - "snake_idioms": Table( # Snake idioms - primary_key="idiom", - keys=sorted([ - "idiom" - ]), - locked=False - ), - - "snake_names": Table( # Snake names - primary_key="name", - keys=sorted([ - "name", - "scientific" - ]), - locked=False - ), - - "snake_quiz": Table( # Snake questions and answers - primary_key="id", - keys=sorted([ - "id", - "question", - "options", - "answerkey" - ]), - locked=False - ), - - "special_snakes": Table( # Special case snakes for the snake converter - primary_key="name", - keys=sorted([ - "name", - "info", - "image_list", - ]), - locked=False - ), - - "tags": Table( # Tag names and values - primary_key="tag_name", - keys=sorted([ - "tag_name", - "tag_content" - ]), - locked=False - ), - - "users": Table( # Users from the Discord server - primary_key="user_id", - keys=sorted([ - "avatar", - "user_id", - "roles", - "username", - "discriminator" - ]) - ), - - "wiki": Table( # Wiki articles - primary_key="slug", - keys=sorted([ - "slug", - "headers", - "html", - "rst", - "text", - "title" - ]) - ), - - "wiki_revisions": Table( # Revisions of wiki articles - primary_key="id", - keys=sorted([ - "id", - "date", - "post", - "slug", - "user" - ]) - ), - - "_versions": Table( # Table migration versions - primary_key="table", - keys=sorted([ - "table", - "version" - ]) - ), - - "pydoc_links": Table( # pydoc_links - primary_key="package", - keys=sorted([ - "base_url", - "inventory_url", - "package" - ]), - locked=False - ), - - "bot_settings": Table( - primary_key="key", - keys=sorted([ - "key", # str - "value" # any - ]) - ), - - "bot_infractions": Table( - primary_key="id", - keys=sorted([ - "id", # str - "user_id", # str - "actor_id", # str - "reason", # str - "type", # str - "inserted_at", # datetime - "expires_at", # datetime - "closed", # bool - "legacy_rowboat_id" # str - ]) - ), - - "watched_users": Table( # Users being monitored by the bot's BigBrother cog - primary_key="user_id", - keys=sorted([ - "user_id", - "channel_id" - ]) - ) -} diff --git a/pysite/utils/time.py b/pysite/utils/time.py deleted file mode 100644 index 334408a4..00000000 --- a/pysite/utils/time.py +++ /dev/null @@ -1,62 +0,0 @@ -from datetime import datetime, timedelta - -from rethinkdb import make_timezone - - -UNITS = { - 's': lambda value: value, - 'm': lambda value: value * 60, - 'h': lambda value: value * 60 * 60, - 'd': lambda value: value * 60 * 60 * 24, - 'w': lambda value: value * 60 * 60 * 24 * 7 -} - - -def parse_duration(duration: str) -> datetime: - """ - Parses a string like '3w' into a datetime 3 weeks from now. - - Also supports strings like 1w2d or 1h25m. - - This function is adapted from a bot called ROWBOAT, written by b1naryth1ef. - See https://github.com/b1naryth1ef/rowboat/blob/master/rowboat/util/input.py - - :param duration: a string containing the number and a time unit shorthand. - :return: A datetime representing now + the duration - """ - - if not duration: - raise ValueError("No duration provided.") - - value = 0 - digits = '' - - for char in duration: - - # Add all numbers to the digits string - if char.isdigit(): - digits += char - continue - - # If it's not a number and not one of the letters in UNITS, it must be invalid. - if char not in UNITS or not digits: - raise ValueError("Invalid duration") - - # Otherwise, call the corresponding lambda to convert the value, and keep iterating. - value += UNITS[char](int(digits)) - digits = '' - - return datetime.now(make_timezone("00:00")) + timedelta(seconds=value + 1) - - -def is_expired(rdb_datetime: datetime) -> bool: - """ - Takes a rethinkdb datetime (timezone aware) and - figures out if it has expired yet. - - Always compares with UTC 00:00 - - :param rdb_timestamp: A datetime as stored in rethinkdb. - :return: True if the datetime is in the past. - """ - return datetime.now(make_timezone("00:00")) > rdb_datetime diff --git a/pysite/utils/words.py b/pysite/utils/words.py deleted file mode 100644 index 0959ec3e..00000000 --- a/pysite/utils/words.py +++ /dev/null @@ -1,73 +0,0 @@ -import random -from typing import Iterator, List, Tuple - -adjectives = ( - "abortive", "abounding", "abrasive", "absent", "acceptable", "adamant", "adhesive", "adjoining", "aggressive", - "alike", "alleged", "aloof", "ambitious", "amused", "aspiring", "available", "awake", "axiomatic", "barbarous", - "bashful", "beautiful", "befitting", "beneficial", "blushing", "boundless", "brawny", "certain", "childlike", - "cluttered", "courageous", "crooked", "damp", "deadpan", "debonair", "decorous", "defiant", "delirious", - "detailed", "disturbed", "divergent", "drab", "dramatic", "drunk", "electric", "enormous", "erect", "evanescent", - "excellent", "exultant", "faded", "famous", "far-flung", "fascinated", "faulty", "festive", "fine", "fixed", - "flaky", "flat", "fluttering", "foregoing", "frail", "fresh", "frightened", "funny", "furtive", "gainful", "glib", - "godly", "half", "hallowed", "handsome", "hard", "heavenly", "hesitant", "high", "honorable", "hot", "hungry", - "hurt", "hushed", "hypnotic", "ill-fated", "illegal", "important", "incompetent", "inconclusive", "infamous", - "innocent", "insidious", "instinctive", "jazzy", "jumbled", "kind", "knowing", "late", "laughable", "lean", - "loving", "madly", "majestic", "married", "materialistic", "measly", "mighty", "misty", "murky", "mushy", - "mysterious", "needy", "next", "nice", "nondescript", "nutritious", "omniscient", "ossified", "overconfident", - "panoramic", "parallel", "parched", "pastoral", "plant", "possible", "pricey", "prickly", "private", "productive", - "pumped", "purple", "purring", "quixotic", "rabid", "rare", "real", "receptive", "resolute", "right", "rightful", - "ritzy", "rough", "ruddy", "rude", "salty", "sassy", "satisfying", "scandalous", "sedate", "selective", "separate", - "shrill", "sincere", "slow", "small", "smooth", "sordid", "sour", "spicy", "spiky", "spiteful", "spooky" "spotty", - "steady", "subdued", "successful", "supreme", "sweltering", "synonymous", "talented", "tasty", "teeny", "telling", - "temporary", "tender", "tense", "tenuous", "thinkable", "thoughtless", "tiny", "tough", "trashy", "two", - "uncovered", "uninterested", "unruly", "unsuitable", "used", "useful", "vagabond", "verdant", "vivacious", - "voiceless", "waggish", "wasteful", "wealthy", "whole", "wise", "woebegone", "workable", "wrong", "young", -) - -nouns = ( - "actions", "activities", "additions", "advertisements", "afterthoughts", "airplanes", "amounts", "angles", "ants", - "baskets", "baths", "battles", "bees", "beginners", "behaviors", "beliefs", "bells", "berries", "bikes", - "birthdays", "bits", "boats", "boys", "breaths", "bubbles", "bulbs", "bursts", "butter", "cables", "camps", "cans", - "captions", "cars", "carpenters", "cats", "cemeteries", "changes", "channels", "chickens", "classes", "clubs", - "committees", "covers", "cracks", "crates", "crayons", "crowds", "decisions", "degrees", "details", "directions", - "dresses", "drops", "dusts", "errors", "examples", "expansions", "falls", "fangs", "feelings", "firemen", - "flowers", "fog", "feet", "fowls", "frogs", "glasses", "gloves", "grandmothers", "grounds", "guns", "haircuts", - "halls", "harmonies", "hats", "hopes", "horns", "horses", "ideas", "inks", "insects", "interests", "inventions", - "irons", "islands", "jails", "jeans", "jellyfish", "laborers", "lakes", "letters", "lockets", "matches", "measures", - "mice", "milk", "motions", "moves", "nerves", "numbers", "pans", "pancakes", "persons", "pets", "pickles", "pies", - "pizzas", "plantations", "plastics", "ploughs", "pockets", "potatoes", "powders", "properties", "reactions", - "regrets", "riddles", "rivers", "rocks", "sails", "scales", "scarecrows", "scarves", "scenes", "schools", - "sciences", "shakes", "shapes", "shirts", "silvers", "sinks", "snakes", "sneezes", "sofas", "songs", "sounds", - "spades", "sparks", "stages", "stamps", "stars", "stations", "stews", "stomachs", "suggestions", "suits", "swings", - "tables", "tents", "territories", "tests", "textures", "things", "thoughts", "threads", "tigers", "toads", "toes", - "tomatoes", "trains", "treatments", "troubles", "tubs", "turkeys", "umbrellas", "uncles", "vacations", "veils", - "voices", "volcanoes", "volleyballs", "walls", "wars", "waters", "waves", "wilderness", "women", "words", "works", - "worms", "wounds", "writings", "yams", "yards", "yarns", "zebras" -) - - -def get_adjectives(num: int = 1) -> List[str]: - """ - Get a list of random, unique adjectives - """ - - return random.sample(adjectives, num) - - -def get_nouns(num: int = 1) -> List[str]: - """ - Get a list of random, unique nouns - """ - - return random.sample(nouns, num) - - -def get_word_pairs(num: int = 1) -> Iterator[Tuple[str, str]]: - """ - Get an iterator over random, unique (adjective, noun) pairs - """ - - return zip( - get_adjectives(num), - get_nouns(num) - ) diff --git a/pysite/views/__init__.py b/pysite/views/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/pysite/views/api/__init__.py b/pysite/views/api/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/pysite/views/api/bot/__init__.py b/pysite/views/api/bot/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/pysite/views/api/bot/bigbrother.py b/pysite/views/api/bot/bigbrother.py deleted file mode 100644 index 89697811..00000000 --- a/pysite/views/api/bot/bigbrother.py +++ /dev/null @@ -1,118 +0,0 @@ -import json - -from flask import jsonify -from schema import And, Optional, Schema - -from pysite.base_route import APIView -from pysite.constants import ValidationTypes -from pysite.decorators import api_key, api_params -from pysite.mixins import DBMixin - - -GET_SCHEMA = Schema({ - # This is passed as a GET parameter, so it has to be a string - Optional('user_id'): And(str, str.isnumeric, error="`user_id` must be a numeric string") -}) - -POST_SCHEMA = Schema({ - 'user_id': And(str, str.isnumeric, error="`user_id` must be a numeric string"), - 'channel_id': And(str, str.isnumeric, error="`channel_id` must be a numeric string") -}) - -DELETE_SCHEMA = Schema({ - 'user_id': And(str, str.isnumeric, error="`user_id` must be a numeric string") -}) - - -NOT_A_NUMBER_JSON = json.dumps({ - 'error_message': "The given `user_id` parameter is not a valid number" -}) -NOT_FOUND_JSON = json.dumps({ - 'error_message': "No entry for the requested user ID could be found." -}) - - -class BigBrotherView(APIView, DBMixin): - path = '/bot/bigbrother' - name = 'bot.bigbrother' - table_name = 'watched_users' - - @api_key - @api_params(schema=GET_SCHEMA, validation_type=ValidationTypes.params) - def get(self, params): - """ - Without query parameters, returns a list of all monitored users. - A parameter `user_id` can be specified to return a single entry, - or a dictionary with the string field 'error_message' that tells why it failed. - - If the returned status is 200, has got either a list of entries - or a single object (see above). - - If the returned status is 400, the `user_id` parameter was incorrectly specified. - If the returned status is 404, the given `user_id` could not be found. - See the 'error_message' field in the JSON response for more information. - - The user ID must be provided as query parameter. - API key must be provided as header. - """ - - user_id = params.get('user_id') - if user_id is not None: - data = self.db.get(self.table_name, user_id) - if data is None: - return NOT_FOUND_JSON, 404 - return jsonify(data) - - else: - data = self.db.pluck(self.table_name, ('user_id', 'channel_id')) or [] - return jsonify(data) - - @api_key - @api_params(schema=POST_SCHEMA, validation_type=ValidationTypes.json) - def post(self, data): - """ - Adds a new entry to the database. - Entries take the following form: - { - "user_id": ..., # The user ID of the user being monitored, as a string. - "channel_id": ... # The channel ID that the user's messages will be relayed to, as a string. - } - - If an entry for the given `user_id` already exists, it will be updated with the new channel ID. - - Returns 204 (ok, empty response) on success. - - Data must be provided as JSON. - API key must be provided as header. - """ - - self.db.insert( - self.table_name, - { - 'user_id': data['user_id'], - 'channel_id': data['channel_id'] - }, - conflict='update' - ) - - return '', 204 - - @api_key - @api_params(schema=DELETE_SCHEMA, validation_type=ValidationTypes.params) - def delete(self, params): - """ - Removes an entry for the given `user_id`. - - Returns 204 (ok, empty response) on success. - Returns 400 if the given `user_id` is invalid. - - The user ID must be provided as query parameter. - API key must be provided as header. - """ - - self.db.delete( - self.table_name, - params['user_id'] - ) - - return '', 204 diff --git a/pysite/views/api/bot/clean.py b/pysite/views/api/bot/clean.py deleted file mode 100644 index 82d1e735..00000000 --- a/pysite/views/api/bot/clean.py +++ /dev/null @@ -1,48 +0,0 @@ -from flask import jsonify -from schema import Schema - -from pysite.base_route import APIView -from pysite.constants import ValidationTypes -from pysite.decorators import api_key, api_params -from pysite.mixins import DBMixin - -POST_SCHEMA = Schema({ - 'log_data': [ - { - "author": str, - "user_id": str, - "content": str, - "role_id": str, - "timestamp": str, - "embeds": object, - "attachments": [str], - } - ] -}) - - -class CleanView(APIView, DBMixin): - path = '/bot/clean' - name = 'bot.clean' - table_name = 'clean_logs' - - @api_key - @api_params(schema=POST_SCHEMA, validation_type=ValidationTypes.json) - def post(self, data): - """ - Receive some log_data from a bulk deletion, - and store it in the database. - - Returns an ID which can be used to get the data - from the /bot/clean_logs/ endpoint. - """ - - # Insert and return the id to use for GET - insert = self.db.insert( - self.table_name, - { - "log_data": data["log_data"] - } - ) - - return jsonify({"log_id": insert['generated_keys'][0]}) diff --git a/pysite/views/api/bot/doc.py b/pysite/views/api/bot/doc.py deleted file mode 100644 index c1d6020c..00000000 --- a/pysite/views/api/bot/doc.py +++ /dev/null @@ -1,98 +0,0 @@ -from flask import jsonify -from schema import Optional, Schema - -from pysite.base_route import APIView -from pysite.constants import ValidationTypes -from pysite.decorators import api_key, api_params -from pysite.mixins import DBMixin - - -GET_SCHEMA = Schema([ - { - Optional("package"): str - } -]) - -POST_SCHEMA = Schema([ - { - "package": str, - "base_url": str, - "inventory_url": str - } -]) - -DELETE_SCHEMA = Schema([ - { - "package": str - } -]) - - -class DocView(APIView, DBMixin): - path = "/bot/docs" - name = "bot.docs" - table_name = "pydoc_links" - - @api_key - @api_params(schema=GET_SCHEMA, validation_type=ValidationTypes.params) - def get(self, params=None): - """ - Fetches documentation metadata from the database. - - - If `package` parameters are provided, fetch metadata - for the given packages, or `[]` if none matched. - - - If `package` is not provided, return all - packages known to the database. - - Data must be provided as params. - API key must be provided as header. - """ - - if params: - packages = (param['package'] for param in params if 'package' in param) - data = self.db.get_all(self.table_name, *packages, index='package') or [] - else: - data = self.db.pluck(self.table_name, ("package", "base_url", "inventory_url")) or [] - - return jsonify(data) - - @api_key - @api_params(schema=POST_SCHEMA, validation_type=ValidationTypes.json) - def post(self, json_data): - """ - Adds one or more new documentation metadata objects. - - If the `package` passed in the data - already exists, it will be updated instead. - - Data must be provided as JSON. - API key must be provided as header. - """ - - packages_to_insert = ( - { - "package": json_object["package"], - "base_url": json_object["base_url"], - "inventory_url": json_object["inventory_url"] - } for json_object in json_data - ) - - self.db.insert(self.table_name, *packages_to_insert, conflict="update") - return jsonify({"success": True}) - - @api_key - @api_params(schema=DELETE_SCHEMA, validation_type=ValidationTypes.json) - def delete(self, json_data): - """ - Deletes a documentation metadata object. - Expects the `package` to be deleted to - be specified as a request parameter. - - Data must be provided as params. - API key must be provided as header. - """ - - packages = (json_object["package"]for json_object in json_data) - changes = self.db.delete(self.table_name, *packages, return_changes=True) - return jsonify(changes) diff --git a/pysite/views/api/bot/hiphopify.py b/pysite/views/api/bot/hiphopify.py deleted file mode 100644 index ce4dfa4a..00000000 --- a/pysite/views/api/bot/hiphopify.py +++ /dev/null @@ -1,170 +0,0 @@ -import logging - -from flask import jsonify -from schema import Optional, Schema - -from pysite.base_route import APIView -from pysite.constants import ValidationTypes -from pysite.decorators import api_key, api_params -from pysite.mixins import DBMixin -from pysite.utils.time import is_expired, parse_duration - -log = logging.getLogger(__name__) - -GET_SCHEMA = Schema({ - "user_id": str -}) - -POST_SCHEMA = Schema({ - "user_id": str, - "duration": str, - Optional("forced_nick"): str -}) - -DELETE_SCHEMA = Schema({ - "user_id": str -}) - - -class HiphopifyView(APIView, DBMixin): - path = "/bot/hiphopify" - name = "bot.hiphopify" - prison_table = "hiphopify" - name_table = "hiphopify_namelist" - - @api_key - @api_params(schema=GET_SCHEMA, validation_type=ValidationTypes.params) - def get(self, params=None): - """ - Check if the user is currently in hiphop-prison. - - If user is currently servin' his sentence in the big house, - return the name stored in the forced_nick column of prison_table. - - If user cannot be found in prison, or - if his sentence has expired, return nothing. - - Data must be provided as params. - API key must be provided as header. - """ - - user_id = params.get("user_id") - - log.debug(f"Checking if user ({user_id}) is permitted to change their nickname.") - data = self.db.get(self.prison_table, user_id) or {} - - if data and data.get("end_timestamp"): - log.trace("User exists in the prison_table.") - end_time = data.get("end_timestamp") - if is_expired(end_time): - log.trace("...But their sentence has already expired.") - data = {} # Return nothing if the sentence has expired. - - return jsonify(data) - - @api_key - @api_params(schema=POST_SCHEMA, validation_type=ValidationTypes.json) - def post(self, json_data): - """ - Imprisons a user in hiphop-prison. - - If a forced_nick was provided by the caller, the method will force - this nick. If not, a random hiphop nick will be selected from the - name_table. - - Data must be provided as JSON. - API key must be provided as header. - """ - - user_id = json_data.get("user_id") - duration = json_data.get("duration") - forced_nick = json_data.get("forced_nick") - - log.debug(f"Attempting to imprison user ({user_id}).") - - # Get random name and picture if no forced_nick was provided. - if not forced_nick: - log.trace("No forced_nick provided. Fetching a random rapper name and image.") - rapper_data = self.db.sample(self.name_table, 1)[0] - forced_nick = rapper_data.get('name') - - # If forced nick was provided, try to look up the forced_nick in the database. - # If a match cannot be found, just default to Lil' Jon for the image. - else: - log.trace(f"Forced nick provided ({forced_nick}). Trying to match it with the database.") - rapper_data = ( - self.db.get(self.name_table, forced_nick) - or self.db.get(self.name_table, "Lil' Joseph") - ) - - image_url = rapper_data.get('image_url') - log.trace(f"Using the nickname {forced_nick} and the image_url {image_url}.") - - # Convert duration to valid timestamp - try: - log.trace("Parsing the duration and converting it to a timestamp") - end_timestamp = parse_duration(duration) - except ValueError: - log.warning(f"The duration could not be parsed, or was invalid. The duration was '{duration}'.") - return jsonify({ - "success": False, - "error_message": "Invalid duration" - }) - - log.debug("Everything seems to be in order, inserting the data into the prison_table.") - self.db.insert( - self.prison_table, - { - "user_id": user_id, - "end_timestamp": end_timestamp, - "forced_nick": forced_nick - }, - conflict="update" # If it exists, update it. - ) - - return jsonify({ - "success": True, - "end_timestamp": end_timestamp, - "forced_nick": forced_nick, - "image_url": image_url - }) - - @api_key - @api_params(schema=DELETE_SCHEMA, validation_type=ValidationTypes.json) - def delete(self, json_data): - """ - Releases a user from hiphop-prison. - - Data must be provided as JSON. - API key must be provided as header. - """ - - user_id = json_data.get("user_id") - - log.debug(f"Attempting to release user ({user_id}) from hiphop-prison.") - prisoner_data = self.db.get(self.prison_table, user_id) - sentence_expired = None - - log.trace(f"Checking if the user ({user_id}) is currently in hiphop-prison.") - if prisoner_data and prisoner_data.get("end_timestamp"): - sentence_expired = is_expired(prisoner_data['end_timestamp']) - - if prisoner_data and not sentence_expired: - log.debug("User is currently in hiphop-prison. Deleting the record and releasing the prisoner.") - self.db.delete( - self.prison_table, - user_id - ) - return jsonify({"success": True}) - elif not prisoner_data: - log.warning(f"User ({user_id}) is not currently in hiphop-prison.") - return jsonify({ - "success": False, - "error_message": "User is not currently in hiphop-prison!" - }) - elif sentence_expired: - log.warning(f"User ({user_id}) was in hiphop-prison, but has already been released.") - return jsonify({ - "success": False, - "error_message": "User has already been released from hiphop-prison!" - }) diff --git a/pysite/views/api/bot/infractions.py b/pysite/views/api/bot/infractions.py deleted file mode 100644 index eee40b82..00000000 --- a/pysite/views/api/bot/infractions.py +++ /dev/null @@ -1,572 +0,0 @@ -""" -INFRACTIONS API - -"GET" endpoints in this API may take the following optional parameters, depending on the endpoint: - - active: filters infractions that are active (true), expired (false), or either (not present/any) - - expand: expands the result data with the information about the users (slower) - - dangling: filters infractions that are active, or inactive infractions that have not been closed manually. - - search: filters the "reason" field to match the given RE2 query. - -Infraction Schema: - This schema is used when an infraction's data is returned. - - Root object: - "id" (str): the UUID of the infraction. - "inserted_at" (str): the date and time of the creation of this infraction (RFC1123 format). - "expires_at" (str): the date and time of the expiration of this infraction (RC1123 format), may be null. - The significance of this field being null depends on the type of infraction. Duration-based infractions - have a "null" expiration if they are permanent. Other infraction types do not have expirations. - "active" (bool): whether the infraction is still active. Note that the check for expiration of - duration-based infractions is done by the API, so you should check for expiration using this "active" field. - "user" (object): the user to which the infraction was applied. - "user_id" (str): the Discord ID of the user. - "username" (optional str): the username of the user. This field is only present if the query was expanded. - "discriminator" (optional int): the username discriminator of the user. This field is only present if the - query was expanded. - "avatar" (optional str): the avatar URL of the user. This field is only present if the query was expanded. - "actor" (object): the user which applied the infraction. - This object uses the same schema as the "user" field. - "type" (str): the type of the infraction. - "reason" (str): the reason for the infraction. - - -Endpoints: - - GET /bot/infractions - Gets a list of all infractions, regardless of type or user. - Parameters: "active", "expand", "dangling", "search". - This endpoint returns an array of infraction objects. - - GET /bot/infractions/user/ - Gets a list of all infractions for a user. - Parameters: "active", "expand", "search". - This endpoint returns an array of infraction objects. - - GET /bot/infractions/type/ - Gets a list of all infractions of the given type (ban, mute, etc.) - Parameters: "active", "expand", "search". - This endpoint returns an array of infraction objects. - - GET /bot/infractions/user// - Gets a list of all infractions of the given type for a user. - Parameters: "active", "expand", "search". - This endpoint returns an array of infraction objects. - - GET /bot/infractions/user///current - Gets the active infraction (if any) of the given type for a user. - Parameters: "expand". - This endpoint returns an object with the "infraction" key, which is either set to null (no infraction) - or the query's corresponding infraction. It will not return an infraction if the type of the infraction - isn't duration-based (e.g. kick, warning, etc.) - - GET /bot/infractions/id/ - Gets the infraction (if any) for the given ID. - Parameters: "expand". - This endpoint returns an object with the "infraction" key, which is either set to null (no infraction) - or the infraction corresponding to the ID. - - POST /bot/infractions - Creates an infraction for a user. - Parameters (JSON payload): - "type" (str): the type of the infraction (must be a valid infraction type). - "reason" (str): the reason of the infraction. - "user_id" (str): the Discord ID of the user who is being given the infraction. - "actor_id" (str): the Discord ID of the user who submitted the infraction. - "duration" (optional str): the duration of the infraction. This is ignored for infractions - which are not duration-based. For other infraction types, omitting this field may imply permanence. - "expand" (optional bool): whether to expand the infraction user data once the infraction is inserted and returned. - - PATCH /bot/infractions - Updates an infractions. - Parameters (JSON payload): - "id" (str): the ID of the infraction to update. - "reason" (optional str): if provided, the new reason for the infraction. - "duration" (optional str): if provided, updates the expiration of the infraction to the time of UPDATING - plus the duration. If set to null, the expiration is also set to null (may imply permanence). - "active" (optional bool): if provided, activates or deactivates the infraction. This does not do anything - if the infraction isn't duration-based, or if the infraction has already expired. This marks the infraction - as closed. - "expand" (optional bool): whether to expand the infraction user data once the infraction is updated and returned. -""" - -import datetime -from typing import NamedTuple - -import rethinkdb -from flask import jsonify -from schema import Optional, Or, Schema - -from pysite.base_route import APIView -from pysite.constants import ErrorCodes, ValidationTypes -from pysite.decorators import api_key, api_params -from pysite.mixins import DBMixin -from pysite.utils.time import parse_duration - - -class InfractionType(NamedTuple): - timed_infraction: bool # whether the infraction is active until it expires. - - -RFC1123_FORMAT = "%a, %d %b %Y %H:%M:%S GMT" -EXCLUDED_FIELDS = "user_id", "actor_id", "closed", "_timed" -INFRACTION_ORDER = rethinkdb.desc("active"), rethinkdb.desc("inserted_at") - -INFRACTION_TYPES = { - "warning": InfractionType(timed_infraction=False), - "mute": InfractionType(timed_infraction=True), - "ban": InfractionType(timed_infraction=True), - "kick": InfractionType(timed_infraction=False), - "superstar": InfractionType(timed_infraction=True) # hiphopify -} - -GET_SCHEMA = Schema({ - Optional("active"): str, - Optional("expand"): str, - Optional("dangling"): str, - Optional("search"): str -}) - -GET_ACTIVE_SCHEMA = Schema({ - Optional("expand"): str -}) - -CREATE_INFRACTION_SCHEMA = Schema({ - "type": lambda tp: tp in INFRACTION_TYPES, - "reason": Or(str, None), - "user_id": str, # Discord user ID - "actor_id": str, # Discord user ID - Optional("duration"): str, # If not provided, may imply permanence depending on the infraction - Optional("expand"): bool -}) - -UPDATE_INFRACTION_SCHEMA = Schema({ - "id": str, - Optional("reason"): Or(str, None), - Optional("duration"): Or(str, None), - Optional("active"): bool -}) - -IMPORT_INFRACTIONS_SCHEMA = Schema([ - { - "id": str, - "active": bool, - "actor": { - "id": str - }, - "created_at": str, - "expires_at": Or(str, None), - "reason": Or(str, None), - "type": { - "name": str - }, - "user": { - "id": str - } - } -], ignore_extra_keys=True) - - -class InfractionsView(APIView, DBMixin): - path = "/bot/infractions" - name = "bot.infractions" - table_name = "bot_infractions" - - @api_key - @api_params(schema=GET_SCHEMA, validation_type=ValidationTypes.params) - def get(self, params: dict = None): - if "dangling" in params: - return _infraction_list_filtered(self, params, {"_timed": True, "closed": False}) - else: - return _infraction_list_filtered(self, params, {}) - - @api_key - @api_params(schema=CREATE_INFRACTION_SCHEMA, validation_type=ValidationTypes.json) - def post(self, data): - deactivate_infraction_query = None - - infraction_type = data["type"] - user_id = data["user_id"] - actor_id = data["actor_id"] - reason = data["reason"] - duration_str = data.get("duration") - expand = data.get("expand") - expires_at = None - inserted_at = datetime.datetime.now(tz=datetime.timezone.utc) - - if infraction_type not in INFRACTION_TYPES: - return self.error(ErrorCodes.incorrect_parameters, "Invalid infraction type.") - - # check if the user already has an active infraction of this type - # if so, we need to disable that infraction and create a new infraction - if INFRACTION_TYPES[infraction_type].timed_infraction: - active_infraction_query = \ - self.db.query(self.table_name).merge(_merge_active_check()) \ - .filter({"user_id": user_id, "type": infraction_type, "active": True}) \ - .limit(1).nth(0).default(None) - - active_infraction = self.db.run(active_infraction_query) - if active_infraction: - deactivate_infraction_query = \ - self.db.query(self.table_name) \ - .get(active_infraction["id"]) \ - .update({"active": False, "closed": True}) - - if duration_str: - try: - expires_at = parse_duration(duration_str) - except ValueError: - return self.error( - ErrorCodes.incorrect_parameters, - "Invalid duration format." - ) - - infraction_insert_doc = { - "actor_id": actor_id, - "user_id": user_id, - "type": infraction_type, - "reason": reason, - "inserted_at": inserted_at, - "expires_at": expires_at - } - - infraction_id = self.db.insert(self.table_name, infraction_insert_doc)["generated_keys"][0] - - if deactivate_infraction_query: - self.db.run(deactivate_infraction_query) - - query = self.db.query(self.table_name).get(infraction_id) \ - .merge(_merge_expand_users(self, expand)) \ - .merge(_merge_active_check()) \ - .without(*EXCLUDED_FIELDS).default(None) - return jsonify({ - "infraction": self.db.run(query) - }) - - @api_key - @api_params(schema=UPDATE_INFRACTION_SCHEMA, validation_type=ValidationTypes.json) - def patch(self, data): - expand = data.get("expand") - update_collection = { - "id": data["id"] - } - - if "reason" in data: - update_collection["reason"] = data["reason"] - - if "active" in data: - update_collection["active"] = data["active"] - update_collection["closed"] = not data["active"] - - if "duration" in data: - duration_str = data["duration"] - if duration_str is None: - update_collection["expires_at"] = None - else: - try: - update_collection["expires_at"] = parse_duration(duration_str) - except ValueError: - return self.error( - ErrorCodes.incorrect_parameters, - "Invalid duration format." - ) - - query_update = self.db.query(self.table_name).update(update_collection) - result_update = self.db.run(query_update) - - if not result_update["replaced"]: - return jsonify({ - "success": False, - "error_message": "Unknown infraction / nothing was changed." - }) - - # return the updated infraction - query = self.db.query(self.table_name).get(data["id"]) \ - .merge(_merge_expand_users(self, expand)) \ - .merge(_merge_active_check()) \ - .without(*EXCLUDED_FIELDS).default(None) - infraction = self.db.run(query) - - return jsonify({ - "infraction": infraction, - "success": True - }) - - -class InfractionById(APIView, DBMixin): - path = "/bot/infractions/id/" - name = "bot.infractions.id" - table_name = "bot_infractions" - - @api_key - @api_params(schema=GET_ACTIVE_SCHEMA, validation_type=ValidationTypes.params) - def get(self, params, infraction_id): - params = params or {} - expand = parse_bool(params.get("expand"), default=False) - - query = self.db.query(self.table_name).get(infraction_id) \ - .merge(_merge_expand_users(self, expand)) \ - .merge(_merge_active_check()) \ - .without(*EXCLUDED_FIELDS).default(None) - return jsonify({ - "infraction": self.db.run(query) - }) - - -class ListInfractionsByUserView(APIView, DBMixin): - path = "/bot/infractions/user/" - name = "bot.infractions.user" - table_name = "bot_infractions" - - @api_key - @api_params(schema=GET_SCHEMA, validation_type=ValidationTypes.params) - def get(self, params, user_id): - return _infraction_list_filtered(self, params, { - "user_id": user_id - }) - - -class ListInfractionsByTypeView(APIView, DBMixin): - path = "/bot/infractions/type/" - name = "bot.infractions.type" - table_name = "bot_infractions" - - @api_key - @api_params(schema=GET_SCHEMA, validation_type=ValidationTypes.params) - def get(self, params, type): - return _infraction_list_filtered(self, params, { - "type": type - }) - - -class ListInfractionsByTypeAndUserView(APIView, DBMixin): - path = "/bot/infractions/user//" - name = "bot.infractions.user.type" - table_name = "bot_infractions" - - @api_key - @api_params(schema=GET_SCHEMA, validation_type=ValidationTypes.params) - def get(self, params, user_id, type): - return _infraction_list_filtered(self, params, { - "user_id": user_id, - "type": type - }) - - -class CurrentInfractionByTypeAndUserView(APIView, DBMixin): - path = "/bot/infractions/user///current" - name = "bot.infractions.user.type.current" - table_name = "bot_infractions" - - @api_key - @api_params(schema=GET_ACTIVE_SCHEMA, validation_type=ValidationTypes.params) - def get(self, params, user_id, infraction_type): - params = params or {} - expand = parse_bool(params.get("expand"), default=False) - - query_filter = { - "user_id": user_id, - "type": infraction_type - } - query = _merged_query(self, expand, query_filter).filter({ - "active": True - }).order_by(rethinkdb.desc("data")).limit(1).nth(0).default(None) - return jsonify({ - "infraction": self.db.run(query) - }) - - -class ImportRowboatInfractionsView(APIView, DBMixin): - path = "/bot/infractions/import" - name = "bot.infractions.import" - table_name = "bot_infractions" - - @api_key - @api_params(schema=IMPORT_INFRACTIONS_SCHEMA, validation_type=ValidationTypes.json) - def post(self, data): - # keep track of the un-bans, to apply after the import is complete. - unbans = [] - infractions = [] - - # previously imported infractions - imported_infractions = self.db.run( - self.db.query(self.table_name).filter( - lambda row: row.has_fields("legacy_rowboat_id") - ).fold([], lambda acc, row: acc.append(row["legacy_rowboat_id"])).coerce_to("array") - ) - - for rowboat_infraction_data in data: - legacy_rowboat_id = rowboat_infraction_data["id"] - if legacy_rowboat_id in imported_infractions: - continue - infraction_type = rowboat_infraction_data["type"]["name"] - if infraction_type == "unban": - unbans.append(rowboat_infraction_data) - continue - # adjust infraction types - if infraction_type == "tempmute": - infraction_type = "mute" - if infraction_type == "tempban": - infraction_type = "ban" - if infraction_type not in INFRACTION_TYPES: - # unknown infraction type - continue - active = rowboat_infraction_data["active"] - reason = rowboat_infraction_data["reason"] or "" - user_id = rowboat_infraction_data["user"]["id"] - actor_id = rowboat_infraction_data["actor"]["id"] - inserted_at_str = rowboat_infraction_data["created_at"] - try: - inserted_at = parse_rfc1123(inserted_at_str) - except ValueError: - continue - expires_at_str = rowboat_infraction_data["expires_at"] - if expires_at_str is not None: - try: - expires_at = parse_rfc1123(expires_at_str) - except ValueError: - continue - else: - expires_at = None - infractions.append({ - "legacy_rowboat_id": legacy_rowboat_id, - "active": active, - "reason": reason, - "user_id": user_id, - "actor_id": actor_id, - "inserted_at": inserted_at, - "expires_at": expires_at, - "type": infraction_type - }) - - insertion_query = self.db.query(self.table_name).insert(infractions) - inserted_count = self.db.run(insertion_query)["inserted"] - - # apply unbans - for unban_data in unbans: - inserted_at_str = unban_data["created_at"] - user_id = unban_data["user"]["id"] - try: - inserted_at = parse_rfc1123(inserted_at_str) - except ValueError: - continue - self.db.run( - self.db.query(self.table_name).filter( - lambda row: (row["user_id"].eq(user_id)) & - (row["type"].eq("ban")) & - (row["inserted_at"] < inserted_at) - ).pluck("id").merge(lambda row: { - "active": False - }).coerce_to("array").for_each(lambda doc: self.db.query(self.table_name).get(doc["id"]).update(doc)) - ) - - return jsonify({ - "success": True, - "inserted_count": inserted_count - }) - - -def _infraction_list_filtered(view, params=None, query_filter=None): - params = params or {} - query_filter = query_filter or {} - active = parse_bool(params.get("active")) - expand = parse_bool(params.get("expand"), default=False) - search = params.get("search") - - if active is not None: - query_filter["active"] = active - - query = _merged_query(view, expand, query_filter) - - if search is not None: - query = query.filter( - lambda row: rethinkdb.branch( - row["reason"].eq(None), - False, - row["reason"].match(search) - ) - ) - - query = query.order_by(*INFRACTION_ORDER) - - return jsonify(view.db.run(query.coerce_to("array"))) - - -def _merged_query(view, expand, query_filter): - return view.db.query(view.table_name).merge(_merge_active_check()).filter(query_filter) \ - .merge(_merge_expand_users(view, expand)).without(*EXCLUDED_FIELDS) - - -def _merge_active_check(): - # Checks if the "closed" field has been set to true (manual infraction removal). - # If not, the "active" field is set to whether the infraction has expired. - def _merge(row): - return { - "active": - rethinkdb.branch( - _is_timed_infraction(row["type"]), - rethinkdb.branch( - (row["closed"].default(False).eq(True)) | (row["active"].default(True).eq(False)), - False, - rethinkdb.branch( - row["expires_at"].eq(None), - True, - row["expires_at"] > rethinkdb.now() - ) - ), - False - ), - "closed": row["closed"].default(False), - "_timed": _is_timed_infraction(row["type"]) - } - - return _merge - - -def _merge_expand_users(view, expand): - def _do_expand(user_id): - if not user_id: - return None - # Expands the user information, if it is in the database. - - if expand: - return view.db.query("users").get(user_id).default({ - "user_id": user_id - }) - - return { - "user_id": user_id - } - - def _merge(row): - return { - "user": _do_expand(row["user_id"].default(None)), - "actor": _do_expand(row["actor_id"].default(None)) - } - - return _merge - - -def _is_timed_infraction(type_var): - # this method generates an ReQL expression to check if the given type - # is a "timed infraction" (i.e it can expire or be permanent) - - timed_infractions = filter(lambda key: INFRACTION_TYPES[key].timed_infraction, INFRACTION_TYPES.keys()) - expr = rethinkdb.expr(False) - for infra_type in timed_infractions: - expr = expr | type_var.eq(infra_type) - return expr - - -def parse_rfc1123(time_str): - return datetime.datetime.strptime(time_str, RFC1123_FORMAT).replace(tzinfo=datetime.timezone.utc) - - -def parse_bool(a_string, default=None): - # Not present, null or any: returns default (defaults to None) - # false, no, or 0: returns False - # anything else: True - if a_string is None or a_string == "null" or a_string == "any": - return default - if a_string.lower() == "false" or a_string.lower() == "no" or a_string == "0": - return False - return True diff --git a/pysite/views/api/bot/off_topic_names.py b/pysite/views/api/bot/off_topic_names.py deleted file mode 100644 index 1c75428e..00000000 --- a/pysite/views/api/bot/off_topic_names.py +++ /dev/null @@ -1,108 +0,0 @@ -import random - -from flask import jsonify, request -from schema import And, Schema - -from pysite.base_route import APIView -from pysite.constants import ValidationTypes -from pysite.decorators import api_key, api_params -from pysite.mixins import DBMixin - - -OFF_TOPIC_NAME = And( - str, - len, - lambda name: all(c.isalnum() or c == '-' for c in name), - str.islower, - lambda name: len(name) <= 96, - error=( - "The channel name must be a non-blank string consisting only of" - " lowercase regular characters and '-' with a maximum length of 96" - ) -) - -DELETE_SCHEMA = Schema({ - 'name': OFF_TOPIC_NAME -}) - -POST_SCHEMA = Schema({ - 'name': OFF_TOPIC_NAME -}) - - -class OffTopicNamesView(APIView, DBMixin): - path = "/bot/off-topic-names" - name = "bot.off_topic_names" - table_name = "off_topic_names" - - @api_key - @api_params(schema=DELETE_SCHEMA, validation_type=ValidationTypes.params) - def delete(self, params): - """ - Removes a single off-topic name from the database. - Returns the result of the deletion call. - - API key must be provided as header. - Name to delete must be provided as the `name` query argument. - """ - - result = self.db.delete( - self.table_name, - params['name'], - return_changes=True - ) - - return jsonify(result) - - @api_key - def get(self): - """ - Fetch all known off-topic channel names from the database. - Returns a list of strings, the strings being the off-topic names. - - If the query argument `random_items` is provided (a non-negative integer), - then this view will return `random_items` random names from the database - instead of returning all items at once. - - API key must be provided as header. - """ - - names = [ - entry['name'] for entry in self.db.get_all(self.table_name) - ] - - if 'random_items' in request.args: - random_count = request.args['random_items'] - if not random_count.isdigit(): - response = {'message': "`random_items` must be a valid integer"} - return jsonify(response), 400 - - samples = random.sample(names, int(random_count)) - return jsonify(samples) - - return jsonify(names) - - @api_key - @api_params(schema=POST_SCHEMA, validation_type=ValidationTypes.params) - def post(self, data): - """ - Add a new off-topic channel name to the database. - Expects the new channel's name as the `name` argument. - The name must consist only of alphanumeric characters or minus signs, - and must not be empty or exceed 96 characters. - - Data must be provided as params. - API key must be provided as header. - """ - - if self.db.get(self.table_name, data['name']) is not None: - response = { - 'message': "An entry with the given name already exists" - } - return jsonify(response), 400 - - self.db.insert( - self.table_name, - {'name': data['name']} - ) - return jsonify({'message': 'ok'}) diff --git a/pysite/views/api/bot/settings.py b/pysite/views/api/bot/settings.py deleted file mode 100644 index a633a68a..00000000 --- a/pysite/views/api/bot/settings.py +++ /dev/null @@ -1,56 +0,0 @@ -from flask import jsonify -from schema import Optional, Schema - -from pysite.base_route import APIView -from pysite.constants import ValidationTypes -from pysite.decorators import api_key, api_params -from pysite.mixins import DBMixin - -# todo: type safety -SETTINGS_KEYS_DEFAULTS = { - "defcon_enabled": False, - "defcon_days": 1 -} - -GET_SCHEMA = Schema({ - Optional("keys"): str -}) - - -def settings_schema(): - schema_dict = {Optional(key): type(SETTINGS_KEYS_DEFAULTS[key]) for key in SETTINGS_KEYS_DEFAULTS.keys()} - return Schema(schema_dict) - - -class ServerSettingsView(APIView, DBMixin): - path = "/bot/settings" - name = "bot.settings" - - @api_key - @api_params(schema=GET_SCHEMA, validation_type=ValidationTypes.params) - def get(self, params=None): - keys_raw = None - if params: - keys_raw = params.get("keys") - - keys = filter(lambda key: key in SETTINGS_KEYS_DEFAULTS, - keys_raw.split(",")) if keys_raw else SETTINGS_KEYS_DEFAULTS.keys() - - result = {key: (self.db.get("bot_settings", key) or {}).get("value") or SETTINGS_KEYS_DEFAULTS[key] for key in - keys} - return jsonify(result) - - @api_key - @api_params(schema=settings_schema(), validation_type=ValidationTypes.json) - def put(self, json_data): - # update in database - - for key, value in json_data.items(): - self.db.insert("bot_settings", { - "key": key, - "value": value - }, conflict="update") - - return jsonify({ - "success": True - }) diff --git a/pysite/views/api/bot/snake_cog/__init__.py b/pysite/views/api/bot/snake_cog/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/pysite/views/api/bot/snake_cog/snake_facts.py b/pysite/views/api/bot/snake_cog/snake_facts.py deleted file mode 100644 index 4e8c8a5d..00000000 --- a/pysite/views/api/bot/snake_cog/snake_facts.py +++ /dev/null @@ -1,28 +0,0 @@ -import logging - -from flask import jsonify - -from pysite.base_route import APIView -from pysite.decorators import api_key -from pysite.mixins import DBMixin - -log = logging.getLogger(__name__) - - -class SnakeFactsView(APIView, DBMixin): - path = "/bot/snake_facts" - name = "bot.snake_facts" - table = "snake_facts" - - @api_key - def get(self): - """ - Returns a random fact from the snake_facts table. - - API key must be provided as header. - """ - - log.trace("Fetching a random fact from the snake_facts database") - question = self.db.sample(self.table, 1)[0]["fact"] - - return jsonify(question) diff --git a/pysite/views/api/bot/snake_cog/snake_idioms.py b/pysite/views/api/bot/snake_cog/snake_idioms.py deleted file mode 100644 index 9d879871..00000000 --- a/pysite/views/api/bot/snake_cog/snake_idioms.py +++ /dev/null @@ -1,28 +0,0 @@ -import logging - -from flask import jsonify - -from pysite.base_route import APIView -from pysite.decorators import api_key -from pysite.mixins import DBMixin - -log = logging.getLogger(__name__) - - -class SnakeIdiomView(APIView, DBMixin): - path = "/bot/snake_idioms" - name = "bot.snake_idioms" - table = "snake_idioms" - - @api_key - def get(self): - """ - Returns a random idiom from the snake_idioms table. - - API key must be provided as header. - """ - - log.trace("Fetching a random idiom from the snake_idioms database") - question = self.db.sample(self.table, 1)[0]["idiom"] - - return jsonify(question) diff --git a/pysite/views/api/bot/snake_cog/snake_names.py b/pysite/views/api/bot/snake_cog/snake_names.py deleted file mode 100644 index d9e0c6b8..00000000 --- a/pysite/views/api/bot/snake_cog/snake_names.py +++ /dev/null @@ -1,48 +0,0 @@ -import logging - -from flask import jsonify -from schema import Optional, Schema - - -from pysite.base_route import APIView -from pysite.constants import ValidationTypes -from pysite.decorators import api_key, api_params -from pysite.mixins import DBMixin - -log = logging.getLogger(__name__) - -GET_SCHEMA = Schema([ - { - Optional("get_all"): str - } -]) - - -class SnakeNamesView(APIView, DBMixin): - path = "/bot/snake_names" - name = "bot.snake_names" - table = "snake_names" - - @api_key - @api_params(schema=GET_SCHEMA, validation_type=ValidationTypes.params) - def get(self, params=None): - """ - Returns all snake names random name from the snake_names table. - - API key must be provided as header. - """ - - get_all = None - - if params: - get_all = params[0].get("get_all") - - if get_all: - log.trace("Returning all snake names from the snake_names table") - snake_names = self.db.get_all(self.table) - - else: - log.trace("Fetching a single random snake name from the snake_names table") - snake_names = self.db.sample(self.table, 1)[0] - - return jsonify(snake_names) diff --git a/pysite/views/api/bot/snake_cog/snake_quiz.py b/pysite/views/api/bot/snake_cog/snake_quiz.py deleted file mode 100644 index 359077d7..00000000 --- a/pysite/views/api/bot/snake_cog/snake_quiz.py +++ /dev/null @@ -1,28 +0,0 @@ -import logging - -from flask import jsonify - -from pysite.base_route import APIView -from pysite.decorators import api_key -from pysite.mixins import DBMixin - -log = logging.getLogger(__name__) - - -class SnakeQuizView(APIView, DBMixin): - path = "/bot/snake_quiz" - name = "bot.snake_quiz" - table = "snake_quiz" - - @api_key - def get(self): - """ - Returns a random question from the snake_quiz table. - - API key must be provided as header. - """ - - log.trace("Fetching a random question from the snake_quiz database") - question = self.db.sample(self.table, 1)[0] - - return jsonify(question) diff --git a/pysite/views/api/bot/snake_cog/special_snakes.py b/pysite/views/api/bot/snake_cog/special_snakes.py deleted file mode 100644 index 294c16c9..00000000 --- a/pysite/views/api/bot/snake_cog/special_snakes.py +++ /dev/null @@ -1,28 +0,0 @@ -import logging - -from flask import jsonify - -from pysite.base_route import APIView -from pysite.decorators import api_key -from pysite.mixins import DBMixin - -log = logging.getLogger(__name__) - - -class SpecialSnakesView(APIView, DBMixin): - path = "/bot/special_snakes" - name = "bot.special_snakes" - table = "special_snakes" - - @api_key - def get(self): - """ - Returns all special snake objects from the database - - API key must be provided as header. - """ - - log.trace("Returning all special snakes in the database") - snake_names = self.db.get_all(self.table) - - return jsonify(snake_names) diff --git a/pysite/views/api/bot/tags.py b/pysite/views/api/bot/tags.py deleted file mode 100644 index 4394c224..00000000 --- a/pysite/views/api/bot/tags.py +++ /dev/null @@ -1,107 +0,0 @@ -from flask import jsonify -from schema import Optional, Schema - -from pysite.base_route import APIView -from pysite.constants import ValidationTypes -from pysite.decorators import api_key, api_params -from pysite.mixins import DBMixin - -GET_SCHEMA = Schema({ - Optional("tag_name"): str -}) - -POST_SCHEMA = Schema({ - "tag_name": str, - "tag_content": str -}) - -DELETE_SCHEMA = Schema({ - "tag_name": str -}) - - -class TagsView(APIView, DBMixin): - path = "/bot/tags" - name = "bot.tags" - table_name = "tags" - - @api_key - @api_params(schema=GET_SCHEMA, validation_type=ValidationTypes.params) - def get(self, params=None): - """ - Fetches tags from the database. - - - If tag_name is provided, it fetches - that specific tag. - - - If tag_category is provided, it fetches - all tags in that category. - - - If nothing is provided, it will - fetch a list of all tag_names. - - Data must be provided as params. - API key must be provided as header. - """ - - tag_name = None - - if params: - tag_name = params.get("tag_name") - - if tag_name: - data = self.db.get(self.table_name, tag_name) or {} - else: - data = self.db.pluck(self.table_name, "tag_name") or [] - - return jsonify(data) - - @api_key - @api_params(schema=POST_SCHEMA, validation_type=ValidationTypes.json) - def post(self, json_data): - """ - If the tag_name doesn't exist, this - saves a new tag in the database. - - If the tag_name already exists, - this will edit the existing tag. - - Data must be provided as JSON. - API key must be provided as header. - """ - - tag_name = json_data.get("tag_name") - tag_content = json_data.get("tag_content") - - self.db.insert( - self.table_name, - { - "tag_name": tag_name, - "tag_content": tag_content - }, - conflict="update" # If it exists, update it. - ) - - return jsonify({"success": True}) - - @api_key - @api_params(schema=DELETE_SCHEMA, validation_type=ValidationTypes.json) - def delete(self, data): - """ - Deletes a tag from the database. - - Data must be provided as JSON. - API key must be provided as header. - """ - - tag_name = data.get("tag_name") - tag_exists = self.db.get(self.table_name, tag_name) - - if tag_exists: - self.db.delete( - self.table_name, - tag_name - ) - return jsonify({"success": True}) - - return jsonify({"success": False}) diff --git a/pysite/views/api/bot/user.py b/pysite/views/api/bot/user.py deleted file mode 100644 index a3a0c7a8..00000000 --- a/pysite/views/api/bot/user.py +++ /dev/null @@ -1,166 +0,0 @@ -import logging - -import rethinkdb -from flask import jsonify, request -from schema import Optional, Schema - -from pysite.base_route import APIView -from pysite.constants import ErrorCodes, ValidationTypes -from pysite.decorators import api_key, api_params -from pysite.mixins import DBMixin - -SCHEMA = Schema([ - { - "avatar": str, - "discriminator": str, - "roles": [str], - "user_id": str, - "username": str - } -]) - -GET_SCHEMA = Schema([ - { - "user_id": str - } -]) - -DELETE_SCHEMA = Schema([ - { - "user_id": str, - - Optional("avatar"): str, - Optional("discriminator"): str, - Optional("roles"): [str], - Optional("username"): str - } -]) - -BANNABLE_STATES = ("preparing", "running") - - -class UserView(APIView, DBMixin): - path = "/bot/users" - name = "bot.users" - - chunks_table = "member_chunks" - infractions_table = "code_jam_infractions" - jams_table = "code_jams" - oauth_table_name = "oauth_data" - participants_table = "code_jam_participants" - responses_table = "code_jam_responses" - table_name = "users" - teams_table = "code_jam_teams" - - @api_key - @api_params(schema=GET_SCHEMA, validation_type=ValidationTypes.params) - def get(self, data): - logging.getLogger(__name__).debug(f"Size of request: {len(request.data)} bytes") - - if not data: - return self.error(ErrorCodes.bad_data_format, "No user IDs supplied") - - data = [x["user_id"] for x in data] - - result = self.db.run( - self.db.query(self.table_name) - .filter(lambda document: rethinkdb.expr(data).contains(document["user_id"])), - coerce=list - ) - - return jsonify({"data": result}) # pragma: no cover - - @api_key - @api_params(schema=SCHEMA, validation_type=ValidationTypes.json) - def post(self, data): - logging.getLogger(__name__).debug(f"Size of request: {len(request.data)} bytes") - - if not data: - return self.error(ErrorCodes.bad_data_format, "No users supplied") - - self.db.insert(self.chunks_table, {"chunk": data}) - - return jsonify({"success": True}) # pragma: no cover - - @api_key - @api_params(schema=SCHEMA, validation_type=ValidationTypes.json) - def put(self, data): - changes = self.db.insert( - self.table_name, *data, - conflict="update" - ) - - return jsonify(changes) # pragma: no cover - - @api_key - @api_params(schema=DELETE_SCHEMA, validation_type=ValidationTypes.json) - def delete(self, data): - user_ids = [user["user_id"] for user in data] - - changes = {} - - # changes = self.db.run( - # self.db.query(self.table_name) - # .get_all(*user_ids) - # .delete() - # ) - - oauth_deletions = self.db.run( - self.db.query(self.oauth_table_name) - .get_all(*user_ids, index="snowflake") - .delete() - ).get("deleted", 0) - - profile_deletions = self.db.run( - self.db.query(self.participants_table) - .get_all(*user_ids) - .delete() - ).get("deleted", 0) - - bans = 0 - response_deletions = 0 - - for user_id in user_ids: - banned = False - responses = self.db.run(self.db.query(self.responses_table).filter({"snowflake": user_id}), coerce=list) - - for response in responses: - jam = response["jam"] - jam_obj = self.db.get(self.jams_table, jam) - - if jam_obj: - if jam_obj["state"] in BANNABLE_STATES: - banned = True - - self.db.delete(self.responses_table, response["id"]) - response_deletions += 1 - - teams = self.db.run( - self.db.query(self.teams_table).filter(lambda row: row["members"].contains(user_id)), - coerce=list - ) - - for team in teams: - team["members"].remove(user_id) - - self.db.insert(self.teams_table, team, conflict="replace", durability="soft") - - self.db.sync(self.teams_table) - - if banned: - self.db.insert( - self.infractions_table, { - "participant": user_id, - "reason": "Automatic ban: Removed jammer profile in the middle of a code jam", - "number": -1, - "decremented_for": [] - } - ) - bans += 1 - - changes["deleted_oauth"] = oauth_deletions - changes["deleted_jam_profiles"] = profile_deletions - changes["deleted_responses"] = response_deletions - changes["jam_bans"] = bans - - return jsonify(changes) # pragma: no cover diff --git a/pysite/views/api/bot/user_complete.py b/pysite/views/api/bot/user_complete.py deleted file mode 100644 index 877eee34..00000000 --- a/pysite/views/api/bot/user_complete.py +++ /dev/null @@ -1,143 +0,0 @@ -import logging - -from flask import jsonify, request - -from pysite.base_route import APIView -from pysite.constants import ErrorCodes, ValidationTypes -from pysite.decorators import api_key, api_params -from pysite.mixins import DBMixin - - -BANNABLE_STATES = ("preparing", "running") - -log = logging.getLogger(__name__) - - -class UserView(APIView, DBMixin): - path = "/bot/users/complete" - name = "bot.users.complete" - - chunks_table = "member_chunks" - infractions_table = "code_jam_infractions" - jams_table = "code_jams" - oauth_table_name = "oauth_data" - participants_table = "code_jam_participants" - responses_table = "code_jam_responses" - table_name = "users" - teams_table = "code_jam_teams" - - @api_key - @api_params(validation_type=ValidationTypes.none) - def post(self, _): - log.debug(f"Size of request: {len(request.data)} bytes") - - documents = self.db.get_all(self.chunks_table) - chunks = [] - - for doc in documents: - log.info(f"Got member chunk with {len(doc['chunk'])} users") - chunks.append(doc["chunk"]) - - self.db.delete(self.chunks_table, doc["id"], durability="soft") - self.db.sync(self.chunks_table) - - log.info(f"Got {len(chunks)} member chunks") - - data = [] - - for chunk in chunks: - data += chunk - - log.info(f"Got {len(data)} members") - - if not data: - return self.error(ErrorCodes.bad_data_format, "No users supplied") - - deletions = 0 - oauth_deletions = 0 - profile_deletions = 0 - response_deletions = 0 - bans = 0 - - user_ids = [user["user_id"] for user in data] - - all_users = self.db.run(self.db.query(self.table_name), coerce=list) - - for user in all_users: - if user["user_id"] not in user_ids: - self.db.delete(self.table_name, user["user_id"], durability="soft") - deletions += 1 - - all_oauth_data = self.db.run(self.db.query(self.oauth_table_name), coerce=list) - - for item in all_oauth_data: - if item["snowflake"] not in user_ids: - user_id = item["snowflake"] - - oauth_deletions += self.db.delete( - self.oauth_table_name, item["id"], durability="soft", return_changes=True - ).get("deleted", 0) - profile_deletions += self.db.delete( - self.participants_table, user_id, durability="soft", return_changes=True - ).get("deleted", 0) - - banned = False - responses = self.db.run( - self.db.query(self.responses_table).filter({"snowflake": user_id}), - coerce=list - ) - - for response in responses: - jam = response["jam"] - jam_obj = self.db.get(self.jams_table, jam) - - if jam_obj: - if jam_obj["state"] in BANNABLE_STATES: - banned = True - - self.db.delete(self.responses_table, response["id"], durability="soft") - response_deletions += 1 - - teams = self.db.run( - self.db.query(self.teams_table).filter(lambda row: row["members"].contains(user_id)), - coerce=list - ) - - for team in teams: - team["members"].remove(user_id) - - self.db.insert(self.teams_table, team, conflict="replace", durability="soft") - - if banned: - self.db.insert( - self.infractions_table, { - "participant": user_id, - "reason": "Automatic ban: Removed jammer profile in the middle of a code jam", - "number": -1, - "decremented_for": [] - }, durability="soft" - ) - bans += 1 - - del user_ids - - changes = self.db.insert( - self.table_name, *data, - conflict="update", - durability="soft" - ) - - self.db.sync(self.infractions_table) - self.db.sync(self.oauth_table_name) - self.db.sync(self.participants_table) - self.db.sync(self.responses_table) - self.db.sync(self.table_name) - self.db.sync(self.teams_table) - - changes["deleted"] = deletions - changes["deleted_oauth"] = oauth_deletions - changes["deleted_jam_profiles"] = profile_deletions - changes["deleted_responses"] = response_deletions - changes["jam_bans"] = bans - - return jsonify(changes) # pragma: no cover diff --git a/pysite/views/api/error_view.py b/pysite/views/api/error_view.py deleted file mode 100644 index 89b4d6ad..00000000 --- a/pysite/views/api/error_view.py +++ /dev/null @@ -1,40 +0,0 @@ -from flask import jsonify -from werkzeug.exceptions import HTTPException - -from pysite.base_route import ErrorView - - -class APIErrorView(ErrorView): - name = "api.error_all" - error_code = range(400, 600) - register_on_app = False - - def __init__(self): - - # Direct errors for all methods at self.return_error - methods = [ - 'get', 'post', 'put', - 'delete', 'patch', 'connect', - 'options', 'trace' - ] - - for method in methods: - setattr(self, method, self.return_error) - - def return_error(self, error: HTTPException): - """ - Return a basic JSON object representing the HTTP error, - as well as propagating its status code - """ - - message = str(error) - code = 500 - - if isinstance(error, HTTPException): - message = error.description - code = error.code - - return jsonify({ - "error_code": -1, - "error_message": message - }), code diff --git a/pysite/views/api/healthcheck.py b/pysite/views/api/healthcheck.py deleted file mode 100644 index c873d674..00000000 --- a/pysite/views/api/healthcheck.py +++ /dev/null @@ -1,11 +0,0 @@ -from flask import jsonify - -from pysite.base_route import APIView - - -class HealthCheckView(APIView): - path = "/healthcheck" - name = "api.healthcheck" - - def get(self): - return jsonify({"status": "ok"}) diff --git a/pysite/views/api/index.py b/pysite/views/api/index.py deleted file mode 100644 index 5111162c..00000000 --- a/pysite/views/api/index.py +++ /dev/null @@ -1,10 +0,0 @@ -from pysite.base_route import APIView -from pysite.constants import ErrorCodes - - -class IndexView(APIView): - path = "/" - name = "api.index" - - def get(self): - return self.error(ErrorCodes.unknown_route) diff --git a/pysite/views/api/robots_txt.py b/pysite/views/api/robots_txt.py deleted file mode 100644 index d4406d54..00000000 --- a/pysite/views/api/robots_txt.py +++ /dev/null @@ -1,15 +0,0 @@ -from flask import Response, url_for - -from pysite.base_route import RouteView - - -class RobotsTXT(RouteView): - path = "/robots.txt" - name = "robots_txt" - - def get(self): - return Response( - self.render( - "robots.txt", sitemap_url=url_for("api.sitemap_xml", _external=True), rules={"*": ["/"]} - ), content_type="text/plain" - ) diff --git a/pysite/views/api/sitemap_xml.py b/pysite/views/api/sitemap_xml.py deleted file mode 100644 index 26a786b0..00000000 --- a/pysite/views/api/sitemap_xml.py +++ /dev/null @@ -1,11 +0,0 @@ -from flask import Response - -from pysite.base_route import RouteView - - -class SitemapXML(RouteView): - path = "/sitemap.xml" - name = "sitemap_xml" - - def get(self): - return Response(self.render("sitemap.xml", urls=[]), content_type="application/xml") diff --git a/pysite/views/error_handlers/http_4xx.py b/pysite/views/error_handlers/http_4xx.py deleted file mode 100644 index 731204f9..00000000 --- a/pysite/views/error_handlers/http_4xx.py +++ /dev/null @@ -1,31 +0,0 @@ -from flask import request -from werkzeug.exceptions import HTTPException - -from pysite.base_route import ErrorView -from pysite.constants import ERROR_DESCRIPTIONS - - -class Error400View(ErrorView): - name = "errors.4xx" - error_code = range(400, 430) - - def __init__(self): - # Direct errors for all methods at self.return_error - methods = [ - 'get', 'post', 'put', - 'delete', 'patch', 'connect', - 'options', 'trace' - ] - - for method in methods: - setattr(self, method, self.error) - - def error(self, error: HTTPException): - error_desc = ERROR_DESCRIPTIONS.get(error.code, "We're not really sure what happened there, please try again.") - - return self.render( - "errors/error.html", code=error.code, req=request, error_title=error_desc, - error_message=f"{error_desc} If you believe we have made a mistake, please " - "" - "open an issue on our GitLab." - ), error.code diff --git a/pysite/views/error_handlers/http_5xx.py b/pysite/views/error_handlers/http_5xx.py deleted file mode 100644 index 489eb5e5..00000000 --- a/pysite/views/error_handlers/http_5xx.py +++ /dev/null @@ -1,41 +0,0 @@ -from flask import request -from werkzeug.exceptions import HTTPException, InternalServerError - -from pysite.base_route import ErrorView -from pysite.constants import ERROR_DESCRIPTIONS - - -class Error500View(ErrorView): - name = "errors.5xx" - error_code = range(500, 600) - - def __init__(self): - - # Direct errors for all methods at self.return_error - methods = [ - 'get', 'post', 'put', - 'delete', 'patch', 'connect', - 'options', 'trace' - ] - - for method in methods: - setattr(self, method, self.error) - - def error(self, error: HTTPException): - - # We were sometimes recieving errors from RethinkDB, which were not originating from Werkzeug. - # To fix this, this section checks whether they have a code (which werkzeug adds) and if not - # change the error to a Werkzeug InternalServerError. - - if not hasattr(error, "code"): - error = InternalServerError() - - error_desc = ERROR_DESCRIPTIONS.get(error.code, "We're not really sure what happened there, please try again.") - - return self.render( - "errors/error.html", code=error.code, req=request, error_title=error_desc, - error_message="An error occurred while processing this request, please try " - "again later. If you believe we have made a mistake, please " - "file an issue on our" - " GitLab." - ), error.code diff --git a/pysite/views/main/__init__.py b/pysite/views/main/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/pysite/views/main/abort.py b/pysite/views/main/abort.py deleted file mode 100644 index ecfe8f91..00000000 --- a/pysite/views/main/abort.py +++ /dev/null @@ -1,11 +0,0 @@ -from werkzeug.exceptions import InternalServerError - -from pysite.base_route import RouteView - - -class EasterEgg500(RouteView): - path = "/500" - name = "500" - - def get(self): - raise InternalServerError diff --git a/pysite/views/main/about/__init__.py b/pysite/views/main/about/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/pysite/views/main/about/channels.py b/pysite/views/main/about/channels.py deleted file mode 100644 index 2e5496f9..00000000 --- a/pysite/views/main/about/channels.py +++ /dev/null @@ -1,7 +0,0 @@ -from pysite.base_route import TemplateView - - -class ChannelsView(TemplateView): - path = "/about/channels" - name = "about.channels" - template = "main/about/channels.html" diff --git a/pysite/views/main/about/index.py b/pysite/views/main/about/index.py deleted file mode 100644 index 6f5ef1c8..00000000 --- a/pysite/views/main/about/index.py +++ /dev/null @@ -1,7 +0,0 @@ -from pysite.base_route import TemplateView - - -class IndexView(TemplateView): - path = "/about/" - name = "about.index" - template = "main/about/index.html" diff --git a/pysite/views/main/about/partners.py b/pysite/views/main/about/partners.py deleted file mode 100644 index 4fe321a5..00000000 --- a/pysite/views/main/about/partners.py +++ /dev/null @@ -1,19 +0,0 @@ -import json -from logging import getLogger - -from pysite.base_route import RouteView - -try: - with open("static/partners.json") as fh: - partners = json.load(fh) -except Exception: - getLogger("Partners").exception("Failed to load partners.json") - categories = None - - -class PartnersView(RouteView): - path = "/about/partners" - name = "about.partners" - - def get(self): - return self.render("main/about/partners.html", partners=partners) diff --git a/pysite/views/main/about/privacy.py b/pysite/views/main/about/privacy.py deleted file mode 100644 index a08aa22b..00000000 --- a/pysite/views/main/about/privacy.py +++ /dev/null @@ -1,7 +0,0 @@ -from pysite.base_route import TemplateView - - -class PrivacyView(TemplateView): - path = "/about/privacy" - name = "about.privacy" - template = "main/about/privacy.html" diff --git a/pysite/views/main/about/rules.py b/pysite/views/main/about/rules.py deleted file mode 100644 index a40110a1..00000000 --- a/pysite/views/main/about/rules.py +++ /dev/null @@ -1,7 +0,0 @@ -from pysite.base_route import TemplateView - - -class RulesView(TemplateView): - path = "/about/rules" - name = "about.rules" - template = "main/about/rules.html" diff --git a/pysite/views/main/auth/__init__.py b/pysite/views/main/auth/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/pysite/views/main/auth/done.py b/pysite/views/main/auth/done.py deleted file mode 100644 index 6e892906..00000000 --- a/pysite/views/main/auth/done.py +++ /dev/null @@ -1,18 +0,0 @@ -from flask import redirect, session, url_for - -from pysite.base_route import RouteView - - -class AuthDoneView(RouteView): - path = "/auth/done" - name = "auth.done" - - def get(self): - if self.logged_in: - target = session.get("redirect_target") - - if target: - del session["redirect_target"] - return redirect(url_for(target["url"], **target.get("kwargs", {}))) - - return redirect(url_for("main.index")) diff --git a/pysite/views/main/bot/cleanlog.py b/pysite/views/main/bot/cleanlog.py deleted file mode 100644 index 9c719b3e..00000000 --- a/pysite/views/main/bot/cleanlog.py +++ /dev/null @@ -1,35 +0,0 @@ -import logging - -from pysite.base_route import RouteView -from pysite.constants import ALL_STAFF_ROLES, DEVELOPERS_ROLE, ROLE_COLORS -from pysite.decorators import require_roles -from pysite.mixins import DBMixin, OAuthMixin - -log = logging.getLogger(__name__) - - -class CleanLogView(RouteView, DBMixin, OAuthMixin): - path = "/bot/clean_logs/" - name = "bot.clean_logs" - - table_name = "clean_logs" - template = "main/bot/clean_logs.html" - - @require_roles(ALL_STAFF_ROLES) - def get(self, log_id): - """ - Get the requested clean log and spit it out - in a beautiful template. - """ - - data = self.db.get(self.table_name, log_id) - - if data is None: - return "ID could not be found in the database", 404 - - messages = data["log_data"] - - for message in messages: - message['color'] = ROLE_COLORS.get(message['role_id'], ROLE_COLORS[DEVELOPERS_ROLE]) - - return self.render(self.template, messages=messages) diff --git a/pysite/views/main/error.py b/pysite/views/main/error.py deleted file mode 100644 index 07286eb4..00000000 --- a/pysite/views/main/error.py +++ /dev/null @@ -1,14 +0,0 @@ -from flask import abort - -from pysite.base_route import RouteView - - -class ErrorView(RouteView): - path = "/error/" - name = "error" - - def get(self, code): - try: - return abort(code) - except LookupError: - return abort(500) diff --git a/pysite/views/main/index.py b/pysite/views/main/index.py deleted file mode 100644 index 874961bb..00000000 --- a/pysite/views/main/index.py +++ /dev/null @@ -1,7 +0,0 @@ -from pysite.base_route import TemplateView - - -class IndexView(TemplateView): - path = "/" - name = "index" - template = "main/index.html" diff --git a/pysite/views/main/info/__init__.py b/pysite/views/main/info/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/pysite/views/main/info/faq.py b/pysite/views/main/info/faq.py deleted file mode 100644 index 8878e180..00000000 --- a/pysite/views/main/info/faq.py +++ /dev/null @@ -1,7 +0,0 @@ -from pysite.base_route import TemplateView - - -class IndexView(TemplateView): - path = "/info/faq" - name = "info.faq" - template = "main/info/faq.html" diff --git a/pysite/views/main/info/help.py b/pysite/views/main/info/help.py deleted file mode 100644 index 6a82a9ed..00000000 --- a/pysite/views/main/info/help.py +++ /dev/null @@ -1,7 +0,0 @@ -from pysite.base_route import TemplateView - - -class HelpView(TemplateView): - path = "/info/help" - name = "info.help" - template = "main/info/help.html" diff --git a/pysite/views/main/info/index.py b/pysite/views/main/info/index.py deleted file mode 100644 index 97678ee4..00000000 --- a/pysite/views/main/info/index.py +++ /dev/null @@ -1,7 +0,0 @@ -from pysite.base_route import TemplateView - - -class IndexView(TemplateView): - path = "/info/" - name = "info.index" - template = "main/info/index.html" diff --git a/pysite/views/main/info/jams.py b/pysite/views/main/info/jams.py deleted file mode 100644 index b654ec1d..00000000 --- a/pysite/views/main/info/jams.py +++ /dev/null @@ -1,7 +0,0 @@ -from pysite.base_route import RedirectView - - -class JamsView(RedirectView): - path = "/info/jams" - name = "info.jams" - page = "main.jams.index" diff --git a/pysite/views/main/info/resources.py b/pysite/views/main/info/resources.py deleted file mode 100644 index 541b9ba1..00000000 --- a/pysite/views/main/info/resources.py +++ /dev/null @@ -1,58 +0,0 @@ -import json -from logging import getLogger - -from pysite.base_route import RouteView - -ICON_STYLES = { - "branding": "fab", - "regular": "far", - "solid": "fas", - "light": "fal" -} - -logger = getLogger("Resources") - -try: - with open("static/resources.json") as fh: - categories = json.load(fh) - - for category, items in categories.items(): - to_remove = [] - - for name, resource in items["resources"].items(): - for url_obj in resource["urls"]: - icon = url_obj["icon"].lower() - - if "/" not in icon: - to_remove.append(name) - logger.error( - f"Resource {name} in category {category} has an invalid icon. Icons should be of the" - f"form `style/name`." - ) - continue - - style, icon_name = icon.split("/") - - if style not in ICON_STYLES: - to_remove.append(name) - logger.error( - f"Resource {name} in category {category} has an invalid icon style. Icon style must " - f"be one of {', '.join(ICON_STYLES.keys())}." - ) - continue - - url_obj["classes"] = f"{ICON_STYLES[style]} fa-{icon_name}" - - for name in to_remove: - del items["resources"][name] -except Exception: - getLogger("Resources").exception("Failed to load resources.json") - categories = None - - -class ResourcesView(RouteView): - path = "/info/resources" - name = "info.resources" - - def get(self): - return self.render("main/info/resources.html", categories=categories) diff --git a/pysite/views/main/jams/__init__.py b/pysite/views/main/jams/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/pysite/views/main/jams/index.py b/pysite/views/main/jams/index.py deleted file mode 100644 index 0cd9a287..00000000 --- a/pysite/views/main/jams/index.py +++ /dev/null @@ -1,52 +0,0 @@ -import rethinkdb - -from pysite.base_route import RouteView -from pysite.mixins import DBMixin - - -class JamsIndexView(RouteView, DBMixin): - path = "/jams" - name = "jams.index" - table_name = "code_jams" - - teams_table = "code_jam_teams" - - def get(self): - query = ( - self.db.query(self.table_name) - .filter(rethinkdb.row["state"] != "planning") - .merge( - lambda jam_obj: { - "teams": - self.db.query(self.teams_table) - .filter(lambda team_row: jam_obj["teams"].contains(team_row["id"])) - .pluck(["id"]) - .coerce_to("array") - } - ) - .order_by(rethinkdb.desc("number")) - .limit(5) - ) - - jams = self.db.run(query, coerce=list) - for jam in jams: - if "winning_team" in jam and jam["winning_team"]: - jam["winning_team"] = self.db.get(self.teams_table, jam["winning_team"]) - else: - jam["winning_team"] = None - pass - return self.render("main/jams/index.html", jams=jams, has_applied_to_jam=self.has_applied_to_jam) - - def get_jam_response(self, jam, user_id): - query = self.db.query("code_jam_responses").filter({"jam": jam, "snowflake": user_id}) - result = self.db.run(query, coerce=list) - - if result: - return result[0] - return None - - def has_applied_to_jam(self, jam): - # whether the user has applied to this jam - if not self.logged_in: - return False - return self.get_jam_response(jam, self.user_data["user_id"]) diff --git a/pysite/views/main/jams/info.py b/pysite/views/main/jams/info.py deleted file mode 100644 index fd4615e9..00000000 --- a/pysite/views/main/jams/info.py +++ /dev/null @@ -1,7 +0,0 @@ -from pysite.base_route import TemplateView - - -class JamsInfoView(TemplateView): - path = "/jams/info" - name = "jams.info" - template = "main/jams/info.html" diff --git a/pysite/views/main/jams/jam_team_list.py b/pysite/views/main/jams/jam_team_list.py deleted file mode 100644 index 452a073f..00000000 --- a/pysite/views/main/jams/jam_team_list.py +++ /dev/null @@ -1,45 +0,0 @@ -import logging - -from werkzeug.exceptions import NotFound - -from pysite.base_route import RouteView -from pysite.mixins import DBMixin, OAuthMixin - -log = logging.getLogger(__name__) - - -class JamsTeamListView(RouteView, DBMixin, OAuthMixin): - path = "/jams/teams/" - name = "jams.jam_team_list" - - table_name = "code_jam_teams" - jams_table = "code_jams" - - def get(self, jam_id): - jam_obj = self.db.get(self.jams_table, jam_id) - if not jam_obj: - raise NotFound() - - # Get all the participants of this jam - # Note: the group function will return a dict with user_ids as keys, however each element will be an array - participants_query = self.db.query("users").get_all(*jam_obj["participants"], index="user_id").group("user_id") - participants = self.db.run(participants_query) - - # Get all the teams, leaving the team members as only an array of IDs - query = self.db.query(self.table_name).get_all(self.table_name, *jam_obj["teams"]).pluck( - ["id", "name", "members", "repo"]).coerce_to("array") - jam_obj["teams"] = self.db.run(query) - - # Populate each team's members using the previously queried participant list - for team in jam_obj["teams"]: - team["members"] = [participants[user_id][0] for user_id in team["members"]] - - return self.render( - "main/jams/team_list.html", - jam=jam_obj, - teams=jam_obj["teams"], - member_ids=self.member_ids - ) - - def member_ids(self, members): - return [member["user_id"] for member in members] diff --git a/pysite/views/main/jams/join.py b/pysite/views/main/jams/join.py deleted file mode 100644 index 4db59630..00000000 --- a/pysite/views/main/jams/join.py +++ /dev/null @@ -1,247 +0,0 @@ -import datetime -from email.utils import parseaddr - -from flask import redirect, request, url_for -from werkzeug.exceptions import BadRequest, NotFound - -from pysite.base_route import RouteView -from pysite.constants import BotEventTypes, CHANNEL_JAM_LOGS -from pysite.decorators import csrf -from pysite.mixins import DBMixin, OAuthMixin, RMQMixin - - -class JamsJoinView(RouteView, DBMixin, OAuthMixin, RMQMixin): - path = "/jams/join/" - name = "jams.join" - - table_name = "code_jams" - forms_table = "code_jam_forms" - questions_table = "code_jam_questions" - responses_table = "code_jam_responses" - participants_table = "code_jam_participants" - infractions_table = "code_jam_infractions" - - def get(self, jam): - jam_obj = self.db.get(self.table_name, jam) - - if not jam_obj: - return NotFound() - - if not self.user_data: - return self.redirect_login(jam=jam) - - infractions = self.get_infractions(self.user_data["user_id"]) - - for infraction in infractions: - if infraction["number"] == -1: # Indefinite ban - return self.render("main/jams/banned.html", infraction=infraction, jam=jam_obj) - - if infraction["number"]: # Got some jams left - if jam not in infraction["decremented_for"]: - # Make sure they haven't already tried to apply for this jam - infraction["number"] -= 1 - infraction["decremented_for"].append(jam) - - self.db.insert(self.infractions_table, infraction, conflict="replace") - - return self.render("main/jams/banned.html", infraction=infraction, jam=jam_obj) - - if jam in infraction["decremented_for"]: - # They already tried to apply for this jam - return self.render("main/jams/banned.html", infraction=infraction, jam=jam_obj) - - participant = self.db.get(self.participants_table, self.user_data["user_id"]) - - if not participant: - return redirect(url_for("main.jams.profile", form=jam)) - - if self.get_response(jam, self.user_data["user_id"]): - return self.render("main/jams/already.html", jam=jam_obj) - - form_obj = self.db.get(self.forms_table, jam) - questions = [] - - if form_obj: - for question in form_obj["questions"]: - questions.append(self.db.get(self.questions_table, question)) - - return self.render( - "main/jams/join.html", jam=jam_obj, form=form_obj, - questions=questions, question_ids=[q["id"] for q in questions] - ) - - @csrf - def post(self, jam): - jam_obj = self.db.get(self.table_name, jam) - - if not jam_obj: - return NotFound() - - if not self.user_data: - return self.redirect_login(jam=jam) - - infractions = self.get_infractions(self.user_data["user_id"]) - - for infraction in infractions: - if infraction["number"] == -1: # Indefinite ban - self.log_banned(infraction["number"], infraction["reason"]) - return self.render("main/jams/banned.html", infraction=infraction) - - if infraction["number"]: # Got some jams left - if jam not in infraction["decremented_for"]: - # Make sure they haven't already tried to apply for this jam - infraction["number"] -= 1 - infraction["decremented_for"].append(jam) - - self.db.insert(self.infractions_table, infraction, conflict="replace") - - self.log_banned(infraction["number"], infraction["reason"]) - return self.render("main/jams/banned.html", infraction=infraction, jam=jam_obj) - - if jam in infraction["decremented_for"]: - # They already tried to apply for this jam - self.log_banned(infraction["number"], infraction["reason"]) - return self.render("main/jams/banned.html", infraction=infraction, jam=jam_obj) - - participant = self.db.get(self.participants_table, self.user_data["user_id"]) - - if not participant: - return redirect(url_for("main.jams.profile")) - - if self.get_response(jam, self.user_data["user_id"]): - return self.render("main/jams/already.html", jam=jam_obj) - - form_obj = self.db.get(self.forms_table, jam) - - if not form_obj: - return NotFound() - - questions = [] - - for question in form_obj["questions"]: - questions.append(self.db.get(self.questions_table, question)) - - answers = [] - - for question in questions: - value = request.form.get(question["id"]) - answer = {"question": question["id"]} - - if not question["optional"] and value is None: - return BadRequest() - - if question["type"] == "checkbox": - if value == "on": - answer["value"] = True - elif not question["optional"]: - return BadRequest() - else: - answer["value"] = False - - elif question["type"] == "email": - if value: - address = parseaddr(value) - - if address == ("", ""): - return BadRequest() - - answer["value"] = value - - elif question["type"] in ["number", "range", "slider"]: - if value is not None: - value = int(value) - - if value > int(question["data"]["max"]) or value < int(question["data"]["min"]): - return BadRequest() - - answer["value"] = value - - elif question["type"] == "radio": - if value: - if value not in question["data"]["options"]: - return BadRequest() - - answer["value"] = value - - elif question["type"] in ["text", "textarea"]: - answer["value"] = value - - answers.append(answer) - - user_id = self.user_data["user_id"] - - response = { - "snowflake": user_id, - "jam": jam, - "approved": False, - "answers": answers - } - - self.db.insert(self.responses_table, response) - self.log_success() - - return self.render("main/jams/thanks.html", jam=jam_obj) - - def get_response(self, jam, user_id): - query = self.db.query(self.responses_table).filter({"jam": jam, "snowflake": user_id}) - result = self.db.run(query, coerce=list) - - if result: - return result[0] - return None - - def get_infractions(self, user_id): - query = self.db.query(self.infractions_table).filter({"participant": user_id}) - return self.db.run(query, coerce=list) - - def log_banned(self, number, reason): - user_data = self.user_data - - user_id = user_data["user_id"] - username = user_data["username"] - discriminator = user_data["discriminator"] - - message = f"Failed code jam signup from banned user: {user_id} ({username}#{discriminator})\n\n" - - if number == -1: - message += f"This user has been banned indefinitely. Reason: '{reason}'" - elif number < 1: - message += f"This application has expired the infraction. Reason: '{reason}'" - else: - message += f"This user has {number} more applications left before they're unbanned. Reason: '{reason}'" - - self.rmq_bot_event( - BotEventTypes.mod_log, - { - "level": "warning", "title": "Code Jams: Applications", - "message": message - } - ) - - def log_success(self): - user_data = self.user_data - - user_id = user_data["user_id"] - username = user_data["username"] - discriminator = user_data["discriminator"] - - self.rmq_bot_event( - BotEventTypes.mod_log, - { - "level": "info", "title": "Code Jams: Applications", - "message": f"Successful code jam signup from user: {user_id} " - f"({username}#{discriminator})" - } - ) - - self.rmq_bot_event( - BotEventTypes.send_embed, - { - "target": CHANNEL_JAM_LOGS, - "title": "Code Jams: Applications", - "description": f"Successful code jam signup from user: {user_id} " - f"({username}#{discriminator})", - "colour": 0x2ecc71, # Green from d.py - "timestamp": datetime.datetime.now().isoformat() - } - ) diff --git a/pysite/views/main/jams/profile.py b/pysite/views/main/jams/profile.py deleted file mode 100644 index e918c135..00000000 --- a/pysite/views/main/jams/profile.py +++ /dev/null @@ -1,71 +0,0 @@ -from flask import redirect, request, url_for -from werkzeug.exceptions import BadRequest - -from pysite.base_route import RouteView -from pysite.decorators import csrf -from pysite.mixins import DBMixin, OAuthMixin - - -class JamsProfileView(RouteView, DBMixin, OAuthMixin): - path = "/jams/profile" - name = "jams.profile" - - table_name = "code_jam_participants" - - def get(self): - if not self.user_data: - return self.redirect_login() - - participant = self.db.get(self.table_name, self.user_data["user_id"]) - existing = True - - if not participant: - participant = {"id": self.user_data["user_id"]} - existing = False - - form = request.args.get("form") - - if form: - try: - form = int(form) - except ValueError: - pass # Someone trying to have some fun I guess - - return self.render( - "main/jams/profile.html", participant=participant, form=form, existing=existing - ) - - @csrf - def post(self): - if not self.user_data: - return self.redirect_login() - - participant = self.db.get(self.table_name, self.user_data["user_id"]) - - if not participant: - participant = {"id": self.user_data["user_id"]} - - gitlab_username = request.form.get("gitlab_username") - timezone = request.form.get("timezone") - - if not gitlab_username or not timezone: - return BadRequest() - - participant["gitlab_username"] = gitlab_username - participant["timezone"] = timezone - - self.db.insert(self.table_name, participant, conflict="replace") - - form = request.args.get("form") - - if form: - try: - form = int(form) - except ValueError: - pass # Someone trying to have some fun I guess - else: - return redirect(url_for("main.jams.join", jam=form)) - - return self.render( - "main/jams/profile.html", participant=participant, done=True, existing=True - ) diff --git a/pysite/views/main/jams/retract.py b/pysite/views/main/jams/retract.py deleted file mode 100644 index 277426b5..00000000 --- a/pysite/views/main/jams/retract.py +++ /dev/null @@ -1,83 +0,0 @@ -from werkzeug.exceptions import BadRequest - -from pysite.base_route import RouteView -from pysite.decorators import csrf -from pysite.mixins import DBMixin, OAuthMixin - -BANNABLE_STATES = ("preparing", "running") - - -class JamsProfileView(RouteView, DBMixin, OAuthMixin): - path = "/jams/retract" - name = "jams.retract" - - table_name = "code_jam_participants" - infractions_table = "code_jam_infractions" - jams_table = "code_jams" - responses_table = "code_jam_responses" - - def get(self): - if not self.user_data: - return self.redirect_login() - - user_id = self.user_data["user_id"] - participant = self.db.get(self.table_name, user_id) - - banned = False - - if participant: - responses = self.db.run(self.db.query(self.responses_table).filter({"snowflake": user_id}), coerce=list) - - for response in responses: - jam = response["jam"] - jam_obj = self.db.get(self.jams_table, jam) - - if jam_obj: - if jam_obj["state"] in BANNABLE_STATES: - banned = True - break - - return self.render( - "main/jams/retract.html", participant=participant, banned=banned - ) - - @csrf - def post(self): - if not self.user_data: - return self.redirect_login() - - user_id = self.user_data["user_id"] - participant = self.db.get(self.table_name, user_id) - - if not participant: - return BadRequest() - - banned = False - - responses = self.db.run(self.db.query(self.responses_table).filter({"snowflake": user_id}), coerce=list) - - for response in responses: - jam = response["jam"] - jam_obj = self.db.get(self.jams_table, jam) - - if jam_obj: - if jam_obj["state"] in BANNABLE_STATES: - banned = True - - self.db.delete(self.responses_table, response["id"]) - - self.db.delete(self.table_name, participant["id"]) - - if banned: - self.db.insert( - self.infractions_table, { - "participant": user_id, - "reason": "Automatic ban: Removed jammer profile in the middle of a code jam", - "number": -1, - "decremented_for": [] - } - ) - - return self.render( - "main/jams/retracted.html", participant=participant, banned=banned - ) diff --git a/pysite/views/main/jams/team_edit_repo.py b/pysite/views/main/jams/team_edit_repo.py deleted file mode 100644 index 03e752bc..00000000 --- a/pysite/views/main/jams/team_edit_repo.py +++ /dev/null @@ -1,151 +0,0 @@ -import logging -import re -from urllib.parse import quote - -import requests -from flask import jsonify, request -from rethinkdb import ReqlNonExistenceError -from urllib3.util import parse_url -from werkzeug.exceptions import NotFound, Unauthorized - -from pysite.base_route import APIView -from pysite.constants import ErrorCodes, GITLAB_ACCESS_TOKEN -from pysite.decorators import csrf -from pysite.mixins import DBMixin, OAuthMixin - -log = logging.getLogger(__name__) - - -class JamsTeamEditRepo(APIView, DBMixin, OAuthMixin): - path = "/jams/teams//edit_repo" - name = "jams.team.edit_repo" - - table_name = "code_jam_teams" - jams_table = "code_jams" - - gitlab_projects_api_endpoint = "https://gitlab.com/api/v4/projects/{0}" - - @csrf - def post(self, team_id): - if not self.user_data: - return self.redirect_login() - - try: - query = self.db.query(self.table_name).get(team_id).merge( - lambda team: { - "jam": self.db.query("code_jams").get(team["jam"]) - } - ) - - team = self.db.run(query) - except ReqlNonExistenceError: - log.exception("Failed RethinkDB query") - raise NotFound() - - # Only team members can use this route - if not self.user_data["user_id"] in team["members"]: - raise Unauthorized() - - repo_url = request.form.get("repo_url").strip() - - # Check if repo is a valid GitLab repo URI - url = parse_url(repo_url) - - if url.host != "gitlab.com" or url.path is None: - return self.error( - ErrorCodes.incorrect_parameters, - "Not a GitLab repository." - ) - - project_path = url.path.strip("/") # /user/repository/ --> user/repository - if len(project_path.split("/")) < 2: - return self.error( - ErrorCodes.incorrect_parameters, - "Not a valid repository." - ) - - word_regex = re.compile("^[\-\.\w]+$") # Alphanumerical, underscores, periods, and dashes - for segment in project_path.split("/"): - if not word_regex.fullmatch(segment): - return self.error( - ErrorCodes.incorrect_parameters, - "Not a valid repository." - ) - - project_path_encoded = quote(project_path, safe='') # Replaces / with %2F, etc. - - # If validation returns something else than True, abort - validation = self.validate_project(team, project_path_encoded) - if validation is not True: - return validation - - # Update the team repo - # Note: the team repo is only stored using its path (e.g. user/repository) - team_obj = self.db.get(self.table_name, team_id) - team_obj["repo"] = project_path - self.db.insert(self.table_name, team_obj, conflict="update") - - return jsonify( - { - "project_path": project_path - } - ) - - def validate_project(self, team, project_path): - # Check on GitLab if the project exists - # NB: certain fields (such as "forked_from_project") need an access token - # to be visible. Set the GITLAB_ACCESS_TOKEN env variable to solve this - query_response = self.request_project(project_path) - - if query_response.status_code != 200: - return self.error( - ErrorCodes.incorrect_parameters, - "Not a valid repository." - ) - - # Check if the jam's base repo has been set by staff - # If not, just ignore the fork check and proceed - if "repo" not in team["jam"]: - return True - jam_repo = team["jam"]["repo"] - - # Check if the provided repo is a forked repo - project_data = query_response.json() - if "forked_from_project" not in project_data: - return self.error( - ErrorCodes.incorrect_parameters, - "This repository is not a fork of the jam's repository." - ) - - # Check if the provided repo is forking the base repo - forked_from_project = project_data["forked_from_project"] - - # The jam repo is stored in full (e.g. https://gitlab.com/user/repository) - jam_repo_path = quote(parse_url(jam_repo).path.strip("/"), safe='') - - # Get info about the code jam repo - jam_repo_response = self.request_project(jam_repo_path) - - # Something went wrong, fail silently - if jam_repo_response.status_code != 200: - return True - - # Check if the IDs for the code jam repo and the fork source match - jam_repo_data = jam_repo_response.json() - if jam_repo_data["id"] != forked_from_project["id"]: - return self.error( - ErrorCodes.incorrect_parameters, - "This repository is not a fork of the jam's repository." - ) - - # All good - return True - - def request_project(self, project_path): - # Request the project details using a private access token - return requests.get( - self.gitlab_projects_api_endpoint.format(project_path), - params={ - "private_token": GITLAB_ACCESS_TOKEN - } - ) diff --git a/pysite/views/main/jams/team_view.py b/pysite/views/main/jams/team_view.py deleted file mode 100644 index 6b5d86ce..00000000 --- a/pysite/views/main/jams/team_view.py +++ /dev/null @@ -1,53 +0,0 @@ -import datetime -import logging - -from rethinkdb import ReqlNonExistenceError -from werkzeug.exceptions import NotFound - -from pysite.base_route import RouteView -from pysite.mixins import DBMixin, OAuthMixin - -log = logging.getLogger(__name__) - - -class JamsTeamView(RouteView, DBMixin, OAuthMixin): - path = "/jams/team/" - name = "jams.team_view" - - table_name = "code_jam_teams" - - def get(self, team_id: str): - try: - query = self.db.query(self.table_name).get(team_id).merge( - lambda team: { - "members": - self.db.query("users") - .filter(lambda user: team["members"].contains(user["user_id"])) - .merge( - lambda user: { - "gitlab_username": self.db.query("code_jam_participants").filter( - {"id": user["user_id"]} - ).coerce_to("array")[0]["gitlab_username"] - } - ).coerce_to("array"), - "jam": self.db.query("code_jams").get(team["jam"]) - } - ) - - team = self.db.run(query) - except ReqlNonExistenceError: - log.exception("Failed RethinkDB query") - raise NotFound() - - # check if the current user is a member of this team - # (this is for edition privileges) - is_own_team = self.logged_in and self.user_data["user_id"] in [member["user_id"] for member in team["members"]] - - return self.render( - "main/jams/team_view.html", - team=team, is_own_team=is_own_team, day_delta=self.day_delta - ) - - def day_delta(self, date, delta): - # util to add or subtract days from a date - return date + datetime.timedelta(days=delta) diff --git a/pysite/views/main/jams/user_team_list.py b/pysite/views/main/jams/user_team_list.py deleted file mode 100644 index 226cc4b0..00000000 --- a/pysite/views/main/jams/user_team_list.py +++ /dev/null @@ -1,37 +0,0 @@ -import rethinkdb - -from pysite.base_route import RouteView -from pysite.mixins import DBMixin, OAuthMixin - - -class JamsUserTeamListView(RouteView, DBMixin, OAuthMixin): - path = "/jams/my_teams" - name = "jams.user_team_list" - - def get(self): - # list teams a user is (or was) a part of - if not self.user_data: - return self.redirect_login() - - query = self.db.query("code_jam_teams").filter( - lambda team: team["members"].contains(self.user_data["user_id"]) - ).merge( - lambda team: { - "members": - self.db.query("users") - .filter(lambda user: team["members"].contains(user["user_id"])) - .merge(lambda user: { - "gitlab_username": - self.db.query("code_jam_participants").filter({"id": user["user_id"]}) - .coerce_to("array")[0]["gitlab_username"] - }).coerce_to("array"), - "jam": self.db.query("code_jams").get(team["jam"]) - } - ).order_by(rethinkdb.desc("jam.number")) - teams = self.db.run(query) - - return self.render( - "main/jams/team_list.html", - user_teams=True, - teams=teams - ) diff --git a/pysite/views/main/logout.py b/pysite/views/main/logout.py deleted file mode 100644 index 64326371..00000000 --- a/pysite/views/main/logout.py +++ /dev/null @@ -1,16 +0,0 @@ -from flask import redirect, session, url_for - -from pysite.base_route import RouteView - - -class LogoutView(RouteView): - path = "/auth/logout" - name = "logout" - - def get(self): - if self.logged_in: - # remove user's session - del session["session_id"] - self.oauth.logout() - - return redirect(url_for("main.index")) diff --git a/pysite/views/main/redirects/__init__.py b/pysite/views/main/redirects/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/pysite/views/main/redirects/github.py b/pysite/views/main/redirects/github.py deleted file mode 100644 index 9e9c0cb8..00000000 --- a/pysite/views/main/redirects/github.py +++ /dev/null @@ -1,8 +0,0 @@ -from pysite.base_route import RedirectView - - -class GitHubView(RedirectView): - path = "/github" - name = "github" - page = "https://gitlab.com/python-discord/" - code = 302 diff --git a/pysite/views/main/redirects/gitlab.py b/pysite/views/main/redirects/gitlab.py deleted file mode 100644 index 4b2b60b4..00000000 --- a/pysite/views/main/redirects/gitlab.py +++ /dev/null @@ -1,8 +0,0 @@ -from pysite.base_route import RedirectView - - -class GitLabView(RedirectView): - path = "/gitlab" - name = "gitlab" - page = "https://gitlab.com/python-discord/" - code = 302 diff --git a/pysite/views/main/redirects/invite.py b/pysite/views/main/redirects/invite.py deleted file mode 100644 index 72e0d144..00000000 --- a/pysite/views/main/redirects/invite.py +++ /dev/null @@ -1,8 +0,0 @@ -from pysite.base_route import RedirectView - - -class InviteView(RedirectView): - path = "/invite" - name = "invite" - page = "https://discord.gg/8NWhsvT" - code = 302 diff --git a/pysite/views/main/redirects/stats.py b/pysite/views/main/redirects/stats.py deleted file mode 100644 index 57a56b3d..00000000 --- a/pysite/views/main/redirects/stats.py +++ /dev/null @@ -1,8 +0,0 @@ -from pysite.base_route import RedirectView - - -class StatsView(RedirectView): - path = "/stats" - name = "stats" - page = "https://p.datadoghq.com/sb/ac8680a8c-c01b556f01b96622fd4f57545b81d568" - code = 302 diff --git a/pysite/views/main/robots_txt.py b/pysite/views/main/robots_txt.py deleted file mode 100644 index 308fe2a2..00000000 --- a/pysite/views/main/robots_txt.py +++ /dev/null @@ -1,15 +0,0 @@ -from flask import Response, url_for - -from pysite.base_route import RouteView - - -class RobotsTXT(RouteView): - path = "/robots.txt" - name = "robots_txt" - - def get(self): - return Response( - self.render( - "robots.txt", sitemap_url=url_for("api.sitemap_xml", _external=True) - ), content_type="text/plain" - ) diff --git a/pysite/views/main/sitemap_xml.py b/pysite/views/main/sitemap_xml.py deleted file mode 100644 index 98893c21..00000000 --- a/pysite/views/main/sitemap_xml.py +++ /dev/null @@ -1,69 +0,0 @@ -from flask import Response, url_for - -from pysite.base_route import RouteView - - -class SitemapXML(RouteView): - path = "/sitemap.xml" - name = "sitemap_xml" - - def get(self): - urls = [ - { - "type": "url", - "url": url_for("main.index", _external=True), - "priority": 1.0, # Max priority - - "images": [ - { - "caption": "Python Discord Logo", - "url": url_for("static", filename="logos/logo_discord.png", _external=True) - }, - { - "caption": "Python Discord Banner", - "url": url_for("static", filename="logos/logo_banner.png", _external=True) - } - ] - }, - - { - "type": "url", - "url": url_for("main.jams.index", _external=True), - "priority": 0.9 # Above normal priority - }, - - { - "type": "url", - "url": url_for("main.about.privacy", _external=True), - "priority": 0.8 # Above normal priority - }, - { - "type": "url", - "url": url_for("main.about.rules", _external=True), - "priority": 0.8 # Above normal priority - }, - - { - "type": "url", - "url": url_for("main.info.help", _external=True), - "priority": 0.7 # Above normal priority - }, - { - "type": "url", - "url": url_for("main.info.faq", _external=True), - "priority": 0.7 # Above normal priority - }, - { - "type": "url", - "url": url_for("main.info.resources", _external=True), - "priority": 0.7 # Above normal priority - }, - - { - "type": "url", - "url": url_for("main.about.partners", _external=True), - "priority": 0.6 # Normal priority - }, - ] - - return Response(self.render("sitemap.xml", urls=urls), content_type="application/xml") diff --git a/pysite/views/main/ws_test.py b/pysite/views/main/ws_test.py deleted file mode 100644 index a0b6215f..00000000 --- a/pysite/views/main/ws_test.py +++ /dev/null @@ -1,14 +0,0 @@ -import os - -from pysite.base_route import RouteView - - -class WSTest(RouteView): - path = "/ws_test" - name = "ws_test" - - def get(self): - return self.render( - "main/ws_test.html", - server_name=os.environ.get("SERVER_NAME", "localhost") - ) diff --git a/pysite/views/main/ws_test_rst.py b/pysite/views/main/ws_test_rst.py deleted file mode 100644 index e80acc55..00000000 --- a/pysite/views/main/ws_test_rst.py +++ /dev/null @@ -1,14 +0,0 @@ -import os - -from pysite.base_route import RouteView - - -class WSTest(RouteView): - path = "/ws_test_rst" - name = "ws_test_rst" - - def get(self): - return self.render( - "main/ws_test_rst.html", - server_name=os.environ.get("SERVER_NAME", "localhost") - ) diff --git a/pysite/views/staff/__init__.py b/pysite/views/staff/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/pysite/views/staff/index.py b/pysite/views/staff/index.py deleted file mode 100644 index a090ebdd..00000000 --- a/pysite/views/staff/index.py +++ /dev/null @@ -1,31 +0,0 @@ -from pprint import pformat - -from flask import current_app - -from pysite.base_route import RouteView -from pysite.constants import ALL_STAFF_ROLES, DEBUG_MODE, TABLE_MANAGER_ROLES -from pysite.decorators import require_roles - - -class StaffView(RouteView): - path = "/" - name = "index" - - @require_roles(*ALL_STAFF_ROLES) - def get(self): - return self.render( - "staff/index.html", manager=self.is_table_editor(), - app_config=pformat(current_app.config, indent=4, width=120) - ) - - def is_table_editor(self): - if DEBUG_MODE: - return True - - data = self.user_data - - for role in TABLE_MANAGER_ROLES: - if role in data.get("roles", []): - return True - - return False diff --git a/pysite/views/staff/jams/__init__.py b/pysite/views/staff/jams/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/pysite/views/staff/jams/actions.py b/pysite/views/staff/jams/actions.py deleted file mode 100644 index dfcbf2de..00000000 --- a/pysite/views/staff/jams/actions.py +++ /dev/null @@ -1,597 +0,0 @@ -from flask import jsonify, request -from rethinkdb import ReqlNonExistenceError - -from pysite.base_route import APIView -from pysite.constants import ALL_STAFF_ROLES, BotEventTypes, CHANNEL_JAM_LOGS, ErrorCodes, JAMMERS_ROLE -from pysite.decorators import csrf, require_roles -from pysite.mixins import DBMixin, RMQMixin -from pysite.utils.words import get_word_pairs - -GET_ACTIONS = ("questions",) -POST_ACTIONS = ( - "associate_question", "disassociate_question", "infraction", "questions", "state", "approve_application", - "unapprove_application", "create_team", "generate_teams", "set_team_member", - "reroll_team", "set_winning_team", "unset_winning_team" -) -DELETE_ACTIONS = ("infraction", "question", "team") - -KEYS = ("action",) -QUESTION_KEYS = ("optional", "title", "type") - - -class ActionView(APIView, DBMixin, RMQMixin): - path = "/jams/action" - name = "jams.action" - - table_name = "code_jams" - forms_table = "code_jam_forms" - infractions_table = "code_jam_infractions" - questions_table = "code_jam_questions" - responses_table = "code_jam_responses" - teams_table = "code_jam_teams" - users_table = "users" - - @csrf - @require_roles(*ALL_STAFF_ROLES) - def get(self): - action = request.args.get("action") - - if action not in GET_ACTIONS: - return self.error(ErrorCodes.incorrect_parameters) - - if action == "questions": - questions = self.db.get_all(self.questions_table) - - return jsonify({"questions": questions}) - - @csrf - @require_roles(*ALL_STAFF_ROLES) - def post(self): - if request.is_json: - data = request.get_json(force=True) - action = data["action"] if "action" in data else None - else: - action = request.form.get("action") - - if action not in POST_ACTIONS: - return self.error(ErrorCodes.incorrect_parameters) - - if action == "associate_question": - form = int(request.form.get("form")) - question = request.form.get("question") - - form_obj = self.db.get(self.forms_table, form) - - if not form_obj: - return self.error(ErrorCodes.incorrect_parameters, f"Unknown form: {form}") - - question_obj = self.db.get(self.questions_table, question) - - if not question_obj: - return self.error(ErrorCodes.incorrect_parameters, f"Unknown question: {question}") - - if question_obj["id"] not in form_obj["questions"]: - form_obj["questions"].append(question_obj["id"]) - self.db.insert(self.forms_table, form_obj, conflict="replace") - - return jsonify({"question": question_obj}) - else: - return self.error( - ErrorCodes.incorrect_parameters, - f"Question {question} already associated with form {form}" - ) - - if action == "disassociate_question": - form = int(request.form.get("form")) - question = request.form.get("question") - - form_obj = self.db.get(self.forms_table, form) - - if not form_obj: - return self.error(ErrorCodes.incorrect_parameters, f"Unknown form: {form}") - - question_obj = self.db.get(self.questions_table, question) - - if not question_obj: - return self.error(ErrorCodes.incorrect_parameters, f"Unknown question: {question}") - - if question_obj["id"] in form_obj["questions"]: - form_obj["questions"].remove(question_obj["id"]) - self.db.insert(self.forms_table, form_obj, conflict="replace") - - return jsonify({"question": question_obj}) - else: - return self.error( - ErrorCodes.incorrect_parameters, - f"Question {question} not already associated with form {form}" - ) - - if action == "state": - jam = int(request.form.get("jam")) - state = request.form.get("state") - - if not all((jam, state)): - return self.error(ErrorCodes.incorrect_parameters) - - jam_obj = self.db.get(self.table_name, jam) - jam_obj["state"] = state - self.db.insert(self.table_name, jam_obj, conflict="update") - - return jsonify({}) - - if action == "questions": - data = request.get_json(force=True) - - for key in QUESTION_KEYS: - if key not in data: - return self.error(ErrorCodes.incorrect_parameters, f"Missing key: {key}") - - title = data["title"] - optional = data["optional"] - question_type = data["type"] - question_data = data.get("data", {}) - - if question_type in ["number", "range", "slider"]: - if "max" not in question_data or "min" not in question_data: - return self.error( - ErrorCodes.incorrect_parameters, f"{question_type} questions must have both max and min values" - ) - - result = self.db.insert( - self.questions_table, - { - "title": title, - "optional": optional, - "type": question_type, - "data": { - "max": question_data["max"], - "min": question_data["min"] - } - }, - conflict="error" - ) - elif question_type == "radio": - if "options" not in question_data: - return self.error( - ErrorCodes.incorrect_parameters, f"{question_type} questions must have both options" - ) - - result = self.db.insert( - self.questions_table, - { - "title": title, - "optional": optional, - "type": question_type, - "data": { - "options": question_data["options"] - } - }, - conflict="error" - ) - else: - result = self.db.insert( - self.questions_table, - { # No extra data for other types of question - "title": title, - "optional": optional, - "type": question_type - }, - conflict="error" - ) - - return jsonify({"id": result["generated_keys"][0]}) - - if action == "infraction": - participant = request.form.get("participant") - reason = request.form.get("reason") - - if not participant or not reason or "number" not in request.form: - return self.error( - ErrorCodes.incorrect_parameters, "Infractions must have a participant, reason and number" - ) - - number = int(request.form.get("number")) - - result = self.db.insert(self.infractions_table, { - "participant": participant, - "reason": reason, - "number": number, - "decremented_for": [] - }) - - return jsonify({"id": result["generated_keys"][0]}) - - if action == "create_team": - jam = request.form.get("jam", type=int) - - if not jam: - return self.error( - ErrorCodes.incorrect_parameters, "Jam number required" - ) - - jam_data = self.db.get(self.table_name, jam) - - if not jam_data: - return self.error( - ErrorCodes.incorrect_parameters, "Unknown jam number" - ) - - word_pairs = get_word_pairs() - adjective, noun = list(word_pairs)[0] - - team = { - "name": f"{adjective} {noun}".title(), - "members": [], - "jam": jam - } - - result = self.db.insert(self.teams_table, team) - team["id"] = result["generated_keys"][0] - - jam_obj = self.db.get(self.table_name, jam) - jam_obj["teams"].append(team["id"]) - - self.db.insert(self.table_name, jam_obj, conflict="replace") - - return jsonify({"team": team}) - - if action == "generate_teams": - jam = request.form.get("jam", type=int) - - if not jam: - return self.error( - ErrorCodes.incorrect_parameters, "Jam number required" - ) - - try: - query = self.db.query(self.table_name).get(jam).merge( - lambda jam_obj: { - "participants": - self.db.query(self.responses_table) - .filter({"jam": jam_obj["number"], "approved": True}) - .eq_join("snowflake", self.db.query(self.users_table)) - .without({"left": ["snowflake", "answers"]}) - .zip() - .order_by("username") - .coerce_to("array"), - "teams": - self.db.query(self.teams_table) - .outer_join(self.db.query(self.table_name), - lambda team_row, jams_row: jams_row["teams"].contains(team_row["id"])) - .pluck({"left": ["id", "name", "members"]}) - .zip() - .coerce_to("array") - } - ) - - jam_data = self.db.run(query) - except ReqlNonExistenceError: - return self.error( - ErrorCodes.incorrect_parameters, "Unknown jam number" - ) - - if jam_data["teams"]: - return self.error( - ErrorCodes.incorrect_parameters, "Jam already has teams" - ) - - num_participants = len(jam_data["participants"]) - num_teams = num_participants // 3 - - if num_participants % 3: - num_teams += 1 - - word_pairs = get_word_pairs(num_teams) - teams = [] - - for adjective, noun in word_pairs: - team = { - "name": f"{adjective} {noun}".title(), - "members": [] - } - - result = self.db.insert(self.teams_table, team, durability="soft") - team["id"] = result["generated_keys"][0] - teams.append(team) - - self.db.sync(self.teams_table) - - jam_obj = self.db.get(self.table_name, jam) - jam_obj["teams"] = [team["id"] for team in teams] - - self.db.insert(self.table_name, jam_obj, conflict="replace") - - return jsonify({"teams": teams}) - - if action == "set_team_member": - jam = request.form.get("jam", type=int) - member = request.form.get("member") - team = request.form.get("team") - - if not jam: - return self.error( - ErrorCodes.incorrect_parameters, "Jam number required" - ) - - if not member: - return self.error( - ErrorCodes.incorrect_parameters, "Member ID required" - ) - - if not team: - return self.error( - ErrorCodes.incorrect_parameters, "Team ID required" - ) - - try: - query = self.db.query(self.table_name).get(jam).merge( - lambda jam_obj: { - "participants": - self.db.query(self.responses_table) - .filter({"jam": jam_obj["number"], "approved": True}) - .eq_join("snowflake", self.db.query(self.users_table)) - .without({"left": ["snowflake", "answers"]}) - .zip() - .order_by("username") - .coerce_to("array"), - "teams": - self.db.query(self.teams_table) - .filter(lambda team_row: jam_obj["teams"].contains(team_row["id"])) - .pluck(["id", "name", "members", "jam"]) - .coerce_to("array") - } - ) - - jam_data = self.db.run(query) - except ReqlNonExistenceError: - return self.error( - ErrorCodes.incorrect_parameters, "Unknown jam number" - ) - - if not jam_data["teams"]: - return self.error( - ErrorCodes.incorrect_parameters, "Jam has no teams" - ) - - team_obj = self.db.get(self.teams_table, team) - - if not team_obj: - return self.error( - ErrorCodes.incorrect_parameters, "Unknown team ID" - ) - - for jam_team_obj in jam_data["teams"]: - if jam_team_obj["id"] == team: - if member not in jam_team_obj["members"]: - jam_team_obj["members"].append(member) - - self.db.insert(self.teams_table, jam_team_obj, conflict="replace") - else: - if member in jam_team_obj["members"]: - jam_team_obj["members"].remove(member) - - self.db.insert(self.teams_table, jam_team_obj, conflict="replace") - - return jsonify({"result": True}) - - if action == "reroll_team": - team = request.form.get("team") - - if not team: - return self.error( - ErrorCodes.incorrect_parameters, "Team ID required" - ) - - team_obj = self.db.get(self.teams_table, team) - - if not team_obj: - return self.error( - ErrorCodes.incorrect_parameters, "Unknown team ID" - ) - - word_pairs = get_word_pairs() - adjective, noun = list(word_pairs)[0] - - team_obj["name"] = f"{adjective} {noun}".title() - - self.db.insert(self.teams_table, team_obj, conflict="replace") - - return jsonify({"name": team_obj["name"]}) - - if action == "set_winning_team": - team = request.form.get("team") - - if not team: - return self.error( - ErrorCodes.incorrect_parameters, "Team ID required" - ) - - team_obj = self.db.get(self.teams_table, team) - - if not team_obj: - return self.error( - ErrorCodes.incorrect_parameters, "Unknown team ID" - ) - - jam_number = team_obj["jam"] - jam_obj = self.db.get(self.table_name, jam_number) - jam_obj["winning_team"] = team - self.db.insert(self.table_name, jam_obj, conflict="replace") - - return jsonify({"result": "success"}) - - if action == "unset_winning_team": - jam = request.form.get("jam", type=int) - - if not jam: - return self.error( - ErrorCodes.incorrect_parameters, "Jam number required" - ) - - jam_obj = self.db.get(self.table_name, jam) - if not jam_obj: - return self.error( - ErrorCodes.incorrect_parameters, "Unknown jam number" - ) - - jam_obj["winning_team"] = None - self.db.insert(self.table_name, jam_obj, conflict="replace") - - return jsonify({"result": "success"}) - - if action == "approve_application": - app = request.form.get("id") - - if not app: - return self.error( - ErrorCodes.incorrect_parameters, "Application ID required" - ) - - app_obj = self.db.get(self.responses_table, app) - - if not app_obj: - return self.error( - ErrorCodes.incorrect_parameters, "Unknown application ID" - ) - - app_obj["approved"] = True - - self.db.insert(self.responses_table, app_obj, conflict="replace") - - jam_obj = self.db.get(self.table_name, app_obj["jam"]) - - snowflake = app_obj["snowflake"] - participants = jam_obj.get("participants", []) - - if snowflake not in participants: - participants.append(snowflake) - jam_obj["participants"] = participants - self.db.insert(self.table_name, jam_obj, conflict="replace") - - self.rmq_bot_event( - BotEventTypes.add_role, - { - "reason": "Code jam application approved", - "role_id": JAMMERS_ROLE, - "target": snowflake, - } - ) - - self.rmq_bot_event( - BotEventTypes.send_message, - { - "message": f"Congratulations <@{snowflake}> - you've been approved, " - f"and we've assigned you the Jammer role!", - "target": CHANNEL_JAM_LOGS, - } - ) - - return jsonify({"result": "success"}) - - if action == "unapprove_application": - app = request.form.get("id") - - if not app: - return self.error( - ErrorCodes.incorrect_parameters, "Application ID required" - ) - - app_obj = self.db.get(self.responses_table, app) - - if not app_obj: - return self.error( - ErrorCodes.incorrect_parameters, "Unknown application ID" - ) - - app_obj["approved"] = False - - self.db.insert(self.responses_table, app_obj, conflict="replace") - - jam_obj = self.db.get(self.table_name, app_obj["jam"]) - - snowflake = app_obj["snowflake"] - participants = jam_obj.get("participants", []) - - if snowflake in participants: - participants.remove(snowflake) - jam_obj["participants"] = participants - - self.db.insert(self.table_name, jam_obj, conflict="replace") - - self.rmq_bot_event( - BotEventTypes.remove_role, - { - "reason": "Code jam application unapproved", - "role_id": JAMMERS_ROLE, - "target": snowflake, - } - ) - - return jsonify({"result": "success"}) - - @csrf - @require_roles(*ALL_STAFF_ROLES) - def delete(self): - action = request.form.get("action") - - if action not in DELETE_ACTIONS: - return self.error(ErrorCodes.incorrect_parameters) - - if action == "question": - question = request.form.get("id") - - if not question: - return self.error(ErrorCodes.incorrect_parameters, f"Missing key: id") - - question_obj = self.db.get(self.questions_table, question) - - if not question_obj: - return self.error(ErrorCodes.incorrect_parameters, f"Unknown question: {question}") - - self.db.delete(self.questions_table, question) - - for form_obj in self.db.get_all(self.forms_table): - if question in form_obj["questions"]: - form_obj["questions"].remove(question) - self.db.insert(self.forms_table, form_obj, conflict="replace") - - return jsonify({"id": question}) - - if action == "infraction": - infraction = request.form.get("id") - - if not infraction: - return self.error(ErrorCodes.incorrect_parameters, "Missing key id") - - infraction_obj = self.db.get(self.infractions_table, infraction) - - if not infraction_obj: - return self.error(ErrorCodes.incorrect_parameters, f"Unknown infraction: {infraction}") - - self.db.delete(self.infractions_table, infraction) - - return jsonify({"id": infraction_obj["id"]}) - - if action == "team": - team = request.form.get("team") - - if not team: - return self.error( - ErrorCodes.incorrect_parameters, "Team ID required" - ) - - team_obj = self.db.get(self.teams_table, team) - - if not team_obj: - return self.error( - ErrorCodes.incorrect_parameters, "Unknown team ID" - ) - - jam_obj = self.db.get(self.table_name, team_obj["jam"]) - if jam_obj: - jam_obj["teams"].remove(team) - self.db.insert(self.table_name, jam_obj, conflict="update") - - self.db.delete(self.teams_table, team) - - return jsonify({"result": True}) diff --git a/pysite/views/staff/jams/create.py b/pysite/views/staff/jams/create.py deleted file mode 100644 index ef61cbef..00000000 --- a/pysite/views/staff/jams/create.py +++ /dev/null @@ -1,61 +0,0 @@ -import datetime - -from flask import redirect, request, url_for -from werkzeug.exceptions import BadRequest - -from pysite.base_route import RouteView -from pysite.constants import ALL_STAFF_ROLES -from pysite.decorators import csrf, require_roles -from pysite.mixins import DBMixin - -REQUIRED_KEYS = ["title", "date_start", "date_end"] - - -class StaffView(RouteView, DBMixin): - path = "/jams/create" - name = "jams.create" - table_name = "code_jams" - - @require_roles(*ALL_STAFF_ROLES) - def get(self): - number = self.get_next_number() - return self.render("staff/jams/create.html", number=number) - - @require_roles(*ALL_STAFF_ROLES) - @csrf - def post(self): - data = {} - - for key in REQUIRED_KEYS: - arg = request.form.get(key) - - if not arg: - return BadRequest() - - data[key] = arg - - data["state"] = "planning" - data["number"] = self.get_next_number() - - # Convert given datetime strings into actual objects, adding timezones to keep rethinkdb happy - date_start = datetime.datetime.strptime(data["date_start"], "%Y-%m-%d %H:%M") - date_start = date_start.replace(tzinfo=datetime.timezone.utc) - - date_end = datetime.datetime.strptime(data["date_end"], "%Y-%m-%d %H:%M") - date_end = date_end.replace(tzinfo=datetime.timezone.utc) - - data["date_start"] = date_start - data["date_end"] = date_end - - self.db.insert(self.table_name, data) - - return redirect(url_for("staff.jams.index")) - - def get_next_number(self) -> int: - count = self.db.run(self.table.count(), coerce=int) - - if count: - max_num = self.db.run(self.table.max("number"))["number"] - - return max_num + 1 - return 1 diff --git a/pysite/views/staff/jams/edit_basics.py b/pysite/views/staff/jams/edit_basics.py deleted file mode 100644 index 462cba14..00000000 --- a/pysite/views/staff/jams/edit_basics.py +++ /dev/null @@ -1,55 +0,0 @@ -import datetime - -from flask import redirect, request, url_for -from werkzeug.exceptions import BadRequest, NotFound - -from pysite.base_route import RouteView -from pysite.constants import ALL_STAFF_ROLES -from pysite.decorators import csrf, require_roles -from pysite.mixins import DBMixin - -REQUIRED_KEYS = ["title", "date_start", "date_end"] - - -class StaffView(RouteView, DBMixin): - path = "/jams//edit/basics" - name = "jams.edit.basics" - table_name = "code_jams" - - @require_roles(*ALL_STAFF_ROLES) - def get(self, jam): - jam_obj = self.db.get(self.table_name, jam) - - if not jam_obj: - return NotFound() - return self.render("staff/jams/edit_basics.html", jam=jam_obj) - - @require_roles(*ALL_STAFF_ROLES) - @csrf - def post(self, jam): - jam_obj = self.db.get(self.table_name, jam) - - if not jam_obj: - return NotFound() - - for key in REQUIRED_KEYS: - arg = request.form.get(key) - - if not arg: - return BadRequest() - - jam_obj[key] = arg - - # Convert given datetime strings into actual objects, adding timezones to keep rethinkdb happy - date_start = datetime.datetime.strptime(jam_obj["date_start"], "%Y-%m-%d %H:%M") - date_start = date_start.replace(tzinfo=datetime.timezone.utc) - - date_end = datetime.datetime.strptime(jam_obj["date_end"], "%Y-%m-%d %H:%M") - date_end = date_end.replace(tzinfo=datetime.timezone.utc) - - jam_obj["date_start"] = date_start - jam_obj["date_end"] = date_end - - self.db.insert(self.table_name, jam_obj, conflict="replace") - - return redirect(url_for("staff.jams.index")) diff --git a/pysite/views/staff/jams/edit_ending.py b/pysite/views/staff/jams/edit_ending.py deleted file mode 100644 index 43a36ebc..00000000 --- a/pysite/views/staff/jams/edit_ending.py +++ /dev/null @@ -1,54 +0,0 @@ -from flask import redirect, request, url_for -from werkzeug.exceptions import BadRequest, NotFound - -from pysite.base_route import RouteView -from pysite.constants import ALL_STAFF_ROLES -from pysite.decorators import csrf, require_roles -from pysite.mixins import DBMixin -from pysite.rst import render - -REQUIRED_KEYS = ["end_rst"] -ALLOWED_STATES = ["judging", "finished"] - - -class StaffView(RouteView, DBMixin): - path = "/jams//edit/ending" - name = "jams.edit.ending" - table_name = "code_jams" - - @require_roles(*ALL_STAFF_ROLES) - def get(self, jam): - jam_obj = self.db.get(self.table_name, jam) - - if not jam_obj: - return NotFound() - - if not jam_obj["state"] in ALLOWED_STATES: - return BadRequest() - - return self.render("staff/jams/edit_ending.html", jam=jam_obj) - - @require_roles(*ALL_STAFF_ROLES) - @csrf - def post(self, jam): - jam_obj = self.db.get(self.table_name, jam) - - if not jam_obj: - return NotFound() - - if not jam_obj["state"] in ALLOWED_STATES: - return BadRequest() - - for key in REQUIRED_KEYS: - arg = request.form.get(key) - - if not arg: - return BadRequest() - - jam_obj[key] = arg - - jam_obj["end_html"] = render(jam_obj["end_rst"], link_headers=False)["html"] - - self.db.insert(self.table_name, jam_obj, conflict="replace") - - return redirect(url_for("staff.jams.index")) diff --git a/pysite/views/staff/jams/edit_info.py b/pysite/views/staff/jams/edit_info.py deleted file mode 100644 index 4944ae67..00000000 --- a/pysite/views/staff/jams/edit_info.py +++ /dev/null @@ -1,55 +0,0 @@ -from flask import redirect, request, url_for -from werkzeug.exceptions import BadRequest, NotFound - -from pysite.base_route import RouteView -from pysite.constants import ALL_STAFF_ROLES -from pysite.decorators import csrf, require_roles -from pysite.mixins import DBMixin -from pysite.rst import render - -REQUIRED_KEYS = ["info_rst", "repo", "task_rst", "theme"] -ALLOWED_STATES = ["planning", "announced", "preparing", "finished"] - - -class StaffView(RouteView, DBMixin): - path = "/jams//edit/info" - name = "jams.edit.info" - table_name = "code_jams" - - @require_roles(*ALL_STAFF_ROLES) - def get(self, jam): - jam_obj = self.db.get(self.table_name, jam) - - if not jam_obj: - return NotFound() - - if not jam_obj["state"] in ALLOWED_STATES: - return BadRequest() - - return self.render("staff/jams/edit_info.html", jam=jam_obj) - - @require_roles(*ALL_STAFF_ROLES) - @csrf - def post(self, jam): - jam_obj = self.db.get(self.table_name, jam) - - if not jam_obj: - return NotFound() - - if not jam_obj["state"] in ALLOWED_STATES: - return BadRequest() - - for key in REQUIRED_KEYS: - arg = request.form.get(key) - - if not arg: - return BadRequest() - - jam_obj[key] = arg - - jam_obj["task_html"] = render(jam_obj["task_rst"], link_headers=False)["html"] - jam_obj["info_html"] = render(jam_obj["info_rst"], link_headers=False)["html"] - - self.db.insert(self.table_name, jam_obj, conflict="replace") - - return redirect(url_for("staff.jams.index")) diff --git a/pysite/views/staff/jams/forms/__init__.py b/pysite/views/staff/jams/forms/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/pysite/views/staff/jams/forms/preamble_edit.py b/pysite/views/staff/jams/forms/preamble_edit.py deleted file mode 100644 index 59b4678b..00000000 --- a/pysite/views/staff/jams/forms/preamble_edit.py +++ /dev/null @@ -1,45 +0,0 @@ -from flask import redirect, request, url_for -from werkzeug.exceptions import NotFound - -from pysite.base_route import RouteView -from pysite.constants import ALL_STAFF_ROLES -from pysite.decorators import csrf, require_roles -from pysite.mixins import DBMixin -from pysite.rst import render - - -class StaffView(RouteView, DBMixin): - path = "/jams/form//preamble" - name = "jams.forms.preamble.edit" - - table_name = "code_jam_forms" - jams_table = "code_jams" - - @require_roles(*ALL_STAFF_ROLES) - def get(self, jam): - jam_obj = self.db.get(self.jams_table, jam) - - if not jam_obj: - return NotFound() - - form_obj = self.db.get(self.table_name, jam) - return self.render("staff/jams/forms/preamble_edit.html", jam=jam_obj, form=form_obj) - - @require_roles(*ALL_STAFF_ROLES) - @csrf - def post(self, jam): - jam_obj = self.db.get(self.table_name, jam) - - if not jam_obj: - return NotFound() - - form_obj = self.db.get(self.table_name, jam) - - preamble_rst = request.form.get("preamble_rst") - - form_obj["preamble_rst"] = preamble_rst - form_obj["preamble_html"] = render(preamble_rst, link_headers=False)["html"] - - self.db.insert(self.table_name, form_obj, conflict="replace") - - return redirect(url_for("staff.jams.forms.view", jam=jam)) diff --git a/pysite/views/staff/jams/forms/questions_edit.py b/pysite/views/staff/jams/forms/questions_edit.py deleted file mode 100644 index d46c4ef3..00000000 --- a/pysite/views/staff/jams/forms/questions_edit.py +++ /dev/null @@ -1,75 +0,0 @@ -import json - -from flask import redirect, request, url_for -from werkzeug.exceptions import BadRequest, NotFound - -from pysite.base_route import RouteView -from pysite.constants import ALL_STAFF_ROLES -from pysite.decorators import csrf, require_roles -from pysite.mixins import DBMixin - -REQUIRED_KEYS = ["title", "date_start", "date_end"] - - -class StaffView(RouteView, DBMixin): - path = "/jams/forms/questions/" - name = "jams.forms.questions.edit" - - questions_table = "code_jam_questions" - - @require_roles(*ALL_STAFF_ROLES) - def get(self, question): - question_obj = self.db.get(self.questions_table, question) - - if not question_obj: - return NotFound() - - question_obj["data"] = question_obj.get("data", {}) - - return self.render( - "staff/jams/forms/questions_edit.html", question=question_obj - ) - - @require_roles(*ALL_STAFF_ROLES) - @csrf - def post(self, question): - question_obj = self.db.get(self.questions_table, question) - - if not question_obj: - return NotFound() - - title = request.form.get("title") - optional = request.form.get("optional") - question_type = request.form.get("type") - - if not title or not optional or not question_type: - return BadRequest() - - question_obj["title"] = title - question_obj["optional"] = optional == "optional" - question_obj["type"] = question_type - - if question_type == "radio": - options = request.form.get("options") - - if not options: - return BadRequest() - - options = json.loads(options)["options"] # No choice this time - question_obj["data"] = {"options": options} - - elif question_type in ("number", "range", "slider"): - question_min = request.form.get("min") - question_max = request.form.get("max") - - if question_min is None or question_max is None: - return BadRequest() - - question_obj["data"] = { - "min": question_min, - "max": question_max - } - - self.db.insert(self.questions_table, question_obj, conflict="replace") - - return redirect(url_for("staff.jams.forms.questions")) diff --git a/pysite/views/staff/jams/forms/questions_view.py b/pysite/views/staff/jams/forms/questions_view.py deleted file mode 100644 index 50ad009e..00000000 --- a/pysite/views/staff/jams/forms/questions_view.py +++ /dev/null @@ -1,22 +0,0 @@ -from pysite.base_route import RouteView -from pysite.constants import ALL_STAFF_ROLES -from pysite.decorators import require_roles -from pysite.mixins import DBMixin - -REQUIRED_KEYS = ["title", "date_start", "date_end"] - - -class StaffView(RouteView, DBMixin): - path = "/jams/forms/questions" - name = "jams.forms.questions" - - questions_table = "code_jam_questions" - - @require_roles(*ALL_STAFF_ROLES) - def get(self): - questions = self.db.get_all(self.questions_table) - - return self.render( - "staff/jams/forms/questions_view.html", questions=questions, - question_ids=[q["id"] for q in questions] - ) diff --git a/pysite/views/staff/jams/forms/view.py b/pysite/views/staff/jams/forms/view.py deleted file mode 100644 index 8d4e16ad..00000000 --- a/pysite/views/staff/jams/forms/view.py +++ /dev/null @@ -1,46 +0,0 @@ -from werkzeug.exceptions import NotFound - -from pysite.base_route import RouteView -from pysite.constants import ALL_STAFF_ROLES -from pysite.decorators import require_roles -from pysite.mixins import DBMixin - -REQUIRED_KEYS = ["title", "date_start", "date_end"] - - -class StaffView(RouteView, DBMixin): - path = "/jams/forms/" - name = "jams.forms.view" - - table_name = "code_jams" - forms_table = "code_jam_forms" - questions_table = "code_jam_questions" - - @require_roles(*ALL_STAFF_ROLES) - def get(self, jam): - jam_obj = self.db.get(self.table_name, jam) - - if not jam_obj: - return NotFound() - - form_obj = self.db.get(self.forms_table, jam) - - if not form_obj: - form_obj = { - "number": jam, - "questions": [], - "preamble_rst": "", - "preamble_html": "" - } - - self.db.insert(self.forms_table, form_obj) - - if form_obj["questions"]: - questions = self.db.get_all(self.questions_table, *[q for q in form_obj["questions"]]) - else: - questions = [] - - return self.render( - "staff/jams/forms/view.html", jam=jam_obj, form=form_obj, - questions=questions, question_ids=[q["id"] for q in questions] - ) diff --git a/pysite/views/staff/jams/index.py b/pysite/views/staff/jams/index.py deleted file mode 100644 index 40a8387c..00000000 --- a/pysite/views/staff/jams/index.py +++ /dev/null @@ -1,15 +0,0 @@ -from pysite.base_route import RouteView -from pysite.constants import ALL_STAFF_ROLES, JAM_STATES -from pysite.decorators import require_roles -from pysite.mixins import DBMixin - - -class StaffView(RouteView, DBMixin): - path = "/jams" - name = "jams.index" - table_name = "code_jams" - - @require_roles(*ALL_STAFF_ROLES) - def get(self): - jams = self.db.get_all(self.table_name) - return self.render("staff/jams/index.html", jams=jams, states=JAM_STATES) diff --git a/pysite/views/staff/jams/infractions/__init__.py b/pysite/views/staff/jams/infractions/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/pysite/views/staff/jams/infractions/view.py b/pysite/views/staff/jams/infractions/view.py deleted file mode 100644 index 235f99ac..00000000 --- a/pysite/views/staff/jams/infractions/view.py +++ /dev/null @@ -1,29 +0,0 @@ -from pysite.base_route import RouteView -from pysite.constants import ALL_STAFF_ROLES -from pysite.decorators import require_roles -from pysite.mixins import DBMixin - -REQUIRED_KEYS = ["title", "date_start", "date_end"] - - -class StaffView(RouteView, DBMixin): - path = "/jams/infractions" - name = "jams.infractions" - - table_name = "code_jam_infractions" - users_table = "users" - - @require_roles(*ALL_STAFF_ROLES) - def get(self): - infractions = self.db.get_all(self.table_name) - - for document in infractions: - user_obj = self.db.get(self.users_table, document["participant"]) - - if user_obj: - document["participant"] = user_obj - - return self.render( - "staff/jams/infractions/view.html", infractions=infractions, - infraction_ids=[i["id"] for i in infractions] - ) diff --git a/pysite/views/staff/jams/participants.py b/pysite/views/staff/jams/participants.py deleted file mode 100644 index 52f9bdec..00000000 --- a/pysite/views/staff/jams/participants.py +++ /dev/null @@ -1,56 +0,0 @@ -import logging - -from rethinkdb import ReqlNonExistenceError -from werkzeug.exceptions import NotFound - -from pysite.base_route import RouteView -from pysite.constants import ALL_STAFF_ROLES -from pysite.decorators import require_roles -from pysite.mixins import DBMixin - -REQUIRED_KEYS = ["title", "date_start", "date_end"] -log = logging.getLogger(__name__) - - -class StaffView(RouteView, DBMixin): - path = "/jams/participants/" - name = "jams.participants" - - forms_table = "code_jam_forms" - participants_table = "code_jam_participants" - questions_table = "code_jam_questions" - responses_table = "code_jam_responses" - table_name = "code_jams" - users_table = "users" - - @require_roles(*ALL_STAFF_ROLES) - def get(self, jam: int): - try: - query = self.db.query(self.table_name).get(jam).merge( - lambda jam_obj: { - "participants": - self.db.query(self.responses_table) - .filter({"jam": jam_obj["number"]}) - .eq_join("snowflake", self.db.query(self.users_table)) - .without({"left": "snowflake"}) - .zip() - .coerce_to("array") - } - ) - - jam_data = self.db.run(query) - except ReqlNonExistenceError: - log.exception("Failed RethinkDB query") - raise NotFound() - - form_obj = self.db.get(self.forms_table, jam) - questions = {} - - if form_obj: - for question in form_obj["questions"]: - questions[question] = self.db.get(self.questions_table, question) - - return self.render( - "staff/jams/participants.html", - jam=jam_data, form=form_obj, questions=questions - ) diff --git a/pysite/views/staff/jams/teams/__init__.py b/pysite/views/staff/jams/teams/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/pysite/views/staff/jams/teams/view.py b/pysite/views/staff/jams/teams/view.py deleted file mode 100644 index 662cc084..00000000 --- a/pysite/views/staff/jams/teams/view.py +++ /dev/null @@ -1,102 +0,0 @@ -import logging - -from rethinkdb import ReqlNonExistenceError -from werkzeug.exceptions import NotFound - -from pysite.base_route import RouteView -from pysite.constants import ALL_STAFF_ROLES -from pysite.decorators import require_roles -from pysite.mixins import DBMixin - -REQUIRED_KEYS = ("title", "date_start", "date_end") -log = logging.getLogger(__name__) - - -class StaffView(RouteView, DBMixin): - path = "/jams/teams/" - name = "jams.teams" - - table_name = "code_jam_teams" - - forms_table = "code_jam_forms" - jams_table = "code_jams" - participants_table = "code_jam_participants" - questions_table = "code_jam_questions" - responses_table = "code_jam_responses" - users_table = "users" - - @require_roles(*ALL_STAFF_ROLES) - def get(self, jam: int): - try: - query = self.db.query(self.jams_table).get(jam).merge( - # Merge the jam document with a custom document defined below - lambda jam_obj: { # The lambda lets us manipulate the jam document server-side - "participants": - # Query the responses table - self.db.query(self.responses_table) - # Filter: approved responses for this jam only # noqa: E131 - .filter({"jam": jam_obj["number"], "approved": True}) - # Join each response document with documents from the user table that match the user that - # created this response - this is the efficient way to do things, inner/outer joins - # are slower as they only support explicit predicates - .eq_join("snowflake", self.db.query(self.users_table)) - # Remove the user ID from the left side (the response document) - .without({"left": ["snowflake"]}) - .zip() # Combine the left and right documents together - .order_by("username") # Reorder the documents by username - .coerce_to("array"), # Coerce the document stream into an array - "profiles": - # Query the responses table (again) - # We do this because RethinkDB just returns empty lists if you join on another join - self.db.query(self.responses_table) - # Filter: approved responses for this jam only # noqa: E131 - .filter({"jam": jam_obj["number"], "approved": True}) - # Join each response document with documents from the participant profiles table - # this time - .eq_join("snowflake", self.db.query(self.participants_table)) - # Remove the user ID and answers from the left side (the response document) - .without({"left": ["snowflake", "answers"]}) - .zip() # Combine the left and right documents together - .order_by("username") # Reorder the documents by username - .coerce_to("array"), # Coerce the document stream into an array - "form": self.db.query(self.forms_table).get(jam), # Just get the correct form object - "teams": - self.db.query(self.table_name) - .filter(lambda team_row: jam_obj["teams"].contains(team_row["id"])) - .pluck(["id", "name", "members"]) - .coerce_to("array") - } - ) - - jam_data = self.db.run(query) - except ReqlNonExistenceError: - log.exception("Failed RethinkDB query") - raise NotFound() - - questions = {} - - for question in jam_data["form"]["questions"]: - questions[question] = self.db.get(self.questions_table, question) - - teams = {} - participants = {} - assigned = [] - - for team in jam_data["teams"]: - teams[team["id"]] = team - - for member in team["members"]: - assigned.append(member) - - for user in jam_data["participants"]: - participants[user["user_id"]] = user - - for profile in jam_data["profiles"]: - participants[profile["id"]]["profile"] = profile - - return self.render( - "staff/jams/teams/view.html", - jam=jam_data, teams=teams, - participants=participants, assigned=assigned, - questions=questions - ) diff --git a/pysite/views/staff/render.py b/pysite/views/staff/render.py deleted file mode 100644 index 0152e568..00000000 --- a/pysite/views/staff/render.py +++ /dev/null @@ -1,62 +0,0 @@ -import re - -from docutils.utils import SystemMessage -from flask import jsonify -from schema import Schema - -from pysite.base_route import APIView -from pysite.constants import EDITOR_ROLES, ValidationTypes -from pysite.decorators import api_params, csrf, require_roles -from pysite.rst import render - -SCHEMA = Schema([{ - "data": str -}]) - -MESSAGE_REGEX = re.compile(r":(\d+): \([A-Z]+/\d\) (.*)") - - -class RenderView(APIView): - path = "/render" # "path" means that it accepts slashes - name = "render" - - @csrf - @require_roles(*EDITOR_ROLES) - @api_params(schema=SCHEMA, validation_type=ValidationTypes.json) - def post(self, data): - if not len(data): - return jsonify({"error": "No data!"}) - - data = data[0]["data"] - try: - html = render(data, link_headers=False)["html"] - - return jsonify({"data": html}) - except SystemMessage as e: - lines = str(e) - data = { - "error": lines, - "error_lines": [] - } - - if "\n" in lines: - lines = lines.split("\n") - else: - lines = [lines] - - for message in lines: - match = MESSAGE_REGEX.match(message) - - if match: - data["error_lines"].append( - { - "row": int(match.group(1)) - 3, - "column": 0, - "type": "error", - "text": match.group(2) - } - ) - - return jsonify(data) - except Exception as e: - return jsonify({"error": str(e)}) diff --git a/pysite/views/staff/robots_txt.py b/pysite/views/staff/robots_txt.py deleted file mode 100644 index 308fe2a2..00000000 --- a/pysite/views/staff/robots_txt.py +++ /dev/null @@ -1,15 +0,0 @@ -from flask import Response, url_for - -from pysite.base_route import RouteView - - -class RobotsTXT(RouteView): - path = "/robots.txt" - name = "robots_txt" - - def get(self): - return Response( - self.render( - "robots.txt", sitemap_url=url_for("api.sitemap_xml", _external=True) - ), content_type="text/plain" - ) diff --git a/pysite/views/staff/sitemap_xml.py b/pysite/views/staff/sitemap_xml.py deleted file mode 100644 index 26a786b0..00000000 --- a/pysite/views/staff/sitemap_xml.py +++ /dev/null @@ -1,11 +0,0 @@ -from flask import Response - -from pysite.base_route import RouteView - - -class SitemapXML(RouteView): - path = "/sitemap.xml" - name = "sitemap_xml" - - def get(self): - return Response(self.render("sitemap.xml", urls=[]), content_type="application/xml") diff --git a/pysite/views/staff/tables/__init__.py b/pysite/views/staff/tables/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/pysite/views/staff/tables/edit.py b/pysite/views/staff/tables/edit.py deleted file mode 100644 index 7de63ad2..00000000 --- a/pysite/views/staff/tables/edit.py +++ /dev/null @@ -1,110 +0,0 @@ -import json - -from flask import redirect, request, url_for -from werkzeug.exceptions import BadRequest, NotFound - -from pysite.base_route import RouteView -from pysite.constants import TABLE_MANAGER_ROLES -from pysite.decorators import csrf, require_roles -from pysite.mixins import DBMixin -from pysite.tables import TABLES - - -class TableEditView(RouteView, DBMixin): - path = "/tables/
    /edit" - name = "tables.edit" - - @require_roles(*TABLE_MANAGER_ROLES) - def get(self, table): - obj = TABLES.get(table) - - if not obj: - # Unknown table - raise NotFound() - - if obj.locked: - return redirect(url_for("staff.tables.table", table=table, page=1), code=303) - - key = request.args.get("key") - - old_primary = None - - if key: - db_obj = self.db.get(table, key) - old_primary = key # Provide the current document's primary key, in case it's modified - - document = json.dumps( # Editor uses JSON - db_obj, - indent=4 - ) - else: - document = json.dumps( # Generate default document from key schema - {k: "" for k in obj.keys}, - indent=4 - ) - - return self.render( - "staff/tables/edit.html", table=table, primary_key=obj.primary_key, - document=document, old_primary=old_primary - ) - - @require_roles(*TABLE_MANAGER_ROLES) - @csrf - def post(self, table): - obj = TABLES.get(table) - - if not obj: - # Unknown table - raise NotFound() - - if obj.locked: - raise BadRequest() - - data = request.form.get("json") - old_primary = request.form.get("old_primary") - - if not data: - # No data given (for some reason) - document = json.dumps( - {k: "" for k in obj.keys}, - indent=4 - ) - - return self.render( - "staff/tables/edit.html", table=table, primary_key=obj.primary_key, document=document, - message="Please provide some data to save", old_primary=old_primary - ) - - try: - data = json.loads(data) - except json.JSONDecodeError as e: - # Invalid JSON - return self.render( - "staff/tables/edit.html", table=table, primary_key=obj.primary_key, document=data, - message=f"Invalid JSON, please try again: {e}", old_primary=old_primary - ) - - if not data[obj.primary_key]: - # No primary key value provided - return self.render( - "staff/tables/edit.html", table=table, primary_key=obj.primary_key, document=data, - message=f"Please provide a value for the primary key: {obj.primary_key}", old_primary=old_primary - ) - - if old_primary is None: - self.db.insert( # This is a new object, so just insert it - table, data - ) - elif old_primary == data[obj.primary_key]: - self.db.insert( # This is an update without a primary key change, replace the whole document - table, data, conflict="replace" - ) - else: - self.db.delete( # This is a primary key change, so we need to remove the old object - table, old_primary - ) - self.db.insert( - table, data, - ) - - return redirect(url_for("staff.tables.table", table=table, page=1), code=303) diff --git a/pysite/views/staff/tables/index.py b/pysite/views/staff/tables/index.py deleted file mode 100644 index 0d84aeb4..00000000 --- a/pysite/views/staff/tables/index.py +++ /dev/null @@ -1,13 +0,0 @@ -from pysite.base_route import RouteView -from pysite.constants import TABLE_MANAGER_ROLES -from pysite.decorators import require_roles -from pysite.tables import TABLES - - -class TablesView(RouteView): - path = "/tables" - name = "tables.index" - - @require_roles(*TABLE_MANAGER_ROLES) - def get(self): - return self.render("staff/tables/index.html", tables=TABLES) diff --git a/pysite/views/staff/tables/table.py b/pysite/views/staff/tables/table.py deleted file mode 100644 index f47d7793..00000000 --- a/pysite/views/staff/tables/table.py +++ /dev/null @@ -1,63 +0,0 @@ -from math import ceil - -from flask import request -from werkzeug.exceptions import BadRequest, NotFound - -from pysite.base_route import RouteView -from pysite.constants import TABLE_MANAGER_ROLES -from pysite.decorators import require_roles -from pysite.mixins import DBMixin -from pysite.tables import TABLES - - -class TableView(RouteView, DBMixin): - path = "/tables/
    /" - name = "tables.table" - - @require_roles(*TABLE_MANAGER_ROLES) - def get(self, table, page): - search = request.args.get("search") - search_key = request.args.get("search-key") - - pages = page - obj = TABLES.get(table) - - if not obj: - return NotFound() - - if search: - new_search = f"(?i){search}" # Case-insensitive search - search_key = search_key or obj.primary_key - - query = self.db.query(table).filter(lambda d: d[search_key].match(new_search)) - else: - query = self.db.query(table) - - if page != "all": - try: - page = int(page) - except ValueError: - # Not an integer - return BadRequest() - - count = self.db.run(query.count(), coerce=int) - pages = max(ceil(count / 10), 1) # Pages if we have 10 documents per page, always at least one - - if page < 1 or page > pages: - # If the page is too small or too big, well, that's an error - return BadRequest() - - documents = self.db.run( # Get only the documents for this page - query.skip((page - 1) * 10).limit(10), - coerce=list - ) - else: - documents = self.db.run(query, coerce=list) - - documents = [dict(sorted(d.items())) for d in documents] - - return self.render( - "staff/tables/table.html", - table=table, documents=documents, table_obj=obj, - page=page, pages=pages, search=search, search_key=search_key - ) diff --git a/pysite/views/staff/tables/table_bare.py b/pysite/views/staff/tables/table_bare.py deleted file mode 100644 index abd6cb19..00000000 --- a/pysite/views/staff/tables/table_bare.py +++ /dev/null @@ -1,30 +0,0 @@ -from flask import redirect, request, url_for -from werkzeug.exceptions import NotFound - -from pysite.base_route import RouteView -from pysite.constants import TABLE_MANAGER_ROLES -from pysite.decorators import require_roles -from pysite.mixins import DBMixin -from pysite.tables import TABLES - - -class TableView(RouteView, DBMixin): - path = "/tables/
    " - name = "tables.table_bare" - - @require_roles(*TABLE_MANAGER_ROLES) - def get(self, table): - if table not in TABLES: - raise NotFound() - - search = request.args.get("search") - - args = { - "table": table, - "page": 1 - } - - if search is not None: - args["search"] = search - - return redirect(url_for("staff.tables.table", **args)) diff --git a/pysite/views/tests/__init__.py b/pysite/views/tests/__init__.py deleted file mode 100644 index adfc1286..00000000 --- a/pysite/views/tests/__init__.py +++ /dev/null @@ -1 +0,0 @@ -# .gitkeep diff --git a/pysite/views/tests/index.py b/pysite/views/tests/index.py deleted file mode 100644 index f99e3f3c..00000000 --- a/pysite/views/tests/index.py +++ /dev/null @@ -1,23 +0,0 @@ -from flask import jsonify -from schema import Schema - -from pysite.base_route import APIView -from pysite.constants import ValidationTypes -from pysite.decorators import api_params - -LIST_SCHEMA = Schema([{"test": str}]) -DICT_SCHEMA = Schema({"segfault": str}) - - -class TestParamsView(APIView): - path = "/testparams" - name = "testparams" - - @api_params(schema=DICT_SCHEMA, validation_type=ValidationTypes.params) - def get(self, data): - return jsonify(data) - - @api_params(schema=LIST_SCHEMA, validation_type=ValidationTypes.params) - def post(self, data): - jsonified = jsonify(data) - return jsonified diff --git a/pysite/views/wiki/__init__.py b/pysite/views/wiki/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/pysite/views/wiki/delete.py b/pysite/views/wiki/delete.py deleted file mode 100644 index 728570a9..00000000 --- a/pysite/views/wiki/delete.py +++ /dev/null @@ -1,64 +0,0 @@ -import datetime - -from flask import redirect, url_for -from werkzeug.exceptions import NotFound - -from pysite.base_route import RouteView -from pysite.constants import BotEventTypes, CHANNEL_MOD_LOG, EDITOR_ROLES -from pysite.decorators import csrf, require_roles -from pysite.mixins import DBMixin, RMQMixin - - -class DeleteView(RouteView, DBMixin, RMQMixin): - path = "/delete/" # "path" means that it accepts slashes - name = "delete" - table_name = "wiki" - revision_table_name = "wiki_revisions" - - @require_roles(*EDITOR_ROLES) - def get(self, page): - obj = self.db.get(self.table_name, page) - - if obj: - title = obj.get("title", "") - - if obj.get("lock_expiry") and obj.get("lock_user") != self.user_data.get("user_id"): - lock_time = datetime.datetime.fromtimestamp(obj["lock_expiry"]) - if datetime.datetime.utcnow() < lock_time: - return self.render("wiki/page_in_use.html", page=page) - - return self.render("wiki/page_delete.html", page=page, title=title, can_edit=True) - else: - raise NotFound() - - @require_roles(*EDITOR_ROLES) - @csrf - def post(self, page): - obj = self.db.get(self.table_name, page) - - if not obj: - raise NotFound() - - self.db.delete(self.table_name, page) - self.db.delete(self.revision_table_name, page) - - revisions = self.db.filter(self.revision_table_name, lambda revision: revision["slug"] == page) - - for revision in revisions: - self.db.delete(self.revision_table_name, revision["id"]) - - self.audit_log(obj) - - return redirect(url_for("wiki.page", page="home"), code=303) # Redirect, ensuring a GET - - def audit_log(self, obj): - self.rmq_bot_event( - BotEventTypes.send_embed, - { - "target": CHANNEL_MOD_LOG, - "title": f"Page Deletion", - "description": f"**{obj['title']}** was deleted by **{self.user_data.get('username')}**", - "colour": 0x3F8DD7, # Light blue - "timestamp": datetime.datetime.now().isoformat() - } - ) diff --git a/pysite/views/wiki/edit.py b/pysite/views/wiki/edit.py deleted file mode 100644 index 949c9942..00000000 --- a/pysite/views/wiki/edit.py +++ /dev/null @@ -1,149 +0,0 @@ -import datetime -import html -import re - -from flask import redirect, request, url_for -from werkzeug.exceptions import BadRequest - -from pysite.base_route import RouteView -from pysite.constants import BotEventTypes, CHANNEL_MOD_LOG, DEBUG_MODE, EDITOR_ROLES -from pysite.decorators import csrf, require_roles -from pysite.mixins import DBMixin, RMQMixin -from pysite.rst import render - -STRIP_REGEX = re.compile(r"<[^<]+?>") - - -class EditView(RouteView, DBMixin, RMQMixin): - path = "/edit/" # "path" means that it accepts slashes - name = "edit" - table_name = "wiki" - revision_table_name = "wiki_revisions" - - @require_roles(*EDITOR_ROLES) - def get(self, page): - rst = "" - title = "" - preview = "

    Preview will appear here.

    " - - obj = self.db.get(self.table_name, page) - - if obj: - rst = obj.get("rst", "") - title = obj.get("title", "") - preview = obj.get("html", preview) - - if obj.get("lock_expiry") and obj.get("lock_user") != self.user_data.get("user_id"): - lock_time = datetime.datetime.fromtimestamp(obj["lock_expiry"]) - if datetime.datetime.utcnow() < lock_time: - return self.render("wiki/page_in_use.html", page=page, can_edit=True) - - lock_expiry = datetime.datetime.utcnow() + datetime.timedelta(minutes=5) - - # There are a couple of cases where we will not need to lock a page. One of these is if the application is - # current set to debug mode. The other of these cases is if the page is empty, because if the page is empty - # we will only have a partially filled out page if the user quits before saving. - if obj: - if not DEBUG_MODE and obj.get("rst"): - self.db.insert( - self.table_name, - { - "slug": page, - "lock_expiry": lock_expiry.timestamp(), - "lock_user": self.user_data.get("user_id") - }, - conflict="update" - ) - - return self.render("wiki/page_edit.html", page=page, rst=rst, title=title, preview=preview, can_edit=True) - - @require_roles(*EDITOR_ROLES) - @csrf - def post(self, page): - rst = request.form.get("rst") - title = request.form["title"] - - if not rst or not rst.strip(): - raise BadRequest() - - if not title or not title.strip(): - raise BadRequest() - - rendered = render(rst) - - obj = { - "slug": page, - "title": request.form["title"], - "rst": rst, - "html": rendered["html"], - "text": html.unescape(STRIP_REGEX.sub("", rendered["html"]).strip()), - "headers": rendered["headers"] - } - - self.db.insert( - self.table_name, - obj, - conflict="replace" - ) - - if not DEBUG_MODE: - # Add the post to the revisions table - revision_payload = { - "slug": page, - "post": obj, - "date": datetime.datetime.utcnow().timestamp(), - "user": self.user_data.get("user_id") - } - - del revision_payload["post"]["slug"] - - current_revisions = self.db.filter(self.revision_table_name, lambda rev: rev["slug"] == page) - sorted_revisions = sorted(current_revisions, key=lambda rev: rev["date"], reverse=True) - - if len(sorted_revisions) > 0: - old_rev = sorted_revisions[0] - else: - old_rev = None - - new_rev = self.db.insert(self.revision_table_name, revision_payload)["generated_keys"][0] - - self.audit_log(page, new_rev, old_rev, obj) - - return redirect(url_for("wiki.page", page=page), code=303) # Redirect, ensuring a GET - - @require_roles(*EDITOR_ROLES) - @csrf - def patch(self, page): - current = self.db.get(self.table_name, page) - if not current: - return "", 404 - - if current.get("lock_expiry"): # If there is a lock present - - # If user patching is not the user with the lock end here - if current["lock_user"] != self.user_data.get("user_id"): - return "", 400 - new_lock = datetime.datetime.utcnow() + datetime.timedelta(minutes=5) # New lock time, 5 minutes in future - self.db.insert(self.table_name, { - "slug": page, - "lock_expiry": new_lock.timestamp() - }, conflict="update") # Update with new lock time - return "", 204 - - def audit_log(self, page, new_id, old_data, new_data): - if not old_data: - link = f"https://wiki.pythondiscord.com/source/{page}" - else: - link = f"https://wiki.pythondiscord.com/history/compare/{old_data['id']}/{new_id}" - - self.rmq_bot_event( - BotEventTypes.send_embed, - { - "target": CHANNEL_MOD_LOG, - "title": "Page Edit", - "description": f"**{new_data['title']}** edited by **{self.user_data.get('username')}**. " - f"[View the diff here]({link})", - "colour": 0x3F8DD7, # Light blue - "timestamp": datetime.datetime.now().isoformat() - } - ) diff --git a/pysite/views/wiki/history/compare.py b/pysite/views/wiki/history/compare.py deleted file mode 100644 index 6411ab30..00000000 --- a/pysite/views/wiki/history/compare.py +++ /dev/null @@ -1,70 +0,0 @@ -import difflib - -from pygments import highlight -from pygments.formatters import HtmlFormatter -from pygments.lexers import DiffLexer -from werkzeug.exceptions import BadRequest, NotFound - -from pysite.base_route import RouteView -from pysite.constants import DEBUG_MODE, EDITOR_ROLES -from pysite.mixins import DBMixin - - -class CompareView(RouteView, DBMixin): - path = "/history/compare//" - name = "history.compare" - - table_name = "wiki_revisions" - table_primary_key = "id" - - def get(self, first_rev, second_rev): - before = self.db.get(self.table_name, first_rev) - after = self.db.get(self.table_name, second_rev) - - if not (before and after): - raise NotFound() - - if before["date"] > after["date"]: # Check whether the before was created after the after - raise BadRequest() - - if before["id"] == after["id"]: # The same revision has been requested - raise BadRequest() - - before_text = before["post"]["rst"] - after_text = after["post"]["rst"] - - if not before_text.endswith("\n"): - before_text += "\n" - - if not after_text.endswith("\n"): - after_text += "\n" - - before_text = before_text.splitlines(keepends=True) - after_text = after_text.splitlines(keepends=True) - - if not before["slug"] == after["slug"]: - raise BadRequest() # The revisions are not from the same post - - diff = difflib.unified_diff(before_text, after_text, fromfile=f"{first_rev}.rst", tofile=f"{second_rev}.rst") - diff = "".join(diff) - diff = highlight(diff, DiffLexer(), HtmlFormatter()) - return self.render("wiki/compare_revision.html", - title=after["post"]["title"], - page=before["slug"], - diff=diff, - slug=before["slug"], - can_edit=self.is_staff()) - - def is_staff(self): - if DEBUG_MODE: - return True - if not self.logged_in: - return False - - roles = self.user_data.get("roles", []) - - for role in roles: - if role in EDITOR_ROLES: - return True - - return False diff --git a/pysite/views/wiki/history/show.py b/pysite/views/wiki/history/show.py deleted file mode 100644 index 00a1dc27..00000000 --- a/pysite/views/wiki/history/show.py +++ /dev/null @@ -1,41 +0,0 @@ -import datetime - -from werkzeug.exceptions import NotFound - -from pysite.base_route import RouteView -from pysite.constants import DEBUG_MODE, EDITOR_ROLES -from pysite.mixins import DBMixin - - -class RevisionsListView(RouteView, DBMixin): - path = "/history/show/" - name = "history.show" - - table_name = "wiki_revisions" - table_primary_key = "id" - - def get(self, page): - results = self.db.filter(self.table_name, lambda revision: revision["slug"] == page) - if len(results) == 0: - raise NotFound() - - for result in results: - ts = datetime.datetime.fromtimestamp(result["date"]) - result["pretty_time"] = ts.strftime("%d %b %Y") - - results = sorted(results, key=lambda revision: revision["date"], reverse=True) - return self.render("wiki/revision_list.html", page=page, revisions=results, can_edit=self.is_staff()), 200 - - def is_staff(self): - if DEBUG_MODE: - return True - if not self.logged_in: - return False - - roles = self.user_data.get("roles", []) - - for role in roles: - if role in EDITOR_ROLES: - return True - - return False diff --git a/pysite/views/wiki/index.py b/pysite/views/wiki/index.py deleted file mode 100644 index 53a4d269..00000000 --- a/pysite/views/wiki/index.py +++ /dev/null @@ -1,8 +0,0 @@ -from pysite.base_route import RedirectView - - -class WikiView(RedirectView): - path = "/" - name = "index" - page = "wiki.page" - kwargs = {"page": "home"} diff --git a/pysite/views/wiki/move.py b/pysite/views/wiki/move.py deleted file mode 100644 index 095a1fdb..00000000 --- a/pysite/views/wiki/move.py +++ /dev/null @@ -1,84 +0,0 @@ -import datetime - -from flask import redirect, request, url_for -from werkzeug.exceptions import BadRequest, NotFound - -from pysite.base_route import RouteView -from pysite.constants import BotEventTypes, CHANNEL_MOD_LOG, EDITOR_ROLES -from pysite.decorators import csrf, require_roles -from pysite.mixins import DBMixin, RMQMixin - - -class MoveView(RouteView, DBMixin, RMQMixin): - path = "/move/" # "path" means that it accepts slashes - name = "move" - table_name = "wiki" - revision_table_name = "wiki_revisions" - - @require_roles(*EDITOR_ROLES) - def get(self, page): - obj = self.db.get(self.table_name, page) - - if obj: - title = obj.get("title", "") - - if obj.get("lock_expiry") and obj.get("lock_user") != self.user_data.get("user_id"): - lock_time = datetime.datetime.fromtimestamp(obj["lock_expiry"]) - if datetime.datetime.utcnow() < lock_time: - return self.render("wiki/page_in_use.html", page=page, can_edit=True) - - return self.render("wiki/page_move.html", page=page, title=title, can_edit=True) - else: - raise NotFound() - - @require_roles(*EDITOR_ROLES) - @csrf - def post(self, page): - location = request.form.get("location") - - if not location or not location.strip(): - raise BadRequest() - - obj = self.db.get(self.table_name, page) - - if not obj: - raise NotFound() - - title = obj.get("title", "") - other_obj = self.db.get(self.table_name, location) - - if other_obj: - return self.render( - "wiki/page_move.html", page=page, title=title, - message=f"There's already a page at {location} - please pick a different location" - ) - - self.db.delete(self.table_name, page) - - # Move all revisions for the old slug to the new slug. - revisions = self.db.filter(self.revision_table_name, lambda revision: revision["slug"] == obj["slug"]) - - for revision in revisions: - revision["slug"] = location - self.db.insert(self.revision_table_name, revision, conflict="update") - - obj["slug"] = location - - self.db.insert(self.table_name, obj, conflict="update") - - self.audit_log(obj) - - return redirect(url_for("wiki.page", page=location), code=303) # Redirect, ensuring a GET - - def audit_log(self, obj): - self.rmq_bot_event( - BotEventTypes.send_embed, - { - "target": CHANNEL_MOD_LOG, - "title": "Wiki Page Move", - "description": f"**{obj['title']}** was moved by **{self.user_data.get('username')}** to " - f"**{obj['slug']}**", - "colour": 0x3F8DD7, # Light blue - "timestamp": datetime.datetime.now().isoformat() - } - ) diff --git a/pysite/views/wiki/page.py b/pysite/views/wiki/page.py deleted file mode 100644 index 26edfcc4..00000000 --- a/pysite/views/wiki/page.py +++ /dev/null @@ -1,36 +0,0 @@ -from flask import redirect, url_for -from werkzeug.exceptions import NotFound - -from pysite.base_route import RouteView -from pysite.constants import DEBUG_MODE, EDITOR_ROLES -from pysite.mixins import DBMixin - - -class PageView(RouteView, DBMixin): - path = "/wiki/" # "path" means that it accepts slashes - name = "page" - table_name = "wiki" - - def get(self, page): - obj = self.db.get(self.table_name, page) - - if obj is None: - if self.is_staff(): - return redirect(url_for("wiki.edit", page=page)) - - raise NotFound() - return self.render("wiki/page_view.html", page=page, data=obj, can_edit=self.is_staff()) - - def is_staff(self): - if DEBUG_MODE: - return True - if not self.logged_in: - return False - - roles = self.user_data.get("roles", []) - - for role in roles: - if role in EDITOR_ROLES: - return True - - return False diff --git a/pysite/views/wiki/render.py b/pysite/views/wiki/render.py deleted file mode 100644 index 39bdd133..00000000 --- a/pysite/views/wiki/render.py +++ /dev/null @@ -1,62 +0,0 @@ -import re - -from docutils.utils import SystemMessage -from flask import jsonify -from schema import Schema - -from pysite.base_route import APIView -from pysite.constants import EDITOR_ROLES, ValidationTypes -from pysite.decorators import api_params, csrf, require_roles -from pysite.rst import render - -SCHEMA = Schema([{ - "data": str -}]) - -MESSAGE_REGEX = re.compile(r":(\d+): \([A-Z]+/\d\) (.*)", flags=re.S) - - -class RenderView(APIView): - path = "/render" # "path" means that it accepts slashes - name = "render" - - @csrf - @require_roles(*EDITOR_ROLES) - @api_params(schema=SCHEMA, validation_type=ValidationTypes.json) - def post(self, data): - if not len(data): - return jsonify({"error": "No data!"}) - - data = data[0]["data"] - try: - html = render(data)["html"] - - return jsonify({"data": html}) - except SystemMessage as e: - lines = str(e) - data = { - "error": lines, - "error_lines": [] - } - - if "\n" in lines: - lines = lines.split("\n") - else: - lines = [lines] - - for message in lines: - match = MESSAGE_REGEX.match(message) - - if match: - data["error_lines"].append( - { - "row": int(match.group(1)) - 3, - "column": 0, - "type": "error", - "text": match.group(2) - } - ) - - return jsonify(data) - except Exception as e: - return jsonify({"error": str(e)}) diff --git a/pysite/views/wiki/robots_txt.py b/pysite/views/wiki/robots_txt.py deleted file mode 100644 index 308fe2a2..00000000 --- a/pysite/views/wiki/robots_txt.py +++ /dev/null @@ -1,15 +0,0 @@ -from flask import Response, url_for - -from pysite.base_route import RouteView - - -class RobotsTXT(RouteView): - path = "/robots.txt" - name = "robots_txt" - - def get(self): - return Response( - self.render( - "robots.txt", sitemap_url=url_for("api.sitemap_xml", _external=True) - ), content_type="text/plain" - ) diff --git a/pysite/views/wiki/search.py b/pysite/views/wiki/search.py deleted file mode 100644 index 369da943..00000000 --- a/pysite/views/wiki/search.py +++ /dev/null @@ -1,66 +0,0 @@ -import html -import re - -from flask import redirect, request, url_for -from werkzeug.exceptions import BadRequest - -from pysite.base_route import RouteView -from pysite.decorators import csrf -from pysite.mixins import DBMixin - -STRIP_REGEX = re.compile(r"<[^<]+?>") - - -class SearchView(RouteView, DBMixin): - path = "/search" # "path" means that it accepts slashes - name = "search" - table_name = "wiki" - revision_table_name = "wiki_revisions" - - def get(self): - return self.render("wiki/search.html") - - @csrf - def post(self): - given_query = request.form.get("query") - - if not given_query or not given_query.strip(): - raise BadRequest() - - query = f"({re.escape(given_query)})" - - pages = self.db.filter( - self.table_name, - lambda doc: doc["text"].match(f"(?i){query}") - ) - - if len(pages) == 1: - slug = pages[0]["slug"] - return redirect(url_for("wiki.page", page=slug), code=303) - - for obj in pages: - text = obj["text"] - - matches = re.finditer(query, text, flags=re.IGNORECASE) - snippets = [] - - for match in matches: - start = match.start() - 50 - - if start < 0: - start = 0 - - end = match.end() + 50 - - if end > len(text): - end = len(text) - - match_text = text[start:end] - match_text = re.sub(query, r"\1", html.escape(match_text), flags=re.IGNORECASE) - - snippets.append(match_text.replace("\n", "
    ")) - - obj["matches"] = snippets - - pages = sorted(pages, key=lambda d: d["title"]) - return self.render("wiki/search_results.html", pages=pages, query=given_query) diff --git a/pysite/views/wiki/sitemap_xml.py b/pysite/views/wiki/sitemap_xml.py deleted file mode 100644 index 9b7f0980..00000000 --- a/pysite/views/wiki/sitemap_xml.py +++ /dev/null @@ -1,22 +0,0 @@ -from flask import Response, url_for - -from pysite.base_route import RouteView -from pysite.mixins import DBMixin - - -class SitemapXML(RouteView, DBMixin): - path = "/sitemap.xml" - name = "sitemap_xml" - table_name = "wiki" - - def get(self): - urls = [] - - for page in self.db.get_all(self.table_name): - urls.append({ - "change_frequency": "weekly", - "type": "url", - "url": url_for("wiki.page", page=page["slug"], _external=True) - }) - - return Response(self.render("sitemap.xml", urls=urls), content_type="application/xml") diff --git a/pysite/views/wiki/source.py b/pysite/views/wiki/source.py deleted file mode 100644 index 83674447..00000000 --- a/pysite/views/wiki/source.py +++ /dev/null @@ -1,42 +0,0 @@ -from flask import redirect, url_for -from pygments import highlight -from pygments.formatters.html import HtmlFormatter -from pygments.lexers import get_lexer_by_name -from werkzeug.exceptions import NotFound - -from pysite.base_route import RouteView -from pysite.constants import DEBUG_MODE, EDITOR_ROLES -from pysite.mixins import DBMixin - - -class PageView(RouteView, DBMixin): - path = "/source/" # "path" means that it accepts slashes - name = "source" - table_name = "wiki" - - def get(self, page): - obj = self.db.get(self.table_name, page) - - if obj is None: - if self.is_staff(): - return redirect(url_for("wiki.edit", page=page, can_edit=False)) - - raise NotFound() - - rst = obj["rst"] - rst = highlight(rst, get_lexer_by_name("rst"), HtmlFormatter(preclass="code", linenos="inline")) - return self.render("wiki/page_source.html", page=page, data=obj, rst=rst, can_edit=self.is_staff()) - - def is_staff(self): - if DEBUG_MODE: - return True - if not self.logged_in: - return False - - roles = self.user_data.get("roles", []) - - for role in roles: - if role in EDITOR_ROLES: - return True - - return False diff --git a/pysite/views/wiki/special/__init__.py b/pysite/views/wiki/special/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/pysite/views/wiki/special/all_pages.py b/pysite/views/wiki/special/all_pages.py deleted file mode 100644 index d2e02a72..00000000 --- a/pysite/views/wiki/special/all_pages.py +++ /dev/null @@ -1,27 +0,0 @@ -from pysite.base_route import RouteView -from pysite.mixins import DBMixin - - -class PageView(RouteView, DBMixin): - path = "/special/all_pages" - name = "special.all_pages" - table_name = "wiki" - - def get(self): - pages = self.db.pluck(self.table_name, "title", "slug") - pages = sorted(pages, key=lambda d: d.get("title", "No Title")) - - letters = {} - - for page in pages: - if "title" not in page: - page["title"] = "No Title" - - letter = page["title"][0].upper() - - if letter not in letters: - letters[letter] = [] - - letters[letter].append(page) - - return self.render("wiki/special_all.html", letters=letters) diff --git a/pysite/views/wiki/special/index.py b/pysite/views/wiki/special/index.py deleted file mode 100644 index ccfc7a5a..00000000 --- a/pysite/views/wiki/special/index.py +++ /dev/null @@ -1,7 +0,0 @@ -from pysite.base_route import TemplateView - - -class PageView(TemplateView): - path = "/special" - name = "special" - template = "wiki/special.html" diff --git a/pysite/views/ws/__init__.py b/pysite/views/ws/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/pysite/views/ws/bot.py b/pysite/views/ws/bot.py deleted file mode 100644 index 816e7579..00000000 --- a/pysite/views/ws/bot.py +++ /dev/null @@ -1,56 +0,0 @@ -import json -import logging - -from geventwebsocket.websocket import WebSocket - -from pysite.constants import BOT_API_KEY -from pysite.mixins import DBMixin -from pysite.websockets import WS - - -class BotWebsocket(WS, DBMixin): - path = "/bot" - name = "ws.bot" - table_name = "bot_events" - - do_changefeed = True - - def __init__(self, socket: WebSocket): - super().__init__(socket) - self.log = logging.getLogger() - - def on_open(self): - self.log.debug("Bot | WS opened.") - - def on_message(self, message): - self.log.debug(f"Bot | Message: {message}") - - try: - message = json.loads(message) - except json.JSONDecodeError: - self.send_json({"error": "Message was not valid JSON"}) - return self.socket.close() - - action = message["action"] - - if action == "login": - if message["key"] != BOT_API_KEY: - return self.socket.close() - - self.do_changefeed = True - - for document in self.db.changes(self.table_name, include_initial=True, include_types=True): - if not self.do_changefeed: - break - - if document["type"] not in ["add", "initial"]: - continue - - self.send_json({"action": "event", "event": document["new_val"]}) - self.db.delete(self.table_name, document["id"]) - - self.send_json({"error": f"Unknown action: {action}"}) - - def on_close(self): - self.log.debug("Bot | WS closed.") - self.do_changefeed = False diff --git a/pysite/views/ws/echo.py b/pysite/views/ws/echo.py deleted file mode 100644 index b6f11168..00000000 --- a/pysite/views/ws/echo.py +++ /dev/null @@ -1,25 +0,0 @@ -import logging - -from geventwebsocket.websocket import WebSocket - -from pysite.websockets import WS - - -class EchoWebsocket(WS): - path = "/echo" - name = "ws.echo" - - def __init__(self, socket: WebSocket): - super().__init__(socket) - self.log = logging.getLogger() - - def on_open(self): - self.log.debug("Echo | WS opened.") - self.send("Hey, welcome!") - - def on_message(self, message): - self.log.debug(f"Echo | Message: {message}") - self.send(message) - - def on_close(self): - self.log.debug("Echo | WS closed.") diff --git a/pysite/views/ws/rst.py b/pysite/views/ws/rst.py deleted file mode 100644 index f2b2db24..00000000 --- a/pysite/views/ws/rst.py +++ /dev/null @@ -1,33 +0,0 @@ -import logging - -from geventwebsocket.websocket import WebSocket - -from pysite.rst import render -from pysite.websockets import WS - - -class RSTWebsocket(WS): - path = "/rst" - name = "ws.rst" - - def __init__(self, socket: WebSocket): - super().__init__(socket) - self.log = logging.getLogger() - - def on_open(self): - self.log.debug("RST | WS opened.") - self.send("Hey, welcome!") - - def on_message(self, message): - self.log.debug(f"RST | Message: {message}") - - try: - data = render(message)["html"] - except Exception as e: - self.log.exception("Parsing error") - data = str(e) - - self.send(data) - - def on_close(self): - self.log.debug("RST | WS closed.") diff --git a/pysite/websockets.py b/pysite/websockets.py deleted file mode 100644 index 213daace..00000000 --- a/pysite/websockets.py +++ /dev/null @@ -1,123 +0,0 @@ -import json - -from flask import Blueprint -from geventwebsocket.websocket import WebSocket - - -class WS: - """ - Base class for representing a Websocket. - - At minimum, you must implement the `on_message(self, message)` function. Without it, you won't be able to handle - any messages, and an error will be thrown! - - If you need access to the database, you can mix-in DBMixin, just like any view class: - - >>> class DBWebsocket(WS, DBMixin): - ... name = "db_websocket" - ... path = "/db_websocket" # This will be prefixed with "/ws" by the blueprint - ... table = "ws" - ... - ... def on_message(self, message): - ... self.send( - ... json.loads(self.db.get(self.table_name, message)) - ... ) - - Please note that an instance of this class is created for every websocket connected to the path. This does, however, - mean that you can store any state required by your websocket. - """ - - path = "" # type: str - name = "" # type: str - - _connections = None - - def __init__(self, socket: WebSocket): - self.socket = socket - - def __new__(cls, *args, **kwargs): - if cls._connections is None: - cls._connections = [] - - return super().__new__(cls) - - def on_open(self): - """ - Called once when the websocket is opened. Optional. - """ - - def on_message(self, message: str): - """ - Called when a message is received by the websocket. - """ - - raise NotImplementedError() - - def on_close(self): - """ - Called once when the websocket is closed. Optional. - """ - - def send(self, message, binary=None): - """ - Send a message to the currently-connected websocket, if it's open. - - Nothing will happen if the websocket is closed. - """ - - if not self.socket.closed: - self.socket.send(message, binary=binary) - - def send_json(self, data): - return self.send(json.dumps(data)) - - @classmethod - def send_all(cls, message, binary=None): - for connection in cls._connections: - connection.send(message, binary=binary) - - @classmethod - def send_all_json(cls, data): - for connection in cls._connections: - connection.send_json(data) - - @classmethod - def setup(cls: "type(WS)", manager: "pysite.route_manager.RouteManager", blueprint: Blueprint): - """ - Set up the websocket object, calling `setup()` on any superclasses as necessary (for example, on the DB - mixin). - - This function will set up a websocket handler so that it behaves in a class-oriented way. It's up to you to - deal with message handling yourself, however. - """ - - if hasattr(super(), "setup"): - super().setup(manager, blueprint) - - if not cls.path or not cls.name: - raise RuntimeError("Websockets must have both `path` and `name` defined") - - cls.manager = manager - - def handle(socket: WebSocket): - """ - Wrap the current WS class, dispatching events to it as necessary. We're using gevent, so there's - no need to worry about blocking here. - """ - - ws = cls(socket) # Instantiate the current class, passing it the WS object - cls._connections.append(ws) - try: - ws.on_open() # Call the "on_open" handler - - while not socket.closed: # As long as the socket is open... - message = socket.receive() # Wait for a message - - if not socket.closed: # If the socket didn't just close (there's always a None message on closing) - ws.on_message(message) # Call the "on_message" handler - - ws.on_close() # The socket just closed, call the "on_close" handler - finally: - cls._connections.remove(ws) - - blueprint.route(cls.path)(handle) # Register the handling function to the WS blueprint diff --git a/scripts/deploy-ci.sh b/scripts/deploy-ci.sh deleted file mode 100644 index 6a3d64bc..00000000 --- a/scripts/deploy-ci.sh +++ /dev/null @@ -1,23 +0,0 @@ -#!/bin/bash - -# Build and deploy on master branch -if [[ $CI_COMMIT_REF_SLUG == 'master' ]]; then - echo "Connecting to docker hub" - echo "$DOCKER_PASSWORD" | docker login -u "$DOCKER_USERNAME" --password-stdin - - changed_lines=$(git diff HEAD~1 HEAD docker/ci.Dockerfile | wc -l) - - if [ $changed_lines != '0' ]; then - echo "ci.Dockerfile was changed" - - echo "Building CI container" - docker build -t pythondiscord/site-ci:latest -f docker/ci.Dockerfile . - - echo "Pushing image to Docker Hub" - docker push pythondiscord/site-ci:latest - else - echo "ci.Dockerfile was not changed, not building" - fi -else - echo "Skipping CI Docker build" -fi diff --git a/scripts/deploy.sh b/scripts/deploy.sh deleted file mode 100644 index f4799749..00000000 --- a/scripts/deploy.sh +++ /dev/null @@ -1,33 +0,0 @@ -#!/bin/bash - -# Build and deploy on master branch -if [[ $CI_COMMIT_REF_SLUG == 'master' ]]; then - echo "Connecting to docker hub" - echo "$DOCKER_PASSWORD" | docker login -u "$DOCKER_USERNAME" --password-stdin - - changed_lines=$(git diff HEAD~1 HEAD docker/Dockerfile.base | wc -l) - - if [ $changed_lines != '0' ]; then - echo "Dockerfile.base was changed" - - echo "Building site base" - docker build -t pythondiscord/site-base:latest -f docker/Dockerfile.base . - - echo "Pushing image to Docker Hub" - docker push pythondiscord/site-base:latest - else - echo "Dockerfile.base was not changed, not building" - fi - - - echo "Building image" - docker build -t pythondiscord/site:latest -f docker/Dockerfile . - - echo "Pushing image" - docker push pythondiscord/site:latest - - echo "Deploying container" - curl -H "token: $AUTODEPLOY_TOKEN" $AUTODEPLOY_WEBHOOK -else - echo "Skipping deploy" -fi diff --git a/static/.gitkeep b/static/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/static/css/bundled/pygments-monokai.css b/static/css/bundled/pygments-monokai.css deleted file mode 100644 index 756a5850..00000000 --- a/static/css/bundled/pygments-monokai.css +++ /dev/null @@ -1,143 +0,0 @@ -.code .hll { background-color: #49483e } -.code { background: #272822; color: #f8f8f2 } -.code .c { color: #75715e } /* Comment */ -.code .err { color: #960050; background-color: #1e0010 } /* Error */ -.code .k { color: #66d9ef } /* Keyword */ -.code .l { color: #ae81ff } /* Literal */ -.code .n { color: #f8f8f2 } /* Name */ -.code .o { color: #f92672 } /* Operator */ -.code .p { color: #f8f8f2 } /* Punctuation */ -.code .ch { color: #75715e } /* Comment.Hashbang */ -.code .cm { color: #75715e } /* Comment.Multiline */ -.code .cp { color: #75715e } /* Comment.Preproc */ -.code .cpf { color: #75715e } /* Comment.PreprocFile */ -.code .c1 { color: #75715e } /* Comment.Single */ -.code .cs { color: #75715e } /* Comment.Special */ -.code .gd { color: #f92672 } /* Generic.Deleted */ -.code .ge { font-style: italic } /* Generic.Emph */ -.code .gi { color: #a6e22e } /* Generic.Inserted */ -.code .gs { font-weight: bold } /* Generic.Strong */ -.code .gu { color: #75715e } /* Generic.Subheading */ -.code .kc { color: #66d9ef } /* Keyword.Constant */ -.code .kd { color: #66d9ef } /* Keyword.Declaration */ -.code .kn { color: #f92672 } /* Keyword.Namespace */ -.code .kp { color: #66d9ef } /* Keyword.Pseudo */ -.code .kr { color: #66d9ef } /* Keyword.Reserved */ -.code .kt { color: #66d9ef } /* Keyword.Type */ -.code .ld { color: #e6db74 } /* Literal.Date */ -.code .m { color: #ae81ff } /* Literal.Number */ -.code .s { color: #e6db74 } /* Literal.String */ -.code .na { color: #a6e22e } /* Name.Attribute */ -.code .nb { color: #f8f8f2 } /* Name.Builtin */ -.code .nc { color: #a6e22e } /* Name.Class */ -.code .no { color: #66d9ef } /* Name.Constant */ -.code .nd { color: #a6e22e } /* Name.Decorator */ -.code .ni { color: #f8f8f2 } /* Name.Entity */ -.code .ne { color: #a6e22e } /* Name.Exception */ -.code .nf { color: #a6e22e } /* Name.Function */ -.code .nl { color: #f8f8f2 } /* Name.Label */ -.code .nn { color: #f8f8f2 } /* Name.Namespace */ -.code .nx { color: #a6e22e } /* Name.Other */ -.code .py { color: #f8f8f2 } /* Name.Property */ -.code .nt { color: #f92672 } /* Name.Tag */ -.code .nv { color: #f8f8f2 } /* Name.Variable */ -.code .ow { color: #f92672 } /* Operator.Word */ -.code .w { color: #f8f8f2 } /* Text.Whitespace */ -.code .mb { color: #ae81ff } /* Literal.Number.Bin */ -.code .mf { color: #ae81ff } /* Literal.Number.Float */ -.code .mh { color: #ae81ff } /* Literal.Number.Hex */ -.code .mi { color: #ae81ff } /* Literal.Number.Integer */ -.code .mo { color: #ae81ff } /* Literal.Number.Oct */ -.code .sa { color: #e6db74 } /* Literal.String.Affix */ -.code .sb { color: #e6db74 } /* Literal.String.Backtick */ -.code .sc { color: #e6db74 } /* Literal.String.Char */ -.code .dl { color: #e6db74 } /* Literal.String.Delimiter */ -.code .sd { color: #e6db74 } /* Literal.String.Doc */ -.code .s2 { color: #e6db74 } /* Literal.String.Double */ -.code .se { color: #ae81ff } /* Literal.String.Escape */ -.code .sh { color: #e6db74 } /* Literal.String.Heredoc */ -.code .si { color: #e6db74 } /* Literal.String.Interpol */ -.code .sx { color: #e6db74 } /* Literal.String.Other */ -.code .sr { color: #e6db74 } /* Literal.String.Regex */ -.code .s1 { color: #e6db74 } /* Literal.String.Single */ -.code .ss { color: #e6db74 } /* Literal.String.Symbol */ -.code .bp { color: #f8f8f2 } /* Name.Builtin.Pseudo */ -.code .fm { color: #a6e22e } /* Name.Function.Magic */ -.code .vc { color: #f8f8f2 } /* Name.Variable.Class */ -.code .vg { color: #f8f8f2 } /* Name.Variable.Global */ -.code .vi { color: #f8f8f2 } /* Name.Variable.Instance */ -.code .vm { color: #f8f8f2 } /* Name.Variable.Magic */ -.code .il { color: #ae81ff } /* Literal.Number.Integer.Long */ - -/* Extra CSS for non-docutils output */ - -.highlight pre .hll { background-color: #49483e } -.highlight pre { background: #272822; color: #f8f8f2 } -.highlight pre .c { color: #75715e } /* Comment */ -.highlight pre .err { color: #960050; background-color: #1e0010 } /* Error */ -.highlight pre .k { color: #66d9ef } /* Keyword */ -.highlight pre .l { color: #ae81ff } /* Literal */ -.highlight pre .n { color: #f8f8f2 } /* Name */ -.highlight pre .o { color: #f92672 } /* Operator */ -.highlight pre .p { color: #f8f8f2 } /* Punctuation */ -.highlight pre .ch { color: #75715e } /* Comment.Hashbang */ -.highlight pre .cm { color: #75715e } /* Comment.Multiline */ -.highlight pre .cp { color: #75715e } /* Comment.Preproc */ -.highlight pre .cpf { color: #75715e } /* Comment.PreprocFile */ -.highlight pre .c1 { color: #75715e } /* Comment.Single */ -.highlight pre .cs { color: #75715e } /* Comment.Special */ -.highlight pre .gd { color: #f92672 } /* Generic.Deleted */ -.highlight pre .ge { font-style: italic } /* Generic.Emph */ -.highlight pre .gi { color: #a6e22e } /* Generic.Inserted */ -.highlight pre .gs { font-weight: bold } /* Generic.Strong */ -.highlight pre .gu { color: #75715e } /* Generic.Subheading */ -.highlight pre .kc { color: #66d9ef } /* Keyword.Constant */ -.highlight pre .kd { color: #66d9ef } /* Keyword.Declaration */ -.highlight pre .kn { color: #f92672 } /* Keyword.Namespace */ -.highlight pre .kp { color: #66d9ef } /* Keyword.Pseudo */ -.highlight pre .kr { color: #66d9ef } /* Keyword.Reserved */ -.highlight pre .kt { color: #66d9ef } /* Keyword.Type */ -.highlight pre .ld { color: #e6db74 } /* Literal.Date */ -.highlight pre .m { color: #ae81ff } /* Literal.Number */ -.highlight pre .s { color: #e6db74 } /* Literal.String */ -.highlight pre .na { color: #a6e22e } /* Name.Attribute */ -.highlight pre .nb { color: #f8f8f2 } /* Name.Builtin */ -.highlight pre .nc { color: #a6e22e } /* Name.Class */ -.highlight pre .no { color: #66d9ef } /* Name.Constant */ -.highlight pre .nd { color: #a6e22e } /* Name.Decorator */ -.highlight pre .ni { color: #f8f8f2 } /* Name.Entity */ -.highlight pre .ne { color: #a6e22e } /* Name.Exception */ -.highlight pre .nf { color: #a6e22e } /* Name.Function */ -.highlight pre .nl { color: #f8f8f2 } /* Name.Label */ -.highlight pre .nn { color: #f8f8f2 } /* Name.Namespace */ -.highlight pre .nx { color: #a6e22e } /* Name.Other */ -.highlight pre .py { color: #f8f8f2 } /* Name.Property */ -.highlight pre .nt { color: #f92672 } /* Name.Tag */ -.highlight pre .nv { color: #f8f8f2 } /* Name.Variable */ -.highlight pre .ow { color: #f92672 } /* Operator.Word */ -.highlight pre .w { color: #f8f8f2 } /* Text.Whitespace */ -.highlight pre .mb { color: #ae81ff } /* Literal.Number.Bin */ -.highlight pre .mf { color: #ae81ff } /* Literal.Number.Float */ -.highlight pre .mh { color: #ae81ff } /* Literal.Number.Hex */ -.highlight pre .mi { color: #ae81ff } /* Literal.Number.Integer */ -.highlight pre .mo { color: #ae81ff } /* Literal.Number.Oct */ -.highlight pre .sa { color: #e6db74 } /* Literal.String.Affix */ -.highlight pre .sb { color: #e6db74 } /* Literal.String.Backtick */ -.highlight pre .sc { color: #e6db74 } /* Literal.String.Char */ -.highlight pre .dl { color: #e6db74 } /* Literal.String.Delimiter */ -.highlight pre .sd { color: #e6db74 } /* Literal.String.Doc */ -.highlight pre .s2 { color: #e6db74 } /* Literal.String.Double */ -.highlight pre .se { color: #ae81ff } /* Literal.String.Escape */ -.highlight pre .sh { color: #e6db74 } /* Literal.String.Heredoc */ -.highlight pre .si { color: #e6db74 } /* Literal.String.Interpol */ -.highlight pre .sx { color: #e6db74 } /* Literal.String.Other */ -.highlight pre .sr { color: #e6db74 } /* Literal.String.Regex */ -.highlight pre .s1 { color: #e6db74 } /* Literal.String.Single */ -.highlight pre .ss { color: #e6db74 } /* Literal.String.Symbol */ -.highlight pre .bp { color: #f8f8f2 } /* Name.Builtin.Pseudo */ -.highlight pre .fm { color: #a6e22e } /* Name.Function.Magic */ -.highlight pre .vc { color: #f8f8f2 } /* Name.Variable.Class */ -.highlight pre .vg { color: #f8f8f2 } /* Name.Variable.Global */ -.highlight pre .vi { color: #f8f8f2 } /* Name.Variable.Instance */ -.highlight pre .vm { color: #f8f8f2 } /* Name.Variable.Magic */ -.highlight pre .il { color: #ae81ff } /* Literal.Number.Integer.Long */ diff --git a/static/css/style.css b/static/css/style.css deleted file mode 100644 index a2cfa897..00000000 --- a/static/css/style.css +++ /dev/null @@ -1,3 +0,0 @@ -@font-face{font-family:"Fira Code";src:url("https://unpkg.com/firacode/distr/eot/FiraCode-Regular.eot");src:url("https://unpkg.com/firacode/distr/eot/FiraCode-Regular.eot?#iefix") format("embedded-opentype"),url("https://unpkg.com/firacode/distr/woff2/FiraCode-Regular.woff2") format("woff2"),url("https://unpkg.com/firacode/distr/woff/FiraCode-Regular.woff") format("woff"),url("https://unpkg.com/firacode/distr/ttf/FiraCode-Regular.ttf") format("truetype")}.fira-code{font-family:'Fira Code', "monospace", Fallback}textarea.fira-code{line-height:1.3 !important}th p{margin:0}.uk-offcanvas-content{flex:1 0 auto}.uk-background-secondary .uk-navbar-dropdown-nav .uk-active a{color:#fff}.uk-background-secondary .uk-navbar-dropdown-nav .uk-nav-header{color:#666;font-size:120%;font-weight:bold;padding:0;text-transform:none}.uk-background-secondary .uk-navbar-dropdown-nav .uk-nav-header.uk-active{color:#fff}.uk-background-secondary .uk-navbar-dropdown-nav .uk-navbar-dropbar{background:#222}.uk-navbar-container,.uk-sticky-placeholder,.uk-navbar-nav>li>a,.uk-navbar-left>a{height:70px}.uk-navbar-dropdown{overflow-y:auto;top:45px !important}.uk-article-title{margin-bottom:0 !important}.uk-article-meta{margin-left:2px;margin-top:0 !important}.uk-section{padding-bottom:30px;padding-top:20px}.uk-heading-divider .uk-article-meta{margin-bottom:0}footer{flex-shrink:0}footer div.uk-section{padding:0}footer div.uk-section div.uk-text-center{margin-top:20px}.uk-button-dark{background:rgba(0,0,0,0.95);border:1px solid rgba(34,34,34,0.93);color:#fff}.uk-button-dark :hover{background:rgba(0,0,0,0.7)}.uk-button-darkish{background:rgba(0,0,0,0.11);border:1px solid rgba(34,34,34,0.09)}.uk-button-darkish :hover{background:rgba(0,0,0,0.22)}.uk-navbar-container{padding-left:40px;padding-right:40px}.uk-button-success{background-color:#32D296;border:1px solid transparent;color:#fff}.uk-button-success:hover,.uk-button-success:focus{background-color:#2ac088}.uk-button-success:active,.uk-button-success.uk-active{background-color:#26ab79}.uk-button-success:disabled{background-color:#fff !important;border:1px solid #E5E5E5;color:#999 !important}.uses-rst .document li p{margin-bottom:0}.uses-rst .document img{margin-bottom:20px}.uses-rst #editor{min-height:50vh;resize:vertical}.blueprint-error .window{-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:0 4px 12px 0 rgba(0,0,0,0.5);-moz-box-shadow:0 4px 12px 0 rgba(0,0,0,0.5);box-shadow:0 4px 12px 0 rgba(0,0,0,0.5);border:1px solid #C1C2C2;height:500px;margin:20px auto auto;width:100%}.blueprint-error .inside{background:#000;height:100%;padding-right:20px}.blueprint-error .block{background:#000;width:100%}.blueprint-error .top,.blueprint-error .panel{float:left}.blueprint-error .top{background:#F1F1F1;background:-webkit-linear-gradient(top, #E9E9E9 3%, #D8D8D8 100%);background:-moz-linear-gradient(top, #E9E9E9 3%, #D8D8D8 100%);background:-ms-linear-gradient(top, #E9E9E9 3%, #D8D8D8 100%);background:-o-linear-gradient(top, #E9E9E9 3%, #D8D8D8 100%);background:-webkit-gradient(linear, top, bottom, color-stop(3%, #E9E9E9), color-stop(100%, #D8D8D8));background:linear-gradient(to bottom, #E9E9E9 3%, #D8D8D8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#F1F1F1', endColorstr='#D8D8D8', GradientType=0);-webkit-box-shadow:inset 0 1px 1px 0 rgba(255,255,255,0.76);-moz-box-shadow:inset 0 1px 1px 0 rgba(255,255,255,0.76);box-shadow:inset 0 1px 1px 0 rgba(255,255,255,0.76);border-bottom:2px solid #BDBCC1;overflow:hidden;padding:7px 0;position:relative;width:100%}.blueprint-error .panel{padding-left:9px;padding-top:2px}.blueprint-error #terminal-close,.blueprint-error #second-button,.blueprint-error #third-button{-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;cursor:pointer;display:inline-block;float:left;height:12px;margin-right:7px;width:12px}.blueprint-error #terminal-close{background:#FF5F4F}.blueprint-error #second-button{background:#F9C206}.blueprint-error #third-button{background:#19CC32}.blueprint-error #terminal{background-color:#000;color:#fff;height:100%;width:100%}.blueprint-error #terminal code{white-space:pre-wrap}.blueprint-error pre{border:0;border-radius:3px}.blueprint-error .uk-background-muted,.blueprint-error .error-header{background-color:#E8E8E8 !important}.blueprint-error .error-header{color:#E84149;font-family:monospace}.blueprint-error code,.blueprint-error pre{overflow-wrap:break-word;width:100%;word-wrap:break-word}.page-main-index #invite-button{padding:0}.page-main-about-partners #partner-cards .uk-card-default{margin-top:2em;text-align:center}.page-main-about-privacy td,.page-main-about-privacy th{max-width:30rem}.page-main-info-resources .payment-icon{margin-right:1em}.page-main-info-resources .payment-icon img{height:2em}.page-main-info-resources .payment-description{height:3.7rem;margin-right:.5rem;vertical-align:text-bottom}.page-main-info-resources .resource-title{margin-bottom:-1rem}.page-main-info-resources .resource-title div{padding-bottom:0}.page-main-jams-index .date-separator{vertical-align:middle}.page-main-jams-index .theme-label{margin-top:3px}.page-main-jams-index .jam-tiles{border-color:#aaa transparent;border-style:solid;border-width:1px}.page-main-jams-index .jam-tiles .uk-tile-success{background:#32D296}.page-main-jams-index .jam-tiles .uk-tile-danger{background:#F0506E}.page-main-jams-index .jam-tiles .uk-tile-winner{background:#eb0}.page-main-jams-index .jam-tiles .jam-tile-text{align-items:center;color:#fff;display:flex;justify-content:center;text-transform:uppercase}.page-main-jams-join .question-label{margin-top:0}.page-main-jams-join .checkbox-label{padding-left:.7rem}.page-main-jams-join .radio-label{padding-left:.7rem;padding-right:1rem}.page-main-jams-join .range-label{padding-left:.3rem}.page-main-jams-join .textarea{min-height:15rem;resize:vertical}.page-main-jams-join .slider-label{margin-right:1rem}.jam-team-view .participant-card-list{margin-bottom:25px}.jam-team-view .participant-card{margin-bottom:10px;padding:10px}.jam-team-view .participant-card .participant-avatar-link{margin-right:10px}.jam-team-view .participant-card .participant-avatar-link .participant-avatar{height:2.5rem}.jam-team-view .participant-card .participant-avatar-link:hover,.jam-team-view .participant-card .participant-avatar-link:active{text-decoration:none}.jam-team-view .participant-card .participant-links{float:right}.jam-team-view .gitlab-activity{background-color:#f5f5f5;height:500px;overflow-x:hidden;overflow-y:auto;width:100%}.jam-team-view .gitlab-activity .gitlab-activity-loading{align-items:center;display:flex;height:100%;justify-content:center;width:100%}.jam-team-view .gitlab-activity .gitlab-activity-loading .gitlab-activity-spinner{text-align:center;width:100%}.jam-team-view .gitlab-activity .gitlab-activity-events{height:auto;width:100%}.jam-team-view .gitlab-activity .gitlab-activity-event-item{background-color:#fff;border:solid 1px #999;border-bottom-width:0;box-sizing:border-box;display:flex;justify-content:center;padding:10px;vertical-align:middle;width:100%}.jam-team-view .gitlab-activity .gitlab-activity-event-item .gitlab-activity-event-item-content{width:100%}.jam-team-view .gitlab-activity .gitlab-activity-event-item .pasta{background-color:#EAF5FF;border-radius:3px;color:#0366D6;font-family:Consolas, monaco, monospace;font-size:12px;margin-right:10px;padding:3px 5px}.jam-team-view .gitlab-activity .gitlab-activity-event-item:nth-last-child(2){border-bottom-width:1px}.jam-team-view .gitlab-activity .gitlab-activity-events-footer{color:#999;display:flex;justify-content:center;padding:10px;text-align:center;vertical-align:middle}.jam-team-list .team-list-cards{margin-top:20px}.jam-team-list .team-links{text-align:center}.jam-team-list .team-subtitle{margin-bottom:0}.jam-team-list .team-card-own{border:solid 2px #7289DA}.jam-team-list .team-card-own.team-card-winner{border-color:#E0B000 #E0B000 #7289DA #7289DA}.jam-team-list .team-badge-own{color:#7289DA}.jam-team-list .team-card-winner{border:solid 2px #E0B000}.jam-team-list .team-badge-winner{color:#E0B000}.jam-team-list .team-member-avatars{padding:10px;text-align:center}.jam-team-list .team-member-avatars .team-member-avatar-link{margin:0 5px}.jam-team-list .team-member-avatars .team-member-avatar-link .team-member-avatar{height:32px}.jam-team-list .team-member-avatars .team-member-avatar-link:hover,.jam-team-list .team-member-avatars .team-member-avatar-link:active{text-decoration:none}.clean-logs{background-color:#36393E}.clean-logs .nick{font-weight:700}.clean-logs .time{color:#75797F;font-size:11px;font-weight:normal;margin-left:.8em}.clean-logs .text{color:#fff;margin-bottom:1em}.clean-logs .embed{background-color:#2E3136;border:2px solid #282B30;border-radius:5px;color:#fff;margin-bottom:1.5em;padding:1em;width:60%}.clean-logs .embed .footer{font-size:9px}.clean-logs .embed .fields{display:flex;flex-wrap:wrap}.clean-logs .embed .field{flex:50%}.clean-logs .embed a{color:#A9C4DA}.blueprint-staff .participant-handle{cursor:move !important}.blueprint-staff #member-answers-sidebar{border-right:1px solid #E5E5E5;margin-right:1rem;min-width:20vw;width:20vw}.blueprint-staff #member-answers-sidebar .avatar{margin:1vw 4vw;width:12vw}.blueprint-staff .approval-card{border:1px solid #E5E5E5;padding:0}.blueprint-staff .approval-card img{height:2.5rem}.blueprint-staff .approval-card h2{margin-bottom:0;vertical-align:central}.blueprint-staff .approval-card .user-id{margin-bottom:0 !important}.blueprint-staff .approval-card .expand-icon{display:none}.blueprint-staff .approval-card .contract-icon{display:inline-block}.blueprint-staff .approval-card .uk-button{padding-left:10px;padding-right:10px}.blueprint-staff .approval-card .uk-card-body{border-top:1px solid #E5E5E5;padding-top:20px}.blueprint-staff .approval-card .status-icon.fa-check{color:#32D296}.blueprint-staff .approval-card .status-icon.fa-times{color:#F0506E}.blueprint-staff .approval-card .approved .status-icon.fa-times{display:none}.blueprint-staff .approval-card .unapproved .status-icon.fa-check{display:none}.blueprint-staff .approval-card.collapsed .expand-icon{display:inline-block}.blueprint-staff .approval-card.collapsed .contract-icon{display:none}.blueprint-staff .approval-card.collapsed .uk-card-header{border-bottom:0}.blueprint-staff .approval-card.collapsed .uk-card-body{display:none;visibility:hidden}.page-staff-jams-edit-ending #editor{min-height:50vh;resize:vertical}.page-staff-jams-edit-info .editor{min-height:30vh;resize:vertical}.page-staff-jams-forms-preamble-edit .editor{min-height:30vh;resize:vertical}.page-staff-jams-forms-questions .delete-question-button,.page-staff-jams-forms-questions .edit-question-button{padding-left:5px;padding-right:5px}.page-staff-jams-forms-view .delete-question-button,.page-staff-jams-forms-view .edit-question-button{padding-left:5px;padding-right:5px}.page-staff-jams-infractions .delete-infraction-button{padding-left:5px;padding-right:5px}.page-staff-jams-edit-teams .team-winner-unset-button,.page-staff-jams-edit-teams .team-winner-button{background-color:#E0B000;border:1px solid transparent;color:#fff}.page-staff-jams-edit-teams .team-winner-unset-button:hover,.page-staff-jams-edit-teams .team-winner-button:hover{background-color:#DAA900}.page-staff-jams-edit-teams .team-winner-unset-button:active,.page-staff-jams-edit-teams .team-winner-button:active{background-color:#DAA015}.page-staff-jams-edit-teams .team-card-winner{border:solid 2px #E0B000}.page-staff-tables-edit #editor{min-height:50vh;resize:vertical}.page-staff-tables-table .delete-infraction-button{padding-left:5px;padding-right:5px}.blueprint-wiki .quote{border-left:3px solid #7289DA;color:#99AAB5;margin-bottom:1rem;padding-left:20px}.blueprint-wiki #wiki-nav .uk-nav-divider{min-width:8rem}.blueprint-wiki #wiki-sidebar{transition:width ease 1s}.blueprint-wiki #wiki-page{overflow-x:hidden}.blueprint-wiki #wiki-sidebar-button{align-items:center;border:1px solid rgba(0,0,0,0.11);color:#fff;height:3rem;justify-content:center;min-height:3rem;min-width:3rem;width:3rem}.blueprint-wiki #doc-view{width:calc(100% - 6rem)}@media (max-width: 639px){.blueprint-wiki #doc-view{width:calc(100% - 1rem)}}.blueprint-wiki .sidebar-search-input{border-left:0;border-right:0;margin-top:5px;padding-right:0}.blueprint-wiki .search-button{border:0;width:100%}.blueprint-wiki .content{flex-grow:1;margin:0 1rem 1rem}.blueprint-wiki .location-input{margin-left:15px}.blueprint-wiki .preview-title{padding:1rem 1rem .1rem}html{height:100%}html body{display:flex;flex-direction:column;height:100%}.navbar-logo{height:60%;margin-left:-10px;margin-top:2px;max-width:110%;padding-left:3px}.hover-title a{transition:opacity 200ms ease-in-out;-moz-transition:opacity 200ms ease-in-out;-webkit-transition:opacity 200ms ease-in-out;opacity:0;visibility:hidden}.hover-title:hover a{transition:opacity 200ms ease-in-out;-moz-transition:opacity 200ms ease-in-out;-webkit-transition:opacity 200ms ease-in-out;opacity:1;visibility:visible}.debug-mode-item{color:#7289DA !important}.jam-image{max-width:15rem}.cursor-default{cursor:default !important}.full-width{width:100%}select{-webkit-appearance:unset !important;left:auto !important;opacity:1 !important;position:relative !important;top:auto !important}div.danger-input *{border-color:red !important;color:red;transition:color .5s ease, border-color .5s ease}table.table-bordered{border:1px solid #E5E5E5 !important}tr.thick-bottom-border{border-bottom:3px solid #E5E5E5 !important}td.left-border,th.left-border{border-left:1px solid #E5E5E5 !important}td.right-border,th.right-border{border-right:1px solid #E5E5E5 !important}.prevent-fouc{display:none} - -/*# sourceMappingURL=style.css.map */ \ No newline at end of file diff --git a/static/css/style.css.map b/static/css/style.css.map deleted file mode 100644 index f68094d7..00000000 --- a/static/css/style.css.map +++ /dev/null @@ -1,36 +0,0 @@ -{ - "version": 3, - "file": "style.css", - "sources": [ - "../../scss/pysite/style.scss", - "../../scss/pysite/_fonts.scss", - "../../scss/pysite/_mixins.scss", - "../../scss/pysite/_uikit_shim.scss", - "../../scss/pysite/_variables.scss", - "../../scss/pysite/pages/_rst.scss", - "../../scss/pysite/pages/errors/_common.scss", - "../../scss/pysite/pages/main/_index.scss", - "../../scss/pysite/pages/main/about/_partners.scss", - "../../scss/pysite/pages/main/about/_privacy.scss", - "../../scss/pysite/pages/main/info/_resources.scss", - "../../scss/pysite/pages/main/jams/_index.scss", - "../../scss/uikit/_variables.scss", - "../../scss/pysite/pages/main/jams/_join.scss", - "../../scss/pysite/pages/main/jams/_team_view.scss", - "../../scss/pysite/pages/main/jams/_team_list.scss", - "../../scss/pysite/pages/main/bot/_clean_logs.scss", - "../../scss/pysite/pages/staff/_common.scss", - "../../scss/pysite/pages/staff/jams/_edit_ending.scss", - "../../scss/pysite/pages/staff/jams/_edit_info.scss", - "../../scss/pysite/pages/staff/jams/forms/_preamble_edit.scss", - "../../scss/pysite/pages/staff/jams/forms/_questions_view.scss", - "../../scss/pysite/pages/staff/jams/forms/_view.scss", - "../../scss/pysite/pages/staff/jams/infractions/_view.scss", - "../../scss/pysite/pages/staff/jams/teams/_view.scss", - "../../scss/pysite/pages/staff/tables/_edit.scss", - "../../scss/pysite/pages/staff/tables/_table.scss", - "../../scss/pysite/pages/wiki/_common.scss" - ], - "names": [], - "mappings": "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" -} \ No newline at end of file diff --git a/static/css/uikit_blurple.css b/static/css/uikit_blurple.css deleted file mode 100644 index 1a42e7bb..00000000 --- a/static/css/uikit_blurple.css +++ /dev/null @@ -1,3 +0,0 @@ -html{font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;font-size:16px;font-weight:normal;line-height:1.5;-webkit-text-size-adjust:100%;background:#fff;color:#666}body{margin:0}a{-webkit-text-decoration-skip:objects}a:active,a:hover{outline:none}a,.uk-link{color:#1e87f0;text-decoration:none;cursor:pointer}a:hover,.uk-link:hover{color:#0f6ecd;text-decoration:underline}abbr[title]{border-bottom:none;text-decoration:underline;text-decoration:underline dotted}b,strong{font-weight:bolder}:not(pre)>code,:not(pre)>kbd,:not(pre)>samp{font-family:Consolas,monaco,monospace;font-size:.875rem;color:#f0506e;white-space:nowrap;padding:2px 6px;background:#f8f8f8}em{color:#f0506e}ins{background:#ffd;color:#666;text-decoration:none}mark{background:#ffd;color:#666}q{font-style:italic}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}audio,canvas,iframe,img,svg,video{vertical-align:middle}audio,canvas,img,video{max-width:100%;height:auto;box-sizing:border-box}svg:not(:root){overflow:hidden}img:not([src]){visibility:hidden}p,ul,ol,dl,pre,address,fieldset,figure{margin:0 0 20px 0}*+p,*+ul,*+ol,*+dl,*+pre,*+address,*+fieldset,*+figure{margin-top:20px}h1,.uk-h1,h2,.uk-h2,h3,.uk-h3,h4,.uk-h4,h5,.uk-h5,h6,.uk-h6{margin:0 0 20px 0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;font-weight:normal;color:#333;text-transform:none}*+h1,*+.uk-h1,*+h2,*+.uk-h2,*+h3,*+.uk-h3,*+h4,*+.uk-h4,*+h5,*+.uk-h5,*+h6,*+.uk-h6{margin-top:40px}h1,.uk-h1{font-size:2.23125rem;line-height:1.2}h2,.uk-h2{font-size:1.7rem;line-height:1.3}h3,.uk-h3{font-size:1.5rem;line-height:1.4}h4,.uk-h4{font-size:1.25rem;line-height:1.4}h5,.uk-h5{font-size:16px;line-height:1.4}h6,.uk-h6{font-size:.875rem;line-height:1.4}@media (min-width: 960px){h1,.uk-h1{font-size:2.625rem}h2,.uk-h2{font-size:2rem}}ul,ol{padding-left:30px}ul>li>ul,ul>li>ol,ol>li>ol,ol>li>ul{margin:0}dt{font-weight:bold}dd{margin-left:0}hr,.uk-hr{box-sizing:content-box;height:0;overflow:visible;text-align:inherit;margin:0 0 20px 0;border:0;border-top:1px solid #E5E5E5}*+hr,*+.uk-hr{margin-top:20px}address{font-style:normal}blockquote{margin:0 0 20px 0;font-size:1.25rem;line-height:1.5;font-style:italic;color:#333}*+blockquote{margin-top:20px}blockquote p:last-of-type{margin-bottom:0}blockquote footer{margin-top:10px;font-size:.875rem;line-height:1.5;color:#666}blockquote footer::before{content:"— "}pre{font:.875rem / 1.5 Consolas,monaco,monospace;color:#666;-moz-tab-size:4;tab-size:4;overflow:auto;padding:10px;border:1px solid #E5E5E5;border-radius:3px;background:#fff}pre code{font-family:Consolas,monaco,monospace}::-moz-selection{background:#39f;color:#fff;text-shadow:none}::selection{background:#39f;color:#fff;text-shadow:none}details,main{display:block}summary{display:list-item}template{display:none}iframe{border:0}a,area,button,input,label,select,summary,textarea{touch-action:manipulation}.var-media-s::before{content:"640px"}.var-media-m::before{content:"960px"}.var-media-l::before{content:"1200px"}.var-media-xl::before{content:"1600px"}a.uk-link-muted,.uk-link-muted a{color:#999}a.uk-link-muted:hover,.uk-link-muted a:hover{color:#666}a.uk-link-text:not(:hover),.uk-link-text a:not(:hover){color:inherit}a.uk-link-text:hover,.uk-link-text a:hover{color:#999}a.uk-link-heading:not(:hover),.uk-link-heading a:not(:hover){color:inherit}a.uk-link-heading:hover,.uk-link-heading a:hover{color:#7289DA;text-decoration:none}a.uk-link-reset,a.uk-link-reset:hover,.uk-link-reset a,.uk-link-reset a:hover{color:inherit !important;text-decoration:none !important}.uk-heading-primary{font-size:3rem;line-height:1.2}@media (min-width: 960px){.uk-heading-primary{font-size:3.375rem}}@media (min-width: 1200px){.uk-heading-primary{font-size:3.75rem;line-height:1.1}}.uk-heading-hero{font-size:4rem;line-height:1.1}@media (min-width: 960px){.uk-heading-hero{font-size:6rem;line-height:1}}@media (min-width: 1200px){.uk-heading-hero{font-size:8rem;line-height:1}}.uk-heading-divider{padding-bottom:10px;border-bottom:1px solid #E5E5E5}.uk-heading-bullet{position:relative}.uk-heading-bullet::before{content:"";display:inline-block;position:relative;top:calc(-0.1 * 1em);vertical-align:middle;height:.9em;margin-right:10px;border-left:5px solid #E5E5E5}.uk-heading-line{overflow:hidden}.uk-heading-line>*{display:inline-block;position:relative}.uk-heading-line>::before,.uk-heading-line>::after{content:"";position:absolute;top:calc(50% - (1px / 2));width:2000px;border-bottom:1px solid #E5E5E5}.uk-heading-line>::before{right:100%;margin-right:.6em}.uk-heading-line>::after{left:100%;margin-left:.6em}[class*='uk-divider']{border:none;margin-bottom:20px}*+[class*='uk-divider']{margin-top:20px}.uk-divider-icon{position:relative;height:20px;background-image:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D%2220%22%20height%3D%2220%22%20viewBox%3D%220%200%2020%2020%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%20%20%20%20%3Ccircle%20fill%3D%22none%22%20stroke%3D%22%23E5E5E5%22%20stroke-width%3D%222%22%20cx%3D%2210%22%20cy%3D%2210%22%20r%3D%227%22%20%2F%3E%0A%3C%2Fsvg%3E%0A");background-repeat:no-repeat;background-position:50% 50%}.uk-divider-icon::before,.uk-divider-icon::after{content:"";position:absolute;top:50%;max-width:calc(50% - (50px / 2));border-bottom:1px solid #E5E5E5}.uk-divider-icon::before{right:calc(50% + (50px / 2));width:100%}.uk-divider-icon::after{left:calc(50% + (50px / 2));width:100%}.uk-divider-small{line-height:0}.uk-divider-small::after{content:"";display:inline-block;width:100px;max-width:100%;border-top:1px solid #E5E5E5;vertical-align:top}.uk-list{padding:0;list-style:none}.uk-list>li::before,.uk-list>li::after{content:"";display:table}.uk-list>li::after{clear:both}.uk-list>li>:last-child{margin-bottom:0}.uk-list ul{margin:0;padding-left:30px;list-style:none}.uk-list>li:nth-child(n+2),.uk-list>li>ul{margin-top:10px}.uk-list-divider>li:nth-child(n+2){margin-top:10px;padding-top:10px;border-top:1px solid #E5E5E5}.uk-list-striped>li{padding:10px 10px}.uk-list-striped>li:nth-of-type(odd){border-top:1px solid #E5E5E5;border-bottom:1px solid #E5E5E5}.uk-list-striped>li:nth-of-type(odd){background:#f8f8f8}.uk-list-striped>li:nth-child(n+2){margin-top:0}.uk-list-bullet>li{position:relative;padding-left:calc(1.5em + 10px)}.uk-list-bullet>li::before{content:"";position:absolute;top:0;left:0;width:1.5em;height:1.5em;background-image:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D%226%22%20height%3D%226%22%20viewBox%3D%220%200%206%206%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%20%20%20%20%3Ccircle%20fill%3D%22%23666%22%20cx%3D%223%22%20cy%3D%223%22%20r%3D%223%22%20%2F%3E%0A%3C%2Fsvg%3E");background-repeat:no-repeat;background-position:50% 50%;float:left}.uk-list-large>li:nth-child(n+2),.uk-list-large>li>ul{margin-top:20px}.uk-list-large.uk-list-divider>li:nth-child(n+2){margin-top:20px;padding-top:20px}.uk-list-large.uk-list-striped>li{padding:20px 10px}.uk-list-large.uk-list-striped>li:nth-of-type(odd){border-top:1px solid #E5E5E5;border-bottom:1px solid #E5E5E5}.uk-list-large.uk-list-striped>li:nth-child(n+2){margin-top:0}.uk-description-list>dt{color:#333;font-size:.875rem;font-weight:normal;text-transform:uppercase}.uk-description-list>dt:nth-child(n+2){margin-top:20px}.uk-description-list-divider>dt:nth-child(n+2){margin-top:20px;padding-top:20px;border-top:1px solid #E5E5E5}.uk-table{border-collapse:collapse;border-spacing:0;width:100%;margin-bottom:20px}*+.uk-table{margin-top:20px}.uk-table th{padding:16px 12px;text-align:left;vertical-align:bottom;font-size:.875rem;font-weight:normal;color:#999;text-transform:uppercase}.uk-table td{padding:16px 12px;vertical-align:top}.uk-table td>:last-child{margin-bottom:0}.uk-table tfoot{font-size:.875rem}.uk-table caption{font-size:.875rem;text-align:left;color:#999}.uk-table>tr.uk-active,.uk-table tbody tr.uk-active{background:#ffd}.uk-table-middle,.uk-table-middle td{vertical-align:middle !important}.uk-table-divider>tr:not(:first-child),.uk-table-divider>:not(:first-child)>tr,.uk-table-divider>:first-child>tr:not(:first-child){border-top:1px solid #E5E5E5}.uk-table-striped>tr:nth-of-type(odd),.uk-table-striped tbody tr:nth-of-type(odd){background:#f8f8f8;border-top:1px solid #E5E5E5;border-bottom:1px solid #E5E5E5}.uk-table-hover>tr:hover,.uk-table-hover tbody tr:hover{background:#ffd}.uk-table-small th,.uk-table-small td{padding:10px 12px}.uk-table-large th,.uk-table-large td{padding:22px 12px}.uk-table-justify th:first-child,.uk-table-justify td:first-child{padding-left:0}.uk-table-justify th:last-child,.uk-table-justify td:last-child{padding-right:0}.uk-table-shrink{width:1px}.uk-table-expand{min-width:150px}.uk-table-link{padding:0 !important}.uk-table-link>a{display:block;padding:16px 12px}.uk-table-small .uk-table-link>a{padding:10px 12px}@media (max-width: 959px){.uk-table-responsive,.uk-table-responsive tbody,.uk-table-responsive th,.uk-table-responsive td,.uk-table-responsive tr{display:block}.uk-table-responsive thead{display:none}.uk-table-responsive th,.uk-table-responsive td{width:auto !important;max-width:none !important;min-width:0 !important;overflow:visible !important;white-space:normal !important}.uk-table-responsive th:not(:first-child):not(.uk-table-link),.uk-table-responsive td:not(:first-child):not(.uk-table-link),.uk-table-responsive .uk-table-link:not(:first-child)>a{padding-top:5px !important}.uk-table-responsive th:not(:last-child):not(.uk-table-link),.uk-table-responsive td:not(:last-child):not(.uk-table-link),.uk-table-responsive .uk-table-link:not(:last-child)>a{padding-bottom:5px !important}.uk-table-justify.uk-table-responsive th,.uk-table-justify.uk-table-responsive td{padding-left:0;padding-right:0}}.uk-table tbody tr{transition:background-color 0.1s linear}.uk-icon{margin:0;border:none;border-radius:0;overflow:visible;font:inherit;color:inherit;text-transform:none;padding:0;background-color:transparent;display:inline-block;fill:currentcolor;line-height:0}button.uk-icon:not(:disabled){cursor:pointer}.uk-icon::-moz-focus-inner{border:0;padding:0}.uk-icon [fill*='#']:not(.uk-preserve),.uk-icon [FILL*='#']:not(.uk-preserve){fill:currentcolor}.uk-icon [stroke*='#']:not(.uk-preserve),.uk-icon [STROKE*='#']:not(.uk-preserve){stroke:currentcolor}.uk-icon>*{transform:translate(0, 0)}.uk-icon-image{width:20px;height:20px;background-position:50% 50%;background-repeat:no-repeat;background-size:contain;vertical-align:middle}.uk-icon-link{color:#999}.uk-icon-link:hover,.uk-icon-link:focus{color:#666;outline:none}.uk-icon-link:active,.uk-active>.uk-icon-link{color:#595959}.uk-icon-button{box-sizing:border-box;width:36px;height:36px;border-radius:500px;background:#f8f8f8;color:#999;vertical-align:middle;display:inline-flex;justify-content:center;align-items:center;transition:0.1s ease-in-out;transition-property:color, background-color}.uk-icon-button:hover,.uk-icon-button:focus{background-color:#ebebeb;color:#666;outline:none}.uk-icon-button:active,.uk-active>.uk-icon-button{background-color:#dfdfdf;color:#666}.uk-range{box-sizing:border-box;margin:0;vertical-align:middle;max-width:100%;width:100%;-webkit-appearance:none;background:transparent;padding:0}.uk-range:focus{outline:none}.uk-range::-moz-focus-outer{border:none}.uk-range::-ms-track{height:15px;background:transparent;border-color:transparent;color:transparent}.uk-range:not(:disabled)::-webkit-slider-thumb{cursor:pointer}.uk-range:not(:disabled)::-moz-range-thumb{cursor:pointer}.uk-range:not(:disabled)::-ms-thumb{cursor:pointer}.uk-range::-webkit-slider-thumb{-webkit-appearance:none;margin-top:-7px;height:15px;width:15px;border-radius:500px;background:#fff;border:1px solid #ccc}.uk-range::-moz-range-thumb{border:none;height:15px;width:15px;border-radius:500px;background:#fff;border:1px solid #ccc}.uk-range::-ms-thumb{margin-top:0}.uk-range::-ms-thumb{border:none;height:15px;width:15px;border-radius:500px;background:#fff;border:1px solid #ccc}.uk-range::-ms-tooltip{display:none}.uk-range::-webkit-slider-runnable-track{height:3px;background:#ebebeb;border-radius:500px}.uk-range:focus::-webkit-slider-runnable-track,.uk-range:active::-webkit-slider-runnable-track{background:#d2d2d2}.uk-range::-moz-range-track{height:3px;background:#ebebeb;border-radius:500px}.uk-range:focus::-moz-range-track{background:#d2d2d2}.uk-range::-ms-fill-lower,.uk-range::-ms-fill-upper{height:3px;background:#ebebeb;border-radius:500px}.uk-range:focus::-ms-fill-lower,.uk-range:focus::-ms-fill-upper{background:#d2d2d2}.uk-input,.uk-select,.uk-textarea,.uk-radio,.uk-checkbox{box-sizing:border-box;margin:0;border-radius:0;font:inherit}.uk-input{overflow:visible}.uk-select{text-transform:none}.uk-select optgroup{font:inherit;font-weight:bold}.uk-textarea{overflow:auto}.uk-input[type="search"]::-webkit-search-cancel-button,.uk-input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}.uk-input[type="number"]::-webkit-inner-spin-button,.uk-input[type="number"]::-webkit-outer-spin-button{height:auto}.uk-input::-moz-placeholder,.uk-textarea::-moz-placeholder{opacity:1}.uk-radio:not(:disabled),.uk-checkbox:not(:disabled){cursor:pointer}.uk-fieldset{border:none;margin:0;padding:0}.uk-input,.uk-textarea{-webkit-appearance:none}.uk-input,.uk-select,.uk-textarea{max-width:100%;width:100%;border:0 none;padding:0 10px;background:#fff;color:#666;border:1px solid #E5E5E5;transition:0.2s ease-in-out;transition-property:color, background-color, border}.uk-input,.uk-select:not([multiple]):not([size]){height:40px;vertical-align:middle;display:inline-block}.uk-input:not(input),.uk-select:not(select){line-height:38px}.uk-select[multiple],.uk-select[size],.uk-textarea{padding-top:4px;padding-bottom:4px;vertical-align:top}.uk-input:focus,.uk-select:focus,.uk-textarea:focus{outline:none;background-color:#fff;color:#666;border-color:#7289DA}.uk-input:disabled,.uk-select:disabled,.uk-textarea:disabled{background-color:#f8f8f8;color:#999;border-color:#E5E5E5}.uk-input:-ms-input-placeholder{color:#999 !important}.uk-input::placeholder{color:#999}.uk-textarea:-ms-input-placeholder{color:#999 !important}.uk-textarea::placeholder{color:#999}.uk-form-small{font-size:.875rem}.uk-form-small:not(textarea):not([multiple]):not([size]){height:30px;padding-left:8px;padding-right:8px}.uk-form-small:not(select):not(input):not(textarea){line-height:28px}.uk-form-large{font-size:1.25rem}.uk-form-large:not(textarea):not([multiple]):not([size]){height:55px;padding-left:12px;padding-right:12px}.uk-form-large:not(select):not(input):not(textarea){line-height:53px}.uk-form-danger,.uk-form-danger:focus{color:#f0506e;border-color:#f0506e}.uk-form-success,.uk-form-success:focus{color:#32d296;border-color:#32d296}.uk-form-blank{background:none;border-color:transparent}.uk-form-blank:focus{border-color:#E5E5E5;border-style:dashed}input.uk-form-width-xsmall{width:50px}select.uk-form-width-xsmall{width:75px}.uk-form-width-small{width:130px}.uk-form-width-medium{width:200px}.uk-form-width-large{width:500px}.uk-select:not([multiple]):not([size]){-webkit-appearance:none;-moz-appearance:none;padding-right:20px;background-image:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D%2224%22%20height%3D%2216%22%20viewBox%3D%220%200%2024%2016%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%20%20%20%20%3Cpolygon%20fill%3D%22%23666%22%20points%3D%2212%201%209%206%2015%206%22%20%2F%3E%0A%20%20%20%20%3Cpolygon%20fill%3D%22%23666%22%20points%3D%2212%2013%209%208%2015%208%22%20%2F%3E%0A%3C%2Fsvg%3E%0A");background-repeat:no-repeat;background-position:100% 50%}.uk-select:not([multiple]):not([size])::-ms-expand{display:none}.uk-select:not([multiple]):not([size]) option{color:#444}.uk-select:not([multiple]):not([size]):disabled{background-image:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D%2224%22%20height%3D%2216%22%20viewBox%3D%220%200%2024%2016%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%20%20%20%20%3Cpolygon%20fill%3D%22%23999%22%20points%3D%2212%201%209%206%2015%206%22%20%2F%3E%0A%20%20%20%20%3Cpolygon%20fill%3D%22%23999%22%20points%3D%2212%2013%209%208%2015%208%22%20%2F%3E%0A%3C%2Fsvg%3E%0A")}.uk-radio,.uk-checkbox{display:inline-block;height:16px;width:16px;overflow:hidden;margin-top:-4px;vertical-align:middle;-webkit-appearance:none;-moz-appearance:none;background-color:rgba(0,0,0,0);background-repeat:no-repeat;background-position:50% 50%;border:1px solid #ccc;transition:0.2s ease-in-out;transition-property:background-color, border}.uk-radio{border-radius:50%}.uk-radio:focus,.uk-checkbox:focus{outline:none;border-color:#7289DA}.uk-radio:checked,.uk-checkbox:checked,.uk-checkbox:indeterminate{background-color:#7289DA;border-color:rgba(0,0,0,0)}.uk-radio:checked:focus,.uk-checkbox:checked:focus,.uk-checkbox:indeterminate:focus{background-color:#4a67cf}.uk-radio:checked{background-image:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%20%20%20%20%3Ccircle%20fill%3D%22%23fff%22%20cx%3D%228%22%20cy%3D%228%22%20r%3D%222%22%20%2F%3E%0A%3C%2Fsvg%3E")}.uk-checkbox:checked{background-image:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D%2214%22%20height%3D%2211%22%20viewBox%3D%220%200%2014%2011%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%20%20%20%20%3Cpolygon%20fill%3D%22%23fff%22%20points%3D%2212%201%205%207.5%202%205%201%205.5%205%2010%2013%201.5%22%20%2F%3E%0A%3C%2Fsvg%3E%0A")}.uk-checkbox:indeterminate{background-image:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%20%20%20%20%3Crect%20fill%3D%22%23fff%22%20x%3D%223%22%20y%3D%228%22%20width%3D%2210%22%20height%3D%221%22%20%2F%3E%0A%3C%2Fsvg%3E")}.uk-radio:disabled,.uk-checkbox:disabled{background-color:#f8f8f8;border-color:#E5E5E5}.uk-radio:disabled:checked{background-image:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%20%20%20%20%3Ccircle%20fill%3D%22%23999%22%20cx%3D%228%22%20cy%3D%228%22%20r%3D%222%22%20%2F%3E%0A%3C%2Fsvg%3E")}.uk-checkbox:disabled:checked{background-image:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D%2214%22%20height%3D%2211%22%20viewBox%3D%220%200%2014%2011%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%20%20%20%20%3Cpolygon%20fill%3D%22%23999%22%20points%3D%2212%201%205%207.5%202%205%201%205.5%205%2010%2013%201.5%22%20%2F%3E%0A%3C%2Fsvg%3E%0A")}.uk-checkbox:disabled:indeterminate{background-image:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%20%20%20%20%3Crect%20fill%3D%22%23999%22%20x%3D%223%22%20y%3D%228%22%20width%3D%2210%22%20height%3D%221%22%20%2F%3E%0A%3C%2Fsvg%3E")}.uk-legend{width:100%;color:inherit;padding:0;font-size:1.5rem;line-height:1.4}.uk-form-custom{display:inline-block;position:relative;max-width:100%;vertical-align:middle}.uk-form-custom select,.uk-form-custom input[type="file"]{position:absolute;top:0;z-index:1;width:100%;height:100%;left:0;-webkit-appearance:none;opacity:0;cursor:pointer}.uk-form-custom input[type="file"]{font-size:500px;overflow:hidden}.uk-form-label{color:#333;font-size:.875rem}.uk-form-stacked .uk-form-label{display:block;margin-bottom:5px}@media (max-width: 959px){.uk-form-horizontal .uk-form-label{display:block;margin-bottom:5px}}@media (min-width: 960px){.uk-form-horizontal .uk-form-label{width:200px;margin-top:7px;float:left}.uk-form-horizontal .uk-form-controls{margin-left:215px}.uk-form-horizontal .uk-form-controls-text{padding-top:7px}}.uk-form-icon{position:absolute;top:0;bottom:0;left:0;width:40px;display:inline-flex;justify-content:center;align-items:center;color:#999}.uk-form-icon:hover{color:#666}.uk-form-icon:not(a):not(button):not(input){pointer-events:none}.uk-form-icon:not(.uk-form-icon-flip) ~ .uk-input{padding-left:40px !important}.uk-form-icon-flip{right:0;left:auto}.uk-form-icon-flip ~ .uk-input{padding-right:40px !important}.uk-button{margin:0;border:none;border-radius:0;overflow:visible;font:inherit;color:inherit;text-transform:none;display:inline-block;box-sizing:border-box;padding:0 30px;vertical-align:middle;font-size:.875rem;line-height:38px;text-align:center;text-decoration:none;text-transform:uppercase;transition:0.1s ease-in-out;transition-property:color, background-color, border-color}.uk-button:not(:disabled){cursor:pointer}.uk-button::-moz-focus-inner{border:0;padding:0}.uk-button:hover{text-decoration:none}.uk-button:focus{outline:none}.uk-button-default{background-color:rgba(0,0,0,0);color:#333;border:1px solid #E5E5E5}.uk-button-default:hover,.uk-button-default:focus{background-color:rgba(0,0,0,0);color:#333;border-color:#b2b2b2}.uk-button-default:active,.uk-button-default.uk-active{background-color:rgba(0,0,0,0);color:#333;border-color:#999}.uk-button-primary{background-color:#7289DA;color:#fff;border:1px solid transparent}.uk-button-primary:hover,.uk-button-primary:focus{background-color:#5e78d5;color:#fff}.uk-button-primary:active,.uk-button-primary.uk-active{background-color:#4a67cf;color:#fff}.uk-button-secondary{background-color:#222;color:#fff;border:1px solid transparent}.uk-button-secondary:hover,.uk-button-secondary:focus{background-color:#151515;color:#fff}.uk-button-secondary:active,.uk-button-secondary.uk-active{background-color:#090909;color:#fff}.uk-button-danger{background-color:#f0506e;color:#fff;border:1px solid transparent}.uk-button-danger:hover,.uk-button-danger:focus{background-color:#ee395b;color:#fff}.uk-button-danger:active,.uk-button-danger.uk-active{background-color:#ec2147;color:#fff}.uk-button-default:disabled,.uk-button-primary:disabled,.uk-button-secondary:disabled,.uk-button-danger:disabled{background-color:rgba(0,0,0,0);color:#999;border-color:#E5E5E5}.uk-button-small{padding:0 15px;line-height:28px;font-size:.875rem}.uk-button-large{padding:0 40px;line-height:53px;font-size:.875rem}.uk-button-text{padding:0;line-height:1.5;background:none;color:#333;position:relative}.uk-button-text::before{content:"";position:absolute;bottom:0;left:0;right:100%;border-bottom:1px solid #333;transition:right 0.3s ease-out}.uk-button-text:hover,.uk-button-text:focus{color:#333}.uk-button-text:hover::before,.uk-button-text:focus::before{right:0}.uk-button-text:disabled{color:#999}.uk-button-text:disabled::before{display:none}.uk-button-link{padding:0;line-height:1.5;background:none;color:#1e87f0}.uk-button-link:hover,.uk-button-link:focus{color:#0f6ecd;text-decoration:underline}.uk-button-link:disabled{color:#999;text-decoration:none}.uk-button-group{display:inline-flex;vertical-align:middle;position:relative}.uk-button-group>.uk-button:nth-child(n+2),.uk-button-group>div:nth-child(n+2) .uk-button{margin-left:-1px}.uk-button-group .uk-button:hover,.uk-button-group .uk-button:focus,.uk-button-group .uk-button:active,.uk-button-group .uk-button.uk-active{position:relative;z-index:1}.uk-section{box-sizing:border-box;padding-top:40px;padding-bottom:40px}@media (min-width: 960px){.uk-section{padding-top:70px;padding-bottom:70px}}.uk-section::before,.uk-section::after{content:"";display:table}.uk-section::after{clear:both}.uk-section>:last-child{margin-bottom:0}.uk-section-xsmall{padding-top:20px;padding-bottom:20px}.uk-section-small{padding-top:40px;padding-bottom:40px}.uk-section-large{padding-top:70px;padding-bottom:70px}@media (min-width: 960px){.uk-section-large{padding-top:140px;padding-bottom:140px}}.uk-section-xlarge{padding-top:140px;padding-bottom:140px}@media (min-width: 960px){.uk-section-xlarge{padding-top:210px;padding-bottom:210px}}.uk-section-default{background:#fff}.uk-section-muted{background:#f8f8f8}.uk-section-primary{background:#7289DA}.uk-section-secondary{background:#222}.uk-container{box-sizing:content-box;max-width:1200px;margin-left:auto;margin-right:auto;padding-left:15px;padding-right:15px}@media (min-width: 640px){.uk-container{padding-left:30px;padding-right:30px}}@media (min-width: 960px){.uk-container{padding-left:40px;padding-right:40px}}.uk-container::before,.uk-container::after{content:"";display:table}.uk-container::after{clear:both}.uk-container>:last-child{margin-bottom:0}.uk-container .uk-container{padding-left:0;padding-right:0}.uk-container-small{max-width:900px}.uk-container-large{max-width:1600px}.uk-container-expand{max-width:none}.uk-grid{display:flex;flex-wrap:wrap;margin:0;padding:0;list-style:none}.uk-grid>*{margin:0}.uk-grid>*>:last-child{margin-bottom:0}.uk-grid{margin-left:-30px}.uk-grid>*{padding-left:30px}.uk-grid+.uk-grid,.uk-grid>.uk-grid-margin,*+.uk-grid-margin{margin-top:30px}@media (min-width: 1200px){.uk-grid{margin-left:-40px}.uk-grid>*{padding-left:40px}.uk-grid+.uk-grid,.uk-grid>.uk-grid-margin,*+.uk-grid-margin{margin-top:40px}}.uk-grid-small{margin-left:-15px}.uk-grid-small>*{padding-left:15px}.uk-grid+.uk-grid-small,.uk-grid-small>.uk-grid-margin,*+.uk-grid-margin-small{margin-top:15px}.uk-grid-medium{margin-left:-30px}.uk-grid-medium>*{padding-left:30px}.uk-grid+.uk-grid-medium,.uk-grid-medium>.uk-grid-margin,*+.uk-grid-margin-medium{margin-top:30px}.uk-grid-large{margin-left:-40px}.uk-grid-large>*{padding-left:40px}.uk-grid+.uk-grid-large,.uk-grid-large>.uk-grid-margin,*+.uk-grid-margin-large{margin-top:40px}@media (min-width: 1200px){.uk-grid-large{margin-left:-70px}.uk-grid-large>*{padding-left:70px}.uk-grid+.uk-grid-large,.uk-grid-large>.uk-grid-margin,*+.uk-grid-margin-large{margin-top:70px}}.uk-grid-collapse{margin-left:0}.uk-grid-collapse>*{padding-left:0}.uk-grid+.uk-grid-collapse,.uk-grid-collapse>.uk-grid-margin{margin-top:0}.uk-grid-divider>*{position:relative}.uk-grid-divider>:not(.uk-first-column)::before{content:"";position:absolute;top:0;bottom:0;border-left:1px solid #E5E5E5}.uk-grid-divider.uk-grid-stack>.uk-grid-margin::before{content:"";position:absolute;left:0;right:0;border-top:1px solid #E5E5E5}.uk-grid-divider{margin-left:-60px}.uk-grid-divider>*{padding-left:60px}.uk-grid-divider>:not(.uk-first-column)::before{left:30px}.uk-grid-divider.uk-grid-stack>.uk-grid-margin{margin-top:60px}.uk-grid-divider.uk-grid-stack>.uk-grid-margin::before{top:-30px;left:60px}@media (min-width: 1200px){.uk-grid-divider{margin-left:-80px}.uk-grid-divider>*{padding-left:80px}.uk-grid-divider>:not(.uk-first-column)::before{left:40px}.uk-grid-divider.uk-grid-stack>.uk-grid-margin{margin-top:80px}.uk-grid-divider.uk-grid-stack>.uk-grid-margin::before{top:-40px;left:80px}}.uk-grid-divider.uk-grid-small{margin-left:-30px}.uk-grid-divider.uk-grid-small>*{padding-left:30px}.uk-grid-divider.uk-grid-small>:not(.uk-first-column)::before{left:15px}.uk-grid-divider.uk-grid-small.uk-grid-stack>.uk-grid-margin{margin-top:30px}.uk-grid-divider.uk-grid-small.uk-grid-stack>.uk-grid-margin::before{top:-15px;left:30px}.uk-grid-divider.uk-grid-medium{margin-left:-60px}.uk-grid-divider.uk-grid-medium>*{padding-left:60px}.uk-grid-divider.uk-grid-medium>:not(.uk-first-column)::before{left:30px}.uk-grid-divider.uk-grid-medium.uk-grid-stack>.uk-grid-margin{margin-top:60px}.uk-grid-divider.uk-grid-medium.uk-grid-stack>.uk-grid-margin::before{top:-30px;left:60px}.uk-grid-divider.uk-grid-large{margin-left:-80px}.uk-grid-divider.uk-grid-large>*{padding-left:80px}.uk-grid-divider.uk-grid-large>:not(.uk-first-column)::before{left:40px}.uk-grid-divider.uk-grid-large.uk-grid-stack>.uk-grid-margin{margin-top:80px}.uk-grid-divider.uk-grid-large.uk-grid-stack>.uk-grid-margin::before{top:-40px;left:80px}@media (min-width: 1200px){.uk-grid-divider.uk-grid-large{margin-left:-140px}.uk-grid-divider.uk-grid-large>*{padding-left:140px}.uk-grid-divider.uk-grid-large>:not(.uk-first-column)::before{left:70px}.uk-grid-divider.uk-grid-large.uk-grid-stack>.uk-grid-margin{margin-top:140px}.uk-grid-divider.uk-grid-large.uk-grid-stack>.uk-grid-margin::before{top:-70px;left:140px}}.uk-grid-match>*,.uk-grid-item-match{display:flex;flex-wrap:wrap}.uk-grid-match>*>:not([class*='uk-width']),.uk-grid-item-match>:not([class*='uk-width']){box-sizing:border-box;width:100%;flex:auto}.uk-tile{position:relative;box-sizing:border-box;padding-left:15px;padding-right:15px;padding-top:40px;padding-bottom:40px}@media (min-width: 640px){.uk-tile{padding-left:30px;padding-right:30px}}@media (min-width: 960px){.uk-tile{padding-left:40px;padding-right:40px;padding-top:70px;padding-bottom:70px}}.uk-tile::before,.uk-tile::after{content:"";display:table}.uk-tile::after{clear:both}.uk-tile>:last-child{margin-bottom:0}.uk-tile-xsmall{padding-top:20px;padding-bottom:20px}.uk-tile-small{padding-top:40px;padding-bottom:40px}.uk-tile-large{padding-top:70px;padding-bottom:70px}@media (min-width: 960px){.uk-tile-large{padding-top:140px;padding-bottom:140px}}.uk-tile-xlarge{padding-top:140px;padding-bottom:140px}@media (min-width: 960px){.uk-tile-xlarge{padding-top:210px;padding-bottom:210px}}.uk-tile-default{background:#fff}.uk-tile-muted{background:#f8f8f8}.uk-tile-primary{background:#7289DA}.uk-tile-secondary{background:#222}.uk-card{position:relative;box-sizing:border-box;color:#000}.uk-card-body{padding:30px 30px}.uk-card-header{padding:15px 30px}.uk-card-footer{padding:15px 30px}@media (min-width: 1200px){.uk-card-body{padding:40px 40px}.uk-card-header{padding:20px 40px}.uk-card-footer{padding:20px 40px}}.uk-card-body::before,.uk-card-body::after,.uk-card-header::before,.uk-card-header::after,.uk-card-footer::before,.uk-card-footer::after{content:"";display:table}.uk-card-body::after,.uk-card-header::after,.uk-card-footer::after{clear:both}.uk-card-body>:last-child,.uk-card-header>:last-child,.uk-card-footer>:last-child{margin-bottom:0}.uk-card-title{font-size:1.5rem;line-height:1.4}.uk-card-badge{position:absolute;top:30px;right:30px;z-index:1}.uk-card-badge:first-child+*{margin-top:0}.uk-card-hover:not(.uk-card-default):not(.uk-card-primary):not(.uk-card-secondary):hover{background:#fff;box-shadow:0 14px 25px rgba(0,0,0,0.16)}.uk-card-default{background:#fff;color:#666;box-shadow:0 5px 15px rgba(0,0,0,0.08)}.uk-card-default .uk-card-title{color:#333}.uk-card-default.uk-card-hover:hover{background-color:#fff;box-shadow:0 14px 25px rgba(0,0,0,0.16)}.uk-card-default .uk-card-header{border-bottom:1px solid #E5E5E5}.uk-card-default .uk-card-footer{border-top:1px solid #E5E5E5}.uk-card-primary{background:#7289DA;color:#fff;box-shadow:0 5px 15px rgba(0,0,0,0.08)}.uk-card-primary .uk-card-title{color:#fff}.uk-card-primary.uk-card-hover:hover{background-color:#7289DA;box-shadow:0 14px 25px rgba(0,0,0,0.16)}.uk-card-secondary{background:#222;color:#fff;box-shadow:0 5px 15px rgba(0,0,0,0.08)}.uk-card-secondary .uk-card-title{color:#fff}.uk-card-secondary.uk-card-hover:hover{background-color:#222;box-shadow:0 14px 25px rgba(0,0,0,0.16)}.uk-card-small.uk-card-body,.uk-card-small .uk-card-body{padding:20px 20px}.uk-card-small .uk-card-header{padding:13px 20px}.uk-card-small .uk-card-footer{padding:13px 20px}@media (min-width: 1200px){.uk-card-large.uk-card-body,.uk-card-large .uk-card-body{padding:70px 70px}.uk-card-large .uk-card-header{padding:35px 70px}.uk-card-large .uk-card-footer{padding:35px 70px}}.uk-card-body>.uk-nav-default{margin-left:-30px;margin-right:-30px}.uk-card-body>.uk-nav-default:only-child{margin-top:-15px;margin-bottom:-15px}.uk-card-body .uk-nav-default>li>a,.uk-card-body .uk-nav-default .uk-nav-header,.uk-card-body .uk-nav-default .uk-nav-divider{padding-left:30px;padding-right:30px}.uk-card-body .uk-nav-default .uk-nav-sub{padding-left:45px}@media (min-width: 1200px){.uk-card-body>.uk-nav-default{margin-left:-40px;margin-right:-40px}.uk-card-body>.uk-nav-default:only-child{margin-top:-25px;margin-bottom:-25px}.uk-card-body .uk-nav-default>li>a,.uk-card-body .uk-nav-default .uk-nav-header,.uk-card-body .uk-nav-default .uk-nav-divider{padding-left:40px;padding-right:40px}.uk-card-body .uk-nav-default .uk-nav-sub{padding-left:55px}}.uk-card-small>.uk-nav-default{margin-left:-20px;margin-right:-20px}.uk-card-small>.uk-nav-default:only-child{margin-top:-5px;margin-bottom:-5px}.uk-card-small .uk-nav-default>li>a,.uk-card-small .uk-nav-default .uk-nav-header,.uk-card-small .uk-nav-default .uk-nav-divider{padding-left:20px;padding-right:20px}.uk-card-small .uk-nav-default .uk-nav-sub{padding-left:35px}@media (min-width: 1200px){.uk-card-large>.uk-nav-default{margin:0}.uk-card-large>.uk-nav-default:only-child{margin:0}.uk-card-large .uk-nav-default>li>a,.uk-card-large .uk-nav-default .uk-nav-header,.uk-card-large .uk-nav-default .uk-nav-divider{padding-left:0;padding-right:0}.uk-card-large .uk-nav-default .uk-nav-sub{padding-left:15px}}.uk-close{color:#999;transition:0.1s ease-in-out;transition-property:color, opacity}.uk-close:hover,.uk-close:focus{color:#666;outline:none}.uk-spinner>*{animation:uk-spinner-rotate 1.4s linear infinite}@keyframes uk-spinner-rotate{0%{transform:rotate(0deg)}100%{transform:rotate(270deg)}}.uk-spinner>*>*{stroke-dasharray:88px;stroke-dashoffset:0;transform-origin:center;animation:uk-spinner-dash 1.4s ease-in-out infinite;stroke-width:1;stroke-linecap:round}@keyframes uk-spinner-dash{0%{stroke-dashoffset:88px}50%{stroke-dashoffset:22px;transform:rotate(135deg)}100%{stroke-dashoffset:88px;transform:rotate(450deg)}}.uk-totop{padding:5px;color:#999;transition:color 0.1s ease-in-out}.uk-totop:hover,.uk-totop:focus{color:#666;outline:none}.uk-totop:active{color:#333}.uk-marker{padding:5px;background:#222;color:#fff;border-radius:500px}.uk-marker:hover,.uk-marker:focus{color:#fff;outline:none}.uk-alert{position:relative;margin-bottom:20px;padding:15px 29px 15px 15px;background:#f8f8f8;color:#666}*+.uk-alert{margin-top:20px}.uk-alert>:last-child{margin-bottom:0}.uk-alert-close{position:absolute;top:20px;right:15px;color:inherit;opacity:.4}.uk-alert-close:first-child+*{margin-top:0}.uk-alert-close:hover,.uk-alert-close:focus{color:inherit;opacity:.8}.uk-alert-primary{background:#fbfcfe;color:#7289DA}.uk-alert-success{background:#edfbf6;color:#32d296}.uk-alert-warning{background:#fef5ee;color:#faa05a}.uk-alert-danger{background:#fef4f6;color:#f0506e}.uk-alert h1,.uk-alert h2,.uk-alert h3,.uk-alert h4,.uk-alert h5,.uk-alert h6{color:inherit}.uk-alert a:not([class]){color:inherit;text-decoration:underline}.uk-alert a:not([class]):hover{color:inherit;text-decoration:underline}.uk-badge{box-sizing:border-box;min-width:22px;height:22px;padding:0 5px;border-radius:500px;vertical-align:middle;background:#7289DA;color:#fff;font-size:.875rem;display:inline-flex;justify-content:center;align-items:center}.uk-badge:hover,.uk-badge:focus{color:#fff;text-decoration:none;outline:none}.uk-label{display:inline-block;padding:0 10px;background:#7289DA;line-height:1.5;font-size:.875rem;color:#fff;vertical-align:middle;white-space:nowrap;border-radius:2px;text-transform:uppercase}.uk-label-success{background-color:#32d296;color:#fff}.uk-label-warning{background-color:#faa05a;color:#fff}.uk-label-danger{background-color:#f0506e;color:#fff}.uk-overlay{padding:30px 30px}.uk-overlay>:last-child{margin-bottom:0}.uk-overlay-default{background:rgba(255,255,255,0.8)}.uk-overlay-primary{background:rgba(34,34,34,0.8)}.uk-article::before,.uk-article::after{content:"";display:table}.uk-article::after{clear:both}.uk-article>:last-child{margin-bottom:0}.uk-article+.uk-article{margin-top:70px}.uk-article-title{font-size:2.23125rem;line-height:1.2}@media (min-width: 960px){.uk-article-title{font-size:2.625rem}}.uk-article-meta{font-size:.875rem;line-height:1.4;color:#999}.uk-article-meta a{color:#999}.uk-article-meta a:hover{color:#666;text-decoration:none}.uk-comment-body{overflow-wrap:break-word;word-wrap:break-word}.uk-comment-header{margin-bottom:20px}.uk-comment-body::before,.uk-comment-body::after,.uk-comment-header::before,.uk-comment-header::after{content:"";display:table}.uk-comment-body::after,.uk-comment-header::after{clear:both}.uk-comment-body>:last-child,.uk-comment-header>:last-child{margin-bottom:0}.uk-comment-title{font-size:1.25rem;line-height:1.4}.uk-comment-meta{font-size:.875rem;line-height:1.4;color:#999}.uk-comment-list{padding:0;list-style:none}.uk-comment-list>:nth-child(n+2){margin-top:70px}.uk-comment-list .uk-comment ~ ul{margin:70px 0 0 0;padding-left:30px;list-style:none}@media (min-width: 960px){.uk-comment-list .uk-comment ~ ul{padding-left:100px}}.uk-comment-list .uk-comment ~ ul>:nth-child(n+2){margin-top:70px}.uk-comment-primary{padding:30px;background-color:#f8f8f8}.uk-search{display:inline-block;position:relative;max-width:100%;margin:0}.uk-search-input::-webkit-search-cancel-button,.uk-search-input::-webkit-search-decoration{-webkit-appearance:none}.uk-search-input::-moz-placeholder{opacity:1}.uk-search-input{box-sizing:border-box;margin:0;border-radius:0;font:inherit;overflow:visible;-webkit-appearance:none;vertical-align:middle;width:100%;border:none;color:#666}.uk-search-input:focus{outline:none}.uk-search-input:-ms-input-placeholder{color:#999 !important}.uk-search-input::placeholder{color:#999}.uk-search-icon:focus{outline:none}.uk-search .uk-search-icon{position:absolute;top:0;bottom:0;left:0;display:inline-flex;justify-content:center;align-items:center;color:#999}.uk-search .uk-search-icon:hover{color:#999}.uk-search .uk-search-icon:not(a):not(button):not(input){pointer-events:none}.uk-search .uk-search-icon-flip{right:0;left:auto}.uk-search-default{width:180px}.uk-search-default .uk-search-input{height:40px;padding-left:6px;padding-right:6px;background:rgba(0,0,0,0);border:1px solid #E5E5E5}.uk-search-default .uk-search-input:focus{background-color:rgba(0,0,0,0)}.uk-search-default .uk-search-icon{width:40px}.uk-search-default .uk-search-icon:not(.uk-search-icon-flip) ~ .uk-search-input{padding-left:40px}.uk-search-default .uk-search-icon-flip ~ .uk-search-input{padding-right:40px}.uk-search-navbar{width:400px}.uk-search-navbar .uk-search-input{height:40px;background:rgba(0,0,0,0);font-size:1.5rem}.uk-search-navbar .uk-search-icon{width:40px}.uk-search-navbar .uk-search-icon:not(.uk-search-icon-flip) ~ .uk-search-input{padding-left:40px}.uk-search-navbar .uk-search-icon-flip ~ .uk-search-input{padding-right:40px}.uk-search-large{width:500px}.uk-search-large .uk-search-input{height:80px;background:rgba(0,0,0,0);font-size:2.625rem}.uk-search-large .uk-search-icon{width:80px}.uk-search-large .uk-search-icon:not(.uk-search-icon-flip) ~ .uk-search-input{padding-left:80px}.uk-search-large .uk-search-icon-flip ~ .uk-search-input{padding-right:80px}.uk-search-toggle{color:#999}.uk-search-toggle:hover,.uk-search-toggle:focus{color:#666}.uk-nav,.uk-nav ul{margin:0;padding:0;list-style:none}.uk-nav li>a{display:block;text-decoration:none}.uk-nav li>a:focus{outline:none}.uk-nav>li>a{padding:5px 0}ul.uk-nav-sub{padding:5px 0 5px 15px}.uk-nav-sub ul{padding-left:15px}.uk-nav-sub a{padding:2px 0}.uk-nav-parent-icon>.uk-parent>a::after{content:"";width:1.5em;height:1.5em;float:right;background-image:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D%2214%22%20height%3D%2214%22%20viewBox%3D%220%200%2014%2014%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%20%20%20%20%3Cpolyline%20fill%3D%22none%22%20stroke%3D%22%23666%22%20stroke-width%3D%221.1%22%20points%3D%2210%201%204%207%2010%2013%22%20%2F%3E%0A%3C%2Fsvg%3E");background-repeat:no-repeat;background-position:50% 50%}.uk-nav-parent-icon>.uk-parent.uk-open>a::after{background-image:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D%2214%22%20height%3D%2214%22%20viewBox%3D%220%200%2014%2014%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%20%20%20%20%3Cpolyline%20fill%3D%22none%22%20stroke%3D%22%23666%22%20stroke-width%3D%221.1%22%20points%3D%221%204%207%2010%2013%204%22%20%2F%3E%0A%3C%2Fsvg%3E")}.uk-nav-header{padding:5px 0;text-transform:uppercase;font-size:.875rem}.uk-nav-header:not(:first-child){margin-top:20px}.uk-nav-divider{margin:5px 0}.uk-nav-default{font-size:.875rem}.uk-nav-default>li>a{color:#999}.uk-nav-default>li>a:hover,.uk-nav-default>li>a:focus{color:#666}.uk-nav-default>li.uk-active>a{color:#333}.uk-nav-default .uk-nav-header{color:#333}.uk-nav-default .uk-nav-divider{border-top:1px solid #E5E5E5}.uk-nav-default .uk-nav-sub a{color:#999}.uk-nav-default .uk-nav-sub a:hover,.uk-nav-default .uk-nav-sub a:focus{color:#666}.uk-nav-primary>li>a{font-size:1.5rem;line-height:1.5;color:#999}.uk-nav-primary>li>a:hover,.uk-nav-primary>li>a:focus{color:#666}.uk-nav-primary>li.uk-active>a{color:#333}.uk-nav-primary .uk-nav-header{color:#333}.uk-nav-primary .uk-nav-divider{border-top:1px solid #E5E5E5}.uk-nav-primary .uk-nav-sub a{color:#999}.uk-nav-primary .uk-nav-sub a:hover,.uk-nav-primary .uk-nav-sub a:focus{color:#666}.uk-nav-center{text-align:center}.uk-nav-center .uk-nav-sub,.uk-nav-center .uk-nav-sub ul{padding-left:0}.uk-nav-center.uk-nav-parent-icon>.uk-parent>a::after{position:absolute}.uk-navbar{display:flex;position:relative}.uk-navbar-container:not(.uk-navbar-transparent){background:#f8f8f8}.uk-navbar-container>::before,.uk-navbar-container>::after{display:none !important}.uk-navbar-left,.uk-navbar-right,.uk-navbar-center,.uk-navbar-center-left>*,.uk-navbar-center-right>*{display:flex;align-items:center}.uk-navbar-right{margin-left:auto}.uk-navbar-center:only-child{margin-left:auto;margin-right:auto;position:relative}.uk-navbar-center:not(:only-child){position:absolute;top:50%;left:50%;transform:translate(-50%, -50%);z-index:990}.uk-navbar-center:not(:only-child) .uk-navbar-nav>li>a,.uk-navbar-center:not(:only-child) .uk-navbar-item,.uk-navbar-center:not(:only-child) .uk-navbar-toggle{white-space:nowrap}.uk-navbar-center-left,.uk-navbar-center-right{position:absolute;top:0}.uk-navbar-center-left{right:100%}.uk-navbar-center-right{left:100%}[class*='uk-navbar-center-'] .uk-navbar-nav>li>a,[class*='uk-navbar-center-'] .uk-navbar-item,[class*='uk-navbar-center-'] .uk-navbar-toggle{white-space:nowrap}.uk-navbar-nav{display:flex;margin:0;padding:0;list-style:none}.uk-navbar-left,.uk-navbar-right,.uk-navbar-center:only-child{flex-wrap:wrap}.uk-navbar-nav>li>a,.uk-navbar-item,.uk-navbar-toggle{display:flex;justify-content:center;align-items:center;box-sizing:border-box;height:80px;padding:0 15px;font-size:.875rem;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;text-decoration:none}.uk-navbar-nav>li>a{color:#999;text-transform:uppercase;transition:0.1s ease-in-out;transition-property:color, background-color}.uk-navbar-nav>li:hover>a,.uk-navbar-nav>li>a:focus,.uk-navbar-nav>li>a.uk-open{color:#666;outline:none}.uk-navbar-nav>li>a:active{color:#333}.uk-navbar-nav>li.uk-active>a{color:#333}.uk-navbar-item{color:#666}.uk-navbar-toggle{color:#999}.uk-navbar-toggle:hover,.uk-navbar-toggle:focus,.uk-navbar-toggle.uk-open{color:#666;outline:none;text-decoration:none}.uk-navbar-subtitle{font-size:.875rem}.uk-navbar-dropdown{display:none;position:absolute;z-index:1020;box-sizing:border-box;width:200px;padding:25px;background:#fff;color:#666;box-shadow:0 5px 12px rgba(0,0,0,0.15)}.uk-navbar-dropdown.uk-open{display:block}[class*='uk-navbar-dropdown-top']{margin-top:-15px}[class*='uk-navbar-dropdown-bottom']{margin-top:15px}[class*='uk-navbar-dropdown-left']{margin-left:-15px}[class*='uk-navbar-dropdown-right']{margin-left:15px}.uk-navbar-dropdown-grid{margin-left:-50px}.uk-navbar-dropdown-grid>*{padding-left:50px}.uk-navbar-dropdown-grid>.uk-grid-margin{margin-top:50px}.uk-navbar-dropdown-stack .uk-navbar-dropdown-grid>*{width:100% !important}.uk-navbar-dropdown-width-2:not(.uk-navbar-dropdown-stack){width:400px}.uk-navbar-dropdown-width-3:not(.uk-navbar-dropdown-stack){width:600px}.uk-navbar-dropdown-width-4:not(.uk-navbar-dropdown-stack){width:800px}.uk-navbar-dropdown-width-5:not(.uk-navbar-dropdown-stack){width:1000px}.uk-navbar-dropdown-dropbar{margin-top:0;margin-bottom:0;box-shadow:none}.uk-navbar-dropdown-nav{font-size:.875rem}.uk-navbar-dropdown-nav>li>a{color:#999}.uk-navbar-dropdown-nav>li>a:hover,.uk-navbar-dropdown-nav>li>a:focus{color:#666}.uk-navbar-dropdown-nav>li.uk-active>a{color:#333}.uk-navbar-dropdown-nav .uk-nav-header{color:#333}.uk-navbar-dropdown-nav .uk-nav-divider{border-top:1px solid #E5E5E5}.uk-navbar-dropdown-nav .uk-nav-sub a{color:#999}.uk-navbar-dropdown-nav .uk-nav-sub a:hover,.uk-navbar-dropdown-nav .uk-nav-sub a:focus{color:#666}.uk-navbar-dropbar{background:#fff}.uk-navbar-dropbar-slide{position:absolute;z-index:980;left:0;right:0;box-shadow:0 5px 7px rgba(0,0,0,0.05)}.uk-navbar-container>.uk-container .uk-navbar-left{margin-left:-15px;margin-right:-15px}.uk-navbar-container>.uk-container .uk-navbar-right{margin-right:-15px}.uk-navbar-dropdown-grid>*{position:relative}.uk-navbar-dropdown-grid>:not(.uk-first-column)::before{content:"";position:absolute;top:0;bottom:0;left:25px;border-left:1px solid #E5E5E5}.uk-navbar-dropdown-grid.uk-grid-stack>.uk-grid-margin::before{content:"";position:absolute;top:-25px;left:50px;right:0;border-top:1px solid #E5E5E5}.uk-subnav{display:flex;flex-wrap:wrap;margin-left:-20px;padding:0;list-style:none}.uk-subnav>*{flex:none;padding-left:20px;position:relative}.uk-subnav>*>:first-child{display:block;color:#999;font-size:.875rem;text-transform:uppercase;transition:0.1s ease-in-out;transition-property:color, background-color}.uk-subnav>*>a:hover,.uk-subnav>*>a:focus{color:#666;text-decoration:none;outline:none}.uk-subnav>.uk-active>a{color:#333}.uk-subnav-divider>*{display:flex;align-items:center}.uk-subnav-divider>:nth-child(n+2):not(.uk-first-column)::before{content:"";height:1.5em;margin-left:0px;margin-right:20px;border-left:1px solid #E5E5E5}.uk-subnav-pill>*>:first-child{padding:5px 10px;background:rgba(0,0,0,0);color:#999}.uk-subnav-pill>*>a:hover,.uk-subnav-pill>*>a:focus{background-color:#f8f8f8;color:#666}.uk-subnav-pill>*>a:active{background-color:#f8f8f8;color:#666}.uk-subnav-pill>.uk-active>a{background-color:#7289DA;color:#fff}.uk-subnav>.uk-disabled>a{color:#999}.uk-breadcrumb{display:flex;flex-wrap:wrap;padding:0;list-style:none}.uk-breadcrumb>*{flex:none}.uk-breadcrumb>*>*{display:inline-block;font-size:.875rem;color:#999}.uk-breadcrumb>*>:hover,.uk-breadcrumb>*>:focus{color:#666;text-decoration:none}.uk-breadcrumb>:last-child>*{color:#666}.uk-breadcrumb>:nth-child(n+2):not(.uk-first-column)::before{content:"/";display:inline-block;margin:0 20px;color:#999}.uk-pagination{display:flex;flex-wrap:wrap;margin-left:-20px;padding:0;list-style:none}.uk-pagination>*{flex:none;padding-left:20px;position:relative}.uk-pagination>*>*{display:block;color:#999;transition:color 0.1s ease-in-out}.uk-pagination>*>:hover,.uk-pagination>*>:focus{color:#666;text-decoration:none}.uk-pagination>.uk-active>*{color:#666}.uk-pagination>.uk-disabled>*{color:#999}.uk-tab{display:flex;flex-wrap:wrap;margin-left:-20px;padding:0;list-style:none;position:relative}.uk-tab::before{content:"";position:absolute;bottom:0;left:20px;right:0;border-bottom:1px solid #E5E5E5}.uk-tab>*{flex:none;padding-left:20px;position:relative}.uk-tab>*>a{display:block;text-align:center;padding:5px 10px;color:#999;border-bottom:1px solid transparent;font-size:.875rem;text-transform:uppercase;transition:color 0.1s ease-in-out}.uk-tab>*>a:hover,.uk-tab>*>a:focus{color:#666;text-decoration:none}.uk-tab>.uk-active>a{color:#333;border-color:#7289DA}.uk-tab>.uk-disabled>a{color:#999}.uk-tab-bottom::before{top:0;bottom:auto}.uk-tab-bottom>*>a{border-top:1px solid transparent;border-bottom:none}.uk-tab-left,.uk-tab-right{flex-direction:column;margin-left:0}.uk-tab-left>*,.uk-tab-right>*{padding-left:0}.uk-tab-left::before{top:0;bottom:0;left:auto;right:0;border-left:1px solid #E5E5E5;border-bottom:none}.uk-tab-right::before{top:0;bottom:0;left:0;right:auto;border-left:1px solid #E5E5E5;border-bottom:none}.uk-tab-left>*>a{text-align:left;border-right:1px solid transparent;border-bottom:none}.uk-tab-right>*>a{text-align:left;border-left:1px solid transparent;border-bottom:none}.uk-tab .uk-dropdown{margin-left:30px}.uk-slidenav{padding:5px 10px;color:rgba(102,102,102,0.5);transition:color 0.1s ease-in-out}.uk-slidenav:hover,.uk-slidenav:focus{color:rgba(102,102,102,0.9);outline:none}.uk-slidenav:active{color:rgba(102,102,102,0.5)}.uk-slidenav-large{padding:10px 10px}.uk-slidenav-container{display:flex}.uk-dotnav{display:flex;flex-wrap:wrap;margin:0;padding:0;list-style:none;margin-left:-12px}.uk-dotnav>*{flex:none;padding-left:12px}.uk-dotnav>*>*{display:block;box-sizing:border-box;width:10px;height:10px;border-radius:50%;background:rgba(0,0,0,0);text-indent:100%;overflow:hidden;white-space:nowrap;border:1px solid rgba(102,102,102,0.4);transition:0.2s ease-in-out;transition-property:background-color, border-color}.uk-dotnav>*>:hover,.uk-dotnav>*>:focus{background-color:rgba(102,102,102,0.6);outline:none;border-color:rgba(0,0,0,0)}.uk-dotnav>*>:active{background-color:rgba(102,102,102,0.2);border-color:rgba(0,0,0,0)}.uk-dotnav>.uk-active>*{background-color:rgba(102,102,102,0.6);border-color:rgba(0,0,0,0)}.uk-dotnav-vertical{flex-direction:column;margin-left:0;margin-top:-12px}.uk-dotnav-vertical>*{padding-left:0;padding-top:12px}.uk-thumbnav{display:flex;flex-wrap:wrap;margin:0;padding:0;list-style:none;margin-left:-15px}.uk-thumbnav>*{flex:none;padding-left:15px}.uk-thumbnav>*>*{display:inline-block;position:relative}.uk-thumbnav>*>*::after{content:"";position:absolute;top:0;bottom:0;left:0;right:0;background:rgba(255,255,255,0.4);transition:background-color 0.1s ease-in-out}.uk-thumbnav>*>:hover,.uk-thumbnav>*>:focus{outline:none}.uk-thumbnav>*>:hover::after,.uk-thumbnav>*>:focus::after{background-color:rgba(0,0,0,0)}.uk-thumbnav>.uk-active>*::after{background-color:rgba(0,0,0,0)}.uk-thumbnav-vertical{flex-direction:column;margin-left:0;margin-top:-15px}.uk-thumbnav-vertical>*{padding-left:0;padding-top:15px}.uk-accordion{padding:0;list-style:none}.uk-accordion>:nth-child(n+2){margin-top:20px}.uk-accordion-title{display:block;font-size:1.25rem;line-height:1.4;color:#333;overflow:hidden}.uk-accordion-title::after{content:"";width:1.4em;height:1.4em;float:right;background-image:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D%2213%22%20height%3D%2213%22%20viewBox%3D%220%200%2013%2013%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%20%20%20%20%3Crect%20fill%3D%22%23666%22%20width%3D%2213%22%20height%3D%221%22%20x%3D%220%22%20y%3D%226%22%20%2F%3E%0A%20%20%20%20%3Crect%20fill%3D%22%23666%22%20width%3D%221%22%20height%3D%2213%22%20x%3D%226%22%20y%3D%220%22%20%2F%3E%0A%3C%2Fsvg%3E");background-repeat:no-repeat;background-position:50% 50%}.uk-open>.uk-accordion-title::after{background-image:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D%2213%22%20height%3D%2213%22%20viewBox%3D%220%200%2013%2013%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%20%20%20%20%3Crect%20fill%3D%22%23666%22%20width%3D%2213%22%20height%3D%221%22%20x%3D%220%22%20y%3D%226%22%20%2F%3E%0A%3C%2Fsvg%3E")}.uk-accordion-title:hover,.uk-accordion-title:focus{color:#666;text-decoration:none;outline:none}.uk-accordion-content{margin-top:20px}.uk-accordion-content::before,.uk-accordion-content::after{content:"";display:table}.uk-accordion-content::after{clear:both}.uk-accordion-content>:last-child{margin-bottom:0}.uk-drop{display:none;position:absolute;z-index:1020;box-sizing:border-box;width:300px}.uk-drop.uk-open{display:block}[class*='uk-drop-top']{margin-top:-20px}[class*='uk-drop-bottom']{margin-top:20px}[class*='uk-drop-left']{margin-left:-20px}[class*='uk-drop-right']{margin-left:20px}.uk-drop-stack .uk-drop-grid>*{width:100% !important}.uk-dropdown{display:none;position:absolute;z-index:1020;box-sizing:border-box;min-width:200px;padding:25px;background:#fff;color:#666;box-shadow:0 5px 12px rgba(0,0,0,0.15)}.uk-dropdown.uk-open{display:block}.uk-dropdown-nav{white-space:nowrap;font-size:.875rem}.uk-dropdown-nav>li>a{color:#999}.uk-dropdown-nav>li>a:hover,.uk-dropdown-nav>li>a:focus,.uk-dropdown-nav>li.uk-active>a{color:#666}.uk-dropdown-nav .uk-nav-header{color:#333}.uk-dropdown-nav .uk-nav-divider{border-top:1px solid #E5E5E5}.uk-dropdown-nav .uk-nav-sub a{color:#999}.uk-dropdown-nav .uk-nav-sub a:hover,.uk-dropdown-nav .uk-nav-sub a:focus{color:#666}[class*='uk-dropdown-top']{margin-top:-10px}[class*='uk-dropdown-bottom']{margin-top:10px}[class*='uk-dropdown-left']{margin-left:-10px}[class*='uk-dropdown-right']{margin-left:10px}.uk-dropdown-stack .uk-dropdown-grid>*{width:100% !important}.uk-modal{display:none;position:fixed;top:0;right:0;bottom:0;left:0;z-index:1010;overflow-y:auto;-webkit-overflow-scrolling:touch;padding:15px 15px;background:rgba(0,0,0,0.6);opacity:0;transition:opacity 0.15s linear}@media (min-width: 640px){.uk-modal{padding:50px 30px}}@media (min-width: 960px){.uk-modal{padding-left:40px;padding-right:40px}}.uk-modal.uk-open{opacity:1}.uk-modal-page{overflow:hidden}.uk-modal-dialog{position:relative;box-sizing:border-box;margin:0 auto;width:600px;max-width:calc(100% - 0.01px) !important;background:#fff;opacity:0;transform:translateY(-100px);transition:0.3s linear;transition-property:opacity, transform}.uk-open>.uk-modal-dialog{opacity:1;transform:translateY(0)}.uk-modal-container .uk-modal-dialog{width:1200px}.uk-modal-full{padding:0;background:none}.uk-modal-full .uk-modal-dialog{margin:0;width:100%;max-width:100%;transform:translateY(0)}.uk-modal-body{padding:30px 30px}.uk-modal-header{padding:15px 30px;background:#fff;border-bottom:1px solid #E5E5E5}.uk-modal-footer{padding:15px 30px;background:#fff;border-top:1px solid #E5E5E5}.uk-modal-body::before,.uk-modal-body::after,.uk-modal-header::before,.uk-modal-header::after,.uk-modal-footer::before,.uk-modal-footer::after{content:"";display:table}.uk-modal-body::after,.uk-modal-header::after,.uk-modal-footer::after{clear:both}.uk-modal-body>:last-child,.uk-modal-header>:last-child,.uk-modal-footer>:last-child{margin-bottom:0}.uk-modal-title{font-size:2rem;line-height:1.3}[class*='uk-modal-close-']{position:absolute;z-index:1010;top:10px;right:10px;padding:5px}[class*='uk-modal-close-']:first-child+*{margin-top:0}.uk-modal-close-outside{top:0;right:-5px;transform:translate(0, -100%);color:#fff}.uk-modal-close-outside:hover{color:#fff}@media (min-width: 960px){.uk-modal-close-outside{right:0;transform:translate(100%, -100%)}}.uk-modal-close-full{top:0;right:0;padding:20px;background:#fff}.uk-lightbox{display:none;position:fixed;top:0;right:0;bottom:0;left:0;z-index:1010;background:#000;opacity:0;transition:opacity 0.15s linear}.uk-lightbox.uk-open{display:block;opacity:1}.uk-lightbox-page{overflow:hidden}.uk-lightbox-items>*{position:absolute;top:0;right:0;bottom:0;left:0;display:none;justify-content:center;align-items:center;color:rgba(255,255,255,0.7);will-change:transform, opacity}.uk-lightbox-items>*>*{max-width:100vw;max-height:100vh}.uk-lightbox-items>*>:not(iframe){width:auto;height:auto}.uk-lightbox-items>.uk-active{display:flex}.uk-lightbox-toolbar{padding:10px 10px;background:rgba(0,0,0,0.3);color:rgba(255,255,255,0.7)}.uk-lightbox-toolbar *{color:rgba(255,255,255,0.7)}.uk-lightbox-toolbar-icon{padding:5px;color:rgba(255,255,255,0.7)}.uk-lightbox-toolbar-icon:hover{color:#fff}.uk-lightbox-button{box-sizing:border-box;width:50px;height:50px;background:rgba(0,0,0,0.3);color:rgba(255,255,255,0.7);display:inline-flex;justify-content:center;align-items:center}.uk-lightbox-button:hover{color:#fff}.uk-lightbox-iframe{width:80%;height:80%}.uk-slideshow{-webkit-tap-highlight-color:transparent}.uk-slideshow-items{position:relative;z-index:0;margin:0;padding:0;list-style:none;overflow:hidden;-webkit-touch-callout:none}.uk-slideshow-items>*{position:absolute;top:0;left:0;right:0;bottom:0;overflow:hidden;will-change:transform, opacity;touch-action:pan-y}.uk-slideshow-items>:not(.uk-active){display:none}.uk-slider{-webkit-tap-highlight-color:transparent}.uk-slider-container{overflow:hidden}.uk-slider-items{will-change:transform;position:relative}.uk-slider-items:not(.uk-grid){display:flex;margin:0;padding:0;list-style:none;-webkit-touch-callout:none}.uk-slider-items.uk-grid{flex-wrap:nowrap}.uk-slider-items>*{flex:none;position:relative;touch-action:pan-y}.uk-sticky-fixed{z-index:980;box-sizing:border-box;margin:0 !important;-webkit-backface-visibility:hidden;backface-visibility:hidden}.uk-sticky[class*='uk-animation-']{animation-duration:.2s}.uk-sticky.uk-animation-reverse{animation-duration:.2s}.uk-offcanvas{display:none;position:fixed;top:0;bottom:0;left:0;z-index:1000}.uk-offcanvas-flip .uk-offcanvas{right:0;left:auto}.uk-offcanvas-bar{position:absolute;top:0;bottom:0;left:0;box-sizing:border-box;width:270px;padding:20px 20px;background:#222;overflow-y:auto;-webkit-overflow-scrolling:touch;transform:translateX(-100%)}@media (min-width: 960px){.uk-offcanvas-bar{width:350px;padding:40px 40px}}.uk-offcanvas-flip .uk-offcanvas-bar{left:auto;right:0;transform:translateX(100%)}.uk-open>.uk-offcanvas-bar{transform:translateX(0)}.uk-offcanvas-bar-animation{transition:transform 0.3s ease-out}.uk-offcanvas-reveal{position:absolute;top:0;bottom:0;left:0;width:0;overflow:hidden;transition:width 0.3s ease-out}.uk-offcanvas-reveal .uk-offcanvas-bar{transform:translateX(0)}.uk-open>.uk-offcanvas-reveal{width:270px}@media (min-width: 960px){.uk-open>.uk-offcanvas-reveal{width:350px}}.uk-offcanvas-flip .uk-offcanvas-reveal{right:0;left:auto}.uk-offcanvas-close{position:absolute;z-index:1000;top:20px;right:20px;padding:5px}.uk-offcanvas-overlay{width:100vw;touch-action:none}.uk-offcanvas-overlay::before{content:"";position:absolute;top:0;bottom:0;left:0;right:0;background:rgba(0,0,0,0.1);opacity:0;transition:opacity 0.15s linear}.uk-offcanvas-overlay.uk-open::before{opacity:1}.uk-offcanvas-page,.uk-offcanvas-container{overflow-x:hidden}.uk-offcanvas-container-overlay{overflow:hidden}.uk-offcanvas-container .uk-offcanvas-content{position:relative;left:0;transition:left 0.3s ease-out;-webkit-overflow-scrolling:touch}.uk-offcanvas-overlay .uk-offcanvas-content{overflow-y:hidden}:not(.uk-offcanvas-flip)>.uk-offcanvas-content-animation{left:270px}.uk-offcanvas-flip>.uk-offcanvas-content-animation{left:-270px}@media (min-width: 960px){:not(.uk-offcanvas-flip)>.uk-offcanvas-content-animation{left:350px}.uk-offcanvas-flip>.uk-offcanvas-content-animation{left:-350px}}.uk-switcher{margin:0;padding:0;list-style:none}.uk-switcher>:not(.uk-active){display:none}.uk-switcher>*>:last-child{margin-bottom:0}.uk-leader{overflow:hidden}.uk-leader-fill::after{display:inline-block;margin-left:15px;width:0;content:attr(data-fill);white-space:nowrap}.uk-leader-fill.uk-leader-hide::after{display:none}.var-leader-fill::before{content:"."}.uk-iconnav{display:flex;flex-wrap:wrap;margin:0;padding:0;list-style:none;margin-left:-10px}.uk-iconnav>*{flex:none;padding-left:10px}.uk-iconnav>*>a{display:block;color:#999}.uk-iconnav>*>a:hover,.uk-iconnav>*>a:focus{color:#666;outline:none}.uk-iconnav>.uk-active>a{color:#666}.uk-iconnav-vertical{flex-direction:column;margin-left:0;margin-top:-10px}.uk-iconnav-vertical>*{padding-left:0;padding-top:10px}.uk-notification{position:fixed;top:10px;left:10px;z-index:1040;box-sizing:border-box;width:350px}.uk-notification-top-right,.uk-notification-bottom-right{left:auto;right:10px}.uk-notification-top-center,.uk-notification-bottom-center{left:50%;margin-left:-175px}.uk-notification-bottom-left,.uk-notification-bottom-right,.uk-notification-bottom-center{top:auto;bottom:10px}@media (max-width: 639px){.uk-notification{left:10px;right:10px;width:auto;margin:0}}.uk-notification-message{position:relative;margin-bottom:10px;padding:15px;background:#f8f8f8;color:#666;font-size:1.25rem;line-height:1.4;cursor:pointer}.uk-notification-close{display:none;position:absolute;top:20px;right:15px}.uk-notification-message:hover .uk-notification-close{display:block}.uk-notification-message-primary{color:#7289DA}.uk-notification-message-success{color:#32d296}.uk-notification-message-warning{color:#faa05a}.uk-notification-message-danger{color:#f0506e}.uk-tooltip{display:none;position:absolute;z-index:1030;box-sizing:border-box;max-width:200px;padding:3px 6px;background:#666;border-radius:2px;color:#fff;font-size:12px}.uk-tooltip.uk-active{display:block}[class*='uk-tooltip-top']{margin-top:-10px}[class*='uk-tooltip-bottom']{margin-top:10px}[class*='uk-tooltip-left']{margin-left:-10px}[class*='uk-tooltip-right']{margin-left:10px}.uk-placeholder{margin-bottom:20px;padding:30px 30px;background:rgba(0,0,0,0);border:1px dashed #E5E5E5}*+.uk-placeholder{margin-top:20px}.uk-placeholder>:last-child{margin-bottom:0}.uk-progress{vertical-align:baseline;-webkit-appearance:none;-moz-appearance:none;display:block;width:100%;border:0;background-color:#f8f8f8;margin-bottom:20px;height:15px;border-radius:500px;overflow:hidden}*+.uk-progress{margin-top:20px}.uk-progress:indeterminate{color:transparent}.uk-progress::-webkit-progress-bar{background-color:#f8f8f8;border-radius:500px;overflow:hidden}.uk-progress:indeterminate::-moz-progress-bar{width:0}.uk-progress::-webkit-progress-value{background-color:#7289DA;transition:width 0.6s ease}.uk-progress::-moz-progress-bar{background-color:#7289DA}.uk-progress::-ms-fill{background-color:#7289DA;transition:width 0.6s ease;border:0}.uk-sortable{position:relative}.uk-sortable>*{touch-action:none}.uk-sortable svg{pointer-events:none}.uk-sortable>:last-child{margin-bottom:0}.uk-sortable-drag{position:absolute !important;z-index:1050 !important;pointer-events:none}.uk-sortable-placeholder{opacity:0}.uk-sortable-empty{min-height:50px}.uk-sortable-handle:hover{cursor:move}.uk-countdown-number,.uk-countdown-separator{line-height:70px}.uk-countdown-number{font-size:2rem}@media (min-width: 640px){.uk-countdown-number{font-size:4rem}}@media (min-width: 960px){.uk-countdown-number{font-size:6rem}}.uk-countdown-separator{font-size:1rem}@media (min-width: 640px){.uk-countdown-separator{font-size:2rem}}@media (min-width: 960px){.uk-countdown-separator{font-size:3rem}}[class*='uk-animation-']{animation-duration:.5s;animation-timing-function:ease-out;animation-fill-mode:both}.uk-animation-reverse{animation-direction:reverse;animation-timing-function:ease-in}.uk-animation-fade{animation-name:uk-fade;animation-duration:.8s;animation-timing-function:linear}.uk-animation-scale-up{animation-name:uk-fade-scale-02}.uk-animation-scale-down{animation-name:uk-fade-scale-18}.uk-animation-slide-top{animation-name:uk-fade-top}.uk-animation-slide-bottom{animation-name:uk-fade-bottom}.uk-animation-slide-left{animation-name:uk-fade-left}.uk-animation-slide-right{animation-name:uk-fade-right}.uk-animation-slide-top-small{animation-name:uk-fade-top-small}.uk-animation-slide-bottom-small{animation-name:uk-fade-bottom-small}.uk-animation-slide-left-small{animation-name:uk-fade-left-small}.uk-animation-slide-right-small{animation-name:uk-fade-right-small}.uk-animation-slide-top-medium{animation-name:uk-fade-top-medium}.uk-animation-slide-bottom-medium{animation-name:uk-fade-bottom-medium}.uk-animation-slide-left-medium{animation-name:uk-fade-left-medium}.uk-animation-slide-right-medium{animation-name:uk-fade-right-medium}.uk-animation-kenburns{animation-name:uk-scale-kenburns;animation-duration:15s}.uk-animation-shake{animation-name:uk-shake}.uk-animation-fast{animation-duration:.1s}.uk-animation-toggle:not(:hover):not(.uk-hover) [class*='uk-animation-']{animation-name:none}@keyframes uk-fade{0%{opacity:0}100%{opacity:1}}@keyframes uk-fade-top{0%{opacity:0;transform:translateY(-100%)}100%{opacity:1;transform:translateY(0)}}@keyframes uk-fade-bottom{0%{opacity:0;transform:translateY(100%)}100%{opacity:1;transform:translateY(0)}}@keyframes uk-fade-left{0%{opacity:0;transform:translateX(-100%)}100%{opacity:1;transform:translateX(0)}}@keyframes uk-fade-right{0%{opacity:0;transform:translateX(100%)}100%{opacity:1;transform:translateX(0)}}@keyframes uk-fade-top-small{0%{opacity:0;transform:translateY(-10px)}100%{opacity:1;transform:translateY(0)}}@keyframes uk-fade-bottom-small{0%{opacity:0;transform:translateY(10px)}100%{opacity:1;transform:translateY(0)}}@keyframes uk-fade-left-small{0%{opacity:0;transform:translateX(-10px)}100%{opacity:1;transform:translateX(0)}}@keyframes uk-fade-right-small{0%{opacity:0;transform:translateX(10px)}100%{opacity:1;transform:translateX(0)}}@keyframes uk-fade-top-medium{0%{opacity:0;transform:translateY(-50px)}100%{opacity:1;transform:translateY(0)}}@keyframes uk-fade-bottom-medium{0%{opacity:0;transform:translateY(50px)}100%{opacity:1;transform:translateY(0)}}@keyframes uk-fade-left-medium{0%{opacity:0;transform:translateX(-50px)}100%{opacity:1;transform:translateX(0)}}@keyframes uk-fade-right-medium{0%{opacity:0;transform:translateX(50px)}100%{opacity:1;transform:translateX(0)}}@keyframes uk-fade-scale-02{0%{opacity:0;transform:scale(0.2)}100%{opacity:1;transform:scale(1)}}@keyframes uk-fade-scale-18{0%{opacity:0;transform:scale(1.8)}100%{opacity:1;transform:scale(1)}}@keyframes uk-scale-kenburns{0%{transform:scale(1)}100%{transform:scale(1.2)}}@keyframes uk-shake{0%,100%{transform:translateX(0)}10%{transform:translateX(-9px)}20%{transform:translateX(8px)}30%{transform:translateX(-7px)}40%{transform:translateX(6px)}50%{transform:translateX(-5px)}60%{transform:translateX(4px)}70%{transform:translateX(-3px)}80%{transform:translateX(2px)}90%{transform:translateX(-1px)}}[class*='uk-child-width']>*{box-sizing:border-box;width:100%}.uk-child-width-1-2>*{width:50%}.uk-child-width-1-3>*{width:calc(100% * 1 / 3.001)}.uk-child-width-1-4>*{width:25%}.uk-child-width-1-5>*{width:20%}.uk-child-width-1-6>*{width:calc(100% * 1 / 6.001)}.uk-child-width-auto>*{width:auto}.uk-child-width-expand>*{width:1px}.uk-child-width-expand>:not([class*='uk-width']){flex:1;min-width:0;flex-basis:1px}@media (min-width: 640px){.uk-child-width-1-1\@s>*{width:100%}.uk-child-width-1-2\@s>*{width:50%}.uk-child-width-1-3\@s>*{width:calc(100% * 1 / 3.001)}.uk-child-width-1-4\@s>*{width:25%}.uk-child-width-1-5\@s>*{width:20%}.uk-child-width-1-6\@s>*{width:calc(100% * 1 / 6.001)}.uk-child-width-auto\@s>*{width:auto}.uk-child-width-expand\@s>*{width:1px}.uk-child-width-expand\@s>:not([class*='uk-width']){flex:1;min-width:0;flex-basis:1px}}@media (min-width: 960px){.uk-child-width-1-1\@m>*{width:100%}.uk-child-width-1-2\@m>*{width:50%}.uk-child-width-1-3\@m>*{width:calc(100% * 1 / 3.001)}.uk-child-width-1-4\@m>*{width:25%}.uk-child-width-1-5\@m>*{width:20%}.uk-child-width-1-6\@m>*{width:calc(100% * 1 / 6.001)}.uk-child-width-auto\@m>*{width:auto}.uk-child-width-expand\@m>*{width:1px}.uk-child-width-expand\@m>:not([class*='uk-width']){flex:1;min-width:0;flex-basis:1px}}@media (min-width: 1200px){.uk-child-width-1-1\@l>*{width:100%}.uk-child-width-1-2\@l>*{width:50%}.uk-child-width-1-3\@l>*{width:calc(100% * 1 / 3.001)}.uk-child-width-1-4\@l>*{width:25%}.uk-child-width-1-5\@l>*{width:20%}.uk-child-width-1-6\@l>*{width:calc(100% * 1 / 6.001)}.uk-child-width-auto\@l>*{width:auto}.uk-child-width-expand\@l>*{width:1px}.uk-child-width-expand\@l>:not([class*='uk-width']){flex:1;min-width:0;flex-basis:1px}}@media (min-width: 1600px){.uk-child-width-1-1\@xl>*{width:100%}.uk-child-width-1-2\@xl>*{width:50%}.uk-child-width-1-3\@xl>*{width:calc(100% * 1 / 3.001)}.uk-child-width-1-4\@xl>*{width:25%}.uk-child-width-1-5\@xl>*{width:20%}.uk-child-width-1-6\@xl>*{width:calc(100% * 1 / 6.001)}.uk-child-width-auto\@xl>*{width:auto}.uk-child-width-expand\@xl>*{width:1px}.uk-child-width-expand\@xl>:not([class*='uk-width']){flex:1;min-width:0;flex-basis:1px}}[class*='uk-width']{box-sizing:border-box;width:100%;max-width:100%}.uk-width-1-2{width:50%}.uk-width-1-3{width:calc(100% * 1 / 3.001)}.uk-width-2-3{width:calc(100% * 2 / 3.001)}.uk-width-1-4{width:25%}.uk-width-3-4{width:75%}.uk-width-1-5{width:20%}.uk-width-2-5{width:40%}.uk-width-3-5{width:60%}.uk-width-4-5{width:80%}.uk-width-1-6{width:calc(100% * 1 / 6.001)}.uk-width-5-6{width:calc(100% * 5 / 6.001)}.uk-width-small{width:150px}.uk-width-medium{width:300px}.uk-width-large{width:450px}.uk-width-xlarge{width:600px}.uk-width-xxlarge{width:750px}.uk-width-auto{width:auto}.uk-width-expand{width:1px;flex:1;min-width:0;flex-basis:1px}@media (min-width: 640px){.uk-width-1-1\@s{width:100%}.uk-width-1-2\@s{width:50%}.uk-width-1-3\@s{width:calc(100% * 1 / 3.001)}.uk-width-2-3\@s{width:calc(100% * 2 / 3.001)}.uk-width-1-4\@s{width:25%}.uk-width-3-4\@s{width:75%}.uk-width-1-5\@s{width:20%}.uk-width-2-5\@s{width:40%}.uk-width-3-5\@s{width:60%}.uk-width-4-5\@s{width:80%}.uk-width-1-6\@s{width:calc(100% * 1 / 6.001)}.uk-width-5-6\@s{width:calc(100% * 5 / 6.001)}.uk-width-small\@s{width:150px}.uk-width-medium\@s{width:300px}.uk-width-large\@s{width:450px}.uk-width-xlarge\@s{width:600px}.uk-width-xxlarge\@s{width:750px}.uk-width-auto\@s{width:auto}.uk-width-expand\@s{width:1px;flex:1;min-width:0;flex-basis:1px}}@media (min-width: 960px){.uk-width-1-1\@m{width:100%}.uk-width-1-2\@m{width:50%}.uk-width-1-3\@m{width:calc(100% * 1 / 3.001)}.uk-width-2-3\@m{width:calc(100% * 2 / 3.001)}.uk-width-1-4\@m{width:25%}.uk-width-3-4\@m{width:75%}.uk-width-1-5\@m{width:20%}.uk-width-2-5\@m{width:40%}.uk-width-3-5\@m{width:60%}.uk-width-4-5\@m{width:80%}.uk-width-1-6\@m{width:calc(100% * 1 / 6.001)}.uk-width-5-6\@m{width:calc(100% * 5 / 6.001)}.uk-width-small\@m{width:150px}.uk-width-medium\@m{width:300px}.uk-width-large\@m{width:450px}.uk-width-xlarge\@m{width:600px}.uk-width-xxlarge\@m{width:750px}.uk-width-auto\@m{width:auto}.uk-width-expand\@m{width:1px;flex:1;min-width:0;flex-basis:1px}}@media (min-width: 1200px){.uk-width-1-1\@l{width:100%}.uk-width-1-2\@l{width:50%}.uk-width-1-3\@l{width:calc(100% * 1 / 3.001)}.uk-width-2-3\@l{width:calc(100% * 2 / 3.001)}.uk-width-1-4\@l{width:25%}.uk-width-3-4\@l{width:75%}.uk-width-1-5\@l{width:20%}.uk-width-2-5\@l{width:40%}.uk-width-3-5\@l{width:60%}.uk-width-4-5\@l{width:80%}.uk-width-1-6\@l{width:calc(100% * 1 / 6.001)}.uk-width-5-6\@l{width:calc(100% * 5 / 6.001)}.uk-width-small\@l{width:150px}.uk-width-medium\@l{width:300px}.uk-width-large\@l{width:450px}.uk-width-xlarge\@l{width:600px}.uk-width-xxlarge\@l{width:750px}.uk-width-auto\@l{width:auto}.uk-width-expand\@l{width:1px;flex:1;min-width:0;flex-basis:1px}}@media (min-width: 1600px){.uk-width-1-1\@xl{width:100%}.uk-width-1-2\@xl{width:50%}.uk-width-1-3\@xl{width:calc(100% * 1 / 3.001)}.uk-width-2-3\@xl{width:calc(100% * 2 / 3.001)}.uk-width-1-4\@xl{width:25%}.uk-width-3-4\@xl{width:75%}.uk-width-1-5\@xl{width:20%}.uk-width-2-5\@xl{width:40%}.uk-width-3-5\@xl{width:60%}.uk-width-4-5\@xl{width:80%}.uk-width-1-6\@xl{width:calc(100% * 1 / 6.001)}.uk-width-5-6\@xl{width:calc(100% * 5 / 6.001)}.uk-width-small\@xl{width:150px}.uk-width-medium\@xl{width:300px}.uk-width-large\@xl{width:450px}.uk-width-xlarge\@xl{width:600px}.uk-width-xxlarge\@xl{width:750px}.uk-width-auto\@xl{width:auto}.uk-width-expand\@xl{width:1px;flex:1;min-width:0;flex-basis:1px}}[class*='uk-height']{box-sizing:border-box}.uk-height-1-1{height:100%}.uk-height-viewport{min-height:100vh}.uk-height-small{height:150px}.uk-height-medium{height:300px}.uk-height-large{height:450px}.uk-height-max-small{max-height:150px}.uk-height-max-medium{max-height:300px}.uk-height-max-large{max-height:450px}.uk-text-lead{font-size:1.5rem;line-height:1.5;color:#333}.uk-text-meta{font-size:.875rem;line-height:1.4;color:#999}.uk-text-meta a{color:#999}.uk-text-meta a:hover{color:#666;text-decoration:none}.uk-text-small{font-size:.875rem;line-height:1.5}.uk-text-large{font-size:1.5rem;line-height:1.5}.uk-text-bold{font-weight:bolder}.uk-text-uppercase{text-transform:uppercase !important}.uk-text-capitalize{text-transform:capitalize !important}.uk-text-lowercase{text-transform:lowercase !important}.uk-text-muted{color:#999 !important}.uk-text-primary{color:#7289DA !important}.uk-text-success{color:#32d296 !important}.uk-text-warning{color:#faa05a !important}.uk-text-danger{color:#f0506e !important}.uk-text-background{-webkit-background-clip:text;-webkit-text-fill-color:transparent;display:inline-block;color:#7289DA !important}@supports (-webkit-background-clip: text){.uk-text-background{background-color:#7289DA}}.uk-text-left{text-align:left !important}.uk-text-right{text-align:right !important}.uk-text-center{text-align:center !important}.uk-text-justify{text-align:justify !important}@media (min-width: 640px){.uk-text-left\@s{text-align:left !important}.uk-text-right\@s{text-align:right !important}.uk-text-center\@s{text-align:center !important}}@media (min-width: 960px){.uk-text-left\@m{text-align:left !important}.uk-text-right\@m{text-align:right !important}.uk-text-center\@m{text-align:center !important}}@media (min-width: 1200px){.uk-text-left\@l{text-align:left !important}.uk-text-right\@l{text-align:right !important}.uk-text-center\@l{text-align:center !important}}@media (min-width: 1600px){.uk-text-left\@xl{text-align:left !important}.uk-text-right\@xl{text-align:right !important}.uk-text-center\@xl{text-align:center !important}}.uk-text-top{vertical-align:top !important}.uk-text-middle{vertical-align:middle !important}.uk-text-bottom{vertical-align:bottom !important}.uk-text-baseline{vertical-align:baseline !important}.uk-text-nowrap{white-space:nowrap}.uk-text-truncate{max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}th.uk-text-truncate,td.uk-text-truncate{max-width:0}.uk-text-break{overflow-wrap:break-word;word-wrap:break-word}th.uk-text-break,td.uk-text-break{word-break:break-all}[class*='uk-column-']{column-gap:30px}@media (min-width: 1200px){[class*='uk-column-']{column-gap:40px}}[class*='uk-column-'] img{transform:translate3d(0, 0, 0)}.uk-column-divider{column-rule:1px solid #E5E5E5;column-gap:60px}@media (min-width: 1200px){.uk-column-divider{column-gap:80px}}.uk-column-1-2{column-count:2}.uk-column-1-3{column-count:3}.uk-column-1-4{column-count:4}.uk-column-1-5{column-count:5}.uk-column-1-6{column-count:6}@media (min-width: 640px){.uk-column-1-2\@s{column-count:2}.uk-column-1-3\@s{column-count:3}.uk-column-1-4\@s{column-count:4}.uk-column-1-5\@s{column-count:5}.uk-column-1-6\@s{column-count:6}}@media (min-width: 960px){.uk-column-1-2\@m{column-count:2}.uk-column-1-3\@m{column-count:3}.uk-column-1-4\@m{column-count:4}.uk-column-1-5\@m{column-count:5}.uk-column-1-6\@m{column-count:6}}@media (min-width: 1200px){.uk-column-1-2\@l{column-count:2}.uk-column-1-3\@l{column-count:3}.uk-column-1-4\@l{column-count:4}.uk-column-1-5\@l{column-count:5}.uk-column-1-6\@l{column-count:6}}@media (min-width: 1600px){.uk-column-1-2\@xl{column-count:2}.uk-column-1-3\@xl{column-count:3}.uk-column-1-4\@xl{column-count:4}.uk-column-1-5\@xl{column-count:5}.uk-column-1-6\@xl{column-count:6}}.uk-column-span{column-span:all}.uk-cover{max-width:none;position:absolute;left:50%;top:50%;transform:translate(-50%, -50%)}iframe.uk-cover{pointer-events:none}.uk-cover-container{overflow:hidden;position:relative}.uk-background-default{background-color:#fff}.uk-background-muted{background-color:#f8f8f8}.uk-background-primary{background-color:#7289DA}.uk-background-secondary{background-color:#222}.uk-background-cover,.uk-background-contain{background-position:50% 50%;background-repeat:no-repeat}.uk-background-cover{background-size:cover}.uk-background-contain{background-size:contain}.uk-background-top-left{background-position:0 0}.uk-background-top-center{background-position:50% 0}.uk-background-top-right{background-position:100% 0}.uk-background-center-left{background-position:0 50%}.uk-background-center-center{background-position:50% 50%}.uk-background-center-right{background-position:100% 50%}.uk-background-bottom-left{background-position:0 100%}.uk-background-bottom-center{background-position:50% 100%}.uk-background-bottom-right{background-position:100% 100%}.uk-background-norepeat{background-repeat:no-repeat}.uk-background-fixed{background-attachment:fixed}@media (pointer: coarse){.uk-background-fixed{background-attachment:scroll}}@media (max-width: 639px){.uk-background-image\@s{background-image:none !important}}@media (max-width: 959px){.uk-background-image\@m{background-image:none !important}}@media (max-width: 1199px){.uk-background-image\@l{background-image:none !important}}@media (max-width: 1599px){.uk-background-image\@xl{background-image:none !important}}.uk-background-blend-multiply{background-blend-mode:multiply}.uk-background-blend-screen{background-blend-mode:screen}.uk-background-blend-overlay{background-blend-mode:overlay}.uk-background-blend-darken{background-blend-mode:darken}.uk-background-blend-lighten{background-blend-mode:lighten}.uk-background-blend-color-dodge{background-blend-mode:color-dodge}.uk-background-blend-color-burn{background-blend-mode:color-burn}.uk-background-blend-hard-light{background-blend-mode:hard-light}.uk-background-blend-soft-light{background-blend-mode:soft-light}.uk-background-blend-difference{background-blend-mode:difference}.uk-background-blend-exclusion{background-blend-mode:exclusion}.uk-background-blend-hue{background-blend-mode:hue}.uk-background-blend-saturation{background-blend-mode:saturation}.uk-background-blend-color{background-blend-mode:color}.uk-background-blend-luminosity{background-blend-mode:luminosity}[class*='uk-align']{display:block;margin-bottom:30px}*+[class*='uk-align']{margin-top:30px}.uk-align-center{margin-left:auto;margin-right:auto}.uk-align-left{margin-top:0;margin-right:30px;float:left}.uk-align-right{margin-top:0;margin-left:30px;float:right}@media (min-width: 640px){.uk-align-left\@s{margin-top:0;margin-right:30px;float:left}.uk-align-right\@s{margin-top:0;margin-left:30px;float:right}}@media (min-width: 960px){.uk-align-left\@m{margin-top:0;margin-right:30px;float:left}.uk-align-right\@m{margin-top:0;margin-left:30px;float:right}}@media (min-width: 1200px){.uk-align-left\@l{margin-top:0;float:left}.uk-align-right\@l{margin-top:0;float:right}.uk-align-left,.uk-align-left\@s,.uk-align-left\@m,.uk-align-left\@l{margin-right:40px}.uk-align-right,.uk-align-right\@s,.uk-align-right\@m,.uk-align-right\@l{margin-left:40px}}@media (min-width: 1600px){.uk-align-left\@xl{margin-top:0;margin-right:40px;float:left}.uk-align-right\@xl{margin-top:0;margin-left:40px;float:right}}.uk-svg,.uk-svg:not(.uk-preserve) [fill*='#']:not(.uk-preserve),.uk-svg:not(.uk-preserve) [FILL*='#']:not(.uk-preserve){fill:currentcolor}.uk-svg:not(.uk-preserve) [stroke*='#']:not(.uk-preserve),.uk-svg:not(.uk-preserve) [STROKE*='#']:not(.uk-preserve){stroke:currentcolor}.uk-svg{transform:translate(0, 0)}.uk-panel{position:relative;box-sizing:border-box}.uk-panel::before,.uk-panel::after{content:"";display:table}.uk-panel::after{clear:both}.uk-panel>:last-child{margin-bottom:0}.uk-panel-scrollable{height:170px;padding:10px;border:1px solid #E5E5E5;overflow:auto;-webkit-overflow-scrolling:touch;resize:both}.uk-clearfix::before{content:"";display:table-cell}.uk-clearfix::after{content:"";display:table;clear:both}.uk-float-left{float:left}.uk-float-right{float:right}[class*='uk-float-']{max-width:100%}.uk-overflow-hidden{overflow:hidden}.uk-overflow-auto{overflow:auto;-webkit-overflow-scrolling:touch}.uk-overflow-auto>:last-child{margin-bottom:0}.uk-resize{resize:both}.uk-resize-vertical{resize:vertical}.uk-display-block{display:block !important}.uk-display-inline{display:inline !important}.uk-display-inline-block{display:inline-block !important}[class*='uk-inline']{display:inline-block;position:relative;max-width:100%;vertical-align:middle;-webkit-backface-visibility:hidden}.uk-inline-clip{overflow:hidden}.uk-preserve-width,.uk-preserve-width audio,.uk-preserve-width canvas,.uk-preserve-width img,.uk-preserve-width svg,.uk-preserve-width video{max-width:none}.uk-responsive-width,.uk-responsive-height{box-sizing:border-box}.uk-responsive-width{max-width:100% !important;height:auto}.uk-responsive-height{max-height:100%;width:auto;max-width:none}.uk-border-circle{border-radius:50%}.uk-border-rounded{border-radius:5px}.uk-inline-clip[class*='uk-border-']{-webkit-transform:translateZ(0)}.uk-box-shadow-small{box-shadow:0 2px 8px rgba(0,0,0,0.08)}.uk-box-shadow-medium{box-shadow:0 5px 15px rgba(0,0,0,0.08)}.uk-box-shadow-large{box-shadow:0 14px 25px rgba(0,0,0,0.16)}.uk-box-shadow-xlarge{box-shadow:0 28px 50px rgba(0,0,0,0.16)}[class*='uk-box-shadow-hover']{transition:box-shadow .1s ease-in-out}.uk-box-shadow-hover-small:hover{box-shadow:0 2px 8px rgba(0,0,0,0.08)}.uk-box-shadow-hover-medium:hover{box-shadow:0 5px 15px rgba(0,0,0,0.08)}.uk-box-shadow-hover-large:hover{box-shadow:0 14px 25px rgba(0,0,0,0.16)}.uk-box-shadow-hover-xlarge:hover{box-shadow:0 28px 50px rgba(0,0,0,0.16)}@supports (filter: blur(0)){.uk-box-shadow-bottom{display:inline-block;position:relative;max-width:100%;vertical-align:middle}.uk-box-shadow-bottom::before{content:'';position:absolute;bottom:-30px;left:0;right:0;height:30px;border-radius:100%;background:#444;filter:blur(20px)}.uk-box-shadow-bottom>*{position:relative}}.uk-dropcap::first-letter,.uk-dropcap>p:first-of-type::first-letter{display:block;margin-right:10px;float:left;font-size:4.5em;line-height:1;margin-bottom:-2px}@-moz-document url-prefix(){.uk-dropcap::first-letter,.uk-dropcap>p:first-of-type::first-letter{margin-top:1.1%}}@supports (-ms-ime-align: auto){.uk-dropcap>p:first-of-type::first-letter{font-size:1em}}.uk-logo{font-size:1.5rem;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;color:#666;text-decoration:none}.uk-logo:hover,.uk-logo:focus{color:#666;outline:none;text-decoration:none}.uk-logo-inverse{display:none}.uk-disabled{pointer-events:none}.uk-drag,.uk-drag *{cursor:move}.uk-drag iframe{pointer-events:none}.uk-dragover{box-shadow:0 0 20px rgba(100,100,100,0.3)}.uk-blend-multiply{mix-blend-mode:multiply}.uk-blend-screen{mix-blend-mode:screen}.uk-blend-overlay{mix-blend-mode:overlay}.uk-blend-darken{mix-blend-mode:darken}.uk-blend-lighten{mix-blend-mode:lighten}.uk-blend-color-dodge{mix-blend-mode:color-dodge}.uk-blend-color-burn{mix-blend-mode:color-burn}.uk-blend-hard-light{mix-blend-mode:hard-light}.uk-blend-soft-light{mix-blend-mode:soft-light}.uk-blend-difference{mix-blend-mode:difference}.uk-blend-exclusion{mix-blend-mode:exclusion}.uk-blend-hue{mix-blend-mode:hue}.uk-blend-saturation{mix-blend-mode:saturation}.uk-blend-color{mix-blend-mode:color}.uk-blend-luminosity{mix-blend-mode:luminosity}.uk-transform-center{transform:translate(-50%, -50%)}.uk-transform-origin-top-left{transform-origin:0 0}.uk-transform-origin-top-center{transform-origin:50% 0}.uk-transform-origin-top-right{transform-origin:100% 0}.uk-transform-origin-center-left{transform-origin:0 50%}.uk-transform-origin-center-right{transform-origin:100% 50%}.uk-transform-origin-bottom-left{transform-origin:0 100%}.uk-transform-origin-bottom-center{transform-origin:50% 100%}.uk-transform-origin-bottom-right{transform-origin:100% 100%}.uk-flex{display:flex}.uk-flex-inline{display:inline-flex}.uk-flex::before,.uk-flex::after,.uk-flex-inline::before,.uk-flex-inline::after{display:none}.uk-flex-left{justify-content:flex-start}.uk-flex-center{justify-content:center}.uk-flex-right{justify-content:flex-end}.uk-flex-between{justify-content:space-between}.uk-flex-around{justify-content:space-around}@media (min-width: 640px){.uk-flex-left\@s{justify-content:flex-start}.uk-flex-center\@s{justify-content:center}.uk-flex-right\@s{justify-content:flex-end}.uk-flex-between\@s{justify-content:space-between}.uk-flex-around\@s{justify-content:space-around}}@media (min-width: 960px){.uk-flex-left\@m{justify-content:flex-start}.uk-flex-center\@m{justify-content:center}.uk-flex-right\@m{justify-content:flex-end}.uk-flex-between\@m{justify-content:space-between}.uk-flex-around\@m{justify-content:space-around}}@media (min-width: 1200px){.uk-flex-left\@l{justify-content:flex-start}.uk-flex-center\@l{justify-content:center}.uk-flex-right\@l{justify-content:flex-end}.uk-flex-between\@l{justify-content:space-between}.uk-flex-around\@l{justify-content:space-around}}@media (min-width: 1600px){.uk-flex-left\@xl{justify-content:flex-start}.uk-flex-center\@xl{justify-content:center}.uk-flex-right\@xl{justify-content:flex-end}.uk-flex-between\@xl{justify-content:space-between}.uk-flex-around\@xl{justify-content:space-around}}.uk-flex-stretch{align-items:stretch}.uk-flex-top{align-items:flex-start}.uk-flex-middle{align-items:center}.uk-flex-bottom{align-items:flex-end}.uk-flex-row{flex-direction:row}.uk-flex-row-reverse{flex-direction:row-reverse}.uk-flex-column{flex-direction:column}.uk-flex-column-reverse{flex-direction:column-reverse}.uk-flex-nowrap{flex-wrap:nowrap}.uk-flex-wrap{flex-wrap:wrap}.uk-flex-wrap-reverse{flex-wrap:wrap-reverse}.uk-flex-wrap-stretch{align-content:stretch}.uk-flex-wrap-top{align-content:flex-start}.uk-flex-wrap-middle{align-content:center}.uk-flex-wrap-bottom{align-content:flex-end}.uk-flex-wrap-between{align-content:space-between}.uk-flex-wrap-around{align-content:space-around}.uk-flex-first{order:-1}.uk-flex-last{order:99}@media (min-width: 640px){.uk-flex-first\@s{order:-1}.uk-flex-last\@s{order:99}}@media (min-width: 960px){.uk-flex-first\@m{order:-1}.uk-flex-last\@m{order:99}}@media (min-width: 1200px){.uk-flex-first\@l{order:-1}.uk-flex-last\@l{order:99}}@media (min-width: 1600px){.uk-flex-first\@xl{order:-1}.uk-flex-last\@xl{order:99}}.uk-flex-none{flex:none}.uk-flex-auto{flex:auto}.uk-flex-1{flex:1}.uk-margin{margin-bottom:20px}*+.uk-margin{margin-top:20px !important}.uk-margin-top{margin-top:20px !important}.uk-margin-bottom{margin-bottom:20px !important}.uk-margin-left{margin-left:20px !important}.uk-margin-right{margin-right:20px !important}.uk-margin-small{margin-bottom:10px}*+.uk-margin-small{margin-top:10px !important}.uk-margin-small-top{margin-top:10px !important}.uk-margin-small-bottom{margin-bottom:10px !important}.uk-margin-small-left{margin-left:10px !important}.uk-margin-small-right{margin-right:10px !important}.uk-margin-medium{margin-bottom:40px}*+.uk-margin-medium{margin-top:40px !important}.uk-margin-medium-top{margin-top:40px !important}.uk-margin-medium-bottom{margin-bottom:40px !important}.uk-margin-medium-left{margin-left:40px !important}.uk-margin-medium-right{margin-right:40px !important}.uk-margin-large{margin-bottom:40px}*+.uk-margin-large{margin-top:40px !important}.uk-margin-large-top{margin-top:40px !important}.uk-margin-large-bottom{margin-bottom:40px !important}.uk-margin-large-left{margin-left:40px !important}.uk-margin-large-right{margin-right:40px !important}@media (min-width: 1200px){.uk-margin-large{margin-bottom:70px}*+.uk-margin-large{margin-top:70px !important}.uk-margin-large-top{margin-top:70px !important}.uk-margin-large-bottom{margin-bottom:70px !important}.uk-margin-large-left{margin-left:70px !important}.uk-margin-large-right{margin-right:70px !important}}.uk-margin-xlarge{margin-bottom:70px}*+.uk-margin-xlarge{margin-top:70px !important}.uk-margin-xlarge-top{margin-top:70px !important}.uk-margin-xlarge-bottom{margin-bottom:70px !important}.uk-margin-xlarge-left{margin-left:70px !important}.uk-margin-xlarge-right{margin-right:70px !important}@media (min-width: 1200px){.uk-margin-xlarge{margin-bottom:140px}*+.uk-margin-xlarge{margin-top:140px !important}.uk-margin-xlarge-top{margin-top:140px !important}.uk-margin-xlarge-bottom{margin-bottom:140px !important}.uk-margin-xlarge-left{margin-left:140px !important}.uk-margin-xlarge-right{margin-right:140px !important}}.uk-margin-remove{margin:0 !important}.uk-margin-remove-top{margin-top:0 !important}.uk-margin-remove-bottom{margin-bottom:0 !important}.uk-margin-remove-left{margin-left:0 !important}.uk-margin-remove-right{margin-right:0 !important}.uk-margin-remove-vertical{margin-top:0 !important;margin-bottom:0 !important}.uk-margin-remove-adjacent+*{margin-top:0 !important}.uk-margin-auto{margin-left:auto !important;margin-right:auto !important}.uk-margin-auto-top{margin-top:auto !important}.uk-margin-auto-bottom{margin-bottom:auto !important}.uk-margin-auto-left{margin-left:auto !important}.uk-margin-auto-right{margin-right:auto !important}.uk-margin-auto-vertical{margin-top:auto !important;margin-bottom:auto !important}.uk-padding{padding:30px}@media (min-width: 1200px){.uk-padding{padding:40px}}.uk-padding-small{padding:15px}.uk-padding-large{padding:30px}@media (min-width: 1200px){.uk-padding-large{padding:70px}}.uk-padding-remove{padding:0 !important}.uk-padding-remove-top{padding-top:0 !important}.uk-padding-remove-bottom{padding-bottom:0 !important}.uk-padding-remove-left{padding-left:0 !important}.uk-padding-remove-right{padding-right:0 !important}.uk-padding-remove-vertical{padding-top:0 !important;padding-bottom:0 !important}.uk-padding-remove-horizontal{padding-left:0 !important;padding-right:0 !important}[class*='uk-position-top'],[class*='uk-position-bottom'],[class*='uk-position-left'],[class*='uk-position-right'],[class*='uk-position-center']{position:absolute !important}.uk-position-top{top:0;left:0;right:0}.uk-position-bottom{bottom:0;left:0;right:0}.uk-position-left{top:0;bottom:0;left:0}.uk-position-right{top:0;bottom:0;right:0}.uk-position-top-left{top:0;left:0}.uk-position-top-right{top:0;right:0}.uk-position-bottom-left{bottom:0;left:0}.uk-position-bottom-right{bottom:0;right:0}.uk-position-center{top:50%;left:50%;transform:translate(-50%, -50%);display:table;width:-moz-max-content;max-width:100%;box-sizing:border-box}[class*='uk-position-center-left'],[class*='uk-position-center-right']{top:50%;transform:translateY(-50%)}.uk-position-center-left{left:0}.uk-position-center-right{right:0}.uk-position-center-left-out{right:100%;width:max-content}.uk-position-center-right-out{left:100%;width:max-content}.uk-position-top-center,.uk-position-bottom-center{left:50%;transform:translateX(-50%);display:table;width:-moz-max-content;max-width:100%;box-sizing:border-box}.uk-position-top-center{top:0}.uk-position-bottom-center{bottom:0}.uk-position-cover{position:absolute;top:0;bottom:0;left:0;right:0}.uk-position-relative{position:relative !important}.uk-position-absolute{position:absolute !important}.uk-position-fixed{position:fixed !important}.uk-position-z-index{z-index:1}.uk-position-small{margin:15px}.uk-position-small.uk-position-center{transform:translate(-50%, -50%) translate(-15px, -15px)}.uk-position-small[class*='uk-position-center-left'],.uk-position-small[class*='uk-position-center-right']{transform:translateY(-50%) translateY(-15px)}.uk-position-small.uk-position-top-center,.uk-position-small.uk-position-bottom-center{transform:translateX(-50%) translateX(-15px)}.uk-position-medium{margin:30px}.uk-position-medium.uk-position-center{transform:translate(-50%, -50%) translate(-30px, -30px)}.uk-position-medium[class*='uk-position-center-left'],.uk-position-medium[class*='uk-position-center-right']{transform:translateY(-50%) translateY(-30px)}.uk-position-medium.uk-position-top-center,.uk-position-medium.uk-position-bottom-center{transform:translateX(-50%) translateX(-30px)}.uk-position-large{margin:30px}.uk-position-large.uk-position-center{transform:translate(-50%, -50%) translate(-30px, -30px)}.uk-position-large[class*='uk-position-center-left'],.uk-position-large[class*='uk-position-center-right']{transform:translateY(-50%) translateY(-30px)}.uk-position-large.uk-position-top-center,.uk-position-large.uk-position-bottom-center{transform:translateX(-50%) translateX(-30px)}@media (min-width: 1200px){.uk-position-large{margin:50px}.uk-position-large.uk-position-center{transform:translate(-50%, -50%) translate(-50px, -50px)}.uk-position-large[class*='uk-position-center-left'],.uk-position-large[class*='uk-position-center-right']{transform:translateY(-50%) translateY(-50px)}.uk-position-large.uk-position-top-center,.uk-position-large.uk-position-bottom-center{transform:translateX(-50%) translateX(-50px)}}.uk-transition-fade,[class*='uk-transition-scale'],[class*='uk-transition-slide']{transition:.3s ease-out;transition-property:opacity, transform, filter}.uk-transition-toggle:focus{outline:none}.uk-transition-fade{opacity:0}.uk-transition-toggle:hover [class*='uk-transition-fade'],.uk-transition-toggle.uk-hover [class*='uk-transition-fade'],.uk-transition-toggle:focus [class*='uk-transition-fade'],.uk-transition-active.uk-active [class*='uk-transition-fade']{opacity:1}[class*='uk-transition-scale']{opacity:0}.uk-transition-scale-up{transform:scale3d(1, 1, 1)}.uk-transition-scale-down{transform:scale3d(1.1, 1.1, 1)}.uk-transition-toggle:hover .uk-transition-scale-up,.uk-transition-toggle.uk-hover .uk-transition-scale-up,.uk-transition-toggle:focus .uk-transition-scale-up,.uk-transition-active.uk-active .uk-transition-scale-up{opacity:1;transform:scale3d(1.1, 1.1, 1)}.uk-transition-toggle:hover .uk-transition-scale-down,.uk-transition-toggle.uk-hover .uk-transition-scale-down,.uk-transition-toggle:focus .uk-transition-scale-down,.uk-transition-active.uk-active .uk-transition-scale-down{opacity:1;transform:scale3d(1, 1, 1)}[class*='uk-transition-slide']{opacity:0}.uk-transition-slide-top{transform:translateY(-100%)}.uk-transition-slide-bottom{transform:translateY(100%)}.uk-transition-slide-left{transform:translateX(-100%)}.uk-transition-slide-right{transform:translateX(100%)}.uk-transition-slide-top-small{transform:translateY(-10px)}.uk-transition-slide-bottom-small{transform:translateY(10px)}.uk-transition-slide-left-small{transform:translateX(-10px)}.uk-transition-slide-right-small{transform:translateX(10px)}.uk-transition-slide-top-medium{transform:translateY(-50px)}.uk-transition-slide-bottom-medium{transform:translateY(50px)}.uk-transition-slide-left-medium{transform:translateX(-50px)}.uk-transition-slide-right-medium{transform:translateX(50px)}.uk-transition-toggle:hover [class*='uk-transition-slide'],.uk-transition-toggle.uk-hover [class*='uk-transition-slide'],.uk-transition-toggle:focus [class*='uk-transition-slide'],.uk-transition-active.uk-active [class*='uk-transition-slide']{opacity:1;transform:translateX(0) translateY(0)}.uk-transition-opaque{opacity:1}.uk-transition-slow{transition-duration:.7s}[hidden],.uk-hidden{display:none !important}@media (min-width: 640px){.uk-hidden\@s{display:none !important}}@media (min-width: 960px){.uk-hidden\@m{display:none !important}}@media (min-width: 1200px){.uk-hidden\@l{display:none !important}}@media (min-width: 1600px){.uk-hidden\@xl{display:none !important}}@media (max-width: 639px){.uk-visible\@s{display:none !important}}@media (max-width: 959px){.uk-visible\@m{display:none !important}}@media (max-width: 1199px){.uk-visible\@l{display:none !important}}@media (max-width: 1599px){.uk-visible\@xl{display:none !important}}.uk-invisible{visibility:hidden !important}.uk-visible-toggle:not(:hover):not(.uk-hover) .uk-hidden-hover:not(:focus){position:absolute !important;width:0 !important;height:0 !important;padding:0 !important;margin:0 !important;overflow:hidden !important}.uk-visible-toggle:not(:hover):not(.uk-hover) .uk-invisible-hover:not(:focus){opacity:0 !important}@media (pointer: coarse){.uk-hidden-touch{display:none !important}}.uk-hidden-notouch{display:none !important}@media (pointer: coarse){.uk-hidden-notouch{display:block !important}}.uk-light,.uk-section-primary:not(.uk-preserve-color),.uk-section-secondary:not(.uk-preserve-color),.uk-tile-primary:not(.uk-preserve-color),.uk-tile-secondary:not(.uk-preserve-color),.uk-card-primary.uk-card-body,.uk-card-primary>:not([class*='uk-card-media']),.uk-card-secondary.uk-card-body,.uk-card-secondary>:not([class*='uk-card-media']),.uk-overlay-primary,.uk-offcanvas-bar{color:rgba(255,255,255,0.7)}.uk-light a,.uk-section-primary:not(.uk-preserve-color) a,.uk-section-secondary:not(.uk-preserve-color) a,.uk-tile-primary:not(.uk-preserve-color) a,.uk-tile-secondary:not(.uk-preserve-color) a,.uk-card-primary.uk-card-body a,.uk-card-primary>:not([class*='uk-card-media']) a,.uk-card-secondary.uk-card-body a,.uk-card-secondary>:not([class*='uk-card-media']) a,.uk-overlay-primary a,.uk-offcanvas-bar a,.uk-light .uk-link,.uk-section-primary:not(.uk-preserve-color) .uk-link,.uk-section-secondary:not(.uk-preserve-color) .uk-link,.uk-tile-primary:not(.uk-preserve-color) .uk-link,.uk-tile-secondary:not(.uk-preserve-color) .uk-link,.uk-card-primary.uk-card-body .uk-link,.uk-card-primary>:not([class*='uk-card-media']) .uk-link,.uk-card-secondary.uk-card-body .uk-link,.uk-card-secondary>:not([class*='uk-card-media']) .uk-link,.uk-overlay-primary .uk-link,.uk-offcanvas-bar .uk-link{color:#fff}.uk-light a:hover,.uk-section-primary:not(.uk-preserve-color) a:hover,.uk-section-secondary:not(.uk-preserve-color) a:hover,.uk-tile-primary:not(.uk-preserve-color) a:hover,.uk-tile-secondary:not(.uk-preserve-color) a:hover,.uk-card-primary.uk-card-body a:hover,.uk-card-primary>:not([class*='uk-card-media']) a:hover,.uk-card-secondary.uk-card-body a:hover,.uk-card-secondary>:not([class*='uk-card-media']) a:hover,.uk-overlay-primary a:hover,.uk-offcanvas-bar a:hover,.uk-light .uk-link:hover,.uk-section-primary:not(.uk-preserve-color) .uk-link:hover,.uk-section-secondary:not(.uk-preserve-color) .uk-link:hover,.uk-tile-primary:not(.uk-preserve-color) .uk-link:hover,.uk-tile-secondary:not(.uk-preserve-color) .uk-link:hover,.uk-card-primary.uk-card-body .uk-link:hover,.uk-card-primary>:not([class*='uk-card-media']) .uk-link:hover,.uk-card-secondary.uk-card-body .uk-link:hover,.uk-card-secondary>:not([class*='uk-card-media']) .uk-link:hover,.uk-overlay-primary .uk-link:hover,.uk-offcanvas-bar .uk-link:hover{color:#fff}.uk-light :not(pre)>code,.uk-section-primary:not(.uk-preserve-color) :not(pre)>code,.uk-section-secondary:not(.uk-preserve-color) :not(pre)>code,.uk-tile-primary:not(.uk-preserve-color) :not(pre)>code,.uk-tile-secondary:not(.uk-preserve-color) :not(pre)>code,.uk-card-primary.uk-card-body :not(pre)>code,.uk-card-primary>:not([class*='uk-card-media']) :not(pre)>code,.uk-card-secondary.uk-card-body :not(pre)>code,.uk-card-secondary>:not([class*='uk-card-media']) :not(pre)>code,.uk-overlay-primary :not(pre)>code,.uk-offcanvas-bar :not(pre)>code,.uk-light :not(pre)>kbd,.uk-section-primary:not(.uk-preserve-color) :not(pre)>kbd,.uk-section-secondary:not(.uk-preserve-color) :not(pre)>kbd,.uk-tile-primary:not(.uk-preserve-color) :not(pre)>kbd,.uk-tile-secondary:not(.uk-preserve-color) :not(pre)>kbd,.uk-card-primary.uk-card-body :not(pre)>kbd,.uk-card-primary>:not([class*='uk-card-media']) :not(pre)>kbd,.uk-card-secondary.uk-card-body :not(pre)>kbd,.uk-card-secondary>:not([class*='uk-card-media']) :not(pre)>kbd,.uk-overlay-primary :not(pre)>kbd,.uk-offcanvas-bar :not(pre)>kbd,.uk-light :not(pre)>samp,.uk-section-primary:not(.uk-preserve-color) :not(pre)>samp,.uk-section-secondary:not(.uk-preserve-color) :not(pre)>samp,.uk-tile-primary:not(.uk-preserve-color) :not(pre)>samp,.uk-tile-secondary:not(.uk-preserve-color) :not(pre)>samp,.uk-card-primary.uk-card-body :not(pre)>samp,.uk-card-primary>:not([class*='uk-card-media']) :not(pre)>samp,.uk-card-secondary.uk-card-body :not(pre)>samp,.uk-card-secondary>:not([class*='uk-card-media']) :not(pre)>samp,.uk-overlay-primary :not(pre)>samp,.uk-offcanvas-bar :not(pre)>samp{color:rgba(255,255,255,0.7);background:rgba(255,255,255,0.1)}.uk-light em,.uk-section-primary:not(.uk-preserve-color) em,.uk-section-secondary:not(.uk-preserve-color) em,.uk-tile-primary:not(.uk-preserve-color) em,.uk-tile-secondary:not(.uk-preserve-color) em,.uk-card-primary.uk-card-body em,.uk-card-primary>:not([class*='uk-card-media']) em,.uk-card-secondary.uk-card-body em,.uk-card-secondary>:not([class*='uk-card-media']) em,.uk-overlay-primary em,.uk-offcanvas-bar em{color:#fff}.uk-light h1,.uk-section-primary:not(.uk-preserve-color) h1,.uk-section-secondary:not(.uk-preserve-color) h1,.uk-tile-primary:not(.uk-preserve-color) h1,.uk-tile-secondary:not(.uk-preserve-color) h1,.uk-card-primary.uk-card-body h1,.uk-card-primary>:not([class*='uk-card-media']) h1,.uk-card-secondary.uk-card-body h1,.uk-card-secondary>:not([class*='uk-card-media']) h1,.uk-overlay-primary h1,.uk-offcanvas-bar h1,.uk-light .uk-h1,.uk-section-primary:not(.uk-preserve-color) .uk-h1,.uk-section-secondary:not(.uk-preserve-color) .uk-h1,.uk-tile-primary:not(.uk-preserve-color) .uk-h1,.uk-tile-secondary:not(.uk-preserve-color) .uk-h1,.uk-card-primary.uk-card-body .uk-h1,.uk-card-primary>:not([class*='uk-card-media']) .uk-h1,.uk-card-secondary.uk-card-body .uk-h1,.uk-card-secondary>:not([class*='uk-card-media']) .uk-h1,.uk-overlay-primary .uk-h1,.uk-offcanvas-bar .uk-h1,.uk-light h2,.uk-section-primary:not(.uk-preserve-color) h2,.uk-section-secondary:not(.uk-preserve-color) h2,.uk-tile-primary:not(.uk-preserve-color) h2,.uk-tile-secondary:not(.uk-preserve-color) h2,.uk-card-primary.uk-card-body h2,.uk-card-primary>:not([class*='uk-card-media']) h2,.uk-card-secondary.uk-card-body h2,.uk-card-secondary>:not([class*='uk-card-media']) h2,.uk-overlay-primary h2,.uk-offcanvas-bar h2,.uk-light .uk-h2,.uk-section-primary:not(.uk-preserve-color) .uk-h2,.uk-section-secondary:not(.uk-preserve-color) .uk-h2,.uk-tile-primary:not(.uk-preserve-color) .uk-h2,.uk-tile-secondary:not(.uk-preserve-color) .uk-h2,.uk-card-primary.uk-card-body .uk-h2,.uk-card-primary>:not([class*='uk-card-media']) .uk-h2,.uk-card-secondary.uk-card-body .uk-h2,.uk-card-secondary>:not([class*='uk-card-media']) .uk-h2,.uk-overlay-primary .uk-h2,.uk-offcanvas-bar .uk-h2,.uk-light h3,.uk-section-primary:not(.uk-preserve-color) h3,.uk-section-secondary:not(.uk-preserve-color) h3,.uk-tile-primary:not(.uk-preserve-color) h3,.uk-tile-secondary:not(.uk-preserve-color) h3,.uk-card-primary.uk-card-body h3,.uk-card-primary>:not([class*='uk-card-media']) h3,.uk-card-secondary.uk-card-body h3,.uk-card-secondary>:not([class*='uk-card-media']) h3,.uk-overlay-primary h3,.uk-offcanvas-bar h3,.uk-light .uk-h3,.uk-section-primary:not(.uk-preserve-color) .uk-h3,.uk-section-secondary:not(.uk-preserve-color) .uk-h3,.uk-tile-primary:not(.uk-preserve-color) .uk-h3,.uk-tile-secondary:not(.uk-preserve-color) .uk-h3,.uk-card-primary.uk-card-body .uk-h3,.uk-card-primary>:not([class*='uk-card-media']) .uk-h3,.uk-card-secondary.uk-card-body .uk-h3,.uk-card-secondary>:not([class*='uk-card-media']) .uk-h3,.uk-overlay-primary .uk-h3,.uk-offcanvas-bar .uk-h3,.uk-light h4,.uk-section-primary:not(.uk-preserve-color) h4,.uk-section-secondary:not(.uk-preserve-color) h4,.uk-tile-primary:not(.uk-preserve-color) h4,.uk-tile-secondary:not(.uk-preserve-color) h4,.uk-card-primary.uk-card-body h4,.uk-card-primary>:not([class*='uk-card-media']) h4,.uk-card-secondary.uk-card-body h4,.uk-card-secondary>:not([class*='uk-card-media']) h4,.uk-overlay-primary h4,.uk-offcanvas-bar h4,.uk-light .uk-h4,.uk-section-primary:not(.uk-preserve-color) .uk-h4,.uk-section-secondary:not(.uk-preserve-color) .uk-h4,.uk-tile-primary:not(.uk-preserve-color) .uk-h4,.uk-tile-secondary:not(.uk-preserve-color) .uk-h4,.uk-card-primary.uk-card-body .uk-h4,.uk-card-primary>:not([class*='uk-card-media']) .uk-h4,.uk-card-secondary.uk-card-body .uk-h4,.uk-card-secondary>:not([class*='uk-card-media']) .uk-h4,.uk-overlay-primary .uk-h4,.uk-offcanvas-bar .uk-h4,.uk-light h5,.uk-section-primary:not(.uk-preserve-color) h5,.uk-section-secondary:not(.uk-preserve-color) h5,.uk-tile-primary:not(.uk-preserve-color) h5,.uk-tile-secondary:not(.uk-preserve-color) h5,.uk-card-primary.uk-card-body h5,.uk-card-primary>:not([class*='uk-card-media']) h5,.uk-card-secondary.uk-card-body h5,.uk-card-secondary>:not([class*='uk-card-media']) h5,.uk-overlay-primary h5,.uk-offcanvas-bar h5,.uk-light .uk-h5,.uk-section-primary:not(.uk-preserve-color) .uk-h5,.uk-section-secondary:not(.uk-preserve-color) .uk-h5,.uk-tile-primary:not(.uk-preserve-color) .uk-h5,.uk-tile-secondary:not(.uk-preserve-color) .uk-h5,.uk-card-primary.uk-card-body .uk-h5,.uk-card-primary>:not([class*='uk-card-media']) .uk-h5,.uk-card-secondary.uk-card-body .uk-h5,.uk-card-secondary>:not([class*='uk-card-media']) .uk-h5,.uk-overlay-primary .uk-h5,.uk-offcanvas-bar .uk-h5,.uk-light h6,.uk-section-primary:not(.uk-preserve-color) h6,.uk-section-secondary:not(.uk-preserve-color) h6,.uk-tile-primary:not(.uk-preserve-color) h6,.uk-tile-secondary:not(.uk-preserve-color) h6,.uk-card-primary.uk-card-body h6,.uk-card-primary>:not([class*='uk-card-media']) h6,.uk-card-secondary.uk-card-body h6,.uk-card-secondary>:not([class*='uk-card-media']) h6,.uk-overlay-primary h6,.uk-offcanvas-bar h6,.uk-light .uk-h6,.uk-section-primary:not(.uk-preserve-color) .uk-h6,.uk-section-secondary:not(.uk-preserve-color) .uk-h6,.uk-tile-primary:not(.uk-preserve-color) .uk-h6,.uk-tile-secondary:not(.uk-preserve-color) .uk-h6,.uk-card-primary.uk-card-body .uk-h6,.uk-card-primary>:not([class*='uk-card-media']) .uk-h6,.uk-card-secondary.uk-card-body .uk-h6,.uk-card-secondary>:not([class*='uk-card-media']) .uk-h6,.uk-overlay-primary .uk-h6,.uk-offcanvas-bar .uk-h6{color:#fff}.uk-light blockquote,.uk-section-primary:not(.uk-preserve-color) blockquote,.uk-section-secondary:not(.uk-preserve-color) blockquote,.uk-tile-primary:not(.uk-preserve-color) blockquote,.uk-tile-secondary:not(.uk-preserve-color) blockquote,.uk-card-primary.uk-card-body blockquote,.uk-card-primary>:not([class*='uk-card-media']) blockquote,.uk-card-secondary.uk-card-body blockquote,.uk-card-secondary>:not([class*='uk-card-media']) blockquote,.uk-overlay-primary blockquote,.uk-offcanvas-bar blockquote{color:#fff}.uk-light blockquote footer,.uk-section-primary:not(.uk-preserve-color) blockquote footer,.uk-section-secondary:not(.uk-preserve-color) blockquote footer,.uk-tile-primary:not(.uk-preserve-color) blockquote footer,.uk-tile-secondary:not(.uk-preserve-color) blockquote footer,.uk-card-primary.uk-card-body blockquote footer,.uk-card-primary>:not([class*='uk-card-media']) blockquote footer,.uk-card-secondary.uk-card-body blockquote footer,.uk-card-secondary>:not([class*='uk-card-media']) blockquote footer,.uk-overlay-primary blockquote footer,.uk-offcanvas-bar blockquote footer{color:rgba(255,255,255,0.7)}.uk-light hr,.uk-section-primary:not(.uk-preserve-color) hr,.uk-section-secondary:not(.uk-preserve-color) hr,.uk-tile-primary:not(.uk-preserve-color) hr,.uk-tile-secondary:not(.uk-preserve-color) hr,.uk-card-primary.uk-card-body hr,.uk-card-primary>:not([class*='uk-card-media']) hr,.uk-card-secondary.uk-card-body hr,.uk-card-secondary>:not([class*='uk-card-media']) hr,.uk-overlay-primary hr,.uk-offcanvas-bar hr,.uk-light .uk-hr,.uk-section-primary:not(.uk-preserve-color) .uk-hr,.uk-section-secondary:not(.uk-preserve-color) .uk-hr,.uk-tile-primary:not(.uk-preserve-color) .uk-hr,.uk-tile-secondary:not(.uk-preserve-color) .uk-hr,.uk-card-primary.uk-card-body .uk-hr,.uk-card-primary>:not([class*='uk-card-media']) .uk-hr,.uk-card-secondary.uk-card-body .uk-hr,.uk-card-secondary>:not([class*='uk-card-media']) .uk-hr,.uk-overlay-primary .uk-hr,.uk-offcanvas-bar .uk-hr{border-top-color:rgba(255,255,255,0.2)}.uk-light a.uk-link-muted,.uk-section-primary:not(.uk-preserve-color) a.uk-link-muted,.uk-section-secondary:not(.uk-preserve-color) a.uk-link-muted,.uk-tile-primary:not(.uk-preserve-color) a.uk-link-muted,.uk-tile-secondary:not(.uk-preserve-color) a.uk-link-muted,.uk-card-primary.uk-card-body a.uk-link-muted,.uk-card-primary>:not([class*='uk-card-media']) a.uk-link-muted,.uk-card-secondary.uk-card-body a.uk-link-muted,.uk-card-secondary>:not([class*='uk-card-media']) a.uk-link-muted,.uk-overlay-primary a.uk-link-muted,.uk-offcanvas-bar a.uk-link-muted,.uk-light .uk-link-muted a,.uk-section-primary:not(.uk-preserve-color) .uk-link-muted a,.uk-section-secondary:not(.uk-preserve-color) .uk-link-muted a,.uk-tile-primary:not(.uk-preserve-color) .uk-link-muted a,.uk-tile-secondary:not(.uk-preserve-color) .uk-link-muted a,.uk-card-primary.uk-card-body .uk-link-muted a,.uk-card-primary>:not([class*='uk-card-media']) .uk-link-muted a,.uk-card-secondary.uk-card-body .uk-link-muted a,.uk-card-secondary>:not([class*='uk-card-media']) .uk-link-muted a,.uk-overlay-primary .uk-link-muted a,.uk-offcanvas-bar .uk-link-muted a{color:rgba(255,255,255,0.5)}.uk-light a.uk-link-muted:hover,.uk-section-primary:not(.uk-preserve-color) a.uk-link-muted:hover,.uk-section-secondary:not(.uk-preserve-color) a.uk-link-muted:hover,.uk-tile-primary:not(.uk-preserve-color) a.uk-link-muted:hover,.uk-tile-secondary:not(.uk-preserve-color) a.uk-link-muted:hover,.uk-card-primary.uk-card-body a.uk-link-muted:hover,.uk-card-primary>:not([class*='uk-card-media']) a.uk-link-muted:hover,.uk-card-secondary.uk-card-body a.uk-link-muted:hover,.uk-card-secondary>:not([class*='uk-card-media']) a.uk-link-muted:hover,.uk-overlay-primary a.uk-link-muted:hover,.uk-offcanvas-bar a.uk-link-muted:hover,.uk-light .uk-link-muted a:hover,.uk-section-primary:not(.uk-preserve-color) .uk-link-muted a:hover,.uk-section-secondary:not(.uk-preserve-color) .uk-link-muted a:hover,.uk-tile-primary:not(.uk-preserve-color) .uk-link-muted a:hover,.uk-tile-secondary:not(.uk-preserve-color) .uk-link-muted a:hover,.uk-card-primary.uk-card-body .uk-link-muted a:hover,.uk-card-primary>:not([class*='uk-card-media']) .uk-link-muted a:hover,.uk-card-secondary.uk-card-body .uk-link-muted a:hover,.uk-card-secondary>:not([class*='uk-card-media']) .uk-link-muted a:hover,.uk-overlay-primary .uk-link-muted a:hover,.uk-offcanvas-bar .uk-link-muted a:hover{color:rgba(255,255,255,0.7)}.uk-light a.uk-link-text:hover,.uk-section-primary:not(.uk-preserve-color) a.uk-link-text:hover,.uk-section-secondary:not(.uk-preserve-color) a.uk-link-text:hover,.uk-tile-primary:not(.uk-preserve-color) a.uk-link-text:hover,.uk-tile-secondary:not(.uk-preserve-color) a.uk-link-text:hover,.uk-card-primary.uk-card-body a.uk-link-text:hover,.uk-card-primary>:not([class*='uk-card-media']) a.uk-link-text:hover,.uk-card-secondary.uk-card-body a.uk-link-text:hover,.uk-card-secondary>:not([class*='uk-card-media']) a.uk-link-text:hover,.uk-overlay-primary a.uk-link-text:hover,.uk-offcanvas-bar a.uk-link-text:hover,.uk-light .uk-link-text a:hover,.uk-section-primary:not(.uk-preserve-color) .uk-link-text a:hover,.uk-section-secondary:not(.uk-preserve-color) .uk-link-text a:hover,.uk-tile-primary:not(.uk-preserve-color) .uk-link-text a:hover,.uk-tile-secondary:not(.uk-preserve-color) .uk-link-text a:hover,.uk-card-primary.uk-card-body .uk-link-text a:hover,.uk-card-primary>:not([class*='uk-card-media']) .uk-link-text a:hover,.uk-card-secondary.uk-card-body .uk-link-text a:hover,.uk-card-secondary>:not([class*='uk-card-media']) .uk-link-text a:hover,.uk-overlay-primary .uk-link-text a:hover,.uk-offcanvas-bar .uk-link-text a:hover{color:rgba(255,255,255,0.5)}.uk-light a.uk-link-heading:hover,.uk-section-primary:not(.uk-preserve-color) a.uk-link-heading:hover,.uk-section-secondary:not(.uk-preserve-color) a.uk-link-heading:hover,.uk-tile-primary:not(.uk-preserve-color) a.uk-link-heading:hover,.uk-tile-secondary:not(.uk-preserve-color) a.uk-link-heading:hover,.uk-card-primary.uk-card-body a.uk-link-heading:hover,.uk-card-primary>:not([class*='uk-card-media']) a.uk-link-heading:hover,.uk-card-secondary.uk-card-body a.uk-link-heading:hover,.uk-card-secondary>:not([class*='uk-card-media']) a.uk-link-heading:hover,.uk-overlay-primary a.uk-link-heading:hover,.uk-offcanvas-bar a.uk-link-heading:hover,.uk-light .uk-link-heading a:hover,.uk-section-primary:not(.uk-preserve-color) .uk-link-heading a:hover,.uk-section-secondary:not(.uk-preserve-color) .uk-link-heading a:hover,.uk-tile-primary:not(.uk-preserve-color) .uk-link-heading a:hover,.uk-tile-secondary:not(.uk-preserve-color) .uk-link-heading a:hover,.uk-card-primary.uk-card-body .uk-link-heading a:hover,.uk-card-primary>:not([class*='uk-card-media']) .uk-link-heading a:hover,.uk-card-secondary.uk-card-body .uk-link-heading a:hover,.uk-card-secondary>:not([class*='uk-card-media']) .uk-link-heading a:hover,.uk-overlay-primary .uk-link-heading a:hover,.uk-offcanvas-bar .uk-link-heading a:hover{color:#fff}.uk-light .uk-heading-divider,.uk-section-primary:not(.uk-preserve-color) .uk-heading-divider,.uk-section-secondary:not(.uk-preserve-color) .uk-heading-divider,.uk-tile-primary:not(.uk-preserve-color) .uk-heading-divider,.uk-tile-secondary:not(.uk-preserve-color) .uk-heading-divider,.uk-card-primary.uk-card-body .uk-heading-divider,.uk-card-primary>:not([class*='uk-card-media']) .uk-heading-divider,.uk-card-secondary.uk-card-body .uk-heading-divider,.uk-card-secondary>:not([class*='uk-card-media']) .uk-heading-divider,.uk-overlay-primary .uk-heading-divider,.uk-offcanvas-bar .uk-heading-divider{border-bottom-color:rgba(255,255,255,0.2)}.uk-light .uk-heading-bullet::before,.uk-section-primary:not(.uk-preserve-color) .uk-heading-bullet::before,.uk-section-secondary:not(.uk-preserve-color) .uk-heading-bullet::before,.uk-tile-primary:not(.uk-preserve-color) .uk-heading-bullet::before,.uk-tile-secondary:not(.uk-preserve-color) .uk-heading-bullet::before,.uk-card-primary.uk-card-body .uk-heading-bullet::before,.uk-card-primary>:not([class*='uk-card-media']) .uk-heading-bullet::before,.uk-card-secondary.uk-card-body .uk-heading-bullet::before,.uk-card-secondary>:not([class*='uk-card-media']) .uk-heading-bullet::before,.uk-overlay-primary .uk-heading-bullet::before,.uk-offcanvas-bar .uk-heading-bullet::before{border-left-color:rgba(255,255,255,0.2)}.uk-light .uk-heading-line>::before,.uk-section-primary:not(.uk-preserve-color) .uk-heading-line>::before,.uk-section-secondary:not(.uk-preserve-color) .uk-heading-line>::before,.uk-tile-primary:not(.uk-preserve-color) .uk-heading-line>::before,.uk-tile-secondary:not(.uk-preserve-color) .uk-heading-line>::before,.uk-card-primary.uk-card-body .uk-heading-line>::before,.uk-card-primary>:not([class*='uk-card-media']) .uk-heading-line>::before,.uk-card-secondary.uk-card-body .uk-heading-line>::before,.uk-card-secondary>:not([class*='uk-card-media']) .uk-heading-line>::before,.uk-overlay-primary .uk-heading-line>::before,.uk-offcanvas-bar .uk-heading-line>::before,.uk-light .uk-heading-line>::after,.uk-section-primary:not(.uk-preserve-color) .uk-heading-line>::after,.uk-section-secondary:not(.uk-preserve-color) .uk-heading-line>::after,.uk-tile-primary:not(.uk-preserve-color) .uk-heading-line>::after,.uk-tile-secondary:not(.uk-preserve-color) .uk-heading-line>::after,.uk-card-primary.uk-card-body .uk-heading-line>::after,.uk-card-primary>:not([class*='uk-card-media']) .uk-heading-line>::after,.uk-card-secondary.uk-card-body .uk-heading-line>::after,.uk-card-secondary>:not([class*='uk-card-media']) .uk-heading-line>::after,.uk-overlay-primary .uk-heading-line>::after,.uk-offcanvas-bar .uk-heading-line>::after{border-bottom-color:rgba(255,255,255,0.2)}.uk-light .uk-divider-icon,.uk-section-primary:not(.uk-preserve-color) .uk-divider-icon,.uk-section-secondary:not(.uk-preserve-color) .uk-divider-icon,.uk-tile-primary:not(.uk-preserve-color) .uk-divider-icon,.uk-tile-secondary:not(.uk-preserve-color) .uk-divider-icon,.uk-card-primary.uk-card-body .uk-divider-icon,.uk-card-primary>:not([class*='uk-card-media']) .uk-divider-icon,.uk-card-secondary.uk-card-body .uk-divider-icon,.uk-card-secondary>:not([class*='uk-card-media']) .uk-divider-icon,.uk-overlay-primary .uk-divider-icon,.uk-offcanvas-bar .uk-divider-icon{background-image:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D%2220%22%20height%3D%2220%22%20viewBox%3D%220%200%2020%2020%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%20%20%20%20%3Ccircle%20fill%3D%22none%22%20stroke%3D%22rgba(255,255,255,0.2)%22%20stroke-width%3D%222%22%20cx%3D%2210%22%20cy%3D%2210%22%20r%3D%227%22%20%2F%3E%0A%3C%2Fsvg%3E%0A")}.uk-light .uk-divider-icon::before,.uk-section-primary:not(.uk-preserve-color) .uk-divider-icon::before,.uk-section-secondary:not(.uk-preserve-color) .uk-divider-icon::before,.uk-tile-primary:not(.uk-preserve-color) .uk-divider-icon::before,.uk-tile-secondary:not(.uk-preserve-color) .uk-divider-icon::before,.uk-card-primary.uk-card-body .uk-divider-icon::before,.uk-card-primary>:not([class*='uk-card-media']) .uk-divider-icon::before,.uk-card-secondary.uk-card-body .uk-divider-icon::before,.uk-card-secondary>:not([class*='uk-card-media']) .uk-divider-icon::before,.uk-overlay-primary .uk-divider-icon::before,.uk-offcanvas-bar .uk-divider-icon::before,.uk-light .uk-divider-icon::after,.uk-section-primary:not(.uk-preserve-color) .uk-divider-icon::after,.uk-section-secondary:not(.uk-preserve-color) .uk-divider-icon::after,.uk-tile-primary:not(.uk-preserve-color) .uk-divider-icon::after,.uk-tile-secondary:not(.uk-preserve-color) .uk-divider-icon::after,.uk-card-primary.uk-card-body .uk-divider-icon::after,.uk-card-primary>:not([class*='uk-card-media']) .uk-divider-icon::after,.uk-card-secondary.uk-card-body .uk-divider-icon::after,.uk-card-secondary>:not([class*='uk-card-media']) .uk-divider-icon::after,.uk-overlay-primary .uk-divider-icon::after,.uk-offcanvas-bar .uk-divider-icon::after{border-bottom-color:rgba(255,255,255,0.2)}.uk-light .uk-divider-small::after,.uk-section-primary:not(.uk-preserve-color) .uk-divider-small::after,.uk-section-secondary:not(.uk-preserve-color) .uk-divider-small::after,.uk-tile-primary:not(.uk-preserve-color) .uk-divider-small::after,.uk-tile-secondary:not(.uk-preserve-color) .uk-divider-small::after,.uk-card-primary.uk-card-body .uk-divider-small::after,.uk-card-primary>:not([class*='uk-card-media']) .uk-divider-small::after,.uk-card-secondary.uk-card-body .uk-divider-small::after,.uk-card-secondary>:not([class*='uk-card-media']) .uk-divider-small::after,.uk-overlay-primary .uk-divider-small::after,.uk-offcanvas-bar .uk-divider-small::after{border-top-color:rgba(255,255,255,0.2)}.uk-light .uk-list-divider>li:nth-child(n+2),.uk-section-primary:not(.uk-preserve-color) .uk-list-divider>li:nth-child(n+2),.uk-section-secondary:not(.uk-preserve-color) .uk-list-divider>li:nth-child(n+2),.uk-tile-primary:not(.uk-preserve-color) .uk-list-divider>li:nth-child(n+2),.uk-tile-secondary:not(.uk-preserve-color) .uk-list-divider>li:nth-child(n+2),.uk-card-primary.uk-card-body .uk-list-divider>li:nth-child(n+2),.uk-card-primary>:not([class*='uk-card-media']) .uk-list-divider>li:nth-child(n+2),.uk-card-secondary.uk-card-body .uk-list-divider>li:nth-child(n+2),.uk-card-secondary>:not([class*='uk-card-media']) .uk-list-divider>li:nth-child(n+2),.uk-overlay-primary .uk-list-divider>li:nth-child(n+2),.uk-offcanvas-bar .uk-list-divider>li:nth-child(n+2){border-top-color:rgba(255,255,255,0.2)}.uk-light .uk-list-striped>li:nth-of-type(odd),.uk-section-primary:not(.uk-preserve-color) .uk-list-striped>li:nth-of-type(odd),.uk-section-secondary:not(.uk-preserve-color) .uk-list-striped>li:nth-of-type(odd),.uk-tile-primary:not(.uk-preserve-color) .uk-list-striped>li:nth-of-type(odd),.uk-tile-secondary:not(.uk-preserve-color) .uk-list-striped>li:nth-of-type(odd),.uk-card-primary.uk-card-body .uk-list-striped>li:nth-of-type(odd),.uk-card-primary>:not([class*='uk-card-media']) .uk-list-striped>li:nth-of-type(odd),.uk-card-secondary.uk-card-body .uk-list-striped>li:nth-of-type(odd),.uk-card-secondary>:not([class*='uk-card-media']) .uk-list-striped>li:nth-of-type(odd),.uk-overlay-primary .uk-list-striped>li:nth-of-type(odd),.uk-offcanvas-bar .uk-list-striped>li:nth-of-type(odd){border-top-color:rgba(255,255,255,0.2);border-bottom-color:rgba(255,255,255,0.2)}.uk-light .uk-list-striped>li:nth-of-type(odd),.uk-section-primary:not(.uk-preserve-color) .uk-list-striped>li:nth-of-type(odd),.uk-section-secondary:not(.uk-preserve-color) .uk-list-striped>li:nth-of-type(odd),.uk-tile-primary:not(.uk-preserve-color) .uk-list-striped>li:nth-of-type(odd),.uk-tile-secondary:not(.uk-preserve-color) .uk-list-striped>li:nth-of-type(odd),.uk-card-primary.uk-card-body .uk-list-striped>li:nth-of-type(odd),.uk-card-primary>:not([class*='uk-card-media']) .uk-list-striped>li:nth-of-type(odd),.uk-card-secondary.uk-card-body .uk-list-striped>li:nth-of-type(odd),.uk-card-secondary>:not([class*='uk-card-media']) .uk-list-striped>li:nth-of-type(odd),.uk-overlay-primary .uk-list-striped>li:nth-of-type(odd),.uk-offcanvas-bar .uk-list-striped>li:nth-of-type(odd){background-color:rgba(255,255,255,0.1)}.uk-light .uk-list-bullet>li::before,.uk-section-primary:not(.uk-preserve-color) .uk-list-bullet>li::before,.uk-section-secondary:not(.uk-preserve-color) .uk-list-bullet>li::before,.uk-tile-primary:not(.uk-preserve-color) .uk-list-bullet>li::before,.uk-tile-secondary:not(.uk-preserve-color) .uk-list-bullet>li::before,.uk-card-primary.uk-card-body .uk-list-bullet>li::before,.uk-card-primary>:not([class*='uk-card-media']) .uk-list-bullet>li::before,.uk-card-secondary.uk-card-body .uk-list-bullet>li::before,.uk-card-secondary>:not([class*='uk-card-media']) .uk-list-bullet>li::before,.uk-overlay-primary .uk-list-bullet>li::before,.uk-offcanvas-bar .uk-list-bullet>li::before{background-image:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D%226%22%20height%3D%226%22%20viewBox%3D%220%200%206%206%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%20%20%20%20%3Ccircle%20fill%3D%22rgba(255,255,255,0.7)%22%20cx%3D%223%22%20cy%3D%223%22%20r%3D%223%22%20%2F%3E%0A%3C%2Fsvg%3E")}.uk-light .uk-icon-link,.uk-section-primary:not(.uk-preserve-color) .uk-icon-link,.uk-section-secondary:not(.uk-preserve-color) .uk-icon-link,.uk-tile-primary:not(.uk-preserve-color) .uk-icon-link,.uk-tile-secondary:not(.uk-preserve-color) .uk-icon-link,.uk-card-primary.uk-card-body .uk-icon-link,.uk-card-primary>:not([class*='uk-card-media']) .uk-icon-link,.uk-card-secondary.uk-card-body .uk-icon-link,.uk-card-secondary>:not([class*='uk-card-media']) .uk-icon-link,.uk-overlay-primary .uk-icon-link,.uk-offcanvas-bar .uk-icon-link{color:rgba(255,255,255,0.5)}.uk-light .uk-icon-link:hover,.uk-section-primary:not(.uk-preserve-color) .uk-icon-link:hover,.uk-section-secondary:not(.uk-preserve-color) .uk-icon-link:hover,.uk-tile-primary:not(.uk-preserve-color) .uk-icon-link:hover,.uk-tile-secondary:not(.uk-preserve-color) .uk-icon-link:hover,.uk-card-primary.uk-card-body .uk-icon-link:hover,.uk-card-primary>:not([class*='uk-card-media']) .uk-icon-link:hover,.uk-card-secondary.uk-card-body .uk-icon-link:hover,.uk-card-secondary>:not([class*='uk-card-media']) .uk-icon-link:hover,.uk-overlay-primary .uk-icon-link:hover,.uk-offcanvas-bar .uk-icon-link:hover,.uk-light .uk-icon-link:focus,.uk-section-primary:not(.uk-preserve-color) .uk-icon-link:focus,.uk-section-secondary:not(.uk-preserve-color) .uk-icon-link:focus,.uk-tile-primary:not(.uk-preserve-color) .uk-icon-link:focus,.uk-tile-secondary:not(.uk-preserve-color) .uk-icon-link:focus,.uk-card-primary.uk-card-body .uk-icon-link:focus,.uk-card-primary>:not([class*='uk-card-media']) .uk-icon-link:focus,.uk-card-secondary.uk-card-body .uk-icon-link:focus,.uk-card-secondary>:not([class*='uk-card-media']) .uk-icon-link:focus,.uk-overlay-primary .uk-icon-link:focus,.uk-offcanvas-bar .uk-icon-link:focus{color:rgba(255,255,255,0.7)}.uk-light .uk-icon-link:active,.uk-section-primary:not(.uk-preserve-color) .uk-icon-link:active,.uk-section-secondary:not(.uk-preserve-color) .uk-icon-link:active,.uk-tile-primary:not(.uk-preserve-color) .uk-icon-link:active,.uk-tile-secondary:not(.uk-preserve-color) .uk-icon-link:active,.uk-card-primary.uk-card-body .uk-icon-link:active,.uk-card-primary>:not([class*='uk-card-media']) .uk-icon-link:active,.uk-card-secondary.uk-card-body .uk-icon-link:active,.uk-card-secondary>:not([class*='uk-card-media']) .uk-icon-link:active,.uk-overlay-primary .uk-icon-link:active,.uk-offcanvas-bar .uk-icon-link:active,.uk-light .uk-active>.uk-icon-link,.uk-section-primary:not(.uk-preserve-color) .uk-active>.uk-icon-link,.uk-section-secondary:not(.uk-preserve-color) .uk-active>.uk-icon-link,.uk-tile-primary:not(.uk-preserve-color) .uk-active>.uk-icon-link,.uk-tile-secondary:not(.uk-preserve-color) .uk-active>.uk-icon-link,.uk-card-primary.uk-card-body .uk-active>.uk-icon-link,.uk-card-primary>:not([class*='uk-card-media']) .uk-active>.uk-icon-link,.uk-card-secondary.uk-card-body .uk-active>.uk-icon-link,.uk-card-secondary>:not([class*='uk-card-media']) .uk-active>.uk-icon-link,.uk-overlay-primary .uk-active>.uk-icon-link,.uk-offcanvas-bar .uk-active>.uk-icon-link{color:rgba(255,255,255,0.7)}.uk-light .uk-icon-button,.uk-section-primary:not(.uk-preserve-color) .uk-icon-button,.uk-section-secondary:not(.uk-preserve-color) .uk-icon-button,.uk-tile-primary:not(.uk-preserve-color) .uk-icon-button,.uk-tile-secondary:not(.uk-preserve-color) .uk-icon-button,.uk-card-primary.uk-card-body .uk-icon-button,.uk-card-primary>:not([class*='uk-card-media']) .uk-icon-button,.uk-card-secondary.uk-card-body .uk-icon-button,.uk-card-secondary>:not([class*='uk-card-media']) .uk-icon-button,.uk-overlay-primary .uk-icon-button,.uk-offcanvas-bar .uk-icon-button{background-color:rgba(255,255,255,0.1);color:rgba(255,255,255,0.5)}.uk-light .uk-icon-button:hover,.uk-section-primary:not(.uk-preserve-color) .uk-icon-button:hover,.uk-section-secondary:not(.uk-preserve-color) .uk-icon-button:hover,.uk-tile-primary:not(.uk-preserve-color) .uk-icon-button:hover,.uk-tile-secondary:not(.uk-preserve-color) .uk-icon-button:hover,.uk-card-primary.uk-card-body .uk-icon-button:hover,.uk-card-primary>:not([class*='uk-card-media']) .uk-icon-button:hover,.uk-card-secondary.uk-card-body .uk-icon-button:hover,.uk-card-secondary>:not([class*='uk-card-media']) .uk-icon-button:hover,.uk-overlay-primary .uk-icon-button:hover,.uk-offcanvas-bar .uk-icon-button:hover,.uk-light .uk-icon-button:focus,.uk-section-primary:not(.uk-preserve-color) .uk-icon-button:focus,.uk-section-secondary:not(.uk-preserve-color) .uk-icon-button:focus,.uk-tile-primary:not(.uk-preserve-color) .uk-icon-button:focus,.uk-tile-secondary:not(.uk-preserve-color) .uk-icon-button:focus,.uk-card-primary.uk-card-body .uk-icon-button:focus,.uk-card-primary>:not([class*='uk-card-media']) .uk-icon-button:focus,.uk-card-secondary.uk-card-body .uk-icon-button:focus,.uk-card-secondary>:not([class*='uk-card-media']) .uk-icon-button:focus,.uk-overlay-primary .uk-icon-button:focus,.uk-offcanvas-bar .uk-icon-button:focus{background-color:rgba(242,242,242,0.1);color:rgba(255,255,255,0.7)}.uk-light .uk-icon-button:active,.uk-section-primary:not(.uk-preserve-color) .uk-icon-button:active,.uk-section-secondary:not(.uk-preserve-color) .uk-icon-button:active,.uk-tile-primary:not(.uk-preserve-color) .uk-icon-button:active,.uk-tile-secondary:not(.uk-preserve-color) .uk-icon-button:active,.uk-card-primary.uk-card-body .uk-icon-button:active,.uk-card-primary>:not([class*='uk-card-media']) .uk-icon-button:active,.uk-card-secondary.uk-card-body .uk-icon-button:active,.uk-card-secondary>:not([class*='uk-card-media']) .uk-icon-button:active,.uk-overlay-primary .uk-icon-button:active,.uk-offcanvas-bar .uk-icon-button:active{background-color:rgba(230,230,230,0.1);color:rgba(255,255,255,0.7)}.uk-light .uk-input,.uk-section-primary:not(.uk-preserve-color) .uk-input,.uk-section-secondary:not(.uk-preserve-color) .uk-input,.uk-tile-primary:not(.uk-preserve-color) .uk-input,.uk-tile-secondary:not(.uk-preserve-color) .uk-input,.uk-card-primary.uk-card-body .uk-input,.uk-card-primary>:not([class*='uk-card-media']) .uk-input,.uk-card-secondary.uk-card-body .uk-input,.uk-card-secondary>:not([class*='uk-card-media']) .uk-input,.uk-overlay-primary .uk-input,.uk-offcanvas-bar .uk-input,.uk-light .uk-select,.uk-section-primary:not(.uk-preserve-color) .uk-select,.uk-section-secondary:not(.uk-preserve-color) .uk-select,.uk-tile-primary:not(.uk-preserve-color) .uk-select,.uk-tile-secondary:not(.uk-preserve-color) .uk-select,.uk-card-primary.uk-card-body .uk-select,.uk-card-primary>:not([class*='uk-card-media']) .uk-select,.uk-card-secondary.uk-card-body .uk-select,.uk-card-secondary>:not([class*='uk-card-media']) .uk-select,.uk-overlay-primary .uk-select,.uk-offcanvas-bar .uk-select,.uk-light .uk-textarea,.uk-section-primary:not(.uk-preserve-color) .uk-textarea,.uk-section-secondary:not(.uk-preserve-color) .uk-textarea,.uk-tile-primary:not(.uk-preserve-color) .uk-textarea,.uk-tile-secondary:not(.uk-preserve-color) .uk-textarea,.uk-card-primary.uk-card-body .uk-textarea,.uk-card-primary>:not([class*='uk-card-media']) .uk-textarea,.uk-card-secondary.uk-card-body .uk-textarea,.uk-card-secondary>:not([class*='uk-card-media']) .uk-textarea,.uk-overlay-primary .uk-textarea,.uk-offcanvas-bar .uk-textarea{background-color:rgba(255,255,255,0.1);color:rgba(255,255,255,0.7);background-clip:padding-box;border-color:rgba(255,255,255,0.2)}.uk-light .uk-input:focus,.uk-section-primary:not(.uk-preserve-color) .uk-input:focus,.uk-section-secondary:not(.uk-preserve-color) .uk-input:focus,.uk-tile-primary:not(.uk-preserve-color) .uk-input:focus,.uk-tile-secondary:not(.uk-preserve-color) .uk-input:focus,.uk-card-primary.uk-card-body .uk-input:focus,.uk-card-primary>:not([class*='uk-card-media']) .uk-input:focus,.uk-card-secondary.uk-card-body .uk-input:focus,.uk-card-secondary>:not([class*='uk-card-media']) .uk-input:focus,.uk-overlay-primary .uk-input:focus,.uk-offcanvas-bar .uk-input:focus,.uk-light .uk-select:focus,.uk-section-primary:not(.uk-preserve-color) .uk-select:focus,.uk-section-secondary:not(.uk-preserve-color) .uk-select:focus,.uk-tile-primary:not(.uk-preserve-color) .uk-select:focus,.uk-tile-secondary:not(.uk-preserve-color) .uk-select:focus,.uk-card-primary.uk-card-body .uk-select:focus,.uk-card-primary>:not([class*='uk-card-media']) .uk-select:focus,.uk-card-secondary.uk-card-body .uk-select:focus,.uk-card-secondary>:not([class*='uk-card-media']) .uk-select:focus,.uk-overlay-primary .uk-select:focus,.uk-offcanvas-bar .uk-select:focus,.uk-light .uk-textarea:focus,.uk-section-primary:not(.uk-preserve-color) .uk-textarea:focus,.uk-section-secondary:not(.uk-preserve-color) .uk-textarea:focus,.uk-tile-primary:not(.uk-preserve-color) .uk-textarea:focus,.uk-tile-secondary:not(.uk-preserve-color) .uk-textarea:focus,.uk-card-primary.uk-card-body .uk-textarea:focus,.uk-card-primary>:not([class*='uk-card-media']) .uk-textarea:focus,.uk-card-secondary.uk-card-body .uk-textarea:focus,.uk-card-secondary>:not([class*='uk-card-media']) .uk-textarea:focus,.uk-overlay-primary .uk-textarea:focus,.uk-offcanvas-bar .uk-textarea:focus{background-color:rgba(255,255,255,0.1);color:rgba(255,255,255,0.7);border-color:rgba(255,255,255,0.7)}.uk-light .uk-input:-ms-input-placeholder,.uk-section-primary:not(.uk-preserve-color) .uk-input:-ms-input-placeholder,.uk-section-secondary:not(.uk-preserve-color) .uk-input:-ms-input-placeholder,.uk-tile-primary:not(.uk-preserve-color) .uk-input:-ms-input-placeholder,.uk-tile-secondary:not(.uk-preserve-color) .uk-input:-ms-input-placeholder,.uk-card-primary.uk-card-body .uk-input:-ms-input-placeholder,.uk-card-primary>:not([class*='uk-card-media']) .uk-input:-ms-input-placeholder,.uk-card-secondary.uk-card-body .uk-input:-ms-input-placeholder,.uk-card-secondary>:not([class*='uk-card-media']) .uk-input:-ms-input-placeholder,.uk-overlay-primary .uk-input:-ms-input-placeholder,.uk-offcanvas-bar .uk-input:-ms-input-placeholder{color:rgba(255,255,255,0.5) !important}.uk-light .uk-input::placeholder,.uk-section-primary:not(.uk-preserve-color) .uk-input::placeholder,.uk-section-secondary:not(.uk-preserve-color) .uk-input::placeholder,.uk-tile-primary:not(.uk-preserve-color) .uk-input::placeholder,.uk-tile-secondary:not(.uk-preserve-color) .uk-input::placeholder,.uk-card-primary.uk-card-body .uk-input::placeholder,.uk-card-primary>:not([class*='uk-card-media']) .uk-input::placeholder,.uk-card-secondary.uk-card-body .uk-input::placeholder,.uk-card-secondary>:not([class*='uk-card-media']) .uk-input::placeholder,.uk-overlay-primary .uk-input::placeholder,.uk-offcanvas-bar .uk-input::placeholder{color:rgba(255,255,255,0.5)}.uk-light .uk-textarea:-ms-input-placeholder,.uk-section-primary:not(.uk-preserve-color) .uk-textarea:-ms-input-placeholder,.uk-section-secondary:not(.uk-preserve-color) .uk-textarea:-ms-input-placeholder,.uk-tile-primary:not(.uk-preserve-color) .uk-textarea:-ms-input-placeholder,.uk-tile-secondary:not(.uk-preserve-color) .uk-textarea:-ms-input-placeholder,.uk-card-primary.uk-card-body .uk-textarea:-ms-input-placeholder,.uk-card-primary>:not([class*='uk-card-media']) .uk-textarea:-ms-input-placeholder,.uk-card-secondary.uk-card-body .uk-textarea:-ms-input-placeholder,.uk-card-secondary>:not([class*='uk-card-media']) .uk-textarea:-ms-input-placeholder,.uk-overlay-primary .uk-textarea:-ms-input-placeholder,.uk-offcanvas-bar .uk-textarea:-ms-input-placeholder{color:rgba(255,255,255,0.5) !important}.uk-light .uk-textarea::placeholder,.uk-section-primary:not(.uk-preserve-color) .uk-textarea::placeholder,.uk-section-secondary:not(.uk-preserve-color) .uk-textarea::placeholder,.uk-tile-primary:not(.uk-preserve-color) .uk-textarea::placeholder,.uk-tile-secondary:not(.uk-preserve-color) .uk-textarea::placeholder,.uk-card-primary.uk-card-body .uk-textarea::placeholder,.uk-card-primary>:not([class*='uk-card-media']) .uk-textarea::placeholder,.uk-card-secondary.uk-card-body .uk-textarea::placeholder,.uk-card-secondary>:not([class*='uk-card-media']) .uk-textarea::placeholder,.uk-overlay-primary .uk-textarea::placeholder,.uk-offcanvas-bar .uk-textarea::placeholder{color:rgba(255,255,255,0.5)}.uk-light .uk-select:not([multiple]):not([size]),.uk-section-primary:not(.uk-preserve-color) .uk-select:not([multiple]):not([size]),.uk-section-secondary:not(.uk-preserve-color) .uk-select:not([multiple]):not([size]),.uk-tile-primary:not(.uk-preserve-color) .uk-select:not([multiple]):not([size]),.uk-tile-secondary:not(.uk-preserve-color) .uk-select:not([multiple]):not([size]),.uk-card-primary.uk-card-body .uk-select:not([multiple]):not([size]),.uk-card-primary>:not([class*='uk-card-media']) .uk-select:not([multiple]):not([size]),.uk-card-secondary.uk-card-body .uk-select:not([multiple]):not([size]),.uk-card-secondary>:not([class*='uk-card-media']) .uk-select:not([multiple]):not([size]),.uk-overlay-primary .uk-select:not([multiple]):not([size]),.uk-offcanvas-bar .uk-select:not([multiple]):not([size]){background-image:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D%2224%22%20height%3D%2216%22%20viewBox%3D%220%200%2024%2016%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%20%20%20%20%3Cpolygon%20fill%3D%22rgba(255,255,255,0.7)%22%20points%3D%2212%201%209%206%2015%206%22%20%2F%3E%0A%20%20%20%20%3Cpolygon%20fill%3D%22rgba(255,255,255,0.7)%22%20points%3D%2212%2013%209%208%2015%208%22%20%2F%3E%0A%3C%2Fsvg%3E%0A")}.uk-light .uk-radio,.uk-section-primary:not(.uk-preserve-color) .uk-radio,.uk-section-secondary:not(.uk-preserve-color) .uk-radio,.uk-tile-primary:not(.uk-preserve-color) .uk-radio,.uk-tile-secondary:not(.uk-preserve-color) .uk-radio,.uk-card-primary.uk-card-body .uk-radio,.uk-card-primary>:not([class*='uk-card-media']) .uk-radio,.uk-card-secondary.uk-card-body .uk-radio,.uk-card-secondary>:not([class*='uk-card-media']) .uk-radio,.uk-overlay-primary .uk-radio,.uk-offcanvas-bar .uk-radio,.uk-light .uk-checkbox,.uk-section-primary:not(.uk-preserve-color) .uk-checkbox,.uk-section-secondary:not(.uk-preserve-color) .uk-checkbox,.uk-tile-primary:not(.uk-preserve-color) .uk-checkbox,.uk-tile-secondary:not(.uk-preserve-color) .uk-checkbox,.uk-card-primary.uk-card-body .uk-checkbox,.uk-card-primary>:not([class*='uk-card-media']) .uk-checkbox,.uk-card-secondary.uk-card-body .uk-checkbox,.uk-card-secondary>:not([class*='uk-card-media']) .uk-checkbox,.uk-overlay-primary .uk-checkbox,.uk-offcanvas-bar .uk-checkbox{background-color:rgba(242,242,242,0.1);border-color:rgba(255,255,255,0.2)}.uk-light .uk-radio:focus,.uk-section-primary:not(.uk-preserve-color) .uk-radio:focus,.uk-section-secondary:not(.uk-preserve-color) .uk-radio:focus,.uk-tile-primary:not(.uk-preserve-color) .uk-radio:focus,.uk-tile-secondary:not(.uk-preserve-color) .uk-radio:focus,.uk-card-primary.uk-card-body .uk-radio:focus,.uk-card-primary>:not([class*='uk-card-media']) .uk-radio:focus,.uk-card-secondary.uk-card-body .uk-radio:focus,.uk-card-secondary>:not([class*='uk-card-media']) .uk-radio:focus,.uk-overlay-primary .uk-radio:focus,.uk-offcanvas-bar .uk-radio:focus,.uk-light .uk-checkbox:focus,.uk-section-primary:not(.uk-preserve-color) .uk-checkbox:focus,.uk-section-secondary:not(.uk-preserve-color) .uk-checkbox:focus,.uk-tile-primary:not(.uk-preserve-color) .uk-checkbox:focus,.uk-tile-secondary:not(.uk-preserve-color) .uk-checkbox:focus,.uk-card-primary.uk-card-body .uk-checkbox:focus,.uk-card-primary>:not([class*='uk-card-media']) .uk-checkbox:focus,.uk-card-secondary.uk-card-body .uk-checkbox:focus,.uk-card-secondary>:not([class*='uk-card-media']) .uk-checkbox:focus,.uk-overlay-primary .uk-checkbox:focus,.uk-offcanvas-bar .uk-checkbox:focus{border-color:rgba(255,255,255,0.7)}.uk-light .uk-radio:checked,.uk-section-primary:not(.uk-preserve-color) .uk-radio:checked,.uk-section-secondary:not(.uk-preserve-color) .uk-radio:checked,.uk-tile-primary:not(.uk-preserve-color) .uk-radio:checked,.uk-tile-secondary:not(.uk-preserve-color) .uk-radio:checked,.uk-card-primary.uk-card-body .uk-radio:checked,.uk-card-primary>:not([class*='uk-card-media']) .uk-radio:checked,.uk-card-secondary.uk-card-body .uk-radio:checked,.uk-card-secondary>:not([class*='uk-card-media']) .uk-radio:checked,.uk-overlay-primary .uk-radio:checked,.uk-offcanvas-bar .uk-radio:checked,.uk-light .uk-checkbox:checked,.uk-section-primary:not(.uk-preserve-color) .uk-checkbox:checked,.uk-section-secondary:not(.uk-preserve-color) .uk-checkbox:checked,.uk-tile-primary:not(.uk-preserve-color) .uk-checkbox:checked,.uk-tile-secondary:not(.uk-preserve-color) .uk-checkbox:checked,.uk-card-primary.uk-card-body .uk-checkbox:checked,.uk-card-primary>:not([class*='uk-card-media']) .uk-checkbox:checked,.uk-card-secondary.uk-card-body .uk-checkbox:checked,.uk-card-secondary>:not([class*='uk-card-media']) .uk-checkbox:checked,.uk-overlay-primary .uk-checkbox:checked,.uk-offcanvas-bar .uk-checkbox:checked,.uk-light .uk-checkbox:indeterminate,.uk-section-primary:not(.uk-preserve-color) .uk-checkbox:indeterminate,.uk-section-secondary:not(.uk-preserve-color) .uk-checkbox:indeterminate,.uk-tile-primary:not(.uk-preserve-color) .uk-checkbox:indeterminate,.uk-tile-secondary:not(.uk-preserve-color) .uk-checkbox:indeterminate,.uk-card-primary.uk-card-body .uk-checkbox:indeterminate,.uk-card-primary>:not([class*='uk-card-media']) .uk-checkbox:indeterminate,.uk-card-secondary.uk-card-body .uk-checkbox:indeterminate,.uk-card-secondary>:not([class*='uk-card-media']) .uk-checkbox:indeterminate,.uk-overlay-primary .uk-checkbox:indeterminate,.uk-offcanvas-bar .uk-checkbox:indeterminate{background-color:#fff;border-color:rgba(255,255,255,0.7)}.uk-light .uk-radio:checked:focus,.uk-section-primary:not(.uk-preserve-color) .uk-radio:checked:focus,.uk-section-secondary:not(.uk-preserve-color) .uk-radio:checked:focus,.uk-tile-primary:not(.uk-preserve-color) .uk-radio:checked:focus,.uk-tile-secondary:not(.uk-preserve-color) .uk-radio:checked:focus,.uk-card-primary.uk-card-body .uk-radio:checked:focus,.uk-card-primary>:not([class*='uk-card-media']) .uk-radio:checked:focus,.uk-card-secondary.uk-card-body .uk-radio:checked:focus,.uk-card-secondary>:not([class*='uk-card-media']) .uk-radio:checked:focus,.uk-overlay-primary .uk-radio:checked:focus,.uk-offcanvas-bar .uk-radio:checked:focus,.uk-light .uk-checkbox:checked:focus,.uk-section-primary:not(.uk-preserve-color) .uk-checkbox:checked:focus,.uk-section-secondary:not(.uk-preserve-color) .uk-checkbox:checked:focus,.uk-tile-primary:not(.uk-preserve-color) .uk-checkbox:checked:focus,.uk-tile-secondary:not(.uk-preserve-color) .uk-checkbox:checked:focus,.uk-card-primary.uk-card-body .uk-checkbox:checked:focus,.uk-card-primary>:not([class*='uk-card-media']) .uk-checkbox:checked:focus,.uk-card-secondary.uk-card-body .uk-checkbox:checked:focus,.uk-card-secondary>:not([class*='uk-card-media']) .uk-checkbox:checked:focus,.uk-overlay-primary .uk-checkbox:checked:focus,.uk-offcanvas-bar .uk-checkbox:checked:focus,.uk-light .uk-checkbox:indeterminate:focus,.uk-section-primary:not(.uk-preserve-color) .uk-checkbox:indeterminate:focus,.uk-section-secondary:not(.uk-preserve-color) .uk-checkbox:indeterminate:focus,.uk-tile-primary:not(.uk-preserve-color) .uk-checkbox:indeterminate:focus,.uk-tile-secondary:not(.uk-preserve-color) .uk-checkbox:indeterminate:focus,.uk-card-primary.uk-card-body .uk-checkbox:indeterminate:focus,.uk-card-primary>:not([class*='uk-card-media']) .uk-checkbox:indeterminate:focus,.uk-card-secondary.uk-card-body .uk-checkbox:indeterminate:focus,.uk-card-secondary>:not([class*='uk-card-media']) .uk-checkbox:indeterminate:focus,.uk-overlay-primary .uk-checkbox:indeterminate:focus,.uk-offcanvas-bar .uk-checkbox:indeterminate:focus{background-color:#e6e6e6}.uk-light .uk-radio:checked,.uk-section-primary:not(.uk-preserve-color) .uk-radio:checked,.uk-section-secondary:not(.uk-preserve-color) .uk-radio:checked,.uk-tile-primary:not(.uk-preserve-color) .uk-radio:checked,.uk-tile-secondary:not(.uk-preserve-color) .uk-radio:checked,.uk-card-primary.uk-card-body .uk-radio:checked,.uk-card-primary>:not([class*='uk-card-media']) .uk-radio:checked,.uk-card-secondary.uk-card-body .uk-radio:checked,.uk-card-secondary>:not([class*='uk-card-media']) .uk-radio:checked,.uk-overlay-primary .uk-radio:checked,.uk-offcanvas-bar .uk-radio:checked{background-image:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%20%20%20%20%3Ccircle%20fill%3D%22%23666%22%20cx%3D%228%22%20cy%3D%228%22%20r%3D%222%22%20%2F%3E%0A%3C%2Fsvg%3E")}.uk-light .uk-checkbox:checked,.uk-section-primary:not(.uk-preserve-color) .uk-checkbox:checked,.uk-section-secondary:not(.uk-preserve-color) .uk-checkbox:checked,.uk-tile-primary:not(.uk-preserve-color) .uk-checkbox:checked,.uk-tile-secondary:not(.uk-preserve-color) .uk-checkbox:checked,.uk-card-primary.uk-card-body .uk-checkbox:checked,.uk-card-primary>:not([class*='uk-card-media']) .uk-checkbox:checked,.uk-card-secondary.uk-card-body .uk-checkbox:checked,.uk-card-secondary>:not([class*='uk-card-media']) .uk-checkbox:checked,.uk-overlay-primary .uk-checkbox:checked,.uk-offcanvas-bar .uk-checkbox:checked{background-image:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D%2214%22%20height%3D%2211%22%20viewBox%3D%220%200%2014%2011%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%20%20%20%20%3Cpolygon%20fill%3D%22%23666%22%20points%3D%2212%201%205%207.5%202%205%201%205.5%205%2010%2013%201.5%22%20%2F%3E%0A%3C%2Fsvg%3E%0A")}.uk-light .uk-checkbox:indeterminate,.uk-section-primary:not(.uk-preserve-color) .uk-checkbox:indeterminate,.uk-section-secondary:not(.uk-preserve-color) .uk-checkbox:indeterminate,.uk-tile-primary:not(.uk-preserve-color) .uk-checkbox:indeterminate,.uk-tile-secondary:not(.uk-preserve-color) .uk-checkbox:indeterminate,.uk-card-primary.uk-card-body .uk-checkbox:indeterminate,.uk-card-primary>:not([class*='uk-card-media']) .uk-checkbox:indeterminate,.uk-card-secondary.uk-card-body .uk-checkbox:indeterminate,.uk-card-secondary>:not([class*='uk-card-media']) .uk-checkbox:indeterminate,.uk-overlay-primary .uk-checkbox:indeterminate,.uk-offcanvas-bar .uk-checkbox:indeterminate{background-image:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D%2216%22%20height%3D%2216%22%20viewBox%3D%220%200%2016%2016%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%20%20%20%20%3Crect%20fill%3D%22%23666%22%20x%3D%223%22%20y%3D%228%22%20width%3D%2210%22%20height%3D%221%22%20%2F%3E%0A%3C%2Fsvg%3E")}.uk-light .uk-form-label,.uk-section-primary:not(.uk-preserve-color) .uk-form-label,.uk-section-secondary:not(.uk-preserve-color) .uk-form-label,.uk-tile-primary:not(.uk-preserve-color) .uk-form-label,.uk-tile-secondary:not(.uk-preserve-color) .uk-form-label,.uk-card-primary.uk-card-body .uk-form-label,.uk-card-primary>:not([class*='uk-card-media']) .uk-form-label,.uk-card-secondary.uk-card-body .uk-form-label,.uk-card-secondary>:not([class*='uk-card-media']) .uk-form-label,.uk-overlay-primary .uk-form-label,.uk-offcanvas-bar .uk-form-label{color:#fff}.uk-light .uk-form-icon,.uk-section-primary:not(.uk-preserve-color) .uk-form-icon,.uk-section-secondary:not(.uk-preserve-color) .uk-form-icon,.uk-tile-primary:not(.uk-preserve-color) .uk-form-icon,.uk-tile-secondary:not(.uk-preserve-color) .uk-form-icon,.uk-card-primary.uk-card-body .uk-form-icon,.uk-card-primary>:not([class*='uk-card-media']) .uk-form-icon,.uk-card-secondary.uk-card-body .uk-form-icon,.uk-card-secondary>:not([class*='uk-card-media']) .uk-form-icon,.uk-overlay-primary .uk-form-icon,.uk-offcanvas-bar .uk-form-icon{color:rgba(255,255,255,0.5)}.uk-light .uk-form-icon:hover,.uk-section-primary:not(.uk-preserve-color) .uk-form-icon:hover,.uk-section-secondary:not(.uk-preserve-color) .uk-form-icon:hover,.uk-tile-primary:not(.uk-preserve-color) .uk-form-icon:hover,.uk-tile-secondary:not(.uk-preserve-color) .uk-form-icon:hover,.uk-card-primary.uk-card-body .uk-form-icon:hover,.uk-card-primary>:not([class*='uk-card-media']) .uk-form-icon:hover,.uk-card-secondary.uk-card-body .uk-form-icon:hover,.uk-card-secondary>:not([class*='uk-card-media']) .uk-form-icon:hover,.uk-overlay-primary .uk-form-icon:hover,.uk-offcanvas-bar .uk-form-icon:hover{color:rgba(255,255,255,0.7)}.uk-light .uk-button-default,.uk-section-primary:not(.uk-preserve-color) .uk-button-default,.uk-section-secondary:not(.uk-preserve-color) .uk-button-default,.uk-tile-primary:not(.uk-preserve-color) .uk-button-default,.uk-tile-secondary:not(.uk-preserve-color) .uk-button-default,.uk-card-primary.uk-card-body .uk-button-default,.uk-card-primary>:not([class*='uk-card-media']) .uk-button-default,.uk-card-secondary.uk-card-body .uk-button-default,.uk-card-secondary>:not([class*='uk-card-media']) .uk-button-default,.uk-overlay-primary .uk-button-default,.uk-offcanvas-bar .uk-button-default{background-color:rgba(0,0,0,0);color:#fff;border-color:rgba(255,255,255,0.7)}.uk-light .uk-button-default:hover,.uk-section-primary:not(.uk-preserve-color) .uk-button-default:hover,.uk-section-secondary:not(.uk-preserve-color) .uk-button-default:hover,.uk-tile-primary:not(.uk-preserve-color) .uk-button-default:hover,.uk-tile-secondary:not(.uk-preserve-color) .uk-button-default:hover,.uk-card-primary.uk-card-body .uk-button-default:hover,.uk-card-primary>:not([class*='uk-card-media']) .uk-button-default:hover,.uk-card-secondary.uk-card-body .uk-button-default:hover,.uk-card-secondary>:not([class*='uk-card-media']) .uk-button-default:hover,.uk-overlay-primary .uk-button-default:hover,.uk-offcanvas-bar .uk-button-default:hover,.uk-light .uk-button-default:focus,.uk-section-primary:not(.uk-preserve-color) .uk-button-default:focus,.uk-section-secondary:not(.uk-preserve-color) .uk-button-default:focus,.uk-tile-primary:not(.uk-preserve-color) .uk-button-default:focus,.uk-tile-secondary:not(.uk-preserve-color) .uk-button-default:focus,.uk-card-primary.uk-card-body .uk-button-default:focus,.uk-card-primary>:not([class*='uk-card-media']) .uk-button-default:focus,.uk-card-secondary.uk-card-body .uk-button-default:focus,.uk-card-secondary>:not([class*='uk-card-media']) .uk-button-default:focus,.uk-overlay-primary .uk-button-default:focus,.uk-offcanvas-bar .uk-button-default:focus{background-color:rgba(0,0,0,0);color:#fff;border-color:#fff}.uk-light .uk-button-default:active,.uk-section-primary:not(.uk-preserve-color) .uk-button-default:active,.uk-section-secondary:not(.uk-preserve-color) .uk-button-default:active,.uk-tile-primary:not(.uk-preserve-color) .uk-button-default:active,.uk-tile-secondary:not(.uk-preserve-color) .uk-button-default:active,.uk-card-primary.uk-card-body .uk-button-default:active,.uk-card-primary>:not([class*='uk-card-media']) .uk-button-default:active,.uk-card-secondary.uk-card-body .uk-button-default:active,.uk-card-secondary>:not([class*='uk-card-media']) .uk-button-default:active,.uk-overlay-primary .uk-button-default:active,.uk-offcanvas-bar .uk-button-default:active,.uk-light .uk-button-default.uk-active,.uk-section-primary:not(.uk-preserve-color) .uk-button-default.uk-active,.uk-section-secondary:not(.uk-preserve-color) .uk-button-default.uk-active,.uk-tile-primary:not(.uk-preserve-color) .uk-button-default.uk-active,.uk-tile-secondary:not(.uk-preserve-color) .uk-button-default.uk-active,.uk-card-primary.uk-card-body .uk-button-default.uk-active,.uk-card-primary>:not([class*='uk-card-media']) .uk-button-default.uk-active,.uk-card-secondary.uk-card-body .uk-button-default.uk-active,.uk-card-secondary>:not([class*='uk-card-media']) .uk-button-default.uk-active,.uk-overlay-primary .uk-button-default.uk-active,.uk-offcanvas-bar .uk-button-default.uk-active{background-color:rgba(0,0,0,0);color:#fff;border-color:#fff}.uk-light .uk-button-primary,.uk-section-primary:not(.uk-preserve-color) .uk-button-primary,.uk-section-secondary:not(.uk-preserve-color) .uk-button-primary,.uk-tile-primary:not(.uk-preserve-color) .uk-button-primary,.uk-tile-secondary:not(.uk-preserve-color) .uk-button-primary,.uk-card-primary.uk-card-body .uk-button-primary,.uk-card-primary>:not([class*='uk-card-media']) .uk-button-primary,.uk-card-secondary.uk-card-body .uk-button-primary,.uk-card-secondary>:not([class*='uk-card-media']) .uk-button-primary,.uk-overlay-primary .uk-button-primary,.uk-offcanvas-bar .uk-button-primary{background-color:#fff;color:#666}.uk-light .uk-button-primary:hover,.uk-section-primary:not(.uk-preserve-color) .uk-button-primary:hover,.uk-section-secondary:not(.uk-preserve-color) .uk-button-primary:hover,.uk-tile-primary:not(.uk-preserve-color) .uk-button-primary:hover,.uk-tile-secondary:not(.uk-preserve-color) .uk-button-primary:hover,.uk-card-primary.uk-card-body .uk-button-primary:hover,.uk-card-primary>:not([class*='uk-card-media']) .uk-button-primary:hover,.uk-card-secondary.uk-card-body .uk-button-primary:hover,.uk-card-secondary>:not([class*='uk-card-media']) .uk-button-primary:hover,.uk-overlay-primary .uk-button-primary:hover,.uk-offcanvas-bar .uk-button-primary:hover,.uk-light .uk-button-primary:focus,.uk-section-primary:not(.uk-preserve-color) .uk-button-primary:focus,.uk-section-secondary:not(.uk-preserve-color) .uk-button-primary:focus,.uk-tile-primary:not(.uk-preserve-color) .uk-button-primary:focus,.uk-tile-secondary:not(.uk-preserve-color) .uk-button-primary:focus,.uk-card-primary.uk-card-body .uk-button-primary:focus,.uk-card-primary>:not([class*='uk-card-media']) .uk-button-primary:focus,.uk-card-secondary.uk-card-body .uk-button-primary:focus,.uk-card-secondary>:not([class*='uk-card-media']) .uk-button-primary:focus,.uk-overlay-primary .uk-button-primary:focus,.uk-offcanvas-bar .uk-button-primary:focus{background-color:#f2f2f2;color:#666}.uk-light .uk-button-primary:active,.uk-section-primary:not(.uk-preserve-color) .uk-button-primary:active,.uk-section-secondary:not(.uk-preserve-color) .uk-button-primary:active,.uk-tile-primary:not(.uk-preserve-color) .uk-button-primary:active,.uk-tile-secondary:not(.uk-preserve-color) .uk-button-primary:active,.uk-card-primary.uk-card-body .uk-button-primary:active,.uk-card-primary>:not([class*='uk-card-media']) .uk-button-primary:active,.uk-card-secondary.uk-card-body .uk-button-primary:active,.uk-card-secondary>:not([class*='uk-card-media']) .uk-button-primary:active,.uk-overlay-primary .uk-button-primary:active,.uk-offcanvas-bar .uk-button-primary:active,.uk-light .uk-button-primary.uk-active,.uk-section-primary:not(.uk-preserve-color) .uk-button-primary.uk-active,.uk-section-secondary:not(.uk-preserve-color) .uk-button-primary.uk-active,.uk-tile-primary:not(.uk-preserve-color) .uk-button-primary.uk-active,.uk-tile-secondary:not(.uk-preserve-color) .uk-button-primary.uk-active,.uk-card-primary.uk-card-body .uk-button-primary.uk-active,.uk-card-primary>:not([class*='uk-card-media']) .uk-button-primary.uk-active,.uk-card-secondary.uk-card-body .uk-button-primary.uk-active,.uk-card-secondary>:not([class*='uk-card-media']) .uk-button-primary.uk-active,.uk-overlay-primary .uk-button-primary.uk-active,.uk-offcanvas-bar .uk-button-primary.uk-active{background-color:#e6e6e6;color:#666}.uk-light .uk-button-secondary,.uk-section-primary:not(.uk-preserve-color) .uk-button-secondary,.uk-section-secondary:not(.uk-preserve-color) .uk-button-secondary,.uk-tile-primary:not(.uk-preserve-color) .uk-button-secondary,.uk-tile-secondary:not(.uk-preserve-color) .uk-button-secondary,.uk-card-primary.uk-card-body .uk-button-secondary,.uk-card-primary>:not([class*='uk-card-media']) .uk-button-secondary,.uk-card-secondary.uk-card-body .uk-button-secondary,.uk-card-secondary>:not([class*='uk-card-media']) .uk-button-secondary,.uk-overlay-primary .uk-button-secondary,.uk-offcanvas-bar .uk-button-secondary{background-color:#fff;color:#666}.uk-light .uk-button-secondary:hover,.uk-section-primary:not(.uk-preserve-color) .uk-button-secondary:hover,.uk-section-secondary:not(.uk-preserve-color) .uk-button-secondary:hover,.uk-tile-primary:not(.uk-preserve-color) .uk-button-secondary:hover,.uk-tile-secondary:not(.uk-preserve-color) .uk-button-secondary:hover,.uk-card-primary.uk-card-body .uk-button-secondary:hover,.uk-card-primary>:not([class*='uk-card-media']) .uk-button-secondary:hover,.uk-card-secondary.uk-card-body .uk-button-secondary:hover,.uk-card-secondary>:not([class*='uk-card-media']) .uk-button-secondary:hover,.uk-overlay-primary .uk-button-secondary:hover,.uk-offcanvas-bar .uk-button-secondary:hover,.uk-light .uk-button-secondary:focus,.uk-section-primary:not(.uk-preserve-color) .uk-button-secondary:focus,.uk-section-secondary:not(.uk-preserve-color) .uk-button-secondary:focus,.uk-tile-primary:not(.uk-preserve-color) .uk-button-secondary:focus,.uk-tile-secondary:not(.uk-preserve-color) .uk-button-secondary:focus,.uk-card-primary.uk-card-body .uk-button-secondary:focus,.uk-card-primary>:not([class*='uk-card-media']) .uk-button-secondary:focus,.uk-card-secondary.uk-card-body .uk-button-secondary:focus,.uk-card-secondary>:not([class*='uk-card-media']) .uk-button-secondary:focus,.uk-overlay-primary .uk-button-secondary:focus,.uk-offcanvas-bar .uk-button-secondary:focus{background-color:#f2f2f2;color:#666}.uk-light .uk-button-secondary:active,.uk-section-primary:not(.uk-preserve-color) .uk-button-secondary:active,.uk-section-secondary:not(.uk-preserve-color) .uk-button-secondary:active,.uk-tile-primary:not(.uk-preserve-color) .uk-button-secondary:active,.uk-tile-secondary:not(.uk-preserve-color) .uk-button-secondary:active,.uk-card-primary.uk-card-body .uk-button-secondary:active,.uk-card-primary>:not([class*='uk-card-media']) .uk-button-secondary:active,.uk-card-secondary.uk-card-body .uk-button-secondary:active,.uk-card-secondary>:not([class*='uk-card-media']) .uk-button-secondary:active,.uk-overlay-primary .uk-button-secondary:active,.uk-offcanvas-bar .uk-button-secondary:active,.uk-light .uk-button-secondary.uk-active,.uk-section-primary:not(.uk-preserve-color) .uk-button-secondary.uk-active,.uk-section-secondary:not(.uk-preserve-color) .uk-button-secondary.uk-active,.uk-tile-primary:not(.uk-preserve-color) .uk-button-secondary.uk-active,.uk-tile-secondary:not(.uk-preserve-color) .uk-button-secondary.uk-active,.uk-card-primary.uk-card-body .uk-button-secondary.uk-active,.uk-card-primary>:not([class*='uk-card-media']) .uk-button-secondary.uk-active,.uk-card-secondary.uk-card-body .uk-button-secondary.uk-active,.uk-card-secondary>:not([class*='uk-card-media']) .uk-button-secondary.uk-active,.uk-overlay-primary .uk-button-secondary.uk-active,.uk-offcanvas-bar .uk-button-secondary.uk-active{background-color:#e6e6e6;color:#666}.uk-light .uk-button-text,.uk-section-primary:not(.uk-preserve-color) .uk-button-text,.uk-section-secondary:not(.uk-preserve-color) .uk-button-text,.uk-tile-primary:not(.uk-preserve-color) .uk-button-text,.uk-tile-secondary:not(.uk-preserve-color) .uk-button-text,.uk-card-primary.uk-card-body .uk-button-text,.uk-card-primary>:not([class*='uk-card-media']) .uk-button-text,.uk-card-secondary.uk-card-body .uk-button-text,.uk-card-secondary>:not([class*='uk-card-media']) .uk-button-text,.uk-overlay-primary .uk-button-text,.uk-offcanvas-bar .uk-button-text{color:#fff}.uk-light .uk-button-text::before,.uk-section-primary:not(.uk-preserve-color) .uk-button-text::before,.uk-section-secondary:not(.uk-preserve-color) .uk-button-text::before,.uk-tile-primary:not(.uk-preserve-color) .uk-button-text::before,.uk-tile-secondary:not(.uk-preserve-color) .uk-button-text::before,.uk-card-primary.uk-card-body .uk-button-text::before,.uk-card-primary>:not([class*='uk-card-media']) .uk-button-text::before,.uk-card-secondary.uk-card-body .uk-button-text::before,.uk-card-secondary>:not([class*='uk-card-media']) .uk-button-text::before,.uk-overlay-primary .uk-button-text::before,.uk-offcanvas-bar .uk-button-text::before{border-bottom-color:#fff}.uk-light .uk-button-text:hover,.uk-section-primary:not(.uk-preserve-color) .uk-button-text:hover,.uk-section-secondary:not(.uk-preserve-color) .uk-button-text:hover,.uk-tile-primary:not(.uk-preserve-color) .uk-button-text:hover,.uk-tile-secondary:not(.uk-preserve-color) .uk-button-text:hover,.uk-card-primary.uk-card-body .uk-button-text:hover,.uk-card-primary>:not([class*='uk-card-media']) .uk-button-text:hover,.uk-card-secondary.uk-card-body .uk-button-text:hover,.uk-card-secondary>:not([class*='uk-card-media']) .uk-button-text:hover,.uk-overlay-primary .uk-button-text:hover,.uk-offcanvas-bar .uk-button-text:hover,.uk-light .uk-button-text:focus,.uk-section-primary:not(.uk-preserve-color) .uk-button-text:focus,.uk-section-secondary:not(.uk-preserve-color) .uk-button-text:focus,.uk-tile-primary:not(.uk-preserve-color) .uk-button-text:focus,.uk-tile-secondary:not(.uk-preserve-color) .uk-button-text:focus,.uk-card-primary.uk-card-body .uk-button-text:focus,.uk-card-primary>:not([class*='uk-card-media']) .uk-button-text:focus,.uk-card-secondary.uk-card-body .uk-button-text:focus,.uk-card-secondary>:not([class*='uk-card-media']) .uk-button-text:focus,.uk-overlay-primary .uk-button-text:focus,.uk-offcanvas-bar .uk-button-text:focus{color:#fff}.uk-light .uk-button-text:disabled,.uk-section-primary:not(.uk-preserve-color) .uk-button-text:disabled,.uk-section-secondary:not(.uk-preserve-color) .uk-button-text:disabled,.uk-tile-primary:not(.uk-preserve-color) .uk-button-text:disabled,.uk-tile-secondary:not(.uk-preserve-color) .uk-button-text:disabled,.uk-card-primary.uk-card-body .uk-button-text:disabled,.uk-card-primary>:not([class*='uk-card-media']) .uk-button-text:disabled,.uk-card-secondary.uk-card-body .uk-button-text:disabled,.uk-card-secondary>:not([class*='uk-card-media']) .uk-button-text:disabled,.uk-overlay-primary .uk-button-text:disabled,.uk-offcanvas-bar .uk-button-text:disabled{color:rgba(255,255,255,0.5)}.uk-light .uk-button-link,.uk-section-primary:not(.uk-preserve-color) .uk-button-link,.uk-section-secondary:not(.uk-preserve-color) .uk-button-link,.uk-tile-primary:not(.uk-preserve-color) .uk-button-link,.uk-tile-secondary:not(.uk-preserve-color) .uk-button-link,.uk-card-primary.uk-card-body .uk-button-link,.uk-card-primary>:not([class*='uk-card-media']) .uk-button-link,.uk-card-secondary.uk-card-body .uk-button-link,.uk-card-secondary>:not([class*='uk-card-media']) .uk-button-link,.uk-overlay-primary .uk-button-link,.uk-offcanvas-bar .uk-button-link{color:rgba(255,255,255,0.5)}.uk-light .uk-button-link:hover,.uk-section-primary:not(.uk-preserve-color) .uk-button-link:hover,.uk-section-secondary:not(.uk-preserve-color) .uk-button-link:hover,.uk-tile-primary:not(.uk-preserve-color) .uk-button-link:hover,.uk-tile-secondary:not(.uk-preserve-color) .uk-button-link:hover,.uk-card-primary.uk-card-body .uk-button-link:hover,.uk-card-primary>:not([class*='uk-card-media']) .uk-button-link:hover,.uk-card-secondary.uk-card-body .uk-button-link:hover,.uk-card-secondary>:not([class*='uk-card-media']) .uk-button-link:hover,.uk-overlay-primary .uk-button-link:hover,.uk-offcanvas-bar .uk-button-link:hover,.uk-light .uk-button-link:focus,.uk-section-primary:not(.uk-preserve-color) .uk-button-link:focus,.uk-section-secondary:not(.uk-preserve-color) .uk-button-link:focus,.uk-tile-primary:not(.uk-preserve-color) .uk-button-link:focus,.uk-tile-secondary:not(.uk-preserve-color) .uk-button-link:focus,.uk-card-primary.uk-card-body .uk-button-link:focus,.uk-card-primary>:not([class*='uk-card-media']) .uk-button-link:focus,.uk-card-secondary.uk-card-body .uk-button-link:focus,.uk-card-secondary>:not([class*='uk-card-media']) .uk-button-link:focus,.uk-overlay-primary .uk-button-link:focus,.uk-offcanvas-bar .uk-button-link:focus{color:rgba(255,255,255,0.7)}.uk-light .uk-grid-divider>:not(.uk-first-column)::before,.uk-section-primary:not(.uk-preserve-color) .uk-grid-divider>:not(.uk-first-column)::before,.uk-section-secondary:not(.uk-preserve-color) .uk-grid-divider>:not(.uk-first-column)::before,.uk-tile-primary:not(.uk-preserve-color) .uk-grid-divider>:not(.uk-first-column)::before,.uk-tile-secondary:not(.uk-preserve-color) .uk-grid-divider>:not(.uk-first-column)::before,.uk-card-primary.uk-card-body .uk-grid-divider>:not(.uk-first-column)::before,.uk-card-primary>:not([class*='uk-card-media']) .uk-grid-divider>:not(.uk-first-column)::before,.uk-card-secondary.uk-card-body .uk-grid-divider>:not(.uk-first-column)::before,.uk-card-secondary>:not([class*='uk-card-media']) .uk-grid-divider>:not(.uk-first-column)::before,.uk-overlay-primary .uk-grid-divider>:not(.uk-first-column)::before,.uk-offcanvas-bar .uk-grid-divider>:not(.uk-first-column)::before{border-left-color:rgba(255,255,255,0.2)}.uk-light .uk-grid-divider.uk-grid-stack>.uk-grid-margin::before,.uk-section-primary:not(.uk-preserve-color) .uk-grid-divider.uk-grid-stack>.uk-grid-margin::before,.uk-section-secondary:not(.uk-preserve-color) .uk-grid-divider.uk-grid-stack>.uk-grid-margin::before,.uk-tile-primary:not(.uk-preserve-color) .uk-grid-divider.uk-grid-stack>.uk-grid-margin::before,.uk-tile-secondary:not(.uk-preserve-color) .uk-grid-divider.uk-grid-stack>.uk-grid-margin::before,.uk-card-primary.uk-card-body .uk-grid-divider.uk-grid-stack>.uk-grid-margin::before,.uk-card-primary>:not([class*='uk-card-media']) .uk-grid-divider.uk-grid-stack>.uk-grid-margin::before,.uk-card-secondary.uk-card-body .uk-grid-divider.uk-grid-stack>.uk-grid-margin::before,.uk-card-secondary>:not([class*='uk-card-media']) .uk-grid-divider.uk-grid-stack>.uk-grid-margin::before,.uk-overlay-primary .uk-grid-divider.uk-grid-stack>.uk-grid-margin::before,.uk-offcanvas-bar .uk-grid-divider.uk-grid-stack>.uk-grid-margin::before{border-top-color:rgba(255,255,255,0.2)}.uk-light .uk-close,.uk-section-primary:not(.uk-preserve-color) .uk-close,.uk-section-secondary:not(.uk-preserve-color) .uk-close,.uk-tile-primary:not(.uk-preserve-color) .uk-close,.uk-tile-secondary:not(.uk-preserve-color) .uk-close,.uk-card-primary.uk-card-body .uk-close,.uk-card-primary>:not([class*='uk-card-media']) .uk-close,.uk-card-secondary.uk-card-body .uk-close,.uk-card-secondary>:not([class*='uk-card-media']) .uk-close,.uk-overlay-primary .uk-close,.uk-offcanvas-bar .uk-close{color:rgba(255,255,255,0.5)}.uk-light .uk-close:hover,.uk-section-primary:not(.uk-preserve-color) .uk-close:hover,.uk-section-secondary:not(.uk-preserve-color) .uk-close:hover,.uk-tile-primary:not(.uk-preserve-color) .uk-close:hover,.uk-tile-secondary:not(.uk-preserve-color) .uk-close:hover,.uk-card-primary.uk-card-body .uk-close:hover,.uk-card-primary>:not([class*='uk-card-media']) .uk-close:hover,.uk-card-secondary.uk-card-body .uk-close:hover,.uk-card-secondary>:not([class*='uk-card-media']) .uk-close:hover,.uk-overlay-primary .uk-close:hover,.uk-offcanvas-bar .uk-close:hover,.uk-light .uk-close:focus,.uk-section-primary:not(.uk-preserve-color) .uk-close:focus,.uk-section-secondary:not(.uk-preserve-color) .uk-close:focus,.uk-tile-primary:not(.uk-preserve-color) .uk-close:focus,.uk-tile-secondary:not(.uk-preserve-color) .uk-close:focus,.uk-card-primary.uk-card-body .uk-close:focus,.uk-card-primary>:not([class*='uk-card-media']) .uk-close:focus,.uk-card-secondary.uk-card-body .uk-close:focus,.uk-card-secondary>:not([class*='uk-card-media']) .uk-close:focus,.uk-overlay-primary .uk-close:focus,.uk-offcanvas-bar .uk-close:focus{color:rgba(255,255,255,0.7)}.uk-light .uk-totop,.uk-section-primary:not(.uk-preserve-color) .uk-totop,.uk-section-secondary:not(.uk-preserve-color) .uk-totop,.uk-tile-primary:not(.uk-preserve-color) .uk-totop,.uk-tile-secondary:not(.uk-preserve-color) .uk-totop,.uk-card-primary.uk-card-body .uk-totop,.uk-card-primary>:not([class*='uk-card-media']) .uk-totop,.uk-card-secondary.uk-card-body .uk-totop,.uk-card-secondary>:not([class*='uk-card-media']) .uk-totop,.uk-overlay-primary .uk-totop,.uk-offcanvas-bar .uk-totop{color:rgba(255,255,255,0.5)}.uk-light .uk-totop:hover,.uk-section-primary:not(.uk-preserve-color) .uk-totop:hover,.uk-section-secondary:not(.uk-preserve-color) .uk-totop:hover,.uk-tile-primary:not(.uk-preserve-color) .uk-totop:hover,.uk-tile-secondary:not(.uk-preserve-color) .uk-totop:hover,.uk-card-primary.uk-card-body .uk-totop:hover,.uk-card-primary>:not([class*='uk-card-media']) .uk-totop:hover,.uk-card-secondary.uk-card-body .uk-totop:hover,.uk-card-secondary>:not([class*='uk-card-media']) .uk-totop:hover,.uk-overlay-primary .uk-totop:hover,.uk-offcanvas-bar .uk-totop:hover,.uk-light .uk-totop:focus,.uk-section-primary:not(.uk-preserve-color) .uk-totop:focus,.uk-section-secondary:not(.uk-preserve-color) .uk-totop:focus,.uk-tile-primary:not(.uk-preserve-color) .uk-totop:focus,.uk-tile-secondary:not(.uk-preserve-color) .uk-totop:focus,.uk-card-primary.uk-card-body .uk-totop:focus,.uk-card-primary>:not([class*='uk-card-media']) .uk-totop:focus,.uk-card-secondary.uk-card-body .uk-totop:focus,.uk-card-secondary>:not([class*='uk-card-media']) .uk-totop:focus,.uk-overlay-primary .uk-totop:focus,.uk-offcanvas-bar .uk-totop:focus{color:rgba(255,255,255,0.7)}.uk-light .uk-totop:active,.uk-section-primary:not(.uk-preserve-color) .uk-totop:active,.uk-section-secondary:not(.uk-preserve-color) .uk-totop:active,.uk-tile-primary:not(.uk-preserve-color) .uk-totop:active,.uk-tile-secondary:not(.uk-preserve-color) .uk-totop:active,.uk-card-primary.uk-card-body .uk-totop:active,.uk-card-primary>:not([class*='uk-card-media']) .uk-totop:active,.uk-card-secondary.uk-card-body .uk-totop:active,.uk-card-secondary>:not([class*='uk-card-media']) .uk-totop:active,.uk-overlay-primary .uk-totop:active,.uk-offcanvas-bar .uk-totop:active{color:#fff}.uk-light .uk-badge,.uk-section-primary:not(.uk-preserve-color) .uk-badge,.uk-section-secondary:not(.uk-preserve-color) .uk-badge,.uk-tile-primary:not(.uk-preserve-color) .uk-badge,.uk-tile-secondary:not(.uk-preserve-color) .uk-badge,.uk-card-primary.uk-card-body .uk-badge,.uk-card-primary>:not([class*='uk-card-media']) .uk-badge,.uk-card-secondary.uk-card-body .uk-badge,.uk-card-secondary>:not([class*='uk-card-media']) .uk-badge,.uk-overlay-primary .uk-badge,.uk-offcanvas-bar .uk-badge{background-color:#fff;color:#666}.uk-light .uk-badge:hover,.uk-section-primary:not(.uk-preserve-color) .uk-badge:hover,.uk-section-secondary:not(.uk-preserve-color) .uk-badge:hover,.uk-tile-primary:not(.uk-preserve-color) .uk-badge:hover,.uk-tile-secondary:not(.uk-preserve-color) .uk-badge:hover,.uk-card-primary.uk-card-body .uk-badge:hover,.uk-card-primary>:not([class*='uk-card-media']) .uk-badge:hover,.uk-card-secondary.uk-card-body .uk-badge:hover,.uk-card-secondary>:not([class*='uk-card-media']) .uk-badge:hover,.uk-overlay-primary .uk-badge:hover,.uk-offcanvas-bar .uk-badge:hover,.uk-light .uk-badge:focus,.uk-section-primary:not(.uk-preserve-color) .uk-badge:focus,.uk-section-secondary:not(.uk-preserve-color) .uk-badge:focus,.uk-tile-primary:not(.uk-preserve-color) .uk-badge:focus,.uk-tile-secondary:not(.uk-preserve-color) .uk-badge:focus,.uk-card-primary.uk-card-body .uk-badge:focus,.uk-card-primary>:not([class*='uk-card-media']) .uk-badge:focus,.uk-card-secondary.uk-card-body .uk-badge:focus,.uk-card-secondary>:not([class*='uk-card-media']) .uk-badge:focus,.uk-overlay-primary .uk-badge:focus,.uk-offcanvas-bar .uk-badge:focus{color:#666}.uk-light .uk-label,.uk-section-primary:not(.uk-preserve-color) .uk-label,.uk-section-secondary:not(.uk-preserve-color) .uk-label,.uk-tile-primary:not(.uk-preserve-color) .uk-label,.uk-tile-secondary:not(.uk-preserve-color) .uk-label,.uk-card-primary.uk-card-body .uk-label,.uk-card-primary>:not([class*='uk-card-media']) .uk-label,.uk-card-secondary.uk-card-body .uk-label,.uk-card-secondary>:not([class*='uk-card-media']) .uk-label,.uk-overlay-primary .uk-label,.uk-offcanvas-bar .uk-label{background-color:#fff;color:#666}.uk-light .uk-article-meta,.uk-section-primary:not(.uk-preserve-color) .uk-article-meta,.uk-section-secondary:not(.uk-preserve-color) .uk-article-meta,.uk-tile-primary:not(.uk-preserve-color) .uk-article-meta,.uk-tile-secondary:not(.uk-preserve-color) .uk-article-meta,.uk-card-primary.uk-card-body .uk-article-meta,.uk-card-primary>:not([class*='uk-card-media']) .uk-article-meta,.uk-card-secondary.uk-card-body .uk-article-meta,.uk-card-secondary>:not([class*='uk-card-media']) .uk-article-meta,.uk-overlay-primary .uk-article-meta,.uk-offcanvas-bar .uk-article-meta{color:rgba(255,255,255,0.5)}.uk-light .uk-search-input,.uk-section-primary:not(.uk-preserve-color) .uk-search-input,.uk-section-secondary:not(.uk-preserve-color) .uk-search-input,.uk-tile-primary:not(.uk-preserve-color) .uk-search-input,.uk-tile-secondary:not(.uk-preserve-color) .uk-search-input,.uk-card-primary.uk-card-body .uk-search-input,.uk-card-primary>:not([class*='uk-card-media']) .uk-search-input,.uk-card-secondary.uk-card-body .uk-search-input,.uk-card-secondary>:not([class*='uk-card-media']) .uk-search-input,.uk-overlay-primary .uk-search-input,.uk-offcanvas-bar .uk-search-input{color:rgba(255,255,255,0.7)}.uk-light .uk-search-input:-ms-input-placeholder,.uk-section-primary:not(.uk-preserve-color) .uk-search-input:-ms-input-placeholder,.uk-section-secondary:not(.uk-preserve-color) .uk-search-input:-ms-input-placeholder,.uk-tile-primary:not(.uk-preserve-color) .uk-search-input:-ms-input-placeholder,.uk-tile-secondary:not(.uk-preserve-color) .uk-search-input:-ms-input-placeholder,.uk-card-primary.uk-card-body .uk-search-input:-ms-input-placeholder,.uk-card-primary>:not([class*='uk-card-media']) .uk-search-input:-ms-input-placeholder,.uk-card-secondary.uk-card-body .uk-search-input:-ms-input-placeholder,.uk-card-secondary>:not([class*='uk-card-media']) .uk-search-input:-ms-input-placeholder,.uk-overlay-primary .uk-search-input:-ms-input-placeholder,.uk-offcanvas-bar .uk-search-input:-ms-input-placeholder{color:rgba(255,255,255,0.5) !important}.uk-light .uk-search-input::placeholder,.uk-section-primary:not(.uk-preserve-color) .uk-search-input::placeholder,.uk-section-secondary:not(.uk-preserve-color) .uk-search-input::placeholder,.uk-tile-primary:not(.uk-preserve-color) .uk-search-input::placeholder,.uk-tile-secondary:not(.uk-preserve-color) .uk-search-input::placeholder,.uk-card-primary.uk-card-body .uk-search-input::placeholder,.uk-card-primary>:not([class*='uk-card-media']) .uk-search-input::placeholder,.uk-card-secondary.uk-card-body .uk-search-input::placeholder,.uk-card-secondary>:not([class*='uk-card-media']) .uk-search-input::placeholder,.uk-overlay-primary .uk-search-input::placeholder,.uk-offcanvas-bar .uk-search-input::placeholder{color:rgba(255,255,255,0.5)}.uk-light .uk-search .uk-search-icon,.uk-section-primary:not(.uk-preserve-color) .uk-search .uk-search-icon,.uk-section-secondary:not(.uk-preserve-color) .uk-search .uk-search-icon,.uk-tile-primary:not(.uk-preserve-color) .uk-search .uk-search-icon,.uk-tile-secondary:not(.uk-preserve-color) .uk-search .uk-search-icon,.uk-card-primary.uk-card-body .uk-search .uk-search-icon,.uk-card-primary>:not([class*='uk-card-media']) .uk-search .uk-search-icon,.uk-card-secondary.uk-card-body .uk-search .uk-search-icon,.uk-card-secondary>:not([class*='uk-card-media']) .uk-search .uk-search-icon,.uk-overlay-primary .uk-search .uk-search-icon,.uk-offcanvas-bar .uk-search .uk-search-icon{color:rgba(255,255,255,0.5)}.uk-light .uk-search .uk-search-icon:hover,.uk-section-primary:not(.uk-preserve-color) .uk-search .uk-search-icon:hover,.uk-section-secondary:not(.uk-preserve-color) .uk-search .uk-search-icon:hover,.uk-tile-primary:not(.uk-preserve-color) .uk-search .uk-search-icon:hover,.uk-tile-secondary:not(.uk-preserve-color) .uk-search .uk-search-icon:hover,.uk-card-primary.uk-card-body .uk-search .uk-search-icon:hover,.uk-card-primary>:not([class*='uk-card-media']) .uk-search .uk-search-icon:hover,.uk-card-secondary.uk-card-body .uk-search .uk-search-icon:hover,.uk-card-secondary>:not([class*='uk-card-media']) .uk-search .uk-search-icon:hover,.uk-overlay-primary .uk-search .uk-search-icon:hover,.uk-offcanvas-bar .uk-search .uk-search-icon:hover{color:rgba(255,255,255,0.5)}.uk-light .uk-search-default .uk-search-input,.uk-section-primary:not(.uk-preserve-color) .uk-search-default .uk-search-input,.uk-section-secondary:not(.uk-preserve-color) .uk-search-default .uk-search-input,.uk-tile-primary:not(.uk-preserve-color) .uk-search-default .uk-search-input,.uk-tile-secondary:not(.uk-preserve-color) .uk-search-default .uk-search-input,.uk-card-primary.uk-card-body .uk-search-default .uk-search-input,.uk-card-primary>:not([class*='uk-card-media']) .uk-search-default .uk-search-input,.uk-card-secondary.uk-card-body .uk-search-default .uk-search-input,.uk-card-secondary>:not([class*='uk-card-media']) .uk-search-default .uk-search-input,.uk-overlay-primary .uk-search-default .uk-search-input,.uk-offcanvas-bar .uk-search-default .uk-search-input{background-color:rgba(0,0,0,0);border-color:rgba(255,255,255,0.2)}.uk-light .uk-search-default .uk-search-input:focus,.uk-section-primary:not(.uk-preserve-color) .uk-search-default .uk-search-input:focus,.uk-section-secondary:not(.uk-preserve-color) .uk-search-default .uk-search-input:focus,.uk-tile-primary:not(.uk-preserve-color) .uk-search-default .uk-search-input:focus,.uk-tile-secondary:not(.uk-preserve-color) .uk-search-default .uk-search-input:focus,.uk-card-primary.uk-card-body .uk-search-default .uk-search-input:focus,.uk-card-primary>:not([class*='uk-card-media']) .uk-search-default .uk-search-input:focus,.uk-card-secondary.uk-card-body .uk-search-default .uk-search-input:focus,.uk-card-secondary>:not([class*='uk-card-media']) .uk-search-default .uk-search-input:focus,.uk-overlay-primary .uk-search-default .uk-search-input:focus,.uk-offcanvas-bar .uk-search-default .uk-search-input:focus{background-color:rgba(0,0,0,0)}.uk-light .uk-search-navbar .uk-search-input,.uk-section-primary:not(.uk-preserve-color) .uk-search-navbar .uk-search-input,.uk-section-secondary:not(.uk-preserve-color) .uk-search-navbar .uk-search-input,.uk-tile-primary:not(.uk-preserve-color) .uk-search-navbar .uk-search-input,.uk-tile-secondary:not(.uk-preserve-color) .uk-search-navbar .uk-search-input,.uk-card-primary.uk-card-body .uk-search-navbar .uk-search-input,.uk-card-primary>:not([class*='uk-card-media']) .uk-search-navbar .uk-search-input,.uk-card-secondary.uk-card-body .uk-search-navbar .uk-search-input,.uk-card-secondary>:not([class*='uk-card-media']) .uk-search-navbar .uk-search-input,.uk-overlay-primary .uk-search-navbar .uk-search-input,.uk-offcanvas-bar .uk-search-navbar .uk-search-input{background-color:rgba(0,0,0,0)}.uk-light .uk-search-large .uk-search-input,.uk-section-primary:not(.uk-preserve-color) .uk-search-large .uk-search-input,.uk-section-secondary:not(.uk-preserve-color) .uk-search-large .uk-search-input,.uk-tile-primary:not(.uk-preserve-color) .uk-search-large .uk-search-input,.uk-tile-secondary:not(.uk-preserve-color) .uk-search-large .uk-search-input,.uk-card-primary.uk-card-body .uk-search-large .uk-search-input,.uk-card-primary>:not([class*='uk-card-media']) .uk-search-large .uk-search-input,.uk-card-secondary.uk-card-body .uk-search-large .uk-search-input,.uk-card-secondary>:not([class*='uk-card-media']) .uk-search-large .uk-search-input,.uk-overlay-primary .uk-search-large .uk-search-input,.uk-offcanvas-bar .uk-search-large .uk-search-input{background-color:rgba(0,0,0,0)}.uk-light .uk-search-toggle,.uk-section-primary:not(.uk-preserve-color) .uk-search-toggle,.uk-section-secondary:not(.uk-preserve-color) .uk-search-toggle,.uk-tile-primary:not(.uk-preserve-color) .uk-search-toggle,.uk-tile-secondary:not(.uk-preserve-color) .uk-search-toggle,.uk-card-primary.uk-card-body .uk-search-toggle,.uk-card-primary>:not([class*='uk-card-media']) .uk-search-toggle,.uk-card-secondary.uk-card-body .uk-search-toggle,.uk-card-secondary>:not([class*='uk-card-media']) .uk-search-toggle,.uk-overlay-primary .uk-search-toggle,.uk-offcanvas-bar .uk-search-toggle{color:rgba(255,255,255,0.5)}.uk-light .uk-search-toggle:hover,.uk-section-primary:not(.uk-preserve-color) .uk-search-toggle:hover,.uk-section-secondary:not(.uk-preserve-color) .uk-search-toggle:hover,.uk-tile-primary:not(.uk-preserve-color) .uk-search-toggle:hover,.uk-tile-secondary:not(.uk-preserve-color) .uk-search-toggle:hover,.uk-card-primary.uk-card-body .uk-search-toggle:hover,.uk-card-primary>:not([class*='uk-card-media']) .uk-search-toggle:hover,.uk-card-secondary.uk-card-body .uk-search-toggle:hover,.uk-card-secondary>:not([class*='uk-card-media']) .uk-search-toggle:hover,.uk-overlay-primary .uk-search-toggle:hover,.uk-offcanvas-bar .uk-search-toggle:hover,.uk-light .uk-search-toggle:focus,.uk-section-primary:not(.uk-preserve-color) .uk-search-toggle:focus,.uk-section-secondary:not(.uk-preserve-color) .uk-search-toggle:focus,.uk-tile-primary:not(.uk-preserve-color) .uk-search-toggle:focus,.uk-tile-secondary:not(.uk-preserve-color) .uk-search-toggle:focus,.uk-card-primary.uk-card-body .uk-search-toggle:focus,.uk-card-primary>:not([class*='uk-card-media']) .uk-search-toggle:focus,.uk-card-secondary.uk-card-body .uk-search-toggle:focus,.uk-card-secondary>:not([class*='uk-card-media']) .uk-search-toggle:focus,.uk-overlay-primary .uk-search-toggle:focus,.uk-offcanvas-bar .uk-search-toggle:focus{color:rgba(255,255,255,0.7)}.uk-light .uk-nav-parent-icon>.uk-parent>a::after,.uk-section-primary:not(.uk-preserve-color) .uk-nav-parent-icon>.uk-parent>a::after,.uk-section-secondary:not(.uk-preserve-color) .uk-nav-parent-icon>.uk-parent>a::after,.uk-tile-primary:not(.uk-preserve-color) .uk-nav-parent-icon>.uk-parent>a::after,.uk-tile-secondary:not(.uk-preserve-color) .uk-nav-parent-icon>.uk-parent>a::after,.uk-card-primary.uk-card-body .uk-nav-parent-icon>.uk-parent>a::after,.uk-card-primary>:not([class*='uk-card-media']) .uk-nav-parent-icon>.uk-parent>a::after,.uk-card-secondary.uk-card-body .uk-nav-parent-icon>.uk-parent>a::after,.uk-card-secondary>:not([class*='uk-card-media']) .uk-nav-parent-icon>.uk-parent>a::after,.uk-overlay-primary .uk-nav-parent-icon>.uk-parent>a::after,.uk-offcanvas-bar .uk-nav-parent-icon>.uk-parent>a::after{background-image:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D%2214%22%20height%3D%2214%22%20viewBox%3D%220%200%2014%2014%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%20%20%20%20%3Cpolyline%20fill%3D%22none%22%20stroke%3D%22rgba(255,255,255,0.7)%22%20stroke-width%3D%221.1%22%20points%3D%2210%201%204%207%2010%2013%22%20%2F%3E%0A%3C%2Fsvg%3E")}.uk-light .uk-nav-parent-icon>.uk-parent.uk-open>a::after,.uk-section-primary:not(.uk-preserve-color) .uk-nav-parent-icon>.uk-parent.uk-open>a::after,.uk-section-secondary:not(.uk-preserve-color) .uk-nav-parent-icon>.uk-parent.uk-open>a::after,.uk-tile-primary:not(.uk-preserve-color) .uk-nav-parent-icon>.uk-parent.uk-open>a::after,.uk-tile-secondary:not(.uk-preserve-color) .uk-nav-parent-icon>.uk-parent.uk-open>a::after,.uk-card-primary.uk-card-body .uk-nav-parent-icon>.uk-parent.uk-open>a::after,.uk-card-primary>:not([class*='uk-card-media']) .uk-nav-parent-icon>.uk-parent.uk-open>a::after,.uk-card-secondary.uk-card-body .uk-nav-parent-icon>.uk-parent.uk-open>a::after,.uk-card-secondary>:not([class*='uk-card-media']) .uk-nav-parent-icon>.uk-parent.uk-open>a::after,.uk-overlay-primary .uk-nav-parent-icon>.uk-parent.uk-open>a::after,.uk-offcanvas-bar .uk-nav-parent-icon>.uk-parent.uk-open>a::after{background-image:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D%2214%22%20height%3D%2214%22%20viewBox%3D%220%200%2014%2014%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%20%20%20%20%3Cpolyline%20fill%3D%22none%22%20stroke%3D%22rgba(255,255,255,0.7)%22%20stroke-width%3D%221.1%22%20points%3D%221%204%207%2010%2013%204%22%20%2F%3E%0A%3C%2Fsvg%3E")}.uk-light .uk-nav-default>li>a,.uk-section-primary:not(.uk-preserve-color) .uk-nav-default>li>a,.uk-section-secondary:not(.uk-preserve-color) .uk-nav-default>li>a,.uk-tile-primary:not(.uk-preserve-color) .uk-nav-default>li>a,.uk-tile-secondary:not(.uk-preserve-color) .uk-nav-default>li>a,.uk-card-primary.uk-card-body .uk-nav-default>li>a,.uk-card-primary>:not([class*='uk-card-media']) .uk-nav-default>li>a,.uk-card-secondary.uk-card-body .uk-nav-default>li>a,.uk-card-secondary>:not([class*='uk-card-media']) .uk-nav-default>li>a,.uk-overlay-primary .uk-nav-default>li>a,.uk-offcanvas-bar .uk-nav-default>li>a{color:rgba(255,255,255,0.5)}.uk-light .uk-nav-default>li>a:hover,.uk-section-primary:not(.uk-preserve-color) .uk-nav-default>li>a:hover,.uk-section-secondary:not(.uk-preserve-color) .uk-nav-default>li>a:hover,.uk-tile-primary:not(.uk-preserve-color) .uk-nav-default>li>a:hover,.uk-tile-secondary:not(.uk-preserve-color) .uk-nav-default>li>a:hover,.uk-card-primary.uk-card-body .uk-nav-default>li>a:hover,.uk-card-primary>:not([class*='uk-card-media']) .uk-nav-default>li>a:hover,.uk-card-secondary.uk-card-body .uk-nav-default>li>a:hover,.uk-card-secondary>:not([class*='uk-card-media']) .uk-nav-default>li>a:hover,.uk-overlay-primary .uk-nav-default>li>a:hover,.uk-offcanvas-bar .uk-nav-default>li>a:hover,.uk-light .uk-nav-default>li>a:focus,.uk-section-primary:not(.uk-preserve-color) .uk-nav-default>li>a:focus,.uk-section-secondary:not(.uk-preserve-color) .uk-nav-default>li>a:focus,.uk-tile-primary:not(.uk-preserve-color) .uk-nav-default>li>a:focus,.uk-tile-secondary:not(.uk-preserve-color) .uk-nav-default>li>a:focus,.uk-card-primary.uk-card-body .uk-nav-default>li>a:focus,.uk-card-primary>:not([class*='uk-card-media']) .uk-nav-default>li>a:focus,.uk-card-secondary.uk-card-body .uk-nav-default>li>a:focus,.uk-card-secondary>:not([class*='uk-card-media']) .uk-nav-default>li>a:focus,.uk-overlay-primary .uk-nav-default>li>a:focus,.uk-offcanvas-bar .uk-nav-default>li>a:focus{color:rgba(255,255,255,0.7)}.uk-light .uk-nav-default>li.uk-active>a,.uk-section-primary:not(.uk-preserve-color) .uk-nav-default>li.uk-active>a,.uk-section-secondary:not(.uk-preserve-color) .uk-nav-default>li.uk-active>a,.uk-tile-primary:not(.uk-preserve-color) .uk-nav-default>li.uk-active>a,.uk-tile-secondary:not(.uk-preserve-color) .uk-nav-default>li.uk-active>a,.uk-card-primary.uk-card-body .uk-nav-default>li.uk-active>a,.uk-card-primary>:not([class*='uk-card-media']) .uk-nav-default>li.uk-active>a,.uk-card-secondary.uk-card-body .uk-nav-default>li.uk-active>a,.uk-card-secondary>:not([class*='uk-card-media']) .uk-nav-default>li.uk-active>a,.uk-overlay-primary .uk-nav-default>li.uk-active>a,.uk-offcanvas-bar .uk-nav-default>li.uk-active>a{color:#fff}.uk-light .uk-nav-default .uk-nav-header,.uk-section-primary:not(.uk-preserve-color) .uk-nav-default .uk-nav-header,.uk-section-secondary:not(.uk-preserve-color) .uk-nav-default .uk-nav-header,.uk-tile-primary:not(.uk-preserve-color) .uk-nav-default .uk-nav-header,.uk-tile-secondary:not(.uk-preserve-color) .uk-nav-default .uk-nav-header,.uk-card-primary.uk-card-body .uk-nav-default .uk-nav-header,.uk-card-primary>:not([class*='uk-card-media']) .uk-nav-default .uk-nav-header,.uk-card-secondary.uk-card-body .uk-nav-default .uk-nav-header,.uk-card-secondary>:not([class*='uk-card-media']) .uk-nav-default .uk-nav-header,.uk-overlay-primary .uk-nav-default .uk-nav-header,.uk-offcanvas-bar .uk-nav-default .uk-nav-header{color:#fff}.uk-light .uk-nav-default .uk-nav-divider,.uk-section-primary:not(.uk-preserve-color) .uk-nav-default .uk-nav-divider,.uk-section-secondary:not(.uk-preserve-color) .uk-nav-default .uk-nav-divider,.uk-tile-primary:not(.uk-preserve-color) .uk-nav-default .uk-nav-divider,.uk-tile-secondary:not(.uk-preserve-color) .uk-nav-default .uk-nav-divider,.uk-card-primary.uk-card-body .uk-nav-default .uk-nav-divider,.uk-card-primary>:not([class*='uk-card-media']) .uk-nav-default .uk-nav-divider,.uk-card-secondary.uk-card-body .uk-nav-default .uk-nav-divider,.uk-card-secondary>:not([class*='uk-card-media']) .uk-nav-default .uk-nav-divider,.uk-overlay-primary .uk-nav-default .uk-nav-divider,.uk-offcanvas-bar .uk-nav-default .uk-nav-divider{border-top-color:rgba(255,255,255,0.2)}.uk-light .uk-nav-default .uk-nav-sub a,.uk-section-primary:not(.uk-preserve-color) .uk-nav-default .uk-nav-sub a,.uk-section-secondary:not(.uk-preserve-color) .uk-nav-default .uk-nav-sub a,.uk-tile-primary:not(.uk-preserve-color) .uk-nav-default .uk-nav-sub a,.uk-tile-secondary:not(.uk-preserve-color) .uk-nav-default .uk-nav-sub a,.uk-card-primary.uk-card-body .uk-nav-default .uk-nav-sub a,.uk-card-primary>:not([class*='uk-card-media']) .uk-nav-default .uk-nav-sub a,.uk-card-secondary.uk-card-body .uk-nav-default .uk-nav-sub a,.uk-card-secondary>:not([class*='uk-card-media']) .uk-nav-default .uk-nav-sub a,.uk-overlay-primary .uk-nav-default .uk-nav-sub a,.uk-offcanvas-bar .uk-nav-default .uk-nav-sub a{color:rgba(255,255,255,0.5)}.uk-light .uk-nav-default .uk-nav-sub a:hover,.uk-section-primary:not(.uk-preserve-color) .uk-nav-default .uk-nav-sub a:hover,.uk-section-secondary:not(.uk-preserve-color) .uk-nav-default .uk-nav-sub a:hover,.uk-tile-primary:not(.uk-preserve-color) .uk-nav-default .uk-nav-sub a:hover,.uk-tile-secondary:not(.uk-preserve-color) .uk-nav-default .uk-nav-sub a:hover,.uk-card-primary.uk-card-body .uk-nav-default .uk-nav-sub a:hover,.uk-card-primary>:not([class*='uk-card-media']) .uk-nav-default .uk-nav-sub a:hover,.uk-card-secondary.uk-card-body .uk-nav-default .uk-nav-sub a:hover,.uk-card-secondary>:not([class*='uk-card-media']) .uk-nav-default .uk-nav-sub a:hover,.uk-overlay-primary .uk-nav-default .uk-nav-sub a:hover,.uk-offcanvas-bar .uk-nav-default .uk-nav-sub a:hover,.uk-light .uk-nav-default .uk-nav-sub a:focus,.uk-section-primary:not(.uk-preserve-color) .uk-nav-default .uk-nav-sub a:focus,.uk-section-secondary:not(.uk-preserve-color) .uk-nav-default .uk-nav-sub a:focus,.uk-tile-primary:not(.uk-preserve-color) .uk-nav-default .uk-nav-sub a:focus,.uk-tile-secondary:not(.uk-preserve-color) .uk-nav-default .uk-nav-sub a:focus,.uk-card-primary.uk-card-body .uk-nav-default .uk-nav-sub a:focus,.uk-card-primary>:not([class*='uk-card-media']) .uk-nav-default .uk-nav-sub a:focus,.uk-card-secondary.uk-card-body .uk-nav-default .uk-nav-sub a:focus,.uk-card-secondary>:not([class*='uk-card-media']) .uk-nav-default .uk-nav-sub a:focus,.uk-overlay-primary .uk-nav-default .uk-nav-sub a:focus,.uk-offcanvas-bar .uk-nav-default .uk-nav-sub a:focus{color:rgba(255,255,255,0.7)}.uk-light .uk-nav-primary>li>a,.uk-section-primary:not(.uk-preserve-color) .uk-nav-primary>li>a,.uk-section-secondary:not(.uk-preserve-color) .uk-nav-primary>li>a,.uk-tile-primary:not(.uk-preserve-color) .uk-nav-primary>li>a,.uk-tile-secondary:not(.uk-preserve-color) .uk-nav-primary>li>a,.uk-card-primary.uk-card-body .uk-nav-primary>li>a,.uk-card-primary>:not([class*='uk-card-media']) .uk-nav-primary>li>a,.uk-card-secondary.uk-card-body .uk-nav-primary>li>a,.uk-card-secondary>:not([class*='uk-card-media']) .uk-nav-primary>li>a,.uk-overlay-primary .uk-nav-primary>li>a,.uk-offcanvas-bar .uk-nav-primary>li>a{color:rgba(255,255,255,0.5)}.uk-light .uk-nav-primary>li>a:hover,.uk-section-primary:not(.uk-preserve-color) .uk-nav-primary>li>a:hover,.uk-section-secondary:not(.uk-preserve-color) .uk-nav-primary>li>a:hover,.uk-tile-primary:not(.uk-preserve-color) .uk-nav-primary>li>a:hover,.uk-tile-secondary:not(.uk-preserve-color) .uk-nav-primary>li>a:hover,.uk-card-primary.uk-card-body .uk-nav-primary>li>a:hover,.uk-card-primary>:not([class*='uk-card-media']) .uk-nav-primary>li>a:hover,.uk-card-secondary.uk-card-body .uk-nav-primary>li>a:hover,.uk-card-secondary>:not([class*='uk-card-media']) .uk-nav-primary>li>a:hover,.uk-overlay-primary .uk-nav-primary>li>a:hover,.uk-offcanvas-bar .uk-nav-primary>li>a:hover,.uk-light .uk-nav-primary>li>a:focus,.uk-section-primary:not(.uk-preserve-color) .uk-nav-primary>li>a:focus,.uk-section-secondary:not(.uk-preserve-color) .uk-nav-primary>li>a:focus,.uk-tile-primary:not(.uk-preserve-color) .uk-nav-primary>li>a:focus,.uk-tile-secondary:not(.uk-preserve-color) .uk-nav-primary>li>a:focus,.uk-card-primary.uk-card-body .uk-nav-primary>li>a:focus,.uk-card-primary>:not([class*='uk-card-media']) .uk-nav-primary>li>a:focus,.uk-card-secondary.uk-card-body .uk-nav-primary>li>a:focus,.uk-card-secondary>:not([class*='uk-card-media']) .uk-nav-primary>li>a:focus,.uk-overlay-primary .uk-nav-primary>li>a:focus,.uk-offcanvas-bar .uk-nav-primary>li>a:focus{color:rgba(255,255,255,0.7)}.uk-light .uk-nav-primary>li.uk-active>a,.uk-section-primary:not(.uk-preserve-color) .uk-nav-primary>li.uk-active>a,.uk-section-secondary:not(.uk-preserve-color) .uk-nav-primary>li.uk-active>a,.uk-tile-primary:not(.uk-preserve-color) .uk-nav-primary>li.uk-active>a,.uk-tile-secondary:not(.uk-preserve-color) .uk-nav-primary>li.uk-active>a,.uk-card-primary.uk-card-body .uk-nav-primary>li.uk-active>a,.uk-card-primary>:not([class*='uk-card-media']) .uk-nav-primary>li.uk-active>a,.uk-card-secondary.uk-card-body .uk-nav-primary>li.uk-active>a,.uk-card-secondary>:not([class*='uk-card-media']) .uk-nav-primary>li.uk-active>a,.uk-overlay-primary .uk-nav-primary>li.uk-active>a,.uk-offcanvas-bar .uk-nav-primary>li.uk-active>a{color:#fff}.uk-light .uk-nav-primary .uk-nav-header,.uk-section-primary:not(.uk-preserve-color) .uk-nav-primary .uk-nav-header,.uk-section-secondary:not(.uk-preserve-color) .uk-nav-primary .uk-nav-header,.uk-tile-primary:not(.uk-preserve-color) .uk-nav-primary .uk-nav-header,.uk-tile-secondary:not(.uk-preserve-color) .uk-nav-primary .uk-nav-header,.uk-card-primary.uk-card-body .uk-nav-primary .uk-nav-header,.uk-card-primary>:not([class*='uk-card-media']) .uk-nav-primary .uk-nav-header,.uk-card-secondary.uk-card-body .uk-nav-primary .uk-nav-header,.uk-card-secondary>:not([class*='uk-card-media']) .uk-nav-primary .uk-nav-header,.uk-overlay-primary .uk-nav-primary .uk-nav-header,.uk-offcanvas-bar .uk-nav-primary .uk-nav-header{color:#fff}.uk-light .uk-nav-primary .uk-nav-divider,.uk-section-primary:not(.uk-preserve-color) .uk-nav-primary .uk-nav-divider,.uk-section-secondary:not(.uk-preserve-color) .uk-nav-primary .uk-nav-divider,.uk-tile-primary:not(.uk-preserve-color) .uk-nav-primary .uk-nav-divider,.uk-tile-secondary:not(.uk-preserve-color) .uk-nav-primary .uk-nav-divider,.uk-card-primary.uk-card-body .uk-nav-primary .uk-nav-divider,.uk-card-primary>:not([class*='uk-card-media']) .uk-nav-primary .uk-nav-divider,.uk-card-secondary.uk-card-body .uk-nav-primary .uk-nav-divider,.uk-card-secondary>:not([class*='uk-card-media']) .uk-nav-primary .uk-nav-divider,.uk-overlay-primary .uk-nav-primary .uk-nav-divider,.uk-offcanvas-bar .uk-nav-primary .uk-nav-divider{border-top-color:rgba(255,255,255,0.2)}.uk-light .uk-nav-primary .uk-nav-sub a,.uk-section-primary:not(.uk-preserve-color) .uk-nav-primary .uk-nav-sub a,.uk-section-secondary:not(.uk-preserve-color) .uk-nav-primary .uk-nav-sub a,.uk-tile-primary:not(.uk-preserve-color) .uk-nav-primary .uk-nav-sub a,.uk-tile-secondary:not(.uk-preserve-color) .uk-nav-primary .uk-nav-sub a,.uk-card-primary.uk-card-body .uk-nav-primary .uk-nav-sub a,.uk-card-primary>:not([class*='uk-card-media']) .uk-nav-primary .uk-nav-sub a,.uk-card-secondary.uk-card-body .uk-nav-primary .uk-nav-sub a,.uk-card-secondary>:not([class*='uk-card-media']) .uk-nav-primary .uk-nav-sub a,.uk-overlay-primary .uk-nav-primary .uk-nav-sub a,.uk-offcanvas-bar .uk-nav-primary .uk-nav-sub a{color:rgba(255,255,255,0.5)}.uk-light .uk-nav-primary .uk-nav-sub a:hover,.uk-section-primary:not(.uk-preserve-color) .uk-nav-primary .uk-nav-sub a:hover,.uk-section-secondary:not(.uk-preserve-color) .uk-nav-primary .uk-nav-sub a:hover,.uk-tile-primary:not(.uk-preserve-color) .uk-nav-primary .uk-nav-sub a:hover,.uk-tile-secondary:not(.uk-preserve-color) .uk-nav-primary .uk-nav-sub a:hover,.uk-card-primary.uk-card-body .uk-nav-primary .uk-nav-sub a:hover,.uk-card-primary>:not([class*='uk-card-media']) .uk-nav-primary .uk-nav-sub a:hover,.uk-card-secondary.uk-card-body .uk-nav-primary .uk-nav-sub a:hover,.uk-card-secondary>:not([class*='uk-card-media']) .uk-nav-primary .uk-nav-sub a:hover,.uk-overlay-primary .uk-nav-primary .uk-nav-sub a:hover,.uk-offcanvas-bar .uk-nav-primary .uk-nav-sub a:hover,.uk-light .uk-nav-primary .uk-nav-sub a:focus,.uk-section-primary:not(.uk-preserve-color) .uk-nav-primary .uk-nav-sub a:focus,.uk-section-secondary:not(.uk-preserve-color) .uk-nav-primary .uk-nav-sub a:focus,.uk-tile-primary:not(.uk-preserve-color) .uk-nav-primary .uk-nav-sub a:focus,.uk-tile-secondary:not(.uk-preserve-color) .uk-nav-primary .uk-nav-sub a:focus,.uk-card-primary.uk-card-body .uk-nav-primary .uk-nav-sub a:focus,.uk-card-primary>:not([class*='uk-card-media']) .uk-nav-primary .uk-nav-sub a:focus,.uk-card-secondary.uk-card-body .uk-nav-primary .uk-nav-sub a:focus,.uk-card-secondary>:not([class*='uk-card-media']) .uk-nav-primary .uk-nav-sub a:focus,.uk-overlay-primary .uk-nav-primary .uk-nav-sub a:focus,.uk-offcanvas-bar .uk-nav-primary .uk-nav-sub a:focus{color:rgba(255,255,255,0.7)}.uk-light .uk-navbar-nav>li>a,.uk-section-primary:not(.uk-preserve-color) .uk-navbar-nav>li>a,.uk-section-secondary:not(.uk-preserve-color) .uk-navbar-nav>li>a,.uk-tile-primary:not(.uk-preserve-color) .uk-navbar-nav>li>a,.uk-tile-secondary:not(.uk-preserve-color) .uk-navbar-nav>li>a,.uk-card-primary.uk-card-body .uk-navbar-nav>li>a,.uk-card-primary>:not([class*='uk-card-media']) .uk-navbar-nav>li>a,.uk-card-secondary.uk-card-body .uk-navbar-nav>li>a,.uk-card-secondary>:not([class*='uk-card-media']) .uk-navbar-nav>li>a,.uk-overlay-primary .uk-navbar-nav>li>a,.uk-offcanvas-bar .uk-navbar-nav>li>a{color:rgba(255,255,255,0.5)}.uk-light .uk-navbar-nav>li:hover>a,.uk-section-primary:not(.uk-preserve-color) .uk-navbar-nav>li:hover>a,.uk-section-secondary:not(.uk-preserve-color) .uk-navbar-nav>li:hover>a,.uk-tile-primary:not(.uk-preserve-color) .uk-navbar-nav>li:hover>a,.uk-tile-secondary:not(.uk-preserve-color) .uk-navbar-nav>li:hover>a,.uk-card-primary.uk-card-body .uk-navbar-nav>li:hover>a,.uk-card-primary>:not([class*='uk-card-media']) .uk-navbar-nav>li:hover>a,.uk-card-secondary.uk-card-body .uk-navbar-nav>li:hover>a,.uk-card-secondary>:not([class*='uk-card-media']) .uk-navbar-nav>li:hover>a,.uk-overlay-primary .uk-navbar-nav>li:hover>a,.uk-offcanvas-bar .uk-navbar-nav>li:hover>a,.uk-light .uk-navbar-nav>li>a:focus,.uk-section-primary:not(.uk-preserve-color) .uk-navbar-nav>li>a:focus,.uk-section-secondary:not(.uk-preserve-color) .uk-navbar-nav>li>a:focus,.uk-tile-primary:not(.uk-preserve-color) .uk-navbar-nav>li>a:focus,.uk-tile-secondary:not(.uk-preserve-color) .uk-navbar-nav>li>a:focus,.uk-card-primary.uk-card-body .uk-navbar-nav>li>a:focus,.uk-card-primary>:not([class*='uk-card-media']) .uk-navbar-nav>li>a:focus,.uk-card-secondary.uk-card-body .uk-navbar-nav>li>a:focus,.uk-card-secondary>:not([class*='uk-card-media']) .uk-navbar-nav>li>a:focus,.uk-overlay-primary .uk-navbar-nav>li>a:focus,.uk-offcanvas-bar .uk-navbar-nav>li>a:focus,.uk-light .uk-navbar-nav>li>a.uk-open,.uk-section-primary:not(.uk-preserve-color) .uk-navbar-nav>li>a.uk-open,.uk-section-secondary:not(.uk-preserve-color) .uk-navbar-nav>li>a.uk-open,.uk-tile-primary:not(.uk-preserve-color) .uk-navbar-nav>li>a.uk-open,.uk-tile-secondary:not(.uk-preserve-color) .uk-navbar-nav>li>a.uk-open,.uk-card-primary.uk-card-body .uk-navbar-nav>li>a.uk-open,.uk-card-primary>:not([class*='uk-card-media']) .uk-navbar-nav>li>a.uk-open,.uk-card-secondary.uk-card-body .uk-navbar-nav>li>a.uk-open,.uk-card-secondary>:not([class*='uk-card-media']) .uk-navbar-nav>li>a.uk-open,.uk-overlay-primary .uk-navbar-nav>li>a.uk-open,.uk-offcanvas-bar .uk-navbar-nav>li>a.uk-open{color:rgba(255,255,255,0.7)}.uk-light .uk-navbar-nav>li>a:active,.uk-section-primary:not(.uk-preserve-color) .uk-navbar-nav>li>a:active,.uk-section-secondary:not(.uk-preserve-color) .uk-navbar-nav>li>a:active,.uk-tile-primary:not(.uk-preserve-color) .uk-navbar-nav>li>a:active,.uk-tile-secondary:not(.uk-preserve-color) .uk-navbar-nav>li>a:active,.uk-card-primary.uk-card-body .uk-navbar-nav>li>a:active,.uk-card-primary>:not([class*='uk-card-media']) .uk-navbar-nav>li>a:active,.uk-card-secondary.uk-card-body .uk-navbar-nav>li>a:active,.uk-card-secondary>:not([class*='uk-card-media']) .uk-navbar-nav>li>a:active,.uk-overlay-primary .uk-navbar-nav>li>a:active,.uk-offcanvas-bar .uk-navbar-nav>li>a:active{color:#fff}.uk-light .uk-navbar-nav>li.uk-active>a,.uk-section-primary:not(.uk-preserve-color) .uk-navbar-nav>li.uk-active>a,.uk-section-secondary:not(.uk-preserve-color) .uk-navbar-nav>li.uk-active>a,.uk-tile-primary:not(.uk-preserve-color) .uk-navbar-nav>li.uk-active>a,.uk-tile-secondary:not(.uk-preserve-color) .uk-navbar-nav>li.uk-active>a,.uk-card-primary.uk-card-body .uk-navbar-nav>li.uk-active>a,.uk-card-primary>:not([class*='uk-card-media']) .uk-navbar-nav>li.uk-active>a,.uk-card-secondary.uk-card-body .uk-navbar-nav>li.uk-active>a,.uk-card-secondary>:not([class*='uk-card-media']) .uk-navbar-nav>li.uk-active>a,.uk-overlay-primary .uk-navbar-nav>li.uk-active>a,.uk-offcanvas-bar .uk-navbar-nav>li.uk-active>a{color:#fff}.uk-light .uk-navbar-item,.uk-section-primary:not(.uk-preserve-color) .uk-navbar-item,.uk-section-secondary:not(.uk-preserve-color) .uk-navbar-item,.uk-tile-primary:not(.uk-preserve-color) .uk-navbar-item,.uk-tile-secondary:not(.uk-preserve-color) .uk-navbar-item,.uk-card-primary.uk-card-body .uk-navbar-item,.uk-card-primary>:not([class*='uk-card-media']) .uk-navbar-item,.uk-card-secondary.uk-card-body .uk-navbar-item,.uk-card-secondary>:not([class*='uk-card-media']) .uk-navbar-item,.uk-overlay-primary .uk-navbar-item,.uk-offcanvas-bar .uk-navbar-item{color:rgba(255,255,255,0.7)}.uk-light .uk-navbar-toggle,.uk-section-primary:not(.uk-preserve-color) .uk-navbar-toggle,.uk-section-secondary:not(.uk-preserve-color) .uk-navbar-toggle,.uk-tile-primary:not(.uk-preserve-color) .uk-navbar-toggle,.uk-tile-secondary:not(.uk-preserve-color) .uk-navbar-toggle,.uk-card-primary.uk-card-body .uk-navbar-toggle,.uk-card-primary>:not([class*='uk-card-media']) .uk-navbar-toggle,.uk-card-secondary.uk-card-body .uk-navbar-toggle,.uk-card-secondary>:not([class*='uk-card-media']) .uk-navbar-toggle,.uk-overlay-primary .uk-navbar-toggle,.uk-offcanvas-bar .uk-navbar-toggle{color:rgba(255,255,255,0.5)}.uk-light .uk-navbar-toggle:hover,.uk-section-primary:not(.uk-preserve-color) .uk-navbar-toggle:hover,.uk-section-secondary:not(.uk-preserve-color) .uk-navbar-toggle:hover,.uk-tile-primary:not(.uk-preserve-color) .uk-navbar-toggle:hover,.uk-tile-secondary:not(.uk-preserve-color) .uk-navbar-toggle:hover,.uk-card-primary.uk-card-body .uk-navbar-toggle:hover,.uk-card-primary>:not([class*='uk-card-media']) .uk-navbar-toggle:hover,.uk-card-secondary.uk-card-body .uk-navbar-toggle:hover,.uk-card-secondary>:not([class*='uk-card-media']) .uk-navbar-toggle:hover,.uk-overlay-primary .uk-navbar-toggle:hover,.uk-offcanvas-bar .uk-navbar-toggle:hover,.uk-light .uk-navbar-toggle:focus,.uk-section-primary:not(.uk-preserve-color) .uk-navbar-toggle:focus,.uk-section-secondary:not(.uk-preserve-color) .uk-navbar-toggle:focus,.uk-tile-primary:not(.uk-preserve-color) .uk-navbar-toggle:focus,.uk-tile-secondary:not(.uk-preserve-color) .uk-navbar-toggle:focus,.uk-card-primary.uk-card-body .uk-navbar-toggle:focus,.uk-card-primary>:not([class*='uk-card-media']) .uk-navbar-toggle:focus,.uk-card-secondary.uk-card-body .uk-navbar-toggle:focus,.uk-card-secondary>:not([class*='uk-card-media']) .uk-navbar-toggle:focus,.uk-overlay-primary .uk-navbar-toggle:focus,.uk-offcanvas-bar .uk-navbar-toggle:focus,.uk-light .uk-navbar-toggle.uk-open,.uk-section-primary:not(.uk-preserve-color) .uk-navbar-toggle.uk-open,.uk-section-secondary:not(.uk-preserve-color) .uk-navbar-toggle.uk-open,.uk-tile-primary:not(.uk-preserve-color) .uk-navbar-toggle.uk-open,.uk-tile-secondary:not(.uk-preserve-color) .uk-navbar-toggle.uk-open,.uk-card-primary.uk-card-body .uk-navbar-toggle.uk-open,.uk-card-primary>:not([class*='uk-card-media']) .uk-navbar-toggle.uk-open,.uk-card-secondary.uk-card-body .uk-navbar-toggle.uk-open,.uk-card-secondary>:not([class*='uk-card-media']) .uk-navbar-toggle.uk-open,.uk-overlay-primary .uk-navbar-toggle.uk-open,.uk-offcanvas-bar .uk-navbar-toggle.uk-open{color:rgba(255,255,255,0.7)}.uk-light .uk-subnav>*>:first-child,.uk-section-primary:not(.uk-preserve-color) .uk-subnav>*>:first-child,.uk-section-secondary:not(.uk-preserve-color) .uk-subnav>*>:first-child,.uk-tile-primary:not(.uk-preserve-color) .uk-subnav>*>:first-child,.uk-tile-secondary:not(.uk-preserve-color) .uk-subnav>*>:first-child,.uk-card-primary.uk-card-body .uk-subnav>*>:first-child,.uk-card-primary>:not([class*='uk-card-media']) .uk-subnav>*>:first-child,.uk-card-secondary.uk-card-body .uk-subnav>*>:first-child,.uk-card-secondary>:not([class*='uk-card-media']) .uk-subnav>*>:first-child,.uk-overlay-primary .uk-subnav>*>:first-child,.uk-offcanvas-bar .uk-subnav>*>:first-child{color:rgba(255,255,255,0.5)}.uk-light .uk-subnav>*>a:hover,.uk-section-primary:not(.uk-preserve-color) .uk-subnav>*>a:hover,.uk-section-secondary:not(.uk-preserve-color) .uk-subnav>*>a:hover,.uk-tile-primary:not(.uk-preserve-color) .uk-subnav>*>a:hover,.uk-tile-secondary:not(.uk-preserve-color) .uk-subnav>*>a:hover,.uk-card-primary.uk-card-body .uk-subnav>*>a:hover,.uk-card-primary>:not([class*='uk-card-media']) .uk-subnav>*>a:hover,.uk-card-secondary.uk-card-body .uk-subnav>*>a:hover,.uk-card-secondary>:not([class*='uk-card-media']) .uk-subnav>*>a:hover,.uk-overlay-primary .uk-subnav>*>a:hover,.uk-offcanvas-bar .uk-subnav>*>a:hover,.uk-light .uk-subnav>*>a:focus,.uk-section-primary:not(.uk-preserve-color) .uk-subnav>*>a:focus,.uk-section-secondary:not(.uk-preserve-color) .uk-subnav>*>a:focus,.uk-tile-primary:not(.uk-preserve-color) .uk-subnav>*>a:focus,.uk-tile-secondary:not(.uk-preserve-color) .uk-subnav>*>a:focus,.uk-card-primary.uk-card-body .uk-subnav>*>a:focus,.uk-card-primary>:not([class*='uk-card-media']) .uk-subnav>*>a:focus,.uk-card-secondary.uk-card-body .uk-subnav>*>a:focus,.uk-card-secondary>:not([class*='uk-card-media']) .uk-subnav>*>a:focus,.uk-overlay-primary .uk-subnav>*>a:focus,.uk-offcanvas-bar .uk-subnav>*>a:focus{color:rgba(255,255,255,0.7)}.uk-light .uk-subnav>.uk-active>a,.uk-section-primary:not(.uk-preserve-color) .uk-subnav>.uk-active>a,.uk-section-secondary:not(.uk-preserve-color) .uk-subnav>.uk-active>a,.uk-tile-primary:not(.uk-preserve-color) .uk-subnav>.uk-active>a,.uk-tile-secondary:not(.uk-preserve-color) .uk-subnav>.uk-active>a,.uk-card-primary.uk-card-body .uk-subnav>.uk-active>a,.uk-card-primary>:not([class*='uk-card-media']) .uk-subnav>.uk-active>a,.uk-card-secondary.uk-card-body .uk-subnav>.uk-active>a,.uk-card-secondary>:not([class*='uk-card-media']) .uk-subnav>.uk-active>a,.uk-overlay-primary .uk-subnav>.uk-active>a,.uk-offcanvas-bar .uk-subnav>.uk-active>a{color:#fff}.uk-light .uk-subnav-divider>:nth-child(n+2):not(.uk-first-column)::before,.uk-section-primary:not(.uk-preserve-color) .uk-subnav-divider>:nth-child(n+2):not(.uk-first-column)::before,.uk-section-secondary:not(.uk-preserve-color) .uk-subnav-divider>:nth-child(n+2):not(.uk-first-column)::before,.uk-tile-primary:not(.uk-preserve-color) .uk-subnav-divider>:nth-child(n+2):not(.uk-first-column)::before,.uk-tile-secondary:not(.uk-preserve-color) .uk-subnav-divider>:nth-child(n+2):not(.uk-first-column)::before,.uk-card-primary.uk-card-body .uk-subnav-divider>:nth-child(n+2):not(.uk-first-column)::before,.uk-card-primary>:not([class*='uk-card-media']) .uk-subnav-divider>:nth-child(n+2):not(.uk-first-column)::before,.uk-card-secondary.uk-card-body .uk-subnav-divider>:nth-child(n+2):not(.uk-first-column)::before,.uk-card-secondary>:not([class*='uk-card-media']) .uk-subnav-divider>:nth-child(n+2):not(.uk-first-column)::before,.uk-overlay-primary .uk-subnav-divider>:nth-child(n+2):not(.uk-first-column)::before,.uk-offcanvas-bar .uk-subnav-divider>:nth-child(n+2):not(.uk-first-column)::before{border-left-color:rgba(255,255,255,0.2)}.uk-light .uk-subnav-pill>*>:first-child,.uk-section-primary:not(.uk-preserve-color) .uk-subnav-pill>*>:first-child,.uk-section-secondary:not(.uk-preserve-color) .uk-subnav-pill>*>:first-child,.uk-tile-primary:not(.uk-preserve-color) .uk-subnav-pill>*>:first-child,.uk-tile-secondary:not(.uk-preserve-color) .uk-subnav-pill>*>:first-child,.uk-card-primary.uk-card-body .uk-subnav-pill>*>:first-child,.uk-card-primary>:not([class*='uk-card-media']) .uk-subnav-pill>*>:first-child,.uk-card-secondary.uk-card-body .uk-subnav-pill>*>:first-child,.uk-card-secondary>:not([class*='uk-card-media']) .uk-subnav-pill>*>:first-child,.uk-overlay-primary .uk-subnav-pill>*>:first-child,.uk-offcanvas-bar .uk-subnav-pill>*>:first-child{background-color:rgba(0,0,0,0);color:rgba(255,255,255,0.5)}.uk-light .uk-subnav-pill>*>a:hover,.uk-section-primary:not(.uk-preserve-color) .uk-subnav-pill>*>a:hover,.uk-section-secondary:not(.uk-preserve-color) .uk-subnav-pill>*>a:hover,.uk-tile-primary:not(.uk-preserve-color) .uk-subnav-pill>*>a:hover,.uk-tile-secondary:not(.uk-preserve-color) .uk-subnav-pill>*>a:hover,.uk-card-primary.uk-card-body .uk-subnav-pill>*>a:hover,.uk-card-primary>:not([class*='uk-card-media']) .uk-subnav-pill>*>a:hover,.uk-card-secondary.uk-card-body .uk-subnav-pill>*>a:hover,.uk-card-secondary>:not([class*='uk-card-media']) .uk-subnav-pill>*>a:hover,.uk-overlay-primary .uk-subnav-pill>*>a:hover,.uk-offcanvas-bar .uk-subnav-pill>*>a:hover,.uk-light .uk-subnav-pill>*>a:focus,.uk-section-primary:not(.uk-preserve-color) .uk-subnav-pill>*>a:focus,.uk-section-secondary:not(.uk-preserve-color) .uk-subnav-pill>*>a:focus,.uk-tile-primary:not(.uk-preserve-color) .uk-subnav-pill>*>a:focus,.uk-tile-secondary:not(.uk-preserve-color) .uk-subnav-pill>*>a:focus,.uk-card-primary.uk-card-body .uk-subnav-pill>*>a:focus,.uk-card-primary>:not([class*='uk-card-media']) .uk-subnav-pill>*>a:focus,.uk-card-secondary.uk-card-body .uk-subnav-pill>*>a:focus,.uk-card-secondary>:not([class*='uk-card-media']) .uk-subnav-pill>*>a:focus,.uk-overlay-primary .uk-subnav-pill>*>a:focus,.uk-offcanvas-bar .uk-subnav-pill>*>a:focus{background-color:rgba(255,255,255,0.1);color:rgba(255,255,255,0.7)}.uk-light .uk-subnav-pill>*>a:active,.uk-section-primary:not(.uk-preserve-color) .uk-subnav-pill>*>a:active,.uk-section-secondary:not(.uk-preserve-color) .uk-subnav-pill>*>a:active,.uk-tile-primary:not(.uk-preserve-color) .uk-subnav-pill>*>a:active,.uk-tile-secondary:not(.uk-preserve-color) .uk-subnav-pill>*>a:active,.uk-card-primary.uk-card-body .uk-subnav-pill>*>a:active,.uk-card-primary>:not([class*='uk-card-media']) .uk-subnav-pill>*>a:active,.uk-card-secondary.uk-card-body .uk-subnav-pill>*>a:active,.uk-card-secondary>:not([class*='uk-card-media']) .uk-subnav-pill>*>a:active,.uk-overlay-primary .uk-subnav-pill>*>a:active,.uk-offcanvas-bar .uk-subnav-pill>*>a:active{background-color:rgba(255,255,255,0.1);color:rgba(255,255,255,0.7)}.uk-light .uk-subnav-pill>.uk-active>a,.uk-section-primary:not(.uk-preserve-color) .uk-subnav-pill>.uk-active>a,.uk-section-secondary:not(.uk-preserve-color) .uk-subnav-pill>.uk-active>a,.uk-tile-primary:not(.uk-preserve-color) .uk-subnav-pill>.uk-active>a,.uk-tile-secondary:not(.uk-preserve-color) .uk-subnav-pill>.uk-active>a,.uk-card-primary.uk-card-body .uk-subnav-pill>.uk-active>a,.uk-card-primary>:not([class*='uk-card-media']) .uk-subnav-pill>.uk-active>a,.uk-card-secondary.uk-card-body .uk-subnav-pill>.uk-active>a,.uk-card-secondary>:not([class*='uk-card-media']) .uk-subnav-pill>.uk-active>a,.uk-overlay-primary .uk-subnav-pill>.uk-active>a,.uk-offcanvas-bar .uk-subnav-pill>.uk-active>a{background-color:#fff;color:#666}.uk-light .uk-subnav>.uk-disabled>a,.uk-section-primary:not(.uk-preserve-color) .uk-subnav>.uk-disabled>a,.uk-section-secondary:not(.uk-preserve-color) .uk-subnav>.uk-disabled>a,.uk-tile-primary:not(.uk-preserve-color) .uk-subnav>.uk-disabled>a,.uk-tile-secondary:not(.uk-preserve-color) .uk-subnav>.uk-disabled>a,.uk-card-primary.uk-card-body .uk-subnav>.uk-disabled>a,.uk-card-primary>:not([class*='uk-card-media']) .uk-subnav>.uk-disabled>a,.uk-card-secondary.uk-card-body .uk-subnav>.uk-disabled>a,.uk-card-secondary>:not([class*='uk-card-media']) .uk-subnav>.uk-disabled>a,.uk-overlay-primary .uk-subnav>.uk-disabled>a,.uk-offcanvas-bar .uk-subnav>.uk-disabled>a{color:rgba(255,255,255,0.5)}.uk-light .uk-breadcrumb>*>*,.uk-section-primary:not(.uk-preserve-color) .uk-breadcrumb>*>*,.uk-section-secondary:not(.uk-preserve-color) .uk-breadcrumb>*>*,.uk-tile-primary:not(.uk-preserve-color) .uk-breadcrumb>*>*,.uk-tile-secondary:not(.uk-preserve-color) .uk-breadcrumb>*>*,.uk-card-primary.uk-card-body .uk-breadcrumb>*>*,.uk-card-primary>:not([class*='uk-card-media']) .uk-breadcrumb>*>*,.uk-card-secondary.uk-card-body .uk-breadcrumb>*>*,.uk-card-secondary>:not([class*='uk-card-media']) .uk-breadcrumb>*>*,.uk-overlay-primary .uk-breadcrumb>*>*,.uk-offcanvas-bar .uk-breadcrumb>*>*{color:rgba(255,255,255,0.5)}.uk-light .uk-breadcrumb>*>:hover,.uk-section-primary:not(.uk-preserve-color) .uk-breadcrumb>*>:hover,.uk-section-secondary:not(.uk-preserve-color) .uk-breadcrumb>*>:hover,.uk-tile-primary:not(.uk-preserve-color) .uk-breadcrumb>*>:hover,.uk-tile-secondary:not(.uk-preserve-color) .uk-breadcrumb>*>:hover,.uk-card-primary.uk-card-body .uk-breadcrumb>*>:hover,.uk-card-primary>:not([class*='uk-card-media']) .uk-breadcrumb>*>:hover,.uk-card-secondary.uk-card-body .uk-breadcrumb>*>:hover,.uk-card-secondary>:not([class*='uk-card-media']) .uk-breadcrumb>*>:hover,.uk-overlay-primary .uk-breadcrumb>*>:hover,.uk-offcanvas-bar .uk-breadcrumb>*>:hover,.uk-light .uk-breadcrumb>*>:focus,.uk-section-primary:not(.uk-preserve-color) .uk-breadcrumb>*>:focus,.uk-section-secondary:not(.uk-preserve-color) .uk-breadcrumb>*>:focus,.uk-tile-primary:not(.uk-preserve-color) .uk-breadcrumb>*>:focus,.uk-tile-secondary:not(.uk-preserve-color) .uk-breadcrumb>*>:focus,.uk-card-primary.uk-card-body .uk-breadcrumb>*>:focus,.uk-card-primary>:not([class*='uk-card-media']) .uk-breadcrumb>*>:focus,.uk-card-secondary.uk-card-body .uk-breadcrumb>*>:focus,.uk-card-secondary>:not([class*='uk-card-media']) .uk-breadcrumb>*>:focus,.uk-overlay-primary .uk-breadcrumb>*>:focus,.uk-offcanvas-bar .uk-breadcrumb>*>:focus{color:rgba(255,255,255,0.7)}.uk-light .uk-breadcrumb>:last-child>*,.uk-section-primary:not(.uk-preserve-color) .uk-breadcrumb>:last-child>*,.uk-section-secondary:not(.uk-preserve-color) .uk-breadcrumb>:last-child>*,.uk-tile-primary:not(.uk-preserve-color) .uk-breadcrumb>:last-child>*,.uk-tile-secondary:not(.uk-preserve-color) .uk-breadcrumb>:last-child>*,.uk-card-primary.uk-card-body .uk-breadcrumb>:last-child>*,.uk-card-primary>:not([class*='uk-card-media']) .uk-breadcrumb>:last-child>*,.uk-card-secondary.uk-card-body .uk-breadcrumb>:last-child>*,.uk-card-secondary>:not([class*='uk-card-media']) .uk-breadcrumb>:last-child>*,.uk-overlay-primary .uk-breadcrumb>:last-child>*,.uk-offcanvas-bar .uk-breadcrumb>:last-child>*{color:rgba(255,255,255,0.7)}.uk-light .uk-breadcrumb>:nth-child(n+2):not(.uk-first-column)::before,.uk-section-primary:not(.uk-preserve-color) .uk-breadcrumb>:nth-child(n+2):not(.uk-first-column)::before,.uk-section-secondary:not(.uk-preserve-color) .uk-breadcrumb>:nth-child(n+2):not(.uk-first-column)::before,.uk-tile-primary:not(.uk-preserve-color) .uk-breadcrumb>:nth-child(n+2):not(.uk-first-column)::before,.uk-tile-secondary:not(.uk-preserve-color) .uk-breadcrumb>:nth-child(n+2):not(.uk-first-column)::before,.uk-card-primary.uk-card-body .uk-breadcrumb>:nth-child(n+2):not(.uk-first-column)::before,.uk-card-primary>:not([class*='uk-card-media']) .uk-breadcrumb>:nth-child(n+2):not(.uk-first-column)::before,.uk-card-secondary.uk-card-body .uk-breadcrumb>:nth-child(n+2):not(.uk-first-column)::before,.uk-card-secondary>:not([class*='uk-card-media']) .uk-breadcrumb>:nth-child(n+2):not(.uk-first-column)::before,.uk-overlay-primary .uk-breadcrumb>:nth-child(n+2):not(.uk-first-column)::before,.uk-offcanvas-bar .uk-breadcrumb>:nth-child(n+2):not(.uk-first-column)::before{color:rgba(255,255,255,0.5)}.uk-light .uk-pagination>*>*,.uk-section-primary:not(.uk-preserve-color) .uk-pagination>*>*,.uk-section-secondary:not(.uk-preserve-color) .uk-pagination>*>*,.uk-tile-primary:not(.uk-preserve-color) .uk-pagination>*>*,.uk-tile-secondary:not(.uk-preserve-color) .uk-pagination>*>*,.uk-card-primary.uk-card-body .uk-pagination>*>*,.uk-card-primary>:not([class*='uk-card-media']) .uk-pagination>*>*,.uk-card-secondary.uk-card-body .uk-pagination>*>*,.uk-card-secondary>:not([class*='uk-card-media']) .uk-pagination>*>*,.uk-overlay-primary .uk-pagination>*>*,.uk-offcanvas-bar .uk-pagination>*>*{color:rgba(255,255,255,0.5)}.uk-light .uk-pagination>*>:hover,.uk-section-primary:not(.uk-preserve-color) .uk-pagination>*>:hover,.uk-section-secondary:not(.uk-preserve-color) .uk-pagination>*>:hover,.uk-tile-primary:not(.uk-preserve-color) .uk-pagination>*>:hover,.uk-tile-secondary:not(.uk-preserve-color) .uk-pagination>*>:hover,.uk-card-primary.uk-card-body .uk-pagination>*>:hover,.uk-card-primary>:not([class*='uk-card-media']) .uk-pagination>*>:hover,.uk-card-secondary.uk-card-body .uk-pagination>*>:hover,.uk-card-secondary>:not([class*='uk-card-media']) .uk-pagination>*>:hover,.uk-overlay-primary .uk-pagination>*>:hover,.uk-offcanvas-bar .uk-pagination>*>:hover,.uk-light .uk-pagination>*>:focus,.uk-section-primary:not(.uk-preserve-color) .uk-pagination>*>:focus,.uk-section-secondary:not(.uk-preserve-color) .uk-pagination>*>:focus,.uk-tile-primary:not(.uk-preserve-color) .uk-pagination>*>:focus,.uk-tile-secondary:not(.uk-preserve-color) .uk-pagination>*>:focus,.uk-card-primary.uk-card-body .uk-pagination>*>:focus,.uk-card-primary>:not([class*='uk-card-media']) .uk-pagination>*>:focus,.uk-card-secondary.uk-card-body .uk-pagination>*>:focus,.uk-card-secondary>:not([class*='uk-card-media']) .uk-pagination>*>:focus,.uk-overlay-primary .uk-pagination>*>:focus,.uk-offcanvas-bar .uk-pagination>*>:focus{color:rgba(255,255,255,0.7)}.uk-light .uk-pagination>.uk-active>*,.uk-section-primary:not(.uk-preserve-color) .uk-pagination>.uk-active>*,.uk-section-secondary:not(.uk-preserve-color) .uk-pagination>.uk-active>*,.uk-tile-primary:not(.uk-preserve-color) .uk-pagination>.uk-active>*,.uk-tile-secondary:not(.uk-preserve-color) .uk-pagination>.uk-active>*,.uk-card-primary.uk-card-body .uk-pagination>.uk-active>*,.uk-card-primary>:not([class*='uk-card-media']) .uk-pagination>.uk-active>*,.uk-card-secondary.uk-card-body .uk-pagination>.uk-active>*,.uk-card-secondary>:not([class*='uk-card-media']) .uk-pagination>.uk-active>*,.uk-overlay-primary .uk-pagination>.uk-active>*,.uk-offcanvas-bar .uk-pagination>.uk-active>*{color:rgba(255,255,255,0.7)}.uk-light .uk-pagination>.uk-disabled>*,.uk-section-primary:not(.uk-preserve-color) .uk-pagination>.uk-disabled>*,.uk-section-secondary:not(.uk-preserve-color) .uk-pagination>.uk-disabled>*,.uk-tile-primary:not(.uk-preserve-color) .uk-pagination>.uk-disabled>*,.uk-tile-secondary:not(.uk-preserve-color) .uk-pagination>.uk-disabled>*,.uk-card-primary.uk-card-body .uk-pagination>.uk-disabled>*,.uk-card-primary>:not([class*='uk-card-media']) .uk-pagination>.uk-disabled>*,.uk-card-secondary.uk-card-body .uk-pagination>.uk-disabled>*,.uk-card-secondary>:not([class*='uk-card-media']) .uk-pagination>.uk-disabled>*,.uk-overlay-primary .uk-pagination>.uk-disabled>*,.uk-offcanvas-bar .uk-pagination>.uk-disabled>*{color:rgba(255,255,255,0.5)}.uk-light .uk-tab::before,.uk-section-primary:not(.uk-preserve-color) .uk-tab::before,.uk-section-secondary:not(.uk-preserve-color) .uk-tab::before,.uk-tile-primary:not(.uk-preserve-color) .uk-tab::before,.uk-tile-secondary:not(.uk-preserve-color) .uk-tab::before,.uk-card-primary.uk-card-body .uk-tab::before,.uk-card-primary>:not([class*='uk-card-media']) .uk-tab::before,.uk-card-secondary.uk-card-body .uk-tab::before,.uk-card-secondary>:not([class*='uk-card-media']) .uk-tab::before,.uk-overlay-primary .uk-tab::before,.uk-offcanvas-bar .uk-tab::before{border-color:rgba(255,255,255,0.2)}.uk-light .uk-tab>*>a,.uk-section-primary:not(.uk-preserve-color) .uk-tab>*>a,.uk-section-secondary:not(.uk-preserve-color) .uk-tab>*>a,.uk-tile-primary:not(.uk-preserve-color) .uk-tab>*>a,.uk-tile-secondary:not(.uk-preserve-color) .uk-tab>*>a,.uk-card-primary.uk-card-body .uk-tab>*>a,.uk-card-primary>:not([class*='uk-card-media']) .uk-tab>*>a,.uk-card-secondary.uk-card-body .uk-tab>*>a,.uk-card-secondary>:not([class*='uk-card-media']) .uk-tab>*>a,.uk-overlay-primary .uk-tab>*>a,.uk-offcanvas-bar .uk-tab>*>a{color:rgba(255,255,255,0.5)}.uk-light .uk-tab>*>a:hover,.uk-section-primary:not(.uk-preserve-color) .uk-tab>*>a:hover,.uk-section-secondary:not(.uk-preserve-color) .uk-tab>*>a:hover,.uk-tile-primary:not(.uk-preserve-color) .uk-tab>*>a:hover,.uk-tile-secondary:not(.uk-preserve-color) .uk-tab>*>a:hover,.uk-card-primary.uk-card-body .uk-tab>*>a:hover,.uk-card-primary>:not([class*='uk-card-media']) .uk-tab>*>a:hover,.uk-card-secondary.uk-card-body .uk-tab>*>a:hover,.uk-card-secondary>:not([class*='uk-card-media']) .uk-tab>*>a:hover,.uk-overlay-primary .uk-tab>*>a:hover,.uk-offcanvas-bar .uk-tab>*>a:hover,.uk-light .uk-tab>*>a:focus,.uk-section-primary:not(.uk-preserve-color) .uk-tab>*>a:focus,.uk-section-secondary:not(.uk-preserve-color) .uk-tab>*>a:focus,.uk-tile-primary:not(.uk-preserve-color) .uk-tab>*>a:focus,.uk-tile-secondary:not(.uk-preserve-color) .uk-tab>*>a:focus,.uk-card-primary.uk-card-body .uk-tab>*>a:focus,.uk-card-primary>:not([class*='uk-card-media']) .uk-tab>*>a:focus,.uk-card-secondary.uk-card-body .uk-tab>*>a:focus,.uk-card-secondary>:not([class*='uk-card-media']) .uk-tab>*>a:focus,.uk-overlay-primary .uk-tab>*>a:focus,.uk-offcanvas-bar .uk-tab>*>a:focus{color:rgba(255,255,255,0.7)}.uk-light .uk-tab>.uk-active>a,.uk-section-primary:not(.uk-preserve-color) .uk-tab>.uk-active>a,.uk-section-secondary:not(.uk-preserve-color) .uk-tab>.uk-active>a,.uk-tile-primary:not(.uk-preserve-color) .uk-tab>.uk-active>a,.uk-tile-secondary:not(.uk-preserve-color) .uk-tab>.uk-active>a,.uk-card-primary.uk-card-body .uk-tab>.uk-active>a,.uk-card-primary>:not([class*='uk-card-media']) .uk-tab>.uk-active>a,.uk-card-secondary.uk-card-body .uk-tab>.uk-active>a,.uk-card-secondary>:not([class*='uk-card-media']) .uk-tab>.uk-active>a,.uk-overlay-primary .uk-tab>.uk-active>a,.uk-offcanvas-bar .uk-tab>.uk-active>a{color:#fff;border-color:#fff}.uk-light .uk-tab>.uk-disabled>a,.uk-section-primary:not(.uk-preserve-color) .uk-tab>.uk-disabled>a,.uk-section-secondary:not(.uk-preserve-color) .uk-tab>.uk-disabled>a,.uk-tile-primary:not(.uk-preserve-color) .uk-tab>.uk-disabled>a,.uk-tile-secondary:not(.uk-preserve-color) .uk-tab>.uk-disabled>a,.uk-card-primary.uk-card-body .uk-tab>.uk-disabled>a,.uk-card-primary>:not([class*='uk-card-media']) .uk-tab>.uk-disabled>a,.uk-card-secondary.uk-card-body .uk-tab>.uk-disabled>a,.uk-card-secondary>:not([class*='uk-card-media']) .uk-tab>.uk-disabled>a,.uk-overlay-primary .uk-tab>.uk-disabled>a,.uk-offcanvas-bar .uk-tab>.uk-disabled>a{color:rgba(255,255,255,0.5)}.uk-light .uk-slidenav,.uk-section-primary:not(.uk-preserve-color) .uk-slidenav,.uk-section-secondary:not(.uk-preserve-color) .uk-slidenav,.uk-tile-primary:not(.uk-preserve-color) .uk-slidenav,.uk-tile-secondary:not(.uk-preserve-color) .uk-slidenav,.uk-card-primary.uk-card-body .uk-slidenav,.uk-card-primary>:not([class*='uk-card-media']) .uk-slidenav,.uk-card-secondary.uk-card-body .uk-slidenav,.uk-card-secondary>:not([class*='uk-card-media']) .uk-slidenav,.uk-overlay-primary .uk-slidenav,.uk-offcanvas-bar .uk-slidenav{color:rgba(255,255,255,0.7)}.uk-light .uk-slidenav:hover,.uk-section-primary:not(.uk-preserve-color) .uk-slidenav:hover,.uk-section-secondary:not(.uk-preserve-color) .uk-slidenav:hover,.uk-tile-primary:not(.uk-preserve-color) .uk-slidenav:hover,.uk-tile-secondary:not(.uk-preserve-color) .uk-slidenav:hover,.uk-card-primary.uk-card-body .uk-slidenav:hover,.uk-card-primary>:not([class*='uk-card-media']) .uk-slidenav:hover,.uk-card-secondary.uk-card-body .uk-slidenav:hover,.uk-card-secondary>:not([class*='uk-card-media']) .uk-slidenav:hover,.uk-overlay-primary .uk-slidenav:hover,.uk-offcanvas-bar .uk-slidenav:hover,.uk-light .uk-slidenav:focus,.uk-section-primary:not(.uk-preserve-color) .uk-slidenav:focus,.uk-section-secondary:not(.uk-preserve-color) .uk-slidenav:focus,.uk-tile-primary:not(.uk-preserve-color) .uk-slidenav:focus,.uk-tile-secondary:not(.uk-preserve-color) .uk-slidenav:focus,.uk-card-primary.uk-card-body .uk-slidenav:focus,.uk-card-primary>:not([class*='uk-card-media']) .uk-slidenav:focus,.uk-card-secondary.uk-card-body .uk-slidenav:focus,.uk-card-secondary>:not([class*='uk-card-media']) .uk-slidenav:focus,.uk-overlay-primary .uk-slidenav:focus,.uk-offcanvas-bar .uk-slidenav:focus{color:rgba(255,255,255,0.95)}.uk-light .uk-slidenav:active,.uk-section-primary:not(.uk-preserve-color) .uk-slidenav:active,.uk-section-secondary:not(.uk-preserve-color) .uk-slidenav:active,.uk-tile-primary:not(.uk-preserve-color) .uk-slidenav:active,.uk-tile-secondary:not(.uk-preserve-color) .uk-slidenav:active,.uk-card-primary.uk-card-body .uk-slidenav:active,.uk-card-primary>:not([class*='uk-card-media']) .uk-slidenav:active,.uk-card-secondary.uk-card-body .uk-slidenav:active,.uk-card-secondary>:not([class*='uk-card-media']) .uk-slidenav:active,.uk-overlay-primary .uk-slidenav:active,.uk-offcanvas-bar .uk-slidenav:active{color:rgba(255,255,255,0.7)}.uk-light .uk-dotnav>*>*,.uk-section-primary:not(.uk-preserve-color) .uk-dotnav>*>*,.uk-section-secondary:not(.uk-preserve-color) .uk-dotnav>*>*,.uk-tile-primary:not(.uk-preserve-color) .uk-dotnav>*>*,.uk-tile-secondary:not(.uk-preserve-color) .uk-dotnav>*>*,.uk-card-primary.uk-card-body .uk-dotnav>*>*,.uk-card-primary>:not([class*='uk-card-media']) .uk-dotnav>*>*,.uk-card-secondary.uk-card-body .uk-dotnav>*>*,.uk-card-secondary>:not([class*='uk-card-media']) .uk-dotnav>*>*,.uk-overlay-primary .uk-dotnav>*>*,.uk-offcanvas-bar .uk-dotnav>*>*{background-color:rgba(0,0,0,0);border-color:rgba(255,255,255,0.9)}.uk-light .uk-dotnav>*>:hover,.uk-section-primary:not(.uk-preserve-color) .uk-dotnav>*>:hover,.uk-section-secondary:not(.uk-preserve-color) .uk-dotnav>*>:hover,.uk-tile-primary:not(.uk-preserve-color) .uk-dotnav>*>:hover,.uk-tile-secondary:not(.uk-preserve-color) .uk-dotnav>*>:hover,.uk-card-primary.uk-card-body .uk-dotnav>*>:hover,.uk-card-primary>:not([class*='uk-card-media']) .uk-dotnav>*>:hover,.uk-card-secondary.uk-card-body .uk-dotnav>*>:hover,.uk-card-secondary>:not([class*='uk-card-media']) .uk-dotnav>*>:hover,.uk-overlay-primary .uk-dotnav>*>:hover,.uk-offcanvas-bar .uk-dotnav>*>:hover,.uk-light .uk-dotnav>*>:focus,.uk-section-primary:not(.uk-preserve-color) .uk-dotnav>*>:focus,.uk-section-secondary:not(.uk-preserve-color) .uk-dotnav>*>:focus,.uk-tile-primary:not(.uk-preserve-color) .uk-dotnav>*>:focus,.uk-tile-secondary:not(.uk-preserve-color) .uk-dotnav>*>:focus,.uk-card-primary.uk-card-body .uk-dotnav>*>:focus,.uk-card-primary>:not([class*='uk-card-media']) .uk-dotnav>*>:focus,.uk-card-secondary.uk-card-body .uk-dotnav>*>:focus,.uk-card-secondary>:not([class*='uk-card-media']) .uk-dotnav>*>:focus,.uk-overlay-primary .uk-dotnav>*>:focus,.uk-offcanvas-bar .uk-dotnav>*>:focus{background-color:rgba(255,255,255,0.9);border-color:transparent}.uk-light .uk-dotnav>*>:active,.uk-section-primary:not(.uk-preserve-color) .uk-dotnav>*>:active,.uk-section-secondary:not(.uk-preserve-color) .uk-dotnav>*>:active,.uk-tile-primary:not(.uk-preserve-color) .uk-dotnav>*>:active,.uk-tile-secondary:not(.uk-preserve-color) .uk-dotnav>*>:active,.uk-card-primary.uk-card-body .uk-dotnav>*>:active,.uk-card-primary>:not([class*='uk-card-media']) .uk-dotnav>*>:active,.uk-card-secondary.uk-card-body .uk-dotnav>*>:active,.uk-card-secondary>:not([class*='uk-card-media']) .uk-dotnav>*>:active,.uk-overlay-primary .uk-dotnav>*>:active,.uk-offcanvas-bar .uk-dotnav>*>:active{background-color:rgba(255,255,255,0.5);border-color:transparent}.uk-light .uk-dotnav>.uk-active>*,.uk-section-primary:not(.uk-preserve-color) .uk-dotnav>.uk-active>*,.uk-section-secondary:not(.uk-preserve-color) .uk-dotnav>.uk-active>*,.uk-tile-primary:not(.uk-preserve-color) .uk-dotnav>.uk-active>*,.uk-tile-secondary:not(.uk-preserve-color) .uk-dotnav>.uk-active>*,.uk-card-primary.uk-card-body .uk-dotnav>.uk-active>*,.uk-card-primary>:not([class*='uk-card-media']) .uk-dotnav>.uk-active>*,.uk-card-secondary.uk-card-body .uk-dotnav>.uk-active>*,.uk-card-secondary>:not([class*='uk-card-media']) .uk-dotnav>.uk-active>*,.uk-overlay-primary .uk-dotnav>.uk-active>*,.uk-offcanvas-bar .uk-dotnav>.uk-active>*{background-color:rgba(255,255,255,0.9);border-color:transparent}.uk-light .uk-accordion-title::after,.uk-section-primary:not(.uk-preserve-color) .uk-accordion-title::after,.uk-section-secondary:not(.uk-preserve-color) .uk-accordion-title::after,.uk-tile-primary:not(.uk-preserve-color) .uk-accordion-title::after,.uk-tile-secondary:not(.uk-preserve-color) .uk-accordion-title::after,.uk-card-primary.uk-card-body .uk-accordion-title::after,.uk-card-primary>:not([class*='uk-card-media']) .uk-accordion-title::after,.uk-card-secondary.uk-card-body .uk-accordion-title::after,.uk-card-secondary>:not([class*='uk-card-media']) .uk-accordion-title::after,.uk-overlay-primary .uk-accordion-title::after,.uk-offcanvas-bar .uk-accordion-title::after{background-image:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D%2213%22%20height%3D%2213%22%20viewBox%3D%220%200%2013%2013%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%20%20%20%20%3Crect%20fill%3D%22rgba(255,255,255,0.7)%22%20width%3D%2213%22%20height%3D%221%22%20x%3D%220%22%20y%3D%226%22%20%2F%3E%0A%20%20%20%20%3Crect%20fill%3D%22rgba(255,255,255,0.7)%22%20width%3D%221%22%20height%3D%2213%22%20x%3D%226%22%20y%3D%220%22%20%2F%3E%0A%3C%2Fsvg%3E")}.uk-light .uk-open>.uk-accordion-title::after,.uk-section-primary:not(.uk-preserve-color) .uk-open>.uk-accordion-title::after,.uk-section-secondary:not(.uk-preserve-color) .uk-open>.uk-accordion-title::after,.uk-tile-primary:not(.uk-preserve-color) .uk-open>.uk-accordion-title::after,.uk-tile-secondary:not(.uk-preserve-color) .uk-open>.uk-accordion-title::after,.uk-card-primary.uk-card-body .uk-open>.uk-accordion-title::after,.uk-card-primary>:not([class*='uk-card-media']) .uk-open>.uk-accordion-title::after,.uk-card-secondary.uk-card-body .uk-open>.uk-accordion-title::after,.uk-card-secondary>:not([class*='uk-card-media']) .uk-open>.uk-accordion-title::after,.uk-overlay-primary .uk-open>.uk-accordion-title::after,.uk-offcanvas-bar .uk-open>.uk-accordion-title::after{background-image:url("data:image/svg+xml;charset=UTF-8,%3Csvg%20width%3D%2213%22%20height%3D%2213%22%20viewBox%3D%220%200%2013%2013%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%20%20%20%20%3Crect%20fill%3D%22rgba(255,255,255,0.7)%22%20width%3D%2213%22%20height%3D%221%22%20x%3D%220%22%20y%3D%226%22%20%2F%3E%0A%3C%2Fsvg%3E")}.uk-light .uk-iconnav>*>a,.uk-section-primary:not(.uk-preserve-color) .uk-iconnav>*>a,.uk-section-secondary:not(.uk-preserve-color) .uk-iconnav>*>a,.uk-tile-primary:not(.uk-preserve-color) .uk-iconnav>*>a,.uk-tile-secondary:not(.uk-preserve-color) .uk-iconnav>*>a,.uk-card-primary.uk-card-body .uk-iconnav>*>a,.uk-card-primary>:not([class*='uk-card-media']) .uk-iconnav>*>a,.uk-card-secondary.uk-card-body .uk-iconnav>*>a,.uk-card-secondary>:not([class*='uk-card-media']) .uk-iconnav>*>a,.uk-overlay-primary .uk-iconnav>*>a,.uk-offcanvas-bar .uk-iconnav>*>a{color:rgba(255,255,255,0.5)}.uk-light .uk-iconnav>*>a:hover,.uk-section-primary:not(.uk-preserve-color) .uk-iconnav>*>a:hover,.uk-section-secondary:not(.uk-preserve-color) .uk-iconnav>*>a:hover,.uk-tile-primary:not(.uk-preserve-color) .uk-iconnav>*>a:hover,.uk-tile-secondary:not(.uk-preserve-color) .uk-iconnav>*>a:hover,.uk-card-primary.uk-card-body .uk-iconnav>*>a:hover,.uk-card-primary>:not([class*='uk-card-media']) .uk-iconnav>*>a:hover,.uk-card-secondary.uk-card-body .uk-iconnav>*>a:hover,.uk-card-secondary>:not([class*='uk-card-media']) .uk-iconnav>*>a:hover,.uk-overlay-primary .uk-iconnav>*>a:hover,.uk-offcanvas-bar .uk-iconnav>*>a:hover,.uk-light .uk-iconnav>*>a:focus,.uk-section-primary:not(.uk-preserve-color) .uk-iconnav>*>a:focus,.uk-section-secondary:not(.uk-preserve-color) .uk-iconnav>*>a:focus,.uk-tile-primary:not(.uk-preserve-color) .uk-iconnav>*>a:focus,.uk-tile-secondary:not(.uk-preserve-color) .uk-iconnav>*>a:focus,.uk-card-primary.uk-card-body .uk-iconnav>*>a:focus,.uk-card-primary>:not([class*='uk-card-media']) .uk-iconnav>*>a:focus,.uk-card-secondary.uk-card-body .uk-iconnav>*>a:focus,.uk-card-secondary>:not([class*='uk-card-media']) .uk-iconnav>*>a:focus,.uk-overlay-primary .uk-iconnav>*>a:focus,.uk-offcanvas-bar .uk-iconnav>*>a:focus{color:rgba(255,255,255,0.7)}.uk-light .uk-iconnav>.uk-active>a,.uk-section-primary:not(.uk-preserve-color) .uk-iconnav>.uk-active>a,.uk-section-secondary:not(.uk-preserve-color) .uk-iconnav>.uk-active>a,.uk-tile-primary:not(.uk-preserve-color) .uk-iconnav>.uk-active>a,.uk-tile-secondary:not(.uk-preserve-color) .uk-iconnav>.uk-active>a,.uk-card-primary.uk-card-body .uk-iconnav>.uk-active>a,.uk-card-primary>:not([class*='uk-card-media']) .uk-iconnav>.uk-active>a,.uk-card-secondary.uk-card-body .uk-iconnav>.uk-active>a,.uk-card-secondary>:not([class*='uk-card-media']) .uk-iconnav>.uk-active>a,.uk-overlay-primary .uk-iconnav>.uk-active>a,.uk-offcanvas-bar .uk-iconnav>.uk-active>a{color:rgba(255,255,255,0.7)}.uk-light .uk-text-lead,.uk-section-primary:not(.uk-preserve-color) .uk-text-lead,.uk-section-secondary:not(.uk-preserve-color) .uk-text-lead,.uk-tile-primary:not(.uk-preserve-color) .uk-text-lead,.uk-tile-secondary:not(.uk-preserve-color) .uk-text-lead,.uk-card-primary.uk-card-body .uk-text-lead,.uk-card-primary>:not([class*='uk-card-media']) .uk-text-lead,.uk-card-secondary.uk-card-body .uk-text-lead,.uk-card-secondary>:not([class*='uk-card-media']) .uk-text-lead,.uk-overlay-primary .uk-text-lead,.uk-offcanvas-bar .uk-text-lead{color:rgba(255,255,255,0.7)}.uk-light .uk-text-meta,.uk-section-primary:not(.uk-preserve-color) .uk-text-meta,.uk-section-secondary:not(.uk-preserve-color) .uk-text-meta,.uk-tile-primary:not(.uk-preserve-color) .uk-text-meta,.uk-tile-secondary:not(.uk-preserve-color) .uk-text-meta,.uk-card-primary.uk-card-body .uk-text-meta,.uk-card-primary>:not([class*='uk-card-media']) .uk-text-meta,.uk-card-secondary.uk-card-body .uk-text-meta,.uk-card-secondary>:not([class*='uk-card-media']) .uk-text-meta,.uk-overlay-primary .uk-text-meta,.uk-offcanvas-bar .uk-text-meta{color:rgba(255,255,255,0.5)}.uk-light .uk-text-muted,.uk-section-primary:not(.uk-preserve-color) .uk-text-muted,.uk-section-secondary:not(.uk-preserve-color) .uk-text-muted,.uk-tile-primary:not(.uk-preserve-color) .uk-text-muted,.uk-tile-secondary:not(.uk-preserve-color) .uk-text-muted,.uk-card-primary.uk-card-body .uk-text-muted,.uk-card-primary>:not([class*='uk-card-media']) .uk-text-muted,.uk-card-secondary.uk-card-body .uk-text-muted,.uk-card-secondary>:not([class*='uk-card-media']) .uk-text-muted,.uk-overlay-primary .uk-text-muted,.uk-offcanvas-bar .uk-text-muted{color:rgba(255,255,255,0.5) !important}.uk-light .uk-text-primary,.uk-section-primary:not(.uk-preserve-color) .uk-text-primary,.uk-section-secondary:not(.uk-preserve-color) .uk-text-primary,.uk-tile-primary:not(.uk-preserve-color) .uk-text-primary,.uk-tile-secondary:not(.uk-preserve-color) .uk-text-primary,.uk-card-primary.uk-card-body .uk-text-primary,.uk-card-primary>:not([class*='uk-card-media']) .uk-text-primary,.uk-card-secondary.uk-card-body .uk-text-primary,.uk-card-secondary>:not([class*='uk-card-media']) .uk-text-primary,.uk-overlay-primary .uk-text-primary,.uk-offcanvas-bar .uk-text-primary{color:rgba(255,255,255,0.7) !important}.uk-light .uk-column-divider,.uk-section-primary:not(.uk-preserve-color) .uk-column-divider,.uk-section-secondary:not(.uk-preserve-color) .uk-column-divider,.uk-tile-primary:not(.uk-preserve-color) .uk-column-divider,.uk-tile-secondary:not(.uk-preserve-color) .uk-column-divider,.uk-card-primary.uk-card-body .uk-column-divider,.uk-card-primary>:not([class*='uk-card-media']) .uk-column-divider,.uk-card-secondary.uk-card-body .uk-column-divider,.uk-card-secondary>:not([class*='uk-card-media']) .uk-column-divider,.uk-overlay-primary .uk-column-divider,.uk-offcanvas-bar .uk-column-divider{column-rule-color:rgba(255,255,255,0.2)}.uk-light .uk-logo,.uk-section-primary:not(.uk-preserve-color) .uk-logo,.uk-section-secondary:not(.uk-preserve-color) .uk-logo,.uk-tile-primary:not(.uk-preserve-color) .uk-logo,.uk-tile-secondary:not(.uk-preserve-color) .uk-logo,.uk-card-primary.uk-card-body .uk-logo,.uk-card-primary>:not([class*='uk-card-media']) .uk-logo,.uk-card-secondary.uk-card-body .uk-logo,.uk-card-secondary>:not([class*='uk-card-media']) .uk-logo,.uk-overlay-primary .uk-logo,.uk-offcanvas-bar .uk-logo{color:rgba(255,255,255,0.7)}.uk-light .uk-logo:hover,.uk-section-primary:not(.uk-preserve-color) .uk-logo:hover,.uk-section-secondary:not(.uk-preserve-color) .uk-logo:hover,.uk-tile-primary:not(.uk-preserve-color) .uk-logo:hover,.uk-tile-secondary:not(.uk-preserve-color) .uk-logo:hover,.uk-card-primary.uk-card-body .uk-logo:hover,.uk-card-primary>:not([class*='uk-card-media']) .uk-logo:hover,.uk-card-secondary.uk-card-body .uk-logo:hover,.uk-card-secondary>:not([class*='uk-card-media']) .uk-logo:hover,.uk-overlay-primary .uk-logo:hover,.uk-offcanvas-bar .uk-logo:hover,.uk-light .uk-logo:focus,.uk-section-primary:not(.uk-preserve-color) .uk-logo:focus,.uk-section-secondary:not(.uk-preserve-color) .uk-logo:focus,.uk-tile-primary:not(.uk-preserve-color) .uk-logo:focus,.uk-tile-secondary:not(.uk-preserve-color) .uk-logo:focus,.uk-card-primary.uk-card-body .uk-logo:focus,.uk-card-primary>:not([class*='uk-card-media']) .uk-logo:focus,.uk-card-secondary.uk-card-body .uk-logo:focus,.uk-card-secondary>:not([class*='uk-card-media']) .uk-logo:focus,.uk-overlay-primary .uk-logo:focus,.uk-offcanvas-bar .uk-logo:focus{color:rgba(255,255,255,0.7)}.uk-light .uk-logo>:not(.uk-logo-inverse):not(:only-of-type),.uk-section-primary:not(.uk-preserve-color) .uk-logo>:not(.uk-logo-inverse):not(:only-of-type),.uk-section-secondary:not(.uk-preserve-color) .uk-logo>:not(.uk-logo-inverse):not(:only-of-type),.uk-tile-primary:not(.uk-preserve-color) .uk-logo>:not(.uk-logo-inverse):not(:only-of-type),.uk-tile-secondary:not(.uk-preserve-color) .uk-logo>:not(.uk-logo-inverse):not(:only-of-type),.uk-card-primary.uk-card-body .uk-logo>:not(.uk-logo-inverse):not(:only-of-type),.uk-card-primary>:not([class*='uk-card-media']) .uk-logo>:not(.uk-logo-inverse):not(:only-of-type),.uk-card-secondary.uk-card-body .uk-logo>:not(.uk-logo-inverse):not(:only-of-type),.uk-card-secondary>:not([class*='uk-card-media']) .uk-logo>:not(.uk-logo-inverse):not(:only-of-type),.uk-overlay-primary .uk-logo>:not(.uk-logo-inverse):not(:only-of-type),.uk-offcanvas-bar .uk-logo>:not(.uk-logo-inverse):not(:only-of-type){display:none}.uk-light .uk-logo-inverse,.uk-section-primary:not(.uk-preserve-color) .uk-logo-inverse,.uk-section-secondary:not(.uk-preserve-color) .uk-logo-inverse,.uk-tile-primary:not(.uk-preserve-color) .uk-logo-inverse,.uk-tile-secondary:not(.uk-preserve-color) .uk-logo-inverse,.uk-card-primary.uk-card-body .uk-logo-inverse,.uk-card-primary>:not([class*='uk-card-media']) .uk-logo-inverse,.uk-card-secondary.uk-card-body .uk-logo-inverse,.uk-card-secondary>:not([class*='uk-card-media']) .uk-logo-inverse,.uk-overlay-primary .uk-logo-inverse,.uk-offcanvas-bar .uk-logo-inverse{display:inline}@media print{*,*::before,*::after{background:transparent !important;color:black !important;box-shadow:none !important;text-shadow:none !important}a,a:visited{text-decoration:underline}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}} - -/*# sourceMappingURL=uikit_blurple.css.map */ \ No newline at end of file diff --git a/static/css/uikit_blurple.css.map b/static/css/uikit_blurple.css.map deleted file mode 100644 index a3d9c90f..00000000 --- a/static/css/uikit_blurple.css.map +++ /dev/null @@ -1,154 +0,0 @@ -{ - "version": 3, - "file": "uikit_blurple.css", - "sources": [ - "../../scss/uikit/uikit_blurple.scss", - "../../scss/pysite/_variables.scss", - "../../scss/uikit/_variables-theme.scss", - "../../scss/uikit/_mixins-theme.scss", - "../../scss/uikit/_uikit-theme.scss", - "../../scss/uikit/theme/_import.scss", - "../../scss/uikit/theme/variables.scss", - "../../scss/uikit/theme/base.scss", - "../../scss/uikit/theme/link.scss", - "../../scss/uikit/theme/heading.scss", - "../../scss/uikit/theme/divider.scss", - "../../scss/uikit/theme/list.scss", - "../../scss/uikit/theme/description-list.scss", - "../../scss/uikit/theme/table.scss", - "../../scss/uikit/theme/icon.scss", - "../../scss/uikit/theme/form-range.scss", - "../../scss/uikit/theme/form.scss", - "../../scss/uikit/theme/button.scss", - "../../scss/uikit/theme/section.scss", - "../../scss/uikit/theme/container.scss", - "../../scss/uikit/theme/grid.scss", - "../../scss/uikit/theme/tile.scss", - "../../scss/uikit/theme/card.scss", - "../../scss/uikit/theme/close.scss", - "../../scss/uikit/theme/spinner.scss", - "../../scss/uikit/theme/marker.scss", - "../../scss/uikit/theme/totop.scss", - "../../scss/uikit/theme/alert.scss", - "../../scss/uikit/theme/badge.scss", - "../../scss/uikit/theme/label.scss", - "../../scss/uikit/theme/overlay.scss", - "../../scss/uikit/theme/article.scss", - "../../scss/uikit/theme/comment.scss", - "../../scss/uikit/theme/search.scss", - "../../scss/uikit/theme/nav.scss", - "../../scss/uikit/theme/navbar.scss", - "../../scss/uikit/theme/subnav.scss", - "../../scss/uikit/theme/breadcrumb.scss", - "../../scss/uikit/theme/pagination.scss", - "../../scss/uikit/theme/tab.scss", - "../../scss/uikit/theme/slidenav.scss", - "../../scss/uikit/theme/dotnav.scss", - "../../scss/uikit/theme/thumbnav.scss", - "../../scss/uikit/theme/accordion.scss", - "../../scss/uikit/theme/drop.scss", - "../../scss/uikit/theme/dropdown.scss", - "../../scss/uikit/theme/modal.scss", - "../../scss/uikit/theme/lightbox.scss", - "../../scss/uikit/theme/sticky.scss", - "../../scss/uikit/theme/offcanvas.scss", - "../../scss/uikit/theme/leader.scss", - "../../scss/uikit/theme/iconnav.scss", - "../../scss/uikit/theme/notification.scss", - "../../scss/uikit/theme/tooltip.scss", - "../../scss/uikit/theme/placeholder.scss", - "../../scss/uikit/theme/progress.scss", - "../../scss/uikit/theme/sortable.scss", - "../../scss/uikit/theme/countdown.scss", - "../../scss/uikit/theme/animation.scss", - "../../scss/uikit/theme/width.scss", - "../../scss/uikit/theme/height.scss", - "../../scss/uikit/theme/text.scss", - "../../scss/uikit/theme/column.scss", - "../../scss/uikit/theme/background.scss", - "../../scss/uikit/theme/align.scss", - "../../scss/uikit/theme/utility.scss", - "../../scss/uikit/theme/margin.scss", - "../../scss/uikit/theme/padding.scss", - "../../scss/uikit/theme/position.scss", - "../../scss/uikit/theme/transition.scss", - "../../scss/uikit/theme/inverse.scss", - "../../scss/uikit/components/_import.scss", - "../../scss/uikit/components/variables.scss", - "../../scss/uikit/components/mixin.scss", - "../../scss/uikit/components/base.scss", - "../../scss/uikit/components/link.scss", - "../../scss/uikit/components/heading.scss", - "../../scss/uikit/components/divider.scss", - "../../scss/uikit/components/list.scss", - "../../scss/uikit/components/description-list.scss", - "../../scss/uikit/components/table.scss", - "../../scss/uikit/components/icon.scss", - "../../scss/uikit/components/form-range.scss", - "../../scss/uikit/components/form.scss", - "../../scss/uikit/components/button.scss", - "../../scss/uikit/components/section.scss", - "../../scss/uikit/components/container.scss", - "../../scss/uikit/components/grid.scss", - "../../scss/uikit/components/tile.scss", - "../../scss/uikit/components/card.scss", - "../../scss/uikit/components/close.scss", - "../../scss/uikit/components/spinner.scss", - "../../scss/uikit/components/totop.scss", - "../../scss/uikit/components/marker.scss", - "../../scss/uikit/components/alert.scss", - "../../scss/uikit/components/badge.scss", - "../../scss/uikit/components/label.scss", - "../../scss/uikit/components/overlay.scss", - "../../scss/uikit/components/article.scss", - "../../scss/uikit/components/comment.scss", - "../../scss/uikit/components/search.scss", - "../../scss/uikit/components/nav.scss", - "../../scss/uikit/components/navbar.scss", - "../../scss/uikit/components/subnav.scss", - "../../scss/uikit/components/breadcrumb.scss", - "../../scss/uikit/components/pagination.scss", - "../../scss/uikit/components/tab.scss", - "../../scss/uikit/components/slidenav.scss", - "../../scss/uikit/components/dotnav.scss", - "../../scss/uikit/components/thumbnav.scss", - "../../scss/uikit/components/accordion.scss", - "../../scss/uikit/components/drop.scss", - "../../scss/uikit/components/dropdown.scss", - "../../scss/uikit/components/modal.scss", - "../../scss/uikit/components/lightbox.scss", - "../../scss/uikit/components/slideshow.scss", - "../../scss/uikit/components/slider.scss", - "../../scss/uikit/components/sticky.scss", - "../../scss/uikit/components/offcanvas.scss", - "../../scss/uikit/components/switcher.scss", - "../../scss/uikit/components/leader.scss", - "../../scss/uikit/components/iconnav.scss", - "../../scss/uikit/components/notification.scss", - "../../scss/uikit/components/tooltip.scss", - "../../scss/uikit/components/placeholder.scss", - "../../scss/uikit/components/progress.scss", - "../../scss/uikit/components/sortable.scss", - "../../scss/uikit/components/countdown.scss", - "../../scss/uikit/components/animation.scss", - "../../scss/uikit/components/width.scss", - "../../scss/uikit/components/height.scss", - "../../scss/uikit/components/text.scss", - "../../scss/uikit/components/column.scss", - "../../scss/uikit/components/cover.scss", - "../../scss/uikit/components/background.scss", - "../../scss/uikit/components/align.scss", - "../../scss/uikit/components/svg.scss", - "../../scss/uikit/components/utility.scss", - "../../scss/uikit/components/flex.scss", - "../../scss/uikit/components/margin.scss", - "../../scss/uikit/components/padding.scss", - "../../scss/uikit/components/position.scss", - "../../scss/uikit/components/transition.scss", - "../../scss/uikit/components/visibility.scss", - "../../scss/uikit/components/inverse.scss", - "../../scss/uikit/components/print.scss" - ], - "names": [], - "mappings": "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" -} \ No newline at end of file diff --git a/static/favicon.ico b/static/favicon.ico deleted file mode 100644 index 046480bf..00000000 Binary files a/static/favicon.ico and /dev/null differ diff --git a/static/images/jams/jams_1.png b/static/images/jams/jams_1.png deleted file mode 100644 index 6f60301b..00000000 Binary files a/static/images/jams/jams_1.png and /dev/null differ diff --git a/static/images/jams/jams_10.png b/static/images/jams/jams_10.png deleted file mode 100644 index a1685ebf..00000000 Binary files a/static/images/jams/jams_10.png and /dev/null differ diff --git a/static/images/jams/jams_11.png b/static/images/jams/jams_11.png deleted file mode 100644 index 5dd019ac..00000000 Binary files a/static/images/jams/jams_11.png and /dev/null differ diff --git a/static/images/jams/jams_12.png b/static/images/jams/jams_12.png deleted file mode 100644 index ca75f404..00000000 Binary files a/static/images/jams/jams_12.png and /dev/null differ diff --git a/static/images/jams/jams_13.png b/static/images/jams/jams_13.png deleted file mode 100644 index b3ec813d..00000000 Binary files a/static/images/jams/jams_13.png and /dev/null differ diff --git a/static/images/jams/jams_14.png b/static/images/jams/jams_14.png deleted file mode 100644 index 6205de2a..00000000 Binary files a/static/images/jams/jams_14.png and /dev/null differ diff --git a/static/images/jams/jams_15.png b/static/images/jams/jams_15.png deleted file mode 100644 index 38deef2b..00000000 Binary files a/static/images/jams/jams_15.png and /dev/null differ diff --git a/static/images/jams/jams_16.png b/static/images/jams/jams_16.png deleted file mode 100644 index 1835c795..00000000 Binary files a/static/images/jams/jams_16.png and /dev/null differ diff --git a/static/images/jams/jams_17.png b/static/images/jams/jams_17.png deleted file mode 100644 index b62412f9..00000000 Binary files a/static/images/jams/jams_17.png and /dev/null differ diff --git a/static/images/jams/jams_2.png b/static/images/jams/jams_2.png deleted file mode 100644 index 486ace82..00000000 Binary files a/static/images/jams/jams_2.png and /dev/null differ diff --git a/static/images/jams/jams_3.png b/static/images/jams/jams_3.png deleted file mode 100644 index ea799afd..00000000 Binary files a/static/images/jams/jams_3.png and /dev/null differ diff --git a/static/images/jams/jams_4.png b/static/images/jams/jams_4.png deleted file mode 100644 index da73c511..00000000 Binary files a/static/images/jams/jams_4.png and /dev/null differ diff --git a/static/images/jams/jams_5.png b/static/images/jams/jams_5.png deleted file mode 100644 index f3782fd8..00000000 Binary files a/static/images/jams/jams_5.png and /dev/null differ diff --git a/static/images/jams/jams_6.png b/static/images/jams/jams_6.png deleted file mode 100644 index 83c74809..00000000 Binary files a/static/images/jams/jams_6.png and /dev/null differ diff --git a/static/images/jams/jams_7.png b/static/images/jams/jams_7.png deleted file mode 100644 index 1aacdff0..00000000 Binary files a/static/images/jams/jams_7.png and /dev/null differ diff --git a/static/images/jams/jams_8.png b/static/images/jams/jams_8.png deleted file mode 100644 index 9b1a9859..00000000 Binary files a/static/images/jams/jams_8.png and /dev/null differ diff --git a/static/images/jams/jams_9.png b/static/images/jams/jams_9.png deleted file mode 100644 index 9337af06..00000000 Binary files a/static/images/jams/jams_9.png and /dev/null differ diff --git a/static/images/jetbrains.png b/static/images/jetbrains.png deleted file mode 100644 index ccceb958..00000000 Binary files a/static/images/jetbrains.png and /dev/null differ diff --git a/static/images/partners/code monkeys.png b/static/images/partners/code monkeys.png deleted file mode 100644 index 198885a2..00000000 Binary files a/static/images/partners/code monkeys.png and /dev/null differ diff --git a/static/images/partners/functional programming.png b/static/images/partners/functional programming.png deleted file mode 100644 index dae5ac74..00000000 Binary files a/static/images/partners/functional programming.png and /dev/null differ diff --git a/static/images/partners/programming.png b/static/images/partners/programming.png deleted file mode 100644 index 75f4fbb1..00000000 Binary files a/static/images/partners/programming.png and /dev/null differ diff --git a/static/images/partners/stem.png b/static/images/partners/stem.png deleted file mode 100644 index 24ec97a7..00000000 Binary files a/static/images/partners/stem.png and /dev/null differ diff --git a/static/images/payment_icons/green.svg b/static/images/payment_icons/green.svg deleted file mode 100644 index 317ec1bf..00000000 --- a/static/images/payment_icons/green.svg +++ /dev/null @@ -1 +0,0 @@ -Artboard 1 \ No newline at end of file diff --git a/static/images/payment_icons/red.svg b/static/images/payment_icons/red.svg deleted file mode 100644 index 854334d4..00000000 --- a/static/images/payment_icons/red.svg +++ /dev/null @@ -1 +0,0 @@ -Artboard 1 \ No newline at end of file diff --git a/static/images/payment_icons/yellow.svg b/static/images/payment_icons/yellow.svg deleted file mode 100644 index 76a0bf4d..00000000 --- a/static/images/payment_icons/yellow.svg +++ /dev/null @@ -1 +0,0 @@ -Artboard 1 \ No newline at end of file diff --git a/static/js/script.js b/static/js/script.js deleted file mode 100644 index 3e01bd1b..00000000 --- a/static/js/script.js +++ /dev/null @@ -1,2 +0,0 @@ -"use strict";function getScript(url,integrity,cross_origin){const script=document.createElement("script");script.type="text/javascript",script.src=url,script.defer=!0,void 0!==integrity&&(script.integrity=integrity),void 0!==cross_origin&&(script.crossOrigin=cross_origin),document.getElementsByTagName("head")[0].appendChild(script)}function setClass(selector,my_class){document.querySelector(selector).className=my_class}function removeClass(selector,my_class){const element=document.querySelector(selector),reg=new RegExp(`(^| )${my_class}($| )`,"g");element.className=element.className.replace(reg," ")}function error_typewriter(){const app=document.getElementById("error"),typewriter=new Typewriter(app,{loop:!1,deleteSpeed:40,typingSpeed:"natural",devMode:!1});document.getElementById("terminal-close").onclick=function(){const app=document.getElementById("win"),current_class=app.getAttribute("class");app.setAttribute("class",`${current_class} uk-animation-scale-up uk-animation-reverse`),typewriter.stop()},typewriter.appendText("Python 3.6.4 (default, Jan 5 2018, 02:35:40)\n").appendText("[GCC 7.2.1 20171224] on darwin\n").appendText('Type "help", "copyright", "credits" or "license" for more information.\n').appendText(">>> ").pauseFor(1e3).typeString("impor requests").deleteChars(9).typeString("t requests\n").appendText(">>> ").pauseFor(750).changeSettings({typingSpeed:"natural"}).typeString(`response = requests.${window._RequestMethod}('https://pythim`).deleteChars(2).typeString("ondiscord.con/").deleteChars(2).typeString(`m${window._Path}')\n`).pauseFor(1e3).appendText(`<Response [${window._Code}]>\n>>> `).typeString("# hmmmm").pauseFor(1e3).deleteChars(7).pauseFor(1e3).typeString("response.text\n").appendText(`${window._ErrorMsg}\n>>> `).start()}setClass("html","prevent-fouc"),document.onreadystatechange=function(){"interactive"===document.readyState&&(removeClass("html","prevent-fouc"),getScript("https://pro.fontawesome.com/releases/v5.1.0/js/all.js","sha384-E5SpgaZcbSJx0Iabb3Jr2AfTRiFnrdOw1mhO19DzzrT9L+wCpDyHUG2q07aQdO6E","anonymous"),getScript("https://cdnjs.cloudflare.com/ajax/libs/ace/1.3.3/ace.js"),getScript("https://cdn.jsdelivr.net/npm/flatpickr"))},function(){const startjam=new Date(Date.UTC(2018,2,23)),endjam=new Date(Date.UTC(2018,2,26)),now=Date.now();let goal;if(now+1e3 Code Jam Countdown

    ...

    (Tap/click to dismiss)',pos:"bottom-right",timeout:endjam-now});const heading=document.getElementById("countdown-title");now>startjam.getTime()?(heading.innerHTML='Current code jam ends in...',goal=endjam.getTime()):(heading.innerHTML='Next code jam starts in...',goal=startjam.getTime());const refreshCountdown=setInterval(()=>{let delta=goal-Date.now();if(delta<=1e3)return clearInterval(refreshCountdown),location.reload();let days=Math.floor(delta/864e5);delta-=864e5*days;let hours=Math.floor(delta/36e5);delta-=36e5*hours;let minutes=Math.floor(delta/6e4);delta-=6e4*minutes;let seconds=Math.floor(delta/1e3);days<10&&(days=`0${days}`),hours<10&&(hours=`0${hours}`),minutes<10&&(minutes=`0${minutes}`),seconds<10&&(seconds=`0${seconds}`);try{document.getElementById("countdown-remaining").innerHTML=`${days}:${hours}:${minutes}:${seconds}`}catch(e){return clearInterval(refreshCountdown)}},500)}}();class JamActions{constructor(url,csrf_token){this.url=url,this.csrf_token=csrf_token}send(action,method,data,callback){data.action=action,$.ajax(this.url,{data:data,dataType:"json",headers:{"X-CSRFToken":this.csrf_token},method:method}).done(data=>callback(!("error_code"in data),data)).fail(()=>callback(!1))}send_json(action,method,data,callback){data.action=action,$.ajax(this.url,{data:JSON.stringify(data),dataType:"json",headers:{"X-CSRFToken":this.csrf_token},contentType:"application/json",method:method}).done(data=>callback(!("error_code"in data),data)).fail(()=>callback(!1))}set_state(jam,state,callback){this.send("state","POST",{jam:jam,state:state},callback)}get_questions(callback){this.send("questions","GET",{},callback)}create_question(data,callback){this.send_json("questions","POST",data,callback)}delete_question(id,callback){this.send("question","DELETE",{id:id},callback)}associate_question(form,question,callback){this.send("associate_question","POST",{form:form,question:question},callback)}disassociate_question(form,question,callback){this.send("disassociate_question","POST",{form:form,question:question},callback)}create_infraction(id,reason,number,callback){this.send("infraction","POST",{participant:id,reason:reason,number:number},callback)}delete_infraction(id,callback){this.send("infraction","DELETE",{id:id},callback)}approve_application(id,callback){this.send("approve_application","POST",{id:id},callback)}unapprove_application(id,callback){this.send("unapprove_application","POST",{id:id},callback)}generate_teams(jam,callback){this.send("generate_teams","POST",{jam:jam},callback)}create_team(jam,callback){this.send("create_team","POST",{jam:jam},callback)}reroll_team(team,callback){this.send("reroll_team","POST",{team:team},callback)}delete_team(team,callback){this.send("team","DELETE",{team:team},callback)}set_team_member(jam,member,team,callback){this.send("set_team_member","POST",{jam:jam,member:member,team:team},callback)}set_winning_team(team,callback){this.send("set_winning_team","POST",{team:team},callback)}unset_winning_team(jam,callback){this.send("unset_winning_team","POST",{jam:jam},callback)}}function revision_diff(revisions){const buttons=document.querySelectorAll("td input"),id_reg=/compare-(before|after)-([\w|-]+)/;function getRevisionId(element){const e=element.id.match(id_reg);return[e[1],e[2]]}function getRevision(id){return revisions.filter(x=>x.id===id)[0]}buttons.forEach(button=>{button.checked=!1,button.onchange=function(){!function(element){const id=getRevisionId(element),rev=getRevision(id[1]);let aft,bef;"after"===id[0]?(document.querySelector(`#compare-before-${id[1]}`).checked=!1,buttons.forEach(e=>{"after"===getRevisionId(e)[0]&&e.id!==element.id&&(e.checked=!1)})):(document.querySelector(`#compare-after-${id[1]}`).checked=!1,buttons.forEach(e=>{"before"===getRevisionId(e)[0]&&e.id!==element.id&&(e.checked=!1),"after"===getRevisionId(e)[0]&&(getRevision(getRevisionId(e)[1]).date<=rev.date?document.querySelector(`#${e.id}`).setAttribute("disabled",""):document.querySelector(`#${e.id}`).removeAttribute("disabled"))})),buttons.forEach(button=>{const id=getRevisionId(button);button.checked&&"before"===id[0]&&(bef=id[1]),button.checked&&"after"===id[0]&&(aft=id[1])}),document.getElementById("compare-submit").href=`/history/compare/${bef}/${aft}`}(button)}})}function wiki_sidebar(){const sidebar=document.getElementById("wiki-sidebar");document.getElementById("wiki-sidebar-button").onclick=function(){sidebar.classList.contains("uk-visible@s")?sidebar.classList.remove("uk-visible@s"):sidebar.classList.add("uk-visible@s")}}!function(global,factory){"object"==typeof exports&&"undefined"!=typeof module?module.exports=factory():"function"==typeof define&&define.amd?define(factory):global.moment=factory()}(this,function(){var hookCallback,some;function hooks(){return hookCallback.apply(null,arguments)}function isArray(input){return input instanceof Array||"[object Array]"===Object.prototype.toString.call(input)}function isObject(input){return null!=input&&"[object Object]"===Object.prototype.toString.call(input)}function isUndefined(input){return void 0===input}function isNumber(input){return"number"==typeof input||"[object Number]"===Object.prototype.toString.call(input)}function isDate(input){return input instanceof Date||"[object Date]"===Object.prototype.toString.call(input)}function map(arr,fn){var i,res=[];for(i=0;i>>0,i=0;i0)for(i=0;i=0?forceSign?"+":"":"-")+Math.pow(10,Math.max(0,zerosToFill)).toString().substr(1)+absNumber}var formattingTokens=/(\[[^\[]*\])|(\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g,localFormattingTokens=/(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g,formatFunctions={},formatTokenFunctions={};function addFormatToken(token,padded,ordinal,callback){var func=callback;"string"==typeof callback&&(func=function(){return this[callback]()}),token&&(formatTokenFunctions[token]=func),padded&&(formatTokenFunctions[padded[0]]=function(){return zeroFill(func.apply(this,arguments),padded[1],padded[2])}),ordinal&&(formatTokenFunctions[ordinal]=function(){return this.localeData().ordinal(func.apply(this,arguments),token)})}function formatMoment(m,format){return m.isValid()?(format=expandFormat(format,m.localeData()),formatFunctions[format]=formatFunctions[format]||function(format){var i,length,input,array=format.match(formattingTokens);for(i=0,length=array.length;i=0&&localFormattingTokens.test(format);)format=format.replace(localFormattingTokens,replaceLongDateFormatTokens),localFormattingTokens.lastIndex=0,i-=1;return format}var match1=/\d/,match2=/\d\d/,match3=/\d{3}/,match4=/\d{4}/,match6=/[+-]?\d{6}/,match1to2=/\d\d?/,match3to4=/\d\d\d\d?/,match5to6=/\d\d\d\d\d\d?/,match1to3=/\d{1,3}/,match1to4=/\d{1,4}/,match1to6=/[+-]?\d{1,6}/,matchUnsigned=/\d+/,matchSigned=/[+-]?\d+/,matchOffset=/Z|[+-]\d\d:?\d\d/gi,matchShortOffset=/Z|[+-]\d\d(?::?\d\d)?/gi,matchWord=/[0-9]{0,256}['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFF07\uFF10-\uFFEF]{1,256}|[\u0600-\u06FF\/]{1,256}(\s*?[\u0600-\u06FF]{1,256}){1,2}/i,regexes={};function addRegexToken(token,regex,strictRegex){regexes[token]=isFunction(regex)?regex:function(isStrict,localeData){return isStrict&&strictRegex?strictRegex:regex}}function getParseRegexForToken(token,config){return hasOwnProp(regexes,token)?regexes[token](config._strict,config._locale):new RegExp(regexEscape(token.replace("\\","").replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g,function(matched,p1,p2,p3,p4){return p1||p2||p3||p4})))}function regexEscape(s){return s.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&")}var tokens={};function addParseToken(token,callback){var i,func=callback;for("string"==typeof token&&(token=[token]),isNumber(callback)&&(func=function(input,array){array[callback]=toInt(input)}),i=0;i68?1900:2e3)};var indexOf,getSetYear=makeGetSet("FullYear",!0);function makeGetSet(unit,keepTime){return function(value){return null!=value?(set$1(this,unit,value),hooks.updateOffset(this,keepTime),this):get(this,unit)}}function get(mom,unit){return mom.isValid()?mom._d["get"+(mom._isUTC?"UTC":"")+unit]():NaN}function set$1(mom,unit,value){mom.isValid()&&!isNaN(value)&&("FullYear"===unit&&isLeapYear(mom.year())&&1===mom.month()&&29===mom.date()?mom._d["set"+(mom._isUTC?"UTC":"")+unit](value,mom.month(),daysInMonth(value,mom.month())):mom._d["set"+(mom._isUTC?"UTC":"")+unit](value))}function daysInMonth(year,month){if(isNaN(year)||isNaN(month))return NaN;var x,modMonth=(month%(x=12)+x)%x;return year+=(month-modMonth)/12,1===modMonth?isLeapYear(year)?29:28:31-modMonth%7%2}indexOf=Array.prototype.indexOf?Array.prototype.indexOf:function(o){var i;for(i=0;i=0&&isFinite(date.getUTCFullYear())&&date.setUTCFullYear(y),date}function firstWeekOffset(year,dow,doy){var fwd=7+dow-doy;return-((7+createUTCDate(year,0,fwd).getUTCDay()-dow)%7)+fwd-1}function dayOfYearFromWeeks(year,week,weekday,dow,doy){var resYear,resDayOfYear,dayOfYear=1+7*(week-1)+(7+weekday-dow)%7+firstWeekOffset(year,dow,doy);return dayOfYear<=0?resDayOfYear=daysInYear(resYear=year-1)+dayOfYear:dayOfYear>daysInYear(year)?(resYear=year+1,resDayOfYear=dayOfYear-daysInYear(year)):(resYear=year,resDayOfYear=dayOfYear),{year:resYear,dayOfYear:resDayOfYear}}function weekOfYear(mom,dow,doy){var resWeek,resYear,weekOffset=firstWeekOffset(mom.year(),dow,doy),week=Math.floor((mom.dayOfYear()-weekOffset-1)/7)+1;return week<1?resWeek=week+weeksInYear(resYear=mom.year()-1,dow,doy):week>weeksInYear(mom.year(),dow,doy)?(resWeek=week-weeksInYear(mom.year(),dow,doy),resYear=mom.year()+1):(resYear=mom.year(),resWeek=week),{week:resWeek,year:resYear}}function weeksInYear(year,dow,doy){var weekOffset=firstWeekOffset(year,dow,doy),weekOffsetNext=firstWeekOffset(year+1,dow,doy);return(daysInYear(year)-weekOffset+weekOffsetNext)/7}addFormatToken("w",["ww",2],"wo","week"),addFormatToken("W",["WW",2],"Wo","isoWeek"),addUnitAlias("week","w"),addUnitAlias("isoWeek","W"),addUnitPriority("week",5),addUnitPriority("isoWeek",5),addRegexToken("w",match1to2),addRegexToken("ww",match1to2,match2),addRegexToken("W",match1to2),addRegexToken("WW",match1to2,match2),addWeekParseToken(["w","ww","W","WW"],function(input,week,config,token){week[token.substr(0,1)]=toInt(input)});addFormatToken("d",0,"do","day"),addFormatToken("dd",0,0,function(format){return this.localeData().weekdaysMin(this,format)}),addFormatToken("ddd",0,0,function(format){return this.localeData().weekdaysShort(this,format)}),addFormatToken("dddd",0,0,function(format){return this.localeData().weekdays(this,format)}),addFormatToken("e",0,0,"weekday"),addFormatToken("E",0,0,"isoWeekday"),addUnitAlias("day","d"),addUnitAlias("weekday","e"),addUnitAlias("isoWeekday","E"),addUnitPriority("day",11),addUnitPriority("weekday",11),addUnitPriority("isoWeekday",11),addRegexToken("d",match1to2),addRegexToken("e",match1to2),addRegexToken("E",match1to2),addRegexToken("dd",function(isStrict,locale){return locale.weekdaysMinRegex(isStrict)}),addRegexToken("ddd",function(isStrict,locale){return locale.weekdaysShortRegex(isStrict)}),addRegexToken("dddd",function(isStrict,locale){return locale.weekdaysRegex(isStrict)}),addWeekParseToken(["dd","ddd","dddd"],function(input,week,config,token){var weekday=config._locale.weekdaysParse(input,token,config._strict);null!=weekday?week.d=weekday:getParsingFlags(config).invalidWeekday=input}),addWeekParseToken(["d","e","E"],function(input,week,config,token){week[token]=toInt(input)});var defaultLocaleWeekdays="Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_");var defaultLocaleWeekdaysShort="Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_");var defaultLocaleWeekdaysMin="Su_Mo_Tu_We_Th_Fr_Sa".split("_");var defaultWeekdaysRegex=matchWord;var defaultWeekdaysShortRegex=matchWord;var defaultWeekdaysMinRegex=matchWord;function computeWeekdaysParse(){function cmpLenRev(a,b){return b.length-a.length}var i,mom,minp,shortp,longp,minPieces=[],shortPieces=[],longPieces=[],mixedPieces=[];for(i=0;i<7;i++)mom=createUTC([2e3,1]).day(i),minp=this.weekdaysMin(mom,""),shortp=this.weekdaysShort(mom,""),longp=this.weekdays(mom,""),minPieces.push(minp),shortPieces.push(shortp),longPieces.push(longp),mixedPieces.push(minp),mixedPieces.push(shortp),mixedPieces.push(longp);for(minPieces.sort(cmpLenRev),shortPieces.sort(cmpLenRev),longPieces.sort(cmpLenRev),mixedPieces.sort(cmpLenRev),i=0;i<7;i++)shortPieces[i]=regexEscape(shortPieces[i]),longPieces[i]=regexEscape(longPieces[i]),mixedPieces[i]=regexEscape(mixedPieces[i]);this._weekdaysRegex=new RegExp("^("+mixedPieces.join("|")+")","i"),this._weekdaysShortRegex=this._weekdaysRegex,this._weekdaysMinRegex=this._weekdaysRegex,this._weekdaysStrictRegex=new RegExp("^("+longPieces.join("|")+")","i"),this._weekdaysShortStrictRegex=new RegExp("^("+shortPieces.join("|")+")","i"),this._weekdaysMinStrictRegex=new RegExp("^("+minPieces.join("|")+")","i")}function hFormat(){return this.hours()%12||12}function meridiem(token,lowercase){addFormatToken(token,0,0,function(){return this.localeData().meridiem(this.hours(),this.minutes(),lowercase)})}function matchMeridiem(isStrict,locale){return locale._meridiemParse}addFormatToken("H",["HH",2],0,"hour"),addFormatToken("h",["hh",2],0,hFormat),addFormatToken("k",["kk",2],0,function(){return this.hours()||24}),addFormatToken("hmm",0,0,function(){return""+hFormat.apply(this)+zeroFill(this.minutes(),2)}),addFormatToken("hmmss",0,0,function(){return""+hFormat.apply(this)+zeroFill(this.minutes(),2)+zeroFill(this.seconds(),2)}),addFormatToken("Hmm",0,0,function(){return""+this.hours()+zeroFill(this.minutes(),2)}),addFormatToken("Hmmss",0,0,function(){return""+this.hours()+zeroFill(this.minutes(),2)+zeroFill(this.seconds(),2)}),meridiem("a",!0),meridiem("A",!1),addUnitAlias("hour","h"),addUnitPriority("hour",13),addRegexToken("a",matchMeridiem),addRegexToken("A",matchMeridiem),addRegexToken("H",match1to2),addRegexToken("h",match1to2),addRegexToken("k",match1to2),addRegexToken("HH",match1to2,match2),addRegexToken("hh",match1to2,match2),addRegexToken("kk",match1to2,match2),addRegexToken("hmm",match3to4),addRegexToken("hmmss",match5to6),addRegexToken("Hmm",match3to4),addRegexToken("Hmmss",match5to6),addParseToken(["H","HH"],HOUR),addParseToken(["k","kk"],function(input,array,config){var kInput=toInt(input);array[HOUR]=24===kInput?0:kInput}),addParseToken(["a","A"],function(input,array,config){config._isPm=config._locale.isPM(input),config._meridiem=input}),addParseToken(["h","hh"],function(input,array,config){array[HOUR]=toInt(input),getParsingFlags(config).bigHour=!0}),addParseToken("hmm",function(input,array,config){var pos=input.length-2;array[HOUR]=toInt(input.substr(0,pos)),array[MINUTE]=toInt(input.substr(pos)),getParsingFlags(config).bigHour=!0}),addParseToken("hmmss",function(input,array,config){var pos1=input.length-4,pos2=input.length-2;array[HOUR]=toInt(input.substr(0,pos1)),array[MINUTE]=toInt(input.substr(pos1,2)),array[SECOND]=toInt(input.substr(pos2)),getParsingFlags(config).bigHour=!0}),addParseToken("Hmm",function(input,array,config){var pos=input.length-2;array[HOUR]=toInt(input.substr(0,pos)),array[MINUTE]=toInt(input.substr(pos))}),addParseToken("Hmmss",function(input,array,config){var pos1=input.length-4,pos2=input.length-2;array[HOUR]=toInt(input.substr(0,pos1)),array[MINUTE]=toInt(input.substr(pos1,2)),array[SECOND]=toInt(input.substr(pos2))});var globalLocale,getSetHour=makeGetSet("Hours",!0),baseConfig={calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},longDateFormat:{LTS:"h:mm:ss A",LT:"h:mm A",L:"MM/DD/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY h:mm A",LLLL:"dddd, MMMM D, YYYY h:mm A"},invalidDate:"Invalid date",ordinal:"%d",dayOfMonthOrdinalParse:/\d{1,2}/,relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},months:defaultLocaleMonths,monthsShort:defaultLocaleMonthsShort,week:{dow:0,doy:6},weekdays:defaultLocaleWeekdays,weekdaysMin:defaultLocaleWeekdaysMin,weekdaysShort:defaultLocaleWeekdaysShort,meridiemParse:/[ap]\.?m?\.?/i},locales={},localeFamilies={};function normalizeLocale(key){return key?key.toLowerCase().replace("_","-"):key}function loadLocale(name){var oldLocale=null;if(!locales[name]&&"undefined"!=typeof module&&module&&module.exports)try{oldLocale=globalLocale._abbr,require("./locale/"+name),getSetGlobalLocale(oldLocale)}catch(e){}return locales[name]}function getSetGlobalLocale(key,values){var data;return key&&((data=isUndefined(values)?getLocale(key):defineLocale(key,values))?globalLocale=data:"undefined"!=typeof console&&console.warn&&console.warn("Locale "+key+" not found. Did you forget to load it?")),globalLocale._abbr}function defineLocale(name,config){if(null!==config){var locale,parentConfig=baseConfig;if(config.abbr=name,null!=locales[name])deprecateSimple("defineLocaleOverride","use moment.updateLocale(localeName, config) to change an existing locale. moment.defineLocale(localeName, config) should only be used for creating a new locale See http://momentjs.com/guides/#/warnings/define-locale/ for more info."),parentConfig=locales[name]._config;else if(null!=config.parentLocale)if(null!=locales[config.parentLocale])parentConfig=locales[config.parentLocale]._config;else{if(null==(locale=loadLocale(config.parentLocale)))return localeFamilies[config.parentLocale]||(localeFamilies[config.parentLocale]=[]),localeFamilies[config.parentLocale].push({name:name,config:config}),null;parentConfig=locale._config}return locales[name]=new Locale(mergeConfigs(parentConfig,config)),localeFamilies[name]&&localeFamilies[name].forEach(function(x){defineLocale(x.name,x.config)}),getSetGlobalLocale(name),locales[name]}return delete locales[name],null}function getLocale(key){var locale;if(key&&key._locale&&key._locale._abbr&&(key=key._locale._abbr),!key)return globalLocale;if(!isArray(key)){if(locale=loadLocale(key))return locale;key=[key]}return function(names){for(var j,next,locale,split,i=0;i0;){if(locale=loadLocale(split.slice(0,j).join("-")))return locale;if(next&&next.length>=j&&compareArrays(split,next,!0)>=j-1)break;j--}i++}return globalLocale}(key)}function checkOverflow(m){var overflow,a=m._a;return a&&-2===getParsingFlags(m).overflow&&(overflow=a[MONTH]<0||a[MONTH]>11?MONTH:a[DATE]<1||a[DATE]>daysInMonth(a[YEAR],a[MONTH])?DATE:a[HOUR]<0||a[HOUR]>24||24===a[HOUR]&&(0!==a[MINUTE]||0!==a[SECOND]||0!==a[MILLISECOND])?HOUR:a[MINUTE]<0||a[MINUTE]>59?MINUTE:a[SECOND]<0||a[SECOND]>59?SECOND:a[MILLISECOND]<0||a[MILLISECOND]>999?MILLISECOND:-1,getParsingFlags(m)._overflowDayOfYear&&(overflowDATE)&&(overflow=DATE),getParsingFlags(m)._overflowWeeks&&-1===overflow&&(overflow=WEEK),getParsingFlags(m)._overflowWeekday&&-1===overflow&&(overflow=WEEKDAY),getParsingFlags(m).overflow=overflow),m}function defaults(a,b,c){return null!=a?a:null!=b?b:c}function configFromArray(config){var i,date,currentDate,expectedWeekday,yearToUse,input=[];if(!config._d){for(currentDate=function(config){var nowValue=new Date(hooks.now());return config._useUTC?[nowValue.getUTCFullYear(),nowValue.getUTCMonth(),nowValue.getUTCDate()]:[nowValue.getFullYear(),nowValue.getMonth(),nowValue.getDate()]}(config),config._w&&null==config._a[DATE]&&null==config._a[MONTH]&&function(config){var w,weekYear,week,weekday,dow,doy,temp,weekdayOverflow;if(null!=(w=config._w).GG||null!=w.W||null!=w.E)dow=1,doy=4,weekYear=defaults(w.GG,config._a[YEAR],weekOfYear(createLocal(),1,4).year),week=defaults(w.W,1),((weekday=defaults(w.E,1))<1||weekday>7)&&(weekdayOverflow=!0);else{dow=config._locale._week.dow,doy=config._locale._week.doy;var curWeek=weekOfYear(createLocal(),dow,doy);weekYear=defaults(w.gg,config._a[YEAR],curWeek.year),week=defaults(w.w,curWeek.week),null!=w.d?((weekday=w.d)<0||weekday>6)&&(weekdayOverflow=!0):null!=w.e?(weekday=w.e+dow,(w.e<0||w.e>6)&&(weekdayOverflow=!0)):weekday=dow}week<1||week>weeksInYear(weekYear,dow,doy)?getParsingFlags(config)._overflowWeeks=!0:null!=weekdayOverflow?getParsingFlags(config)._overflowWeekday=!0:(temp=dayOfYearFromWeeks(weekYear,week,weekday,dow,doy),config._a[YEAR]=temp.year,config._dayOfYear=temp.dayOfYear)}(config),null!=config._dayOfYear&&(yearToUse=defaults(config._a[YEAR],currentDate[YEAR]),(config._dayOfYear>daysInYear(yearToUse)||0===config._dayOfYear)&&(getParsingFlags(config)._overflowDayOfYear=!0),date=createUTCDate(yearToUse,0,config._dayOfYear),config._a[MONTH]=date.getUTCMonth(),config._a[DATE]=date.getUTCDate()),i=0;i<3&&null==config._a[i];++i)config._a[i]=input[i]=currentDate[i];for(;i<7;i++)config._a[i]=input[i]=null==config._a[i]?2===i?1:0:config._a[i];24===config._a[HOUR]&&0===config._a[MINUTE]&&0===config._a[SECOND]&&0===config._a[MILLISECOND]&&(config._nextDay=!0,config._a[HOUR]=0),config._d=(config._useUTC?createUTCDate:function(y,m,d,h,M,s,ms){var date=new Date(y,m,d,h,M,s,ms);return y<100&&y>=0&&isFinite(date.getFullYear())&&date.setFullYear(y),date}).apply(null,input),expectedWeekday=config._useUTC?config._d.getUTCDay():config._d.getDay(),null!=config._tzm&&config._d.setUTCMinutes(config._d.getUTCMinutes()-config._tzm),config._nextDay&&(config._a[HOUR]=24),config._w&&void 0!==config._w.d&&config._w.d!==expectedWeekday&&(getParsingFlags(config).weekdayMismatch=!0)}}var extendedIsoRegex=/^\s*((?:[+-]\d{6}|\d{4})-(?:\d\d-\d\d|W\d\d-\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?::\d\d(?::\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/,basicIsoRegex=/^\s*((?:[+-]\d{6}|\d{4})(?:\d\d\d\d|W\d\d\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?:\d\d(?:\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/,tzRegex=/Z|[+-]\d\d(?::?\d\d)?/,isoDates=[["YYYYYY-MM-DD",/[+-]\d{6}-\d\d-\d\d/],["YYYY-MM-DD",/\d{4}-\d\d-\d\d/],["GGGG-[W]WW-E",/\d{4}-W\d\d-\d/],["GGGG-[W]WW",/\d{4}-W\d\d/,!1],["YYYY-DDD",/\d{4}-\d{3}/],["YYYY-MM",/\d{4}-\d\d/,!1],["YYYYYYMMDD",/[+-]\d{10}/],["YYYYMMDD",/\d{8}/],["GGGG[W]WWE",/\d{4}W\d{3}/],["GGGG[W]WW",/\d{4}W\d{2}/,!1],["YYYYDDD",/\d{7}/]],isoTimes=[["HH:mm:ss.SSSS",/\d\d:\d\d:\d\d\.\d+/],["HH:mm:ss,SSSS",/\d\d:\d\d:\d\d,\d+/],["HH:mm:ss",/\d\d:\d\d:\d\d/],["HH:mm",/\d\d:\d\d/],["HHmmss.SSSS",/\d\d\d\d\d\d\.\d+/],["HHmmss,SSSS",/\d\d\d\d\d\d,\d+/],["HHmmss",/\d\d\d\d\d\d/],["HHmm",/\d\d\d\d/],["HH",/\d\d/]],aspNetJsonRegex=/^\/?Date\((\-?\d+)/i;function configFromISO(config){var i,l,allowTime,dateFormat,timeFormat,tzFormat,string=config._i,match=extendedIsoRegex.exec(string)||basicIsoRegex.exec(string);if(match){for(getParsingFlags(config).iso=!0,i=0,l=isoDates.length;i0&&getParsingFlags(config).unusedInput.push(skipped),string=string.slice(string.indexOf(parsedInput)+parsedInput.length),totalParsedInputLength+=parsedInput.length),formatTokenFunctions[token]?(parsedInput?getParsingFlags(config).empty=!1:getParsingFlags(config).unusedTokens.push(token),addTimeToArrayFromToken(token,parsedInput,config)):config._strict&&!parsedInput&&getParsingFlags(config).unusedTokens.push(token);getParsingFlags(config).charsLeftOver=stringLength-totalParsedInputLength,string.length>0&&getParsingFlags(config).unusedInput.push(string),config._a[HOUR]<=12&&!0===getParsingFlags(config).bigHour&&config._a[HOUR]>0&&(getParsingFlags(config).bigHour=void 0),getParsingFlags(config).parsedDateParts=config._a.slice(0),getParsingFlags(config).meridiem=config._meridiem,config._a[HOUR]=function(locale,hour,meridiem){var isPm;if(null==meridiem)return hour;return null!=locale.meridiemHour?locale.meridiemHour(hour,meridiem):null!=locale.isPM?((isPm=locale.isPM(meridiem))&&hour<12&&(hour+=12),isPm||12!==hour||(hour=0),hour):hour}(config._locale,config._a[HOUR],config._meridiem),configFromArray(config),checkOverflow(config)}else configFromRFC2822(config);else configFromISO(config)}function prepareConfig(config){var input=config._i,format=config._f;return config._locale=config._locale||getLocale(config._l),null===input||void 0===format&&""===input?createInvalid({nullInput:!0}):("string"==typeof input&&(config._i=input=config._locale.preparse(input)),isMoment(input)?new Moment(checkOverflow(input)):(isDate(input)?config._d=input:isArray(format)?function(config){var tempConfig,bestMoment,scoreToBeat,i,currentScore;if(0===config._f.length)return getParsingFlags(config).invalidFormat=!0,void(config._d=new Date(NaN));for(i=0;ithis?this:other:createInvalid()});function pickBy(fn,moments){var res,i;if(1===moments.length&&isArray(moments[0])&&(moments=moments[0]),!moments.length)return createLocal();for(res=moments[0],i=1;i(weeksTarget=weeksInYear(input,dow,doy))&&(week=weeksTarget),function(weekYear,week,weekday,dow,doy){var dayOfYearData=dayOfYearFromWeeks(weekYear,week,weekday,dow,doy),date=createUTCDate(dayOfYearData.year,0,dayOfYearData.dayOfYear);return this.year(date.getUTCFullYear()),this.month(date.getUTCMonth()),this.date(date.getUTCDate()),this}.call(this,input,week,weekday,dow,doy))}addFormatToken(0,["gg",2],0,function(){return this.weekYear()%100}),addFormatToken(0,["GG",2],0,function(){return this.isoWeekYear()%100}),addWeekYearFormatToken("gggg","weekYear"),addWeekYearFormatToken("ggggg","weekYear"),addWeekYearFormatToken("GGGG","isoWeekYear"),addWeekYearFormatToken("GGGGG","isoWeekYear"),addUnitAlias("weekYear","gg"),addUnitAlias("isoWeekYear","GG"),addUnitPriority("weekYear",1),addUnitPriority("isoWeekYear",1),addRegexToken("G",matchSigned),addRegexToken("g",matchSigned),addRegexToken("GG",match1to2,match2),addRegexToken("gg",match1to2,match2),addRegexToken("GGGG",match1to4,match4),addRegexToken("gggg",match1to4,match4),addRegexToken("GGGGG",match1to6,match6),addRegexToken("ggggg",match1to6,match6),addWeekParseToken(["gggg","ggggg","GGGG","GGGGG"],function(input,week,config,token){week[token.substr(0,2)]=toInt(input)}),addWeekParseToken(["gg","GG"],function(input,week,config,token){week[token]=hooks.parseTwoDigitYear(input)}),addFormatToken("Q",0,"Qo","quarter"),addUnitAlias("quarter","Q"),addUnitPriority("quarter",7),addRegexToken("Q",match1),addParseToken("Q",function(input,array){array[MONTH]=3*(toInt(input)-1)}),addFormatToken("D",["DD",2],"Do","date"),addUnitAlias("date","D"),addUnitPriority("date",9),addRegexToken("D",match1to2),addRegexToken("DD",match1to2,match2),addRegexToken("Do",function(isStrict,locale){return isStrict?locale._dayOfMonthOrdinalParse||locale._ordinalParse:locale._dayOfMonthOrdinalParseLenient}),addParseToken(["D","DD"],DATE),addParseToken("Do",function(input,array){array[DATE]=toInt(input.match(match1to2)[0])});var getSetDayOfMonth=makeGetSet("Date",!0);addFormatToken("DDD",["DDDD",3],"DDDo","dayOfYear"),addUnitAlias("dayOfYear","DDD"),addUnitPriority("dayOfYear",4),addRegexToken("DDD",match1to3),addRegexToken("DDDD",match3),addParseToken(["DDD","DDDD"],function(input,array,config){config._dayOfYear=toInt(input)}),addFormatToken("m",["mm",2],0,"minute"),addUnitAlias("minute","m"),addUnitPriority("minute",14),addRegexToken("m",match1to2),addRegexToken("mm",match1to2,match2),addParseToken(["m","mm"],MINUTE);var getSetMinute=makeGetSet("Minutes",!1);addFormatToken("s",["ss",2],0,"second"),addUnitAlias("second","s"),addUnitPriority("second",15),addRegexToken("s",match1to2),addRegexToken("ss",match1to2,match2),addParseToken(["s","ss"],SECOND);var token,getSetSecond=makeGetSet("Seconds",!1);for(addFormatToken("S",0,0,function(){return~~(this.millisecond()/100)}),addFormatToken(0,["SS",2],0,function(){return~~(this.millisecond()/10)}),addFormatToken(0,["SSS",3],0,"millisecond"),addFormatToken(0,["SSSS",4],0,function(){return 10*this.millisecond()}),addFormatToken(0,["SSSSS",5],0,function(){return 100*this.millisecond()}),addFormatToken(0,["SSSSSS",6],0,function(){return 1e3*this.millisecond()}),addFormatToken(0,["SSSSSSS",7],0,function(){return 1e4*this.millisecond()}),addFormatToken(0,["SSSSSSSS",8],0,function(){return 1e5*this.millisecond()}),addFormatToken(0,["SSSSSSSSS",9],0,function(){return 1e6*this.millisecond()}),addUnitAlias("millisecond","ms"),addUnitPriority("millisecond",16),addRegexToken("S",match1to3,match1),addRegexToken("SS",match1to3,match2),addRegexToken("SSS",match1to3,match3),token="SSSS";token.length<=9;token+="S")addRegexToken(token,matchUnsigned);function parseMs(input,array){array[MILLISECOND]=toInt(1e3*("0."+input))}for(token="S";token.length<=9;token+="S")addParseToken(token,parseMs);var getSetMillisecond=makeGetSet("Milliseconds",!1);addFormatToken("z",0,0,"zoneAbbr"),addFormatToken("zz",0,0,"zoneName");var proto=Moment.prototype;function preParsePostFormat(string){return string}proto.add=add,proto.calendar=function(time,formats){var now=time||createLocal(),sod=cloneWithOffset(now,this).startOf("day"),format=hooks.calendarFormat(this,sod)||"sameElse",output=formats&&(isFunction(formats[format])?formats[format].call(this,now):formats[format]);return this.format(output||this.localeData().calendar(format,this,createLocal(now)))},proto.clone=function(){return new Moment(this)},proto.diff=function(input,units,asFloat){var that,zoneDelta,output;if(!this.isValid())return NaN;if(!(that=cloneWithOffset(input,this)).isValid())return NaN;switch(zoneDelta=6e4*(that.utcOffset()-this.utcOffset()),units=normalizeUnits(units)){case"year":output=monthDiff(this,that)/12;break;case"month":output=monthDiff(this,that);break;case"quarter":output=monthDiff(this,that)/3;break;case"second":output=(this-that)/1e3;break;case"minute":output=(this-that)/6e4;break;case"hour":output=(this-that)/36e5;break;case"day":output=(this-that-zoneDelta)/864e5;break;case"week":output=(this-that-zoneDelta)/6048e5;break;default:output=this-that}return asFloat?output:absFloor(output)},proto.endOf=function(units){return void 0===(units=normalizeUnits(units))||"millisecond"===units?this:("date"===units&&(units="day"),this.startOf(units).add(1,"isoWeek"===units?"week":units).subtract(1,"ms"))},proto.format=function(inputString){inputString||(inputString=this.isUtc()?hooks.defaultFormatUtc:hooks.defaultFormat);var output=formatMoment(this,inputString);return this.localeData().postformat(output)},proto.from=function(time,withoutSuffix){return this.isValid()&&(isMoment(time)&&time.isValid()||createLocal(time).isValid())?createDuration({to:this,from:time}).locale(this.locale()).humanize(!withoutSuffix):this.localeData().invalidDate()},proto.fromNow=function(withoutSuffix){return this.from(createLocal(),withoutSuffix)},proto.to=function(time,withoutSuffix){return this.isValid()&&(isMoment(time)&&time.isValid()||createLocal(time).isValid())?createDuration({from:this,to:time}).locale(this.locale()).humanize(!withoutSuffix):this.localeData().invalidDate()},proto.toNow=function(withoutSuffix){return this.to(createLocal(),withoutSuffix)},proto.get=function(units){return isFunction(this[units=normalizeUnits(units)])?this[units]():this},proto.invalidAt=function(){return getParsingFlags(this).overflow},proto.isAfter=function(input,units){var localInput=isMoment(input)?input:createLocal(input);return!(!this.isValid()||!localInput.isValid())&&("millisecond"===(units=normalizeUnits(isUndefined(units)?"millisecond":units))?this.valueOf()>localInput.valueOf():localInput.valueOf()9999?formatMoment(m,utc?"YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]":"YYYYYY-MM-DD[T]HH:mm:ss.SSSZ"):isFunction(Date.prototype.toISOString)?utc?this.toDate().toISOString():new Date(this.valueOf()+60*this.utcOffset()*1e3).toISOString().replace("Z",formatMoment(m,"Z")):formatMoment(m,utc?"YYYY-MM-DD[T]HH:mm:ss.SSS[Z]":"YYYY-MM-DD[T]HH:mm:ss.SSSZ")},proto.inspect=function(){if(!this.isValid())return"moment.invalid(/* "+this._i+" */)";var func="moment",zone="";this.isLocal()||(func=0===this.utcOffset()?"moment.utc":"moment.parseZone",zone="Z");var prefix="["+func+'("]',year=0<=this.year()&&this.year()<=9999?"YYYY":"YYYYYY",suffix=zone+'[")]';return this.format(prefix+year+"-MM-DD[T]HH:mm:ss.SSS"+suffix)},proto.toJSON=function(){return this.isValid()?this.toISOString():null},proto.toString=function(){return this.clone().locale("en").format("ddd MMM DD YYYY HH:mm:ss [GMT]ZZ")},proto.unix=function(){return Math.floor(this.valueOf()/1e3)},proto.valueOf=function(){return this._d.valueOf()-6e4*(this._offset||0)},proto.creationData=function(){return{input:this._i,format:this._f,locale:this._locale,isUTC:this._isUTC,strict:this._strict}},proto.year=getSetYear,proto.isLeapYear=function(){return isLeapYear(this.year())},proto.weekYear=function(input){return getSetWeekYearHelper.call(this,input,this.week(),this.weekday(),this.localeData()._week.dow,this.localeData()._week.doy)},proto.isoWeekYear=function(input){return getSetWeekYearHelper.call(this,input,this.isoWeek(),this.isoWeekday(),1,4)},proto.quarter=proto.quarters=function(input){return null==input?Math.ceil((this.month()+1)/3):this.month(3*(input-1)+this.month()%3)},proto.month=getSetMonth,proto.daysInMonth=function(){return daysInMonth(this.year(),this.month())},proto.week=proto.weeks=function(input){var week=this.localeData().week(this);return null==input?week:this.add(7*(input-week),"d")},proto.isoWeek=proto.isoWeeks=function(input){var week=weekOfYear(this,1,4).week;return null==input?week:this.add(7*(input-week),"d")},proto.weeksInYear=function(){var weekInfo=this.localeData()._week;return weeksInYear(this.year(),weekInfo.dow,weekInfo.doy)},proto.isoWeeksInYear=function(){return weeksInYear(this.year(),1,4)},proto.date=getSetDayOfMonth,proto.day=proto.days=function(input){if(!this.isValid())return null!=input?this:NaN;var day=this._isUTC?this._d.getUTCDay():this._d.getDay();return null!=input?(input=function(input,locale){return"string"!=typeof input?input:isNaN(input)?"number"==typeof(input=locale.weekdaysParse(input))?input:null:parseInt(input,10)}(input,this.localeData()),this.add(input-day,"d")):day},proto.weekday=function(input){if(!this.isValid())return null!=input?this:NaN;var weekday=(this.day()+7-this.localeData()._week.dow)%7;return null==input?weekday:this.add(input-weekday,"d")},proto.isoWeekday=function(input){if(!this.isValid())return null!=input?this:NaN;if(null!=input){var weekday=function(input,locale){return"string"==typeof input?locale.weekdaysParse(input)%7||7:isNaN(input)?null:input}(input,this.localeData());return this.day(this.day()%7?weekday:weekday-7)}return this.day()||7},proto.dayOfYear=function(input){var dayOfYear=Math.round((this.clone().startOf("day")-this.clone().startOf("year"))/864e5)+1;return null==input?dayOfYear:this.add(input-dayOfYear,"d")},proto.hour=proto.hours=getSetHour,proto.minute=proto.minutes=getSetMinute,proto.second=proto.seconds=getSetSecond,proto.millisecond=proto.milliseconds=getSetMillisecond,proto.utcOffset=function(input,keepLocalTime,keepMinutes){var localAdjust,offset=this._offset||0;if(!this.isValid())return null!=input?this:NaN;if(null!=input){if("string"==typeof input){if(null===(input=offsetFromString(matchShortOffset,input)))return this}else Math.abs(input)<16&&!keepMinutes&&(input*=60);return!this._isUTC&&keepLocalTime&&(localAdjust=getDateOffset(this)),this._offset=input,this._isUTC=!0,null!=localAdjust&&this.add(localAdjust,"m"),offset!==input&&(!keepLocalTime||this._changeInProgress?addSubtract(this,createDuration(input-offset,"m"),1,!1):this._changeInProgress||(this._changeInProgress=!0,hooks.updateOffset(this,!0),this._changeInProgress=null)),this}return this._isUTC?offset:getDateOffset(this)},proto.utc=function(keepLocalTime){return this.utcOffset(0,keepLocalTime)},proto.local=function(keepLocalTime){return this._isUTC&&(this.utcOffset(0,keepLocalTime),this._isUTC=!1,keepLocalTime&&this.subtract(getDateOffset(this),"m")),this},proto.parseZone=function(){if(null!=this._tzm)this.utcOffset(this._tzm,!1,!0);else if("string"==typeof this._i){var tZone=offsetFromString(matchOffset,this._i);null!=tZone?this.utcOffset(tZone):this.utcOffset(0,!0)}return this},proto.hasAlignedHourOffset=function(input){return!!this.isValid()&&(input=input?createLocal(input).utcOffset():0,(this.utcOffset()-input)%60==0)},proto.isDST=function(){return this.utcOffset()>this.clone().month(0).utcOffset()||this.utcOffset()>this.clone().month(5).utcOffset()},proto.isLocal=function(){return!!this.isValid()&&!this._isUTC},proto.isUtcOffset=function(){return!!this.isValid()&&this._isUTC},proto.isUtc=isUtc,proto.isUTC=isUtc,proto.zoneAbbr=function(){return this._isUTC?"UTC":""},proto.zoneName=function(){return this._isUTC?"Coordinated Universal Time":""},proto.dates=deprecate("dates accessor is deprecated. Use date instead.",getSetDayOfMonth),proto.months=deprecate("months accessor is deprecated. Use month instead",getSetMonth),proto.years=deprecate("years accessor is deprecated. Use year instead",getSetYear),proto.zone=deprecate("moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/",function(input,keepLocalTime){return null!=input?("string"!=typeof input&&(input=-input),this.utcOffset(input,keepLocalTime),this):-this.utcOffset()}),proto.isDSTShifted=deprecate("isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information",function(){if(!isUndefined(this._isDSTShifted))return this._isDSTShifted;var c={};if(copyConfig(c,this),(c=prepareConfig(c))._a){var other=c._isUTC?createUTC(c._a):createLocal(c._a);this._isDSTShifted=this.isValid()&&compareArrays(c._a,other.toArray())>0}else this._isDSTShifted=!1;return this._isDSTShifted});var proto$1=Locale.prototype;function get$1(format,index,field,setter){var locale=getLocale(),utc=createUTC().set(setter,index);return locale[field](utc,format)}function listMonthsImpl(format,index,field){if(isNumber(format)&&(index=format,format=void 0),format=format||"",null!=index)return get$1(format,index,field,"month");var i,out=[];for(i=0;i<12;i++)out[i]=get$1(format,i,field,"month");return out}function listWeekdaysImpl(localeSorted,format,index,field){"boolean"==typeof localeSorted?(isNumber(format)&&(index=format,format=void 0),format=format||""):(index=format=localeSorted,localeSorted=!1,isNumber(format)&&(index=format,format=void 0),format=format||"");var i,locale=getLocale(),shift=localeSorted?locale._week.dow:0;if(null!=index)return get$1(format,(index+shift)%7,field,"day");var out=[];for(i=0;i<7;i++)out[i]=get$1(format,(i+shift)%7,field,"day");return out}proto$1.calendar=function(key,mom,now){var output=this._calendar[key]||this._calendar.sameElse;return isFunction(output)?output.call(mom,now):output},proto$1.longDateFormat=function(key){var format=this._longDateFormat[key],formatUpper=this._longDateFormat[key.toUpperCase()];return format||!formatUpper?format:(this._longDateFormat[key]=formatUpper.replace(/MMMM|MM|DD|dddd/g,function(val){return val.slice(1)}),this._longDateFormat[key])},proto$1.invalidDate=function(){return this._invalidDate},proto$1.ordinal=function(number){return this._ordinal.replace("%d",number)},proto$1.preparse=preParsePostFormat,proto$1.postformat=preParsePostFormat,proto$1.relativeTime=function(number,withoutSuffix,string,isFuture){var output=this._relativeTime[string];return isFunction(output)?output(number,withoutSuffix,string,isFuture):output.replace(/%d/i,number)},proto$1.pastFuture=function(diff,output){var format=this._relativeTime[diff>0?"future":"past"];return isFunction(format)?format(output):format.replace(/%s/i,output)},proto$1.set=function(config){var prop,i;for(i in config)isFunction(prop=config[i])?this[i]=prop:this["_"+i]=prop;this._config=config,this._dayOfMonthOrdinalParseLenient=new RegExp((this._dayOfMonthOrdinalParse.source||this._ordinalParse.source)+"|"+/\d{1,2}/.source)},proto$1.months=function(m,format){return m?isArray(this._months)?this._months[m.month()]:this._months[(this._months.isFormat||MONTHS_IN_FORMAT).test(format)?"format":"standalone"][m.month()]:isArray(this._months)?this._months:this._months.standalone},proto$1.monthsShort=function(m,format){return m?isArray(this._monthsShort)?this._monthsShort[m.month()]:this._monthsShort[MONTHS_IN_FORMAT.test(format)?"format":"standalone"][m.month()]:isArray(this._monthsShort)?this._monthsShort:this._monthsShort.standalone},proto$1.monthsParse=function(monthName,format,strict){var i,mom,regex;if(this._monthsParseExact)return function(monthName,format,strict){var i,ii,mom,llc=monthName.toLocaleLowerCase();if(!this._monthsParse)for(this._monthsParse=[],this._longMonthsParse=[],this._shortMonthsParse=[],i=0;i<12;++i)mom=createUTC([2e3,i]),this._shortMonthsParse[i]=this.monthsShort(mom,"").toLocaleLowerCase(),this._longMonthsParse[i]=this.months(mom,"").toLocaleLowerCase();return strict?"MMM"===format?-1!==(ii=indexOf.call(this._shortMonthsParse,llc))?ii:null:-1!==(ii=indexOf.call(this._longMonthsParse,llc))?ii:null:"MMM"===format?-1!==(ii=indexOf.call(this._shortMonthsParse,llc))?ii:-1!==(ii=indexOf.call(this._longMonthsParse,llc))?ii:null:-1!==(ii=indexOf.call(this._longMonthsParse,llc))?ii:-1!==(ii=indexOf.call(this._shortMonthsParse,llc))?ii:null}.call(this,monthName,format,strict);for(this._monthsParse||(this._monthsParse=[],this._longMonthsParse=[],this._shortMonthsParse=[]),i=0;i<12;i++){if(mom=createUTC([2e3,i]),strict&&!this._longMonthsParse[i]&&(this._longMonthsParse[i]=new RegExp("^"+this.months(mom,"").replace(".","")+"$","i"),this._shortMonthsParse[i]=new RegExp("^"+this.monthsShort(mom,"").replace(".","")+"$","i")),strict||this._monthsParse[i]||(regex="^"+this.months(mom,"")+"|^"+this.monthsShort(mom,""),this._monthsParse[i]=new RegExp(regex.replace(".",""),"i")),strict&&"MMMM"===format&&this._longMonthsParse[i].test(monthName))return i;if(strict&&"MMM"===format&&this._shortMonthsParse[i].test(monthName))return i;if(!strict&&this._monthsParse[i].test(monthName))return i}},proto$1.monthsRegex=function(isStrict){return this._monthsParseExact?(hasOwnProp(this,"_monthsRegex")||computeMonthsParse.call(this),isStrict?this._monthsStrictRegex:this._monthsRegex):(hasOwnProp(this,"_monthsRegex")||(this._monthsRegex=defaultMonthsRegex),this._monthsStrictRegex&&isStrict?this._monthsStrictRegex:this._monthsRegex)},proto$1.monthsShortRegex=function(isStrict){return this._monthsParseExact?(hasOwnProp(this,"_monthsRegex")||computeMonthsParse.call(this),isStrict?this._monthsShortStrictRegex:this._monthsShortRegex):(hasOwnProp(this,"_monthsShortRegex")||(this._monthsShortRegex=defaultMonthsShortRegex),this._monthsShortStrictRegex&&isStrict?this._monthsShortStrictRegex:this._monthsShortRegex)},proto$1.week=function(mom){return weekOfYear(mom,this._week.dow,this._week.doy).week},proto$1.firstDayOfYear=function(){return this._week.doy},proto$1.firstDayOfWeek=function(){return this._week.dow},proto$1.weekdays=function(m,format){return m?isArray(this._weekdays)?this._weekdays[m.day()]:this._weekdays[this._weekdays.isFormat.test(format)?"format":"standalone"][m.day()]:isArray(this._weekdays)?this._weekdays:this._weekdays.standalone},proto$1.weekdaysMin=function(m){return m?this._weekdaysMin[m.day()]:this._weekdaysMin},proto$1.weekdaysShort=function(m){return m?this._weekdaysShort[m.day()]:this._weekdaysShort},proto$1.weekdaysParse=function(weekdayName,format,strict){var i,mom,regex;if(this._weekdaysParseExact)return function(weekdayName,format,strict){var i,ii,mom,llc=weekdayName.toLocaleLowerCase();if(!this._weekdaysParse)for(this._weekdaysParse=[],this._shortWeekdaysParse=[],this._minWeekdaysParse=[],i=0;i<7;++i)mom=createUTC([2e3,1]).day(i),this._minWeekdaysParse[i]=this.weekdaysMin(mom,"").toLocaleLowerCase(),this._shortWeekdaysParse[i]=this.weekdaysShort(mom,"").toLocaleLowerCase(),this._weekdaysParse[i]=this.weekdays(mom,"").toLocaleLowerCase();return strict?"dddd"===format?-1!==(ii=indexOf.call(this._weekdaysParse,llc))?ii:null:"ddd"===format?-1!==(ii=indexOf.call(this._shortWeekdaysParse,llc))?ii:null:-1!==(ii=indexOf.call(this._minWeekdaysParse,llc))?ii:null:"dddd"===format?-1!==(ii=indexOf.call(this._weekdaysParse,llc))?ii:-1!==(ii=indexOf.call(this._shortWeekdaysParse,llc))?ii:-1!==(ii=indexOf.call(this._minWeekdaysParse,llc))?ii:null:"ddd"===format?-1!==(ii=indexOf.call(this._shortWeekdaysParse,llc))?ii:-1!==(ii=indexOf.call(this._weekdaysParse,llc))?ii:-1!==(ii=indexOf.call(this._minWeekdaysParse,llc))?ii:null:-1!==(ii=indexOf.call(this._minWeekdaysParse,llc))?ii:-1!==(ii=indexOf.call(this._weekdaysParse,llc))?ii:-1!==(ii=indexOf.call(this._shortWeekdaysParse,llc))?ii:null}.call(this,weekdayName,format,strict);for(this._weekdaysParse||(this._weekdaysParse=[],this._minWeekdaysParse=[],this._shortWeekdaysParse=[],this._fullWeekdaysParse=[]),i=0;i<7;i++){if(mom=createUTC([2e3,1]).day(i),strict&&!this._fullWeekdaysParse[i]&&(this._fullWeekdaysParse[i]=new RegExp("^"+this.weekdays(mom,"").replace(".","\\.?")+"$","i"),this._shortWeekdaysParse[i]=new RegExp("^"+this.weekdaysShort(mom,"").replace(".","\\.?")+"$","i"),this._minWeekdaysParse[i]=new RegExp("^"+this.weekdaysMin(mom,"").replace(".","\\.?")+"$","i")),this._weekdaysParse[i]||(regex="^"+this.weekdays(mom,"")+"|^"+this.weekdaysShort(mom,"")+"|^"+this.weekdaysMin(mom,""),this._weekdaysParse[i]=new RegExp(regex.replace(".",""),"i")),strict&&"dddd"===format&&this._fullWeekdaysParse[i].test(weekdayName))return i;if(strict&&"ddd"===format&&this._shortWeekdaysParse[i].test(weekdayName))return i;if(strict&&"dd"===format&&this._minWeekdaysParse[i].test(weekdayName))return i;if(!strict&&this._weekdaysParse[i].test(weekdayName))return i}},proto$1.weekdaysRegex=function(isStrict){return this._weekdaysParseExact?(hasOwnProp(this,"_weekdaysRegex")||computeWeekdaysParse.call(this),isStrict?this._weekdaysStrictRegex:this._weekdaysRegex):(hasOwnProp(this,"_weekdaysRegex")||(this._weekdaysRegex=defaultWeekdaysRegex),this._weekdaysStrictRegex&&isStrict?this._weekdaysStrictRegex:this._weekdaysRegex)},proto$1.weekdaysShortRegex=function(isStrict){return this._weekdaysParseExact?(hasOwnProp(this,"_weekdaysRegex")||computeWeekdaysParse.call(this),isStrict?this._weekdaysShortStrictRegex:this._weekdaysShortRegex):(hasOwnProp(this,"_weekdaysShortRegex")||(this._weekdaysShortRegex=defaultWeekdaysShortRegex),this._weekdaysShortStrictRegex&&isStrict?this._weekdaysShortStrictRegex:this._weekdaysShortRegex)},proto$1.weekdaysMinRegex=function(isStrict){return this._weekdaysParseExact?(hasOwnProp(this,"_weekdaysRegex")||computeWeekdaysParse.call(this),isStrict?this._weekdaysMinStrictRegex:this._weekdaysMinRegex):(hasOwnProp(this,"_weekdaysMinRegex")||(this._weekdaysMinRegex=defaultWeekdaysMinRegex),this._weekdaysMinStrictRegex&&isStrict?this._weekdaysMinStrictRegex:this._weekdaysMinRegex)},proto$1.isPM=function(input){return"p"===(input+"").toLowerCase().charAt(0)},proto$1.meridiem=function(hours,minutes,isLower){return hours>11?isLower?"pm":"PM":isLower?"am":"AM"},getSetGlobalLocale("en",{dayOfMonthOrdinalParse:/\d{1,2}(th|st|nd|rd)/,ordinal:function(number){var b=number%10;return number+(1===toInt(number%100/10)?"th":1===b?"st":2===b?"nd":3===b?"rd":"th")}}),hooks.lang=deprecate("moment.lang is deprecated. Use moment.locale instead.",getSetGlobalLocale),hooks.langData=deprecate("moment.langData is deprecated. Use moment.localeData instead.",getLocale);var mathAbs=Math.abs;function addSubtract$1(duration,input,value,direction){var other=createDuration(input,value);return duration._milliseconds+=direction*other._milliseconds,duration._days+=direction*other._days,duration._months+=direction*other._months,duration._bubble()}function absCeil(number){return number<0?Math.floor(number):Math.ceil(number)}function daysToMonths(days){return 4800*days/146097}function monthsToDays(months){return 146097*months/4800}function makeAs(alias){return function(){return this.as(alias)}}var asMilliseconds=makeAs("ms"),asSeconds=makeAs("s"),asMinutes=makeAs("m"),asHours=makeAs("h"),asDays=makeAs("d"),asWeeks=makeAs("w"),asMonths=makeAs("M"),asYears=makeAs("y");function makeGetter(name){return function(){return this.isValid()?this._data[name]:NaN}}var milliseconds=makeGetter("milliseconds"),seconds=makeGetter("seconds"),minutes=makeGetter("minutes"),hours=makeGetter("hours"),days=makeGetter("days"),months=makeGetter("months"),years=makeGetter("years");var round=Math.round,thresholds={ss:44,s:45,m:45,h:22,d:26,M:11};var abs$1=Math.abs;function sign(x){return(x>0)-(x<0)||+x}function toISOString$1(){if(!this.isValid())return this.localeData().invalidDate();var minutes,hours,seconds=abs$1(this._milliseconds)/1e3,days=abs$1(this._days),months=abs$1(this._months);hours=absFloor((minutes=absFloor(seconds/60))/60),seconds%=60,minutes%=60;var Y=absFloor(months/12),M=months%=12,D=days,h=hours,m=minutes,s=seconds?seconds.toFixed(3).replace(/\.?0+$/,""):"",total=this.asSeconds();if(!total)return"P0D";var totalSign=total<0?"-":"",ymSign=sign(this._months)!==sign(total)?"-":"",daysSign=sign(this._days)!==sign(total)?"-":"",hmsSign=sign(this._milliseconds)!==sign(total)?"-":"";return totalSign+"P"+(Y?ymSign+Y+"Y":"")+(M?ymSign+M+"M":"")+(D?daysSign+D+"D":"")+(h||m||s?"T":"")+(h?hmsSign+h+"H":"")+(m?hmsSign+m+"M":"")+(s?hmsSign+s+"S":"")}var proto$2=Duration.prototype;return proto$2.isValid=function(){return this._isValid},proto$2.abs=function(){var data=this._data;return this._milliseconds=mathAbs(this._milliseconds),this._days=mathAbs(this._days),this._months=mathAbs(this._months),data.milliseconds=mathAbs(data.milliseconds),data.seconds=mathAbs(data.seconds),data.minutes=mathAbs(data.minutes),data.hours=mathAbs(data.hours),data.months=mathAbs(data.months),data.years=mathAbs(data.years),this},proto$2.add=function(input,value){return addSubtract$1(this,input,value,1)},proto$2.subtract=function(input,value){return addSubtract$1(this,input,value,-1)},proto$2.as=function(units){if(!this.isValid())return NaN;var days,months,milliseconds=this._milliseconds;if("month"===(units=normalizeUnits(units))||"year"===units)return days=this._days+milliseconds/864e5,months=this._months+daysToMonths(days),"month"===units?months:months/12;switch(days=this._days+Math.round(monthsToDays(this._months)),units){case"week":return days/7+milliseconds/6048e5;case"day":return days+milliseconds/864e5;case"hour":return 24*days+milliseconds/36e5;case"minute":return 1440*days+milliseconds/6e4;case"second":return 86400*days+milliseconds/1e3;case"millisecond":return Math.floor(864e5*days)+milliseconds;default:throw new Error("Unknown unit "+units)}},proto$2.asMilliseconds=asMilliseconds,proto$2.asSeconds=asSeconds,proto$2.asMinutes=asMinutes,proto$2.asHours=asHours,proto$2.asDays=asDays,proto$2.asWeeks=asWeeks,proto$2.asMonths=asMonths,proto$2.asYears=asYears,proto$2.valueOf=function(){return this.isValid()?this._milliseconds+864e5*this._days+this._months%12*2592e6+31536e6*toInt(this._months/12):NaN},proto$2._bubble=function(){var seconds,minutes,hours,years,monthsFromDays,milliseconds=this._milliseconds,days=this._days,months=this._months,data=this._data;return milliseconds>=0&&days>=0&&months>=0||milliseconds<=0&&days<=0&&months<=0||(milliseconds+=864e5*absCeil(monthsToDays(months)+days),days=0,months=0),data.milliseconds=milliseconds%1e3,seconds=absFloor(milliseconds/1e3),data.seconds=seconds%60,minutes=absFloor(seconds/60),data.minutes=minutes%60,hours=absFloor(minutes/60),data.hours=hours%24,months+=monthsFromDays=absFloor(daysToMonths(days+=absFloor(hours/24))),days-=absCeil(monthsToDays(monthsFromDays)),years=absFloor(months/12),months%=12,data.days=days,data.months=months,data.years=years,this},proto$2.clone=function(){return createDuration(this)},proto$2.get=function(units){return units=normalizeUnits(units),this.isValid()?this[units+"s"]():NaN},proto$2.milliseconds=milliseconds,proto$2.seconds=seconds,proto$2.minutes=minutes,proto$2.hours=hours,proto$2.days=days,proto$2.weeks=function(){return absFloor(this.days()/7)},proto$2.months=months,proto$2.years=years,proto$2.humanize=function(withSuffix){if(!this.isValid())return this.localeData().invalidDate();var locale=this.localeData(),output=function(posNegDuration,withoutSuffix,locale){var duration=createDuration(posNegDuration).abs(),seconds=round(duration.as("s")),minutes=round(duration.as("m")),hours=round(duration.as("h")),days=round(duration.as("d")),months=round(duration.as("M")),years=round(duration.as("y")),a=seconds<=thresholds.ss&&["s",seconds]||seconds0,a[4]=locale,function(string,number,withoutSuffix,isFuture,locale){return locale.relativeTime(number||1,!!withoutSuffix,string,isFuture)}.apply(null,a)}(this,!withSuffix,locale);return withSuffix&&(output=locale.pastFuture(+this,output)),locale.postformat(output)},proto$2.toISOString=toISOString$1,proto$2.toString=toISOString$1,proto$2.toJSON=toISOString$1,proto$2.locale=locale,proto$2.localeData=localeData,proto$2.toIsoString=deprecate("toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)",toISOString$1),proto$2.lang=lang,addFormatToken("X",0,0,"unix"),addFormatToken("x",0,0,"valueOf"),addRegexToken("x",matchSigned),addRegexToken("X",/[+-]?\d+(\.\d{1,3})?/),addParseToken("X",function(input,array,config){config._d=new Date(1e3*parseFloat(input,10))}),addParseToken("x",function(input,array,config){config._d=new Date(toInt(input))}),hooks.version="2.22.2",hookCallback=createLocal,hooks.fn=proto,hooks.min=function(){return pickBy("isBefore",[].slice.call(arguments,0))},hooks.max=function(){return pickBy("isAfter",[].slice.call(arguments,0))},hooks.now=function(){return Date.now?Date.now():+new Date},hooks.utc=createUTC,hooks.unix=function(input){return createLocal(1e3*input)},hooks.months=function(format,index){return listMonthsImpl(format,index,"months")},hooks.isDate=isDate,hooks.locale=getSetGlobalLocale,hooks.invalid=createInvalid,hooks.duration=createDuration,hooks.isMoment=isMoment,hooks.weekdays=function(localeSorted,format,index){return listWeekdaysImpl(localeSorted,format,index,"weekdays")},hooks.parseZone=function(){return createLocal.apply(null,arguments).parseZone()},hooks.localeData=getLocale,hooks.isDuration=isDuration,hooks.monthsShort=function(format,index){return listMonthsImpl(format,index,"monthsShort")},hooks.weekdaysMin=function(localeSorted,format,index){return listWeekdaysImpl(localeSorted,format,index,"weekdaysMin")},hooks.defineLocale=defineLocale,hooks.updateLocale=function(name,config){if(null!=config){var locale,tmpLocale,parentConfig=baseConfig;null!=(tmpLocale=loadLocale(name))&&(parentConfig=tmpLocale._config),(locale=new Locale(config=mergeConfigs(parentConfig,config))).parentLocale=locales[name],locales[name]=locale,getSetGlobalLocale(name)}else null!=locales[name]&&(null!=locales[name].parentLocale?locales[name]=locales[name].parentLocale:null!=locales[name]&&delete locales[name]);return locales[name]},hooks.locales=function(){return keys(locales)},hooks.weekdaysShort=function(localeSorted,format,index){return listWeekdaysImpl(localeSorted,format,index,"weekdaysShort")},hooks.normalizeUnits=normalizeUnits,hooks.relativeTimeRounding=function(roundingFunction){return void 0===roundingFunction?round:"function"==typeof roundingFunction&&(round=roundingFunction,!0)},hooks.relativeTimeThreshold=function(threshold,limit){return void 0!==thresholds[threshold]&&(void 0===limit?thresholds[threshold]:(thresholds[threshold]=limit,"s"===threshold&&(thresholds.ss=limit-1),!0))},hooks.calendarFormat=function(myMoment,now){var diff=myMoment.diff(now,"days",!0);return diff<-6?"sameElse":diff<-1?"lastWeek":diff<0?"lastDay":diff<1?"sameDay":diff<2?"nextDay":diff<7?"nextWeek":"sameElse"},hooks.prototype=proto,hooks.HTML5_FMT={DATETIME_LOCAL:"YYYY-MM-DDTHH:mm",DATETIME_LOCAL_SECONDS:"YYYY-MM-DDTHH:mm:ss",DATETIME_LOCAL_MS:"YYYY-MM-DDTHH:mm:ss.SSS",DATE:"YYYY-MM-DD",TIME:"HH:mm",TIME_SECONDS:"HH:mm:ss",TIME_MS:"HH:mm:ss.SSS",WEEK:"YYYY-[W]WW",MONTH:"YYYY-MM"},hooks}),function(global,factory){"object"==typeof module&&"object"==typeof module.exports?module.exports=global.document?factory(global,!0):function(w){if(!w.document)throw new Error("jQuery requires a window with a document");return factory(w)}:factory(global)}("undefined"!=typeof window?window:this,function(window,noGlobal){var arr=[],document=window.document,getProto=Object.getPrototypeOf,slice=arr.slice,concat=arr.concat,push=arr.push,indexOf=arr.indexOf,class2type={},toString=class2type.toString,hasOwn=class2type.hasOwnProperty,fnToString=hasOwn.toString,ObjectFunctionString=fnToString.call(Object),support={},isFunction=function(obj){return"function"==typeof obj&&"number"!=typeof obj.nodeType},isWindow=function(obj){return null!=obj&&obj===obj.window},preservedScriptAttributes={type:!0,src:!0,noModule:!0};function DOMEval(code,doc,node){var i,script=(doc=doc||document).createElement("script");if(script.text=code,node)for(i in preservedScriptAttributes)node[i]&&(script[i]=node[i]);doc.head.appendChild(script).parentNode.removeChild(script)}function toType(obj){return null==obj?obj+"":"object"==typeof obj||"function"==typeof obj?class2type[toString.call(obj)]||"object":typeof obj}var jQuery=function(selector,context){return new jQuery.fn.init(selector,context)},rtrim=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;function isArrayLike(obj){var length=!!obj&&"length"in obj&&obj.length,type=toType(obj);return!isFunction(obj)&&!isWindow(obj)&&("array"===type||0===length||"number"==typeof length&&length>0&&length-1 in obj)}jQuery.fn=jQuery.prototype={jquery:"3.3.1",constructor:jQuery,length:0,toArray:function(){return slice.call(this)},get:function(num){return null==num?slice.call(this):num<0?this[num+this.length]:this[num]},pushStack:function(elems){var ret=jQuery.merge(this.constructor(),elems);return ret.prevObject=this,ret},each:function(callback){return jQuery.each(this,callback)},map:function(callback){return this.pushStack(jQuery.map(this,function(elem,i){return callback.call(elem,i,elem)}))},slice:function(){return this.pushStack(slice.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(i){var len=this.length,j=+i+(i<0?len:0);return this.pushStack(j>=0&&j+~]|"+whitespace+")"+whitespace+"*"),rattributeQuotes=new RegExp("="+whitespace+"*([^\\]'\"]*?)"+whitespace+"*\\]","g"),rpseudo=new RegExp(pseudos),ridentifier=new RegExp("^"+identifier+"$"),matchExpr={ID:new RegExp("^#("+identifier+")"),CLASS:new RegExp("^\\.("+identifier+")"),TAG:new RegExp("^("+identifier+"|[*])"),ATTR:new RegExp("^"+attributes),PSEUDO:new RegExp("^"+pseudos),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+whitespace+"*(even|odd|(([+-]|)(\\d*)n|)"+whitespace+"*(?:([+-]|)"+whitespace+"*(\\d+)|))"+whitespace+"*\\)|)","i"),bool:new RegExp("^(?:"+booleans+")$","i"),needsContext:new RegExp("^"+whitespace+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+whitespace+"*((?:-\\d)?\\d*)"+whitespace+"*\\)|)(?=[^-]|$)","i")},rinputs=/^(?:input|select|textarea|button)$/i,rheader=/^h\d$/i,rnative=/^[^{]+\{\s*\[native \w/,rquickExpr=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,rsibling=/[+~]/,runescape=new RegExp("\\\\([\\da-f]{1,6}"+whitespace+"?|("+whitespace+")|.)","ig"),funescape=function(_,escaped,escapedWhitespace){var high="0x"+escaped-65536;return high!=high||escapedWhitespace?escaped:high<0?String.fromCharCode(high+65536):String.fromCharCode(high>>10|55296,1023&high|56320)},rcssescape=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,fcssescape=function(ch,asCodePoint){return asCodePoint?"\0"===ch?"�":ch.slice(0,-1)+"\\"+ch.charCodeAt(ch.length-1).toString(16)+" ":"\\"+ch},unloadHandler=function(){setDocument()},disabledAncestor=addCombinator(function(elem){return!0===elem.disabled&&("form"in elem||"label"in elem)},{dir:"parentNode",next:"legend"});try{push.apply(arr=slice.call(preferredDoc.childNodes),preferredDoc.childNodes),arr[preferredDoc.childNodes.length].nodeType}catch(e){push={apply:arr.length?function(target,els){push_native.apply(target,slice.call(els))}:function(target,els){for(var j=target.length,i=0;target[j++]=els[i++];);target.length=j-1}}}function Sizzle(selector,context,results,seed){var m,i,elem,nid,match,groups,newSelector,newContext=context&&context.ownerDocument,nodeType=context?context.nodeType:9;if(results=results||[],"string"!=typeof selector||!selector||1!==nodeType&&9!==nodeType&&11!==nodeType)return results;if(!seed&&((context?context.ownerDocument||context:preferredDoc)!==document&&setDocument(context),context=context||document,documentIsHTML)){if(11!==nodeType&&(match=rquickExpr.exec(selector)))if(m=match[1]){if(9===nodeType){if(!(elem=context.getElementById(m)))return results;if(elem.id===m)return results.push(elem),results}else if(newContext&&(elem=newContext.getElementById(m))&&contains(context,elem)&&elem.id===m)return results.push(elem),results}else{if(match[2])return push.apply(results,context.getElementsByTagName(selector)),results;if((m=match[3])&&support.getElementsByClassName&&context.getElementsByClassName)return push.apply(results,context.getElementsByClassName(m)),results}if(support.qsa&&!compilerCache[selector+" "]&&(!rbuggyQSA||!rbuggyQSA.test(selector))){if(1!==nodeType)newContext=context,newSelector=selector;else if("object"!==context.nodeName.toLowerCase()){for((nid=context.getAttribute("id"))?nid=nid.replace(rcssescape,fcssescape):context.setAttribute("id",nid=expando),i=(groups=tokenize(selector)).length;i--;)groups[i]="#"+nid+" "+toSelector(groups[i]);newSelector=groups.join(","),newContext=rsibling.test(selector)&&testContext(context.parentNode)||context}if(newSelector)try{return push.apply(results,newContext.querySelectorAll(newSelector)),results}catch(qsaError){}finally{nid===expando&&context.removeAttribute("id")}}}return select(selector.replace(rtrim,"$1"),context,results,seed)}function createCache(){var keys=[];return function cache(key,value){return keys.push(key+" ")>Expr.cacheLength&&delete cache[keys.shift()],cache[key+" "]=value}}function markFunction(fn){return fn[expando]=!0,fn}function assert(fn){var el=document.createElement("fieldset");try{return!!fn(el)}catch(e){return!1}finally{el.parentNode&&el.parentNode.removeChild(el),el=null}}function addHandle(attrs,handler){for(var arr=attrs.split("|"),i=arr.length;i--;)Expr.attrHandle[arr[i]]=handler}function siblingCheck(a,b){var cur=b&&a,diff=cur&&1===a.nodeType&&1===b.nodeType&&a.sourceIndex-b.sourceIndex;if(diff)return diff;if(cur)for(;cur=cur.nextSibling;)if(cur===b)return-1;return a?1:-1}function createInputPseudo(type){return function(elem){return"input"===elem.nodeName.toLowerCase()&&elem.type===type}}function createButtonPseudo(type){return function(elem){var name=elem.nodeName.toLowerCase();return("input"===name||"button"===name)&&elem.type===type}}function createDisabledPseudo(disabled){return function(elem){return"form"in elem?elem.parentNode&&!1===elem.disabled?"label"in elem?"label"in elem.parentNode?elem.parentNode.disabled===disabled:elem.disabled===disabled:elem.isDisabled===disabled||elem.isDisabled!==!disabled&&disabledAncestor(elem)===disabled:elem.disabled===disabled:"label"in elem&&elem.disabled===disabled}}function createPositionalPseudo(fn){return markFunction(function(argument){return argument=+argument,markFunction(function(seed,matches){for(var j,matchIndexes=fn([],seed.length,argument),i=matchIndexes.length;i--;)seed[j=matchIndexes[i]]&&(seed[j]=!(matches[j]=seed[j]))})})}function testContext(context){return context&&void 0!==context.getElementsByTagName&&context}for(i in support=Sizzle.support={},isXML=Sizzle.isXML=function(elem){var documentElement=elem&&(elem.ownerDocument||elem).documentElement;return!!documentElement&&"HTML"!==documentElement.nodeName},setDocument=Sizzle.setDocument=function(node){var hasCompare,subWindow,doc=node?node.ownerDocument||node:preferredDoc;return doc!==document&&9===doc.nodeType&&doc.documentElement?(docElem=(document=doc).documentElement,documentIsHTML=!isXML(document),preferredDoc!==document&&(subWindow=document.defaultView)&&subWindow.top!==subWindow&&(subWindow.addEventListener?subWindow.addEventListener("unload",unloadHandler,!1):subWindow.attachEvent&&subWindow.attachEvent("onunload",unloadHandler)),support.attributes=assert(function(el){return el.className="i",!el.getAttribute("className")}),support.getElementsByTagName=assert(function(el){return el.appendChild(document.createComment("")),!el.getElementsByTagName("*").length}),support.getElementsByClassName=rnative.test(document.getElementsByClassName),support.getById=assert(function(el){return docElem.appendChild(el).id=expando,!document.getElementsByName||!document.getElementsByName(expando).length}),support.getById?(Expr.filter.ID=function(id){var attrId=id.replace(runescape,funescape);return function(elem){return elem.getAttribute("id")===attrId}},Expr.find.ID=function(id,context){if(void 0!==context.getElementById&&documentIsHTML){var elem=context.getElementById(id);return elem?[elem]:[]}}):(Expr.filter.ID=function(id){var attrId=id.replace(runescape,funescape);return function(elem){var node=void 0!==elem.getAttributeNode&&elem.getAttributeNode("id");return node&&node.value===attrId}},Expr.find.ID=function(id,context){if(void 0!==context.getElementById&&documentIsHTML){var node,i,elems,elem=context.getElementById(id);if(elem){if((node=elem.getAttributeNode("id"))&&node.value===id)return[elem];for(elems=context.getElementsByName(id),i=0;elem=elems[i++];)if((node=elem.getAttributeNode("id"))&&node.value===id)return[elem]}return[]}}),Expr.find.TAG=support.getElementsByTagName?function(tag,context){return void 0!==context.getElementsByTagName?context.getElementsByTagName(tag):support.qsa?context.querySelectorAll(tag):void 0}:function(tag,context){var elem,tmp=[],i=0,results=context.getElementsByTagName(tag);if("*"===tag){for(;elem=results[i++];)1===elem.nodeType&&tmp.push(elem);return tmp}return results},Expr.find.CLASS=support.getElementsByClassName&&function(className,context){if(void 0!==context.getElementsByClassName&&documentIsHTML)return context.getElementsByClassName(className)},rbuggyMatches=[],rbuggyQSA=[],(support.qsa=rnative.test(document.querySelectorAll))&&(assert(function(el){docElem.appendChild(el).innerHTML="",el.querySelectorAll("[msallowcapture^='']").length&&rbuggyQSA.push("[*^$]="+whitespace+"*(?:''|\"\")"),el.querySelectorAll("[selected]").length||rbuggyQSA.push("\\["+whitespace+"*(?:value|"+booleans+")"),el.querySelectorAll("[id~="+expando+"-]").length||rbuggyQSA.push("~="),el.querySelectorAll(":checked").length||rbuggyQSA.push(":checked"),el.querySelectorAll("a#"+expando+"+*").length||rbuggyQSA.push(".#.+[+~]")}),assert(function(el){el.innerHTML="";var input=document.createElement("input");input.setAttribute("type","hidden"),el.appendChild(input).setAttribute("name","D"),el.querySelectorAll("[name=d]").length&&rbuggyQSA.push("name"+whitespace+"*[*^$|!~]?="),2!==el.querySelectorAll(":enabled").length&&rbuggyQSA.push(":enabled",":disabled"),docElem.appendChild(el).disabled=!0,2!==el.querySelectorAll(":disabled").length&&rbuggyQSA.push(":enabled",":disabled"),el.querySelectorAll("*,:x"),rbuggyQSA.push(",.*:")})),(support.matchesSelector=rnative.test(matches=docElem.matches||docElem.webkitMatchesSelector||docElem.mozMatchesSelector||docElem.oMatchesSelector||docElem.msMatchesSelector))&&assert(function(el){support.disconnectedMatch=matches.call(el,"*"),matches.call(el,"[s!='']:x"),rbuggyMatches.push("!=",pseudos)}),rbuggyQSA=rbuggyQSA.length&&new RegExp(rbuggyQSA.join("|")),rbuggyMatches=rbuggyMatches.length&&new RegExp(rbuggyMatches.join("|")),hasCompare=rnative.test(docElem.compareDocumentPosition),contains=hasCompare||rnative.test(docElem.contains)?function(a,b){var adown=9===a.nodeType?a.documentElement:a,bup=b&&b.parentNode;return a===bup||!(!bup||1!==bup.nodeType||!(adown.contains?adown.contains(bup):a.compareDocumentPosition&&16&a.compareDocumentPosition(bup)))}:function(a,b){if(b)for(;b=b.parentNode;)if(b===a)return!0;return!1},sortOrder=hasCompare?function(a,b){if(a===b)return hasDuplicate=!0,0;var compare=!a.compareDocumentPosition-!b.compareDocumentPosition;return compare||(1&(compare=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1)||!support.sortDetached&&b.compareDocumentPosition(a)===compare?a===document||a.ownerDocument===preferredDoc&&contains(preferredDoc,a)?-1:b===document||b.ownerDocument===preferredDoc&&contains(preferredDoc,b)?1:sortInput?indexOf(sortInput,a)-indexOf(sortInput,b):0:4&compare?-1:1)}:function(a,b){if(a===b)return hasDuplicate=!0,0;var cur,i=0,aup=a.parentNode,bup=b.parentNode,ap=[a],bp=[b];if(!aup||!bup)return a===document?-1:b===document?1:aup?-1:bup?1:sortInput?indexOf(sortInput,a)-indexOf(sortInput,b):0;if(aup===bup)return siblingCheck(a,b);for(cur=a;cur=cur.parentNode;)ap.unshift(cur);for(cur=b;cur=cur.parentNode;)bp.unshift(cur);for(;ap[i]===bp[i];)i++;return i?siblingCheck(ap[i],bp[i]):ap[i]===preferredDoc?-1:bp[i]===preferredDoc?1:0},document):document},Sizzle.matches=function(expr,elements){return Sizzle(expr,null,null,elements)},Sizzle.matchesSelector=function(elem,expr){if((elem.ownerDocument||elem)!==document&&setDocument(elem),expr=expr.replace(rattributeQuotes,"='$1']"),support.matchesSelector&&documentIsHTML&&!compilerCache[expr+" "]&&(!rbuggyMatches||!rbuggyMatches.test(expr))&&(!rbuggyQSA||!rbuggyQSA.test(expr)))try{var ret=matches.call(elem,expr);if(ret||support.disconnectedMatch||elem.document&&11!==elem.document.nodeType)return ret}catch(e){}return Sizzle(expr,document,null,[elem]).length>0},Sizzle.contains=function(context,elem){return(context.ownerDocument||context)!==document&&setDocument(context),contains(context,elem)},Sizzle.attr=function(elem,name){(elem.ownerDocument||elem)!==document&&setDocument(elem);var fn=Expr.attrHandle[name.toLowerCase()],val=fn&&hasOwn.call(Expr.attrHandle,name.toLowerCase())?fn(elem,name,!documentIsHTML):void 0;return void 0!==val?val:support.attributes||!documentIsHTML?elem.getAttribute(name):(val=elem.getAttributeNode(name))&&val.specified?val.value:null},Sizzle.escape=function(sel){return(sel+"").replace(rcssescape,fcssescape)},Sizzle.error=function(msg){throw new Error("Syntax error, unrecognized expression: "+msg)},Sizzle.uniqueSort=function(results){var elem,duplicates=[],j=0,i=0;if(hasDuplicate=!support.detectDuplicates,sortInput=!support.sortStable&&results.slice(0),results.sort(sortOrder),hasDuplicate){for(;elem=results[i++];)elem===results[i]&&(j=duplicates.push(i));for(;j--;)results.splice(duplicates[j],1)}return sortInput=null,results},getText=Sizzle.getText=function(elem){var node,ret="",i=0,nodeType=elem.nodeType;if(nodeType){if(1===nodeType||9===nodeType||11===nodeType){if("string"==typeof elem.textContent)return elem.textContent;for(elem=elem.firstChild;elem;elem=elem.nextSibling)ret+=getText(elem)}else if(3===nodeType||4===nodeType)return elem.nodeValue}else for(;node=elem[i++];)ret+=getText(node);return ret},(Expr=Sizzle.selectors={cacheLength:50,createPseudo:markFunction,match:matchExpr,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(match){return match[1]=match[1].replace(runescape,funescape),match[3]=(match[3]||match[4]||match[5]||"").replace(runescape,funescape),"~="===match[2]&&(match[3]=" "+match[3]+" "),match.slice(0,4)},CHILD:function(match){return match[1]=match[1].toLowerCase(),"nth"===match[1].slice(0,3)?(match[3]||Sizzle.error(match[0]),match[4]=+(match[4]?match[5]+(match[6]||1):2*("even"===match[3]||"odd"===match[3])),match[5]=+(match[7]+match[8]||"odd"===match[3])):match[3]&&Sizzle.error(match[0]),match},PSEUDO:function(match){var excess,unquoted=!match[6]&&match[2];return matchExpr.CHILD.test(match[0])?null:(match[3]?match[2]=match[4]||match[5]||"":unquoted&&rpseudo.test(unquoted)&&(excess=tokenize(unquoted,!0))&&(excess=unquoted.indexOf(")",unquoted.length-excess)-unquoted.length)&&(match[0]=match[0].slice(0,excess),match[2]=unquoted.slice(0,excess)),match.slice(0,3))}},filter:{TAG:function(nodeNameSelector){var nodeName=nodeNameSelector.replace(runescape,funescape).toLowerCase();return"*"===nodeNameSelector?function(){return!0}:function(elem){return elem.nodeName&&elem.nodeName.toLowerCase()===nodeName}},CLASS:function(className){var pattern=classCache[className+" "];return pattern||(pattern=new RegExp("(^|"+whitespace+")"+className+"("+whitespace+"|$)"))&&classCache(className,function(elem){return pattern.test("string"==typeof elem.className&&elem.className||void 0!==elem.getAttribute&&elem.getAttribute("class")||"")})},ATTR:function(name,operator,check){return function(elem){var result=Sizzle.attr(elem,name);return null==result?"!="===operator:!operator||(result+="","="===operator?result===check:"!="===operator?result!==check:"^="===operator?check&&0===result.indexOf(check):"*="===operator?check&&result.indexOf(check)>-1:"$="===operator?check&&result.slice(-check.length)===check:"~="===operator?(" "+result.replace(rwhitespace," ")+" ").indexOf(check)>-1:"|="===operator&&(result===check||result.slice(0,check.length+1)===check+"-"))}},CHILD:function(type,what,argument,first,last){var simple="nth"!==type.slice(0,3),forward="last"!==type.slice(-4),ofType="of-type"===what;return 1===first&&0===last?function(elem){return!!elem.parentNode}:function(elem,context,xml){var cache,uniqueCache,outerCache,node,nodeIndex,start,dir=simple!==forward?"nextSibling":"previousSibling",parent=elem.parentNode,name=ofType&&elem.nodeName.toLowerCase(),useCache=!xml&&!ofType,diff=!1;if(parent){if(simple){for(;dir;){for(node=elem;node=node[dir];)if(ofType?node.nodeName.toLowerCase()===name:1===node.nodeType)return!1;start=dir="only"===type&&!start&&"nextSibling"}return!0}if(start=[forward?parent.firstChild:parent.lastChild],forward&&useCache){for(diff=(nodeIndex=(cache=(uniqueCache=(outerCache=(node=parent)[expando]||(node[expando]={}))[node.uniqueID]||(outerCache[node.uniqueID]={}))[type]||[])[0]===dirruns&&cache[1])&&cache[2],node=nodeIndex&&parent.childNodes[nodeIndex];node=++nodeIndex&&node&&node[dir]||(diff=nodeIndex=0)||start.pop();)if(1===node.nodeType&&++diff&&node===elem){uniqueCache[type]=[dirruns,nodeIndex,diff];break}}else if(useCache&&(diff=nodeIndex=(cache=(uniqueCache=(outerCache=(node=elem)[expando]||(node[expando]={}))[node.uniqueID]||(outerCache[node.uniqueID]={}))[type]||[])[0]===dirruns&&cache[1]),!1===diff)for(;(node=++nodeIndex&&node&&node[dir]||(diff=nodeIndex=0)||start.pop())&&((ofType?node.nodeName.toLowerCase()!==name:1!==node.nodeType)||!++diff||(useCache&&((uniqueCache=(outerCache=node[expando]||(node[expando]={}))[node.uniqueID]||(outerCache[node.uniqueID]={}))[type]=[dirruns,diff]),node!==elem)););return(diff-=last)===first||diff%first==0&&diff/first>=0}}},PSEUDO:function(pseudo,argument){var args,fn=Expr.pseudos[pseudo]||Expr.setFilters[pseudo.toLowerCase()]||Sizzle.error("unsupported pseudo: "+pseudo);return fn[expando]?fn(argument):fn.length>1?(args=[pseudo,pseudo,"",argument],Expr.setFilters.hasOwnProperty(pseudo.toLowerCase())?markFunction(function(seed,matches){for(var idx,matched=fn(seed,argument),i=matched.length;i--;)seed[idx=indexOf(seed,matched[i])]=!(matches[idx]=matched[i])}):function(elem){return fn(elem,0,args)}):fn}},pseudos:{not:markFunction(function(selector){var input=[],results=[],matcher=compile(selector.replace(rtrim,"$1"));return matcher[expando]?markFunction(function(seed,matches,context,xml){for(var elem,unmatched=matcher(seed,null,xml,[]),i=seed.length;i--;)(elem=unmatched[i])&&(seed[i]=!(matches[i]=elem))}):function(elem,context,xml){return input[0]=elem,matcher(input,null,xml,results),input[0]=null,!results.pop()}}),has:markFunction(function(selector){return function(elem){return Sizzle(selector,elem).length>0}}),contains:markFunction(function(text){return text=text.replace(runescape,funescape),function(elem){return(elem.textContent||elem.innerText||getText(elem)).indexOf(text)>-1}}),lang:markFunction(function(lang){return ridentifier.test(lang||"")||Sizzle.error("unsupported lang: "+lang),lang=lang.replace(runescape,funescape).toLowerCase(),function(elem){var elemLang;do{if(elemLang=documentIsHTML?elem.lang:elem.getAttribute("xml:lang")||elem.getAttribute("lang"))return(elemLang=elemLang.toLowerCase())===lang||0===elemLang.indexOf(lang+"-")}while((elem=elem.parentNode)&&1===elem.nodeType);return!1}}),target:function(elem){var hash=window.location&&window.location.hash;return hash&&hash.slice(1)===elem.id},root:function(elem){return elem===docElem},focus:function(elem){return elem===document.activeElement&&(!document.hasFocus||document.hasFocus())&&!!(elem.type||elem.href||~elem.tabIndex)},enabled:createDisabledPseudo(!1),disabled:createDisabledPseudo(!0),checked:function(elem){var nodeName=elem.nodeName.toLowerCase();return"input"===nodeName&&!!elem.checked||"option"===nodeName&&!!elem.selected},selected:function(elem){return elem.parentNode&&elem.parentNode.selectedIndex,!0===elem.selected},empty:function(elem){for(elem=elem.firstChild;elem;elem=elem.nextSibling)if(elem.nodeType<6)return!1;return!0},parent:function(elem){return!Expr.pseudos.empty(elem)},header:function(elem){return rheader.test(elem.nodeName)},input:function(elem){return rinputs.test(elem.nodeName)},button:function(elem){var name=elem.nodeName.toLowerCase();return"input"===name&&"button"===elem.type||"button"===name},text:function(elem){var attr;return"input"===elem.nodeName.toLowerCase()&&"text"===elem.type&&(null==(attr=elem.getAttribute("type"))||"text"===attr.toLowerCase())},first:createPositionalPseudo(function(){return[0]}),last:createPositionalPseudo(function(matchIndexes,length){return[length-1]}),eq:createPositionalPseudo(function(matchIndexes,length,argument){return[argument<0?argument+length:argument]}),even:createPositionalPseudo(function(matchIndexes,length){for(var i=0;i=0;)matchIndexes.push(i);return matchIndexes}),gt:createPositionalPseudo(function(matchIndexes,length,argument){for(var i=argument<0?argument+length:argument;++i1?function(elem,context,xml){for(var i=matchers.length;i--;)if(!matchers[i](elem,context,xml))return!1;return!0}:matchers[0]}function condense(unmatched,map,filter,context,xml){for(var elem,newUnmatched=[],i=0,len=unmatched.length,mapped=null!=map;i-1&&(seed[temp]=!(results[temp]=elem))}}else matcherOut=condense(matcherOut===results?matcherOut.splice(preexisting,matcherOut.length):matcherOut),postFinder?postFinder(null,results,matcherOut,xml):push.apply(results,matcherOut)})}function matcherFromTokens(tokens){for(var checkContext,matcher,j,len=tokens.length,leadingRelative=Expr.relative[tokens[0].type],implicitRelative=leadingRelative||Expr.relative[" "],i=leadingRelative?1:0,matchContext=addCombinator(function(elem){return elem===checkContext},implicitRelative,!0),matchAnyContext=addCombinator(function(elem){return indexOf(checkContext,elem)>-1},implicitRelative,!0),matchers=[function(elem,context,xml){var ret=!leadingRelative&&(xml||context!==outermostContext)||((checkContext=context).nodeType?matchContext(elem,context,xml):matchAnyContext(elem,context,xml));return checkContext=null,ret}];i1&&elementMatcher(matchers),i>1&&toSelector(tokens.slice(0,i-1).concat({value:" "===tokens[i-2].type?"*":""})).replace(rtrim,"$1"),matcher,i0,byElement=elementMatchers.length>0,superMatcher=function(seed,context,xml,results,outermost){var elem,j,matcher,matchedCount=0,i="0",unmatched=seed&&[],setMatched=[],contextBackup=outermostContext,elems=seed||byElement&&Expr.find.TAG("*",outermost),dirrunsUnique=dirruns+=null==contextBackup?1:Math.random()||.1,len=elems.length;for(outermost&&(outermostContext=context===document||context||outermost);i!==len&&null!=(elem=elems[i]);i++){if(byElement&&elem){for(j=0,context||elem.ownerDocument===document||(setDocument(elem),xml=!documentIsHTML);matcher=elementMatchers[j++];)if(matcher(elem,context||document,xml)){results.push(elem);break}outermost&&(dirruns=dirrunsUnique)}bySet&&((elem=!matcher&&elem)&&matchedCount--,seed&&unmatched.push(elem))}if(matchedCount+=i,bySet&&i!==matchedCount){for(j=0;matcher=setMatchers[j++];)matcher(unmatched,setMatched,context,xml);if(seed){if(matchedCount>0)for(;i--;)unmatched[i]||setMatched[i]||(setMatched[i]=pop.call(results));setMatched=condense(setMatched)}push.apply(results,setMatched),outermost&&!seed&&setMatched.length>0&&matchedCount+setMatchers.length>1&&Sizzle.uniqueSort(results)}return outermost&&(dirruns=dirrunsUnique,outermostContext=contextBackup),unmatched};return bySet?markFunction(superMatcher):superMatcher}(elementMatchers,setMatchers))).selector=selector}return cached},select=Sizzle.select=function(selector,context,results,seed){var i,tokens,token,type,find,compiled="function"==typeof selector&&selector,match=!seed&&tokenize(selector=compiled.selector||selector);if(results=results||[],1===match.length){if((tokens=match[0]=match[0].slice(0)).length>2&&"ID"===(token=tokens[0]).type&&9===context.nodeType&&documentIsHTML&&Expr.relative[tokens[1].type]){if(!(context=(Expr.find.ID(token.matches[0].replace(runescape,funescape),context)||[])[0]))return results;compiled&&(context=context.parentNode),selector=selector.slice(tokens.shift().value.length)}for(i=matchExpr.needsContext.test(selector)?0:tokens.length;i--&&(token=tokens[i],!Expr.relative[type=token.type]);)if((find=Expr.find[type])&&(seed=find(token.matches[0].replace(runescape,funescape),rsibling.test(tokens[0].type)&&testContext(context.parentNode)||context))){if(tokens.splice(i,1),!(selector=seed.length&&toSelector(tokens)))return push.apply(results,seed),results;break}}return(compiled||compile(selector,match))(seed,context,!documentIsHTML,results,!context||rsibling.test(selector)&&testContext(context.parentNode)||context),results},support.sortStable=expando.split("").sort(sortOrder).join("")===expando,support.detectDuplicates=!!hasDuplicate,setDocument(),support.sortDetached=assert(function(el){return 1&el.compareDocumentPosition(document.createElement("fieldset"))}),assert(function(el){return el.innerHTML="","#"===el.firstChild.getAttribute("href")})||addHandle("type|href|height|width",function(elem,name,isXML){if(!isXML)return elem.getAttribute(name,"type"===name.toLowerCase()?1:2)}),support.attributes&&assert(function(el){return el.innerHTML="",el.firstChild.setAttribute("value",""),""===el.firstChild.getAttribute("value")})||addHandle("value",function(elem,name,isXML){if(!isXML&&"input"===elem.nodeName.toLowerCase())return elem.defaultValue}),assert(function(el){return null==el.getAttribute("disabled")})||addHandle(booleans,function(elem,name,isXML){var val;if(!isXML)return!0===elem[name]?name.toLowerCase():(val=elem.getAttributeNode(name))&&val.specified?val.value:null}),Sizzle}(window);jQuery.find=Sizzle,jQuery.expr=Sizzle.selectors,jQuery.expr[":"]=jQuery.expr.pseudos,jQuery.uniqueSort=jQuery.unique=Sizzle.uniqueSort,jQuery.text=Sizzle.getText,jQuery.isXMLDoc=Sizzle.isXML,jQuery.contains=Sizzle.contains,jQuery.escapeSelector=Sizzle.escape;var dir=function(elem,dir,until){for(var matched=[],truncate=void 0!==until;(elem=elem[dir])&&9!==elem.nodeType;)if(1===elem.nodeType){if(truncate&&jQuery(elem).is(until))break;matched.push(elem)}return matched},siblings=function(n,elem){for(var matched=[];n;n=n.nextSibling)1===n.nodeType&&n!==elem&&matched.push(n);return matched},rneedsContext=jQuery.expr.match.needsContext;function nodeName(elem,name){return elem.nodeName&&elem.nodeName.toLowerCase()===name.toLowerCase()}var rsingleTag=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function winnow(elements,qualifier,not){return isFunction(qualifier)?jQuery.grep(elements,function(elem,i){return!!qualifier.call(elem,i,elem)!==not}):qualifier.nodeType?jQuery.grep(elements,function(elem){return elem===qualifier!==not}):"string"!=typeof qualifier?jQuery.grep(elements,function(elem){return indexOf.call(qualifier,elem)>-1!==not}):jQuery.filter(qualifier,elements,not)}jQuery.filter=function(expr,elems,not){var elem=elems[0];return not&&(expr=":not("+expr+")"),1===elems.length&&1===elem.nodeType?jQuery.find.matchesSelector(elem,expr)?[elem]:[]:jQuery.find.matches(expr,jQuery.grep(elems,function(elem){return 1===elem.nodeType}))},jQuery.fn.extend({find:function(selector){var i,ret,len=this.length,self=this;if("string"!=typeof selector)return this.pushStack(jQuery(selector).filter(function(){for(i=0;i1?jQuery.uniqueSort(ret):ret},filter:function(selector){return this.pushStack(winnow(this,selector||[],!1))},not:function(selector){return this.pushStack(winnow(this,selector||[],!0))},is:function(selector){return!!winnow(this,"string"==typeof selector&&rneedsContext.test(selector)?jQuery(selector):selector||[],!1).length}});var rootjQuery,rquickExpr=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(jQuery.fn.init=function(selector,context,root){var match,elem;if(!selector)return this;if(root=root||rootjQuery,"string"==typeof selector){if(!(match="<"===selector[0]&&">"===selector[selector.length-1]&&selector.length>=3?[null,selector,null]:rquickExpr.exec(selector))||!match[1]&&context)return!context||context.jquery?(context||root).find(selector):this.constructor(context).find(selector);if(match[1]){if(context=context instanceof jQuery?context[0]:context,jQuery.merge(this,jQuery.parseHTML(match[1],context&&context.nodeType?context.ownerDocument||context:document,!0)),rsingleTag.test(match[1])&&jQuery.isPlainObject(context))for(match in context)isFunction(this[match])?this[match](context[match]):this.attr(match,context[match]);return this}return(elem=document.getElementById(match[2]))&&(this[0]=elem,this.length=1),this}return selector.nodeType?(this[0]=selector,this.length=1,this):isFunction(selector)?void 0!==root.ready?root.ready(selector):selector(jQuery):jQuery.makeArray(selector,this)}).prototype=jQuery.fn,rootjQuery=jQuery(document);var rparentsprev=/^(?:parents|prev(?:Until|All))/,guaranteedUnique={children:!0,contents:!0,next:!0,prev:!0};function sibling(cur,dir){for(;(cur=cur[dir])&&1!==cur.nodeType;);return cur}jQuery.fn.extend({has:function(target){var targets=jQuery(target,this),l=targets.length;return this.filter(function(){for(var i=0;i-1:1===cur.nodeType&&jQuery.find.matchesSelector(cur,selectors))){matched.push(cur);break}return this.pushStack(matched.length>1?jQuery.uniqueSort(matched):matched)},index:function(elem){return elem?"string"==typeof elem?indexOf.call(jQuery(elem),this[0]):indexOf.call(this,elem.jquery?elem[0]:elem):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(selector,context){return this.pushStack(jQuery.uniqueSort(jQuery.merge(this.get(),jQuery(selector,context))))},addBack:function(selector){return this.add(null==selector?this.prevObject:this.prevObject.filter(selector))}}),jQuery.each({parent:function(elem){var parent=elem.parentNode;return parent&&11!==parent.nodeType?parent:null},parents:function(elem){return dir(elem,"parentNode")},parentsUntil:function(elem,i,until){return dir(elem,"parentNode",until)},next:function(elem){return sibling(elem,"nextSibling")},prev:function(elem){return sibling(elem,"previousSibling")},nextAll:function(elem){return dir(elem,"nextSibling")},prevAll:function(elem){return dir(elem,"previousSibling")},nextUntil:function(elem,i,until){return dir(elem,"nextSibling",until)},prevUntil:function(elem,i,until){return dir(elem,"previousSibling",until)},siblings:function(elem){return siblings((elem.parentNode||{}).firstChild,elem)},children:function(elem){return siblings(elem.firstChild)},contents:function(elem){return nodeName(elem,"iframe")?elem.contentDocument:(nodeName(elem,"template")&&(elem=elem.content||elem),jQuery.merge([],elem.childNodes))}},function(name,fn){jQuery.fn[name]=function(until,selector){var matched=jQuery.map(this,fn,until);return"Until"!==name.slice(-5)&&(selector=until),selector&&"string"==typeof selector&&(matched=jQuery.filter(selector,matched)),this.length>1&&(guaranteedUnique[name]||jQuery.uniqueSort(matched),rparentsprev.test(name)&&matched.reverse()),this.pushStack(matched)}});var rnothtmlwhite=/[^\x20\t\r\n\f]+/g;function Identity(v){return v}function Thrower(ex){throw ex}function adoptValue(value,resolve,reject,noValue){var method;try{value&&isFunction(method=value.promise)?method.call(value).done(resolve).fail(reject):value&&isFunction(method=value.then)?method.call(value,resolve,reject):resolve.apply(void 0,[value].slice(noValue))}catch(value){reject.apply(void 0,[value])}}jQuery.Callbacks=function(options){options="string"==typeof options?function(options){var object={};return jQuery.each(options.match(rnothtmlwhite)||[],function(_,flag){object[flag]=!0}),object}(options):jQuery.extend({},options);var firing,memory,fired,locked,list=[],queue=[],firingIndex=-1,fire=function(){for(locked=locked||options.once,fired=firing=!0;queue.length;firingIndex=-1)for(memory=queue.shift();++firingIndex-1;)list.splice(index,1),index<=firingIndex&&firingIndex--}),this},has:function(fn){return fn?jQuery.inArray(fn,list)>-1:list.length>0},empty:function(){return list&&(list=[]),this},disable:function(){return locked=queue=[],list=memory="",this},disabled:function(){return!list},lock:function(){return locked=queue=[],memory||firing||(list=memory=""),this},locked:function(){return!!locked},fireWith:function(context,args){return locked||(args=[context,(args=args||[]).slice?args.slice():args],queue.push(args),firing||fire()),this},fire:function(){return self.fireWith(this,arguments),this},fired:function(){return!!fired}};return self},jQuery.extend({Deferred:function(func){var tuples=[["notify","progress",jQuery.Callbacks("memory"),jQuery.Callbacks("memory"),2],["resolve","done",jQuery.Callbacks("once memory"),jQuery.Callbacks("once memory"),0,"resolved"],["reject","fail",jQuery.Callbacks("once memory"),jQuery.Callbacks("once memory"),1,"rejected"]],state="pending",promise={state:function(){return state},always:function(){return deferred.done(arguments).fail(arguments),this},catch:function(fn){return promise.then(null,fn)},pipe:function(){var fns=arguments;return jQuery.Deferred(function(newDefer){jQuery.each(tuples,function(i,tuple){var fn=isFunction(fns[tuple[4]])&&fns[tuple[4]];deferred[tuple[1]](function(){var returned=fn&&fn.apply(this,arguments);returned&&isFunction(returned.promise)?returned.promise().progress(newDefer.notify).done(newDefer.resolve).fail(newDefer.reject):newDefer[tuple[0]+"With"](this,fn?[returned]:arguments)})}),fns=null}).promise()},then:function(onFulfilled,onRejected,onProgress){var maxDepth=0;function resolve(depth,deferred,handler,special){return function(){var that=this,args=arguments,mightThrow=function(){var returned,then;if(!(depth=maxDepth&&(handler!==Thrower&&(that=void 0,args=[e]),deferred.rejectWith(that,args))}};depth?process():(jQuery.Deferred.getStackHook&&(process.stackTrace=jQuery.Deferred.getStackHook()),window.setTimeout(process))}}return jQuery.Deferred(function(newDefer){tuples[0][3].add(resolve(0,newDefer,isFunction(onProgress)?onProgress:Identity,newDefer.notifyWith)),tuples[1][3].add(resolve(0,newDefer,isFunction(onFulfilled)?onFulfilled:Identity)),tuples[2][3].add(resolve(0,newDefer,isFunction(onRejected)?onRejected:Thrower))}).promise()},promise:function(obj){return null!=obj?jQuery.extend(obj,promise):promise}},deferred={};return jQuery.each(tuples,function(i,tuple){var list=tuple[2],stateString=tuple[5];promise[tuple[1]]=list.add,stateString&&list.add(function(){state=stateString},tuples[3-i][2].disable,tuples[3-i][3].disable,tuples[0][2].lock,tuples[0][3].lock),list.add(tuple[3].fire),deferred[tuple[0]]=function(){return deferred[tuple[0]+"With"](this===deferred?void 0:this,arguments),this},deferred[tuple[0]+"With"]=list.fireWith}),promise.promise(deferred),func&&func.call(deferred,deferred),deferred},when:function(singleValue){var remaining=arguments.length,i=remaining,resolveContexts=Array(i),resolveValues=slice.call(arguments),master=jQuery.Deferred(),updateFunc=function(i){return function(value){resolveContexts[i]=this,resolveValues[i]=arguments.length>1?slice.call(arguments):value,--remaining||master.resolveWith(resolveContexts,resolveValues)}};if(remaining<=1&&(adoptValue(singleValue,master.done(updateFunc(i)).resolve,master.reject,!remaining),"pending"===master.state()||isFunction(resolveValues[i]&&resolveValues[i].then)))return master.then();for(;i--;)adoptValue(resolveValues[i],updateFunc(i),master.reject);return master.promise()}});var rerrorNames=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;jQuery.Deferred.exceptionHook=function(error,stack){window.console&&window.console.warn&&error&&rerrorNames.test(error.name)&&window.console.warn("jQuery.Deferred exception: "+error.message,error.stack,stack)},jQuery.readyException=function(error){window.setTimeout(function(){throw error})};var readyList=jQuery.Deferred();function completed(){document.removeEventListener("DOMContentLoaded",completed),window.removeEventListener("load",completed),jQuery.ready()}jQuery.fn.ready=function(fn){return readyList.then(fn).catch(function(error){jQuery.readyException(error)}),this},jQuery.extend({isReady:!1,readyWait:1,ready:function(wait){(!0===wait?--jQuery.readyWait:jQuery.isReady)||(jQuery.isReady=!0,!0!==wait&&--jQuery.readyWait>0||readyList.resolveWith(document,[jQuery]))}}),jQuery.ready.then=readyList.then,"complete"===document.readyState||"loading"!==document.readyState&&!document.documentElement.doScroll?window.setTimeout(jQuery.ready):(document.addEventListener("DOMContentLoaded",completed),window.addEventListener("load",completed));var access=function(elems,fn,key,value,chainable,emptyGet,raw){var i=0,len=elems.length,bulk=null==key;if("object"===toType(key))for(i in chainable=!0,key)access(elems,fn,i,key[i],!0,emptyGet,raw);else if(void 0!==value&&(chainable=!0,isFunction(value)||(raw=!0),bulk&&(raw?(fn.call(elems,value),fn=null):(bulk=fn,fn=function(elem,key,value){return bulk.call(jQuery(elem),value)})),fn))for(;i1,null,!0)},removeData:function(key){return this.each(function(){dataUser.remove(this,key)})}}),jQuery.extend({queue:function(elem,type,data){var queue;if(elem)return type=(type||"fx")+"queue",queue=dataPriv.get(elem,type),data&&(!queue||Array.isArray(data)?queue=dataPriv.access(elem,type,jQuery.makeArray(data)):queue.push(data)),queue||[]},dequeue:function(elem,type){type=type||"fx";var queue=jQuery.queue(elem,type),startLength=queue.length,fn=queue.shift(),hooks=jQuery._queueHooks(elem,type);"inprogress"===fn&&(fn=queue.shift(),startLength--),fn&&("fx"===type&&queue.unshift("inprogress"),delete hooks.stop,fn.call(elem,function(){jQuery.dequeue(elem,type)},hooks)),!startLength&&hooks&&hooks.empty.fire()},_queueHooks:function(elem,type){var key=type+"queueHooks";return dataPriv.get(elem,key)||dataPriv.access(elem,key,{empty:jQuery.Callbacks("once memory").add(function(){dataPriv.remove(elem,[type+"queue",key])})})}}),jQuery.fn.extend({queue:function(type,data){var setter=2;return"string"!=typeof type&&(data=type,type="fx",setter--),arguments.length\x20\t\r\n\f]+)/i,rscriptType=/^$|^module$|\/(?:java|ecma)script/i,wrapMap={option:[1,""],thead:[1,"
    ","
    "],col:[2,"","
    "],tr:[2,"","
    "],td:[3,"","
    "],_default:[0,"",""]};function getAll(context,tag){var ret;return ret=void 0!==context.getElementsByTagName?context.getElementsByTagName(tag||"*"):void 0!==context.querySelectorAll?context.querySelectorAll(tag||"*"):[],void 0===tag||tag&&nodeName(context,tag)?jQuery.merge([context],ret):ret}function setGlobalEval(elems,refElements){for(var i=0,l=elems.length;i-1)ignored&&ignored.push(elem);else if(contains=jQuery.contains(elem.ownerDocument,elem),tmp=getAll(fragment.appendChild(elem),"script"),contains&&setGlobalEval(tmp),scripts)for(j=0;elem=tmp[j++];)rscriptType.test(elem.type||"")&&scripts.push(elem);return fragment}div=document.createDocumentFragment().appendChild(document.createElement("div")),(input=document.createElement("input")).setAttribute("type","radio"),input.setAttribute("checked","checked"),input.setAttribute("name","t"),div.appendChild(input),support.checkClone=div.cloneNode(!0).cloneNode(!0).lastChild.checked,div.innerHTML="",support.noCloneChecked=!!div.cloneNode(!0).lastChild.defaultValue;var documentElement=document.documentElement,rkeyEvent=/^key/,rmouseEvent=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,rtypenamespace=/^([^.]*)(?:\.(.+)|)/;function returnTrue(){return!0}function returnFalse(){return!1}function safeActiveElement(){try{return document.activeElement}catch(err){}}function on(elem,types,selector,data,fn,one){var origFn,type;if("object"==typeof types){for(type in"string"!=typeof selector&&(data=data||selector,selector=void 0),types)on(elem,type,selector,data,types[type],one);return elem}if(null==data&&null==fn?(fn=selector,data=selector=void 0):null==fn&&("string"==typeof selector?(fn=data,data=void 0):(fn=data,data=selector,selector=void 0)),!1===fn)fn=returnFalse;else if(!fn)return elem;return 1===one&&(origFn=fn,(fn=function(event){return jQuery().off(event),origFn.apply(this,arguments)}).guid=origFn.guid||(origFn.guid=jQuery.guid++)),elem.each(function(){jQuery.event.add(this,types,fn,data,selector)})}jQuery.event={global:{},add:function(elem,types,handler,data,selector){var handleObjIn,eventHandle,tmp,events,t,handleObj,special,handlers,type,namespaces,origType,elemData=dataPriv.get(elem);if(elemData)for(handler.handler&&(handler=(handleObjIn=handler).handler,selector=handleObjIn.selector),selector&&jQuery.find.matchesSelector(documentElement,selector),handler.guid||(handler.guid=jQuery.guid++),(events=elemData.events)||(events=elemData.events={}),(eventHandle=elemData.handle)||(eventHandle=elemData.handle=function(e){return void 0!==jQuery&&jQuery.event.triggered!==e.type?jQuery.event.dispatch.apply(elem,arguments):void 0}),t=(types=(types||"").match(rnothtmlwhite)||[""]).length;t--;)type=origType=(tmp=rtypenamespace.exec(types[t])||[])[1],namespaces=(tmp[2]||"").split(".").sort(),type&&(special=jQuery.event.special[type]||{},type=(selector?special.delegateType:special.bindType)||type,special=jQuery.event.special[type]||{},handleObj=jQuery.extend({type:type,origType:origType,data:data,handler:handler,guid:handler.guid,selector:selector,needsContext:selector&&jQuery.expr.match.needsContext.test(selector),namespace:namespaces.join(".")},handleObjIn),(handlers=events[type])||((handlers=events[type]=[]).delegateCount=0,special.setup&&!1!==special.setup.call(elem,data,namespaces,eventHandle)||elem.addEventListener&&elem.addEventListener(type,eventHandle)),special.add&&(special.add.call(elem,handleObj),handleObj.handler.guid||(handleObj.handler.guid=handler.guid)),selector?handlers.splice(handlers.delegateCount++,0,handleObj):handlers.push(handleObj),jQuery.event.global[type]=!0)},remove:function(elem,types,handler,selector,mappedTypes){var j,origCount,tmp,events,t,handleObj,special,handlers,type,namespaces,origType,elemData=dataPriv.hasData(elem)&&dataPriv.get(elem);if(elemData&&(events=elemData.events)){for(t=(types=(types||"").match(rnothtmlwhite)||[""]).length;t--;)if(type=origType=(tmp=rtypenamespace.exec(types[t])||[])[1],namespaces=(tmp[2]||"").split(".").sort(),type){for(special=jQuery.event.special[type]||{},handlers=events[type=(selector?special.delegateType:special.bindType)||type]||[],tmp=tmp[2]&&new RegExp("(^|\\.)"+namespaces.join("\\.(?:.*\\.|)")+"(\\.|$)"),origCount=j=handlers.length;j--;)handleObj=handlers[j],!mappedTypes&&origType!==handleObj.origType||handler&&handler.guid!==handleObj.guid||tmp&&!tmp.test(handleObj.namespace)||selector&&selector!==handleObj.selector&&("**"!==selector||!handleObj.selector)||(handlers.splice(j,1),handleObj.selector&&handlers.delegateCount--,special.remove&&special.remove.call(elem,handleObj));origCount&&!handlers.length&&(special.teardown&&!1!==special.teardown.call(elem,namespaces,elemData.handle)||jQuery.removeEvent(elem,type,elemData.handle),delete events[type])}else for(type in events)jQuery.event.remove(elem,type+types[t],handler,selector,!0);jQuery.isEmptyObject(events)&&dataPriv.remove(elem,"handle events")}},dispatch:function(nativeEvent){var i,j,ret,matched,handleObj,handlerQueue,event=jQuery.event.fix(nativeEvent),args=new Array(arguments.length),handlers=(dataPriv.get(this,"events")||{})[event.type]||[],special=jQuery.event.special[event.type]||{};for(args[0]=event,i=1;i=1))for(;cur!==this;cur=cur.parentNode||this)if(1===cur.nodeType&&("click"!==event.type||!0!==cur.disabled)){for(matchedHandlers=[],matchedSelectors={},i=0;i-1:jQuery.find(sel,this,null,[cur]).length),matchedSelectors[sel]&&matchedHandlers.push(handleObj);matchedHandlers.length&&handlerQueue.push({elem:cur,handlers:matchedHandlers})}return cur=this,delegateCount\x20\t\r\n\f]*)[^>]*)\/>/gi,rnoInnerhtml=/\s*$/g;function manipulationTarget(elem,content){return nodeName(elem,"table")&&nodeName(11!==content.nodeType?content:content.firstChild,"tr")&&jQuery(elem).children("tbody")[0]||elem}function disableScript(elem){return elem.type=(null!==elem.getAttribute("type"))+"/"+elem.type,elem}function restoreScript(elem){return"true/"===(elem.type||"").slice(0,5)?elem.type=elem.type.slice(5):elem.removeAttribute("type"),elem}function cloneCopyEvent(src,dest){var i,l,type,pdataOld,pdataCur,udataOld,udataCur,events;if(1===dest.nodeType){if(dataPriv.hasData(src)&&(pdataOld=dataPriv.access(src),pdataCur=dataPriv.set(dest,pdataOld),events=pdataOld.events))for(type in delete pdataCur.handle,pdataCur.events={},events)for(i=0,l=events[type].length;i1&&"string"==typeof value&&!support.checkClone&&rchecked.test(value))return collection.each(function(index){var self=collection.eq(index);valueIsFunction&&(args[0]=value.call(this,index,self.html())),domManip(self,args,callback,ignored)});if(l&&(first=(fragment=buildFragment(args,collection[0].ownerDocument,!1,collection,ignored)).firstChild,1===fragment.childNodes.length&&(fragment=first),first||ignored)){for(hasScripts=(scripts=jQuery.map(getAll(fragment,"script"),disableScript)).length;i")},clone:function(elem,dataAndEvents,deepDataAndEvents){var i,l,srcElements,destElements,src,dest,nodeName,clone=elem.cloneNode(!0),inPage=jQuery.contains(elem.ownerDocument,elem);if(!(support.noCloneChecked||1!==elem.nodeType&&11!==elem.nodeType||jQuery.isXMLDoc(elem)))for(destElements=getAll(clone),i=0,l=(srcElements=getAll(elem)).length;i0&&setGlobalEval(destElements,!inPage&&getAll(elem,"script")),clone},cleanData:function(elems){for(var data,elem,type,special=jQuery.event.special,i=0;void 0!==(elem=elems[i]);i++)if(acceptData(elem)){if(data=elem[dataPriv.expando]){if(data.events)for(type in data.events)special[type]?jQuery.event.remove(elem,type):jQuery.removeEvent(elem,type,data.handle);elem[dataPriv.expando]=void 0}elem[dataUser.expando]&&(elem[dataUser.expando]=void 0)}}}),jQuery.fn.extend({detach:function(selector){return remove(this,selector,!0)},remove:function(selector){return remove(this,selector)},text:function(value){return access(this,function(value){return void 0===value?jQuery.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=value)})},null,value,arguments.length)},append:function(){return domManip(this,arguments,function(elem){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||manipulationTarget(this,elem).appendChild(elem)})},prepend:function(){return domManip(this,arguments,function(elem){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var target=manipulationTarget(this,elem);target.insertBefore(elem,target.firstChild)}})},before:function(){return domManip(this,arguments,function(elem){this.parentNode&&this.parentNode.insertBefore(elem,this)})},after:function(){return domManip(this,arguments,function(elem){this.parentNode&&this.parentNode.insertBefore(elem,this.nextSibling)})},empty:function(){for(var elem,i=0;null!=(elem=this[i]);i++)1===elem.nodeType&&(jQuery.cleanData(getAll(elem,!1)),elem.textContent="");return this},clone:function(dataAndEvents,deepDataAndEvents){return dataAndEvents=null!=dataAndEvents&&dataAndEvents,deepDataAndEvents=null==deepDataAndEvents?dataAndEvents:deepDataAndEvents,this.map(function(){return jQuery.clone(this,dataAndEvents,deepDataAndEvents)})},html:function(value){return access(this,function(value){var elem=this[0]||{},i=0,l=this.length;if(void 0===value&&1===elem.nodeType)return elem.innerHTML;if("string"==typeof value&&!rnoInnerhtml.test(value)&&!wrapMap[(rtagName.exec(value)||["",""])[1].toLowerCase()]){value=jQuery.htmlPrefilter(value);try{for(;i=0&&(delta+=Math.max(0,Math.ceil(elem["offset"+dimension[0].toUpperCase()+dimension.slice(1)]-computedVal-delta-extra-.5))),delta}function getWidthOrHeight(elem,dimension,extra){var styles=getStyles(elem),val=curCSS(elem,dimension,styles),isBorderBox="border-box"===jQuery.css(elem,"boxSizing",!1,styles),valueIsBorderBox=isBorderBox;if(rnumnonpx.test(val)){if(!extra)return val;val="auto"}return valueIsBorderBox=valueIsBorderBox&&(support.boxSizingReliable()||val===elem.style[dimension]),("auto"===val||!parseFloat(val)&&"inline"===jQuery.css(elem,"display",!1,styles))&&(val=elem["offset"+dimension[0].toUpperCase()+dimension.slice(1)],valueIsBorderBox=!0),(val=parseFloat(val)||0)+boxModelAdjustment(elem,dimension,extra||(isBorderBox?"border":"content"),valueIsBorderBox,styles,val)+"px"}function Tween(elem,options,prop,end,easing){return new Tween.prototype.init(elem,options,prop,end,easing)}jQuery.extend({cssHooks:{opacity:{get:function(elem,computed){if(computed){var ret=curCSS(elem,"opacity");return""===ret?"1":ret}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{},style:function(elem,name,value,extra){if(elem&&3!==elem.nodeType&&8!==elem.nodeType&&elem.style){var ret,type,hooks,origName=camelCase(name),isCustomProp=rcustomProp.test(name),style=elem.style;if(isCustomProp||(name=finalPropName(origName)),hooks=jQuery.cssHooks[name]||jQuery.cssHooks[origName],void 0===value)return hooks&&"get"in hooks&&void 0!==(ret=hooks.get(elem,!1,extra))?ret:style[name];"string"===(type=typeof value)&&(ret=rcssNum.exec(value))&&ret[1]&&(value=adjustCSS(elem,name,ret),type="number"),null!=value&&value==value&&("number"===type&&(value+=ret&&ret[3]||(jQuery.cssNumber[origName]?"":"px")),support.clearCloneStyle||""!==value||0!==name.indexOf("background")||(style[name]="inherit"),hooks&&"set"in hooks&&void 0===(value=hooks.set(elem,value,extra))||(isCustomProp?style.setProperty(name,value):style[name]=value))}},css:function(elem,name,extra,styles){var val,num,hooks,origName=camelCase(name);return rcustomProp.test(name)||(name=finalPropName(origName)),(hooks=jQuery.cssHooks[name]||jQuery.cssHooks[origName])&&"get"in hooks&&(val=hooks.get(elem,!0,extra)),void 0===val&&(val=curCSS(elem,name,styles)),"normal"===val&&name in cssNormalTransform&&(val=cssNormalTransform[name]),""===extra||extra?(num=parseFloat(val),!0===extra||isFinite(num)?num||0:val):val}}),jQuery.each(["height","width"],function(i,dimension){jQuery.cssHooks[dimension]={get:function(elem,computed,extra){if(computed)return!rdisplayswap.test(jQuery.css(elem,"display"))||elem.getClientRects().length&&elem.getBoundingClientRect().width?getWidthOrHeight(elem,dimension,extra):swap(elem,cssShow,function(){return getWidthOrHeight(elem,dimension,extra)})},set:function(elem,value,extra){var matches,styles=getStyles(elem),isBorderBox="border-box"===jQuery.css(elem,"boxSizing",!1,styles),subtract=extra&&boxModelAdjustment(elem,dimension,extra,isBorderBox,styles);return isBorderBox&&support.scrollboxSize()===styles.position&&(subtract-=Math.ceil(elem["offset"+dimension[0].toUpperCase()+dimension.slice(1)]-parseFloat(styles[dimension])-boxModelAdjustment(elem,dimension,"border",!1,styles)-.5)),subtract&&(matches=rcssNum.exec(value))&&"px"!==(matches[3]||"px")&&(elem.style[dimension]=value,value=jQuery.css(elem,dimension)),setPositiveNumber(0,value,subtract)}}}),jQuery.cssHooks.marginLeft=addGetHookIf(support.reliableMarginLeft,function(elem,computed){if(computed)return(parseFloat(curCSS(elem,"marginLeft"))||elem.getBoundingClientRect().left-swap(elem,{marginLeft:0},function(){return elem.getBoundingClientRect().left}))+"px"}),jQuery.each({margin:"",padding:"",border:"Width"},function(prefix,suffix){jQuery.cssHooks[prefix+suffix]={expand:function(value){for(var i=0,expanded={},parts="string"==typeof value?value.split(" "):[value];i<4;i++)expanded[prefix+cssExpand[i]+suffix]=parts[i]||parts[i-2]||parts[0];return expanded}},"margin"!==prefix&&(jQuery.cssHooks[prefix+suffix].set=setPositiveNumber)}),jQuery.fn.extend({css:function(name,value){return access(this,function(elem,name,value){var styles,len,map={},i=0;if(Array.isArray(name)){for(styles=getStyles(elem),len=name.length;i1)}}),jQuery.Tween=Tween,Tween.prototype={constructor:Tween,init:function(elem,options,prop,end,easing,unit){this.elem=elem,this.prop=prop,this.easing=easing||jQuery.easing._default,this.options=options,this.start=this.now=this.cur(),this.end=end,this.unit=unit||(jQuery.cssNumber[prop]?"":"px")},cur:function(){var hooks=Tween.propHooks[this.prop];return hooks&&hooks.get?hooks.get(this):Tween.propHooks._default.get(this)},run:function(percent){var eased,hooks=Tween.propHooks[this.prop];return this.options.duration?this.pos=eased=jQuery.easing[this.easing](percent,this.options.duration*percent,0,1,this.options.duration):this.pos=eased=percent,this.now=(this.end-this.start)*eased+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),hooks&&hooks.set?hooks.set(this):Tween.propHooks._default.set(this),this}},Tween.prototype.init.prototype=Tween.prototype,Tween.propHooks={_default:{get:function(tween){var result;return 1!==tween.elem.nodeType||null!=tween.elem[tween.prop]&&null==tween.elem.style[tween.prop]?tween.elem[tween.prop]:(result=jQuery.css(tween.elem,tween.prop,""))&&"auto"!==result?result:0},set:function(tween){jQuery.fx.step[tween.prop]?jQuery.fx.step[tween.prop](tween):1!==tween.elem.nodeType||null==tween.elem.style[jQuery.cssProps[tween.prop]]&&!jQuery.cssHooks[tween.prop]?tween.elem[tween.prop]=tween.now:jQuery.style(tween.elem,tween.prop,tween.now+tween.unit)}}},Tween.propHooks.scrollTop=Tween.propHooks.scrollLeft={set:function(tween){tween.elem.nodeType&&tween.elem.parentNode&&(tween.elem[tween.prop]=tween.now)}},jQuery.easing={linear:function(p){return p},swing:function(p){return.5-Math.cos(p*Math.PI)/2},_default:"swing"},jQuery.fx=Tween.prototype.init,jQuery.fx.step={};var fxNow,inProgress,rfxtypes=/^(?:toggle|show|hide)$/,rrun=/queueHooks$/;function schedule(){inProgress&&(!1===document.hidden&&window.requestAnimationFrame?window.requestAnimationFrame(schedule):window.setTimeout(schedule,jQuery.fx.interval),jQuery.fx.tick())}function createFxNow(){return window.setTimeout(function(){fxNow=void 0}),fxNow=Date.now()}function genFx(type,includeWidth){var which,i=0,attrs={height:type};for(includeWidth=includeWidth?1:0;i<4;i+=2-includeWidth)attrs["margin"+(which=cssExpand[i])]=attrs["padding"+which]=type;return includeWidth&&(attrs.opacity=attrs.width=type),attrs}function createTween(value,prop,animation){for(var tween,collection=(Animation.tweeners[prop]||[]).concat(Animation.tweeners["*"]),index=0,length=collection.length;index1)},removeAttr:function(name){return this.each(function(){jQuery.removeAttr(this,name)})}}),jQuery.extend({attr:function(elem,name,value){var ret,hooks,nType=elem.nodeType;if(3!==nType&&8!==nType&&2!==nType)return void 0===elem.getAttribute?jQuery.prop(elem,name,value):(1===nType&&jQuery.isXMLDoc(elem)||(hooks=jQuery.attrHooks[name.toLowerCase()]||(jQuery.expr.match.bool.test(name)?boolHook:void 0)),void 0!==value?null===value?void jQuery.removeAttr(elem,name):hooks&&"set"in hooks&&void 0!==(ret=hooks.set(elem,value,name))?ret:(elem.setAttribute(name,value+""),value):hooks&&"get"in hooks&&null!==(ret=hooks.get(elem,name))?ret:null==(ret=jQuery.find.attr(elem,name))?void 0:ret)},attrHooks:{type:{set:function(elem,value){if(!support.radioValue&&"radio"===value&&nodeName(elem,"input")){var val=elem.value;return elem.setAttribute("type",value),val&&(elem.value=val),value}}}},removeAttr:function(elem,value){var name,i=0,attrNames=value&&value.match(rnothtmlwhite);if(attrNames&&1===elem.nodeType)for(;name=attrNames[i++];)elem.removeAttribute(name)}}),boolHook={set:function(elem,value,name){return!1===value?jQuery.removeAttr(elem,name):elem.setAttribute(name,name),name}},jQuery.each(jQuery.expr.match.bool.source.match(/\w+/g),function(i,name){var getter=attrHandle[name]||jQuery.find.attr;attrHandle[name]=function(elem,name,isXML){var ret,handle,lowercaseName=name.toLowerCase();return isXML||(handle=attrHandle[lowercaseName],attrHandle[lowercaseName]=ret,ret=null!=getter(elem,name,isXML)?lowercaseName:null,attrHandle[lowercaseName]=handle),ret}});var rfocusable=/^(?:input|select|textarea|button)$/i,rclickable=/^(?:a|area)$/i;function stripAndCollapse(value){return(value.match(rnothtmlwhite)||[]).join(" ")}function getClass(elem){return elem.getAttribute&&elem.getAttribute("class")||""}function classesToArray(value){return Array.isArray(value)?value:"string"==typeof value&&value.match(rnothtmlwhite)||[]}jQuery.fn.extend({prop:function(name,value){return access(this,jQuery.prop,name,value,arguments.length>1)},removeProp:function(name){return this.each(function(){delete this[jQuery.propFix[name]||name]})}}),jQuery.extend({prop:function(elem,name,value){var ret,hooks,nType=elem.nodeType;if(3!==nType&&8!==nType&&2!==nType)return 1===nType&&jQuery.isXMLDoc(elem)||(name=jQuery.propFix[name]||name,hooks=jQuery.propHooks[name]),void 0!==value?hooks&&"set"in hooks&&void 0!==(ret=hooks.set(elem,value,name))?ret:elem[name]=value:hooks&&"get"in hooks&&null!==(ret=hooks.get(elem,name))?ret:elem[name]},propHooks:{tabIndex:{get:function(elem){var tabindex=jQuery.find.attr(elem,"tabindex");return tabindex?parseInt(tabindex,10):rfocusable.test(elem.nodeName)||rclickable.test(elem.nodeName)&&elem.href?0:-1}}},propFix:{for:"htmlFor",class:"className"}}),support.optSelected||(jQuery.propHooks.selected={get:function(elem){var parent=elem.parentNode;return parent&&parent.parentNode&&parent.parentNode.selectedIndex,null},set:function(elem){var parent=elem.parentNode;parent&&(parent.selectedIndex,parent.parentNode&&parent.parentNode.selectedIndex)}}),jQuery.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){jQuery.propFix[this.toLowerCase()]=this}),jQuery.fn.extend({addClass:function(value){var classes,elem,cur,curValue,clazz,j,finalValue,i=0;if(isFunction(value))return this.each(function(j){jQuery(this).addClass(value.call(this,j,getClass(this)))});if((classes=classesToArray(value)).length)for(;elem=this[i++];)if(curValue=getClass(elem),cur=1===elem.nodeType&&" "+stripAndCollapse(curValue)+" "){for(j=0;clazz=classes[j++];)cur.indexOf(" "+clazz+" ")<0&&(cur+=clazz+" ");curValue!==(finalValue=stripAndCollapse(cur))&&elem.setAttribute("class",finalValue)}return this},removeClass:function(value){var classes,elem,cur,curValue,clazz,j,finalValue,i=0;if(isFunction(value))return this.each(function(j){jQuery(this).removeClass(value.call(this,j,getClass(this)))});if(!arguments.length)return this.attr("class","");if((classes=classesToArray(value)).length)for(;elem=this[i++];)if(curValue=getClass(elem),cur=1===elem.nodeType&&" "+stripAndCollapse(curValue)+" "){for(j=0;clazz=classes[j++];)for(;cur.indexOf(" "+clazz+" ")>-1;)cur=cur.replace(" "+clazz+" "," ");curValue!==(finalValue=stripAndCollapse(cur))&&elem.setAttribute("class",finalValue)}return this},toggleClass:function(value,stateVal){var type=typeof value,isValidValue="string"===type||Array.isArray(value);return"boolean"==typeof stateVal&&isValidValue?stateVal?this.addClass(value):this.removeClass(value):isFunction(value)?this.each(function(i){jQuery(this).toggleClass(value.call(this,i,getClass(this),stateVal),stateVal)}):this.each(function(){var className,i,self,classNames;if(isValidValue)for(i=0,self=jQuery(this),classNames=classesToArray(value);className=classNames[i++];)self.hasClass(className)?self.removeClass(className):self.addClass(className);else void 0!==value&&"boolean"!==type||((className=getClass(this))&&dataPriv.set(this,"__className__",className),this.setAttribute&&this.setAttribute("class",className||!1===value?"":dataPriv.get(this,"__className__")||""))})},hasClass:function(selector){var className,elem,i=0;for(className=" "+selector+" ";elem=this[i++];)if(1===elem.nodeType&&(" "+stripAndCollapse(getClass(elem))+" ").indexOf(className)>-1)return!0;return!1}});var rreturn=/\r/g;jQuery.fn.extend({val:function(value){var hooks,ret,valueIsFunction,elem=this[0];return arguments.length?(valueIsFunction=isFunction(value),this.each(function(i){var val;1===this.nodeType&&(null==(val=valueIsFunction?value.call(this,i,jQuery(this).val()):value)?val="":"number"==typeof val?val+="":Array.isArray(val)&&(val=jQuery.map(val,function(value){return null==value?"":value+""})),(hooks=jQuery.valHooks[this.type]||jQuery.valHooks[this.nodeName.toLowerCase()])&&"set"in hooks&&void 0!==hooks.set(this,val,"value")||(this.value=val))})):elem?(hooks=jQuery.valHooks[elem.type]||jQuery.valHooks[elem.nodeName.toLowerCase()])&&"get"in hooks&&void 0!==(ret=hooks.get(elem,"value"))?ret:"string"==typeof(ret=elem.value)?ret.replace(rreturn,""):null==ret?"":ret:void 0}}),jQuery.extend({valHooks:{option:{get:function(elem){var val=jQuery.find.attr(elem,"value");return null!=val?val:stripAndCollapse(jQuery.text(elem))}},select:{get:function(elem){var value,option,i,options=elem.options,index=elem.selectedIndex,one="select-one"===elem.type,values=one?null:[],max=one?index+1:options.length;for(i=index<0?max:one?index:0;i-1)&&(optionSet=!0);return optionSet||(elem.selectedIndex=-1),values}}}}),jQuery.each(["radio","checkbox"],function(){jQuery.valHooks[this]={set:function(elem,value){if(Array.isArray(value))return elem.checked=jQuery.inArray(jQuery(elem).val(),value)>-1}},support.checkOn||(jQuery.valHooks[this].get=function(elem){return null===elem.getAttribute("value")?"on":elem.value})}),support.focusin="onfocusin"in window;var rfocusMorph=/^(?:focusinfocus|focusoutblur)$/,stopPropagationCallback=function(e){e.stopPropagation()};jQuery.extend(jQuery.event,{trigger:function(event,data,elem,onlyHandlers){var i,cur,tmp,bubbleType,ontype,handle,special,lastElement,eventPath=[elem||document],type=hasOwn.call(event,"type")?event.type:event,namespaces=hasOwn.call(event,"namespace")?event.namespace.split("."):[];if(cur=lastElement=tmp=elem=elem||document,3!==elem.nodeType&&8!==elem.nodeType&&!rfocusMorph.test(type+jQuery.event.triggered)&&(type.indexOf(".")>-1&&(type=(namespaces=type.split(".")).shift(),namespaces.sort()),ontype=type.indexOf(":")<0&&"on"+type,(event=event[jQuery.expando]?event:new jQuery.Event(type,"object"==typeof event&&event)).isTrigger=onlyHandlers?2:3,event.namespace=namespaces.join("."),event.rnamespace=event.namespace?new RegExp("(^|\\.)"+namespaces.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,event.result=void 0,event.target||(event.target=elem),data=null==data?[event]:jQuery.makeArray(data,[event]),special=jQuery.event.special[type]||{},onlyHandlers||!special.trigger||!1!==special.trigger.apply(elem,data))){if(!onlyHandlers&&!special.noBubble&&!isWindow(elem)){for(bubbleType=special.delegateType||type,rfocusMorph.test(bubbleType+type)||(cur=cur.parentNode);cur;cur=cur.parentNode)eventPath.push(cur),tmp=cur;tmp===(elem.ownerDocument||document)&&eventPath.push(tmp.defaultView||tmp.parentWindow||window)}for(i=0;(cur=eventPath[i++])&&!event.isPropagationStopped();)lastElement=cur,event.type=i>1?bubbleType:special.bindType||type,(handle=(dataPriv.get(cur,"events")||{})[event.type]&&dataPriv.get(cur,"handle"))&&handle.apply(cur,data),(handle=ontype&&cur[ontype])&&handle.apply&&acceptData(cur)&&(event.result=handle.apply(cur,data),!1===event.result&&event.preventDefault());return event.type=type,onlyHandlers||event.isDefaultPrevented()||special._default&&!1!==special._default.apply(eventPath.pop(),data)||!acceptData(elem)||ontype&&isFunction(elem[type])&&!isWindow(elem)&&((tmp=elem[ontype])&&(elem[ontype]=null),jQuery.event.triggered=type,event.isPropagationStopped()&&lastElement.addEventListener(type,stopPropagationCallback),elem[type](),event.isPropagationStopped()&&lastElement.removeEventListener(type,stopPropagationCallback),jQuery.event.triggered=void 0,tmp&&(elem[ontype]=tmp)),event.result}},simulate:function(type,elem,event){var e=jQuery.extend(new jQuery.Event,event,{type:type,isSimulated:!0});jQuery.event.trigger(e,null,elem)}}),jQuery.fn.extend({trigger:function(type,data){return this.each(function(){jQuery.event.trigger(type,data,this)})},triggerHandler:function(type,data){var elem=this[0];if(elem)return jQuery.event.trigger(type,data,elem,!0)}}),support.focusin||jQuery.each({focus:"focusin",blur:"focusout"},function(orig,fix){var handler=function(event){jQuery.event.simulate(fix,event.target,jQuery.event.fix(event))};jQuery.event.special[fix]={setup:function(){var doc=this.ownerDocument||this,attaches=dataPriv.access(doc,fix);attaches||doc.addEventListener(orig,handler,!0),dataPriv.access(doc,fix,(attaches||0)+1)},teardown:function(){var doc=this.ownerDocument||this,attaches=dataPriv.access(doc,fix)-1;attaches?dataPriv.access(doc,fix,attaches):(doc.removeEventListener(orig,handler,!0),dataPriv.remove(doc,fix))}}});var location=window.location,nonce=Date.now(),rquery=/\?/;jQuery.parseXML=function(data){var xml;if(!data||"string"!=typeof data)return null;try{xml=(new window.DOMParser).parseFromString(data,"text/xml")}catch(e){xml=void 0}return xml&&!xml.getElementsByTagName("parsererror").length||jQuery.error("Invalid XML: "+data),xml};var rbracket=/\[\]$/,rCRLF=/\r?\n/g,rsubmitterTypes=/^(?:submit|button|image|reset|file)$/i,rsubmittable=/^(?:input|select|textarea|keygen)/i;function buildParams(prefix,obj,traditional,add){var name;if(Array.isArray(obj))jQuery.each(obj,function(i,v){traditional||rbracket.test(prefix)?add(prefix,v):buildParams(prefix+"["+("object"==typeof v&&null!=v?i:"")+"]",v,traditional,add)});else if(traditional||"object"!==toType(obj))add(prefix,obj);else for(name in obj)buildParams(prefix+"["+name+"]",obj[name],traditional,add)}jQuery.param=function(a,traditional){var prefix,s=[],add=function(key,valueOrFunction){var value=isFunction(valueOrFunction)?valueOrFunction():valueOrFunction;s[s.length]=encodeURIComponent(key)+"="+encodeURIComponent(null==value?"":value)};if(Array.isArray(a)||a.jquery&&!jQuery.isPlainObject(a))jQuery.each(a,function(){add(this.name,this.value)});else for(prefix in a)buildParams(prefix,a[prefix],traditional,add);return s.join("&")},jQuery.fn.extend({serialize:function(){return jQuery.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var elements=jQuery.prop(this,"elements");return elements?jQuery.makeArray(elements):this}).filter(function(){var type=this.type;return this.name&&!jQuery(this).is(":disabled")&&rsubmittable.test(this.nodeName)&&!rsubmitterTypes.test(type)&&(this.checked||!rcheckableType.test(type))}).map(function(i,elem){var val=jQuery(this).val();return null==val?null:Array.isArray(val)?jQuery.map(val,function(val){return{name:elem.name,value:val.replace(rCRLF,"\r\n")}}):{name:elem.name,value:val.replace(rCRLF,"\r\n")}}).get()}});var r20=/%20/g,rhash=/#.*$/,rantiCache=/([?&])_=[^&]*/,rheaders=/^(.*?):[ \t]*([^\r\n]*)$/gm,rnoContent=/^(?:GET|HEAD)$/,rprotocol=/^\/\//,prefilters={},transports={},allTypes="*/".concat("*"),originAnchor=document.createElement("a");function addToPrefiltersOrTransports(structure){return function(dataTypeExpression,func){"string"!=typeof dataTypeExpression&&(func=dataTypeExpression,dataTypeExpression="*");var dataType,i=0,dataTypes=dataTypeExpression.toLowerCase().match(rnothtmlwhite)||[];if(isFunction(func))for(;dataType=dataTypes[i++];)"+"===dataType[0]?(dataType=dataType.slice(1)||"*",(structure[dataType]=structure[dataType]||[]).unshift(func)):(structure[dataType]=structure[dataType]||[]).push(func)}}function inspectPrefiltersOrTransports(structure,options,originalOptions,jqXHR){var inspected={},seekingTransport=structure===transports;function inspect(dataType){var selected;return inspected[dataType]=!0,jQuery.each(structure[dataType]||[],function(_,prefilterOrFactory){var dataTypeOrTransport=prefilterOrFactory(options,originalOptions,jqXHR);return"string"!=typeof dataTypeOrTransport||seekingTransport||inspected[dataTypeOrTransport]?seekingTransport?!(selected=dataTypeOrTransport):void 0:(options.dataTypes.unshift(dataTypeOrTransport),inspect(dataTypeOrTransport),!1)}),selected}return inspect(options.dataTypes[0])||!inspected["*"]&&inspect("*")}function ajaxExtend(target,src){var key,deep,flatOptions=jQuery.ajaxSettings.flatOptions||{};for(key in src)void 0!==src[key]&&((flatOptions[key]?target:deep||(deep={}))[key]=src[key]);return deep&&jQuery.extend(!0,target,deep),target}originAnchor.href=location.href,jQuery.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:location.href,type:"GET",isLocal:/^(?:about|app|app-storage|.+-extension|file|res|widget):$/.test(location.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":allTypes,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":jQuery.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(target,settings){return settings?ajaxExtend(ajaxExtend(target,jQuery.ajaxSettings),settings):ajaxExtend(jQuery.ajaxSettings,target)},ajaxPrefilter:addToPrefiltersOrTransports(prefilters),ajaxTransport:addToPrefiltersOrTransports(transports),ajax:function(url,options){"object"==typeof url&&(options=url,url=void 0),options=options||{};var transport,cacheURL,responseHeadersString,responseHeaders,timeoutTimer,urlAnchor,completed,fireGlobals,i,uncached,s=jQuery.ajaxSetup({},options),callbackContext=s.context||s,globalEventContext=s.context&&(callbackContext.nodeType||callbackContext.jquery)?jQuery(callbackContext):jQuery.event,deferred=jQuery.Deferred(),completeDeferred=jQuery.Callbacks("once memory"),statusCode=s.statusCode||{},requestHeaders={},requestHeadersNames={},strAbort="canceled",jqXHR={readyState:0,getResponseHeader:function(key){var match;if(completed){if(!responseHeaders)for(responseHeaders={};match=rheaders.exec(responseHeadersString);)responseHeaders[match[1].toLowerCase()]=match[2];match=responseHeaders[key.toLowerCase()]}return null==match?null:match},getAllResponseHeaders:function(){return completed?responseHeadersString:null},setRequestHeader:function(name,value){return null==completed&&(name=requestHeadersNames[name.toLowerCase()]=requestHeadersNames[name.toLowerCase()]||name,requestHeaders[name]=value),this},overrideMimeType:function(type){return null==completed&&(s.mimeType=type),this},statusCode:function(map){var code;if(map)if(completed)jqXHR.always(map[jqXHR.status]);else for(code in map)statusCode[code]=[statusCode[code],map[code]];return this},abort:function(statusText){var finalText=statusText||strAbort;return transport&&transport.abort(finalText),done(0,finalText),this}};if(deferred.promise(jqXHR),s.url=((url||s.url||location.href)+"").replace(rprotocol,location.protocol+"//"),s.type=options.method||options.type||s.method||s.type,s.dataTypes=(s.dataType||"*").toLowerCase().match(rnothtmlwhite)||[""],null==s.crossDomain){urlAnchor=document.createElement("a");try{urlAnchor.href=s.url,urlAnchor.href=urlAnchor.href,s.crossDomain=originAnchor.protocol+"//"+originAnchor.host!=urlAnchor.protocol+"//"+urlAnchor.host}catch(e){s.crossDomain=!0}}if(s.data&&s.processData&&"string"!=typeof s.data&&(s.data=jQuery.param(s.data,s.traditional)),inspectPrefiltersOrTransports(prefilters,s,options,jqXHR),completed)return jqXHR;for(i in(fireGlobals=jQuery.event&&s.global)&&0==jQuery.active++&&jQuery.event.trigger("ajaxStart"),s.type=s.type.toUpperCase(),s.hasContent=!rnoContent.test(s.type),cacheURL=s.url.replace(rhash,""),s.hasContent?s.data&&s.processData&&0===(s.contentType||"").indexOf("application/x-www-form-urlencoded")&&(s.data=s.data.replace(r20,"+")):(uncached=s.url.slice(cacheURL.length),s.data&&(s.processData||"string"==typeof s.data)&&(cacheURL+=(rquery.test(cacheURL)?"&":"?")+s.data,delete s.data),!1===s.cache&&(cacheURL=cacheURL.replace(rantiCache,"$1"),uncached=(rquery.test(cacheURL)?"&":"?")+"_="+nonce+++uncached),s.url=cacheURL+uncached),s.ifModified&&(jQuery.lastModified[cacheURL]&&jqXHR.setRequestHeader("If-Modified-Since",jQuery.lastModified[cacheURL]),jQuery.etag[cacheURL]&&jqXHR.setRequestHeader("If-None-Match",jQuery.etag[cacheURL])),(s.data&&s.hasContent&&!1!==s.contentType||options.contentType)&&jqXHR.setRequestHeader("Content-Type",s.contentType),jqXHR.setRequestHeader("Accept",s.dataTypes[0]&&s.accepts[s.dataTypes[0]]?s.accepts[s.dataTypes[0]]+("*"!==s.dataTypes[0]?", "+allTypes+"; q=0.01":""):s.accepts["*"]),s.headers)jqXHR.setRequestHeader(i,s.headers[i]);if(s.beforeSend&&(!1===s.beforeSend.call(callbackContext,jqXHR,s)||completed))return jqXHR.abort();if(strAbort="abort",completeDeferred.add(s.complete),jqXHR.done(s.success),jqXHR.fail(s.error),transport=inspectPrefiltersOrTransports(transports,s,options,jqXHR)){if(jqXHR.readyState=1,fireGlobals&&globalEventContext.trigger("ajaxSend",[jqXHR,s]),completed)return jqXHR;s.async&&s.timeout>0&&(timeoutTimer=window.setTimeout(function(){jqXHR.abort("timeout")},s.timeout));try{completed=!1,transport.send(requestHeaders,done)}catch(e){if(completed)throw e;done(-1,e)}}else done(-1,"No Transport");function done(status,nativeStatusText,responses,headers){var isSuccess,success,error,response,modified,statusText=nativeStatusText;completed||(completed=!0,timeoutTimer&&window.clearTimeout(timeoutTimer),transport=void 0,responseHeadersString=headers||"",jqXHR.readyState=status>0?4:0,isSuccess=status>=200&&status<300||304===status,responses&&(response=function(s,jqXHR,responses){for(var ct,type,finalDataType,firstDataType,contents=s.contents,dataTypes=s.dataTypes;"*"===dataTypes[0];)dataTypes.shift(),void 0===ct&&(ct=s.mimeType||jqXHR.getResponseHeader("Content-Type"));if(ct)for(type in contents)if(contents[type]&&contents[type].test(ct)){dataTypes.unshift(type);break}if(dataTypes[0]in responses)finalDataType=dataTypes[0];else{for(type in responses){if(!dataTypes[0]||s.converters[type+" "+dataTypes[0]]){finalDataType=type;break}firstDataType||(firstDataType=type)}finalDataType=finalDataType||firstDataType}if(finalDataType)return finalDataType!==dataTypes[0]&&dataTypes.unshift(finalDataType),responses[finalDataType]}(s,jqXHR,responses)),response=function(s,response,jqXHR,isSuccess){var conv2,current,conv,tmp,prev,converters={},dataTypes=s.dataTypes.slice();if(dataTypes[1])for(conv in s.converters)converters[conv.toLowerCase()]=s.converters[conv];for(current=dataTypes.shift();current;)if(s.responseFields[current]&&(jqXHR[s.responseFields[current]]=response),!prev&&isSuccess&&s.dataFilter&&(response=s.dataFilter(response,s.dataType)),prev=current,current=dataTypes.shift())if("*"===current)current=prev;else if("*"!==prev&&prev!==current){if(!(conv=converters[prev+" "+current]||converters["* "+current]))for(conv2 in converters)if((tmp=conv2.split(" "))[1]===current&&(conv=converters[prev+" "+tmp[0]]||converters["* "+tmp[0]])){!0===conv?conv=converters[conv2]:!0!==converters[conv2]&&(current=tmp[0],dataTypes.unshift(tmp[1]));break}if(!0!==conv)if(conv&&s.throws)response=conv(response);else try{response=conv(response)}catch(e){return{state:"parsererror",error:conv?e:"No conversion from "+prev+" to "+current}}}return{state:"success",data:response}}(s,response,jqXHR,isSuccess),isSuccess?(s.ifModified&&((modified=jqXHR.getResponseHeader("Last-Modified"))&&(jQuery.lastModified[cacheURL]=modified),(modified=jqXHR.getResponseHeader("etag"))&&(jQuery.etag[cacheURL]=modified)),204===status||"HEAD"===s.type?statusText="nocontent":304===status?statusText="notmodified":(statusText=response.state,success=response.data,isSuccess=!(error=response.error))):(error=statusText,!status&&statusText||(statusText="error",status<0&&(status=0))),jqXHR.status=status,jqXHR.statusText=(nativeStatusText||statusText)+"",isSuccess?deferred.resolveWith(callbackContext,[success,statusText,jqXHR]):deferred.rejectWith(callbackContext,[jqXHR,statusText,error]),jqXHR.statusCode(statusCode),statusCode=void 0,fireGlobals&&globalEventContext.trigger(isSuccess?"ajaxSuccess":"ajaxError",[jqXHR,s,isSuccess?success:error]),completeDeferred.fireWith(callbackContext,[jqXHR,statusText]),fireGlobals&&(globalEventContext.trigger("ajaxComplete",[jqXHR,s]),--jQuery.active||jQuery.event.trigger("ajaxStop")))}return jqXHR},getJSON:function(url,data,callback){return jQuery.get(url,data,callback,"json")},getScript:function(url,callback){return jQuery.get(url,void 0,callback,"script")}}),jQuery.each(["get","post"],function(i,method){jQuery[method]=function(url,data,callback,type){return isFunction(data)&&(type=type||callback,callback=data,data=void 0),jQuery.ajax(jQuery.extend({url:url,type:method,dataType:type,data:data,success:callback},jQuery.isPlainObject(url)&&url))}}),jQuery._evalUrl=function(url){return jQuery.ajax({url:url,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,throws:!0})},jQuery.fn.extend({wrapAll:function(html){var wrap;return this[0]&&(isFunction(html)&&(html=html.call(this[0])),wrap=jQuery(html,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&wrap.insertBefore(this[0]),wrap.map(function(){for(var elem=this;elem.firstElementChild;)elem=elem.firstElementChild;return elem}).append(this)),this},wrapInner:function(html){return isFunction(html)?this.each(function(i){jQuery(this).wrapInner(html.call(this,i))}):this.each(function(){var self=jQuery(this),contents=self.contents();contents.length?contents.wrapAll(html):self.append(html)})},wrap:function(html){var htmlIsFunction=isFunction(html);return this.each(function(i){jQuery(this).wrapAll(htmlIsFunction?html.call(this,i):html)})},unwrap:function(selector){return this.parent(selector).not("body").each(function(){jQuery(this).replaceWith(this.childNodes)}),this}}),jQuery.expr.pseudos.hidden=function(elem){return!jQuery.expr.pseudos.visible(elem)},jQuery.expr.pseudos.visible=function(elem){return!!(elem.offsetWidth||elem.offsetHeight||elem.getClientRects().length)},jQuery.ajaxSettings.xhr=function(){try{return new window.XMLHttpRequest}catch(e){}};var xhrSuccessStatus={0:200,1223:204},xhrSupported=jQuery.ajaxSettings.xhr();support.cors=!!xhrSupported&&"withCredentials"in xhrSupported,support.ajax=xhrSupported=!!xhrSupported,jQuery.ajaxTransport(function(options){var callback,errorCallback;if(support.cors||xhrSupported&&!options.crossDomain)return{send:function(headers,complete){var i,xhr=options.xhr();if(xhr.open(options.type,options.url,options.async,options.username,options.password),options.xhrFields)for(i in options.xhrFields)xhr[i]=options.xhrFields[i];for(i in options.mimeType&&xhr.overrideMimeType&&xhr.overrideMimeType(options.mimeType),options.crossDomain||headers["X-Requested-With"]||(headers["X-Requested-With"]="XMLHttpRequest"),headers)xhr.setRequestHeader(i,headers[i]);callback=function(type){return function(){callback&&(callback=errorCallback=xhr.onload=xhr.onerror=xhr.onabort=xhr.ontimeout=xhr.onreadystatechange=null,"abort"===type?xhr.abort():"error"===type?"number"!=typeof xhr.status?complete(0,"error"):complete(xhr.status,xhr.statusText):complete(xhrSuccessStatus[xhr.status]||xhr.status,xhr.statusText,"text"!==(xhr.responseType||"text")||"string"!=typeof xhr.responseText?{binary:xhr.response}:{text:xhr.responseText},xhr.getAllResponseHeaders()))}},xhr.onload=callback(),errorCallback=xhr.onerror=xhr.ontimeout=callback("error"),void 0!==xhr.onabort?xhr.onabort=errorCallback:xhr.onreadystatechange=function(){4===xhr.readyState&&window.setTimeout(function(){callback&&errorCallback()})},callback=callback("abort");try{xhr.send(options.hasContent&&options.data||null)}catch(e){if(callback)throw e}},abort:function(){callback&&callback()}}}),jQuery.ajaxPrefilter(function(s){s.crossDomain&&(s.contents.script=!1)}),jQuery.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(text){return jQuery.globalEval(text),text}}}),jQuery.ajaxPrefilter("script",function(s){void 0===s.cache&&(s.cache=!1),s.crossDomain&&(s.type="GET")}),jQuery.ajaxTransport("script",function(s){var script,callback;if(s.crossDomain)return{send:function(_,complete){script=jQuery(" -{% endblock %} - -{% block content %} -
    -
    -
    -

    {{ error_title }}

    -
    -
    -
    - -
    -
    -
    -
    -
    - - - -
    - -
    - -
    -
    -
    -
    -
    -
    -
    -
    - -
    -
    -

    {{ error_message | safe }}

    -
    - - -{% endblock %} - diff --git a/templates/main/about/channels.html b/templates/main/about/channels.html deleted file mode 100644 index ac3d95b5..00000000 --- a/templates/main/about/channels.html +++ /dev/null @@ -1,268 +0,0 @@ -{% extends "main/base.html" %} -{% block title %}Channels{% endblock %} -{% block og_title %}Channels{% endblock %} -{% block og_description %}Channel listing and what's each channel is for{% endblock %} -{% block content %} -
    -
    -
    -

    - Channels - - - - -

    - - -

    - Every channel on the server has a use, and we expect users to keep things relevant to the channel - whenever possible. Below, we've outlined all of the channels a normal user has access to send - messages to, and what they should be used for. -

    - -

    Discussion

    - -

    - Channels in this section are designated for discussion and chat, and shouldn't be used for help - requests in most cases. All channels in this category are on-topic. -

    - - - - - - - - - - - - - - - - - - - - - - -
    ChannelInfo
    #python-discussion - Discussion about the Python programming language and ecosystem -
    #tools - Discussion relating to Python tooling - IDEs, editors, package managers, documentation - generators, and so on -
    #meta - Discussion and suggestions relating to the Discord server, site, bot, and other - projects of ours -
    - -

    Off-Topic

    - -

    - Channels in this section are designated for off-topic discussion, and any topic - may be talked about here once it follows our rules. Note that these channels are for discussion, - and are not places for you to dump images or memes. -

    - -

    - These channels are renamed daily by the server bot. Suggest funny channel names - on the dedicated GitLab meta issue. -

    - -

    Python Help

    - -

    - Channels in this section are strictly on-topic, and designated for asking general Python-related - questions. If you're a beginner or you need some help with your Python, this is probably where you - want to be. -

    - -

    - Please try to pick a channel that isn't busy when asking your question. If you're not sure - how best to ask a question, take a look at - our guide on that subject. -

    - -

    Topical Chat/Help

    - -

    - Channels in this section are strictly on-topic, and geared towards specific subjects. They can be - used for either discussion or asking questions - if you need help with one of the specific things - covered here, it's best to ask your question in the relevant channel rather than one of the general - help channels. -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    ChannelInfo
    #databases - Discussion and questions relating to databases - both traditional and document-oriented - - such as SQLite, Postgresql, RethinkDB, Cassandra, Redis and so on -
    #data-science - Discussion and questions relating to machine learning, natural language processing, - statistics and graphing and so on -
    #dev-ops - Discussion and questions relating to devops - for example, deployment and configuration - of services, virtual machines and containers, and the day-to-day running of your - Python-powered services -
    #discord-py - Discussion and questions relating to the - discord.py library for writing - Discord bots in Python - This channel refers specifically to the - async branch of discord.py, - which is currently the stable version but is heavily outdated -
    #discord-py-rewrite - Discussion and questions relating to the - discord.py library for writing - Discord bots in Python - This channel refers specifically to the - rewrite branch of discord.py, - which is the most up-to-date version but is considered to be in beta -
    #security - Discussion and questions relating to cybersecurity, especially in relation to Python - and best practises -
    #software-testing - Discussion and questions relating to testing your Python applications -
    #user-interface - Discussion and questions relating to designing and building user interfaces - in Python, and related libraries and tools - this includes graphical interfaces and - console interfaces -
    #web-development - Discussion and questions relating to web development - including Python frameworks - such as Flask and Django, as well as HTML and JavaScript where it relates to the Web -
    - -

    Events

    - -

    - Channels in this section are strictly on-topic, and designated for the discussion of Python-related - events - for example, our Code Jams, as well as any - other large, related events that many of our users are partaking in. -

    -

    - If you're part of a related event and you don't see a channel for it here, feel free to ask for one! -

    - -

    Special

    - -

    - Channels in this section are designated for special uses, and don't really fit into the other - categories. -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    ChannelInfo
    #bot-commands - A channel specifically for making use of the bots on the server without clogging up - the other channels -
    #checkpoint - Invisible to most users after verifying themselves, this channel is where new - users verify that they accept the rules and - privacy policy -
    #challenges - While currently not in use, this channel lists various programming challenges that - one might like to attempt during their learning efforts - we'll be replacing this - with something better later, so stay tuned! -
    #reddit - A listing channel with a live feed of posts from - r/Python, our official subreddit. -
    #show-your-projects - A listing channel for users to show off their Python-oriented projects - please note - that this is not a discussion channel, and we do not allow postings for communities - or commercial projects - and if possible, we prefer that you post a link to your - source code instead of a website -
    #show-your-projects-discussion - Strictly on-topic discussion relating to projects posted in - #show-your-projects - we prefer that all discussion - relating to personal projects goes here -
    - -

    Voice

    - -

    - This section contains all of our general voice channels, as well as a single text channel - - #voice-chat. If you're in a voice channel but can't use a - microphone, you should use this channel to reply to other users using text instead of any - of the other channels. -

    -
    -
    -
    -{% endblock %} \ No newline at end of file diff --git a/templates/main/about/index.html b/templates/main/about/index.html deleted file mode 100644 index 35fe6ae0..00000000 --- a/templates/main/about/index.html +++ /dev/null @@ -1,40 +0,0 @@ -{% extends "main/base.html" %} -{% block title %}About{% endblock %} -{% block og_title %}About{% endblock %} -{% block og_description %}Partners links, and information about the server{% endblock %} -{% block content %} -
    -
    -
    -

    - About - - - - -

    - -

    - Channels - -
    - Server channel listings and information -

    -

    - Partners - -
    - Links to our partnered servers -

    -

    - Rules - -
    - Rules and infraction information for our community -

    -
    -
    -
    -{% endblock %} diff --git a/templates/main/about/partners.html b/templates/main/about/partners.html deleted file mode 100644 index 83803265..00000000 --- a/templates/main/about/partners.html +++ /dev/null @@ -1,46 +0,0 @@ -{% extends "main/base.html" %} -{% block title %}Partners{% endblock %} -{% block og_title %}Partners{% endblock %} -{% block og_description %}List and Links to Partner servers{% endblock %} -{% block content %} -
    -
    -
    -

    - Partners - - - -

    -
    - {% if partners is none %} -
    -

    - We were unable to load the partners.json file. If you see this, please - notify us! -

    -
    - {% else %} - {% for partner_name, partner_data in partners.items() %} -
    -
    - - {{ partner_name }} - -
    -
    -

    {{ partner_data['description'] }}

    -
    - -
    - {% endfor %} - {% endif %} -
    -
    -
    -
    -{% endblock %} diff --git a/templates/main/about/privacy.html b/templates/main/about/privacy.html deleted file mode 100644 index fa4e2aab..00000000 --- a/templates/main/about/privacy.html +++ /dev/null @@ -1,324 +0,0 @@ -{% extends "main/base.html" %} -{% block title %}Privacy{% endblock %} -{% block og_title %}Privacy{% endblock %} -{% block og_description %}Our privacy policy, and compliance information{% endblock %} -{% block content %} -
    -
    -
    -

    - Privacy - - - - -

    - - -

    - We take every step to ensure that your data is used ethically and that includes making sure that - you know exactly what data we collect, and what we do with it. That means that instead of a - bunch of legalese, we've provided this information in an easy, human-readable form below. -

    - -

    - Please note that we are a completely non-profit community. We have no interest in selling your - data, or shipping it off to third parties. Our community is entirely volunteer-run - it does - not have any form of monetary income whatsoever - and we believe that this is how it should be. -

    - -

    Data collection

    - -
    -

    - Please note that data marked with blurple text below is not - automatically removed. We need to hold onto this information in order to maintain infraction records - and ensure the smooth running of our community. -

    -

    - We do not store any data until you have verified yourself in #checkpoint on the server, - and certified that you agree to our rules and privacy policy. If you are leaving the server and would - like us to remove this data as well, please contact a member of staff directly. -

    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    What we collectWhen it's collectedWhat it's used forWho can access it
    Discord user ID!accept run on DiscordStatistics, data association (infractions, code jam applications, etc)Administrative staff
    Discord username and discriminator!accept run on DiscordDisplay purposes (alongside ID in staff areas, public profiles)Public (for code jam team listings and winner info) and staff areas
    Discord avatar URLs!accept run on DiscordDisplay purposes (alongside ID in staff areas, public profiles)Public (for code jam team listings and winner info) and staff areas
    Assigned roles on Discord!accept run on DiscordAccess control for the site, infractions, role restoration after kicksAdministrative staff
    Messages sent on Discord!accept run on Discord - Stored in memory by the bot for processing temporarily, may also end up in - staff-only logging channels for the purposes of accountability and infraction - management - Administrative staff
    OAuth access and refresh tokenDiscord login on siteUsed to find your Discord user ID when you log inAdministrative staff
    GitLab usernameCode jam profileUsed to identify you on GitLab as part of a code jam teamPublic, for code jam team listings
    TimezoneCode jam profileA factor in code jam team match-upsAdministrative staff
    System InformationCode jam signupUsed to verify that you have a working environmentAdministrative staff
    Email AddressIssues emailed directly to GitLabUsed to keep track of issue submissionsGitLab staff - never stored in our database
    - -

    - Note that we don't ordinarily collect your email address, and your email address will never be - stored on our servers. The only time it will be shown is in the title of any issues you create on - GitLab by directly emailing us on the meta@ email address. These issues are confidential, - not associated with a user account, do not require a GitLab account, and will only ever be seen by - staff. -

    - -

    - Collecting consent - - - - -

    - -

    - If you joined the community on or before the 20th of May, 2018, you will have seen an announcement about our - privacy policy on the Discord server. You will have had the opportunity to leave the server if - you weren't happy with it. If you decided to stay, then we will consider you to have accepted - our use of your data, as detailed on this page. -

    -

    - If you joined the community after the 20th of May, 2018, you will have been greeted with the - #checkpoint channel. In this channel, you must run the !accept - command to signify that you accept both our rules and this privacy policy. This will also have been - detailed in a message in that channel. -

    -

    - Please note that your acceptance of this privacy policy is retroactive, and you agree that any - revisions to it will apply when they are published. We will attempt to keep everyone updated on - changes to this policy via the usual announcement channels - if at any point you are not happy with - a change to the privacy policy, please bring it up with a member of staff. If we're unable to - solve your issue in a satisfactory way, you may remove your data as detailed below. -

    - -

    - Data removal - - - - -

    - -

    - If you'd like to remove your data from our servers, there are two options available to you. -

    - -
    -
    -
    -
    -

    Complete data removal

    -
    - -
    -

    - If you'd like to remove all of your personal data from our servers, all you need to do - is leave the Discord server. As much of the data we collect is necessary for running - our community, we are unable to offer you community membership with zero data collection. -

    -

    - Please note that data marked with blurple text in the table above - is not automatically removed. We need to hold onto this information in order to maintain infraction records - and ensure the smooth running of our community. If you are leaving the server and would like us to remove - this data as well, please contact a member of staff directly. -

    -

    - Once you've left the Discord server, your data is removed automatically. Please note that - for the sake of data integrity and moderation purposes, we do not remove your Discord - user ID from our database - but we do anonymize your data as far as possible. -

    -

    - As with deleting your code jam profile directly, you will be issued an automatic ban - from future code jams if you have applied for or are currently taking part in a - code jam. -

    -
    -
    -
    -
    -
    -
    -

    Code jam profile removal

    -
    - -
    -

    - If you've provided us with a code jam profile in the past and would like to remove - it, you may do so by heading to the - "My Profile" page, - where you will find a button that will remove your profile. -

    -

    - Please note that this is a nuclear option. If you have applied for or are currently - taking part in a code jam, this will void your application and you will receive an - automatic ban from future code jams until you've contacted us about it. -

    -
    -
    -
    -
    - -

    - GDPR compliance - - - - -

    - - -

    - Under the terms specified above, we do aim to comply with GDPR. While we do not currently have - an automated way for users to export the data they've provided to us, we're happy to do this - manually or answer any other GDPR- or privacy-related queries you may have. Feel free to contact - our GDPR officer on Discord (gdude#2002), or any other member of the administrative - staff. -

    -

    - We believe that the best way to keep your personal data safe is to avoid collecting it at all. - Discord itself is GDPR-compliant and they've already done the legwork required to ensure that - your data may be collected - so we don't see the need to collect your personal information - ourselves. Don't forget that by using Discord, you are stating that you are of legal age in - your country to give consent to process your data! -

    -

    - We are currently working on an automated way to get all of your data in both a human-readable - and machine-readable format. Keep your eye on the usual announcements channels for more information - on that, as it happens. -

    - -

    - Changelog - - - - -

    - - -
      -
    • -

      July 27th, 2018

      -

      - As we're replacing Rowboat (the bot we use for moderation), we need to hold onto some of - your data - even after you've left the server. This is necessary to ensure the smooth - running and security of our community. -

      -
    • -
    • -

      July 3rd, 2018

      -

      - While we don't collect your email addresses, they are visible on GitLab if you email an - issue directly to our meta@ email address, but only to staff. -

      -
    • -
    • -

      June 7th, 2018

      -

      - We no longer collect GitHub usernames - instead, we collect GitLab usernames. Additionally, - we now collect user avatar URLs for display purposes. -

      -
    • -
    • -

      June 5th, 2018

      -

      - Rectified an omission in the old privacy policy, where the system information you provide - as part of a code jam signup wasn't mentioned. -

      -
    • -
    • -

      May 31st, 2018

      -

      - We no longer collect your date of birth, and all collected dates of birth have been - removed from our database. The reason for this is that Discord itself already complies with - GDPR - and in order for you to sign up for a code jam, you must already have a Discord - account. -

      -
    • -
    • -

      May 20th, 2018

      -

      - Completed the first version of our privacy policy. We also updated our OAuth scopes for - Discord logins - we no longer collect your email, or get the access to join you to servers - automatically. All collected emails have also been removed from the database. -

      -
    • -
    -
    -
    -
    -{% endblock %} diff --git a/templates/main/about/rules.html b/templates/main/about/rules.html deleted file mode 100644 index b11f91d9..00000000 --- a/templates/main/about/rules.html +++ /dev/null @@ -1,124 +0,0 @@ -{% extends "main/base.html" %} -{% block title %}Rules{% endblock %} -{% block og_title %}Rules{% endblock %} -{% block og_description %}The server rules, along with an explanation of what happens when they're broken{% endblock %} -{% block content %} -
    -
    -
    -

    - Rules - - - - -

    - -

    - We have a small but strict set of rules on our server. Please read over them and take them on board - - if you don't understand anything or need some clarification, feel free to ask any staff member! -

    -
      -
    1. - Be polite, and do not spam -
    2. -
    3. - Follow the Discord community guidelines -
    4. -
    5. - Don't intentionally make other people uncomfortable - if someone asks you to stop discussing - something, you should stop -
    6. -
    7. - Be patient both with users asking questions, and the users answering them -
    8. -
    9. - We will not help you with anything that might break a law or the terms of service of any other - community, site, service, or otherwise - No piracy, brute-forcing, captcha circumvention, - sneaker bots, or anything else of that nature -
    10. -
    11. - Listen to and respect the staff members - we're here to help, but we're all human beings -
    12. -
    13. - All discussion should be kept within the relevant channels for the subject - See the - channels page for more information -
    14. -
    15. - This is an English-speaking server, so please speak English to the best of your ability - - Google Translate should be fine if you're not sure -
    16. -
    17. - Keep all discussions safe for work - No gore, nudity, sexual soliciting, references to suicide, - or anything else of that nature -
    18. -
    19. - We do not allow advertisements for communities or commercial projects - Contact us directly if - you want to discuss a partnership! -
    20. -
    - -

    - Nickname Policy - - - - -

    - -

    - In order to keep things pleasant and workable for both users and staff members, we enforce the - following requirements regarding your nickname. -

    -
      -
    1. No blank or "invisible" names
    2. -
    3. No slurs or other offensive sentiments
    4. -
    5. No noisy unicode characters - for example, z̯̯͡a̧͎̺̻̝͕̠l̡͓̫̣g̹̲o̡̼̘ or byte order marks
    6. -
    7. No nicknames designed to annoy other users
    8. -
    9. Make sure the nickname is easy to mention using a keyboard that can only type ASCII characters
    10. -
    -

    - Staff reserves the right to change the nickname of any user for any reason. Failure to comply with these - requirements may result in you losing the right to change your nickname. We also reserve the right to - discipline users with offensive usernames, regardless of the nickname they're using. -

    - -

    - Infractions - - - - -

    - -

    - We have a generally no-nonsense policy when it comes to our rules. If you notice someone breaking - them, feel free to mention or DM a staff member and we'll try to deal with it as soon as possible. -

    -

    - The possible actions we take based on infractions can include the following: -

    -
      -
    • A public verbal or textual warning
    • -
    • Forced nick changes, where appropriate
    • -
    • A short temporary mute
    • -
    • A long temporary mute
    • -
    • A kick from the server
    • -
    • A temporary ban from the server
    • -
    • A permanent ban from the server
    • -
    -

    - While we do discuss more serious matters internally before handing out a punishment, simpler - infractions are dealt with directly by individual staffers and the punishment they hand out is left - to their own discretion. -

    -
    -
    -
    -{% endblock %} \ No newline at end of file diff --git a/templates/main/base.html b/templates/main/base.html deleted file mode 100644 index bb12fc9b..00000000 --- a/templates/main/base.html +++ /dev/null @@ -1,53 +0,0 @@ - - - - {% block head %} - Python Discord | {% block title %}{% endblock %} - - - - - - - - - - - - - - - - - {% endblock %} - {% block extra_head %} - - {% endblock %} - - - {% if current_page == "main.index" %} -
    - {% else %} -
    - {% endif %} - {% include "main/navigation.html" %} - {% block content %}{% endblock %} -
    - -
    -
    -
    -

    - This website uses Python and - Flask, and was developed collaboratively on - GitLab. -
    - For privacy & GDPR-related info, please see this page. -

    -
    -
    -
    - - diff --git a/templates/main/bot/clean_logs.html b/templates/main/bot/clean_logs.html deleted file mode 100644 index 83ee0cba..00000000 --- a/templates/main/bot/clean_logs.html +++ /dev/null @@ -1,81 +0,0 @@ - - - - - - {% for message in messages %} - - - {{ message.author }}{{ message.timestamp }} | User ID: {{ message.user_id }}
    - {{ message.content }} - - - {% for attachment in message.attachments %} - {{ attachment }} - {% endfor %} - - - {% for embed in message.embeds %} -
    - - - {% if embed.title %} - {% if embed.url %} - {{ embed.title }}
    - {% else %} - {{ embed.title }}
    - {% endif %} - {% endif %} - - - - {% if embed.description %} -
    - {{ embed.description }} - {% endif %} - - - {% if embed.fields %} -
    - {% for field in embed.fields %} -
    -
    - {% if field.name %} - {{ field.name }}
    - {% endif %} - - {{ field.value }} -
    - {% endfor %} -
    - {% endif %} - - - {% if embed.image %} -
    - {% if embed.image.url %} - - {% endif %} - {% endif %} - - - {% if embed.thumbnail %} -
    - {% if embed.thumbnail.url %} - - {% endif %} - {% endif %} - - - {% if embed.footer %} -
    - {% if embed.footer.text %} - {{ embed.footer.text }} - {% endif %} - {% endif %} -
    - {% endfor %} - {% endfor %} - - - diff --git a/templates/main/index.html b/templates/main/index.html deleted file mode 100644 index c73c2e4b..00000000 --- a/templates/main/index.html +++ /dev/null @@ -1,38 +0,0 @@ -{% extends "main/base.html" %} -{% block title %}Home{% endblock %} -{% block og_title %}Home{% endblock %} -{% block content %} -
    -
    -

    - Python Discord -

    - -

    - We're a large, friendly community focused around the Python programming language, - open to those who wish to learn the language or improve their skills, as well as - those looking to help others. -

    -

    - We organise regular community events and have a dedicated staff of talented Python developers - available to assist around the clock. Whether you're looking to learn the language or working - on a complex project, we've got someone who can help you if you get stuck. -

    -
    - - - -
    -
    -
    -

    - Please note: this site is under construction. What you see now may be vastly different - from the final project state. Feel free to chat to us on Discord if you're curious! -

    -
    - -
    -
    -{% endblock %} diff --git a/templates/main/info/faq.html b/templates/main/info/faq.html deleted file mode 100644 index e742f317..00000000 --- a/templates/main/info/faq.html +++ /dev/null @@ -1,324 +0,0 @@ -{% extends "main/base.html" %} -{% block title %}FAQ{% endblock %} -{% block og_title %}FAQ{% endblock %} -{% block og_description %}Frequently Asked Questions{% endblock %} -{% block content %} -
    -
    -
    -

    - Frequently Asked Questions - - - - -

    - -

    - These are some of the most-asked questions we get on a day-to-day basis. If you have a - question, be sure to check this page and see if we've answered it already. If you'd like to - suggest an entry to this page, why not submit a merge request - on GitLab? -

    - -
    -
    -

    - Starting Out with Python - - - - -

    -
    - -
    - Is Python a good first language? -
    -
    -

    - In our opinion, yes it is. It's a very powerful language, but it will force you to - write readable code and it's designed to allow you to write code very quickly, without - you having to keep your head in a book for hours on end. -

    -

    - Python is used as a teaching language in many schools, colleges and universities - but - it's a very capable language that is suitable for many real-world tasks as well, and - it's only gaining in popularity! -

    -
    - -
    - I'm new to Python - how/where do I get started? -
    -
    -

    - How you get started with Python is very much going to depend on your prior programming - experience. If you're already an experienced programmer, you should should have no - trouble following pretty much any guide out there - but for true beginners, we recommend - full-on tutorials such as Automate the Boring Stuff with Python. -

    -

    - For more information on that and other resources, feel free to take a look at - our resources page. -

    -
    - -
    - Should I start with Python 2 or Python 3? Which is better? -
    -
    -

    - Generally, we're always going to recommend that people new to Python start with Python 3. - There's a few reasons for this: -

    -
      -
    • - Python 3 is the latest-and-greatest version. It gets all the new features and is in - active development. -
    • -
    • - Python 2 lacks many features available in Python 3 and is mechanically different in a - few important areas. -
    • -
    • - Python 2 is being sunset and will reach its end of life in 2020. It will not be - maintained past 2020. There will be no Python 2.8. -
    • -
    • - Most libraries now fully support Python 3, and many are dropping or have dropped support - for Python 2. -
    • -
    - -

    - The only reason a user may want to stick with Python 2 is if they are stuck working a job - with a legacy codebase that cannot or will not be updated to work with Python 3. To users - in those situations: Commiserations. -

    -
    - -
    - What IDE/Editor should I use? Should I use an IDE if I'm a beginner? -
    -
    -

    - If you're a beginner, you should not be using an IDE. This is because IDEs do a lot of - basic things automatically where a beginner should learn to do things themselves - for - example, some IDEs can generate huge chunks of code or catch beginner errors without you - even noticing you'd made a typo. -

    -

    - If you're not a beginner or you decide to try an IDE regardless, we heavily recommend - PyCharm. This is a well-known IDE which - is entirely in a league of its own, and has a very capable free "community" edition that - will serve most people's needs. -

    -

    - We've listed off some of our favourite editors and IDEs on - our resources page. Feel free to - take a look if you're not sure what's out there. -

    -

    - By the way, we host quarterly code jams - for the users of our community, and the prize for winning it is a one-year PyCharm Pro - license - sponsored by JetBrains. If you like PyCharm and are thinking of grabbing a copy - of Pro, why not join in? -

    -
    - -
    - What's wrong with "Learn Python the Hard Way"? -
    -
    -

    - Learn Python the Hard Way, Zed Shaw's most infamous work, is largely considered by the - Python community to be poor-quality and misleading in general. This is due to numerous - issues with the material, which include being extremely opinionated and sometimes - condescending, out of date, confusing and even wildly incorrect in some places. -

    -

    - Learners that have used Learn Python the Hard Way as their primary learning material often - find themselves confused and asking questions that really don't make that much sense - it's - also been observed that learners in this position tend to suffer heavily from the infamous - XY Problem. -

    -

    - For more information on why you should avoid Learn Python the Hard Way, you can have a look - at this article on the sopython - wiki, - which enumerates the most egregious issues with it. -

    -
    - -
    - If I type "python" or "pip" into a terminal, I get "command not found". -
    -
    -

    - That's not a question, but there's a few things you can look at to try to solve this. -

    -
      -
    • - If you're on Windows, the python installer has an option labelled "Add to PATH" - - Make sure you check this when you install python. If you forgot to do that the - first time, then the easiest way to solve this problem is to reinstall Python -
    • -
    • - If you're on Windows, there's a good chance that python and - pip aren't what you actually need to run! Some options you could - try include py -3, python3 or python36 - if - one of these works, then you should be able to use py -3 -m pip, - pip3 or pip36 as well -
    • -
    • - If you're on a Mac, Python comes with the OS - however, it's quite likely to be - an old version. You can solve this by using Homebrew - to install a more recent version of Python, which should be made available as - python3 -
    • -
    -
    - -
    - Why can't I import this module? -
    -
    -

    - When finding yourself unable to import something in Python, you can follow these - steps to figure it out: -

    -
      -
    • - Is the module part of Python's standard - library? -
    • -
    • - If not, have you installed it? If the module is on - PyPi, - you can install it using pip in a terminal: pip install module_name -
    • -
    • - If you think you've installed it, try upgrading it with pip in a terminal: - pip install -U module_name - Make sure there were no errors during - installation -
    • -
    • - If all else fails, make sure you've read the module documentation fully, and ensure - that you're following it correctly -
    • -
    • - If you're sure that you've done everything correctly, you may have found a bug - come - and chat to us, and we might recommend that you report your problem to the developer -
    • -
    -
    - -
    - What's PEP8? Should I care about code style? -
    -
    -

    - Python Enhancement Proposal #8 - is known as the official Python style guide. It sets out a lot of very clear guidelines - which help you structure your code. -

    -

    - One of the most useful things you can do when writing your code is to follow a style - guide. It makes it easier to read your code overall, but a consistent style guide - is very important as it means that everyone that contributes to your project is - writing code in the same style - meaning everyone will be able to read it. As PEP - itself reads: "A foolish consistency is the hobgoblin of little minds". -

    -

    - PEP8 isn't the only style guide available to you, but it is the most widely used - and best-understood of them - and for that reason, we do recommend you use it. That - said, - Google's Python Style Guide - is also widely used by Google engineers. -

    -
    - -
    -

    - Community Questions - - - - -

    -
    - -
    - Why did you move to GitLab? Do you hate Microsoft? -
    -
    -

    - While many of our users do prefer to work on Linux, we don't hate Microsoft. While - - the news about Microsoft's acquisition of GitHub - - did prompt us to initially mirror our GitHub repositories to GitLab for safety, we didn't - outright make the move because of the acquisition - in fact, some of our staff members - had been suggesting we use it from the start! Here's some of the reasons we decided - to move: -

    -
      -
    • - Prior to moving to GitLab, our development efforts were split among three services: - ClickUp for issue tracking, - GitHub for code storage and collaboration, - and Travis for continuous integration and testing. - GitLab is a fantastic alternative to all of these services, and moving to it has allowed - us to consolidate our efforts in one place. -
    • -
    • - For a long time now, GitLab has been innovating on features and pushing them to production - much faster than GitHub. Using GitLab gives us far more options when it comes to issue - management, merge requests, continuous integration and deployment - to name - a few things. -
    • -
    • - In the vast majority of cases where GitHub and GitLab solve the same problem or - have a similar feature, GitLab does it better. -
    • -
    • - GitLab has had free private repositories for some time now, and these are convenient - for us to store internal documentation and tasks in. -
    • -
    • - GitLab is fully open-source and quite easy to host yourself. In the event that the - public platform ends up dying or being abused by its staff, we can simply spin - up our own instance and keep on working as if there were no problems. -
    • -
    -
    - -
    -

    - Misc. Questions - - - - -

    -
    - -
    - What does "real" Python development look like? -
    -
    -

    - Python is a very versatile language, and a real-life application using it can take - many forms. That said, we do plenty of Python development here ourselves. If - you're curious about this question, then why not take a look at - our projects? -

    -
    -
    -
    -
    -
    -{% endblock %} diff --git a/templates/main/info/help.html b/templates/main/info/help.html deleted file mode 100644 index 9cc09af2..00000000 --- a/templates/main/info/help.html +++ /dev/null @@ -1,461 +0,0 @@ -{% extends "main/base.html" %} -{% block title %}Getting Help{% endblock %} -{% block og_title %}Getting Help{% endblock %} -{% block og_description %}A guide on how to ask good questions, how to avoid annoying those helping out, and how to interpret answers{% endblock %} -{% block content %} -
    -
    -
    -

    - Getting Help - - - - -

    - -

    - This document is intended to provide you with the information you need to get help as quickly and - effectively as possible. If you're stuck on a problem or you just don't understand something, feel - free to join us and ask for help - you can use this as a reference when forming your question. -

    -

    - Much of this document is based on the sentiments expressed by Eric Steven Raymond and Rick Moen - in their essay, How To Ask Questions The Smart Way. - Please note that the essay is very long and may be considered rude by some. Additionally, the people - behind that essay are in no way affiliated with us - please do not bother them with your Python - problems. -

    -

    - Before You Ask - - - - -

    - -

    - Before you ask your question, there are a few things you can do to find an answer on your own. - Experienced developers will do the following: -

    -
      -
    • Read the official documentation for whatever you're working with
    • -
    • Use a debugger to inspect your code
    • -
    • Do some research online - for example, on Stack Overflow
    • -
    • Read the source code for whatever you're working with
    • -
    • Search the message history of the help channels
    • -
    -

    - Essentially, doing your research is the first step towards a solution to any problem. If your - problem isn't extremely general, we're going to be doing exactly these steps ourselves when you ask, - so doing the legwork beforehand saves everyone a lot of time. -

    -
    -
    -
    -
    -
    -
    -

    - - - Creativity requires input, and that's what research is. You're gathering material with which to - build. -

    - - Gene Luen Yang - -
    -
    -
    -
    -
    -
    -

    - If you're an absolute beginner, take a moment to step back from the problem. - Have you read a book or done a - tutorial? There's a huge amount of resources out there, many of which are going to help you a lot more than - us answering the beginners' questions for you. If you're following a tutorial, book or course and - you don't understand something, then that is the correct time to ask a beginners' - question. Of course, we won't turn you away if you do have a beginners' question — by all - means, - come to us if you do have a problem. -

    -

    - Have you read the official documentation for the module or technology you're working with? The - official Python 3 docs are a fantastic and valuable - resource, so if you're using a bundled module, your first port of call should be there. If you're - using a third-party library, often they will have some official documentation uploaded somewhere - — - try having a Google around, or take a look at PyPi in case they've - linked it from there. -

    -

    - If you can't find the documentation or you find it lacking, the next place to look is the source - code. - Grab a decent IDE (we recommend PyCharm Community) - and a coffee, download a copy of the project and open it up, and get to browsing! -

    -

    - If you're still confused, try searching the Internet for people that have already had the same - problem. Often, you won't be the only person to have encountered the issue you're dealing with - more often - than not, you'll find a GitLab ticket or a StackOverflow question along with a fix or answer to your - question already posted. -

    -

    - If none of the above helps you or you're lost, scared and alone, feel free to continue on to the - Discord server. You can use the search feature (the at the top right) to check - whether someone else has asked your question recently, or just feel free to pick one of the help channels - and ask your question. -

    -

    - A Good Question - - - - -

    - -

    - When you're ready to ask a question, there's a few things you should have to hand before forming - a query. -

    -
      -
    • - A code example that illustrates your problem -
        -
      • If possible, make this a minimal example rather than an entire application
      • -
      -
    • -
    • Details on how you attempted to solve the problem on your own
    • -
    • Full version information — for example, "Python 3.6.4 with - discord.py 1.0.0a"
    • -
    -

    - Your question should be informative, but to the point. More importantly, how you phrase your - question - and how you address those that may help you is crucial. Courtesy never hurts, and please type - using correctly-spelled and grammatical language as far as you possibly can. -

    -

    - When you're inspecting a problem, don't be quick to assume that you've found a bug, or that your - approach is correct. While it helps to detail what exactly you're trying to do, you should also - be able to give us the bigger picture - describe the goal, not just the step. Describe the problem's - symptoms in chronological order - not your guesses as to their cause. -

    -
    -
    -
    -
    -
    -
    -
    -

    - Bad Questions -

    -
    -
    -

    - Good Questions -

    -
    -
    -
    -
    -

    - Where can I find information on discord.py? -

    -

    - This question suggests that the person asking it hasn't done any research, or even a simple - Google search. -

    -
    -
    -

    - I used Google to try to find more information about "discord.py 1.0.0a", but I couldn't - really - find anything useful. Does anyone know where I might find a guide to writing commands - using this library? -

    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -

    - Pillow puts my text at the bottom of the image instead of where I wanted it. Why is it broken? -

    -

    - This question assumes that the problem is with Pillow itself, and that it isn't - the questioner's fault. It also doesn't provide enough information on the problem. -

    -
    -
    -

    - Pillow appears to insert text at the bottom of the image if the given X coordinate is negative. - I had a look at the documentation and searched Stack Overflow, but I couldn't find any - information on using negative coordinates to position text. Has anyone attempted this? -

    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -

    - I'm having some trouble writing a YouTube random URL generator - can anyone help? -

    -

    - This question provides no information on the problem, and asks for help in a way that isn't - engaging - some people will find this annoying, as answering your question is guaranteed - to result in another question. -

    -
    -
    -

    - My YouTube random URL generator appears to be returning false positives for tested URLs, - stating that a URL points to a real video when that video doesn't actually exist. Obviously - there's some issue with how this is checked, but I can't put my finger on it. Is there anything - I can check? -

    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -

    - I want to share a YouTube video with my friend, but the video doesn't move when I print the page. - How do I make the video move? -

    -

    - This question assumes a specific (wrong) approach, and isn't open-ended enough to account for - the possibility of a better solution. -

    -
    -
    -

    - I'm attempting to figure out the best way to share a YouTube video with my friend that doesn't - have the Internet at home. I can't think of a better approach than printing the page, which - obviously doesn't help much given that the video doesn't move on the paper - can anyone think - of a better approach to this? -

    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -

    - I was given this assignment by my teacher, but I'm not sure how to approach it. Does anyone - have any ideas? -

    -

    - This question is clearly a homework question. Homework is supposed to challenge you, and we - will not provide solutions to homework. Instead, ask a more general question. -

    -
    -
    -

    - I have a list of numbers - how do I calculate how many of them are even? Is there a way - to remove all the odd numbers from my list? Are there quick ways to find the average of - a list of numbers, or add them all together? -

    -
    -
    -
    -
    -
    -
    -
    -

    - Interpreting Answers - - - - -

    - -

    - Programmers have a certain set of mannerisms. While we all try to be as courteous with our replies - as possible, occasionally it may seem as if a helper is annoyed or disinterested in your question. - This isn't personal - it's just part of our culture. Remember that the people you're asking for help - are humans and that they're here voluntarily, in their free time. -

    -

    - If you've asked a question and you're told to read the documentation or search the web, you should - do that. When this happens, it's often the case that the person responding has the information you need - open in their web browser and either thinks that it's very easy to find, or that you would learn - more from seeking out the source of the information yourself. If you've already done this, you should - tell us by including it in your question! -

    -

    - If you don't understand an answer, don't immediately bounce back and demand clarification. Use the - tools available to you (the internet, documentation, source code) to help you understand the answer, and - if you still can't figure it out, ask for clarification and provide any relevant information you learned - during your research. -

    -
    -
    -
    - -
    -
    -
    -

    - - - Successful people ask better questions, and as a result, they get better answers. -

    - - Tony Robbins - -
    -
    -
    - -
    -
    -
    -

    - Much of what looks like rudeness within programming communities is not intended to be offensive and - it's often just a product of the down-to-earth, direct style of communication that is typical in - a community that is more concerned with solving problems than anything else. If you perceive - rudeness, try to react calmly. If a user really is acting out, then chances are that a member of staff will - call them out on it. If this doesn't happen, contact a member of staff directly and they will try - to clarify this with you. -

    -

    - It's okay to mess up. It happens to all of us. That said, if you mess up badly enough, it's likely - that you will be corrected there and then, in public and with a verbal scalpel. Take this as a - learning experience and don't let it get to you - this is a common and appropriate response in - many programming circles. Community standards do not maintain themselves - they're maintained by - people applying actively them, visibly, in public. -

    - -

    - What Not To Ask - - - - -

    - - -

    - Can I ask a question? -

    -

    - Yes. Always yes. Just ask it. -

    - -

    - Can I use str() on a discord.py Channel object? -

    -

    - Try it yourself and see. Experimentation is a great way to learn, and you'll save a lot of time by - just trying things out. Don't be afraid of your computer! -

    - -

    - My code doesn't work -

    -

    - This isn't a question, and it provides absolutely no context or information. Depending on the moods - of the people that are around, you may even find yourself ignored. Don't be offended by this - just - try - again with a better question. -

    -
    -
    -
    - -
    -
    -
    -

    - - - So much of life isn’t about having the right answer; it’s about knowing the right question. -

    - - Duane Hewitt - -
    -
    -
    - -
    -
    -
    -

    - Can anyone help me break into someone's Facebook account?
    - Can anyone help me download anime from this streaming site's listing page?
    - How do I write a virus? -

    -

    - We will absolutely not help you with hacking, pirating, or any other illegal activity. A question - like this is likely to be followed up with a ban if the person asking it doesn't back down quickly. -

    - -

    - Can I send you a private message? -

    -

    - No. We do not provide one-on-one tutoring - you can hire someone locally if you really need that. We - also prefer that questions are answered in a public channel as it means that everyone else present - is able to learn from them. If you're working with code that you are unable to disclose for any - reason, you should try to make your question more general and write a separate, small piece of code - to illustrate your problem. -

    - -

    - Can you help me over Teamviewer? -

    -

    - No. We will not help you by accessing your computer remotely, or watching a video stream of your - problem, unless the problem is something that inherently requires that. The reason for this is that - our time is limited, and watching a video or participating in a screen-sharing session means that we - have to focus on you, instead of being able to deal with other people while you're figuring out an - answer. If your problem is graphical and you can't adequately describe it without a visual, take a - screenshot or provide a short screen recording to illustrate your problem. -

    -
    -
    -
    -{% endblock %} \ No newline at end of file diff --git a/templates/main/info/index.html b/templates/main/info/index.html deleted file mode 100644 index 07e1a4d8..00000000 --- a/templates/main/info/index.html +++ /dev/null @@ -1,43 +0,0 @@ -{% extends "main/base.html" %} -{% block title %}Information{% endblock %} -{% block og_title %}Information{% endblock %} -{% block og_description %}Informational pages, listings and guides{% endblock %} -{% block content %} -
    -
    -
    -

    - Information - - - - -

    - - -

    - Code Jams   - -
    - Information on our monthly code jams, where users are paired into teams to compete with each other -

    - -

    - Getting Help   - -
    - How to ask for help - and how to interpret the responses -

    - -

    - Resources   - -
    - A page full of useful resources for learning and working with Python -

    -
    -
    -
    -{% endblock %} \ No newline at end of file diff --git a/templates/main/info/resources.html b/templates/main/info/resources.html deleted file mode 100644 index 574d0bfb..00000000 --- a/templates/main/info/resources.html +++ /dev/null @@ -1,103 +0,0 @@ -{% extends "main/base.html" %} -{% block title %}Resources{% endblock %} -{% block og_title %}Resources{% endblock %} -{% block og_description %}A list of helpful resources for beginner and experienced Python programmers alike{% endblock %} -{% block content %} -
    -
    -
    -

    - Resources - - - - -

    - -

    - This page is intended to be a listing of useful resources for beginner and experienced Python - programmers alike. This page is generated from a JSON file - on GitLab - - if there's a great resource that you love and you don't see it on this page, feel free to submit a - merge request! -

    -

    - Some resources aren't free - the below key will help you figure out whether you need to pay for - a resource or not. You can also hover them for more information on the payment (or tap them on - mobile). -

    -
    -
    - - Free -
    - -
    - - Payment optional -
    - -
    - - Paid -
    -
    - {% if categories is none %} -
    -

    - We were unable to load the resources.json file. If you see this, please - notify us! -

    -
    - {% else %} - {% for category_name, category_data in categories.items() %} -

    - {{ category_name }} - - - - -
    - -

    - {% for item, data in category_data.resources.items() %} -

    - {% if data["payment"] == "optional" %} - {% set file_path = static_file("images/payment_icons/yellow.svg") %} - {% elif data["payment"] == "paid" %} - {% set file_path = static_file("images/payment_icons/red.svg") %} - {% else %} - {% set file_path = static_file("images/payment_icons/green.svg") %} - {% endif %} - - {% if data["payment_description"] %} - - {% else %} - - {% endif %} - -

    - {{ item }}
    -
    - {% for url in data.urls %} - - {% endfor %} -
    -
    - -
    - {{ data.description }} -

    - {% endfor %} - {% endfor %} - {% endif %} -
    -
    -
    -{% endblock %} \ No newline at end of file diff --git a/templates/main/jams/already.html b/templates/main/jams/already.html deleted file mode 100644 index 16cba149..00000000 --- a/templates/main/jams/already.html +++ /dev/null @@ -1,26 +0,0 @@ -{% extends "main/base.html" %} -{% block title %}Code Jams | Already applied{% endblock %} -{% block og_title %}Code Jams | Already applied{% endblock %} - -{% block content %} -
    -
    -

    - Code Jam {{ jam.number }}: {{ jam.title }} -

    - - -

    - Thanks for your interest in this code jam! It looks like we already have an application here for you, - so please just sit back, relax, and we'll let you know whether you've been selected for this code - jam when the time comes. -

    - - -  Back to all code jams - -
    -
    -{% endblock %} diff --git a/templates/main/jams/banned.html b/templates/main/jams/banned.html deleted file mode 100644 index fa47c1ec..00000000 --- a/templates/main/jams/banned.html +++ /dev/null @@ -1,44 +0,0 @@ -{% extends "main/base.html" %} -{% block title %}Code Jams | Banned{% endblock %} -{% block og_title %}Code Jams | Banned{% endblock %} - -{% block content %} -
    -
    -

    - Code Jam {{ jam.number }}: {{ jam.title }} -

    - - - {% if infraction.number == -1 %} -

    - Thanks for your interest in this code jam! Unfortunately, due to your previous actions, you have been - permanently banned from participating in our code jams. -
    -
    - The reason given is: {{ infraction.reason }} -
    -
    - If you feel that this is a mistake, please feel free to contact one of the admins on Discord. -

    - {% else %} -

    - Thanks for your interest in this code jam! Unfortunately, due to your previous actions, you have been - temporarily banned from participating in our code jams. -
    -
    - The reason given is: {{ infraction.reason }} -
    -
    - If you feel that this is a mistake, please feel free to contact one of the admins on Discord. -

    - {% endif %} - - -  Back to all code jams - -
    -
    -{% endblock %} diff --git a/templates/main/jams/index.html b/templates/main/jams/index.html deleted file mode 100644 index 3546bd71..00000000 --- a/templates/main/jams/index.html +++ /dev/null @@ -1,144 +0,0 @@ -{% extends "main/base.html" %} -{% block title %}Code Jams | Home{% endblock %} -{% block og_title %}Code Jams | Home{% endblock %} -{% block page_classes %}uses-rst{% endblock %} -{% block content %} -
    -
    -
    -
    -
    -

    - Code Jams -

    - - -

    - Every three months or so, we aim to host a server-wide code jam, suitable for all members of the server. In - these, we announce a theme and date in advance, and users may sign up via a link provided in the - announcements channel on the server. Once the sign-up period is over, users are grouped into - teams. On the day of the code jam, we announce a task - each team will then work on a solution - to this task. -

    -

    - Once the code jam is over, our staff team will review and test each submission. Once that's done, - a winner will be decided! -

    -

    - If you'd like to join one of our code jams, feel free to ask a member of staff about the next one. -

    -
    - -
    -

    - Sponsors -

    - - - - - -
    -
    - -
    - -  Wiki - - -  Rules & Guidelines - - -  Git Primer - - - {% if jams %} - {% for jam in jams %} -

    - Code Jam {{ jam.number }}: {{ jam.title }} - - {% if jam.state == "announced" %} - {% if has_applied_to_jam(jam) %} - -  Applied - - {% else %} - -  Join - - {% endif %} - {% else %} - {% if jam.teams and jam.teams | length > 0 %} - -  Teams - - {% endif %} - - - - {% endif %} - - -

    -
    -
    -

    Start: {{ format_datetime(jam.date_start) }} UTC

    -
    -
    -

    End: {{ format_datetime(jam.date_end) }} UTC

    -
    - {% if jam.participants %} - {% if jam.winning_team %} - -

    Participants: {{ jam.participants | length }}

    -
    - -

    Champions: {{ jam.winning_team.name }}

    -
    - {% else %} - -

    Participants: {{ jam.participants | length }}

    -
    - {% endif %} - {% endif %} -
    -

    - {% if jam.state in ["running", "judging", "finished"] %} - - Theme: {{ jam.theme }} - - {% endif %} -

    - -

    - - {{ jam.info_html | safe }} - - {% if jam.state in ["running", "judging", "finished"] %} -
    - - {{ jam.task_html | safe }} - {% endif %} - - {% if jam.state == "finished" %} -
    - - {{ jam.end_html | safe }} - {% endif %} - - {% endfor %} - {% else %} -

    - Looking for our code jams? There's nothing here just yet! -

    - {% endif %} -
    -
    -
    -{% endblock %} diff --git a/templates/main/jams/info.html b/templates/main/jams/info.html deleted file mode 100644 index 920256a6..00000000 --- a/templates/main/jams/info.html +++ /dev/null @@ -1,128 +0,0 @@ -{% extends "main/base.html" %} -{% block title %}Code Jams | Git Primer{% endblock %} -{% block og_title %}Code Jams | Git Primer{% endblock %} -{% block og_description %}Information about our code jams - monthly events where users are grouped into pairs to solve a Python task{% endblock %} -{% block content %} -
    -
    -
    -

    - Getting Started - - - - -

    - -

    - All of our code jams happen on GitLab. If you don't have an - account there, you'll need to create one before you can join one of our code jams. Teams are required - to fork the repository we have set up for the current code jam, commit their code to their fork, and - then open a merge request with their project on the code jam repository. -

    -

    - Once the challenge task has been announced, head to the link provided to reach the challenge repository. - In order to work on the task, you will need to fork the repository - this will create a copy of the - repository under your account, which you will be able to work on with your teammates. To do so, - log into GitLab and click on the "Fork" button on the repository page. Select your username from the - dialogue, and it will be forked to your account. -

    -
    - - -
    -

    - Once this has been done, you should find yourself looking at your new copy of the repository. Next - up, you'll need to give your teammates access to it! Click on the "Settings" tab, click on - "Collaborators", enter your password if you're prompted for it, and add your teammates as - collaborators. -

    -
    - - - -
    -

    - Now that you've set up your repository, it's time to install Git. If you're on Linux, you can - install Git using your system's package manager. Windows users can install - Git for Windows, and Mac users can install Git - using Homebrew. Once you're all installed, open up a terminal - (or open Git Bash if you're on Windows). For the purpose of illustration we will be working on - Windows, but this will work on any platform. -

    -

    - We will use Git to clone the repository to the machine. Simply type git clone <url> - and Git will download a copy of the repository. The URL is the same one you use to get to the - repository page on GitLab. Use cd project-name to change directory to the repository. -

    -
    - -
    -

    - Now, open the newly-cloned repository in your favourite editor and make some edits. We'll be using - Visual Studio Code in this example, but use whatever - you prefer. For example, let's create a file named "hello.py", and add a line of code to it. -

    -
    - -
    -

    - Now that we've edited a file, we need to make Git aware of our changes. Head back over to your - terminal, and type git add hello.py to add this file to our changeset. -

    -

    - Next up, we'll need to bundle up our changes into a commit, and push it to GitLab. To do that, we'll - use git commit -am "message". Make sure you use a descriptive message explaining why - you made your changes and what they are, but try to keep it to a single line of text if you can. - Following this, we can use git push origin master to push our commit up to GitLab. -

    -
    - - -
    -

    - In order to pull the latest version of the code when the repository was cloned earlier, we can - simply use the git pull command. In order to illustrate this, we will need to enlist - the help of our lovely assistant... -

    -
    - - - -
    -

    - Oh boy. -

    -

    - Once you've pushed some code to the repository, you will notice a "Merge request" link. Click on - that to create a merge request, which will let us know that you're working on the task and help us - to keep track of things. Simply click on the "Create merge request" button on the next page, fill - in the "Title" box with your team number - for example, "Team 1" - and click the big green - button to finish. -

    -
    - - - - -
    -

    - Now that your merge request has been created, keep working on your project! Code that you push to - GitLab will automatically be added to your merge request in real-time. As the code jam continues on, - you may find review comments waiting from us. These are just suggestions to help you improve as - a programmer - free advice from us. Feel free to incorporate our suggestions into your project - if you wish. -

    -
    - -
    -

    - That's all there is to it! Keep working at your task, do your best and you might just come out - on top! -

    -
    -
    -
    -{% endblock %} \ No newline at end of file diff --git a/templates/main/jams/join.html b/templates/main/jams/join.html deleted file mode 100644 index 4ff645b8..00000000 --- a/templates/main/jams/join.html +++ /dev/null @@ -1,362 +0,0 @@ -{% extends "main/base.html" %} -{% block title %}Code Jams | Join{% endblock %} -{% block og_title %}Code Jams | Join{% endblock %} -{% block page_classes %}uses-rst{% endblock %} - -{% macro show_question(question) %} -
    -
    - {% if question.optional %} - - {% else %} - - {% endif %} -
    -
    - {% if question.type == "checkbox" %} - {% if question.optional %} - - - {% else %} - - - {% endif %} - - {% elif question.type == "email" %} - {% if question.optional %} - - {% else %} - - {% endif %} - - {% elif question.type == "number" %} - {% if question.optional %} - - {% else %} - - {% endif %} - - {% elif question.type == "radio" %} - {% if question.optional %} - {% for option in question.data.options %} - - - {% endfor %} - {% else %} - {% for option in question.data.options %} - - - {% endfor %} - {% endif %} - - {% elif question.type == "range" %} -
    - {% if question.optional %} - {% for num in range(question.data.min, question.data.max + 1) %} - - - - - {% endfor %} - {% else %} - {% for num in range(question.data.min, question.data.max + 1) %} - - - - - {% endfor %} - {% endif %} -
    - - {% elif question.type == "text" %} - {% if question.optional %} - - {% else %} - - {% endif %} - - {% elif question.type == "textarea" %} - {% if question.optional %} - - {% else %} - - {% endif %} - - {% elif question.type == "slider" %} -
    - - -
    - - {% endif %} -
    -
    -{% endmacro %} - -{% block content %} -
    -
    -

    - Code Jam {{ jam.number }}: {{ jam.title }} -

    - -

    - Please fill out the form below to apply for this code jam. Once you've submitted your application and the - application window has closed, we'll review it and let you know whether you've been entered! -

    -

    - Please note that you will not be able to edit your application after you've submitted it. -

    -
    - - {{ form.preamble_html | safe }} - -
    - - {% if jam.state != "announced" %} -

    - Unfortunately, we're not accepting applications for this code jam right now - but we appreciate your - interest. Keep an eye on #announcements on Discord for information on the next jam! -

    - {% else %} -
    - {% for question in questions %} - {{ show_question(question) }} -
    - {% endfor %} -
    - - - -
    - -  Back - - -
    -
    - - {% endif %} -
    -
    - - -{% endblock %} diff --git a/templates/main/jams/profile.html b/templates/main/jams/profile.html deleted file mode 100644 index 40d22490..00000000 --- a/templates/main/jams/profile.html +++ /dev/null @@ -1,103 +0,0 @@ -{% extends "main/base.html" %} -{% block title %}Code Jams | My Profile{% endblock %} -{% block og_title %}Code Jams | My Profile{% endblock %} - -{% block content %} -
    -
    -

    - Code Jams: My Profile -

    - - {% if done %} -

    - Thanks - your data has been saved! -

    - {% else %} -

    - Please make sure you've filled this out correctly, as we do use this data when evaluating your code jam - application. -
    -
    - You may come back here and edit your data at any time. -

    - {% endif %} - - {% if form %} -
    - {% else %} - - {% endif %} - -
    -
    - -
    -
    - -
    -
    -
    -
    - -
    -
    - -
    -
    - -
    - -
    - -  Back - - - - {% if existing %} - -  Delete - - {% else %} - -  Delete - - {% endif %} -
    -
    -
    -
    - - - - -{% endblock %} diff --git a/templates/main/jams/retract.html b/templates/main/jams/retract.html deleted file mode 100644 index e013337b..00000000 --- a/templates/main/jams/retract.html +++ /dev/null @@ -1,61 +0,0 @@ -{% extends "main/base.html" %} -{% block title %}Code Jams | Already applied{% endblock %} -{% block og_title %}Code Jams | Already applied{% endblock %} - -{% block content %} -
    -
    -

    - Code Jams: Retract Profile -

    - - {% if participant %} -

    - Are you sure you'd like to retract your code jam profile? -

    - - {% if banned %} -

    - Retracting your code jam profile will remove your date of birth, GitLab username and timezone from our - database. If you're entirely sure that you'd like to remove your profile, please click on the "Remove" button below. -

    - -

    - As you are currently taking part in a code jam, - this will void your application and you will receive an automatic ban from future code jams - until you've contacted us about it. -

    - {% else %} -

    - Retracting your code jam profile will remove your date of birth, GitLab username and timezone from our - database. If you're entirely sure that you'd like to remove your profile, please click on the "Remove" button below. -

    - -

    - As you are not currently taking part in an ongoing code jam, - you will not be banned from future code jams. -

    - {% endif %} - -
    - - - -  Cancel - - -
    - {% else %} -

    - You can't delete your profile - you haven't submitted one to us yet! -

    - - -  Back - - {% endif %} -
    -
    -{% endblock %} diff --git a/templates/main/jams/retracted.html b/templates/main/jams/retracted.html deleted file mode 100644 index b67b6497..00000000 --- a/templates/main/jams/retracted.html +++ /dev/null @@ -1,31 +0,0 @@ -{% extends "main/base.html" %} -{% block title %}Code Jams | Already applied{% endblock %} -{% block og_title %}Code Jams | Already applied{% endblock %} - -{% block content %} -
    -
    -

    - Code Jams: Profile Retracted -

    - - {% if banned %} -

    - Your code jam profile has been deleted. As you were participating in an ongoing code jam, you have - been issued with an automatic ban from future code jams. If you'd like to join a code jam in the - future, please contact us directly and we'll try to resolve the situation with you. Thanks for your - interest in our code jams regardless! -

    - {% else %} -

    - Your code jam profile has been deleted. you were not participating in an ongoing code jam, no further - action is required by you. Thanks for your interest in our code jams regardless! -

    - {% endif %} - - -  Back to code jams - -
    -
    -{% endblock %} diff --git a/templates/main/jams/team_list.html b/templates/main/jams/team_list.html deleted file mode 100644 index 75c48337..00000000 --- a/templates/main/jams/team_list.html +++ /dev/null @@ -1,106 +0,0 @@ -{% extends "main/base.html" %} - -{% block title %} - {% if user_teams %} - Code Jams | My Teams - {% else %} - Code Jams | Code Jam {{ jam.number }} Teams - {% endif %} -{% endblock %} -{% block og_title %} - {% if user_teams %} - Code Jams | My Teams - {% else %} - Code Jams | Code Jam {{ jam.number }} Teams - {% endif %} -{% endblock %} - -{% block page_classes %}jam-team-list{% endblock %} - -{% block content %} -
    -
    -

    - {% if user_teams %} - Code Jams: My Teams - {% else %} - Code Jam {{ jam.number }}: Teams - {% endif %} -

    - {% if not user_teams %} -

    - -  All Jams - -

    - {% endif %} - {% if teams %} -
    - {% for team in teams %} -
    -
    -
    - {% if not user_teams %} - {% if logged_in and user.user_id in member_ids(team.members) %} - - {% endif %} - {% if jam.winning_team and jam.winning_team == team.id %} - - {% endif %} - {% endif %} - Team {{ team.name }} - {% if user_teams %} - - {% endif %} -
    -
    - {% for member in team.members %} - - - - {% endfor %} -
    - -
    -
    - {% endfor %} -
    - {% else %} - {% if user_teams %} -

    You are not part of any team.

    - {% else %} -

    There are no teams in this jam.

    - {% endif %} - {% endif %} -
    -
    -{% endblock %} diff --git a/templates/main/jams/team_view.html b/templates/main/jams/team_view.html deleted file mode 100644 index 0554c3d4..00000000 --- a/templates/main/jams/team_view.html +++ /dev/null @@ -1,291 +0,0 @@ -{% extends "main/base.html" %} -{% block title %}Team {{ team.name }}{% endblock %} -{% block og_title %}Team {{ team.name }}{% endblock %} - -{% block page_classes %}jam-team-view{% endblock %} - -{% block content %} -
    -
    -

    - Team {{ team.name }} -

    - -

    - -  Competing Teams - - {% if logged_in %} - -  My Teams - - {% endif %} -

    - -
    -
    -

    - Team Members -

    -
    - {% for member in team.members %} -
    - - - - {{ member.username }}#{{ member.discriminator }} - -
    - {% endfor %} -
    -
    -
    -

    - Activity -

    -

    - {% if team.repo %} - -  View on GitLab - - {% else %} - -  View on GitLab - - {% endif %} - {% if is_own_team %} - - - - {% endif %} -

    -
    -
    -
    -

    - Loading GitLab activity, hang tight... -

    -
    -
    -
    -
    -
    -
    -
    -
    - {% if is_own_team %} -
    -
    - - -
    -

    Edit Repository

    -
    -
    - -
    -

    - Enter your team's GitLab repository URL in the field below. -

    -

    - Note: it should be a fork of the jam's GitLab repository - ({{ team.jam.repo }}). -

    -
    -
    -
    - -
    - -
    - -
    -
    -
    -
    - - -
    -
    -
    - {% endif %} - -{% endblock %} diff --git a/templates/main/jams/thanks.html b/templates/main/jams/thanks.html deleted file mode 100644 index f123b227..00000000 --- a/templates/main/jams/thanks.html +++ /dev/null @@ -1,25 +0,0 @@ -{% extends "main/base.html" %} -{% block title %}Code Jams | Thanks!{% endblock %} -{% block og_title %}Code Jams | Thanks!{% endblock %} - -{% block content %} -
    -
    -

    - Code Jam {{ jam.number }}: {{ jam.title }} -

    - - -

    - Thanks for your application! Just sit back, relax, and we'll let you know whether you've been selected - for this code jam when the time comes. -

    - - -  Back to all code jams - -
    -
    -{% endblock %} diff --git a/templates/main/navigation.html b/templates/main/navigation.html deleted file mode 100644 index a32ac1c1..00000000 --- a/templates/main/navigation.html +++ /dev/null @@ -1,165 +0,0 @@ - -
    - -
    diff --git a/templates/main/ws_test.html b/templates/main/ws_test.html deleted file mode 100644 index 64a7dfc4..00000000 --- a/templates/main/ws_test.html +++ /dev/null @@ -1,26 +0,0 @@ -{% extends "main/base.html" %} -{% block title %}WS Test{% endblock %} -{% block og_title %}WS Test{% endblock %} -{% block og_description %}A test page for our Websockets implementation{% endblock %} -{% block content %} -
    -

    Open your JS console to test

    - - -
    -{% endblock %} diff --git a/templates/main/ws_test_rst.html b/templates/main/ws_test_rst.html deleted file mode 100644 index a0bae79b..00000000 --- a/templates/main/ws_test_rst.html +++ /dev/null @@ -1,39 +0,0 @@ -{% extends "main/base.html" %} -{% block title %}WS Test{% endblock %} -{% block og_title %}WS Test{% endblock %} -{% block og_description %}A test page for our Websockets implementation{% endblock %} -{% block content %} -
    -

    Enter some text to test.

    - - - - -
    - -
    - - -
    -{% endblock %} diff --git a/templates/robots.txt b/templates/robots.txt deleted file mode 100644 index fa61be5e..00000000 --- a/templates/robots.txt +++ /dev/null @@ -1,14 +0,0 @@ -{# robots.txt is a little picky about whitespace and newlines - that's why the below looks kind of bad.#} -{% if rules is defined and rules %} -{% for user_agent, disallowed in rules.items() %} -User-agent: {{ user_agent }} -{% for rule in rules %} -Disallow: {{ rule }} -{% endfor %} -{% endfor %} -{% else %} -User-agent: * -Disallow: -{% endif %} - -Sitemap: {{ sitemap_url }} diff --git a/templates/sitemap.xml b/templates/sitemap.xml deleted file mode 100644 index 3d63d3a9..00000000 --- a/templates/sitemap.xml +++ /dev/null @@ -1,64 +0,0 @@ - - - -{% for url in urls %} - - {{ url.url }} - - {% if url.images is defined %} - {% for image in url.images %} - - {{ image.url }} - {{ image.caption }} - - {% endfor %} - {% endif %} - - {% if url.videos is defined %} - {% for video in url.videos %} - - {{ video.description }} - {{ video.title }} - - {{ video.url }} - {{ video.player_url }} - {{ video.thumbnail_url }} - - {% endfor %} - {% endif %} - - {% if url.news_items is defined %} - {% for item in url.news_items %} - - - Python Discord: {{ item.section }} - en - - - PressRelease, Blog - {{ item.date }} - {{ item.title }} - {{ ", ".join(item.keywords) }} - - {% endfor %} - {% endif %} - - {% if url.last_modified is defined %} - {{ url.last_modified }} - {% endif %} - - {% if url.change_frequency is defined %} - {{ url.change_frequency }} - {% endif %} - - {% if url.priority is defined %} - {{ "{0:.1f}".format(url.priority) }} - {% endif %} - -{% endfor %} - diff --git a/templates/staff/index.html b/templates/staff/index.html deleted file mode 100644 index 31fddceb..00000000 --- a/templates/staff/index.html +++ /dev/null @@ -1,23 +0,0 @@ -{% extends "main/base.html" %} -{% block title %}Staff | Home{% endblock %} -{% block og_title %}Staff | Home{% endblock %} -{% block og_description %}Landing page for the staff management area{% endblock %} -{% block content %} -
    -

    - Management links -

    - - Code Jams - {% if manager %} - Table Management - {% endif %} - -

    - App config -

    -
    -    {{ app_config | safe }}
    -        
    -
    -{% endblock %} \ No newline at end of file diff --git a/templates/staff/jams/create.html b/templates/staff/jams/create.html deleted file mode 100644 index c19addd3..00000000 --- a/templates/staff/jams/create.html +++ /dev/null @@ -1,78 +0,0 @@ -{% extends "main/base.html" %} -{% block title %}Staff | Jams | Create{% endblock %} -{% block og_title %}Staff | Jams | Create{% endblock %} -{% block og_description %}Create a brand new code jam{% endblock %} -{% block content %} -
    -

    Code Jam: Create

    - -
    -
    -
    - -
    - -
    - -
    -
    -
    -
    - -
    - -
    - -
    -
    -
    -
    - -
    - -
    - -
    -
    -
    -
    - -
    - -
    - -
    -
    -
    -
    - -
    - -
    - -
    -
    - - - -
    - -  Back - - -
    -
    - -
    - - -{% endblock %} diff --git a/templates/staff/jams/edit_basics.html b/templates/staff/jams/edit_basics.html deleted file mode 100644 index 1208e5d2..00000000 --- a/templates/staff/jams/edit_basics.html +++ /dev/null @@ -1,79 +0,0 @@ -{% extends "main/base.html" %} -{% block title %}Staff | Jams | Edit (Basics){% endblock %} -{% block og_title %}Staff | Jams | Edit (Basics){% endblock %} -{% block og_description %}Edit the basic info for a code jam{% endblock %} -{% block page_classes %}uses-rst{% endblock %} - -{% block content %} -
    -

    Code Jam: Edit (Basics)

    - -
    -
    -
    - -
    - -
    - -
    -
    -
    -
    - -
    - -
    - -
    -
    -
    -
    - -
    - -
    - -
    -
    -
    -
    - -
    - -
    - -
    -
    -
    -
    - -
    - -
    - -
    -
    - - - -
    - -  Back - - -
    -
    -
    - - -{% endblock %} diff --git a/templates/staff/jams/edit_ending.html b/templates/staff/jams/edit_ending.html deleted file mode 100644 index a0c5e8ff..00000000 --- a/templates/staff/jams/edit_ending.html +++ /dev/null @@ -1,152 +0,0 @@ -{% extends "main/base.html" %} -{% block title %}Staff | Jams | Edit (Ending Comments){% endblock %} -{% block og_title %}Staff | Jams | Edit (Ending Comments){% endblock %} -{% block og_description %}Edit the ending comments for a code jam{% endblock %} - -{% block page_classes %}uses-rst{% endblock %} - -{% block content %} -
    -

    Code Jam: Edit (Ending Comments)

    - -
    -
    -
    - -
    - -
    -
    {{ jam.end_rst }}
    -
    - - -
    - - - -
    - -  Back - - - -
    -
    -
    - -
    -
    - - -
    -

    Code Jam {{ jam.number }}: {{ jam.title }}

    -

    Theme: {{ jam.theme }}

    - -
    - {{ jam.end_rst | safe }} -
    -
    - - -
    -
    - - -{% endblock %} diff --git a/templates/staff/jams/edit_info.html b/templates/staff/jams/edit_info.html deleted file mode 100644 index 75df1957..00000000 --- a/templates/staff/jams/edit_info.html +++ /dev/null @@ -1,309 +0,0 @@ -{% extends "main/base.html" %} -{% block title %}Staff | Jams | Edit (Info){% endblock %} -{% block og_title %}Staff | Jams | Edit (Info){% endblock %} -{% block og_description %}Edit the basic info for a code jam{% endblock %} - -{% block page_classes %}uses-rst{% endblock %} - -{% block content %} -
    -

    Code Jam: Edit (Info)

    - -
    -
    -
    - -
    - -
    - -
    -
    -
    -
    - -
    - -
    - -
    -
    - -
    -
    - -
    - -
    -
    {{ jam.info_rst }}
    -
    - - -
    - -
    -
    - -
    - -
    -
    {{ jam.task_rst }}
    -
    - - -
    - - - -
    - -  Back - - -
    -
    -
    - -
    -
    - - -
    -

    Code Jam {{ jam.number }}: {{ jam.title }}

    -

    Theme: {{ jam.theme }}

    - -
    - {{ jam.task_html | safe }} -
    -
    - - -
    -
    - -
    -
    - - -
    -

    Code Jam {{ jam.number }}: {{ jam.title }}

    -

    Theme: {{ jam.theme }}

    - -
    - {{ jam.task_html | safe }} -
    -
    - - -
    -
    - - -{% endblock %} diff --git a/templates/staff/jams/forms/preamble_edit.html b/templates/staff/jams/forms/preamble_edit.html deleted file mode 100644 index 85747713..00000000 --- a/templates/staff/jams/forms/preamble_edit.html +++ /dev/null @@ -1,150 +0,0 @@ -{% extends "main/base.html" %} -{% block title %}Staff | Forms | Edit Preamble{% endblock %} -{% block og_title %}Staff | Forms | Edit Preamble{% endblock %} - -{% block page_classes %}uses-rst{% endblock %} - -{% block content %} -
    -

    Form: Edit Preamble

    - -
    -
    -
    - -
    - -
    -
    {{ form.preamble_rst }}
    -
    - - -
    - - - -
    - -  Back - - - -
    -
    -
    - -
    -
    - - -
    -

    Form: {{ jam.number }}

    - -
    - {{ jam.preamble_html | safe }} -
    -
    - - -
    -
    - - -{% endblock %} diff --git a/templates/staff/jams/forms/questions_edit.html b/templates/staff/jams/forms/questions_edit.html deleted file mode 100644 index d6fe082c..00000000 --- a/templates/staff/jams/forms/questions_edit.html +++ /dev/null @@ -1,354 +0,0 @@ -{% extends "main/base.html" %} -{% block title %}Staff | Jams | Question Edit{% endblock %} -{% block og_title %}Staff | Jams | Question Edit{% endblock %} -{% block og_description %}Edit a question{% endblock %} -{% block content %} -
    -

    Question Edit

    - -
    -
    -
    - -
    -
    - -
    -
    -
    -
    - -
    -
    - -
    -
    -
    -
    - -
    -
    - -
    -
    - - {% if question.type == "radio" %} -
    - {% else %} - - - {% if question.type in ["number", "range", "slider"] %} -
    - {% else %} - - -
    - -
    - - - -  Cancel - - -
    - -
    - - -{% endblock %} diff --git a/templates/staff/jams/forms/questions_view.html b/templates/staff/jams/forms/questions_view.html deleted file mode 100644 index f8eeea40..00000000 --- a/templates/staff/jams/forms/questions_view.html +++ /dev/null @@ -1,593 +0,0 @@ -{% extends "main/base.html" %} -{% block title %}Staff | Jams | Questions{% endblock %} -{% block og_title %}Staff | Jams | Questions{% endblock %} -{% block og_description %}Manage all created questions{% endblock %} -{% block content %} -
    -

    Questions List

    - -  Back - - {#  Preview #} - - {% if not questions %} -

    No questions found. Add one above!

    - - - - - - - - - - - - - - - {% else %} - - -
    -
    - - - - - - - - - - - - - {% for question in questions %} - - - - - - - - - {% endfor %} - -
     IDOptionalTitleTypeData
    - - - {{ question.id }} - {% if question.optional %} - - {% else %} - - {% endif %} - {{ question.title }}{{ question.type.title() }} - {% if question.type == "text" %} - - {% elif question.type == "number" %} -  {{ question.data.max }} -
    -  {{ question.data.min }} - {% elif question.type == "checkbox" %} - - {% elif question.type == "email" %} - - {% elif question.type == "textarea" %} - - {% elif question.type == "radio" %} -
      - {% for option in question.data.options %} -
    • {{ option }}
    • - {% endfor %} -
    - {% elif question.type == "range" %} -  {{ question.data.max }} -
    -  {{ question.data.min }} - {% elif question.type == "slider" %} -  {{ question.data.max }} -
    -  {{ question.data.min }} - {% else %} - {{ question.data }} - {% endif %} -
    -
    - {% endif %} -
    - -
    -
    - - -
    -

    Add Question

    -
    - -
    -
    - -
    -
    -
    - -
    -
    - -
    -
    -
    -
    - -
    -
    - -
    -
    -
    -
    - -
    -
    - -
    -
    -
    - - - - -
    -
    - - -
    -
    - - -{% endblock %} diff --git a/templates/staff/jams/forms/view.html b/templates/staff/jams/forms/view.html deleted file mode 100644 index 49ea672d..00000000 --- a/templates/staff/jams/forms/view.html +++ /dev/null @@ -1,755 +0,0 @@ -{% extends "main/base.html" %} -{% block title %}Staff | Jams | Form{% endblock %} -{% block og_title %}Staff | Jams | Form{% endblock %} -{% block og_description %}Manage the form for a code jam{% endblock %} -{% block content %} -
    -

    Application Form {{ jam.number }}: {{ jam.title }}

    - -  Back -  Edit Preamble - - {#  Preview #} - - {% if not questions %} -

    No questions found. Add one above!

    - - - - - - - - - - - - - - - {% else %} - - -
    -
    - - - - - - - - - - - - - {% for question in questions %} - - - - - - - - - {% endfor %} - -
     IDOptionalTitleTypeData
    - - {{ question.id }} - {% if question.optional %} - - {% else %} - - {% endif %} - {{ question.title }}{{ question.type.title() }} - {% if question.type == "text" %} - - {% elif question.type == "number" %} -  {{ question.data.max }} -
    -  {{ question.data.min }} - {% elif question.type == "checkbox" %} - - {% elif question.type == "email" %} - - {% elif question.type == "textarea" %} - - {% elif question.type == "radio" %} -
      - {% for option in question.data.options %} -
    • {{ option }}
    • - {% endfor %} -
    - {% elif question.type == "range" %} -  {{ question.data.max }} -
    -  {{ question.data.min }} - {% elif question.type == "slider" %} -  {{ question.data.max }} -
    -  {{ question.data.min }} - {% else %} - {{ question.data }} - {% endif %} -
    -
    - {% endif %} -
    - -
    -
    - - -
    -

    Add Question

    -
    - -
    -
    -
    -
    -
    - -
    -
    - -
    -
    -
    - - - - - - - - -
    -
    - - -
    -
    - - -{% endblock %} diff --git a/templates/staff/jams/index.html b/templates/staff/jams/index.html deleted file mode 100644 index e4e1e242..00000000 --- a/templates/staff/jams/index.html +++ /dev/null @@ -1,252 +0,0 @@ -{% extends "main/base.html" %} -{% block title %}Staff | Code Jams{% endblock %} -{% block og_title %}Staff | Code Jams{% endblock %} -{% block content %} -
    -

    Code Jams

    - -  Back -  Questions -  Infractions -  Create - - {% if not jams %} -

    - No code jams found. Create one above! -

    - {% else %} - {% for jam in jams %} -

    - Code Jam {{ jam.number }}: {{ jam.title }} - - - {% if jam.state == "planning" %} - - {% else %} - - {% endif %} - - {% if jam.state == "announced" %} - - {% else %} - - {% endif %} - - {% if jam.state == "preparing" %} - - {% else %} - - {% endif %} - - {% if jam.state == "running" %} - - {% else %} - - {% endif %} - - {% if jam.state == "judging" %} - - {% else %} - - {% endif %} - - {% if jam.state == "finished" %} - - {% else %} - - {% endif %} - - {% if not jam.state in states %} - - {% else %} - - {% endif %} - -

    - - Participants: {{ jam.participants | length }} - Start: {{ format_datetime(jam.date_start) }} (UTC) - End: {{ format_datetime(jam.date_end) }} (UTC) - -
    -
    - -  State - - - -  Basics - - - {% if jam.state in ["planning", "announced", "preparing", "finished"] %} - -  Info - - {% else %} - - {% endif %} - - {% if jam.state in ["judging", "finished"] %} - -  Ending - - {% else %} - - {% endif %} -
    -
    - -
    - {% endfor %} - {% endif %} -
    - -
    -
    - - -
    -

    Set State

    -
    - -
    -
    -
    -
    - -
    - -
    - -
    -
    -
    -
    - - -
    -
    - - -{% endblock %} \ No newline at end of file diff --git a/templates/staff/jams/infractions/view.html b/templates/staff/jams/infractions/view.html deleted file mode 100644 index a4391c53..00000000 --- a/templates/staff/jams/infractions/view.html +++ /dev/null @@ -1,328 +0,0 @@ -{% extends "main/base.html" %} -{% block title %}Staff | Jams | Infractions{% endblock %} -{% block og_title %}Staff | Jams | Infractions{% endblock %} -{% block og_description %}Manage infractions{% endblock %} -{% block content %} -
    -

    Infractions

    - -  Back - - - {% if not infractions %} -

    No infractions found.

    - - - - - - - - - - - - - - {% else %} - - -
    -
    - - - - - - - - - - - - {% for infraction in infractions %} - - - - - - - - {% endfor %} - -
     IDParticipantReasonNumber
    - - {{ infraction.id }} - {% if infraction.participant is not string %} - {{ infraction.participant.user_id }} -
    - ({{ infraction.participant.username }}#{{ infraction.participant.discriminator }}) - {% else %} - {{ infraction.participant }} - {% endif %} -
    {{ infraction.reason }}{{ infraction.number }}
    -
    - {% endif %} -
    - -
    -
    - - -
    -

    Add Infraction

    -
    - -
    -
    -
    -
    - -
    -
    - -
    -
    -
    -
    - -
    -
    - -
    -
    -
    -
    - -
    -
    - -
    -
    - -
    -
    - - -
    -
    - - -{% endblock %} diff --git a/templates/staff/jams/participants.html b/templates/staff/jams/participants.html deleted file mode 100644 index 726d407c..00000000 --- a/templates/staff/jams/participants.html +++ /dev/null @@ -1,163 +0,0 @@ -{% extends "main/base.html" %} -{% block title %}Staff | Jams | Participants{% endblock %} -{% block og_title %}Staff | Jams | Participants{% endblock %} -{% block og_description %}Listing of participant applications and their status{% endblock %} -{% block content %} - {% macro card_header(app) %} -
    -

    - - - - {{ app.username }}#{{ app.discriminator }} -

    - - {% if jam.state in ["announced", "preparing"] %} - {% if app.approved %} - - - {% else %} - - - {% endif %} - {% endif %} - - - - - - -
    - {% endmacro %} - -
    -

    Code Jam {{ jam.number }}: Participants

    -  Back - -
    -
    - - {% for app in jam.participants %} - -
    - {% endfor %} -
    - - -{% endblock %} diff --git a/templates/staff/jams/teams/view.html b/templates/staff/jams/teams/view.html deleted file mode 100644 index 659a60c2..00000000 --- a/templates/staff/jams/teams/view.html +++ /dev/null @@ -1,513 +0,0 @@ -{% extends "main/base.html" %} -{% block title %}Staff | Jams | Teams{% endblock %} -{% block og_title %}Staff | Jams | Teams{% endblock %} -{% block og_description %}Manage Teams{% endblock %} -{% block page_classes %}page-staff-jams-edit-teams{% endblock %} -{% block content %} -
    -
    -

    Hover a user to show their information here

    - -
    - -
    - -
    -
    -

    Code Jam {{ jam.number }}: Teams

    - -  Back - - {% if teams %} - - {% else %} - - {% endif %} - - - - {% if jam.winning_team %} - - {% else %} - - {% endif %} - -
    -
    - -
    - {% for participant in jam.participants %} - {% if participant.user_id not in assigned %} -
    -
    -
    - - {{ participant.username }}#{{ participant.discriminator }} -
    -
    -
    - {% else %} -
    -
    -
    - - {{ participant.username }}#{{ participant.discriminator }} -
    -
    -
    - {% endif %} - {% endfor %} -
    - - {% if not teams %} -

    No teams found.

    - -
    -
    - {% else %} - - -
    - {% for id, team in teams.items() %} -
    -
    -
    -

    - {{ team.name }} -

    -
    -
    -

    Drop users here to assign them

    - - {% for user_id in team.members %} -
    - - - {{ participants[user_id].username }}#{{ participants[user_id].discriminator }} ({{ participants[user_id].profile.timezone }}) - -
    - {% endfor %} -
    - -
    -
    - {% endfor %} -
    - {% endif %} -
    -
    - - -{% endblock %} diff --git a/templates/staff/tables/edit.html b/templates/staff/tables/edit.html deleted file mode 100644 index b3b9faae..00000000 --- a/templates/staff/tables/edit.html +++ /dev/null @@ -1,50 +0,0 @@ -{% extends "main/base.html" %} -{% block title %}Staff | Home{% endblock %} -{% block og_title %}Staff | Home{% endblock %} -{% block og_description %}Landing page for the staff management area{% endblock %} -{% block content %} -
    - {% if message %} -
    - {{ message }} -
    - {% endif %} -
    -
    -

    Primary key: "{{ primary_key }}"

    -
    -
    -   Back - -
    -
    -
    {{ document }}
    - -
    - - - - {% if old_primary %} - - {% endif %} -
    - - -
    -{% endblock %} diff --git a/templates/staff/tables/index.html b/templates/staff/tables/index.html deleted file mode 100644 index 206234bb..00000000 --- a/templates/staff/tables/index.html +++ /dev/null @@ -1,32 +0,0 @@ -{% extends "main/base.html" %} -{% block title %}Staff | Tables{% endblock %} -{% block og_title %}Staff | Tables{% endblock %} -{% block og_description %}Table management and editor{% endblock %} -{% block content %} -
    -  Back -

    - Table manager -

    -

    - Click one of the tables below to manage its data: -

    - -
    -{% endblock %} \ No newline at end of file diff --git a/templates/staff/tables/table.html b/templates/staff/tables/table.html deleted file mode 100644 index 87d981a0..00000000 --- a/templates/staff/tables/table.html +++ /dev/null @@ -1,165 +0,0 @@ -{% extends "main/base.html" %} -{% block title %}Staff | Home{% endblock %} -{% block og_title %}Staff | Home{% endblock %} -{% block og_description %}Landing page for the staff management area{% endblock %} -{% block content %} -
    -  Back - - {% if page == "all" %} -  Page 1 - {% else %} -  All Data - {% endif %} - - {% if not table_obj.locked %} -  Add - {% endif %} - -

    - - {{ table }} - - {% if table_obj.locked %} - - {% endif %} - -

    - -
    -
    - {% if search %} - - {% else %} - - {% endif %} - -
    - -
    - - - -
    -
    - - {% macro paginate() %} - {% if pages != "all" %} -
      - {% if page > 1 %} -
    • - {% else %} -
    • - {% endif %} - - {% if page == 1 %} -
    • 1
    • - {% else %} -
    • 1
    • - {% endif %} - - {% if page >= 5 %} -
    • ...
    • - {% endif %} - - {% set current_page = page - 2 %} - - {% for num in range(5) %} - {% if current_page + num > 1 and current_page + num < pages %} - {% if current_page + num == page %} -
    • {{ current_page + num }}
    • - {% else %} -
    • {{ current_page + num }}
    • - {% endif %} - {% endif %} - {% set current_page = current_page - 1 %} - {% endfor %} - - {% if pages - page > 3 %} -
    • ...
    • - {% endif %} - - {% if pages != 1 %} - {% if page == pages %} -
    • {{ pages }}
    • - {% else %} -
    • {{ pages }}
    • - {% endif %} - {% endif %} - - {% if page < pages %} -
    • - {% else %} -
    • - {% endif %} -
    - {% endif %} - {% endmacro %} - - {{ paginate() }} - -
    -
    - {% if documents %} - - - - {% if not table_obj.locked %} - - {% endif %} - - {% for key in table_obj.keys %} - - {% endfor %} - - - - {% for doc in documents %} - - {% if not table_obj.locked %} - - {% endif %} - - {% for key in table_obj.keys %} - - {% endfor %} - - {% endfor %} - -
    - - - {% if key == table_obj.primary_key %} - {{ key }} - {% else %} - {{ key }} - {% endif %} -
    - - - - - {% if key == table_obj.primary_key %} - {{ doc[key] }} - {% else %} - {{ doc[key] }} - {% endif %} -
    - {% else %} -

    No documents found

    - {% endif %} - - {{ paginate() }} -
    -{% endblock %} \ No newline at end of file diff --git a/templates/wiki/base.html b/templates/wiki/base.html deleted file mode 100644 index 038ee5a2..00000000 --- a/templates/wiki/base.html +++ /dev/null @@ -1,216 +0,0 @@ - - - - {% block head %} - Python Discord | {% block title %}{% endblock %} - - - - - - - - - - - - - - - - - {% endblock %} - {% block extra_head %} - - {% endblock %} - - -
    - {% include "main/navigation.html" %} -
    -
    - -
    -
    - -
    -
    -
    - {% block content %}{% endblock %} -
    -
    -
    -
    - -
    -
    -
    -

    - This website uses Python and - Flask, and was developed collaboratively on - GitLab. -
    - For privacy & GDPR-related info, please see this page. -

    -
    -
    -
    - - - - diff --git a/templates/wiki/compare_revision.html b/templates/wiki/compare_revision.html deleted file mode 100644 index 34ab61bc..00000000 --- a/templates/wiki/compare_revision.html +++ /dev/null @@ -1,13 +0,0 @@ -{% extends "wiki/base.html" %} -{% block title %}Wiki | Comparing {{ title }}{% endblock %} -{% block og_title %}Wiki | Comparing {{ title }}{% endblock %} -{% block og_description %}{% endblock %} -{% block content %} -
    -

    - Revision comparison for {{ title }} -

    - - {{ diff | safe }} -
    -{% endblock %} diff --git a/templates/wiki/page_delete.html b/templates/wiki/page_delete.html deleted file mode 100644 index 27c4b406..00000000 --- a/templates/wiki/page_delete.html +++ /dev/null @@ -1,25 +0,0 @@ -{% extends "wiki/base.html" %} -{% block title %}Wiki | Delete: {{ page }}{% endblock %} -{% block og_title %}Wiki | Delete: {{ page }}{% endblock %} -{% block og_description %}{% endblock %} -{% block content %} -
    -
    -

    Delete Page: {{ page }}

    -

    - Are you sure you want to delete this page? -

    - -
    -
    - Cancel -
    -
    - -
    - - -
    -
    -
    -{% endblock %} diff --git a/templates/wiki/page_edit.html b/templates/wiki/page_edit.html deleted file mode 100644 index 7293b5f5..00000000 --- a/templates/wiki/page_edit.html +++ /dev/null @@ -1,137 +0,0 @@ -{% extends "wiki/base.html" %} -{% block title %}Wiki | Edit: {{ page }}{% endblock %} -{% block og_title %}Wiki | Edit: {{ page }}{% endblock %} -{% block og_description %}{% endblock %} - -{% block page_classes %}uses-rst{% endblock %} - -{% block content %} -
    -
    - -
    -
    - -
    -
    - -
    -
    -
    {{ rst }}
    - -
    - - -
    - -
    -

    {{ title }}

    - -
    - {{ preview | safe }} -
    -
    - - -{% endblock %} diff --git a/templates/wiki/page_in_use.html b/templates/wiki/page_in_use.html deleted file mode 100644 index 1707845c..00000000 --- a/templates/wiki/page_in_use.html +++ /dev/null @@ -1,12 +0,0 @@ -{% extends "wiki/base.html" %} -{% block title %}Wiki Error{% endblock %} -{% block og_title %}Wiki Error{% endblock %} -{% block og_description %}{% endblock %} -{% block content %} -
    -
    -

    The page you requested is currently being edited

    -

    Please try again in a little bit when the lock has expired.

    -
    -
    -{% endblock %} diff --git a/templates/wiki/page_move.html b/templates/wiki/page_move.html deleted file mode 100644 index 2bd772e9..00000000 --- a/templates/wiki/page_move.html +++ /dev/null @@ -1,26 +0,0 @@ -{% extends "wiki/base.html" %} -{% block title %}Wiki | Move: {{ page }}{% endblock %} -{% block og_title %}Wiki | Move: {{ page }}{% endblock %} -{% block og_description %}{% endblock %} -{% block content %} -
    - {% if message is defined %} -
    -

    {{ message }}

    -
    - {% endif %} - -

    Move Page: {{ page }}

    -
    - -
    - Cancel -
    -
    - -
    - - -
    -
    -{% endblock %} diff --git a/templates/wiki/page_source.html b/templates/wiki/page_source.html deleted file mode 100644 index 15384aa9..00000000 --- a/templates/wiki/page_source.html +++ /dev/null @@ -1,13 +0,0 @@ -{% extends "wiki/base.html" %} -{% block title %}Wiki | {{ data["title"] }}{% endblock %} -{% block og_title %}Wiki | {{ data["title"] }}{% endblock %} -{% block og_description %}{% endblock %} -{% block content %} -
    -

    - {{ data["title"] }} -

    - - {{ rst | safe }} -
    -{% endblock %} \ No newline at end of file diff --git a/templates/wiki/page_view.html b/templates/wiki/page_view.html deleted file mode 100644 index aa560390..00000000 --- a/templates/wiki/page_view.html +++ /dev/null @@ -1,18 +0,0 @@ -{% extends "wiki/base.html" %} -{% block title %}Wiki | {{ data["title"] }}{% endblock %} -{% block og_title %}Wiki | {{ data["title"] }}{% endblock %} - -{# To be safe about whitespace formatting on various platforms, we do everything one one line here #} -{% block og_description %}{% if data.rst.startswith(".. header::") %}{{ data.text.split("\n", 1)[0] }}{% endif %}{% endblock %} - -{% block page_classes %}uses-rst{% endblock %} - -{% block content %} -
    -

    - {{ data["title"] }} -

    - - {{ data["html"] | safe }} -
    -{% endblock %} \ No newline at end of file diff --git a/templates/wiki/revision_list.html b/templates/wiki/revision_list.html deleted file mode 100644 index cd6767db..00000000 --- a/templates/wiki/revision_list.html +++ /dev/null @@ -1,36 +0,0 @@ -{% extends "wiki/base.html" %} -{% block title %}Wiki | Revisions to {{ page }}{% endblock %} -{% block og_title %}Wiki | Revisions to {{ page }}{% endblock %} -{% block og_description %}{% endblock %} -{% block content %} -
    -

    Wiki page revisions

    - - - - - - - - - - - - {% for revision in revisions %} - - - - - - - - {% endfor %} - -
    Page titleDateUser IDCompare beforeCompare after
    {{ revision["post"]["title"] }}{{ revision["pretty_time"] }}{{ revision['user'] }}
    - Compare selections -
    - -{% endblock %} diff --git a/templates/wiki/search.html b/templates/wiki/search.html deleted file mode 100644 index 8a337192..00000000 --- a/templates/wiki/search.html +++ /dev/null @@ -1,23 +0,0 @@ -{% extends "wiki/base.html" %} -{% block title %}Wiki | Search{% endblock %} -{% block og_title %}Wiki | Search{% endblock %} -{% block og_description %}Search for pages by content{% endblock %} -{% block content %} -
    -

    - Search -

    - -
    - -
    -   -
    -
    - -
    - - -
    -
    -{% endblock %} \ No newline at end of file diff --git a/templates/wiki/search_results.html b/templates/wiki/search_results.html deleted file mode 100644 index 9b9ad946..00000000 --- a/templates/wiki/search_results.html +++ /dev/null @@ -1,39 +0,0 @@ -{% extends "wiki/base.html" %} -{% block title %}Wiki | Search Results{% endblock %} -{% block og_title %}Wiki | Search Results{% endblock %} -{% block og_description %}Search results{% endblock %} -{% block content %} -
    - {% if not pages %} -

    - Search -

    -
    -

    - Sorry, no results were found. Please check your query and try again. -

    -
    - {% else %} -

    - Search Results -

    - - {% for page in pages %} -

    - {{ page.title }} - ({{ page.slug }}) -

    - - {% for snippet in page["matches"] %} -
    - -
    - {{ snippet | safe }} -
    - -
    - {% endfor %} - {% endfor %} - {% endif %} -
    -{% endblock %} \ No newline at end of file diff --git a/templates/wiki/special.html b/templates/wiki/special.html deleted file mode 100644 index 12e9cb18..00000000 --- a/templates/wiki/special.html +++ /dev/null @@ -1,17 +0,0 @@ -{% extends "wiki/base.html" %} -{% block title %}Wiki | Special Pages{% endblock %} -{% block og_title %}Wiki | Special Pages{% endblock %} -{% block og_description %}Wiki special pages, non-article informational pages{% endblock %} -{% block content %} -
    -

    - Special Pages -

    - - -
    -{% endblock %} \ No newline at end of file diff --git a/templates/wiki/special_all.html b/templates/wiki/special_all.html deleted file mode 100644 index 45a641a6..00000000 --- a/templates/wiki/special_all.html +++ /dev/null @@ -1,26 +0,0 @@ -{% extends "wiki/base.html" %} -{% block title %}Wiki | Special: All Pages{% endblock %} -{% block og_title %}Wiki | Special: All Pages{% endblock %} -{% block og_description %}A listing for all pages on the wiki{% endblock %} -{% block content %} -
    -

    - Special: All Pages -

    -

    - A listing for all pages on the wiki -

    - - {% for letter, pages in letters.items() %} -

    {{ letter }}

    - - - {% endfor %} -
    -{% endblock %} \ No newline at end of file diff --git a/tests/__init__.py b/tests/__init__.py deleted file mode 100644 index 1f3ca1a4..00000000 --- a/tests/__init__.py +++ /dev/null @@ -1,42 +0,0 @@ -import os - -from flask import Blueprint -from flask_testing import TestCase - -os.environ["BOT_API_KEY"] = "abcdefg" # This is a constant, must be done first -os.environ["PAPERTRAIL_ADDRESS"] = 'localhost' # satisfies coverage -os.environ["DATADOG_ADDRESS"] = 'localhost' # satisfies coverage - -if "FLASK_DEBUG" in os.environ: - del os.environ["FLASK_DEBUG"] # Some unit tests fail if this is set - -from app import manager -from gunicorn_config import _when_ready as when_ready - -when_ready() - -manager.app.tests_blueprint = Blueprint("tests", __name__) -manager.load_views(manager.app.tests_blueprint, "pysite/views/tests") -manager.app.register_blueprint(manager.app.tests_blueprint) -app = manager.app - -app.config["WTF_CSRF_CHECK_DEFAULT"] = False - - -class SiteTest(TestCase): - """ Extend TestCase with flask app instantiation """ - - def create_app(self): - """ Add flask app configuration settings """ - server_name = 'pytest.local' - - app.config['TESTING'] = True - app.config['LIVESERVER_TIMEOUT'] = 10 - app.config['SERVER_NAME'] = server_name - app.config['API_SUBDOMAIN'] = f'http://api.{server_name}' - app.config['STAFF_SUBDOMAIN'] = f'http://staff.{server_name}' - app.config['WIKI_SUBDOMAIN'] = f'http://wiki.{server_name}' - app.config['TEST_HEADER'] = {'X-API-Key': 'abcdefg', 'Content-Type': 'application/json'} - app.allow_subdomain_redirects = True - - return app diff --git a/tests/test_api.py b/tests/test_api.py deleted file mode 100644 index b20dc0c5..00000000 --- a/tests/test_api.py +++ /dev/null @@ -1,25 +0,0 @@ -from tests import SiteTest, app - -class ApiEndpoints(SiteTest): - """ Test cases for the api subdomain """ - def test_api_unknown_route(self): - """ Check api unknown route """ - response = self.client.get('/', app.config['API_SUBDOMAIN']) - self.assertEqual(response.json, {'error_code': 0, 'error_message': 'Unknown API route'}) - self.assertEqual(response.status_code, 404) - - def test_api_healthcheck(self): - """ Check healthcheck url responds """ - response = self.client.get('/healthcheck', app.config['API_SUBDOMAIN']) - self.assertEqual(response.json, {'status': 'ok'}) - self.assertEqual(response.status_code, 200) - - def test_api_route_errors(self): - """ Check api route errors """ - from pysite.base_route import APIView - from pysite.constants import ErrorCodes - - av = APIView() - av.error(ErrorCodes.unauthorized) - av.error(ErrorCodes.bad_data_format) - diff --git a/tests/test_api_bot_bigbrother.py b/tests/test_api_bot_bigbrother.py deleted file mode 100644 index b1060e72..00000000 --- a/tests/test_api_bot_bigbrother.py +++ /dev/null @@ -1,152 +0,0 @@ -import json - -from tests import SiteTest, app - - -class EmptyDatabaseEndpointTests(SiteTest): - def test_api_docs_get_all(self): - response = self.client.get( - '/bot/bigbrother', - app.config['API_SUBDOMAIN'], - headers=app.config['TEST_HEADER'] - ) - self.assert200(response) - self.assertIsInstance(response.json, list) - - def test_fetching_single_entry_returns_404(self): - response = self.client.get( - '/bot/bigbrother?user_id=01932', - app.config['API_SUBDOMAIN'], - headers=app.config['TEST_HEADER'] - ) - self.assert404(response) - self.assertIsInstance(response.json['error_message'], str) - - -class AddingAnEntryEndpointTests(SiteTest): - GOOD_DATA = { - 'user_id': '42', - 'channel_id': '55' - } - GOOD_DATA_JSON = json.dumps(GOOD_DATA) - - def setUp(self): - response = self.client.post( - '/bot/bigbrother', - app.config['API_SUBDOMAIN'], - headers=app.config['TEST_HEADER'], - data=self.GOOD_DATA_JSON - ) - self.assertEqual(response.status_code, 204) - - def test_entry_is_in_all_entries(self): - response = self.client.get( - '/bot/bigbrother', - app.config['API_SUBDOMAIN'], - headers=app.config['TEST_HEADER'] - ) - self.assert200(response) - self.assertIn(self.GOOD_DATA, response.json) - - def test_can_fetch_entry_with_param_lookup(self): - response = self.client.get( - f'/bot/bigbrother?user_id={self.GOOD_DATA["user_id"]}', - app.config['API_SUBDOMAIN'], - headers=app.config['TEST_HEADER'] - ) - self.assert200(response) - self.assertEqual(response.json, self.GOOD_DATA) - - -class UpdatingAnEntryEndpointTests(SiteTest): - ORIGINAL_DATA = { - 'user_id': '300', - 'channel_id': '400' - } - ORIGINAL_DATA_JSON = json.dumps(ORIGINAL_DATA) - UPDATED_DATA = { - 'user_id': '300', - 'channel_id': '500' - } - UPDATED_DATA_JSON = json.dumps(UPDATED_DATA) - - def setUp(self): - response = self.client.post( - '/bot/bigbrother', - app.config['API_SUBDOMAIN'], - headers=app.config['TEST_HEADER'], - data=self.ORIGINAL_DATA_JSON - ) - self.assertEqual(response.status_code, 204) - - def test_can_update_data(self): - response = self.client.post( - '/bot/bigbrother', - app.config['API_SUBDOMAIN'], - headers=app.config['TEST_HEADER'], - data=self.UPDATED_DATA_JSON - ) - self.assertEqual(response.status_code, 204) - - -class DeletingAnEntryEndpointTests(SiteTest): - SAMPLE_DATA = { - 'user_id': '101', - 'channel_id': '202' - } - SAMPLE_DATA_JSON = json.dumps(SAMPLE_DATA) - - def setUp(self): - response = self.client.post( - '/bot/bigbrother', - app.config['API_SUBDOMAIN'], - headers=app.config['TEST_HEADER'], - data=self.SAMPLE_DATA_JSON - ) - self.assertEqual(response.status_code, 204) - - def test_delete_entry_returns_204(self): - response = self.client.delete( - f'/bot/bigbrother?user_id={self.SAMPLE_DATA["user_id"]}', - app.config['API_SUBDOMAIN'], - headers=app.config['TEST_HEADER'] - ) - self.assertEqual(response.status_code, 204) - - -class SchemaValidationTests(SiteTest): - def test_get_with_invalid_user_id_param_returns_400(self): - response = self.client.get( - '/bot/bigbrother?user_id=lemon-is-not-a-number', - app.config['API_SUBDOMAIN'], - headers=app.config['TEST_HEADER'] - ) - - self.assert400(response) - self.assertIsInstance(response.json['error_message'], str) - - def test_post_with_invalid_data_returns_400(self): - bad_data_json = json.dumps({ - 'user_id': "I'M A NUMBER I SWEAR", - 'channel_id': '42' - }) - - response = self.client.post( - '/bot/bigbrother', - app.config['API_SUBDOMAIN'], - headers=app.config['TEST_HEADER'], - data=bad_data_json - ) - - self.assert400(response) - self.assertIsInstance(response.json['error_message'], str) - - def test_delete_with_invalid_user_id_param_returns_400(self): - response = self.client.delete( - '/bot/bigbrother?user_id=totally-a-valid-number', - app.config['API_SUBDOMAIN'], - headers=app.config['TEST_HEADER'] - ) - - self.assert400(response) - self.assertIsInstance(response.json['error_message'], str) diff --git a/tests/test_api_bot_infractions.py b/tests/test_api_bot_infractions.py deleted file mode 100644 index 58453e9b..00000000 --- a/tests/test_api_bot_infractions.py +++ /dev/null @@ -1,134 +0,0 @@ -import json - -from tests import SiteTest, app - -TEST_USER_ID = "test" - - -class ApiBotInfractionsEndpoint(SiteTest): - - def test_infraction_create_invalid(self): - # Invalid infraction type - post_data_invalid_type = json.dumps( - {"type": "not_a_type", "reason": "test", "user_id": TEST_USER_ID, "actor_id": TEST_USER_ID} - ) - response = self.client.post("/bot/infractions", app.config["API_SUBDOMAIN"], - headers=app.config["TEST_HEADER"], - data=post_data_invalid_type) - self.assert400(response) - - def test_infraction_kick(self): - post_data_valid = json.dumps( - {"type": "kick", "reason": "test", "user_id": TEST_USER_ID, "actor_id": TEST_USER_ID} - ) - response = self.client.post("/bot/infractions", app.config["API_SUBDOMAIN"], - headers=app.config["TEST_HEADER"], - data=post_data_valid) - self.assert200(response) - self.assertTrue("infraction" in response.json) - self.assertTrue("id" in response.json["infraction"]) - infraction_id = response.json["infraction"]["id"] - response = self.client.get(f"/bot/infractions/id/{infraction_id}", app.config["API_SUBDOMAIN"], - headers=app.config["TEST_HEADER"]) - self.assert200(response) - self.assertTrue("infraction" in response.json) - self.assertTrue("id" in response.json["infraction"]) - self.assertEqual(response.json["infraction"]["id"], infraction_id) - self.assertTrue("active" in response.json["infraction"]) - self.assertFalse(response.json["infraction"]["active"]) - - def test_infraction_ban(self): - post_data_valid = json.dumps( - {"type": "ban", "reason": "baddie", "user_id": TEST_USER_ID, "actor_id": TEST_USER_ID} - ) - response = self.client.post("/bot/infractions", app.config["API_SUBDOMAIN"], - headers=app.config["TEST_HEADER"], - data=post_data_valid) - self.assert200(response) - self.assertTrue("infraction" in response.json) - self.assertTrue("id" in response.json["infraction"]) - infraction_id = response.json["infraction"]["id"] - - # Check if the ban is currently applied - response = self.client.get(f"/bot/infractions/user/{TEST_USER_ID}/ban/current", app.config["API_SUBDOMAIN"], - headers=app.config["TEST_HEADER"]) - self.assert200(response) - self.assertTrue("infraction" in response.json) - self.assertIsNotNone(response.json["infraction"]) - self.assertTrue("id" in response.json["infraction"]) - self.assertEqual(response.json["infraction"]["id"], infraction_id) - self.assertIsNone(response.json["infraction"]["expires_at"]) - self.assertTrue(response.json["infraction"]["active"]) - - # Update the expiration to 1d - patch_data_valid = json.dumps( - {"id": infraction_id, "duration": "1d"} - ) - response = self.client.patch("/bot/infractions", app.config["API_SUBDOMAIN"], - headers=app.config["TEST_HEADER"], - data=patch_data_valid) - self.assert200(response) - self.assertTrue("success" in response.json) - self.assertTrue("infraction" in response.json) - self.assertTrue(response.json["success"]) - self.assertIsNotNone(response.json["infraction"]["expires_at"]) - self.assertTrue(response.json["infraction"]["active"]) - - # Disable the ban - patch_data_valid = json.dumps( - {"id": infraction_id, "active": False} - ) - response = self.client.patch("/bot/infractions", app.config["API_SUBDOMAIN"], - headers=app.config["TEST_HEADER"], - data=patch_data_valid) - self.assert200(response) - self.assertTrue("success" in response.json) - self.assertTrue("infraction" in response.json) - self.assertTrue(response.json["success"]) - self.assertFalse(response.json["infraction"]["active"]) - - # Check if there is no active ban anymore - response = self.client.get(f"/bot/infractions/user/{TEST_USER_ID}/ban/current", app.config["API_SUBDOMAIN"], - headers=app.config["TEST_HEADER"]) - self.assert200(response) - self.assertTrue("infraction" in response.json) - self.assertIsNone(response.json["infraction"]) - - # Re-activate the ban - patch_data_valid = json.dumps( - {"id": infraction_id, "active": True} - ) - response = self.client.patch("/bot/infractions", app.config["API_SUBDOMAIN"], - headers=app.config["TEST_HEADER"], - data=patch_data_valid) - self.assert200(response) - self.assertTrue("success" in response.json) - self.assertTrue("infraction" in response.json) - self.assertTrue(response.json["success"]) - self.assertTrue(response.json["infraction"]["active"]) - - # Create a new ban - post_data_valid = json.dumps( - {"type": "ban", "reason": "baddie v2.0", "user_id": TEST_USER_ID, "actor_id": TEST_USER_ID} - ) - response = self.client.post("/bot/infractions", app.config["API_SUBDOMAIN"], - headers=app.config["TEST_HEADER"], - data=post_data_valid) - self.assert200(response) - self.assertTrue("infraction" in response.json) - self.assertTrue("id" in response.json["infraction"]) - new_infraction_id = response.json["infraction"]["id"] - - # Check if the old ban is now disabled - response = self.client.get(f"/bot/infractions/id/{infraction_id}", app.config["API_SUBDOMAIN"], - headers=app.config["TEST_HEADER"]) - self.assert200(response) - self.assertTrue("infraction" in response.json) - self.assertFalse(response.json["infraction"]["active"]) - - # Check if the current ban infraction is the new infraction - response = self.client.get(f"/bot/infractions/user/{TEST_USER_ID}/ban/current", app.config["API_SUBDOMAIN"], - headers=app.config["TEST_HEADER"]) - self.assert200(response) - self.assertTrue("infraction" in response.json) - self.assertEqual(response.json["infraction"]["id"], new_infraction_id) diff --git a/tests/test_api_bot_off_topic_names.py b/tests/test_api_bot_off_topic_names.py deleted file mode 100644 index 6227ddef..00000000 --- a/tests/test_api_bot_off_topic_names.py +++ /dev/null @@ -1,134 +0,0 @@ -"""Tests the `/api/bot/off-topic-names` endpoint.""" - -from tests import SiteTest, app - - -class EmptyDatabaseOffTopicEndpointTests(SiteTest): - """Tests fetching all entries from the endpoint with an empty database.""" - - def test_get_returns_empty_list(self): - response = self.client.get( - '/bot/off-topic-names', - app.config['API_SUBDOMAIN'], - headers=app.config['TEST_HEADER'] - ) - self.assert200(response) - self.assertEqual(response.json, []) - - -class AddingANameOffTopicEndpointTests(SiteTest): - """Tests adding a channel name to the database.""" - - def test_returns_400_on_bad_data(self): - response = self.client.post( - '/bot/off-topic-names?name=my%20TOTALLY%20VALID%20CHANNE%20NAME', - app.config['API_SUBDOMAIN'], - headers=app.config['TEST_HEADER'] - ) - self.assert400(response) - - def test_can_add_new_package(self): - response = self.client.post( - '/bot/off-topic-names?name=lemons-lemon-shop', - app.config['API_SUBDOMAIN'], - headers=app.config['TEST_HEADER'] - ) - self.assert200(response) - - -class AddingChannelNamesToDatabaseEndpointTests(SiteTest): - """Tests fetching names from the database with GET.""" - - CHANNEL_NAME = 'bisks-disks' - - def setUp(self): - response = self.client.post( - f'/bot/off-topic-names?name={self.CHANNEL_NAME}', - app.config['API_SUBDOMAIN'], - headers=app.config['TEST_HEADER'] - ) - self.assert200(response) - - def test_name_is_in_all_entries(self): - response = self.client.get( - '/bot/off-topic-names', - app.config['API_SUBDOMAIN'], - headers=app.config['TEST_HEADER'] - ) - self.assert200(response) - self.assertIn(self.CHANNEL_NAME, response.json) - - -class AllowsNumbersInNames(SiteTest): - """Tests that the site allows names with numbers in them.""" - - def test_allows_numbers_in_names(self): - response = self.client.post( - f'/bot/off-topic-names?name=totallynot42', - app.config['API_SUBDOMAIN'], - headers=app.config['TEST_HEADER'] - ) - self.assert200(response) - - -class RandomSampleEndpointTests(SiteTest): - """Tests fetching random names from the website with GET.""" - - CHANNEL_NAME_1 = 'chicken-shed' - CHANNEL_NAME_2 = 'robot-kindergarten' - - def setUp(self): - response = self.client.post( - f'/bot/off-topic-names?name={self.CHANNEL_NAME_1}', - app.config['API_SUBDOMAIN'], - headers=app.config['TEST_HEADER'] - ) - self.assert200(response) - - response = self.client.post( - f'/bot/off-topic-names?name={self.CHANNEL_NAME_2}', - app.config['API_SUBDOMAIN'], - headers=app.config['TEST_HEADER'] - ) - self.assert200(response) - - def test_returns_limited_names_with_random_query_param(self): - response = self.client.get( - '/bot/off-topic-names?random_items=1', - app.config['API_SUBDOMAIN'], - headers=app.config['TEST_HEADER'] - ) - self.assert200(response) - self.assertEqual(len(response.json), 1) - - -class DeletingANameEndpointTests(SiteTest): - """Tests deleting a name from the database using DELETE.""" - - CHANNEL_NAME = 'duck-goes-meow' - - def setUp(self): - response = self.client.post( - f'/bot/off-topic-names?name={self.CHANNEL_NAME}', - app.config['API_SUBDOMAIN'], - headers=app.config['TEST_HEADER'] - ) - self.assert200(response) - - def test_deleting_random_name_returns_deleted_0(self): - response = self.client.delete( - '/bot/off-topic-names?name=my-totally-random-name', - app.config['API_SUBDOMAIN'], - headers=app.config['TEST_HEADER'] - ) - self.assert200(response) - self.assertEqual(response.json['deleted'], 0) - - def test_deleting_channel_name_returns_deleted_1(self): - response = self.client.delete( - f'/bot/off-topic-names?name={self.CHANNEL_NAME}', - app.config['API_SUBDOMAIN'], - headers=app.config['TEST_HEADER'] - ) - self.assert200(response) - self.assertEqual(response.json['deleted'], 1) diff --git a/tests/test_api_bot_snake.py b/tests/test_api_bot_snake.py deleted file mode 100644 index fcc18409..00000000 --- a/tests/test_api_bot_snake.py +++ /dev/null @@ -1,64 +0,0 @@ -"""Tests the `/api/bot/snake_` endpoints.""" - -from tests import SiteTest, app - - -class TestSnakeFactsAPI(SiteTest): - """GET method - get snake fact""" - - def test_snake_facts(self): - response = self.client.get( - '/bot/snake_facts', - app.config['API_SUBDOMAIN'], - headers=app.config['TEST_HEADER'] - ) - self.assertEqual(response.status_code, 200) - self.assertEqual(type(response.json), str) - - -class TestSnakeIdiomAPI(SiteTest): - """GET method - get snake idiom""" - - def test_snake_idiom(self): - response = self.client.get( - '/bot/snake_idioms', - app.config['API_SUBDOMAIN'], - headers=app.config['TEST_HEADER'] - ) - self.assertEqual(response.status_code, 200) - self.assertEqual(type(response.json), str) - - -class TestSnakeQuizAPI(SiteTest): - """GET method - get snake quiz""" - - def test_snake_quiz(self): - response = self.client.get( - '/bot/snake_quiz', - app.config['API_SUBDOMAIN'], - headers=app.config['TEST_HEADER'] - ) - self.assertEqual(response.status_code, 200) - self.assertEqual(type(response.json), dict) - - -class TestSnakeNameAPI(SiteTest): - """GET method - get a single snake name, or all of them.""" - - def test_snake_names(self): - response = self.client.get( - '/bot/snake_names', - app.config['API_SUBDOMAIN'], - headers=app.config['TEST_HEADER'] - ) - self.assertEqual(response.status_code, 200) - self.assertEqual(type(response.json), dict) - - def test_snake_names_all(self): - response = self.client.get( - '/bot/snake_names?get_all=True', - app.config['API_SUBDOMAIN'], - headers=app.config['TEST_HEADER'] - ) - self.assertEqual(response.status_code, 200) - self.assertEqual(type(response.json), list) diff --git a/tests/test_api_bot_tags.py b/tests/test_api_bot_tags.py deleted file mode 100644 index fa06e0fa..00000000 --- a/tests/test_api_bot_tags.py +++ /dev/null @@ -1,72 +0,0 @@ -import json -from tests import SiteTest, app - - -class ApiBotTagsEndpoint(SiteTest): - - def test_api_tags(self): - """ Check tag API """ - - post_data = json.dumps({ - 'tag_name': 'testing', - 'tag_content': 'testing' - }) - - get_data = json.dumps({ - 'tag_name': 'testing' - }) - - bad_data = json.dumps({ - 'not_a_valid_key': 'gross_faceman' - }) - - # POST method - no headers - response = self.client.post('/bot/tags', app.config['API_SUBDOMAIN']) - self.assertEqual(response.status_code, 401) - - # POST method - no data - response = self.client.post('/bot/tags', app.config['API_SUBDOMAIN'], headers=app.config['TEST_HEADER']) - self.assertEqual(response.status_code, 400) - - # POST method - bad data - response = self.client.post('/bot/tags', app.config['API_SUBDOMAIN'], headers=app.config['TEST_HEADER'], data=bad_data) - self.assertEqual(response.status_code, 400) - - # POST method - save tag - response = self.client.post('/bot/tags', app.config['API_SUBDOMAIN'], headers=app.config['TEST_HEADER'], data=post_data) - self.assertEqual(response.status_code, 200) - self.assertEqual(response.json, {"success": True}) - - # GET method - no headers - response = self.client.get('/bot/tags', app.config['API_SUBDOMAIN']) - self.assertEqual(response.status_code, 401) - - # GET method - get all tags - response = self.client.get('/bot/tags', app.config['API_SUBDOMAIN'], headers=app.config['TEST_HEADER']) - self.assertEqual(response.status_code, 200) - self.assertEqual(type(response.json), list) - - # GET method - get specific tag - response = self.client.get('/bot/tags?tag_name=testing', app.config['API_SUBDOMAIN'], headers=app.config['TEST_HEADER']) - self.assertEqual(response.json, { - 'tag_content': 'testing', - 'tag_name': 'testing' - }) - self.assertEqual(response.status_code, 200) - - # DELETE method - no headers - response = self.client.delete('/bot/tags', app.config['API_SUBDOMAIN']) - self.assertEqual(response.status_code, 401) - - # DELETE method - no data - response = self.client.delete('/bot/tags', app.config['API_SUBDOMAIN'], headers=app.config['TEST_HEADER']) - self.assertEqual(response.status_code, 400) - - # DELETE method - bad data - response = self.client.delete('/bot/tags', app.config['API_SUBDOMAIN'], headers=app.config['TEST_HEADER'], data=bad_data) - self.assertEqual(response.status_code, 400) - - # DELETE method - delete the testing tag - response = self.client.delete('/bot/tags', app.config['API_SUBDOMAIN'], headers=app.config['TEST_HEADER'], data=get_data) - self.assertEqual(response.status_code, 200) - self.assertEqual(response.json, {"success": True}) diff --git a/tests/test_api_bot_users.py b/tests/test_api_bot_users.py deleted file mode 100644 index eda3713e..00000000 --- a/tests/test_api_bot_users.py +++ /dev/null @@ -1,28 +0,0 @@ -import json -from tests import SiteTest, app - - -class ApiBotUsersEndpoint(SiteTest): - def test_api_user(self): - """ Check insert user """ - single_data = json.dumps( - {'user_id': "1234", 'roles': ["5678"], "username": "test", "discriminator": "0000", "avatar": "http://some/url"} - ) - list_data = json.dumps([ - {'user_id': "1234", 'roles': ["5678"], "username": "test", "discriminator": "0000", "avatar": "http://some/url"} - ]) - - response = self.client.get('/bot/users?user_id=1234', app.config['API_SUBDOMAIN'], headers=app.config['TEST_HEADER']) - self.assertTrue("data" in response.json) - - response = self.client.post('/bot/users', app.config['API_SUBDOMAIN'], headers=app.config['TEST_HEADER'], data=single_data) - self.assertTrue("success" in response.json) - - response = self.client.post('/bot/users/complete', app.config['API_SUBDOMAIN'], headers=app.config['TEST_HEADER'], data=single_data) - self.assertTrue("inserted" in response.json) - - response = self.client.post('/bot/users', app.config['API_SUBDOMAIN'], headers=app.config['TEST_HEADER'], data=list_data) - self.assertTrue("success" in response.json) - - response = self.client.post('/bot/users/complete', app.config['API_SUBDOMAIN'], headers=app.config['TEST_HEADER'], data=list_data) - self.assertTrue("inserted" in response.json) diff --git a/tests/test_api_docs.py b/tests/test_api_docs.py deleted file mode 100644 index 945a73bc..00000000 --- a/tests/test_api_docs.py +++ /dev/null @@ -1,95 +0,0 @@ -import json - -from tests import SiteTest, app - - -class ApiDocsEndpoint(SiteTest): - """ Check documentation metadata API """ - - bad_data = json.dumps({'package': 'whatever', 'correct format': False}) - unknown_package_json = json.dumps({'package': "whatever"}) - - def test_api_docs_get_all(self): - """ GET - all entries """ - response = self.client.get('/bot/docs', app.config['API_SUBDOMAIN'], headers=app.config['TEST_HEADER']) - self.assertEqual(response.status_code, 200) - self.assertIsInstance(response.json, list) - - def test_api_docs_get_unknown(self): - """ GET - unknown package """ - response = self.client.get('/bot/docs?package=whatever', app.config['API_SUBDOMAIN'], headers=app.config['TEST_HEADER']) - self.assertEqual(response.status_code, 200) - self.assertEqual(response.json, []) - - def test_api_docs_get_multi_unknown(self): - """ GET - multiple unknown packages """ - response = self.client.get('/bot/docs?package=whatever&package=everwhat', app.config['API_SUBDOMAIN'], headers=app.config['TEST_HEADER']) - self.assertEqual(response.status_code, 200) - self.assertIsInstance(response.json, list) - - def test_api_docs_post_no_data(self): - """ POST - no data """ - response = self.client.post('/bot/docs', app.config['API_SUBDOMAIN'], headers=app.config['TEST_HEADER']) - self.assertEqual(response.status_code, 400) - - def test_api_docs_post_bad_data(self): - """ POST - malformed data """ - response = self.client.post('/bot/docs', app.config['API_SUBDOMAIN'], headers=app.config['TEST_HEADER'], data=self.bad_data) - self.assertEqual(response.status_code, 400) - - def test_api_docs_delete_bad(self): - """ DELETE - missing request body """ - response = self.client.delete('/bot/docs', app.config['API_SUBDOMAIN'], headers=app.config['TEST_HEADER']) - self.assertEqual(response.status_code, 400) - - def test_api_docs_delete_unknown(self): - """ DELETE - unknown package """ - response = self.client.delete('/bot/docs', app.config['API_SUBDOMAIN'], headers=app.config['TEST_HEADER'], data=self.unknown_package_json) - self.assertEqual(response.status_code, 200) - self.assertEqual(response.json['deleted'], 0) - - -class SinglePackageApiDocsEndpointTests(SiteTest): - """ Test the API docs endpoint with a single package added """ - - valid_data = { - 'package': "lemonapi", - 'base_url': "http://example.com/", - 'inventory_url': "http://example.com/object.inv" - } - delete_data_json = json.dumps({'package': valid_data['package']}) - valid_data_json = json.dumps(valid_data) - - def setUp(self): - """ POST valid data to the server for use in this test case """ - response = self.client.post('/bot/docs', app.config['API_SUBDOMAIN'], headers=app.config['TEST_HEADER'], data=self.valid_data_json) - self.assertEqual(response.status_code, 200) - self.assertEqual(response.json, {"success": True}) - - def test_api_docs_get_valid(self): - """ GET - added package is in all entries """ - response = self.client.get('/bot/docs', app.config['API_SUBDOMAIN'], headers=app.config['TEST_HEADER']) - self.assertEqual(response.status_code, 200) - self.assertIn(self.valid_data, response.json) - - def test_api_docs_get_detail(self): - """ GET - added package detail """ - response = self.client.get( - f'/bot/docs?package={self.valid_data["package"]}', app.config['API_SUBDOMAIN'], headers=app.config['TEST_HEADER'] - ) - self.assertEqual(response.status_code, 200) - self.assertEqual(response.json, [self.valid_data]) - - def test_api_docs_get_partly_known(self): - """ GET - added package is the only package for query with another unknown package """ - response = self.client.get( - f'/bot/docs?package={self.valid_data["package"]}&package=whatever', app.config['API_SUBDOMAIN'], headers=app.config['TEST_HEADER'] - ) - self.assertEqual(response.status_code, 200) - self.assertEqual(response.json, [self.valid_data]) - - def test_api_docs_delete_all(self): - """ DELETE - added package """ - response = self.client.delete('/bot/docs', app.config['API_SUBDOMAIN'], headers=app.config['TEST_HEADER'], data=self.delete_data_json) - self.assertEqual(response.status_code, 200) - self.assertEqual(response.json['deleted'], 1) diff --git a/tests/test_clean_logs.py b/tests/test_clean_logs.py deleted file mode 100644 index 1c3449b4..00000000 --- a/tests/test_clean_logs.py +++ /dev/null @@ -1,74 +0,0 @@ -"""Tests the `/api/bot/clean` endpoint.""" -import json - -from tests import SiteTest, app - - -class TestCleanLogAPI(SiteTest): - """ - Tests submitting a clean log and - verifies that we get a UUID in return. - - Also ensures that we get a 400 if we send in bad data. - """ - - def test_returns_400_on_bad_data(self): - bad_data = json.dumps({ - "scubfire": "testiclaes" - }) - - response = self.client.post( - '/bot/clean', - app.config['API_SUBDOMAIN'], - headers=app.config['TEST_HEADER'], - data=bad_data - ) - self.assert400(response) - - def test_submit_clean_log(self): - good_data = json.dumps({ - "log_data": [ - { - "author": "something", - "user_id": "12345151", - "role_id": "4818413", - "content": "testy", - "timestamp": "this way comes", - "embeds": [{"fire":"nanny"}], - "attachments": [""], - } - ] - }) - - response = self.client.post( - '/bot/clean', - app.config['API_SUBDOMAIN'], - headers=app.config['TEST_HEADER'], - data=good_data - ) - - log_id = response.json.get("log_id") - - self.assert200(response) - self.assertIsNotNone(log_id) - self.assertGreater(len(log_id), 2) - self.assertEqual(type(log_id), str) - - -class TestCleanLogFrontEnd(SiteTest): - """ - Tests the frontend for - viewing the clean logs. - - Best I can do with our current - system is check if I'm redirected, - since this is behind OAuth. - """ - - def test_clean_log_frontend_returns_302(self): - response = self.client.get( - f'/bot/clean_logs/1', - 'http://pytest.local' - ) - - self.assertEqual(response.status_code, 302) \ No newline at end of file diff --git a/tests/test_database.py b/tests/test_database.py deleted file mode 100644 index 237cd68d..00000000 --- a/tests/test_database.py +++ /dev/null @@ -1,31 +0,0 @@ -from tests import SiteTest - -class DatabaseTests(SiteTest): - """ Test cases for the database module """ - def test_table_actions(self): - import string - import secrets - from pysite.database import RethinkDB - - alphabet = string.ascii_letters - generated_table_name = ''.join(secrets.choice(alphabet) for i in range(8)) - - rdb = RethinkDB() - # Create table name and expect it to work - result = rdb.create_table(generated_table_name) - self.assertEqual(result, True) - - # Create the same table name and expect it to already exist - result = rdb.create_table(generated_table_name) - self.assertEqual(result, False) - - # Drop table and expect it to work - result = rdb.drop_table(generated_table_name) - self.assertEqual(result, True) - - # Drop the same table and expect it to already be gone - result = rdb.drop_table(generated_table_name) - self.assertEqual(result, False) - - # This is to get some more code coverage - self.assertEqual(rdb.teardown_request('_'), None) diff --git a/tests/test_decorators.py b/tests/test_decorators.py deleted file mode 100644 index 5a3915b8..00000000 --- a/tests/test_decorators.py +++ /dev/null @@ -1,48 +0,0 @@ -from schema import Schema -from werkzeug.datastructures import ImmutableMultiDict -from werkzeug.exceptions import BadRequest - -from pysite.constants import ValidationTypes -from pysite.decorators import api_params -from tests import SiteTest - - -class DuckRequest: - """A quacking request with the `args` parameter used in schema validation.""" - - def __init__(self, args): - self.args = args - - -class DecoratorTests(SiteTest): - def test_decorator_api_json(self): - """ Check the json validation decorator """ - SCHEMA = Schema([{"user_id": int, "role": int}]) - - @api_params(schema=SCHEMA, validation_type=ValidationTypes.json) - def try_json_type(data): - return data - - with self.assertRaises(AttributeError): - try_json_type("not json") - - def test_decorator_params(self): - """ Check the params validation decorator """ - - response = self.client.post('/testparams?test=params') - - self.assertEqual(response.status_code, 200) - self.assertEqual(response.json, [{'test': 'params'}]) - - def test_duplicate_params_with_dict_schema_raises_400(self): - """Check that duplicate parameters with a dictionary schema return 400 Bad Request""" - - response = self.client.get('/testparams?segfault=yes&segfault=no') - self.assert400(response) - - def test_single_params_with_dict_schema(self): - """Single parameters with a dictionary schema and `allow_duplicate_keys=False` return 200""" - - response = self.client.get('/testparams?segfault=yes') - self.assert200(response) - self.assertEqual(response.json, {'segfault': 'yes'}) diff --git a/tests/test_jams.py b/tests/test_jams.py deleted file mode 100644 index cf0d8952..00000000 --- a/tests/test_jams.py +++ /dev/null @@ -1,11 +0,0 @@ -from tests import SiteTest, app - -class JamsEndpoint(SiteTest): - """ Test cases for the root endpoint and error handling """ - - def test_jams_page(self): - """ Check the jams path responds with 200 OK """ - response = self.client.get('/jams', 'http://'+app.config['SERVER_NAME']) - self.assertEqual(response.status_code, 200) - - diff --git a/tests/test_mixins.py b/tests/test_mixins.py deleted file mode 100644 index 27e61b22..00000000 --- a/tests/test_mixins.py +++ /dev/null @@ -1,66 +0,0 @@ -import os -from tests import SiteTest, manager - -class MixinTests(SiteTest): - """ Test cases for mixins """ - - def test_handler_5xx(self): - """ Check error view returns error message """ - from werkzeug.exceptions import InternalServerError - from pysite.views.error_handlers import http_5xx - - error_view = http_5xx.Error500View() - error_message = error_view.get(InternalServerError) - self.assertEqual(error_message[1], 500) - - def test_route_view_runtime_error(self): - """ Check that wrong values for route view setup raises runtime error """ - from pysite.base_route import RouteView - - rv = RouteView() - - with self.assertRaises(RuntimeError): - rv.setup(manager, 'sdfsdf') - - def test_oauth_property(self): - """ Make sure the oauth property works""" - from flask import Blueprint - - from pysite.route_manager import RouteView - from pysite.oauth import OAuthBackend - - class TestRoute(RouteView): - name = "test" - path = "/test" - - tr = TestRoute() - tr.setup(manager, Blueprint("test", "test_name")) - self.assertIsInstance(tr.oauth, OAuthBackend) - - def test_user_data_property(self): - """ Make sure the user_data property works""" - from flask import Blueprint - - from pysite.route_manager import RouteView - - class TestRoute(RouteView): - name = "test" - path = "/test" - - tr = TestRoute() - tr.setup(manager, Blueprint("test", "test_name")) - self.assertIsNone(tr.user_data) - - def test_logged_in_property(self): - """ Make sure the user_data property works""" - from flask import Blueprint - - from pysite.route_manager import RouteView - - class TestRoute(RouteView): - name = "test" - path = "/test" - - tr = TestRoute() - tr.setup(manager, Blueprint("test", "test_name")) - self.assertFalse(tr.logged_in) diff --git a/tests/test_oauth_backend.py b/tests/test_oauth_backend.py deleted file mode 100644 index 473f5c54..00000000 --- a/tests/test_oauth_backend.py +++ /dev/null @@ -1,39 +0,0 @@ -from tests import SiteTest, manager - -class TestOAuthBackend(SiteTest): - """ Test cases for the oauth.py file """ - - def test_get(self): - """ Make sure the get function returns nothing """ - self.assertIsNone(manager.oauth_backend.get()) - - def test_delete(self): - """ Make sure the delete function returns nothing """ - self.assertIsNone(manager.oauth_backend.delete(None)) - - def test_logout(self): - """ Make sure at least apart of logout is working :/ """ - self.assertIsNone(manager.oauth_backend.logout()) - - def test_add_user(self): - """ Make sure function adds values to database and session """ - from flask import session - - from pysite.constants import OAUTH_DATABASE - - sess_id = "hey bro wazup" - fake_token = {"access_token": "access_token", "id": sess_id, "refresh_token": "refresh_token", "expires_at": 5} - fake_user = {"id": 1235678987654321, "username": "Zwacky", "discriminator": "#6660"} - manager.db.conn = manager.db.get_connection() - manager.oauth_backend.add_user(fake_token, fake_user, sess_id) - - self.assertEqual(sess_id, session["session_id"]) - fake_token["snowflake"] = fake_user["id"] - fake_user["user_id"] = fake_user["id"] - del fake_user["id"] - self.assertEqual(fake_token, manager.db.get(OAUTH_DATABASE, sess_id)) - self.assertEqual(fake_user, manager.db.get("users", fake_user["user_id"])) - - manager.db.delete(OAUTH_DATABASE, sess_id) - manager.db.delete("users", fake_user["user_id"]) - manager.db.teardown_request(None) diff --git a/tests/test_roots.py b/tests/test_roots.py deleted file mode 100644 index 1b270178..00000000 --- a/tests/test_roots.py +++ /dev/null @@ -1,85 +0,0 @@ -from tests import SiteTest -from pysite.constants import DISCORD_OAUTH_REDIRECT -from pysite.constants import DISCORD_OAUTH_AUTHORIZED -from pysite.constants import ERROR_DESCRIPTIONS - - -class RootEndpoint(SiteTest): - """ Test cases for the root endpoint and error handling """ - - def test_index(self): - """ Check the root path responds with 200 OK """ - response = self.client.get('/', 'http://pytest.local') - self.assertEqual(response.status_code, 200) - - def test_info_index(self): - """ Check the info index path responds with a 301 """ - response = self.client.get('/info') - self.assertEqual(response.status_code, 301) - - def test_info_help(self): - """ Check the info help path responds with 200 OK """ - response = self.client.get('/info/help') - self.assertEqual(response.status_code, 200) - - def test_info_resources(self): - """ Check the info resources path responds with 200 OK """ - response = self.client.get('/info/resources') - self.assertEqual(response.status_code, 200) - - def test_info_resources_json(self): - """ Check the resources JSON loads correctly """ - response = self.client.get('/static/resources.json') - self.assertEqual(response.status_code, 200) - self.assertIsInstance(response.json, dict) - - def test_info_rules(self): - """ Check the info rules path responds with 200 OK """ - response = self.client.get('/info/help') - self.assertEqual(response.status_code, 200) - - def test_not_found(self): - """ Check paths without handlers returns 404 Not Found """ - response = self.client.get('/nonexistentpath') - self.assertEqual(response.status_code, 404) - - def test_error(self): - """ Check the error pages """ - for code in ERROR_DESCRIPTIONS.keys(): - response = self.client.get(f'/error/{code}') - self.assertEqual(response.status_code, code) - - def test_invite(self): - """ Check invite redirects """ - response = self.client.get('/invite') - self.assertEqual(response.status_code, 302) - - def test_ws_test(self): - """ Check ws_test responds """ - response = self.client.get('/ws_test') - self.assertEqual(response.status_code, 200) - - def test_oauth_redirects(self): - """ Check oauth redirects """ - response = self.client.get(DISCORD_OAUTH_REDIRECT) - self.assertEqual(response.status_code, 302) - - def test_oauth_logout(self): - """ Check oauth redirects """ - response = self.client.get('/auth/logout') - self.assertEqual(response.status_code, 302) - - def test_oauth_authorized(self): - """ Check oauth authorization """ - response = self.client.get(DISCORD_OAUTH_AUTHORIZED) - self.assertEqual(response.status_code, 302) - - def test_stats_redirect(self): - """ Check stats path redirects """ - response = self.client.get('/stats') - self.assertEqual(response.status_code, 302) - - def test_500_easter_egg(self): - """ Check the status of the /500 page""" - response = self.client.get("/500") - self.assertEqual(response.status_code, 500) diff --git a/tests/test_rst.py b/tests/test_rst.py deleted file mode 100644 index d6328bc4..00000000 --- a/tests/test_rst.py +++ /dev/null @@ -1,11 +0,0 @@ -import os -import json -from tests import SiteTest, app - -class RstEndpoints(SiteTest): - """ Test cases for staff subdomain """ - - def test_staff_view(self): - """ Check staff view redirects """ - response = self.client.get('/', "http://"+app.config['SERVER_NAME']) - self.assertEqual(response.status_code, 200) diff --git a/tests/test_staff.py b/tests/test_staff.py deleted file mode 100644 index bc911b0c..00000000 --- a/tests/test_staff.py +++ /dev/null @@ -1,15 +0,0 @@ -from tests import SiteTest, app - - -class StaffEndpoints(SiteTest): - """ Test cases for staff subdomain """ - - def test_staff_view(self): - """ Check staff view redirects """ - response = self.client.get('/', app.config['STAFF_SUBDOMAIN']) - self.assertEqual(response.status_code, 302) - - def test_jams_infractions(self): - """ Check staff jams infractions view redirects """ - response = self.client.get('/jams/infractions', app.config['STAFF_SUBDOMAIN']) - self.assertEqual(response.status_code, 302) diff --git a/tests/test_utilities.py b/tests/test_utilities.py deleted file mode 100644 index 61a480e2..00000000 --- a/tests/test_utilities.py +++ /dev/null @@ -1,25 +0,0 @@ -from tests import SiteTest, manager - -class Utilities(SiteTest): - """ Test cases for internal utility code """ - def test_error_view_runtime_error(self): - """ Check that wrong values for error view setup raises runtime error """ - import pysite.base_route - - ev = pysite.base_route.ErrorView() - - with self.assertRaises(RuntimeError): - ev.setup(manager, 'sdfsdf') - - def test_websocket_callback(self): - """ Check that websocket default callbacks work """ - import pysite.websockets - - class TestWS(pysite.websockets.WS): - pass - - try: - TestWS(None).on_message("test") - return False - except NotImplementedError: - return True diff --git a/tests/test_utils.py b/tests/test_utils.py deleted file mode 100644 index 87c8c186..00000000 --- a/tests/test_utils.py +++ /dev/null @@ -1,73 +0,0 @@ -from datetime import datetime, timedelta, timezone - -from tests import SiteTest -from pysite.utils.time import is_expired, parse_duration - - -class DurationParsingTests(SiteTest): - """Tests the `parse_duration` method provided by `pysite.utils.time`.""" - - SIMPLE_DURATION_STRINGS = ( - ('42s', timedelta(seconds=42)), - ('12m', timedelta(minutes=12)), - ('20h', timedelta(hours=20)), - ('7d', timedelta(days=7)), - ('2w', timedelta(weeks=2)) - ) - COMBINED_DURATION_STRINGS = ( - ('12m30s', timedelta(minutes=12, seconds=30)), - ('20h5m', timedelta(hours=20, minutes=5)), - ('7d10h12s', timedelta(days=7, hours=10, seconds=12)) - ) - - def test_simple_duration_string_parsing(self): - for duration_string, added_delta in self.SIMPLE_DURATION_STRINGS: - timezone_aware_now = datetime.now(timezone.utc) - self.assertAlmostEqual( - parse_duration(duration_string).timestamp(), - (timezone_aware_now + added_delta).timestamp(), - places=-1 # Being off by < 10 seconds is acceptable - ) - - def test_combined_duration_string_parsing(self): - for duration_string, added_delta in self.COMBINED_DURATION_STRINGS: - timezone_aware_now = datetime.now(timezone.utc) - self.assertAlmostEqual( - parse_duration(duration_string).timestamp(), - (timezone_aware_now + added_delta).timestamp(), - places=-1 # Being off by < 10 seconds is acceptable - ) - - def test_empty_duration_raises_valueerror(self): - with self.assertRaises(ValueError): - parse_duration('') - - def test_unknown_char_raises_valueerror(self): - with self.assertRaises(ValueError): - parse_duration('12l') - - def test_valid_unit_without_digits_raises_valueerror(self): - with self.assertRaises(ValueError): - parse_duration('s') - - -class ExpiryTests(SiteTest): - """Tests the `is_expired` method provided by `pysite.utils.time`.""" - - EXPIRY_DELTAS = ( - timedelta(seconds=30), - timedelta(minutes=12), - timedelta(hours=20), - timedelta(days=5), - timedelta(weeks=7) - ) - - def test_datetimes_in_the_past_are_expired(self): - for delta in self.EXPIRY_DELTAS: - date = datetime.now(timezone.utc) - delta - self.assertTrue(is_expired(date)) - - def test_datetimes_in_the_future_are_not_expired(self): - for delta in self.EXPIRY_DELTAS: - date = datetime.now(timezone.utc) + delta - self.assertFalse(is_expired(date)) diff --git a/tests/test_websocket.py b/tests/test_websocket.py deleted file mode 100644 index d8a616bf..00000000 --- a/tests/test_websocket.py +++ /dev/null @@ -1,12 +0,0 @@ -from tests import SiteTest - -class TestWebsocketEcho(SiteTest): - """ Test cases for the echo endpoint """ - def testEcho(self): - """ Check rudimentary websockets handlers work """ - from geventwebsocket.websocket import WebSocket - from pysite.views.ws.echo import EchoWebsocket - ew = EchoWebsocket(WebSocket) - ew.on_open() - ew.on_message('message') - ew.on_close() diff --git a/tests/test_wiki.py b/tests/test_wiki.py deleted file mode 100644 index e16152a1..00000000 --- a/tests/test_wiki.py +++ /dev/null @@ -1,34 +0,0 @@ -import os -from tests import SiteTest, app - -class WikiEndpoints(SiteTest): - """ Test cases for the wiki subdomain """ - def test_wiki_edit(self): - """Test that the wiki edit page redirects to login""" - response = self.client.get("/edit/page", app.config['WIKI_SUBDOMAIN']) - self.assertEqual(response.status_code, 302) - - def test_wiki_edit_post_empty_request(self): - """Empty request should redirect to login""" - response = self.client.post("/edit/page", app.config['WIKI_SUBDOMAIN']) - self.assertEqual(response.status_code, 302) - - def test_wiki_history(self): - """Test the history show""" - response = self.client.get("/history/show/blahblah-non-existant-page", app.config['WIKI_SUBDOMAIN']) - self.assertEqual(response.status_code, 404) # Test that unknown routes 404 - - def test_wiki_diff(self): - """Test whether invalid revision IDs error""" - response = self.client.get("/history/compare/ABC/XYZ", app.config['WIKI_SUBDOMAIN']) - self.assertEqual(response.status_code, 404) # Test that unknown revisions 404 - - def test_wiki_special(self): - """Test whether invalid revision IDs error""" - response = self.client.get("/special", app.config['WIKI_SUBDOMAIN']) - self.assertEqual(response.status_code, 200) - - def test_wiki_special_all_pages(self): - """Test whether invalid revision IDs error""" - response = self.client.get("/special/all_pages", app.config['WIKI_SUBDOMAIN']) - self.assertEqual(response.status_code, 200) diff --git a/tox.ini b/tox.ini index 9232706e..b0665584 100644 --- a/tox.ini +++ b/tox.ini @@ -1,6 +1,6 @@ [flake8] max-line-length=120 -application_import_names=pysite -ignore=P102,B311,W503,E226,S311 +application_import_names=pydis_django +ignore=P102,B311,W503,E226,S311,E241 exclude=__pycache__, venv, .venv, tests import-order-style=pycharm -- cgit v1.2.3