diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index bebd97efb..e5664da68 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -90,6 +90,7 @@ unit-testing: unit-testing-erratic: stage: test retry: 2 + allow_failure: true only: changes: - "**/*.ex" diff --git a/CHANGELOG.md b/CHANGELOG.md index 99941b9ee..53cdc6e79 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,6 +16,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). ### Added - `activeMonth` and `activeHalfyear` fields in NodeInfo usage.users object - Experimental support for Finch. Put `config :tesla, :adapter, {Tesla.Adapter.Finch, name: MyFinch}` in your secrets file to use it. Reverse Proxy will still use Hackney. +- `ForceMentionsInPostContent` MRF policy - AdminAPI: allow moderators to manage reports, users, invites, and custom emojis - AdminAPI: restrict moderators to access sensitive data: change user credentials, get password reset token, read private statuses and chats, etc - PleromaAPI: Add remote follow API endpoint at `POST /api/v1/pleroma/remote_interaction` @@ -34,6 +35,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). - Handle Reject for already-accepted Follows properly - Display OpenGraph data on alternative notice routes. - Fix replies count for remote replies +- Fixed hashtags disappearing from the end of lines when Markdown is enabled - ChatAPI: Add link headers - Limited number of search results to 40 to prevent DoS attacks - ActivityPub: fixed federation of attachment dimensions @@ -45,6 +47,16 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). ### Removed +## 2.4.2 - 2022-01-10 + +### Fixed +- Federation issues caused by HTTP pool checkout timeouts +- Compatibility with Elixir 1.13 + +### Upgrade notes + +1. Restart Pleroma + ## 2.4.1 - 2021-08-29 ### Changed diff --git a/docs/clients.md b/docs/clients.md index 5650ea236..31d2d27c3 100644 --- a/docs/clients.md +++ b/docs/clients.md @@ -116,3 +116,9 @@ Feel free to contact us to be added to this list! - Contact: [@r@freesoftwareextremist.com](https://freesoftwareextremist.com/users/r) - Features: Does not requires JavaScript - Features: MastoAPI + +### Glitch-lily +- Source Code: +- Contact: [@tusooa@kazv.moe](https://kazv.moe/users/tusooa) +- Features: MastoAPI +- Based on [glitch-soc](https://github.com/glitch-soc/mastodon) frontend diff --git a/docs/configuration/cheatsheet.md b/docs/configuration/cheatsheet.md index 40e81cffb..4dacdc68c 100644 --- a/docs/configuration/cheatsheet.md +++ b/docs/configuration/cheatsheet.md @@ -125,6 +125,8 @@ To add configuration to your config file, you can copy it from the base config. * `Pleroma.Web.ActivityPub.MRF.ActivityExpirationPolicy`: Sets a default expiration on all posts made by users of the local instance. Requires `Pleroma.Workers.PurgeExpiredActivity` to be enabled for processing the scheduled delections. * `Pleroma.Web.ActivityPub.MRF.ForceBotUnlistedPolicy`: Makes all bot posts to disappear from public timelines. * `Pleroma.Web.ActivityPub.MRF.FollowBotPolicy`: Automatically follows newly discovered users from the specified bot account. Local accounts, locked accounts, and users with "#nobot" in their bio are respected and excluded from being followed. + * `Pleroma.Web.ActivityPub.MRF.KeywordPolicy`: Rejects or removes from the federated timeline or replaces keywords. (See [`:mrf_keyword`](#mrf_keyword)). + * `Pleroma.Web.ActivityPub.MRF.ForceMentionsInContent`: Forces every mentioned user to be reflected in the post content. * `transparency`: Make the content of your Message Rewrite Facility settings public (via nodeinfo). * `transparency_exclusions`: Exclude specific instance names from MRF transparency. The use of the exclusions feature will be disclosed in nodeinfo as a boolean value. diff --git a/docs/development/API/pleroma_api.md b/docs/development/API/pleroma_api.md index 2304291e5..0d15384b9 100644 --- a/docs/development/API/pleroma_api.md +++ b/docs/development/API/pleroma_api.md @@ -660,3 +660,38 @@ Emoji reactions work a lot like favourites do. They make it possible to react to "url": "https://example.com/media/backups/archive-foobar-20200910T161803-QUhx6VYDRQ2wfV0SdA2Pfj_2CLM_ATUlw-D5l5TJf4Q.zip" }] ``` + +## `GET /api/oauth_tokens` +### Retrieve a list of active sessions for the user +* Method: `GET` +* Authentication: required +* Params: none +* Response: JSON +* Example response: + +```json +[ + { + "app_name": "Pleroma FE", + "id": 9275, + "valid_until": "2121-11-24T15:51:08.234234" + }, + { + "app_name": "Patron", + "id": 8805, + "valid_until": "2121-10-26T18:09:59.857150" + }, + { + "app_name": "Soapbox FE", + "id": 9727, + "valid_until": "2121-12-25T16:52:39.692877" + } +] +``` + +## `DELETE /api/oauth_tokens/:id` +### Revoke a user session by its ID +* Method: `DELETE` +* Authentication: required +* Params: none +* Response: HTTP 200 on success, 500 on error diff --git a/lib/pleroma/formatter.ex b/lib/pleroma/formatter.ex index ae37946ab..115835378 100644 --- a/lib/pleroma/formatter.ex +++ b/lib/pleroma/formatter.ex @@ -34,32 +34,34 @@ def escape_mention_handler("@" <> nickname = mention, buffer, _, _) do def mention_handler("@" <> nickname, buffer, opts, acc) do case User.get_cached_by_nickname(nickname) do - %User{id: id} = user -> - user_url = user.uri || user.ap_id - nickname_text = get_nickname_text(nickname, opts) - - link = - Phoenix.HTML.Tag.content_tag( - :span, - Phoenix.HTML.Tag.content_tag( - :a, - ["@", Phoenix.HTML.Tag.content_tag(:span, nickname_text)], - "data-user": id, - class: "u-url mention", - href: user_url, - rel: "ugc" - ), - class: "h-card" - ) - |> Phoenix.HTML.safe_to_string() - - {link, %{acc | mentions: MapSet.put(acc.mentions, {"@" <> nickname, user})}} + %User{} = user -> + {mention_from_user(user, opts), + %{acc | mentions: MapSet.put(acc.mentions, {"@" <> nickname, user})}} _ -> {buffer, acc} end end + def mention_from_user(%User{id: id} = user, opts \\ %{mentions_format: :full}) do + user_url = user.uri || user.ap_id + nickname_text = get_nickname_text(user.nickname, opts) + + Phoenix.HTML.Tag.content_tag( + :span, + Phoenix.HTML.Tag.content_tag( + :a, + ["@", Phoenix.HTML.Tag.content_tag(:span, nickname_text)], + "data-user": id, + class: "u-url mention", + href: user_url, + rel: "ugc" + ), + class: "h-card" + ) + |> Phoenix.HTML.safe_to_string() + end + def hashtag_handler("#" <> tag = tag_text, _buffer, _opts, acc) do tag = String.downcase(tag) url = "#{Pleroma.Web.Endpoint.url()}/tag/#{tag}" diff --git a/lib/pleroma/user.ex b/lib/pleroma/user.ex index d608525e8..8bb4fb204 100644 --- a/lib/pleroma/user.ex +++ b/lib/pleroma/user.ex @@ -1084,6 +1084,10 @@ def get_by_ap_id(ap_id) do Repo.get_by(User, ap_id: ap_id) end + def get_by_uri(uri) do + Repo.get_by(User, uri: uri) + end + def get_all_by_ap_id(ap_ids) do from(u in __MODULE__, where: u.ap_id in ^ap_ids diff --git a/lib/pleroma/web/activity_pub/activity_pub.ex b/lib/pleroma/web/activity_pub/activity_pub.ex index bdbcc93f4..7551dd56d 100644 --- a/lib/pleroma/web/activity_pub/activity_pub.ex +++ b/lib/pleroma/web/activity_pub/activity_pub.ex @@ -1675,7 +1675,10 @@ def pin_data_from_featured_collection(%{ "orderedItems" => objects }) when type in ["OrderedCollection", "Collection"] do - Map.new(objects, fn %{"id" => object_ap_id} -> {object_ap_id, NaiveDateTime.utc_now()} end) + Map.new(objects, fn + %{"id" => object_ap_id} -> {object_ap_id, NaiveDateTime.utc_now()} + object_ap_id when is_binary(object_ap_id) -> {object_ap_id, NaiveDateTime.utc_now()} + end) end def fetch_and_prepare_featured_from_ap_id(nil) do diff --git a/lib/pleroma/web/activity_pub/mrf/force_mentions_in_content.ex b/lib/pleroma/web/activity_pub/mrf/force_mentions_in_content.ex new file mode 100644 index 000000000..522ae2f60 --- /dev/null +++ b/lib/pleroma/web/activity_pub/mrf/force_mentions_in_content.ex @@ -0,0 +1,80 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2022 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.ActivityPub.MRF.ForceMentionsInContent do + alias Pleroma.Formatter + alias Pleroma.User + + @behaviour Pleroma.Web.ActivityPub.MRF.Policy + + defp do_extract({:a, attrs, _}, acc) do + if Enum.find(attrs, fn {name, value} -> + name == "class" && value in ["mention", "u-url mention", "mention u-url"] + end) do + href = Enum.find(attrs, fn {name, _} -> name == "href" end) |> elem(1) + acc ++ [href] + else + acc + end + end + + defp do_extract({_, _, children}, acc) do + do_extract(children, acc) + end + + defp do_extract(nodes, acc) when is_list(nodes) do + Enum.reduce(nodes, acc, fn node, acc -> do_extract(node, acc) end) + end + + defp do_extract(_, acc), do: acc + + defp extract_mention_uris_from_content(content) do + {:ok, tree} = :fast_html.decode(content, format: [:html_atoms]) + do_extract(tree, []) + end + + @impl true + def filter(%{"type" => "Create", "object" => %{"type" => "Note", "tag" => tag}} = object) do + # image-only posts from pleroma apparently reach this MRF without the content field + content = object["object"]["content"] || "" + + mention_users = + tag + |> Enum.filter(fn tag -> tag["type"] == "Mention" end) + |> Enum.map(& &1["href"]) + |> Enum.reject(&is_nil/1) + |> Enum.map(fn ap_id_or_uri -> + case User.get_or_fetch_by_ap_id(ap_id_or_uri) do + {:ok, user} -> {ap_id_or_uri, user} + _ -> {ap_id_or_uri, User.get_by_uri(ap_id_or_uri)} + end + end) + |> Enum.reject(fn {_, user} -> user == nil end) + |> Enum.into(%{}) + + explicitly_mentioned_uris = extract_mention_uris_from_content(content) + + added_mentions = + Enum.reduce(mention_users, "", fn {uri, user}, acc -> + unless uri in explicitly_mentioned_uris do + acc <> Formatter.mention_from_user(user) + else + acc + end + end) + + content = + if added_mentions != "", + do: added_mentions <> " " <> content, + else: content + + {:ok, put_in(object["object"]["content"], content)} + end + + @impl true + def filter(object), do: {:ok, object} + + @impl true + def describe, do: {:ok, %{}} +end diff --git a/lib/pleroma/web/mastodon_api/views/instance_view.ex b/lib/pleroma/web/mastodon_api/views/instance_view.ex index f24979048..fa6c20a30 100644 --- a/lib/pleroma/web/mastodon_api/views/instance_view.ex +++ b/lib/pleroma/web/mastodon_api/views/instance_view.ex @@ -67,6 +67,9 @@ def features do "shareable_emoji_packs", "multifetch", "pleroma:api/v1/notifications:include_types_filter", + if Config.get([:activitypub, :blockers_visible]) do + "blockers_visible" + end, if Config.get([:media_proxy, :enabled]) do "media_proxy" end, diff --git a/lib/pleroma/web/templates/o_auth/mfa/totp.html.eex b/lib/pleroma/web/templates/o_auth/mfa/totp.html.eex index 29ea7c5fb..27600253c 100644 --- a/lib/pleroma/web/templates/o_auth/mfa/totp.html.eex +++ b/lib/pleroma/web/templates/o_auth/mfa/totp.html.eex @@ -10,7 +10,7 @@ <%= form_for @conn, Routes.mfa_verify_path(@conn, :verify), [as: "mfa"], fn f -> %>
<%= label f, :code, "Authentication code" %> - <%= text_input f, :code, [autocomplete: false, autocorrect: "off", autocapitalize: "off", autofocus: true, pattern: "[0-9]*", spellcheck: false] %> + <%= text_input f, :code, [autocomplete: "one-time-code", autocorrect: "off", autocapitalize: "off", autofocus: true, pattern: "[0-9]*", spellcheck: false] %> <%= hidden_input f, :mfa_token, value: @mfa_token %> <%= hidden_input f, :state, value: @state %> <%= hidden_input f, :redirect_uri, value: @redirect_uri %> diff --git a/lib/pleroma/web/templates/o_auth/o_auth/register.html.eex b/lib/pleroma/web/templates/o_auth/o_auth/register.html.eex index 99f900fb7..3ac428b2f 100644 --- a/lib/pleroma/web/templates/o_auth/o_auth/register.html.eex +++ b/lib/pleroma/web/templates/o_auth/o_auth/register.html.eex @@ -12,11 +12,11 @@
<%= label f, :nickname, "Nickname" %> - <%= text_input f, :nickname, value: @nickname %> + <%= text_input f, :nickname, value: @nickname, autocomplete: "username" %>
<%= label f, :email, "Email" %> - <%= text_input f, :email, value: @email %> + <%= text_input f, :email, value: @email, autocomplete: "email" %>
<%= submit "Proceed as new user", name: "op", value: "register" %> @@ -25,11 +25,11 @@
<%= label f, :name, "Name or email" %> - <%= text_input f, :name %> + <%= text_input f, :name, autocomplete: "username" %>
<%= label f, :password, "Password" %> - <%= password_input f, :password %> + <%= password_input f, :password, autocomplete: "password" %>
<%= submit "Proceed as existing user", name: "op", value: "connect" %> diff --git a/lib/pleroma/web/templates/o_auth/o_auth/show.html.eex b/lib/pleroma/web/templates/o_auth/o_auth/show.html.eex index 181a9519a..d63da6c1d 100644 --- a/lib/pleroma/web/templates/o_auth/o_auth/show.html.eex +++ b/lib/pleroma/web/templates/o_auth/o_auth/show.html.eex @@ -35,7 +35,7 @@

Choose carefully! You won't be able to change this later. You will be able to change your display name, though.

<%= label f, :nickname, "Pleroma Handle" %> - <%= text_input f, :nickname, placeholder: "lain" %> + <%= text_input f, :nickname, placeholder: "lain", autocomplete: "username" %>
<%= hidden_input f, :name, value: @params["name"] %> <%= hidden_input f, :password, value: @params["password"] %> diff --git a/lib/pleroma/web/templates/twitter_api/remote_follow/follow_login.html.eex b/lib/pleroma/web/templates/twitter_api/remote_follow/follow_login.html.eex index a8026fa9d..bc5fb28e3 100644 --- a/lib/pleroma/web/templates/twitter_api/remote_follow/follow_login.html.eex +++ b/lib/pleroma/web/templates/twitter_api/remote_follow/follow_login.html.eex @@ -5,9 +5,9 @@

<%= @followee.nickname %>

<%= form_for @conn, Routes.remote_follow_path(@conn, :do_follow), [as: "authorization"], fn f -> %> -<%= text_input f, :name, placeholder: "Username", required: true %> +<%= text_input f, :name, placeholder: "Username", required: true, autocomplete: "username" %>
-<%= password_input f, :password, placeholder: "Password", required: true %> +<%= password_input f, :password, placeholder: "Password", required: true, autocomplete: "password" %>
<%= hidden_input f, :id, value: @followee.id %> <%= submit "Authorize" %> diff --git a/mix.exs b/mix.exs index 62010d166..4387cb0aa 100644 --- a/mix.exs +++ b/mix.exs @@ -157,7 +157,7 @@ defp deps do {:floki, "~> 0.27"}, {:timex, "~> 3.6"}, {:ueberauth, "~> 0.4"}, - {:linkify, "~> 0.5.1"}, + {:linkify, "~> 0.5.2"}, {:http_signatures, "~> 0.1.1"}, {:telemetry, "~> 0.3"}, {:poolboy, "~> 1.5"}, diff --git a/mix.lock b/mix.lock index 05630a92e..817240538 100644 --- a/mix.lock +++ b/mix.lock @@ -69,7 +69,7 @@ "jose": {:hex, :jose, "1.11.1", "59da64010c69aad6cde2f5b9248b896b84472e99bd18f246085b7b9fe435dcdb", [:mix, :rebar3], [], "hexpm", "078f6c9fb3cd2f4cfafc972c814261a7d1e8d2b3685c0a76eb87e158efff1ac5"}, "jumper": {:hex, :jumper, "1.0.1", "3c00542ef1a83532b72269fab9f0f0c82bf23a35e27d278bfd9ed0865cecabff", [:mix], [], "hexpm", "318c59078ac220e966d27af3646026db9b5a5e6703cb2aa3e26bcfaba65b7433"}, "libring": {:hex, :libring, "1.4.0", "41246ba2f3fbc76b3971f6bce83119dfec1eee17e977a48d8a9cfaaf58c2a8d6", [:mix], [], "hexpm"}, - "linkify": {:hex, :linkify, "0.5.1", "6dc415cbc948b2f6ecec7cb226aab7ba9d3a1815bb501ae33e042334d707ecee", [:mix], [], "hexpm", "a3128c7e22fada4aa7214009501d8131e1fa3faf2f0a68b33dba379dc84ff944"}, + "linkify": {:hex, :linkify, "0.5.2", "fb66be139fdf1656ecb31f78a93592724d1b78d960a1b3598bd661013ea0e3c7", [:mix], [], "hexpm", "8d71ac690218d8952c90cbeb63cb8cc33738bb230d8a56d487d9447f2a5eab86"}, "majic": {:hex, :majic, "1.0.0", "37e50648db5f5c2ff0c9fb46454d034d11596c03683807b9fb3850676ffdaab3", [:make, :mix], [{:elixir_make, "~> 0.6.1", [hex: :elixir_make, repo: "hexpm", optional: false]}, {:mime, "~> 1.0", [hex: :mime, repo: "hexpm", optional: false]}, {:nimble_pool, "~> 0.2", [hex: :nimble_pool, repo: "hexpm", optional: false]}, {:plug, "~> 1.0", [hex: :plug, repo: "hexpm", optional: true]}], "hexpm", "7905858f76650d49695f14ea55cd9aaaee0c6654fa391671d4cf305c275a0a9e"}, "makeup": {:hex, :makeup, "1.0.5", "d5a830bc42c9800ce07dd97fa94669dfb93d3bf5fcf6ea7a0c67b2e0e4a7f26c", [:mix], [{:nimble_parsec, "~> 0.5 or ~> 1.0", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "cfa158c02d3f5c0c665d0af11512fed3fba0144cf1aadee0f2ce17747fba2ca9"}, "makeup_elixir": {:hex, :makeup_elixir, "0.14.1", "4f0e96847c63c17841d42c08107405a005a2680eb9c7ccadfd757bd31dabccfb", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}], "hexpm", "f2438b1a80eaec9ede832b5c41cd4f373b38fd7aa33e3b22d9db79e640cbde11"}, diff --git a/priv/static/index.html b/priv/static/index.html index 9ef3ad6e4..b1455c184 100644 --- a/priv/static/index.html +++ b/priv/static/index.html @@ -1 +1 @@ -
\ No newline at end of file +
\ No newline at end of file diff --git a/priv/static/static/css/app.9a4c5ede37b2f0230836.css b/priv/static/static/css/app.7d2d223f75c3a14b0991.css similarity index 85% rename from priv/static/static/css/app.9a4c5ede37b2f0230836.css rename to priv/static/static/css/app.7d2d223f75c3a14b0991.css index 22b9fdbe7..d79cf910f 100644 Binary files a/priv/static/static/css/app.9a4c5ede37b2f0230836.css and b/priv/static/static/css/app.7d2d223f75c3a14b0991.css differ diff --git a/priv/static/static/css/app.7d2d223f75c3a14b0991.css.map b/priv/static/static/css/app.7d2d223f75c3a14b0991.css.map new file mode 100644 index 000000000..ce9a6fa12 --- /dev/null +++ b/priv/static/static/css/app.7d2d223f75c3a14b0991.css.map @@ -0,0 +1 @@ +{"version":3,"sources":["webpack:///./src/components/rich_content/rich_content.scss","webpack:///./src/components/tab_switcher/tab_switcher.scss","webpack:///./src/hocs/with_load_more/with_load_more.scss"],"names":[],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,C;ACnDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,C;ACtOA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,C","file":"static/css/app.7d2d223f75c3a14b0991.css","sourcesContent":[".RichContent blockquote {\n margin: 0.2em 0 0.2em 2em;\n font-style: italic;\n}\n.RichContent pre {\n overflow: auto;\n}\n.RichContent code,\n.RichContent samp,\n.RichContent kbd,\n.RichContent var,\n.RichContent pre {\n font-family: var(--postCodeFont, monospace);\n}\n.RichContent p {\n margin: 0 0 1em 0;\n}\n.RichContent p:last-child {\n margin: 0 0 0 0;\n}\n.RichContent h1 {\n font-size: 1.1em;\n line-height: 1.2em;\n margin: 1.4em 0;\n}\n.RichContent h2 {\n font-size: 1.1em;\n margin: 1em 0;\n}\n.RichContent h3 {\n font-size: 1em;\n margin: 1.2em 0;\n}\n.RichContent h4 {\n margin: 1.1em 0;\n}\n.RichContent .img {\n display: inline-block;\n}\n.RichContent .emoji {\n display: inline-block;\n width: var(--emoji-size, 32px);\n height: var(--emoji-size, 32px);\n}\n.RichContent .img,\n.RichContent video {\n max-width: 100%;\n max-height: 400px;\n vertical-align: middle;\n -o-object-fit: contain;\n object-fit: contain;\n}",".tab-switcher {\n display: -ms-flexbox;\n display: flex;\n}\n.tab-switcher .tab-icon {\n margin: 0.2em auto;\n display: block;\n}\n.tab-switcher.top-tabs {\n -ms-flex-direction: column;\n flex-direction: column;\n}\n.tab-switcher.top-tabs > .tabs {\n width: 100%;\n overflow-y: hidden;\n overflow-x: auto;\n padding-top: 5px;\n -ms-flex-direction: row;\n flex-direction: row;\n}\n.tab-switcher.top-tabs > .tabs::after, .tab-switcher.top-tabs > .tabs::before {\n content: \"\";\n -ms-flex: 1 1 auto;\n flex: 1 1 auto;\n border-bottom: 1px solid;\n border-bottom-color: #222;\n border-bottom-color: var(--border, #222);\n}\n.tab-switcher.top-tabs > .tabs .tab-wrapper {\n height: 28px;\n}\n.tab-switcher.top-tabs > .tabs .tab-wrapper:not(.active)::after {\n left: 0;\n right: 0;\n bottom: 0;\n border-bottom: 1px solid;\n border-bottom-color: #222;\n border-bottom-color: var(--border, #222);\n}\n.tab-switcher.top-tabs > .tabs .tab {\n width: 100%;\n min-width: 1px;\n border-bottom-left-radius: 0;\n border-bottom-right-radius: 0;\n padding-bottom: 99px;\n margin-bottom: -93px;\n}\n.tab-switcher.top-tabs .contents.scrollable-tabs {\n -ms-flex-preferred-size: 0;\n flex-basis: 0;\n}\n.tab-switcher.side-tabs {\n -ms-flex-direction: row;\n flex-direction: row;\n}\n@media all and (max-width: 800px) {\n .tab-switcher.side-tabs {\n overflow-x: auto;\n }\n}\n.tab-switcher.side-tabs > .contents {\n -ms-flex: 1 1 auto;\n flex: 1 1 auto;\n}\n.tab-switcher.side-tabs > .tabs {\n -ms-flex: 0 0 auto;\n flex: 0 0 auto;\n overflow-y: auto;\n overflow-x: hidden;\n -ms-flex-direction: column;\n flex-direction: column;\n}\n.tab-switcher.side-tabs > .tabs::after, .tab-switcher.side-tabs > .tabs::before {\n -ms-flex-negative: 0;\n flex-shrink: 0;\n -ms-flex-preferred-size: 0.5em;\n flex-basis: 0.5em;\n content: \"\";\n border-right: 1px solid;\n border-right-color: #222;\n border-right-color: var(--border, #222);\n}\n.tab-switcher.side-tabs > .tabs::after {\n -ms-flex-positive: 1;\n flex-grow: 1;\n}\n.tab-switcher.side-tabs > .tabs::before {\n -ms-flex-positive: 0;\n flex-grow: 0;\n}\n.tab-switcher.side-tabs > .tabs .tab-wrapper {\n min-width: 10em;\n display: -ms-flexbox;\n display: flex;\n -ms-flex-direction: column;\n flex-direction: column;\n}\n@media all and (max-width: 800px) {\n .tab-switcher.side-tabs > .tabs .tab-wrapper {\n min-width: 4em;\n }\n}\n.tab-switcher.side-tabs > .tabs .tab-wrapper:not(.active)::after {\n top: 0;\n right: 0;\n bottom: 0;\n border-right: 1px solid;\n border-right-color: #222;\n border-right-color: var(--border, #222);\n}\n.tab-switcher.side-tabs > .tabs .tab-wrapper::before {\n -ms-flex: 0 0 6px;\n flex: 0 0 6px;\n content: \"\";\n border-right: 1px solid;\n border-right-color: #222;\n border-right-color: var(--border, #222);\n}\n.tab-switcher.side-tabs > .tabs .tab-wrapper:last-child .tab {\n margin-bottom: 0;\n}\n.tab-switcher.side-tabs > .tabs .tab {\n -ms-flex: 1;\n flex: 1;\n box-sizing: content-box;\n min-width: 10em;\n min-width: 1px;\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n padding-left: 1em;\n padding-right: calc(1em + 200px);\n margin-right: -200px;\n margin-left: 1em;\n}\n@media all and (max-width: 800px) {\n .tab-switcher.side-tabs > .tabs .tab {\n padding-left: 0.25em;\n padding-right: calc(.25em + 200px);\n margin-right: calc(.25em - 200px);\n margin-left: 0.25em;\n }\n .tab-switcher.side-tabs > .tabs .tab .text {\n display: none;\n }\n}\n.tab-switcher .contents {\n -ms-flex: 1 0 auto;\n flex: 1 0 auto;\n min-height: 0px;\n}\n.tab-switcher .contents .hidden {\n display: none;\n}\n.tab-switcher .contents .full-height:not(.hidden) {\n height: 100%;\n display: -ms-flexbox;\n display: flex;\n -ms-flex-direction: column;\n flex-direction: column;\n}\n.tab-switcher .contents .full-height:not(.hidden) > *:not(.mobile-label) {\n -ms-flex: 1;\n flex: 1;\n}\n.tab-switcher .contents.scrollable-tabs {\n overflow-y: auto;\n}\n.tab-switcher .tab {\n position: relative;\n white-space: nowrap;\n padding: 6px 1em;\n background-color: #182230;\n background-color: var(--tab, #182230);\n}\n.tab-switcher .tab, .tab-switcher .tab:active .tab-icon {\n color: #b9b9ba;\n color: var(--tabText, #b9b9ba);\n}\n.tab-switcher .tab:not(.active) {\n z-index: 4;\n}\n.tab-switcher .tab:not(.active):hover {\n z-index: 6;\n}\n.tab-switcher .tab.active {\n background: transparent;\n z-index: 5;\n color: #b9b9ba;\n color: var(--tabActiveText, #b9b9ba);\n}\n.tab-switcher .tab img {\n max-height: 26px;\n vertical-align: top;\n margin-top: -5px;\n}\n.tab-switcher .tabs {\n display: -ms-flexbox;\n display: flex;\n position: relative;\n box-sizing: border-box;\n}\n.tab-switcher .tabs::after, .tab-switcher .tabs::before {\n display: block;\n -ms-flex: 1 1 auto;\n flex: 1 1 auto;\n}\n.tab-switcher .tab-wrapper {\n position: relative;\n display: -ms-flexbox;\n display: flex;\n -ms-flex: 0 0 auto;\n flex: 0 0 auto;\n}\n.tab-switcher .tab-wrapper:not(.active)::after {\n content: \"\";\n position: absolute;\n z-index: 7;\n}\n.tab-switcher .mobile-label {\n padding-left: 0.3em;\n padding-bottom: 0.25em;\n margin-top: 0.5em;\n margin-left: 0.2em;\n margin-bottom: 0.25em;\n border-bottom: 1px solid var(--border, #222);\n}\n@media all and (min-width: 800px) {\n .tab-switcher .mobile-label {\n display: none;\n }\n}",".with-load-more-footer {\n padding: 10px;\n text-align: center;\n border-top: 1px solid;\n border-top-color: #222;\n border-top-color: var(--border, #222);\n}\n.with-load-more-footer .error {\n font-size: 14px;\n}\n.with-load-more-footer a {\n cursor: pointer;\n}"],"sourceRoot":""} \ No newline at end of file diff --git a/priv/static/static/css/app.9a4c5ede37b2f0230836.css.map b/priv/static/static/css/app.9a4c5ede37b2f0230836.css.map deleted file mode 100644 index f54bd9ee6..000000000 --- a/priv/static/static/css/app.9a4c5ede37b2f0230836.css.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["webpack:///./src/components/tab_switcher/tab_switcher.scss","webpack:///./src/hocs/with_load_more/with_load_more.scss"],"names":[],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,C;ACtOA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,C","file":"static/css/app.9a4c5ede37b2f0230836.css","sourcesContent":[".tab-switcher {\n display: -ms-flexbox;\n display: flex;\n}\n.tab-switcher .tab-icon {\n margin: 0.2em auto;\n display: block;\n}\n.tab-switcher.top-tabs {\n -ms-flex-direction: column;\n flex-direction: column;\n}\n.tab-switcher.top-tabs > .tabs {\n width: 100%;\n overflow-y: hidden;\n overflow-x: auto;\n padding-top: 5px;\n -ms-flex-direction: row;\n flex-direction: row;\n}\n.tab-switcher.top-tabs > .tabs::after, .tab-switcher.top-tabs > .tabs::before {\n content: \"\";\n -ms-flex: 1 1 auto;\n flex: 1 1 auto;\n border-bottom: 1px solid;\n border-bottom-color: #222;\n border-bottom-color: var(--border, #222);\n}\n.tab-switcher.top-tabs > .tabs .tab-wrapper {\n height: 28px;\n}\n.tab-switcher.top-tabs > .tabs .tab-wrapper:not(.active)::after {\n left: 0;\n right: 0;\n bottom: 0;\n border-bottom: 1px solid;\n border-bottom-color: #222;\n border-bottom-color: var(--border, #222);\n}\n.tab-switcher.top-tabs > .tabs .tab {\n width: 100%;\n min-width: 1px;\n border-bottom-left-radius: 0;\n border-bottom-right-radius: 0;\n padding-bottom: 99px;\n margin-bottom: -93px;\n}\n.tab-switcher.top-tabs .contents.scrollable-tabs {\n -ms-flex-preferred-size: 0;\n flex-basis: 0;\n}\n.tab-switcher.side-tabs {\n -ms-flex-direction: row;\n flex-direction: row;\n}\n@media all and (max-width: 800px) {\n .tab-switcher.side-tabs {\n overflow-x: auto;\n }\n}\n.tab-switcher.side-tabs > .contents {\n -ms-flex: 1 1 auto;\n flex: 1 1 auto;\n}\n.tab-switcher.side-tabs > .tabs {\n -ms-flex: 0 0 auto;\n flex: 0 0 auto;\n overflow-y: auto;\n overflow-x: hidden;\n -ms-flex-direction: column;\n flex-direction: column;\n}\n.tab-switcher.side-tabs > .tabs::after, .tab-switcher.side-tabs > .tabs::before {\n -ms-flex-negative: 0;\n flex-shrink: 0;\n -ms-flex-preferred-size: 0.5em;\n flex-basis: 0.5em;\n content: \"\";\n border-right: 1px solid;\n border-right-color: #222;\n border-right-color: var(--border, #222);\n}\n.tab-switcher.side-tabs > .tabs::after {\n -ms-flex-positive: 1;\n flex-grow: 1;\n}\n.tab-switcher.side-tabs > .tabs::before {\n -ms-flex-positive: 0;\n flex-grow: 0;\n}\n.tab-switcher.side-tabs > .tabs .tab-wrapper {\n min-width: 10em;\n display: -ms-flexbox;\n display: flex;\n -ms-flex-direction: column;\n flex-direction: column;\n}\n@media all and (max-width: 800px) {\n .tab-switcher.side-tabs > .tabs .tab-wrapper {\n min-width: 4em;\n }\n}\n.tab-switcher.side-tabs > .tabs .tab-wrapper:not(.active)::after {\n top: 0;\n right: 0;\n bottom: 0;\n border-right: 1px solid;\n border-right-color: #222;\n border-right-color: var(--border, #222);\n}\n.tab-switcher.side-tabs > .tabs .tab-wrapper::before {\n -ms-flex: 0 0 6px;\n flex: 0 0 6px;\n content: \"\";\n border-right: 1px solid;\n border-right-color: #222;\n border-right-color: var(--border, #222);\n}\n.tab-switcher.side-tabs > .tabs .tab-wrapper:last-child .tab {\n margin-bottom: 0;\n}\n.tab-switcher.side-tabs > .tabs .tab {\n -ms-flex: 1;\n flex: 1;\n box-sizing: content-box;\n min-width: 10em;\n min-width: 1px;\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n padding-left: 1em;\n padding-right: calc(1em + 200px);\n margin-right: -200px;\n margin-left: 1em;\n}\n@media all and (max-width: 800px) {\n .tab-switcher.side-tabs > .tabs .tab {\n padding-left: 0.25em;\n padding-right: calc(.25em + 200px);\n margin-right: calc(.25em - 200px);\n margin-left: 0.25em;\n }\n .tab-switcher.side-tabs > .tabs .tab .text {\n display: none;\n }\n}\n.tab-switcher .contents {\n -ms-flex: 1 0 auto;\n flex: 1 0 auto;\n min-height: 0px;\n}\n.tab-switcher .contents .hidden {\n display: none;\n}\n.tab-switcher .contents .full-height:not(.hidden) {\n height: 100%;\n display: -ms-flexbox;\n display: flex;\n -ms-flex-direction: column;\n flex-direction: column;\n}\n.tab-switcher .contents .full-height:not(.hidden) > *:not(.mobile-label) {\n -ms-flex: 1;\n flex: 1;\n}\n.tab-switcher .contents.scrollable-tabs {\n overflow-y: auto;\n}\n.tab-switcher .tab {\n position: relative;\n white-space: nowrap;\n padding: 6px 1em;\n background-color: #182230;\n background-color: var(--tab, #182230);\n}\n.tab-switcher .tab, .tab-switcher .tab:active .tab-icon {\n color: #b9b9ba;\n color: var(--tabText, #b9b9ba);\n}\n.tab-switcher .tab:not(.active) {\n z-index: 4;\n}\n.tab-switcher .tab:not(.active):hover {\n z-index: 6;\n}\n.tab-switcher .tab.active {\n background: transparent;\n z-index: 5;\n color: #b9b9ba;\n color: var(--tabActiveText, #b9b9ba);\n}\n.tab-switcher .tab img {\n max-height: 26px;\n vertical-align: top;\n margin-top: -5px;\n}\n.tab-switcher .tabs {\n display: -ms-flexbox;\n display: flex;\n position: relative;\n box-sizing: border-box;\n}\n.tab-switcher .tabs::after, .tab-switcher .tabs::before {\n display: block;\n -ms-flex: 1 1 auto;\n flex: 1 1 auto;\n}\n.tab-switcher .tab-wrapper {\n position: relative;\n display: -ms-flexbox;\n display: flex;\n -ms-flex: 0 0 auto;\n flex: 0 0 auto;\n}\n.tab-switcher .tab-wrapper:not(.active)::after {\n content: \"\";\n position: absolute;\n z-index: 7;\n}\n.tab-switcher .mobile-label {\n padding-left: 0.3em;\n padding-bottom: 0.25em;\n margin-top: 0.5em;\n margin-left: 0.2em;\n margin-bottom: 0.25em;\n border-bottom: 1px solid var(--border, #222);\n}\n@media all and (min-width: 800px) {\n .tab-switcher .mobile-label {\n display: none;\n }\n}",".with-load-more-footer {\n padding: 10px;\n text-align: center;\n border-top: 1px solid;\n border-top-color: #222;\n border-top-color: var(--border, #222);\n}\n.with-load-more-footer .error {\n font-size: 14px;\n}\n.with-load-more-footer a {\n cursor: pointer;\n}"],"sourceRoot":""} \ No newline at end of file diff --git a/priv/static/static/js/10.02ffbc25214f297f720f.js b/priv/static/static/js/10.02ffbc25214f297f720f.js new file mode 100644 index 000000000..fbe426710 Binary files /dev/null and b/priv/static/static/js/10.02ffbc25214f297f720f.js differ diff --git a/priv/static/static/js/11.7b11fd75fe61d6e10ac6.js.map b/priv/static/static/js/10.02ffbc25214f297f720f.js.map similarity index 56% rename from priv/static/static/js/11.7b11fd75fe61d6e10ac6.js.map rename to priv/static/static/js/10.02ffbc25214f297f720f.js.map index f5b9efef8..6b230613d 100644 Binary files a/priv/static/static/js/11.7b11fd75fe61d6e10ac6.js.map and b/priv/static/static/js/10.02ffbc25214f297f720f.js.map differ diff --git a/priv/static/static/js/10.fdbf093cc5602ca4f2e1.js b/priv/static/static/js/10.fdbf093cc5602ca4f2e1.js deleted file mode 100644 index 966332053..000000000 Binary files a/priv/static/static/js/10.fdbf093cc5602ca4f2e1.js and /dev/null differ diff --git a/priv/static/static/js/11.7b11fd75fe61d6e10ac6.js b/priv/static/static/js/11.c173c6036fb3af5581b3.js similarity index 99% rename from priv/static/static/js/11.7b11fd75fe61d6e10ac6.js rename to priv/static/static/js/11.c173c6036fb3af5581b3.js index 2e39538d0..b693d4c53 100644 Binary files a/priv/static/static/js/11.7b11fd75fe61d6e10ac6.js and b/priv/static/static/js/11.c173c6036fb3af5581b3.js differ diff --git a/priv/static/static/js/12.a3dc3473565ec07a88c2.js.map b/priv/static/static/js/11.c173c6036fb3af5581b3.js.map similarity index 56% rename from priv/static/static/js/12.a3dc3473565ec07a88c2.js.map rename to priv/static/static/js/11.c173c6036fb3af5581b3.js.map index 7b8fe89ac..6fc07fd8a 100644 Binary files a/priv/static/static/js/12.a3dc3473565ec07a88c2.js.map and b/priv/static/static/js/11.c173c6036fb3af5581b3.js.map differ diff --git a/priv/static/static/js/12.5ca41e245bb40263bc7f.js b/priv/static/static/js/12.5ca41e245bb40263bc7f.js new file mode 100644 index 000000000..a22fcc522 Binary files /dev/null and b/priv/static/static/js/12.5ca41e245bb40263bc7f.js differ diff --git a/priv/static/static/js/13.cdc076533397e24391bc.js.map b/priv/static/static/js/12.5ca41e245bb40263bc7f.js.map similarity index 56% rename from priv/static/static/js/13.cdc076533397e24391bc.js.map rename to priv/static/static/js/12.5ca41e245bb40263bc7f.js.map index 19b1f31f8..762172484 100644 Binary files a/priv/static/static/js/13.cdc076533397e24391bc.js.map and b/priv/static/static/js/12.5ca41e245bb40263bc7f.js.map differ diff --git a/priv/static/static/js/12.a3dc3473565ec07a88c2.js b/priv/static/static/js/12.a3dc3473565ec07a88c2.js deleted file mode 100644 index ad6414e72..000000000 Binary files a/priv/static/static/js/12.a3dc3473565ec07a88c2.js and /dev/null differ diff --git a/priv/static/static/js/13.cdc076533397e24391bc.js b/priv/static/static/js/13.99621e6c47936075b44d.js similarity index 76% rename from priv/static/static/js/13.cdc076533397e24391bc.js rename to priv/static/static/js/13.99621e6c47936075b44d.js index 6819297a8..ef26b927b 100644 Binary files a/priv/static/static/js/13.cdc076533397e24391bc.js and b/priv/static/static/js/13.99621e6c47936075b44d.js differ diff --git a/priv/static/static/js/10.fdbf093cc5602ca4f2e1.js.map b/priv/static/static/js/13.99621e6c47936075b44d.js.map similarity index 56% rename from priv/static/static/js/10.fdbf093cc5602ca4f2e1.js.map rename to priv/static/static/js/13.99621e6c47936075b44d.js.map index 978f9e54d..eb79bff03 100644 Binary files a/priv/static/static/js/10.fdbf093cc5602ca4f2e1.js.map and b/priv/static/static/js/13.99621e6c47936075b44d.js.map differ diff --git a/priv/static/static/js/14.4e05e7c284119777ecc5.js b/priv/static/static/js/14.4e05e7c284119777ecc5.js new file mode 100644 index 000000000..6f5728bf6 Binary files /dev/null and b/priv/static/static/js/14.4e05e7c284119777ecc5.js differ diff --git a/priv/static/static/js/14.4e05e7c284119777ecc5.js.map b/priv/static/static/js/14.4e05e7c284119777ecc5.js.map new file mode 100644 index 000000000..d219c6115 Binary files /dev/null and b/priv/static/static/js/14.4e05e7c284119777ecc5.js.map differ diff --git a/priv/static/static/js/14.a2b9acaf9caa95d1fd7f.js b/priv/static/static/js/14.a2b9acaf9caa95d1fd7f.js deleted file mode 100644 index 9111373a2..000000000 Binary files a/priv/static/static/js/14.a2b9acaf9caa95d1fd7f.js and /dev/null differ diff --git a/priv/static/static/js/14.a2b9acaf9caa95d1fd7f.js.map b/priv/static/static/js/14.a2b9acaf9caa95d1fd7f.js.map deleted file mode 100644 index c1a2c983f..000000000 Binary files a/priv/static/static/js/14.a2b9acaf9caa95d1fd7f.js.map and /dev/null differ diff --git a/priv/static/static/js/15.fe4e76f27cc478289a42.js b/priv/static/static/js/15.23f179cc3adc903bb537.js similarity index 98% rename from priv/static/static/js/15.fe4e76f27cc478289a42.js rename to priv/static/static/js/15.23f179cc3adc903bb537.js index 3005c67b3..d87608e34 100644 Binary files a/priv/static/static/js/15.fe4e76f27cc478289a42.js and b/priv/static/static/js/15.23f179cc3adc903bb537.js differ diff --git a/priv/static/static/js/15.23f179cc3adc903bb537.js.map b/priv/static/static/js/15.23f179cc3adc903bb537.js.map new file mode 100644 index 000000000..15811ea18 Binary files /dev/null and b/priv/static/static/js/15.23f179cc3adc903bb537.js.map differ diff --git a/priv/static/static/js/15.fe4e76f27cc478289a42.js.map b/priv/static/static/js/15.fe4e76f27cc478289a42.js.map deleted file mode 100644 index 7177387b7..000000000 Binary files a/priv/static/static/js/15.fe4e76f27cc478289a42.js.map and /dev/null differ diff --git a/priv/static/static/js/16.90b5ee380da41d6d061c.js b/priv/static/static/js/16.43dd2c64dcb160dd96a6.js similarity index 81% rename from priv/static/static/js/16.90b5ee380da41d6d061c.js rename to priv/static/static/js/16.43dd2c64dcb160dd96a6.js index f3a4fadd4..abed0132f 100644 Binary files a/priv/static/static/js/16.90b5ee380da41d6d061c.js and b/priv/static/static/js/16.43dd2c64dcb160dd96a6.js differ diff --git a/priv/static/static/js/16.43dd2c64dcb160dd96a6.js.map b/priv/static/static/js/16.43dd2c64dcb160dd96a6.js.map new file mode 100644 index 000000000..20ab38e81 Binary files /dev/null and b/priv/static/static/js/16.43dd2c64dcb160dd96a6.js.map differ diff --git a/priv/static/static/js/16.90b5ee380da41d6d061c.js.map b/priv/static/static/js/16.90b5ee380da41d6d061c.js.map deleted file mode 100644 index f69273c5c..000000000 Binary files a/priv/static/static/js/16.90b5ee380da41d6d061c.js.map and /dev/null differ diff --git a/priv/static/static/js/17.c5a6513076aa9c5a9564.js.map b/priv/static/static/js/17.c5a6513076aa9c5a9564.js.map deleted file mode 100644 index f2ac5ef45..000000000 Binary files a/priv/static/static/js/17.c5a6513076aa9c5a9564.js.map and /dev/null differ diff --git a/priv/static/static/js/17.c5a6513076aa9c5a9564.js b/priv/static/static/js/17.d1deeeb81b7cab98b068.js similarity index 94% rename from priv/static/static/js/17.c5a6513076aa9c5a9564.js rename to priv/static/static/js/17.d1deeeb81b7cab98b068.js index 74c623294..519a6e2bd 100644 Binary files a/priv/static/static/js/17.c5a6513076aa9c5a9564.js and b/priv/static/static/js/17.d1deeeb81b7cab98b068.js differ diff --git a/priv/static/static/js/17.d1deeeb81b7cab98b068.js.map b/priv/static/static/js/17.d1deeeb81b7cab98b068.js.map new file mode 100644 index 000000000..156fad930 Binary files /dev/null and b/priv/static/static/js/17.d1deeeb81b7cab98b068.js.map differ diff --git a/priv/static/static/js/18.a4d5b399e228a6a45a7b.js b/priv/static/static/js/18.a4d5b399e228a6a45a7b.js new file mode 100644 index 000000000..1b17be977 Binary files /dev/null and b/priv/static/static/js/18.a4d5b399e228a6a45a7b.js differ diff --git a/priv/static/static/js/18.a4d5b399e228a6a45a7b.js.map b/priv/static/static/js/18.a4d5b399e228a6a45a7b.js.map new file mode 100644 index 000000000..5e5264405 Binary files /dev/null and b/priv/static/static/js/18.a4d5b399e228a6a45a7b.js.map differ diff --git a/priv/static/static/js/18.ffde79cfe78615dbb020.js b/priv/static/static/js/18.ffde79cfe78615dbb020.js deleted file mode 100644 index 7dab8a63d..000000000 Binary files a/priv/static/static/js/18.ffde79cfe78615dbb020.js and /dev/null differ diff --git a/priv/static/static/js/18.ffde79cfe78615dbb020.js.map b/priv/static/static/js/18.ffde79cfe78615dbb020.js.map deleted file mode 100644 index 21c9fcc95..000000000 Binary files a/priv/static/static/js/18.ffde79cfe78615dbb020.js.map and /dev/null differ diff --git a/priv/static/static/js/19.c031807287d659bd841d.js.map b/priv/static/static/js/19.c031807287d659bd841d.js.map deleted file mode 100644 index 4a5527aae..000000000 Binary files a/priv/static/static/js/19.c031807287d659bd841d.js.map and /dev/null differ diff --git a/priv/static/static/js/19.c031807287d659bd841d.js b/priv/static/static/js/19.e513835c3274271258fa.js similarity index 83% rename from priv/static/static/js/19.c031807287d659bd841d.js rename to priv/static/static/js/19.e513835c3274271258fa.js index 8664e0814..1a4c2d230 100644 Binary files a/priv/static/static/js/19.c031807287d659bd841d.js and b/priv/static/static/js/19.e513835c3274271258fa.js differ diff --git a/priv/static/static/js/19.e513835c3274271258fa.js.map b/priv/static/static/js/19.e513835c3274271258fa.js.map new file mode 100644 index 000000000..d92c8eeac Binary files /dev/null and b/priv/static/static/js/19.e513835c3274271258fa.js.map differ diff --git a/priv/static/static/js/2.5f3ceb7bdf08fadacf00.js b/priv/static/static/js/2.5f3ceb7bdf08fadacf00.js deleted file mode 100644 index 31ef2f0ac..000000000 Binary files a/priv/static/static/js/2.5f3ceb7bdf08fadacf00.js and /dev/null differ diff --git a/priv/static/static/js/2.5f3ceb7bdf08fadacf00.js.map b/priv/static/static/js/2.5f3ceb7bdf08fadacf00.js.map deleted file mode 100644 index 06d872608..000000000 Binary files a/priv/static/static/js/2.5f3ceb7bdf08fadacf00.js.map and /dev/null differ diff --git a/priv/static/static/js/2.fec2056b00b4fa3921ba.js b/priv/static/static/js/2.fec2056b00b4fa3921ba.js new file mode 100644 index 000000000..483720e2f Binary files /dev/null and b/priv/static/static/js/2.fec2056b00b4fa3921ba.js differ diff --git a/priv/static/static/js/2.fec2056b00b4fa3921ba.js.map b/priv/static/static/js/2.fec2056b00b4fa3921ba.js.map new file mode 100644 index 000000000..31d328177 Binary files /dev/null and b/priv/static/static/js/2.fec2056b00b4fa3921ba.js.map differ diff --git a/priv/static/static/js/20.abb0d332055536a87c38.js b/priv/static/static/js/20.683b112f4dcea887f707.js similarity index 78% rename from priv/static/static/js/20.abb0d332055536a87c38.js rename to priv/static/static/js/20.683b112f4dcea887f707.js index 2d92fdfbd..726530149 100644 Binary files a/priv/static/static/js/20.abb0d332055536a87c38.js and b/priv/static/static/js/20.683b112f4dcea887f707.js differ diff --git a/priv/static/static/js/20.683b112f4dcea887f707.js.map b/priv/static/static/js/20.683b112f4dcea887f707.js.map new file mode 100644 index 000000000..094f913db Binary files /dev/null and b/priv/static/static/js/20.683b112f4dcea887f707.js.map differ diff --git a/priv/static/static/js/20.abb0d332055536a87c38.js.map b/priv/static/static/js/20.abb0d332055536a87c38.js.map deleted file mode 100644 index 55c20779e..000000000 Binary files a/priv/static/static/js/20.abb0d332055536a87c38.js.map and /dev/null differ diff --git a/priv/static/static/js/21.6e952388ef8d5a0276dc.js.map b/priv/static/static/js/21.6e952388ef8d5a0276dc.js.map deleted file mode 100644 index 22d29b80c..000000000 Binary files a/priv/static/static/js/21.6e952388ef8d5a0276dc.js.map and /dev/null differ diff --git a/priv/static/static/js/21.6e952388ef8d5a0276dc.js b/priv/static/static/js/21.b2844ccdcfc3c8191e8e.js similarity index 77% rename from priv/static/static/js/21.6e952388ef8d5a0276dc.js rename to priv/static/static/js/21.b2844ccdcfc3c8191e8e.js index 27ab1f65e..c363a2197 100644 Binary files a/priv/static/static/js/21.6e952388ef8d5a0276dc.js and b/priv/static/static/js/21.b2844ccdcfc3c8191e8e.js differ diff --git a/priv/static/static/js/21.b2844ccdcfc3c8191e8e.js.map b/priv/static/static/js/21.b2844ccdcfc3c8191e8e.js.map new file mode 100644 index 000000000..b5b25eb31 Binary files /dev/null and b/priv/static/static/js/21.b2844ccdcfc3c8191e8e.js.map differ diff --git a/priv/static/static/js/22.dbc79965f66b0bb62d88.js b/priv/static/static/js/22.68c0a771d79e3383f5e8.js similarity index 84% rename from priv/static/static/js/22.dbc79965f66b0bb62d88.js rename to priv/static/static/js/22.68c0a771d79e3383f5e8.js index 88a0e51b5..f982b241b 100644 Binary files a/priv/static/static/js/22.dbc79965f66b0bb62d88.js and b/priv/static/static/js/22.68c0a771d79e3383f5e8.js differ diff --git a/priv/static/static/js/22.68c0a771d79e3383f5e8.js.map b/priv/static/static/js/22.68c0a771d79e3383f5e8.js.map new file mode 100644 index 000000000..10a44dd2e Binary files /dev/null and b/priv/static/static/js/22.68c0a771d79e3383f5e8.js.map differ diff --git a/priv/static/static/js/22.dbc79965f66b0bb62d88.js.map b/priv/static/static/js/22.dbc79965f66b0bb62d88.js.map deleted file mode 100644 index a43e0a6b4..000000000 Binary files a/priv/static/static/js/22.dbc79965f66b0bb62d88.js.map and /dev/null differ diff --git a/priv/static/static/js/23.4addb03e0862c780c55f.js b/priv/static/static/js/23.0b6cdf4c9dc52c4291c0.js similarity index 70% rename from priv/static/static/js/23.4addb03e0862c780c55f.js rename to priv/static/static/js/23.0b6cdf4c9dc52c4291c0.js index 40d2fb0b3..3d6701989 100644 Binary files a/priv/static/static/js/23.4addb03e0862c780c55f.js and b/priv/static/static/js/23.0b6cdf4c9dc52c4291c0.js differ diff --git a/priv/static/static/js/23.0b6cdf4c9dc52c4291c0.js.map b/priv/static/static/js/23.0b6cdf4c9dc52c4291c0.js.map new file mode 100644 index 000000000..f5200b9dc Binary files /dev/null and b/priv/static/static/js/23.0b6cdf4c9dc52c4291c0.js.map differ diff --git a/priv/static/static/js/23.4addb03e0862c780c55f.js.map b/priv/static/static/js/23.4addb03e0862c780c55f.js.map deleted file mode 100644 index 3ab3410ee..000000000 Binary files a/priv/static/static/js/23.4addb03e0862c780c55f.js.map and /dev/null differ diff --git a/priv/static/static/js/24.e4b623be1780a14a6168.js b/priv/static/static/js/24.5cfb87799bd882b933dd.js similarity index 87% rename from priv/static/static/js/24.e4b623be1780a14a6168.js rename to priv/static/static/js/24.5cfb87799bd882b933dd.js index eadbce6d5..811c4fa52 100644 Binary files a/priv/static/static/js/24.e4b623be1780a14a6168.js and b/priv/static/static/js/24.5cfb87799bd882b933dd.js differ diff --git a/priv/static/static/js/24.5cfb87799bd882b933dd.js.map b/priv/static/static/js/24.5cfb87799bd882b933dd.js.map new file mode 100644 index 000000000..c03306f8a Binary files /dev/null and b/priv/static/static/js/24.5cfb87799bd882b933dd.js.map differ diff --git a/priv/static/static/js/24.e4b623be1780a14a6168.js.map b/priv/static/static/js/24.e4b623be1780a14a6168.js.map deleted file mode 100644 index 5a1291203..000000000 Binary files a/priv/static/static/js/24.e4b623be1780a14a6168.js.map and /dev/null differ diff --git a/priv/static/static/js/25.34eeae0070f7f1eb6843.js b/priv/static/static/js/25.34eeae0070f7f1eb6843.js deleted file mode 100644 index 92130ae8e..000000000 Binary files a/priv/static/static/js/25.34eeae0070f7f1eb6843.js and /dev/null differ diff --git a/priv/static/static/js/25.34eeae0070f7f1eb6843.js.map b/priv/static/static/js/25.34eeae0070f7f1eb6843.js.map deleted file mode 100644 index 2af21b09b..000000000 Binary files a/priv/static/static/js/25.34eeae0070f7f1eb6843.js.map and /dev/null differ diff --git a/priv/static/static/js/25.8185e4d775cea9fe47e1.js b/priv/static/static/js/25.8185e4d775cea9fe47e1.js new file mode 100644 index 000000000..ca0e22957 Binary files /dev/null and b/priv/static/static/js/25.8185e4d775cea9fe47e1.js differ diff --git a/priv/static/static/js/25.8185e4d775cea9fe47e1.js.map b/priv/static/static/js/25.8185e4d775cea9fe47e1.js.map new file mode 100644 index 000000000..d559ea56b Binary files /dev/null and b/priv/static/static/js/25.8185e4d775cea9fe47e1.js.map differ diff --git a/priv/static/static/js/26.bd86a0d958de2bb3905a.js b/priv/static/static/js/26.34ec129dd8f860ce4a8e.js similarity index 73% rename from priv/static/static/js/26.bd86a0d958de2bb3905a.js rename to priv/static/static/js/26.34ec129dd8f860ce4a8e.js index 64c5db6ed..797021577 100644 Binary files a/priv/static/static/js/26.bd86a0d958de2bb3905a.js and b/priv/static/static/js/26.34ec129dd8f860ce4a8e.js differ diff --git a/priv/static/static/js/26.34ec129dd8f860ce4a8e.js.map b/priv/static/static/js/26.34ec129dd8f860ce4a8e.js.map new file mode 100644 index 000000000..abff4e927 Binary files /dev/null and b/priv/static/static/js/26.34ec129dd8f860ce4a8e.js.map differ diff --git a/priv/static/static/js/26.bd86a0d958de2bb3905a.js.map b/priv/static/static/js/26.bd86a0d958de2bb3905a.js.map deleted file mode 100644 index a2e972c31..000000000 Binary files a/priv/static/static/js/26.bd86a0d958de2bb3905a.js.map and /dev/null differ diff --git a/priv/static/static/js/27.7d4ab8716762d6f57135.js b/priv/static/static/js/27.0f4a5145681cfb5a896e.js similarity index 94% rename from priv/static/static/js/27.7d4ab8716762d6f57135.js rename to priv/static/static/js/27.0f4a5145681cfb5a896e.js index 95a37be1f..5df92f6ad 100644 Binary files a/priv/static/static/js/27.7d4ab8716762d6f57135.js and b/priv/static/static/js/27.0f4a5145681cfb5a896e.js differ diff --git a/priv/static/static/js/27.0f4a5145681cfb5a896e.js.map b/priv/static/static/js/27.0f4a5145681cfb5a896e.js.map new file mode 100644 index 000000000..da741bf41 Binary files /dev/null and b/priv/static/static/js/27.0f4a5145681cfb5a896e.js.map differ diff --git a/priv/static/static/js/27.7d4ab8716762d6f57135.js.map b/priv/static/static/js/27.7d4ab8716762d6f57135.js.map deleted file mode 100644 index b9b2aa6e1..000000000 Binary files a/priv/static/static/js/27.7d4ab8716762d6f57135.js.map and /dev/null differ diff --git a/priv/static/static/js/28.a88999ebb3f7ec930aad.js b/priv/static/static/js/28.75c01cd71372c39d5af8.js similarity index 75% rename from priv/static/static/js/28.a88999ebb3f7ec930aad.js rename to priv/static/static/js/28.75c01cd71372c39d5af8.js index 423aebca9..63067ea18 100644 Binary files a/priv/static/static/js/28.a88999ebb3f7ec930aad.js and b/priv/static/static/js/28.75c01cd71372c39d5af8.js differ diff --git a/priv/static/static/js/28.75c01cd71372c39d5af8.js.map b/priv/static/static/js/28.75c01cd71372c39d5af8.js.map new file mode 100644 index 000000000..4b21e788e Binary files /dev/null and b/priv/static/static/js/28.75c01cd71372c39d5af8.js.map differ diff --git a/priv/static/static/js/28.a88999ebb3f7ec930aad.js.map b/priv/static/static/js/28.a88999ebb3f7ec930aad.js.map deleted file mode 100644 index d67ecaec2..000000000 Binary files a/priv/static/static/js/28.a88999ebb3f7ec930aad.js.map and /dev/null differ diff --git a/priv/static/static/js/29.519f681d194c212ae75f.js.map b/priv/static/static/js/29.519f681d194c212ae75f.js.map deleted file mode 100644 index e9c22ff88..000000000 Binary files a/priv/static/static/js/29.519f681d194c212ae75f.js.map and /dev/null differ diff --git a/priv/static/static/js/29.519f681d194c212ae75f.js b/priv/static/static/js/29.b53cf1f3bcece005d78a.js similarity index 93% rename from priv/static/static/js/29.519f681d194c212ae75f.js rename to priv/static/static/js/29.b53cf1f3bcece005d78a.js index aa2571733..3b357be95 100644 Binary files a/priv/static/static/js/29.519f681d194c212ae75f.js and b/priv/static/static/js/29.b53cf1f3bcece005d78a.js differ diff --git a/priv/static/static/js/29.b53cf1f3bcece005d78a.js.map b/priv/static/static/js/29.b53cf1f3bcece005d78a.js.map new file mode 100644 index 000000000..f3d6781f8 Binary files /dev/null and b/priv/static/static/js/29.b53cf1f3bcece005d78a.js.map differ diff --git a/priv/static/static/js/3.6c8e014d70907359ad5a.js b/priv/static/static/js/3.bde677e65143f0cd1105.js similarity index 99% rename from priv/static/static/js/3.6c8e014d70907359ad5a.js rename to priv/static/static/js/3.bde677e65143f0cd1105.js index 8c925ea7c..4bea37abd 100644 Binary files a/priv/static/static/js/3.6c8e014d70907359ad5a.js and b/priv/static/static/js/3.bde677e65143f0cd1105.js differ diff --git a/priv/static/static/js/3.6c8e014d70907359ad5a.js.map b/priv/static/static/js/3.bde677e65143f0cd1105.js.map similarity index 99% rename from priv/static/static/js/3.6c8e014d70907359ad5a.js.map rename to priv/static/static/js/3.bde677e65143f0cd1105.js.map index 81ea16cd3..06d4fc3d0 100644 Binary files a/priv/static/static/js/3.6c8e014d70907359ad5a.js.map and b/priv/static/static/js/3.bde677e65143f0cd1105.js.map differ diff --git a/priv/static/static/js/30.064c236fa83ac21c252f.js b/priv/static/static/js/30.064c236fa83ac21c252f.js new file mode 100644 index 000000000..40d81fbfd Binary files /dev/null and b/priv/static/static/js/30.064c236fa83ac21c252f.js differ diff --git a/priv/static/static/js/30.064c236fa83ac21c252f.js.map b/priv/static/static/js/30.064c236fa83ac21c252f.js.map new file mode 100644 index 000000000..4d0d88ca9 Binary files /dev/null and b/priv/static/static/js/30.064c236fa83ac21c252f.js.map differ diff --git a/priv/static/static/js/30.d29cd76b0781bb654f87.js b/priv/static/static/js/30.d29cd76b0781bb654f87.js deleted file mode 100644 index f681595c7..000000000 Binary files a/priv/static/static/js/30.d29cd76b0781bb654f87.js and /dev/null differ diff --git a/priv/static/static/js/30.d29cd76b0781bb654f87.js.map b/priv/static/static/js/30.d29cd76b0781bb654f87.js.map deleted file mode 100644 index dbf01dc8d..000000000 Binary files a/priv/static/static/js/30.d29cd76b0781bb654f87.js.map and /dev/null differ diff --git a/priv/static/static/js/31.15b545bb42e21d39c678.js b/priv/static/static/js/31.15b545bb42e21d39c678.js deleted file mode 100644 index 3c5d8089e..000000000 Binary files a/priv/static/static/js/31.15b545bb42e21d39c678.js and /dev/null differ diff --git a/priv/static/static/js/31.15b545bb42e21d39c678.js.map b/priv/static/static/js/31.15b545bb42e21d39c678.js.map deleted file mode 100644 index b56a26768..000000000 Binary files a/priv/static/static/js/31.15b545bb42e21d39c678.js.map and /dev/null differ diff --git a/priv/static/static/js/31.226f7a848d733df38095.js b/priv/static/static/js/31.226f7a848d733df38095.js new file mode 100644 index 000000000..48131f952 Binary files /dev/null and b/priv/static/static/js/31.226f7a848d733df38095.js differ diff --git a/priv/static/static/js/31.226f7a848d733df38095.js.map b/priv/static/static/js/31.226f7a848d733df38095.js.map new file mode 100644 index 000000000..3d85d770f Binary files /dev/null and b/priv/static/static/js/31.226f7a848d733df38095.js.map differ diff --git a/priv/static/static/js/32.19ca50edbb4d711838dc.js b/priv/static/static/js/32.19ca50edbb4d711838dc.js new file mode 100644 index 000000000..81bd5064f Binary files /dev/null and b/priv/static/static/js/32.19ca50edbb4d711838dc.js differ diff --git a/priv/static/static/js/32.19ca50edbb4d711838dc.js.map b/priv/static/static/js/32.19ca50edbb4d711838dc.js.map new file mode 100644 index 000000000..99ad6e050 Binary files /dev/null and b/priv/static/static/js/32.19ca50edbb4d711838dc.js.map differ diff --git a/priv/static/static/js/32.899035ede0115c5c0f99.js b/priv/static/static/js/32.899035ede0115c5c0f99.js deleted file mode 100644 index 6faf5ed33..000000000 Binary files a/priv/static/static/js/32.899035ede0115c5c0f99.js and /dev/null differ diff --git a/priv/static/static/js/32.899035ede0115c5c0f99.js.map b/priv/static/static/js/32.899035ede0115c5c0f99.js.map deleted file mode 100644 index 242f78de5..000000000 Binary files a/priv/static/static/js/32.899035ede0115c5c0f99.js.map and /dev/null differ diff --git a/priv/static/static/js/4.564b2a8cbfe4d5e93949.js b/priv/static/static/js/4.7077bff64d63355b1635.js similarity index 77% rename from priv/static/static/js/4.564b2a8cbfe4d5e93949.js rename to priv/static/static/js/4.7077bff64d63355b1635.js index eb8241c90..cb97d3855 100644 Binary files a/priv/static/static/js/4.564b2a8cbfe4d5e93949.js and b/priv/static/static/js/4.7077bff64d63355b1635.js differ diff --git a/priv/static/static/js/4.564b2a8cbfe4d5e93949.js.map b/priv/static/static/js/4.7077bff64d63355b1635.js.map similarity index 99% rename from priv/static/static/js/4.564b2a8cbfe4d5e93949.js.map rename to priv/static/static/js/4.7077bff64d63355b1635.js.map index 2a235dac2..83db836c8 100644 Binary files a/priv/static/static/js/4.564b2a8cbfe4d5e93949.js.map and b/priv/static/static/js/4.7077bff64d63355b1635.js.map differ diff --git a/priv/static/static/js/5.6024023b2804dafc6bcb.js b/priv/static/static/js/5.cfb722ac8eea8919f749.js similarity index 98% rename from priv/static/static/js/5.6024023b2804dafc6bcb.js rename to priv/static/static/js/5.cfb722ac8eea8919f749.js index de5483b7c..7d3bca163 100644 Binary files a/priv/static/static/js/5.6024023b2804dafc6bcb.js and b/priv/static/static/js/5.cfb722ac8eea8919f749.js differ diff --git a/priv/static/static/js/5.6024023b2804dafc6bcb.js.map b/priv/static/static/js/5.cfb722ac8eea8919f749.js.map similarity index 57% rename from priv/static/static/js/5.6024023b2804dafc6bcb.js.map rename to priv/static/static/js/5.cfb722ac8eea8919f749.js.map index 921907b51..c9e701dc6 100644 Binary files a/priv/static/static/js/5.6024023b2804dafc6bcb.js.map and b/priv/static/static/js/5.cfb722ac8eea8919f749.js.map differ diff --git a/priv/static/static/js/6.613b0d6b08c3f5f9ef13.js b/priv/static/static/js/6.613b0d6b08c3f5f9ef13.js new file mode 100644 index 000000000..499d71475 Binary files /dev/null and b/priv/static/static/js/6.613b0d6b08c3f5f9ef13.js differ diff --git a/priv/static/static/js/6.b0c7a2b19cc70c33dc1e.js.map b/priv/static/static/js/6.613b0d6b08c3f5f9ef13.js.map similarity index 57% rename from priv/static/static/js/6.b0c7a2b19cc70c33dc1e.js.map rename to priv/static/static/js/6.613b0d6b08c3f5f9ef13.js.map index 962fe57bf..8b78bd4b3 100644 Binary files a/priv/static/static/js/6.b0c7a2b19cc70c33dc1e.js.map and b/priv/static/static/js/6.613b0d6b08c3f5f9ef13.js.map differ diff --git a/priv/static/static/js/6.b0c7a2b19cc70c33dc1e.js b/priv/static/static/js/6.b0c7a2b19cc70c33dc1e.js deleted file mode 100644 index 133583967..000000000 Binary files a/priv/static/static/js/6.b0c7a2b19cc70c33dc1e.js and /dev/null differ diff --git a/priv/static/static/js/7.4dbb03c6731e1c8190af.js b/priv/static/static/js/7.199d52eb458f775043ed.js similarity index 91% rename from priv/static/static/js/7.4dbb03c6731e1c8190af.js rename to priv/static/static/js/7.199d52eb458f775043ed.js index c30fd4d53..bf9015250 100644 Binary files a/priv/static/static/js/7.4dbb03c6731e1c8190af.js and b/priv/static/static/js/7.199d52eb458f775043ed.js differ diff --git a/priv/static/static/js/7.4dbb03c6731e1c8190af.js.map b/priv/static/static/js/7.199d52eb458f775043ed.js.map similarity index 57% rename from priv/static/static/js/7.4dbb03c6731e1c8190af.js.map rename to priv/static/static/js/7.199d52eb458f775043ed.js.map index f89bb6b78..ad860f079 100644 Binary files a/priv/static/static/js/7.4dbb03c6731e1c8190af.js.map and b/priv/static/static/js/7.199d52eb458f775043ed.js.map differ diff --git a/priv/static/static/js/8.7f96f22f9f65ad394684.js b/priv/static/static/js/8.7f96f22f9f65ad394684.js new file mode 100644 index 000000000..154e63437 Binary files /dev/null and b/priv/static/static/js/8.7f96f22f9f65ad394684.js differ diff --git a/priv/static/static/js/8.d11ae57b3255a1c74681.js.map b/priv/static/static/js/8.7f96f22f9f65ad394684.js.map similarity index 57% rename from priv/static/static/js/8.d11ae57b3255a1c74681.js.map rename to priv/static/static/js/8.7f96f22f9f65ad394684.js.map index c874c5132..74e510286 100644 Binary files a/priv/static/static/js/8.d11ae57b3255a1c74681.js.map and b/priv/static/static/js/8.7f96f22f9f65ad394684.js.map differ diff --git a/priv/static/static/js/8.d11ae57b3255a1c74681.js b/priv/static/static/js/8.d11ae57b3255a1c74681.js deleted file mode 100644 index 7da124f7e..000000000 Binary files a/priv/static/static/js/8.d11ae57b3255a1c74681.js and /dev/null differ diff --git a/priv/static/static/js/9.80dc09c85f557dd2c96f.js b/priv/static/static/js/9.80dc09c85f557dd2c96f.js deleted file mode 100644 index 77b5edba9..000000000 Binary files a/priv/static/static/js/9.80dc09c85f557dd2c96f.js and /dev/null differ diff --git a/priv/static/static/js/9.80dc09c85f557dd2c96f.js.map b/priv/static/static/js/9.80dc09c85f557dd2c96f.js.map deleted file mode 100644 index 25360bcab..000000000 Binary files a/priv/static/static/js/9.80dc09c85f557dd2c96f.js.map and /dev/null differ diff --git a/priv/static/static/js/9.f8fc2497d5f27a9df682.js b/priv/static/static/js/9.f8fc2497d5f27a9df682.js new file mode 100644 index 000000000..c86ae4d9a Binary files /dev/null and b/priv/static/static/js/9.f8fc2497d5f27a9df682.js differ diff --git a/priv/static/static/js/9.f8fc2497d5f27a9df682.js.map b/priv/static/static/js/9.f8fc2497d5f27a9df682.js.map new file mode 100644 index 000000000..50ff032de Binary files /dev/null and b/priv/static/static/js/9.f8fc2497d5f27a9df682.js.map differ diff --git a/priv/static/static/js/app.6c972d84b60f601b01f8.js b/priv/static/static/js/app.6c972d84b60f601b01f8.js new file mode 100644 index 000000000..f00f10017 Binary files /dev/null and b/priv/static/static/js/app.6c972d84b60f601b01f8.js differ diff --git a/priv/static/static/js/app.6c972d84b60f601b01f8.js.map b/priv/static/static/js/app.6c972d84b60f601b01f8.js.map new file mode 100644 index 000000000..2e5c2bd67 Binary files /dev/null and b/priv/static/static/js/app.6c972d84b60f601b01f8.js.map differ diff --git a/priv/static/static/js/app.ce97bd1883ee9dd7b809.js b/priv/static/static/js/app.ce97bd1883ee9dd7b809.js deleted file mode 100644 index 01bdcff7a..000000000 Binary files a/priv/static/static/js/app.ce97bd1883ee9dd7b809.js and /dev/null differ diff --git a/priv/static/static/js/app.ce97bd1883ee9dd7b809.js.map b/priv/static/static/js/app.ce97bd1883ee9dd7b809.js.map deleted file mode 100644 index a2669d143..000000000 Binary files a/priv/static/static/js/app.ce97bd1883ee9dd7b809.js.map and /dev/null differ diff --git a/priv/static/static/js/vendors~app.fb9ee54b02db0c974e51.js b/priv/static/static/js/vendors~app.cea10ab53f3aa19fc30e.js similarity index 65% rename from priv/static/static/js/vendors~app.fb9ee54b02db0c974e51.js rename to priv/static/static/js/vendors~app.cea10ab53f3aa19fc30e.js index 8fdc0a102..5ffbf5a2b 100644 Binary files a/priv/static/static/js/vendors~app.fb9ee54b02db0c974e51.js and b/priv/static/static/js/vendors~app.cea10ab53f3aa19fc30e.js differ diff --git a/priv/static/static/js/vendors~app.cea10ab53f3aa19fc30e.js.map b/priv/static/static/js/vendors~app.cea10ab53f3aa19fc30e.js.map new file mode 100644 index 000000000..cd09905ec Binary files /dev/null and b/priv/static/static/js/vendors~app.cea10ab53f3aa19fc30e.js.map differ diff --git a/priv/static/static/js/vendors~app.fb9ee54b02db0c974e51.js.map b/priv/static/static/js/vendors~app.fb9ee54b02db0c974e51.js.map deleted file mode 100644 index 7173d6819..000000000 Binary files a/priv/static/static/js/vendors~app.fb9ee54b02db0c974e51.js.map and /dev/null differ diff --git a/priv/static/sw-pleroma.js b/priv/static/sw-pleroma.js index 5f64e872d..b1699a5a9 100644 Binary files a/priv/static/sw-pleroma.js and b/priv/static/sw-pleroma.js differ diff --git a/priv/static/sw-pleroma.js.map b/priv/static/sw-pleroma.js.map index a538b769e..06813ad0e 100644 Binary files a/priv/static/sw-pleroma.js.map and b/priv/static/sw-pleroma.js.map differ diff --git a/test/fixtures/mastodon/collections/external_featured.json b/test/fixtures/mastodon/collections/external_featured.json new file mode 100644 index 000000000..be5302cf8 --- /dev/null +++ b/test/fixtures/mastodon/collections/external_featured.json @@ -0,0 +1,14 @@ +{ + "@context": [ + "https://www.w3.org/ns/activitystreams", + "https://{{domain}}/schemas/litepub-0.1.jsonld", + { + "@language": "und" + } + ], + "id": "https://{{domain}}/users/{{nickname}}/collections/featured", + "orderedItems": [ + "https://{{domain}}/objects/{{object_id}}" + ], + "type": "OrderedCollection" +} diff --git a/test/fixtures/soapbox_no_mentions_in_content.json b/test/fixtures/soapbox_no_mentions_in_content.json new file mode 100644 index 000000000..03b4b8ee4 --- /dev/null +++ b/test/fixtures/soapbox_no_mentions_in_content.json @@ -0,0 +1,79 @@ +{ + "@context": [ + "https://www.w3.org/ns/activitystreams", + "https://gleasonator.com/schemas/litepub-0.1.jsonld", + { + "@language": "und" + } + ], + "actor": "https://gleasonator.com/users/alex", + "attachment": [ + { + "blurhash": "b15#-6_3~l%eDkNraAM#HYMf", + "height": 2147, + "mediaType": "image/png", + "name": "", + "type": "Document", + "url": "https://media.gleasonator.com/2df1c9cc26c35028db65848143971da0c5a6e04dbd423b194bb018b6c601db9b.png", + "width": 966 + }, + { + "blurhash": "b168EX~q~W-;DiM{VtIUD%Io", + "height": 2147, + "mediaType": "image/png", + "name": "", + "type": "Document", + "url": "https://media.gleasonator.com/22b42b4cddc1aecc7e2d3dc20bcdd66d5c4e44c2bef119de948e95a587e36b66.png", + "width": 966 + } + ], + "attributedTo": "https://gleasonator.com/users/alex", + "cc": [ + "https://www.w3.org/ns/activitystreams#Public" + ], + "content": "

Haha yeah, you can control who you reply to.

", + "context": "https://gleasonator.com/contexts/ba6c8bd9-ac4d-479e-9bd9-5bf570068ae7", + "conversation": "https://gleasonator.com/contexts/ba6c8bd9-ac4d-479e-9bd9-5bf570068ae7", + "id": "https://gleasonator.com/objects/02af65fe-04f8-46bc-9b1e-31dfe76eaffd", + "inReplyTo": "https://shitposter.club/objects/c686d811-4368-48e1-ba11-82c129f93165", + "published": "2022-01-19T03:37:35.976545Z", + "sensitive": false, + "source": "Haha yeah, you can control who you reply to.", + "summary": "", + "tag": [ + { + "href": "https://lain.com/users/lain", + "name": "@lain@lain.com", + "type": "Mention" + }, + { + "href": "https://shitposter.club/users/coolboymew", + "name": "@coolboymew@shitposter.club", + "type": "Mention" + }, + { + "href": "https://shitposter.club/users/dielan", + "name": "@dielan@shitposter.club", + "type": "Mention" + }, + { + "href": "https://tuusin.misono-ya.info/users/hakui", + "name": "@hakui@tuusin.misono-ya.info", + "type": "Mention" + }, + { + "href": "https://xyzzy.link/users/fence", + "name": "@fence@xyzzy.link", + "type": "Mention" + } + ], + "to": [ + "https://shitposter.club/users/dielan", + "https://gleasonator.com/users/alex/followers", + "https://shitposter.club/users/coolboymew", + "https://xyzzy.link/users/fence", + "https://tuusin.misono-ya.info/users/hakui", + "https://lain.com/users/lain" + ], + "type": "Note" +} diff --git a/test/pleroma/formatter_test.exs b/test/pleroma/formatter_test.exs index b0f9f41b1..6663fdbc6 100644 --- a/test/pleroma/formatter_test.exs +++ b/test/pleroma/formatter_test.exs @@ -270,6 +270,34 @@ test "it correctly parses angry face D:< with mention" do assert {^expected_text, ^expected_mentions, []} = Formatter.linkify(text) end + + test "correctly parses mentions in html" do + text = "

@lain hello

" + lain = insert(:user, %{nickname: "lain"}) + + {text, mentions, []} = Formatter.linkify(text) + + assert length(mentions) == 1 + + expected_text = + ~s(

@lain hello

) + + assert expected_text == text + end + + test "correctly parses mentions on the last line of html" do + text = "

Hello

@lain

" + lain = insert(:user, %{nickname: "lain"}) + + {text, mentions, []} = Formatter.linkify(text) + + assert length(mentions) == 1 + + expected_text = + ~s(

Hello

@lain

) + + assert expected_text == text + end end describe ".parse_tags" do @@ -285,6 +313,57 @@ test "parses tags in the text" do assert {_text, [], ^expected_tags} = Formatter.linkify(text) end + + test "parses tags in html" do + text = "

This is a #test

" + + expected_tags = [ + {"#test", "test"} + ] + + assert {_text, [], ^expected_tags} = Formatter.linkify(text) + end + + test "parses mulitple tags in html" do + text = "

#tag1 #tag2 #tag3 #tag4

" + + expected_tags = [ + {"#tag1", "tag1"}, + {"#tag2", "tag2"}, + {"#tag3", "tag3"}, + {"#tag4", "tag4"} + ] + + assert {_text, [], ^expected_tags} = Formatter.linkify(text) + end + + test "parses tags on the last line of html" do + text = "

This is a

#test

" + + expected_tags = [ + {"#test", "test"} + ] + + assert {_text, [], ^expected_tags} = Formatter.linkify(text) + end + + test "parses mulitple tags on mulitple lines in html" do + text = + "

testing...

#tag1 #tag2 #tag3 #tag4

paragraph

#tag5 #tag6 #tag7 #tag8

" + + expected_tags = [ + {"#tag1", "tag1"}, + {"#tag2", "tag2"}, + {"#tag3", "tag3"}, + {"#tag4", "tag4"}, + {"#tag5", "tag5"}, + {"#tag6", "tag6"}, + {"#tag7", "tag7"}, + {"#tag8", "tag8"} + ] + + assert {_text, [], ^expected_tags} = Formatter.linkify(text) + end end test "it escapes HTML in plain text" do diff --git a/test/pleroma/web/activity_pub/activity_pub_test.exs b/test/pleroma/web/activity_pub/activity_pub_test.exs index 574ef0d71..3d152b4d0 100644 --- a/test/pleroma/web/activity_pub/activity_pub_test.exs +++ b/test/pleroma/web/activity_pub/activity_pub_test.exs @@ -312,6 +312,83 @@ test "fetches user featured collection" do assert %{data: %{"id" => ^object_url}} = Object.get_by_ap_id(object_url) end + + test "fetches user featured collection without embedded object" do + ap_id = "https://example.com/users/lain" + + featured_url = "https://example.com/users/lain/collections/featured" + + user_data = + "test/fixtures/users_mock/user.json" + |> File.read!() + |> String.replace("{{nickname}}", "lain") + |> Jason.decode!() + |> Map.put("featured", featured_url) + |> Jason.encode!() + + object_id = Ecto.UUID.generate() + + featured_data = + "test/fixtures/mastodon/collections/external_featured.json" + |> File.read!() + |> String.replace("{{domain}}", "example.com") + |> String.replace("{{nickname}}", "lain") + |> String.replace("{{object_id}}", object_id) + + object_url = "https://example.com/objects/#{object_id}" + + object_data = + "test/fixtures/statuses/note.json" + |> File.read!() + |> String.replace("{{object_id}}", object_id) + |> String.replace("{{nickname}}", "lain") + + Tesla.Mock.mock(fn + %{ + method: :get, + url: ^ap_id + } -> + %Tesla.Env{ + status: 200, + body: user_data, + headers: [{"content-type", "application/activity+json"}] + } + + %{ + method: :get, + url: ^featured_url + } -> + %Tesla.Env{ + status: 200, + body: featured_data, + headers: [{"content-type", "application/activity+json"}] + } + end) + + Tesla.Mock.mock_global(fn + %{ + method: :get, + url: ^object_url + } -> + %Tesla.Env{ + status: 200, + body: object_data, + headers: [{"content-type", "application/activity+json"}] + } + end) + + {:ok, user} = ActivityPub.make_user_from_ap_id(ap_id) + Process.sleep(50) + + assert user.featured_address == featured_url + assert Map.has_key?(user.pinned_objects, object_url) + + in_db = Pleroma.User.get_by_ap_id(ap_id) + assert in_db.featured_address == featured_url + assert Map.has_key?(user.pinned_objects, object_url) + + assert %{data: %{"id" => ^object_url}} = Object.get_by_ap_id(object_url) + end end test "it fetches the appropriate tag-restricted posts" do diff --git a/test/pleroma/web/activity_pub/mrf/force_mentions_in_content_test.exs b/test/pleroma/web/activity_pub/mrf/force_mentions_in_content_test.exs new file mode 100644 index 000000000..090bdc35e --- /dev/null +++ b/test/pleroma/web/activity_pub/mrf/force_mentions_in_content_test.exs @@ -0,0 +1,34 @@ +# Pleroma: A lightweight social networking server +# Copyright © 2017-2021 Pleroma Authors +# SPDX-License-Identifier: AGPL-3.0-only + +defmodule Pleroma.Web.ActivityPub.MRF.ForceMentionsInContentTest do + alias Pleroma.Web.ActivityPub.MRF.ForceMentionsInContent + import Pleroma.Factory + use Pleroma.DataCase + + test "adds mentions to post content" do + users = %{ + "lain@lain.com" => "https://lain.com/users/lain", + "coolboymew@shitposter.club" => "https://shitposter.club/users/coolboymew", + "dielan@shitposter.club" => "https://shitposter.club/users/dielan", + "hakui@tuusin.misono-ya.info" => "https://tuusin.misono-ya.info/users/hakui", + "fence@xyzzy.link" => "https://xyzzy.link/users/fence" + } + + Enum.each(users, fn {nickname, ap_id} -> + insert(:user, ap_id: ap_id, nickname: nickname, local: false) + end) + + object = File.read!("test/fixtures/soapbox_no_mentions_in_content.json") |> Jason.decode!() + + activity = %{ + "type" => "Create", + "actor" => "https://gleasonator.com/users/alex", + "object" => object + } + + {:ok, %{"object" => %{"content" => filtered}}} = ForceMentionsInContent.filter(activity) + Enum.each(users, fn {nickname, _} -> assert filtered =~ nickname end) + end +end diff --git a/test/pleroma/web/mastodon_api/controllers/account_controller_test.exs b/test/pleroma/web/mastodon_api/controllers/account_controller_test.exs index 19d706958..f272ed1ae 100644 --- a/test/pleroma/web/mastodon_api/controllers/account_controller_test.exs +++ b/test/pleroma/web/mastodon_api/controllers/account_controller_test.exs @@ -5,7 +5,9 @@ defmodule Pleroma.Web.MastodonAPI.AccountControllerTest do use Pleroma.Web.ConnCase + alias Pleroma.Object alias Pleroma.Repo + alias Pleroma.Tests.ObanHelpers alias Pleroma.User alias Pleroma.Web.ActivityPub.ActivityPub alias Pleroma.Web.ActivityPub.InternalFetchActor @@ -404,15 +406,6 @@ test "gets users statuses", %{conn: conn} do assert id_two == to_string(activity.id) end - test "unimplemented pinned statuses feature", %{conn: conn} do - note = insert(:note_activity) - user = User.get_cached_by_ap_id(note.data["actor"]) - - conn = get(conn, "/api/v1/accounts/#{user.id}/statuses?pinned=true") - - assert json_response_and_validate_schema(conn, 200) == [] - end - test "gets an users media, excludes reblogs", %{conn: conn} do note = insert(:note_activity) user = User.get_cached_by_ap_id(note.data["actor"]) @@ -1038,6 +1031,35 @@ test "returns pinned statuses", %{conn: conn, user: user, activity: %{id: activi end end + test "view pinned private statuses" do + user = insert(:user) + reader = insert(:user) + + # Create a private status and pin it + {:ok, %{id: activity_id} = activity} = + CommonAPI.post(user, %{status: "psst", visibility: "private"}) + + %{data: %{"id" => object_ap_id}} = Object.normalize(activity) + {:ok, _} = User.add_pinned_object_id(user, object_ap_id) + + %{conn: conn} = oauth_access(["read:statuses"], user: reader) + + # A non-follower can't see the pinned status + assert [] == + conn + |> get("/api/v1/accounts/#{user.id}/statuses?pinned=true") + |> json_response_and_validate_schema(200) + + # Follow the user, then the pinned status can be seen + CommonAPI.follow(reader, user) + ObanHelpers.perform_all() + + assert [%{"id" => ^activity_id, "pinned" => true}] = + conn + |> get("/api/v1/accounts/#{user.id}/statuses?pinned=true") + |> json_response_and_validate_schema(200) + end + test "blocking / unblocking a user" do %{conn: conn} = oauth_access(["follow"]) other_user = insert(:user) diff --git a/test/pleroma/web/mastodon_api/controllers/filter_controller_test.exs b/test/pleroma/web/mastodon_api/controllers/filter_controller_test.exs index 98ab9e717..5ed1f34b7 100644 --- a/test/pleroma/web/mastodon_api/controllers/filter_controller_test.exs +++ b/test/pleroma/web/mastodon_api/controllers/filter_controller_test.exs @@ -64,12 +64,13 @@ test "a filter with expires_in", %{conn: conn, user: user} do assert response["irreversible"] == false - expires_at = + expected_expiration = NaiveDateTime.utc_now() |> NaiveDateTime.add(in_seconds) - |> Pleroma.Web.CommonAPI.Utils.to_masto_date() - assert response["expires_at"] == expires_at + {:ok, actual_expiration} = NaiveDateTime.from_iso8601(response["expires_at"]) + + assert abs(NaiveDateTime.diff(expected_expiration, actual_expiration)) <= 5 filter = Filter.get(response["id"], user)